mirror of
https://github.com/codeigniter4/CodeIgniter4.git
synced 2025-02-20 11:44:28 +08:00
Upgraded to Kint 2
This commit is contained in:
parent
efb0b47647
commit
45951eb089
@ -6,6 +6,7 @@ class Home extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
dd($this);
|
||||
return view('welcome_message');
|
||||
}
|
||||
|
||||
|
@ -18,7 +18,8 @@
|
||||
"require": {
|
||||
"php": ">=7.0",
|
||||
"zendframework/zend-escaper": "^2.5",
|
||||
"paragonie/sodium_compat": "^1.1"
|
||||
"paragonie/sodium_compat": "^1.1",
|
||||
"kint-php/kint": "^2.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^6.0",
|
||||
|
@ -165,7 +165,7 @@ class CodeIgniter
|
||||
|
||||
if (CI_DEBUG)
|
||||
{
|
||||
require_once BASEPATH . 'ThirdParty/Kint/Kint.class.php';
|
||||
require_once BASEPATH . 'ThirdParty/Kint/kint.php';
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -961,3 +961,17 @@ if ( ! function_exists('function_usable'))
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
if (! function_exists('dd'))
|
||||
{
|
||||
/**
|
||||
* Prints a Kint debug report and exits.
|
||||
*
|
||||
* @param array ...$vars
|
||||
*/
|
||||
function dd(...$vars)
|
||||
{
|
||||
Kint::dump(...$vars);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
@ -27,12 +27,12 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* @package CodeIgniter
|
||||
* @author CodeIgniter Dev Team
|
||||
* @copyright 2014-2017 British Columbia Institute of Technology (https://bcit.ca/)
|
||||
* @license https://opensource.org/licenses/MIT MIT License
|
||||
* @link https://codeigniter.com
|
||||
* @since Version 3.0.0
|
||||
* @package CodeIgniter
|
||||
* @author CodeIgniter Dev Team
|
||||
* @copyright 2014-2017 British Columbia Institute of Technology (https://bcit.ca/)
|
||||
* @license https://opensource.org/licenses/MIT MIT License
|
||||
* @link https://codeigniter.com
|
||||
* @since Version 3.0.0
|
||||
* @filesource
|
||||
*/
|
||||
|
||||
@ -49,6 +49,7 @@
|
||||
*/
|
||||
class ComposerScripts
|
||||
{
|
||||
protected static $basePath = 'system/ThirdParty/';
|
||||
|
||||
/**
|
||||
* After composer install/update, this is called to move
|
||||
@ -57,36 +58,8 @@ class ComposerScripts
|
||||
*/
|
||||
public static function postUpdate()
|
||||
{
|
||||
/*
|
||||
* Zend/Escaper
|
||||
*/
|
||||
if (class_exists('\\Zend\\Escaper\\Escaper') && file_exists(self::getClassFilePath('\\Zend\\Escaper\\Escaper')))
|
||||
{
|
||||
$base = 'system/ThirdParty/ZendEscaper';
|
||||
|
||||
foreach ([$base, $base . '/Exception'] as $path)
|
||||
{
|
||||
if ( ! is_dir($path))
|
||||
{
|
||||
mkdir($path, 0755);
|
||||
}
|
||||
}
|
||||
|
||||
$files = [
|
||||
self::getClassFilePath('\\Zend\\Escaper\\Exception\\ExceptionInterface') => $base . '/Exception/ExceptionInterface.php',
|
||||
self::getClassFilePath('\\Zend\\Escaper\\Exception\\InvalidArgumentException') => $base . '/Exception/InvalidArgumentException.php',
|
||||
self::getClassFilePath('\\Zend\\Escaper\\Exception\\RuntimeException') => $base . '/Exception/RuntimeException.php',
|
||||
self::getClassFilePath('\\Zend\\Escaper\\Escaper') => $base . '/Escaper.php'
|
||||
];
|
||||
|
||||
foreach ($files as $source => $dest)
|
||||
{
|
||||
if ( ! self::moveFile($source, $dest))
|
||||
{
|
||||
die('Error moving: ' . $source);
|
||||
}
|
||||
}
|
||||
}
|
||||
static::moveEscaper();
|
||||
static::moveKint();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
@ -96,6 +69,7 @@ class ComposerScripts
|
||||
*
|
||||
* @param string $source
|
||||
* @param string $destination
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
protected static function moveFile(string $source, string $destination)
|
||||
@ -107,12 +81,12 @@ class ComposerScripts
|
||||
die('Cannot move file. Source path invalid.');
|
||||
}
|
||||
|
||||
if ( ! is_file($source))
|
||||
if (! is_file($source))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return rename($source, $destination);
|
||||
return copy($source, $destination);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
@ -121,13 +95,112 @@ class ComposerScripts
|
||||
* Determine file path of a class.
|
||||
*
|
||||
* @param string $class
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected static function getClassFilePath(string $class)
|
||||
{
|
||||
$reflector = new \ReflectionClass($class);
|
||||
|
||||
return $reflector->getFileName();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* A recursive remove directory method.
|
||||
*
|
||||
* @param $dir
|
||||
*/
|
||||
protected static function removeDir($dir)
|
||||
{
|
||||
if (is_dir($dir))
|
||||
{
|
||||
$objects = scandir($dir);
|
||||
foreach ($objects as $object)
|
||||
{
|
||||
if ($object != "." && $object != "..")
|
||||
{
|
||||
if (filetype($dir."/".$object) == "dir")
|
||||
{
|
||||
static::removeDir($dir."/".$object);
|
||||
}
|
||||
else
|
||||
{
|
||||
unlink($dir."/".$object);
|
||||
}
|
||||
}
|
||||
}
|
||||
reset($objects);
|
||||
rmdir($dir);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves the Zend Escaper files into our base repo so that it's
|
||||
* available for packaged releases where the users don't user Composer.
|
||||
*/
|
||||
public static function moveEscaper()
|
||||
{
|
||||
if (class_exists('\\Zend\\Escaper\\Escaper') && file_exists(self::getClassFilePath('\\Zend\\Escaper\\Escaper')))
|
||||
{
|
||||
$base = static::$basePath.'ZendEscaper';
|
||||
|
||||
foreach ([$base, $base.'/Exception'] as $path)
|
||||
{
|
||||
if (! is_dir($path))
|
||||
{
|
||||
mkdir($path, 0755);
|
||||
}
|
||||
}
|
||||
|
||||
$files = [
|
||||
self::getClassFilePath('\\Zend\\Escaper\\Exception\\ExceptionInterface') => $base.'/Exception/ExceptionInterface.php',
|
||||
self::getClassFilePath('\\Zend\\Escaper\\Exception\\InvalidArgumentException') => $base.'/Exception/InvalidArgumentException.php',
|
||||
self::getClassFilePath('\\Zend\\Escaper\\Exception\\RuntimeException') => $base.'/Exception/RuntimeException.php',
|
||||
self::getClassFilePath('\\Zend\\Escaper\\Escaper') => $base.'/Escaper.php',
|
||||
];
|
||||
|
||||
foreach ($files as $source => $dest)
|
||||
{
|
||||
if (! self::moveFile($source, $dest))
|
||||
{
|
||||
die('Error moving: '.$source);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Moves the Kint file into our base repo so that it's
|
||||
* available for packaged releases where the users don't user Composer.
|
||||
*/
|
||||
public static function moveKint()
|
||||
{
|
||||
$filename = 'vendor/kint-php/kint/build/kint-aante-light.php';
|
||||
|
||||
if (file_exists($filename))
|
||||
{
|
||||
$base = static::$basePath.'Kint';
|
||||
|
||||
// Remove the contents of the previous Kint folder, if any.
|
||||
if (is_dir($base))
|
||||
{
|
||||
static::removeDir($base);
|
||||
}
|
||||
|
||||
// Create Kint if it doesn't exist already
|
||||
if (! is_dir($base))
|
||||
{
|
||||
mkdir($base, 0755);
|
||||
}
|
||||
|
||||
if (! self::moveFile($filename, $base.'/kint.php'))
|
||||
{
|
||||
die('Error moving: '.$filename);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
3
system/ThirdParty/Kint/.gitignore
vendored
3
system/ThirdParty/Kint/.gitignore
vendored
@ -1,3 +0,0 @@
|
||||
|
||||
/config.php
|
||||
/.idea
|
842
system/ThirdParty/Kint/Kint.class.php
vendored
842
system/ThirdParty/Kint/Kint.class.php
vendored
@ -1,842 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Kint is a zero-setup debugging tool to output information about variables and stack traces prettily and comfortably.
|
||||
*
|
||||
* https://github.com/raveren/kint
|
||||
*/
|
||||
|
||||
|
||||
if ( defined( 'KINT_DIR' ) ) return;
|
||||
|
||||
|
||||
define( 'KINT_DIR', dirname( __FILE__ ) . '/' );
|
||||
define( 'KINT_PHP53', version_compare( PHP_VERSION, '5.3.0' ) >= 0 );
|
||||
|
||||
require KINT_DIR . 'config.default.php';
|
||||
require KINT_DIR . 'inc/kintVariableData.class.php';
|
||||
require KINT_DIR . 'inc/kintParser.class.php';
|
||||
require KINT_DIR . 'inc/kintObject.class.php';
|
||||
require KINT_DIR . 'decorators/rich.php';
|
||||
require KINT_DIR . 'decorators/plain.php';
|
||||
|
||||
if ( is_readable( KINT_DIR . 'config.php' ) ) {
|
||||
require KINT_DIR . 'config.php';
|
||||
}
|
||||
|
||||
# init settings
|
||||
if ( !empty( $GLOBALS['_kint_settings'] ) ) {
|
||||
Kint::enabled( $GLOBALS['_kint_settings']['enabled'] );
|
||||
|
||||
foreach ( $GLOBALS['_kint_settings'] as $key => $val ) {
|
||||
property_exists( 'Kint', $key ) and Kint::$$key = $val;
|
||||
}
|
||||
|
||||
unset( $GLOBALS['_kint_settings'], $key, $val );
|
||||
}
|
||||
|
||||
class Kint
|
||||
{
|
||||
// these are all public and 1:1 config array keys so you can switch them easily
|
||||
private static $_enabledMode; # stores mode and active statuses
|
||||
|
||||
public static $returnOutput;
|
||||
public static $fileLinkFormat;
|
||||
public static $displayCalledFrom;
|
||||
public static $charEncodings;
|
||||
public static $maxStrLength;
|
||||
public static $appRootDirs;
|
||||
public static $maxLevels;
|
||||
public static $theme;
|
||||
public static $expandedByDefault;
|
||||
|
||||
public static $cliDetection;
|
||||
public static $cliColors;
|
||||
|
||||
const MODE_RICH = 'r';
|
||||
const MODE_WHITESPACE = 'w';
|
||||
const MODE_CLI = 'c';
|
||||
const MODE_PLAIN = 'p';
|
||||
|
||||
|
||||
public static $aliases = array(
|
||||
'methods' => array(
|
||||
array( 'kint', 'dump' ),
|
||||
array( 'kint', 'trace' ),
|
||||
),
|
||||
'functions' => array(
|
||||
'd',
|
||||
'dd',
|
||||
'ddd',
|
||||
's',
|
||||
'sd',
|
||||
)
|
||||
);
|
||||
|
||||
private static $_firstRun = true;
|
||||
|
||||
/**
|
||||
* Enables or disables Kint, can globally enforce the rendering mode. If called without parameters, returns the
|
||||
* current mode.
|
||||
*
|
||||
* @param mixed $forceMode
|
||||
* null or void - return current mode
|
||||
* false - disable (no output)
|
||||
* true - enable and detect cli automatically
|
||||
* Kint::MODE_* - enable and force selected mode disregarding detection and function
|
||||
* shorthand (s()/d()), note that you can still override this
|
||||
* with the "~" modifier
|
||||
*
|
||||
* @return mixed previously set value if a new one is passed
|
||||
*/
|
||||
public static function enabled( $forceMode = null )
|
||||
{
|
||||
# act both as a setter...
|
||||
if ( isset( $forceMode ) ) {
|
||||
$before = self::$_enabledMode;
|
||||
self::$_enabledMode = $forceMode;
|
||||
|
||||
return $before;
|
||||
}
|
||||
|
||||
# ...and a getter
|
||||
return self::$_enabledMode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints a debug backtrace, same as Kint::dump(1)
|
||||
*
|
||||
* @param array $trace [OPTIONAL] you can pass your own trace, otherwise, `debug_backtrace` will be called
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function trace( $trace = null )
|
||||
{
|
||||
if ( !self::enabled() ) return '';
|
||||
|
||||
return self::dump( isset( $trace ) ? $trace : debug_backtrace( true ) );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Dump information about variables, accepts any number of parameters, supports modifiers:
|
||||
*
|
||||
* clean up any output before kint and place the dump at the top of page:
|
||||
* - Kint::dump()
|
||||
* *****
|
||||
* expand all nodes on display:
|
||||
* ! Kint::dump()
|
||||
* *****
|
||||
* dump variables disregarding their depth:
|
||||
* + Kint::dump()
|
||||
* *****
|
||||
* return output instead of displaying it:
|
||||
* @ Kint::dump()
|
||||
* *****
|
||||
* force output as plain text
|
||||
* ~ Kint::dump()
|
||||
*
|
||||
* Modifiers are supported by all dump wrapper functions, including Kint::trace(). Space is optional.
|
||||
*
|
||||
*
|
||||
* You can also use the following shorthand to display debug_backtrace():
|
||||
* Kint::dump( 1 );
|
||||
*
|
||||
* Passing the result from debug_backtrace() to kint::dump() as a single parameter will display it as trace too:
|
||||
* $trace = debug_backtrace( true );
|
||||
* Kint::dump( $trace );
|
||||
* Or simply:
|
||||
* Kint::dump( debug_backtrace() );
|
||||
*
|
||||
*
|
||||
* @param mixed $data
|
||||
*
|
||||
* @return void|string
|
||||
*/
|
||||
public static function dump( $data = null )
|
||||
{
|
||||
if ( !self::enabled() ) return '';
|
||||
|
||||
list( $names, $modifiers, $callee, $previousCaller, $miniTrace ) = self::_getCalleeInfo(
|
||||
defined( 'DEBUG_BACKTRACE_IGNORE_ARGS' )
|
||||
? debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS )
|
||||
: debug_backtrace()
|
||||
);
|
||||
$modeOldValue = self::enabled();
|
||||
$firstRunOldValue = self::$_firstRun;
|
||||
|
||||
# process modifiers: @, +, !, ~ and -
|
||||
if ( strpos( $modifiers, '-' ) !== false ) {
|
||||
self::$_firstRun = true;
|
||||
while ( ob_get_level() ) {
|
||||
ob_end_clean();
|
||||
}
|
||||
}
|
||||
if ( strpos( $modifiers, '!' ) !== false ) {
|
||||
$expandedByDefaultOldValue = self::$expandedByDefault;
|
||||
self::$expandedByDefault = true;
|
||||
}
|
||||
if ( strpos( $modifiers, '+' ) !== false ) {
|
||||
$maxLevelsOldValue = self::$maxLevels;
|
||||
self::$maxLevels = false;
|
||||
}
|
||||
if ( strpos( $modifiers, '@' ) !== false ) {
|
||||
$returnOldValue = self::$returnOutput;
|
||||
self::$returnOutput = true;
|
||||
self::$_firstRun = true;
|
||||
}
|
||||
if ( strpos( $modifiers, '~' ) !== false ) {
|
||||
self::enabled( self::MODE_WHITESPACE );
|
||||
}
|
||||
|
||||
# set mode for current run
|
||||
$mode = self::enabled();
|
||||
if ( $mode === true ) {
|
||||
$mode = PHP_SAPI === 'cli'
|
||||
? self::MODE_CLI
|
||||
: self::MODE_RICH;
|
||||
}
|
||||
self::enabled( $mode );
|
||||
|
||||
$decorator = self::enabled() === self::MODE_RICH
|
||||
? 'Kint_Decorators_Rich'
|
||||
: 'Kint_Decorators_Plain';
|
||||
|
||||
$output = '';
|
||||
if ( self::$_firstRun ) {
|
||||
$output .= call_user_func( array( $decorator, 'init' ) );
|
||||
}
|
||||
|
||||
|
||||
$trace = false;
|
||||
if ( $names === array( null ) && func_num_args() === 1 && $data === 1 ) { # Kint::dump(1) shorthand
|
||||
$trace = KINT_PHP53 ? debug_backtrace( true ) : debug_backtrace();
|
||||
} elseif ( func_num_args() === 1 && is_array( $data ) ) {
|
||||
$trace = $data; # test if the single parameter is result of debug_backtrace()
|
||||
}
|
||||
$trace and $trace = self::_parseTrace( $trace );
|
||||
|
||||
|
||||
$output .= call_user_func( array( $decorator, 'wrapStart' ) );
|
||||
if ( $trace ) {
|
||||
$output .= call_user_func( array( $decorator, 'decorateTrace' ), $trace );
|
||||
} else {
|
||||
$data = func_num_args() === 0
|
||||
? array( "[[no arguments passed]]" )
|
||||
: func_get_args();
|
||||
|
||||
foreach ( $data as $k => $argument ) {
|
||||
kintParser::reset();
|
||||
# when the dump arguments take long to generate output, user might have changed the file and
|
||||
# Kint might not parse the arguments correctly, so check if names are set and while the
|
||||
# displayed names might be wrong, at least don't throw an error
|
||||
$output .= call_user_func(
|
||||
array( $decorator, 'decorate' ),
|
||||
kintParser::factory( $argument, isset( $names[ $k ] ) ? $names[ $k ] : '' )
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$output .= call_user_func( array( $decorator, 'wrapEnd' ), $callee, $miniTrace, $previousCaller );
|
||||
|
||||
self::enabled( $modeOldValue );
|
||||
|
||||
self::$_firstRun = false;
|
||||
if ( strpos( $modifiers, '~' ) !== false ) {
|
||||
self::$_firstRun = $firstRunOldValue;
|
||||
} else {
|
||||
self::enabled( $modeOldValue );
|
||||
}
|
||||
if ( strpos( $modifiers, '!' ) !== false ) {
|
||||
self::$expandedByDefault = $expandedByDefaultOldValue;
|
||||
}
|
||||
if ( strpos( $modifiers, '+' ) !== false ) {
|
||||
self::$maxLevels = $maxLevelsOldValue;
|
||||
}
|
||||
if ( strpos( $modifiers, '@' ) !== false ) {
|
||||
self::$returnOutput = $returnOldValue;
|
||||
self::$_firstRun = $firstRunOldValue;
|
||||
return $output;
|
||||
}
|
||||
|
||||
if ( self::$returnOutput ) return $output;
|
||||
|
||||
echo $output;
|
||||
return '';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* generic path display callback, can be configured in the settings; purpose is to show relevant path info and hide
|
||||
* as much of the path as possible.
|
||||
*
|
||||
* @param string $file
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function shortenPath( $file )
|
||||
{
|
||||
$file = str_replace( '\\', '/', $file );
|
||||
$shortenedName = $file;
|
||||
$replaced = false;
|
||||
if ( is_array( self::$appRootDirs ) ) foreach ( self::$appRootDirs as $path => $replaceString ) {
|
||||
if ( empty( $path ) ) continue;
|
||||
|
||||
$path = str_replace( '\\', '/', $path );
|
||||
|
||||
if ( strpos( $file, $path ) === 0 ) {
|
||||
$shortenedName = $replaceString . substr( $file, strlen( $path ) );
|
||||
$replaced = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
# fallback to find common path with Kint dir
|
||||
if ( !$replaced ) {
|
||||
$pathParts = explode( '/', str_replace( '\\', '/', KINT_DIR ) );
|
||||
$fileParts = explode( '/', $file );
|
||||
$i = 0;
|
||||
foreach ( $fileParts as $i => $filePart ) {
|
||||
if ( !isset( $pathParts[ $i ] ) || $pathParts[ $i ] !== $filePart ) break;
|
||||
}
|
||||
|
||||
$shortenedName = ( $i ? '.../' : '' ) . implode( '/', array_slice( $fileParts, $i ) );
|
||||
}
|
||||
|
||||
return $shortenedName;
|
||||
}
|
||||
|
||||
public static function getIdeLink( $file, $line )
|
||||
{
|
||||
return str_replace( array( '%f', '%l' ), array( $file, $line ), self::$fileLinkFormat );
|
||||
}
|
||||
|
||||
/**
|
||||
* trace helper, shows the place in code inline
|
||||
*
|
||||
* @param string $file full path to file
|
||||
* @param int $lineNumber the line to display
|
||||
* @param int $padding surrounding lines to show besides the main one
|
||||
*
|
||||
* @return bool|string
|
||||
*/
|
||||
private static function _showSource( $file, $lineNumber, $padding = 7 )
|
||||
{
|
||||
if ( !$file OR !is_readable( $file ) ) {
|
||||
# continuing will cause errors
|
||||
return false;
|
||||
}
|
||||
|
||||
# open the file and set the line position
|
||||
$file = fopen( $file, 'r' );
|
||||
$line = 0;
|
||||
|
||||
# Set the reading range
|
||||
$range = array(
|
||||
'start' => $lineNumber - $padding,
|
||||
'end' => $lineNumber + $padding
|
||||
);
|
||||
|
||||
# set the zero-padding amount for line numbers
|
||||
$format = '% ' . strlen( $range['end'] ) . 'd';
|
||||
|
||||
$source = '';
|
||||
while ( ( $row = fgets( $file ) ) !== false ) {
|
||||
# increment the line number
|
||||
if ( ++$line > $range['end'] ) {
|
||||
break;
|
||||
}
|
||||
|
||||
if ( $line >= $range['start'] ) {
|
||||
# make the row safe for output
|
||||
$row = htmlspecialchars( $row, ENT_NOQUOTES, 'UTF-8' );
|
||||
|
||||
# trim whitespace and sanitize the row
|
||||
$row = '<span>' . sprintf( $format, $line ) . '</span> ' . $row;
|
||||
|
||||
if ( $line === $lineNumber ) {
|
||||
# apply highlighting to this row
|
||||
$row = '<div class="kint-highlight">' . $row . '</div>';
|
||||
} else {
|
||||
$row = '<div>' . $row . '</div>';
|
||||
}
|
||||
|
||||
# add to the captured source
|
||||
$source .= $row;
|
||||
}
|
||||
}
|
||||
|
||||
# close the file
|
||||
fclose( $file );
|
||||
|
||||
return $source;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* returns parameter names that the function was passed, as well as any predefined symbols before function
|
||||
* call (modifiers)
|
||||
*
|
||||
* @param array $trace
|
||||
*
|
||||
* @return array( $parameters, $modifier, $callee, $previousCaller )
|
||||
*/
|
||||
private static function _getCalleeInfo( $trace )
|
||||
{
|
||||
$previousCaller = array();
|
||||
$miniTrace = array();
|
||||
$prevStep = array();
|
||||
|
||||
# go from back of trace to find first occurrence of call to Kint or its wrappers
|
||||
while ( $step = array_pop( $trace ) ) {
|
||||
|
||||
if ( self::_stepIsInternal( $step ) ) {
|
||||
$previousCaller = $prevStep;
|
||||
break;
|
||||
} elseif ( isset( $step['file'], $step['line'] ) ) {
|
||||
unset( $step['object'], $step['args'] );
|
||||
array_unshift( $miniTrace, $step );
|
||||
}
|
||||
|
||||
$prevStep = $step;
|
||||
}
|
||||
$callee = $step;
|
||||
|
||||
if ( !isset( $callee['file'] ) || !is_readable( $callee['file'] ) ) return false;
|
||||
|
||||
|
||||
# open the file and read it up to the position where the function call expression ended
|
||||
$file = fopen( $callee['file'], 'r' );
|
||||
$line = 0;
|
||||
$source = '';
|
||||
while ( ( $row = fgets( $file ) ) !== false ) {
|
||||
if ( ++$line > $callee['line'] ) break;
|
||||
$source .= $row;
|
||||
}
|
||||
fclose( $file );
|
||||
$source = self::_removeAllButCode( $source );
|
||||
|
||||
|
||||
if ( empty( $callee['class'] ) ) {
|
||||
$codePattern = $callee['function'];
|
||||
} else {
|
||||
if ( $callee['type'] === '::' ) {
|
||||
$codePattern = $callee['class'] . "\x07*" . $callee['type'] . "\x07*" . $callee['function'];;
|
||||
} else /*if ( $callee['type'] === '->' )*/ {
|
||||
$codePattern = ".*\x07*" . $callee['type'] . "\x07*" . $callee['function'];;
|
||||
}
|
||||
}
|
||||
|
||||
// todo if more than one call in one line - not possible to determine variable names
|
||||
// todo does not recognize string concat
|
||||
# get the position of the last call to the function
|
||||
preg_match_all( "
|
||||
[
|
||||
# beginning of statement
|
||||
[\x07{(]
|
||||
|
||||
# search for modifiers (group 1)
|
||||
([-+!@~]*)?
|
||||
|
||||
# spaces
|
||||
\x07*
|
||||
|
||||
# check if output is assigned to a variable (group 2) todo: does not detect concat
|
||||
(
|
||||
\\$[a-z0-9_]+ # variable
|
||||
\x07*\\.?=\x07* # assignment
|
||||
)?
|
||||
|
||||
# possibly a namespace symbol
|
||||
\\\\?
|
||||
|
||||
# spaces again
|
||||
\x07*
|
||||
|
||||
# main call to Kint
|
||||
({$codePattern})
|
||||
|
||||
# spaces everywhere
|
||||
\x07*
|
||||
|
||||
# find the character where kint's opening bracket resides (group 3)
|
||||
(\\()
|
||||
|
||||
]ix",
|
||||
$source,
|
||||
$matches,
|
||||
PREG_OFFSET_CAPTURE
|
||||
);
|
||||
|
||||
$modifiers = end( $matches[1] );
|
||||
$assignment = end( $matches[2] );
|
||||
$callToKint = end( $matches[3] );
|
||||
$bracket = end( $matches[4] );
|
||||
|
||||
if ( empty( $callToKint ) ) {
|
||||
# if a wrapper is misconfigured, don't display the whole file as variable name
|
||||
return array( array(), $modifiers, $callee, $previousCaller, $miniTrace );
|
||||
}
|
||||
|
||||
$modifiers = $modifiers[0];
|
||||
if ( $assignment[1] !== -1 ) {
|
||||
$modifiers .= '@';
|
||||
}
|
||||
|
||||
$paramsString = preg_replace( "[\x07+]", ' ', substr( $source, $bracket[1] + 1 ) );
|
||||
# we now have a string like this:
|
||||
# <parameters passed>); <the rest of the last read line>
|
||||
|
||||
# remove everything in brackets and quotes, we don't need nested statements nor literal strings which would
|
||||
# only complicate separating individual arguments
|
||||
$c = strlen( $paramsString );
|
||||
$inString = $escaped = $openedBracket = $closingBracket = false;
|
||||
$i = 0;
|
||||
$inBrackets = 0;
|
||||
$openedBrackets = array();
|
||||
|
||||
while ( $i < $c ) {
|
||||
$letter = $paramsString[ $i ];
|
||||
|
||||
if ( !$inString ) {
|
||||
if ( $letter === '\'' || $letter === '"' ) {
|
||||
$inString = $letter;
|
||||
} elseif ( $letter === '(' || $letter === '[' ) {
|
||||
$inBrackets++;
|
||||
$openedBrackets[] = $openedBracket = $letter;
|
||||
$closingBracket = $openedBracket === '(' ? ')' : ']';
|
||||
} elseif ( $inBrackets && $letter === $closingBracket ) {
|
||||
$inBrackets--;
|
||||
array_pop( $openedBrackets );
|
||||
$openedBracket = end( $openedBrackets );
|
||||
$closingBracket = $openedBracket === '(' ? ')' : ']';
|
||||
} elseif ( !$inBrackets && $letter === ')' ) {
|
||||
$paramsString = substr( $paramsString, 0, $i );
|
||||
break;
|
||||
}
|
||||
} elseif ( $letter === $inString && !$escaped ) {
|
||||
$inString = false;
|
||||
}
|
||||
|
||||
# replace whatever was inside quotes or brackets with untypeable characters, we don't
|
||||
# need that info. We'll later replace the whole string with '...'
|
||||
if ( $inBrackets > 0 ) {
|
||||
if ( $inBrackets > 1 || $letter !== $openedBracket ) {
|
||||
$paramsString[ $i ] = "\x07";
|
||||
}
|
||||
}
|
||||
if ( $inString ) {
|
||||
if ( $letter !== $inString || $escaped ) {
|
||||
$paramsString[ $i ] = "\x07";
|
||||
}
|
||||
}
|
||||
|
||||
$escaped = !$escaped && ( $letter === '\\' );
|
||||
$i++;
|
||||
}
|
||||
|
||||
# by now we have an un-nested arguments list, lets make it to an array for processing further
|
||||
$arguments = explode( ',', preg_replace( "[\x07+]", '...', $paramsString ) );
|
||||
|
||||
# test each argument whether it was passed literary or was it an expression or a variable name
|
||||
$parameters = array();
|
||||
$blacklist = array( 'null', 'true', 'false', 'array(...)', 'array()', '"..."', '[...]', 'b"..."', );
|
||||
foreach ( $arguments as $argument ) {
|
||||
$argument = trim( $argument );
|
||||
|
||||
if ( is_numeric( $argument )
|
||||
|| in_array( str_replace( "'", '"', strtolower( $argument ) ), $blacklist, true )
|
||||
) {
|
||||
$parameters[] = null;
|
||||
} else {
|
||||
$parameters[] = $argument;
|
||||
}
|
||||
}
|
||||
|
||||
return array( $parameters, $modifiers, $callee, $previousCaller, $miniTrace );
|
||||
}
|
||||
|
||||
/**
|
||||
* removes comments and zaps whitespace & <?php tags from php code, makes for easier further parsing
|
||||
*
|
||||
* @param string $source
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private static function _removeAllButCode( $source )
|
||||
{
|
||||
$commentTokens = array(
|
||||
T_COMMENT => true, T_INLINE_HTML => true, T_DOC_COMMENT => true
|
||||
);
|
||||
$whiteSpaceTokens = array(
|
||||
T_WHITESPACE => true, T_CLOSE_TAG => true,
|
||||
T_OPEN_TAG => true, T_OPEN_TAG_WITH_ECHO => true,
|
||||
);
|
||||
|
||||
$cleanedSource = '';
|
||||
foreach ( token_get_all( $source ) as $token ) {
|
||||
if ( is_array( $token ) ) {
|
||||
if ( isset( $commentTokens[ $token[0] ] ) ) continue;
|
||||
|
||||
if ( isset( $whiteSpaceTokens[ $token[0] ] ) ) {
|
||||
$token = "\x07";
|
||||
} else {
|
||||
$token = $token[1];
|
||||
}
|
||||
} elseif ( $token === ';' ) {
|
||||
$token = "\x07";
|
||||
}
|
||||
|
||||
$cleanedSource .= $token;
|
||||
}
|
||||
return $cleanedSource;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns whether current trace step belongs to Kint or its wrappers
|
||||
*
|
||||
* @param $step
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private static function _stepIsInternal( $step )
|
||||
{
|
||||
if ( isset( $step['class'] ) ) {
|
||||
foreach ( self::$aliases['methods'] as $alias ) {
|
||||
if ( $alias[0] === strtolower( $step['class'] ) && $alias[1] === strtolower( $step['function'] ) ) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} else {
|
||||
return in_array( strtolower( $step['function'] ), self::$aliases['functions'], true );
|
||||
}
|
||||
}
|
||||
|
||||
private static function _parseTrace( array $data )
|
||||
{
|
||||
$trace = array();
|
||||
$traceFields = array( 'file', 'line', 'args', 'class' );
|
||||
$fileFound = false; # file element must exist in one of the steps
|
||||
|
||||
# validate whether a trace was indeed passed
|
||||
while ( $step = array_pop( $data ) ) {
|
||||
if ( !is_array( $step ) || !isset( $step['function'] ) ) return false;
|
||||
if ( !$fileFound && isset( $step['file'] ) && file_exists( $step['file'] ) ) {
|
||||
$fileFound = true;
|
||||
}
|
||||
|
||||
$valid = false;
|
||||
foreach ( $traceFields as $element ) {
|
||||
if ( isset( $step[ $element ] ) ) {
|
||||
$valid = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( !$valid ) return false;
|
||||
|
||||
if ( self::_stepIsInternal( $step ) ) {
|
||||
$step = array(
|
||||
'file' => $step['file'],
|
||||
'line' => $step['line'],
|
||||
'function' => '',
|
||||
);
|
||||
array_unshift( $trace, $step );
|
||||
break;
|
||||
}
|
||||
if ( $step['function'] !== 'spl_autoload_call' ) { # meaningless
|
||||
array_unshift( $trace, $step );
|
||||
}
|
||||
}
|
||||
if ( !$fileFound ) return false;
|
||||
|
||||
$output = array();
|
||||
foreach ( $trace as $step ) {
|
||||
if ( isset( $step['file'] ) ) {
|
||||
$file = $step['file'];
|
||||
|
||||
if ( isset( $step['line'] ) ) {
|
||||
$line = $step['line'];
|
||||
# include the source of this step
|
||||
if ( self::enabled() === self::MODE_RICH ) {
|
||||
$source = self::_showSource( $file, $line );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$function = $step['function'];
|
||||
|
||||
if ( in_array( $function, array( 'include', 'include_once', 'require', 'require_once' ) ) ) {
|
||||
if ( empty( $step['args'] ) ) {
|
||||
# no arguments
|
||||
$args = array();
|
||||
} else {
|
||||
# sanitize the included file path
|
||||
$args = array( 'file' => self::shortenPath( $step['args'][0] ) );
|
||||
}
|
||||
} elseif ( isset( $step['args'] ) ) {
|
||||
if ( empty( $step['class'] ) && !function_exists( $function ) ) {
|
||||
# introspection on closures or language constructs in a stack trace is impossible before PHP 5.3
|
||||
$params = null;
|
||||
} else {
|
||||
try {
|
||||
if ( isset( $step['class'] ) ) {
|
||||
if ( method_exists( $step['class'], $function ) ) {
|
||||
$reflection = new ReflectionMethod( $step['class'], $function );
|
||||
} else if ( isset( $step['type'] ) && $step['type'] == '::' ) {
|
||||
$reflection = new ReflectionMethod( $step['class'], '__callStatic' );
|
||||
} else {
|
||||
$reflection = new ReflectionMethod( $step['class'], '__call' );
|
||||
}
|
||||
} else {
|
||||
$reflection = new ReflectionFunction( $function );
|
||||
}
|
||||
|
||||
# get the function parameters
|
||||
$params = $reflection->getParameters();
|
||||
} catch ( Exception $e ) { # avoid various PHP version incompatibilities
|
||||
$params = null;
|
||||
}
|
||||
}
|
||||
|
||||
$args = array();
|
||||
foreach ( $step['args'] as $i => $arg ) {
|
||||
if ( isset( $params[ $i ] ) ) {
|
||||
# assign the argument by the parameter name
|
||||
$args[ $params[ $i ]->name ] = $arg;
|
||||
} else {
|
||||
# assign the argument by number
|
||||
$args[ '#' . ( $i + 1 ) ] = $arg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( isset( $step['class'] ) ) {
|
||||
# Class->method() or Class::method()
|
||||
$function = $step['class'] . $step['type'] . $function;
|
||||
}
|
||||
|
||||
// todo it's possible to parse the object name out from the source!
|
||||
$output[] = array(
|
||||
'function' => $function,
|
||||
'args' => isset( $args ) ? $args : null,
|
||||
'file' => isset( $file ) ? $file : null,
|
||||
'line' => isset( $line ) ? $line : null,
|
||||
'source' => isset( $source ) ? $source : null,
|
||||
'object' => isset( $step['object'] ) ? $step['object'] : null,
|
||||
);
|
||||
|
||||
unset( $function, $args, $file, $line, $source );
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ( !function_exists( 'd' ) ) {
|
||||
/**
|
||||
* Alias of Kint::dump()
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function d()
|
||||
{
|
||||
if ( !Kint::enabled() ) return '';
|
||||
$_ = func_get_args();
|
||||
return call_user_func_array( array( 'Kint', 'dump' ), $_ );
|
||||
}
|
||||
}
|
||||
|
||||
if ( !function_exists( 'dd' ) ) {
|
||||
/**
|
||||
* Alias of Kint::dump()
|
||||
* [!!!] IMPORTANT: execution will halt after call to this function
|
||||
*
|
||||
* @return string
|
||||
* @deprecated
|
||||
*/
|
||||
function dd()
|
||||
{
|
||||
if ( !Kint::enabled() ) return '';
|
||||
|
||||
echo "<pre>Kint: dd() is being deprecated, please use ddd() instead</pre>\n";
|
||||
$_ = func_get_args();
|
||||
call_user_func_array( array( 'Kint', 'dump' ), $_ );
|
||||
die;
|
||||
}
|
||||
}
|
||||
|
||||
if ( !function_exists( 'ddd' ) ) {
|
||||
/**
|
||||
* Alias of Kint::dump()
|
||||
* [!!!] IMPORTANT: execution will halt after call to this function
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function ddd()
|
||||
{
|
||||
if ( !Kint::enabled() ) return '';
|
||||
$_ = func_get_args();
|
||||
call_user_func_array( array( 'Kint', 'dump' ), $_ );
|
||||
die;
|
||||
}
|
||||
}
|
||||
|
||||
if ( !function_exists( 's' ) ) {
|
||||
/**
|
||||
* Alias of Kint::dump(), however the output is in plain htmlescaped text and some minor visibility enhancements
|
||||
* added. If run in CLI mode, output is pure whitespace.
|
||||
*
|
||||
* To force rendering mode without autodetecting anything:
|
||||
*
|
||||
* Kint::enabled( Kint::MODE_PLAIN );
|
||||
* Kint::dump( $variable );
|
||||
*
|
||||
* [!!!] IMPORTANT: execution will halt after call to this function
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function s()
|
||||
{
|
||||
$enabled = Kint::enabled();
|
||||
if ( !$enabled ) return '';
|
||||
|
||||
if ( $enabled === Kint::MODE_WHITESPACE ) { # if already in whitespace, don't elevate to plain
|
||||
$restoreMode = Kint::MODE_WHITESPACE;
|
||||
} else {
|
||||
$restoreMode = Kint::enabled( # remove cli colors in cli mode; remove rich interface in HTML mode
|
||||
PHP_SAPI === 'cli' ? Kint::MODE_WHITESPACE : Kint::MODE_PLAIN
|
||||
);
|
||||
}
|
||||
|
||||
$params = func_get_args();
|
||||
$dump = call_user_func_array( array( 'Kint', 'dump' ), $params );
|
||||
Kint::enabled( $restoreMode );
|
||||
return $dump;
|
||||
}
|
||||
}
|
||||
|
||||
if ( !function_exists( 'sd' ) ) {
|
||||
/**
|
||||
* @see s()
|
||||
*
|
||||
* [!!!] IMPORTANT: execution will halt after call to this function
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function sd()
|
||||
{
|
||||
$enabled = Kint::enabled();
|
||||
if ( !$enabled ) return '';
|
||||
|
||||
if ( $enabled !== Kint::MODE_WHITESPACE ) {
|
||||
Kint::enabled(
|
||||
PHP_SAPI === 'cli' ? Kint::MODE_WHITESPACE : Kint::MODE_PLAIN
|
||||
);
|
||||
}
|
||||
|
||||
$params = func_get_args();
|
||||
call_user_func_array( array( 'Kint', 'dump' ), $params );
|
||||
die;
|
||||
}
|
||||
}
|
20
system/ThirdParty/Kint/LICENCE
vendored
20
system/ThirdParty/Kint/LICENCE
vendored
@ -1,20 +0,0 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 Rokas Šleinius (raveren@gmail.com)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
141
system/ThirdParty/Kint/README.md
vendored
141
system/ThirdParty/Kint/README.md
vendored
@ -1,141 +0,0 @@
|
||||
# Kint - debugging helper for PHP developers
|
||||
|
||||
[](https://packagist.org/packages/raveren/kint)
|
||||
|
||||
> **New version** v1.0.0 is released with more than two years of active development - changes are too numerous to list, but there's CLI output and literally hundreds of improvements and additions.
|
||||
|
||||

|
||||
|
||||
## What am I looking at?
|
||||
|
||||
At first glance Kint is just a pretty replacement for **[var_dump()](http://php.net/manual/en/function.var-dump.php)**, **[print_r()](http://php.net/manual/en/function.print-r.php)** and **[debug_backtrace()](http://php.net/manual/en/function.debug-backtrace.php)**.
|
||||
|
||||
However, it's much, *much* more than that. Even the excellent `xdebug` var_dump improvements don't come close - you will eventually wonder how you developed without it.
|
||||
|
||||
Just to list some of the most useful features:
|
||||
|
||||
* The **variable name and place in code** where Kint was called from is displayed;
|
||||
* You can **disable all Kint output easily and on the fly** - so you can even debug live systems without anyone knowing (even though you know you shouldn't be doing that!:).
|
||||
* **CLI is detected** and formatted for automatically (but everything can be overridden on the fly) - if your setup supports it, the output is colored too:
|
||||

|
||||
* **Debug backtraces** are finally fully readable, actually informative and a pleasure to the eye.
|
||||
* Kint has been **in active development for more than six years** and is shipped with [Drupal 8](https://www.drupal.org/) by default as part of its devel suite. You can trust it not being abandoned or getting left behind in features.
|
||||
* Variable content is **displayed in the most informative way** - and you *never, ever* miss anything! Kint guarantees you see every piece of physically available information about everything you are dumping*;
|
||||
* <sup>in some cases, the content is truncated where it would otherwise be too large to view anyway - but the user is always made aware of that;</sup>
|
||||
* Some variable content types have an alternative display - for example you will be able see `JSON` in its raw form - but also as an associative array:
|
||||

|
||||
There are more than ten custom variable type displays inbuilt and more are added periodically.
|
||||
|
||||
|
||||
## Installation and Usage
|
||||
|
||||
One of the main goals of Kint is to be **zero setup**.
|
||||
|
||||
[Download the archive](https://github.com/raveren/kint/archive/master.zip) and simply
|
||||
```php
|
||||
<?php
|
||||
require '/kint/Kint.class.php';
|
||||
```
|
||||
|
||||
**Or, if you use Composer:**
|
||||
|
||||
```json
|
||||
"require": {
|
||||
"raveren/kint": "^1.0"
|
||||
}
|
||||
```
|
||||
|
||||
Or just run `composer require raveren/kint`
|
||||
|
||||
**That's it, you can now use Kint to debug your code:**
|
||||
|
||||
```php
|
||||
########## DUMP VARIABLE ###########################
|
||||
Kint::dump($GLOBALS, $_SERVER); // pass any number of parameters
|
||||
|
||||
// or simply use d() as a shorthand:
|
||||
d($_SERVER);
|
||||
|
||||
|
||||
########## DEBUG BACKTRACE #########################
|
||||
Kint::trace();
|
||||
// or via shorthand:
|
||||
d(1);
|
||||
|
||||
|
||||
############# BASIC OUTPUT #########################
|
||||
# this will show a basic javascript-free display
|
||||
s($GLOBALS);
|
||||
|
||||
|
||||
######### WHITESPACE FORMATTED OUTPUT ##############
|
||||
# this will be garbled if viewed in browser as it is whitespace-formatted only
|
||||
~d($GLOBALS); // just prepend with the tilde
|
||||
|
||||
|
||||
########## MISCELLANEOUS ###########################
|
||||
# this will disable kint completely
|
||||
Kint::enabled(false);
|
||||
|
||||
ddd('Get off my lawn!'); // no effect
|
||||
|
||||
Kint::enabled(true);
|
||||
ddd( 'this line will stop the execution flow because Kint was just re-enabled above!' );
|
||||
|
||||
|
||||
```
|
||||
|
||||
Note, that Kint *does* have configuration (like themes and IDE integration!), but it's in need of being rewritten, so I'm not documenting it yet.
|
||||
|
||||
## Tips & Tricks
|
||||
|
||||
* Kint is enabled by default, call `Kint::enabled(false);` to turn its funcionality completely off. The *best practice* is to enable Kint in DEVELOPMENT environment only (or for example `Kint::enabled($_SERVER['REMOTE_ADDR'] === '<your IP>');`) - so even if you accidentally leave a dump in production, no one will know.
|
||||
* `sd()` and `ddd()` are shorthands for `s();die;` and `d();die;` respectively.
|
||||
* **Important:** The older shorthand `dd()` is deprecated due to compatibility issues and will eventually be removed. Use the analogous `ddd()` instead.
|
||||
* When looking at Kint output, press <kbd>D</kbd> on the keyboard and you will be able to traverse the tree with arrows and tab keys - and expand/collapse nodes with space or enter.
|
||||
* Double clicking the `[+]` sign in the output will expand/collapse ALL nodes; triple clicking big blocks of text will select it all.
|
||||
* Clicking the tiny arrows on the right of the output open it in a separate window where you can keep it for comparison.
|
||||
* To catch output from Kint just assign it to a variable<sup>beta</sup>
|
||||
```php
|
||||
$o = Kint::dump($GLOBALS);
|
||||
// yes, the assignment is automatically detected, and $o
|
||||
// now holds whatever was going to be printed otherwise.
|
||||
|
||||
// it also supports modifiers (read on) for the variable:
|
||||
~$o = Kint::dump($GLOBALS); // this output will be in whitespace
|
||||
```
|
||||
* There are a couple of real-time modifiers you can use:
|
||||
* `~d($var)` this call will output in plain text format.
|
||||
* `+d($var)` will disregard depth level limits and output everything (careful, this can hang your browser on huge objects)
|
||||
* `!d($var)` will show expanded rich output.
|
||||
* `-d($var)` will attempt to `ob_clean` the previous output so if you're dumping something inside a HTML page, you will still see Kint output.
|
||||
You can combine modifiers too: `~+d($var)`
|
||||
* To force a specific dump output type just pass it to the `Kint::enabled()` method. Available options are: `Kint::MODE_RICH` (default), `Kint::MODE_PLAIN`, `Kint::MODE_WHITESPACE` and `Kint::MODE_CLI`:
|
||||
```php
|
||||
Kint::enabled(Kint::MODE_WHITESPACE);
|
||||
$kintOutput = Kint::dump($GLOBALS);
|
||||
// now $kintOutput can be written to a text log file and
|
||||
// be perfectly readable from there
|
||||
```
|
||||
* To change display theme, use `Kint::$theme = '<theme name>';` where available options are: `'original'` (default), `'solarized'`, `'solarized-dark'` and `'aante-light'`. Here's an (outdated) preview:
|
||||

|
||||
* Kint also includes a naïve profiler you may find handy. It's for determining relatively which code blocks take longer than others:
|
||||
```php
|
||||
Kint::dump( microtime() ); // just pass microtime()
|
||||
sleep( 1 );
|
||||
Kint::dump( microtime(), 'after sleep(1)' );
|
||||
sleep( 2 );
|
||||
ddd( microtime(), 'final call, after sleep(2)' );
|
||||
```
|
||||

|
||||
----
|
||||
|
||||
[Visit the project page](http://raveren.github.com/kint/) for documentation, configuration, and more advanced usage examples.
|
||||
|
||||
### Author
|
||||
|
||||
**Rokas Šleinius** (Raveren)
|
||||
|
||||
### License
|
||||
|
||||
Licensed under the MIT License
|
29
system/ThirdParty/Kint/composer.json
vendored
29
system/ThirdParty/Kint/composer.json
vendored
@ -1,29 +0,0 @@
|
||||
{
|
||||
"name": "raveren/kint",
|
||||
"description": "Kint - debugging helper for PHP developers",
|
||||
"keywords": ["kint", "php", "debug"],
|
||||
"type": "library",
|
||||
"homepage": "https://github.com/raveren/kint",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Rokas Šleinius",
|
||||
"homepage": "https://github.com/raveren"
|
||||
},
|
||||
{
|
||||
"name": "Contributors",
|
||||
"homepage": "https://github.com/raveren/kint/contributors"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.1.0"
|
||||
},
|
||||
"autoload": {
|
||||
"files": ["Kint.class.php"]
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.0.x-dev"
|
||||
}
|
||||
}
|
||||
}
|
94
system/ThirdParty/Kint/config.default.php
vendored
94
system/ThirdParty/Kint/config.default.php
vendored
@ -1,94 +0,0 @@
|
||||
<?php
|
||||
isset( $GLOBALS['_kint_settings'] ) or $GLOBALS['_kint_settings'] = array();
|
||||
$_kintSettings = &$GLOBALS['_kint_settings'];
|
||||
|
||||
|
||||
/** @var bool if set to false, kint will become silent, same as Kint::enabled(false) or Kint::$enabled = false */
|
||||
$_kintSettings['enabled'] = true;
|
||||
|
||||
|
||||
/**
|
||||
* @var bool whether to display where kint was called from
|
||||
*/
|
||||
$_kintSettings['displayCalledFrom'] = true;
|
||||
|
||||
|
||||
/**
|
||||
* @var string format of the link to the source file in trace entries. Use %f for file path, %l for line number.
|
||||
* Defaults to xdebug.file_link_format if not set.
|
||||
*
|
||||
* [!] EXAMPLE (works with for phpStorm and RemoteCall Plugin):
|
||||
*
|
||||
* $_kintSettings['fileLinkFormat'] = 'http://localhost:8091/?message=%f:%l';
|
||||
*
|
||||
*/
|
||||
$_kintSettings['fileLinkFormat'] = ini_get( 'xdebug.file_link_format' );
|
||||
|
||||
|
||||
/**
|
||||
* @var array base directories of your application that will be displayed instead of the full path. Keys are paths,
|
||||
* values are replacement strings
|
||||
*
|
||||
* Defaults to array( $_SERVER['DOCUMENT_ROOT'] => '<ROOT>' )
|
||||
*
|
||||
* [!] EXAMPLE (for Kohana framework):
|
||||
*
|
||||
* $_kintSettings['appRootDirs'] = array(
|
||||
* APPPATH => 'APPPATH', // make sure the constants are already defined at the time of including this config file
|
||||
* SYSPATH => 'SYSPATH',
|
||||
* MODPATH => 'MODPATH',
|
||||
* DOCROOT => 'DOCROOT',
|
||||
* );
|
||||
*
|
||||
* [!] EXAMPLE #2 (for a semi-universal approach)
|
||||
*
|
||||
* $_kintSettings['appRootDirs'] = array(
|
||||
* realpath( __DIR__ . '/../../..' ) => 'ROOT', // go up as many levels as needed in the realpath() param
|
||||
* );
|
||||
*
|
||||
* $_kintSettings['fileLinkFormat'] = 'http://localhost:8091/?message=%f:%l';
|
||||
*
|
||||
*/
|
||||
$_kintSettings['appRootDirs'] = isset( $_SERVER['DOCUMENT_ROOT'] )
|
||||
? array( $_SERVER['DOCUMENT_ROOT'] => '<ROOT>' )
|
||||
: array();
|
||||
|
||||
|
||||
/** @var int max length of string before it is truncated and displayed separately in full. Zero or false to disable */
|
||||
$_kintSettings['maxStrLength'] = 80;
|
||||
|
||||
/** @var array possible alternative char encodings in order of probability, eg. array('windows-1251') */
|
||||
$_kintSettings['charEncodings'] = array(
|
||||
'UTF-8',
|
||||
'Windows-1252', # Western; includes iso-8859-1, replace this with windows-1251 if you have Russian code
|
||||
'euc-jp', # Japanese
|
||||
|
||||
# all other charsets cannot be differentiated by PHP and/or are not supported by mb_* functions,
|
||||
# I need a better means of detecting the codeset, no idea how though :(
|
||||
|
||||
// 'iso-8859-13', # Baltic
|
||||
// 'windows-1251', # Cyrillic
|
||||
// 'windows-1250', # Central European
|
||||
// 'shift_jis', # Japanese
|
||||
// 'iso-2022-jp', # Japanese
|
||||
);
|
||||
|
||||
|
||||
/** @var int max array/object levels to go deep, if zero no limits are applied */
|
||||
$_kintSettings['maxLevels'] = 7;
|
||||
|
||||
|
||||
/** @var string name of theme for rich view */
|
||||
$_kintSettings['theme'] = 'original';
|
||||
|
||||
|
||||
/** @var bool enable detection when Kint is command line. Formats output with whitespace only; does not HTML-escape it */
|
||||
$_kintSettings['cliDetection'] = true;
|
||||
|
||||
/** @var bool in addition to above setting, enable detection when Kint is run in *UNIX* command line.
|
||||
* Attempts to add coloring, but if seen as plain text, the color information is visible as gibberish
|
||||
*/
|
||||
$_kintSettings['cliColors'] = true;
|
||||
|
||||
|
||||
unset( $_kintSettings );
|
98
system/ThirdParty/Kint/config.php
vendored
98
system/ThirdParty/Kint/config.php
vendored
@ -1,98 +0,0 @@
|
||||
<?php
|
||||
isset( $GLOBALS['_kint_settings'] ) or $GLOBALS['_kint_settings'] = array();
|
||||
$_kintSettings = &$GLOBALS['_kint_settings'];
|
||||
|
||||
|
||||
/** @var bool if set to false, kint will become silent, same as Kint::enabled(false) or Kint::$enabled = false */
|
||||
$_kintSettings['enabled'] = true;
|
||||
|
||||
|
||||
/**
|
||||
* @var bool whether to display where kint was called from
|
||||
*/
|
||||
$_kintSettings['displayCalledFrom'] = true;
|
||||
|
||||
|
||||
/**
|
||||
* @var string format of the link to the source file in trace entries. Use %f for file path, %l for line number.
|
||||
* Defaults to xdebug.file_link_format if not set.
|
||||
*
|
||||
* [!] EXAMPLE (works with for phpStorm and RemoteCall Plugin):
|
||||
*
|
||||
* $_kintSettings['fileLinkFormat'] = 'http://localhost:8091/?message=%f:%l';
|
||||
*
|
||||
*/
|
||||
$_kintSettings['fileLinkFormat'] = ini_get( 'xdebug.file_link_format' );
|
||||
|
||||
|
||||
/**
|
||||
* @var array base directories of your application that will be displayed instead of the full path. Keys are paths,
|
||||
* values are replacement strings
|
||||
*
|
||||
* Defaults to array( $_SERVER['DOCUMENT_ROOT'] => '<ROOT>' )
|
||||
*
|
||||
* [!] EXAMPLE (for Kohana framework):
|
||||
*
|
||||
* $_kintSettings['appRootDirs'] = array(
|
||||
* APPPATH => 'APPPATH', // make sure the constants are already defined at the time of including this config file
|
||||
* SYSPATH => 'SYSPATH',
|
||||
* MODPATH => 'MODPATH',
|
||||
* DOCROOT => 'DOCROOT',
|
||||
* );
|
||||
*
|
||||
* [!] EXAMPLE #2 (for a semi-universal approach)
|
||||
*
|
||||
* $_kintSettings['appRootDirs'] = array(
|
||||
* realpath( __DIR__ . '/../../..' ) => 'ROOT', // go up as many levels as needed in the realpath() param
|
||||
* );
|
||||
*
|
||||
* $_kintSettings['fileLinkFormat'] = 'http://localhost:8091/?message=%f:%l';
|
||||
*
|
||||
*/
|
||||
$_kintSettings['appRootDirs'] = [
|
||||
APPPATH => 'APPPATH',
|
||||
BASEPATH => 'BASEPATH',
|
||||
FCPATH => 'FCPATH',
|
||||
WRITEPATH => 'WRITEPATH',
|
||||
TESTPATH => 'TESTPATH'
|
||||
];
|
||||
|
||||
|
||||
/** @var int max length of string before it is truncated and displayed separately in full. Zero or false to disable */
|
||||
$_kintSettings['maxStrLength'] = 80;
|
||||
|
||||
/** @var array possible alternative char encodings in order of probability, eg. array('windows-1251') */
|
||||
$_kintSettings['charEncodings'] = array(
|
||||
'UTF-8',
|
||||
'Windows-1252', # Western; includes iso-8859-1, replace this with windows-1251 if you have Russian code
|
||||
'euc-jp', # Japanese
|
||||
|
||||
# all other charsets cannot be differentiated by PHP and/or are not supported by mb_* functions,
|
||||
# I need a better means of detecting the codeset, no idea how though :(
|
||||
|
||||
// 'iso-8859-13', # Baltic
|
||||
// 'windows-1251', # Cyrillic
|
||||
// 'windows-1250', # Central European
|
||||
// 'shift_jis', # Japanese
|
||||
// 'iso-2022-jp', # Japanese
|
||||
);
|
||||
|
||||
|
||||
/** @var int max array/object levels to go deep, if zero no limits are applied */
|
||||
$_kintSettings['maxLevels'] = 7;
|
||||
|
||||
|
||||
/** @var string name of theme for rich view */
|
||||
$_kintSettings['theme'] = 'aante-light';
|
||||
|
||||
|
||||
/** @var bool enable detection when Kint is command line. Formats output with whitespace only; does not HTML-escape it */
|
||||
$_kintSettings['cliDetection'] = true;
|
||||
|
||||
/** @var bool in addition to above setting, enable detection when Kint is run in *UNIX* command line.
|
||||
* Attempts to add coloring, but if seen as plain text, the color information is visible as gibberish
|
||||
*/
|
||||
$_kintSettings['cliColors'] = true;
|
||||
|
||||
|
||||
unset( $_kintSettings );
|
335
system/ThirdParty/Kint/decorators/plain.php
vendored
335
system/ThirdParty/Kint/decorators/plain.php
vendored
@ -1,335 +0,0 @@
|
||||
<?php
|
||||
|
||||
class Kint_Decorators_Plain
|
||||
{
|
||||
private static $_enableColors;
|
||||
|
||||
private static $_cliEffects = array(
|
||||
# effects
|
||||
'bold' => '1', 'dark' => '2',
|
||||
'italic' => '3', 'underline' => '4',
|
||||
'blink' => '5', 'reverse' => '7',
|
||||
'concealed' => '8', 'default' => '39',
|
||||
|
||||
# colors
|
||||
'black' => '30', 'red' => '31',
|
||||
'green' => '32', 'yellow' => '33',
|
||||
'blue' => '34', 'magenta' => '35',
|
||||
'cyan' => '36', 'light_gray' => '37',
|
||||
'dark_gray' => '90', 'light_red' => '91',
|
||||
'light_green' => '92', 'light_yellow' => '93',
|
||||
'light_blue' => '94', 'light_magenta' => '95',
|
||||
'light_cyan' => '96', 'white' => '97',
|
||||
|
||||
# backgrounds
|
||||
'bg_default' => '49', 'bg_black' => '40',
|
||||
'bg_red' => '41', 'bg_green' => '42',
|
||||
'bg_yellow' => '43', 'bg_blue' => '44',
|
||||
'bg_magenta' => '45', 'bg_cyan' => '46',
|
||||
'bg_light_gray' => '47', 'bg_dark_gray' => '100',
|
||||
'bg_light_red' => '101', 'bg_light_green' => '102',
|
||||
'bg_light_yellow' => '103', 'bg_light_blue' => '104',
|
||||
'bg_light_magenta' => '105', 'bg_light_cyan' => '106',
|
||||
'bg_white' => '107',
|
||||
);
|
||||
private static $_utfSymbols = array(
|
||||
'┌', '═', '┐',
|
||||
'│',
|
||||
'└', '─', '┘',
|
||||
);
|
||||
private static $_winShellSymbols = array(
|
||||
"\xda", "\xdc", "\xbf",
|
||||
"\xb3",
|
||||
"\xc0", "\xc4", "\xd9",
|
||||
);
|
||||
private static $_htmlSymbols = array(
|
||||
"┌", "▄", "┐",
|
||||
"│",
|
||||
"└", "─", "┘",
|
||||
);
|
||||
|
||||
public static function decorate( kintVariableData $kintVar, $level = 0 )
|
||||
{
|
||||
$output = '';
|
||||
if ( $level === 0 ) {
|
||||
$name = $kintVar->name ? $kintVar->name : 'literal';
|
||||
$kintVar->name = null;
|
||||
|
||||
$output .= self::_title( $name );
|
||||
}
|
||||
|
||||
|
||||
$space = str_repeat( $s = ' ', $level );
|
||||
$output .= $space . self::_drawHeader( $kintVar );
|
||||
|
||||
|
||||
if ( $kintVar->extendedValue !== null ) {
|
||||
$output .= ' ' . ( $kintVar->type === 'array' ? '[' : '(' ) . PHP_EOL;
|
||||
|
||||
|
||||
if ( is_array( $kintVar->extendedValue ) ) {
|
||||
foreach ( $kintVar->extendedValue as $v ) {
|
||||
$output .= self::decorate( $v, $level + 1 );
|
||||
}
|
||||
} elseif ( is_string( $kintVar->extendedValue ) ) {
|
||||
$output .= $space . $s . $kintVar->extendedValue . PHP_EOL; # "depth too great" or similar
|
||||
} else {
|
||||
$output .= self::decorate( $kintVar->extendedValue, $level + 1 ); //it's kintVariableData
|
||||
}
|
||||
$output .= $space . ( $kintVar->type === 'array' ? ']' : ')' ) . PHP_EOL;
|
||||
} else {
|
||||
$output .= PHP_EOL;
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
public static function decorateTrace( $traceData )
|
||||
{
|
||||
$output = self::_title( 'TRACE' );
|
||||
$lastStep = count( $traceData );
|
||||
foreach ( $traceData as $stepNo => $step ) {
|
||||
$title = str_pad( ++$stepNo . ': ', 4, ' ' );
|
||||
|
||||
$title .= self::_colorize(
|
||||
( isset( $step['file'] ) ? self::_buildCalleeString( $step ) : 'PHP internal call' ),
|
||||
'title'
|
||||
);
|
||||
|
||||
if ( !empty( $step['function'] ) ) {
|
||||
$title .= ' ' . $step['function'];
|
||||
if ( isset( $step['args'] ) ) {
|
||||
$title .= '(';
|
||||
if ( empty( $step['args'] ) ) {
|
||||
$title .= ')';
|
||||
} else {
|
||||
}
|
||||
$title .= PHP_EOL;
|
||||
}
|
||||
}
|
||||
|
||||
$output .= $title;
|
||||
|
||||
if ( !empty( $step['args'] ) ) {
|
||||
$appendDollar = $step['function'] === '{closure}' ? '' : '$';
|
||||
|
||||
$i = 0;
|
||||
foreach ( $step['args'] as $name => $argument ) {
|
||||
$argument = kintParser::factory(
|
||||
$argument,
|
||||
$name ? $appendDollar . $name : '#' . ++$i
|
||||
);
|
||||
$argument->operator = $name ? ' =' : ':';
|
||||
$maxLevels = Kint::$maxLevels;
|
||||
if ( $maxLevels ) {
|
||||
Kint::$maxLevels = $maxLevels + 2;
|
||||
}
|
||||
$output .= self::decorate( $argument, 2 );
|
||||
if ( $maxLevels ) {
|
||||
Kint::$maxLevels = $maxLevels;
|
||||
}
|
||||
}
|
||||
$output .= ' )' . PHP_EOL;
|
||||
}
|
||||
|
||||
if ( !empty( $step['object'] ) ) {
|
||||
$output .= self::_colorize(
|
||||
' ' . self::_char( '─', 27 ) . ' Callee object ' . self::_char( '─', 34 ),
|
||||
'title'
|
||||
);
|
||||
|
||||
$maxLevels = Kint::$maxLevels;
|
||||
if ( $maxLevels ) {
|
||||
# in cli the terminal window is filled too quickly to display huge objects
|
||||
Kint::$maxLevels = Kint::enabled() === Kint::MODE_CLI
|
||||
? 1
|
||||
: $maxLevels + 1;
|
||||
}
|
||||
$output .= self::decorate( kintParser::factory( $step['object'] ), 1 );
|
||||
if ( $maxLevels ) {
|
||||
Kint::$maxLevels = $maxLevels;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $stepNo !== $lastStep ) {
|
||||
$output .= self::_colorize( self::_char( '─', 80 ), 'title' );
|
||||
}
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
|
||||
private static function _colorize( $text, $type, $nlAfter = true )
|
||||
{
|
||||
$nlAfter = $nlAfter ? PHP_EOL : '';
|
||||
|
||||
switch ( Kint::enabled() ) {
|
||||
case Kint::MODE_PLAIN:
|
||||
if ( !self::$_enableColors ) return $text . $nlAfter;
|
||||
|
||||
switch ( $type ) {
|
||||
case 'value':
|
||||
$text = "<i>{$text}</i>";
|
||||
break;
|
||||
case 'type':
|
||||
$text = "<b>{$text}</b>";
|
||||
break;
|
||||
case 'title':
|
||||
$text = "<u>{$text}</u>";
|
||||
break;
|
||||
}
|
||||
|
||||
return $text . $nlAfter;
|
||||
break;
|
||||
case Kint::MODE_CLI:
|
||||
if ( !self::$_enableColors ) return $text . $nlAfter;
|
||||
|
||||
$optionsMap = array(
|
||||
'title' => "\x1b[36m", # cyan
|
||||
'type' => "\x1b[35;1m", # magenta bold
|
||||
'value' => "\x1b[32m", # green
|
||||
);
|
||||
|
||||
return $optionsMap[ $type ] . $text . "\x1b[0m" . $nlAfter;
|
||||
break;
|
||||
case Kint::MODE_WHITESPACE:
|
||||
default:
|
||||
return $text . $nlAfter;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static function _char( $char, $repeat = null )
|
||||
{
|
||||
switch ( Kint::enabled() ) {
|
||||
case Kint::MODE_PLAIN:
|
||||
$char = self::$_htmlSymbols[ array_search( $char, self::$_utfSymbols, true ) ];
|
||||
break;
|
||||
case Kint::MODE_CLI:
|
||||
$inWindowsShell = PHP_SAPI === 'cli' && DIRECTORY_SEPARATOR !== '/';
|
||||
if ( $inWindowsShell ) {
|
||||
$char = self::$_winShellSymbols[ array_search( $char, self::$_utfSymbols, true ) ];
|
||||
}
|
||||
break;
|
||||
case Kint::MODE_WHITESPACE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return $repeat ? str_repeat( $char, $repeat ) : $char;
|
||||
}
|
||||
|
||||
private static function _title( $text )
|
||||
{
|
||||
$escaped = kintParser::escape( $text );
|
||||
$lengthDifference = strlen( $escaped ) - strlen( $text );
|
||||
return
|
||||
self::_colorize(
|
||||
self::_char( '┌' ) . self::_char( '─', 78 ) . self::_char( '┐' ) . PHP_EOL
|
||||
. self::_char( '│' ),
|
||||
'title',
|
||||
false
|
||||
)
|
||||
|
||||
. self::_colorize( str_pad( $escaped, 78 + $lengthDifference, ' ', STR_PAD_BOTH ), 'title', false )
|
||||
|
||||
. self::_colorize( self::_char( '│' ) . PHP_EOL
|
||||
. self::_char( '└' ) . self::_char( '─', 78 ) . self::_char( '┘' ),
|
||||
'title'
|
||||
);
|
||||
}
|
||||
|
||||
public static function wrapStart()
|
||||
{
|
||||
if ( Kint::enabled() === Kint::MODE_PLAIN ) {
|
||||
return '<pre class="-kint">';
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
public static function wrapEnd( $callee, $miniTrace, $prevCaller )
|
||||
{
|
||||
$lastLine = self::_colorize( self::_char( "═", 80 ), 'title' );
|
||||
$lastChar = Kint::enabled() === Kint::MODE_PLAIN ? '</pre>' : '';
|
||||
|
||||
|
||||
if ( !Kint::$displayCalledFrom ) return $lastLine . $lastChar;
|
||||
|
||||
|
||||
return $lastLine . self::_colorize( 'Called from ' . self::_buildCalleeString( $callee ), 'title' ) . $lastChar;
|
||||
}
|
||||
|
||||
|
||||
private static function _drawHeader( kintVariableData $kintVar )
|
||||
{
|
||||
$output = '';
|
||||
|
||||
if ( $kintVar->access ) {
|
||||
$output .= ' ' . $kintVar->access;
|
||||
}
|
||||
|
||||
if ( $kintVar->name !== null && $kintVar->name !== '' ) {
|
||||
$output .= ' ' . kintParser::escape( $kintVar->name );
|
||||
}
|
||||
|
||||
if ( $kintVar->operator ) {
|
||||
$output .= ' ' . $kintVar->operator;
|
||||
}
|
||||
|
||||
$output .= ' ' . self::_colorize( $kintVar->type, 'type', false );
|
||||
|
||||
if ( $kintVar->size !== null ) {
|
||||
$output .= ' (' . $kintVar->size . ')';
|
||||
}
|
||||
|
||||
|
||||
if ( $kintVar->value !== null && $kintVar->value !== '' ) {
|
||||
$output .= ' ' . self::_colorize(
|
||||
$kintVar->value, # escape shell
|
||||
'value',
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
return ltrim( $output );
|
||||
}
|
||||
|
||||
private static function _buildCalleeString( $callee )
|
||||
{
|
||||
if ( Kint::enabled() === Kint::MODE_CLI ) { // todo win/nix
|
||||
return "{$callee['file']}:{$callee['line']}";
|
||||
}
|
||||
|
||||
$url = Kint::getIdeLink( $callee['file'], $callee['line'] );
|
||||
$shortenedName = Kint::shortenPath( $callee['file'] ) . ':' . $callee['line'];
|
||||
|
||||
if ( Kint::enabled() === Kint::MODE_PLAIN ) {
|
||||
if ( strpos( $url, 'http://' ) === 0 ) {
|
||||
$calleeInfo = "<a href=\"#\"onclick=\""
|
||||
. "X=new XMLHttpRequest;"
|
||||
. "X.open('GET','{$url}');"
|
||||
. "X.send();"
|
||||
. "return!1\">{$shortenedName}</a>";
|
||||
} else {
|
||||
$calleeInfo = "<a href=\"{$url}\">{$shortenedName}</a>";
|
||||
}
|
||||
} else {
|
||||
$calleeInfo = $shortenedName;
|
||||
}
|
||||
|
||||
return $calleeInfo;
|
||||
}
|
||||
|
||||
public static function init()
|
||||
{
|
||||
self::$_enableColors =
|
||||
Kint::$cliColors
|
||||
&& ( DIRECTORY_SEPARATOR === '/' || getenv( 'ANSICON' ) !== false || getenv( 'ConEmuANSI' ) === 'ON' );
|
||||
|
||||
return Kint::enabled() === Kint::MODE_PLAIN
|
||||
? '<style>.-kint i{color:#d00;font-style:normal}.-kint u{color:#030;text-decoration:none;font-weight:bold}</style>'
|
||||
: '';
|
||||
}
|
||||
}
|
319
system/ThirdParty/Kint/decorators/rich.php
vendored
319
system/ThirdParty/Kint/decorators/rich.php
vendored
@ -1,319 +0,0 @@
|
||||
<?php
|
||||
|
||||
class Kint_Decorators_Rich
|
||||
{
|
||||
# make calls to Kint::dump() from different places in source coloured differently.
|
||||
private static $_usedColors = array();
|
||||
|
||||
public static function decorate( kintVariableData $kintVar )
|
||||
{
|
||||
$output = '<dl>';
|
||||
|
||||
$extendedPresent = $kintVar->extendedValue !== null || $kintVar->_alternatives !== null;
|
||||
|
||||
if ( $extendedPresent ) {
|
||||
$class = 'kint-parent';
|
||||
if ( Kint::$expandedByDefault ) {
|
||||
$class .= ' kint-show';
|
||||
}
|
||||
$output .= '<dt class="' . $class . '">';
|
||||
} else {
|
||||
$output .= '<dt>';
|
||||
}
|
||||
|
||||
if ( $extendedPresent ) {
|
||||
$output .= '<span class="kint-popup-trigger" title="Open in new window">→</span><nav></nav>';
|
||||
}
|
||||
|
||||
$output .= self::_drawHeader( $kintVar ) . $kintVar->value . '</dt>';
|
||||
|
||||
|
||||
if ( $extendedPresent ) {
|
||||
$output .= '<dd>';
|
||||
}
|
||||
|
||||
if ( isset( $kintVar->extendedValue ) ) {
|
||||
|
||||
if ( is_array( $kintVar->extendedValue ) ) {
|
||||
foreach ( $kintVar->extendedValue as $v ) {
|
||||
$output .= self::decorate( $v );
|
||||
}
|
||||
} elseif ( is_string( $kintVar->extendedValue ) ) {
|
||||
$output .= '<pre>' . $kintVar->extendedValue . '</pre>';
|
||||
} else {
|
||||
$output .= self::decorate( $kintVar->extendedValue ); //it's kint's container
|
||||
}
|
||||
|
||||
} elseif ( isset( $kintVar->_alternatives ) ) {
|
||||
$output .= "<ul class=\"kint-tabs\">";
|
||||
|
||||
foreach ( $kintVar->_alternatives as $k => $var ) {
|
||||
$active = $k === 0 ? ' class="kint-active-tab"' : '';
|
||||
$output .= "<li{$active}>" . self::_drawHeader( $var, false ) . '</li>';
|
||||
}
|
||||
|
||||
$output .= "</ul><ul>";
|
||||
|
||||
foreach ( $kintVar->_alternatives as $var ) {
|
||||
$output .= "<li>";
|
||||
|
||||
$var = $var->value;
|
||||
|
||||
if ( is_array( $var ) ) {
|
||||
foreach ( $var as $v ) {
|
||||
$output .= is_string( $v )
|
||||
? '<pre>' . $v . '</pre>'
|
||||
: self::decorate( $v );
|
||||
}
|
||||
} elseif ( is_string( $var ) ) {
|
||||
$output .= '<pre>' . $var . '</pre>';
|
||||
} elseif ( isset( $var ) ) {
|
||||
throw new Exception(
|
||||
'Kint has encountered an error, '
|
||||
. 'please paste this report to https://github.com/raveren/kint/issues<br>'
|
||||
. 'Error encountered at ' . basename( __FILE__ ) . ':' . __LINE__ . '<br>'
|
||||
. ' variables: '
|
||||
. htmlspecialchars( var_export( $kintVar->_alternatives, true ), ENT_QUOTES )
|
||||
);
|
||||
}
|
||||
|
||||
$output .= "</li>";
|
||||
}
|
||||
|
||||
$output .= "</ul>";
|
||||
}
|
||||
if ( $extendedPresent ) {
|
||||
$output .= '</dd>';
|
||||
}
|
||||
|
||||
$output .= '</dl>';
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
public static function decorateTrace( $traceData )
|
||||
{
|
||||
$output = '<dl class="kint-trace">';
|
||||
|
||||
foreach ( $traceData as $i => $step ) {
|
||||
$class = 'kint-parent';
|
||||
if ( Kint::$expandedByDefault ) {
|
||||
$class .= ' kint-show';
|
||||
}
|
||||
|
||||
$output .= '<dt class="' . $class . '">'
|
||||
. '<b>' . ( $i + 1 ) . '</b> '
|
||||
. '<nav></nav>'
|
||||
. '<var>';
|
||||
|
||||
if ( isset( $step['file'] ) ) {
|
||||
$output .= self::_ideLink( $step['file'], $step['line'] );
|
||||
} else {
|
||||
$output .= 'PHP internal call';
|
||||
}
|
||||
|
||||
$output .= '</var>';
|
||||
|
||||
$output .= $step['function'];
|
||||
|
||||
if ( isset( $step['args'] ) ) {
|
||||
$output .= '(' . implode( ', ', array_keys( $step['args'] ) ) . ')';
|
||||
}
|
||||
$output .= '</dt><dd>';
|
||||
$firstTab = ' class="kint-active-tab"';
|
||||
$output .= '<ul class="kint-tabs">';
|
||||
|
||||
if ( !empty( $step['source'] ) ) {
|
||||
$output .= "<li{$firstTab}>Source</li>";
|
||||
$firstTab = '';
|
||||
}
|
||||
|
||||
if ( !empty( $step['args'] ) ) {
|
||||
$output .= "<li{$firstTab}>Arguments</li>";
|
||||
$firstTab = '';
|
||||
}
|
||||
|
||||
if ( !empty( $step['object'] ) ) {
|
||||
kintParser::reset();
|
||||
$calleeDump = kintParser::factory( $step['object'] );
|
||||
|
||||
$output .= "<li{$firstTab}>Callee object [{$calleeDump->type}]</li>";
|
||||
}
|
||||
|
||||
|
||||
$output .= '</ul><ul>';
|
||||
|
||||
|
||||
if ( !empty( $step['source'] ) ) {
|
||||
$output .= "<li><pre class=\"kint-source\">{$step['source']}</pre></li>";
|
||||
}
|
||||
|
||||
if ( !empty( $step['args'] ) ) {
|
||||
$output .= "<li>";
|
||||
foreach ( $step['args'] as $k => $arg ) {
|
||||
kintParser::reset();
|
||||
$output .= self::decorate( kintParser::factory( $arg, $k ) );
|
||||
}
|
||||
$output .= "</li>";
|
||||
}
|
||||
if ( !empty( $step['object'] ) ) {
|
||||
$output .= "<li>" . self::decorate( $calleeDump ) . "</li>";
|
||||
}
|
||||
|
||||
$output .= '</ul></dd>';
|
||||
}
|
||||
$output .= '</dl>';
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* called for each dump, opens the html tag
|
||||
*
|
||||
* @param array $callee caller information taken from debug backtrace
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function wrapStart()
|
||||
{
|
||||
return "<div class=\"kint\">";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* closes Kint::_wrapStart() started html tags and displays callee information
|
||||
*
|
||||
* @param array $callee caller information taken from debug backtrace
|
||||
* @param array $miniTrace full path to kint call
|
||||
* @param array $prevCaller previous caller information taken from debug backtrace
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function wrapEnd( $callee, $miniTrace, $prevCaller )
|
||||
{
|
||||
if ( !Kint::$displayCalledFrom ) {
|
||||
return '</div>';
|
||||
}
|
||||
|
||||
$callingFunction = '';
|
||||
$calleeInfo = '';
|
||||
$traceDisplay = '';
|
||||
if ( isset( $prevCaller['class'] ) ) {
|
||||
$callingFunction = $prevCaller['class'];
|
||||
}
|
||||
if ( isset( $prevCaller['type'] ) ) {
|
||||
$callingFunction .= $prevCaller['type'];
|
||||
}
|
||||
if ( isset( $prevCaller['function'] )
|
||||
&& !in_array( $prevCaller['function'], array( 'include', 'include_once', 'require', 'require_once' ) )
|
||||
) {
|
||||
$callingFunction .= $prevCaller['function'] . '()';
|
||||
}
|
||||
$callingFunction and $callingFunction = " [{$callingFunction}]";
|
||||
|
||||
|
||||
if ( isset( $callee['file'] ) ) {
|
||||
$calleeInfo .= 'Called from ' . self::_ideLink( $callee['file'], $callee['line'] );
|
||||
}
|
||||
|
||||
if ( !empty( $miniTrace ) ) {
|
||||
$traceDisplay = '<ol>';
|
||||
foreach ( $miniTrace as $step ) {
|
||||
$traceDisplay .= '<li>' . self::_ideLink( $step['file'], $step['line'] ); // closing tag not required
|
||||
if ( isset( $step['function'] )
|
||||
&& !in_array( $step['function'], array( 'include', 'include_once', 'require', 'require_once' ) )
|
||||
) {
|
||||
$classString = ' [';
|
||||
if ( isset( $step['class'] ) ) {
|
||||
$classString .= $step['class'];
|
||||
}
|
||||
if ( isset( $step['type'] ) ) {
|
||||
$classString .= $step['type'];
|
||||
}
|
||||
$classString .= $step['function'] . '()]';
|
||||
$traceDisplay .= $classString;
|
||||
}
|
||||
}
|
||||
$traceDisplay .= '</ol>';
|
||||
|
||||
$calleeInfo = '<nav></nav>' . $calleeInfo;
|
||||
}
|
||||
|
||||
|
||||
return "<footer>"
|
||||
. '<span class="kint-popup-trigger" title="Open in new window">→</span> '
|
||||
. "{$calleeInfo}{$callingFunction}{$traceDisplay}"
|
||||
. "</footer></div>";
|
||||
}
|
||||
|
||||
|
||||
private static function _drawHeader( kintVariableData $kintVar, $verbose = true )
|
||||
{
|
||||
$output = '';
|
||||
if ( $verbose ) {
|
||||
if ( $kintVar->access !== null ) {
|
||||
$output .= "<var>" . $kintVar->access . "</var> ";
|
||||
}
|
||||
|
||||
if ( $kintVar->name !== null && $kintVar->name !== '' ) {
|
||||
$output .= "<dfn>" . kintParser::escape( $kintVar->name ) . "</dfn> ";
|
||||
}
|
||||
|
||||
if ( $kintVar->operator !== null ) {
|
||||
$output .= $kintVar->operator . " ";
|
||||
}
|
||||
}
|
||||
|
||||
if ( $kintVar->type !== null ) {
|
||||
if ( $verbose ) {
|
||||
$output .= "<var>";
|
||||
}
|
||||
|
||||
$output .= $kintVar->type;
|
||||
|
||||
if ( $verbose ) {
|
||||
$output .= "</var>";
|
||||
} else {
|
||||
$output .= " ";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ( $kintVar->size !== null ) {
|
||||
$output .= "(" . $kintVar->size . ") ";
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
private static function _ideLink( $file, $line )
|
||||
{
|
||||
$shortenedPath = Kint::shortenPath( $file );
|
||||
if ( !Kint::$fileLinkFormat ) return $shortenedPath . ':' . $line;
|
||||
|
||||
$ideLink = Kint::getIdeLink( $file, $line );
|
||||
$class = ( strpos( $ideLink, 'http://' ) === 0 ) ? 'class="kint-ide-link" ' : '';
|
||||
return "<a {$class}href=\"{$ideLink}\">{$shortenedPath}:{$line}</a>";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* produces css and js required for display. May be called multiple times, will only produce output once per
|
||||
* pageload or until `-` or `@` modifier is used
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function init()
|
||||
{
|
||||
$baseDir = KINT_DIR . 'view/compiled/';
|
||||
|
||||
if ( !is_readable( $cssFile = $baseDir . Kint::$theme . '.css' ) ) {
|
||||
$cssFile = $baseDir . 'original.css';
|
||||
}
|
||||
|
||||
return
|
||||
'<script class="-kint-js">' . file_get_contents( $baseDir . 'kint.js' ) . '</script>'
|
||||
. '<style class="-kint-css">' . file_get_contents( $cssFile ) . "</style>\n";
|
||||
}
|
||||
}
|
176
system/ThirdParty/Kint/examples/overview.php
vendored
176
system/ThirdParty/Kint/examples/overview.php
vendored
@ -1,176 +0,0 @@
|
||||
<?php
|
||||
require( '../Kint.class.php' );
|
||||
|
||||
$selectedTheme = isset( $_GET['theme'] ) ? $_GET['theme'] : 'original';
|
||||
$allowedThemes = array();
|
||||
$dh = opendir( '../view/compiled' );
|
||||
while ( ( $filename = readdir( $dh ) ) !== false ) {
|
||||
if ( strpos( $filename, '.css' ) !== false ) {
|
||||
$allowedThemes[] = str_replace( '.css', '', $filename );
|
||||
}
|
||||
}
|
||||
|
||||
sort( $allowedThemes );
|
||||
|
||||
if ( in_array( $selectedTheme, $allowedThemes ) ) {
|
||||
Kint::$theme = $selectedTheme;
|
||||
}
|
||||
|
||||
class BaseUser
|
||||
{
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getFullName() { }
|
||||
}
|
||||
|
||||
class User extends BaseUser
|
||||
{
|
||||
CONST DEFAULT_PATH = 'some/default/path';
|
||||
CONST ROLE_DISALLOWED = 1;
|
||||
CONST ROLE_ALLOWED = 2;
|
||||
CONST ROLE_FORBIDDEN = 3;
|
||||
|
||||
public $additionalData;
|
||||
private $username = 'demo_username';
|
||||
private $password = 'demo_password';
|
||||
private $createdDate;
|
||||
|
||||
public function __construct() { }
|
||||
|
||||
/**
|
||||
* Check is user is equal to another user
|
||||
*/
|
||||
public function isEqualTo( BaseUser $user ) { }
|
||||
|
||||
/**
|
||||
* Get data from this demo class
|
||||
*
|
||||
* @param string $username
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function setUsername( $username ) { }
|
||||
|
||||
/**
|
||||
* Set additional data
|
||||
*
|
||||
* @array $data
|
||||
*/
|
||||
public function setAdditionalData( array $data ) { $this->additionalData = $data; }
|
||||
|
||||
/**
|
||||
* @return \DateTime date object
|
||||
*/
|
||||
public function getCreatedDate() { }
|
||||
|
||||
/**
|
||||
* @param \DateTime $date
|
||||
*/
|
||||
public function setCreatedDate( DateTime $date ) { $this->createdDate = $date; }
|
||||
|
||||
/**
|
||||
* Dummy method that triggers trace
|
||||
*/
|
||||
public function ensure() { Kint::trace(); }
|
||||
}
|
||||
|
||||
class UserManager
|
||||
{
|
||||
private $user;
|
||||
|
||||
/**
|
||||
* Get user from manager
|
||||
*/
|
||||
public function getUser() { return $this->user; }
|
||||
|
||||
/**
|
||||
* Debug specific user
|
||||
*
|
||||
* @param \User $user
|
||||
*/
|
||||
public function debugUser( $user )
|
||||
{
|
||||
$this->user = $user;
|
||||
d( $this->getUser() );
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure user (triggers ensure() method on \User object that trace)
|
||||
*
|
||||
* @void
|
||||
*/
|
||||
public function ensureUser() { $this->user->ensure(); }
|
||||
}
|
||||
|
||||
$user = new User;
|
||||
$user->setAdditionalData( array(
|
||||
'last_login' => new DateTime(),
|
||||
'current_unix_timestamp' => time(),
|
||||
'random_rgb_color_code' => '#FF9900',
|
||||
'impressions' => 60,
|
||||
'nickname' => 'Someuser',
|
||||
)
|
||||
);
|
||||
$user->setCreatedDate( new DateTime( '2013-10-10' ) );
|
||||
$userManager = new UserManager();
|
||||
|
||||
for ( $i = 1; $i < 6; $i++ ) {
|
||||
$tabularData[] = array(
|
||||
'date' => "2013-01-0{$i}",
|
||||
'allowed' => $i % 3 == 0,
|
||||
'action' => "action {$i}",
|
||||
'clicks' => rand( 100, 50000 ),
|
||||
'impressions' => rand( 10000, 500000 ),
|
||||
);
|
||||
|
||||
if ( $i % 2 == 0 ) {
|
||||
unset( $tabularData[ $i - 1 ]['clicks'] );
|
||||
}
|
||||
}
|
||||
|
||||
$nestedArray = array();
|
||||
|
||||
for ( $i = 1; $i < 6; $i++ ) {
|
||||
$nestedArray["user group {$i}"] = array(
|
||||
"user {$i}" => array(
|
||||
'name' => "Name {$i}",
|
||||
'surname' => "Surname {$i}"
|
||||
),
|
||||
|
||||
'data' => array(
|
||||
'conversions' => rand( 100, 5000 ),
|
||||
'spent' => array( 'currency' => 'EUR', 'amount' => rand( 10000, 500000 ) )
|
||||
),
|
||||
);
|
||||
}
|
||||
?>
|
||||
<html>
|
||||
<head>
|
||||
<title>Kint PHP debugging tool - overview</title>
|
||||
</head>
|
||||
<body>
|
||||
<div>
|
||||
<label style="float: right">Switch theme:
|
||||
<select onchange="window.location = '?theme=' + this.value">
|
||||
<?php $chosen = isset( $_GET['theme'] ) ? $_GET['theme'] : 'original' ?>
|
||||
<?php foreach ( $allowedThemes as $theme ) : ?>
|
||||
<option value="<?php echo $theme ?>"<?php echo $theme === $chosen ? ' selected' : '' ?>>
|
||||
<?php echo ucfirst( str_replace( '-', ' ', $theme ) ) ?>
|
||||
</option>
|
||||
<?php endforeach ?>
|
||||
</select>
|
||||
</label>
|
||||
|
||||
<h2>Kint PHP debugging tool - overview</h2>
|
||||
</div>
|
||||
<h3>Debug variables</h3>
|
||||
<?php
|
||||
$userManager->debugUser( $user );
|
||||
d( $userManager, $tabularData );
|
||||
d( $nestedArray );
|
||||
?>
|
||||
<h3>Trace</h3>
|
||||
<?php $userManager->ensureUser(); ?>
|
||||
</body>
|
||||
</html>
|
19
system/ThirdParty/Kint/inc/kintObject.class.php
vendored
19
system/ThirdParty/Kint/inc/kintObject.class.php
vendored
@ -1,19 +0,0 @@
|
||||
<?php
|
||||
|
||||
abstract class KintObject
|
||||
{
|
||||
/** @var string type of variable, can be set in inherited object or in static::parse() method */
|
||||
public $name = 'NOT SET';
|
||||
|
||||
/** @var string quick variable value displayed inline */
|
||||
public $value;
|
||||
|
||||
/**
|
||||
* returns false or associative array - each key represents a tab in default view, values may be anything
|
||||
*
|
||||
* @param $variable
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
abstract public function parse( & $variable );
|
||||
}
|
608
system/ThirdParty/Kint/inc/kintParser.class.php
vendored
608
system/ThirdParty/Kint/inc/kintParser.class.php
vendored
@ -1,608 +0,0 @@
|
||||
<?php
|
||||
|
||||
abstract class kintParser extends kintVariableData
|
||||
{
|
||||
private static $_level = 0;
|
||||
private static $_customDataTypes;
|
||||
private static $_objectParsers;
|
||||
private static $_objects;
|
||||
private static $_marker;
|
||||
|
||||
private static $_skipAlternatives = false;
|
||||
|
||||
private static $_placeFullStringInValue = false;
|
||||
|
||||
|
||||
private static function _init()
|
||||
{
|
||||
$fh = opendir( KINT_DIR . 'parsers/custom/' );
|
||||
while ( $fileName = readdir( $fh ) ) {
|
||||
if ( substr( $fileName, -4 ) !== '.php' ) continue;
|
||||
|
||||
require KINT_DIR . 'parsers/custom/' . $fileName;
|
||||
self::$_customDataTypes[] = substr( $fileName, 0, -4 );
|
||||
}
|
||||
$fh = opendir( KINT_DIR . 'parsers/objects/' );
|
||||
while ( $fileName = readdir( $fh ) ) {
|
||||
if ( substr( $fileName, -4 ) !== '.php' ) continue;
|
||||
|
||||
require KINT_DIR . 'parsers/objects/' . $fileName;
|
||||
self::$_objectParsers[] = substr( $fileName, 0, -4 );
|
||||
}
|
||||
}
|
||||
|
||||
public static function reset()
|
||||
{
|
||||
self::$_level = 0;
|
||||
self::$_objects = self::$_marker = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* main and usually single method a custom parser must implement
|
||||
*
|
||||
* @param mixed $variable
|
||||
*
|
||||
* @return mixed [!!!] false is returned if the variable is not of current type
|
||||
*/
|
||||
abstract protected function _parse( & $variable );
|
||||
|
||||
|
||||
/**
|
||||
* the only public entry point to return a parsed representation of a variable
|
||||
*
|
||||
* @static
|
||||
*
|
||||
* @param $variable
|
||||
* @param null $name
|
||||
*
|
||||
* @throws Exception
|
||||
* @return \kintParser
|
||||
*/
|
||||
public final static function factory( & $variable, $name = null )
|
||||
{
|
||||
isset( self::$_customDataTypes ) or self::_init();
|
||||
|
||||
# save internal data to revert after dumping to properly handle recursions etc
|
||||
$revert = array(
|
||||
'level' => self::$_level,
|
||||
'objects' => self::$_objects,
|
||||
);
|
||||
|
||||
self::$_level++;
|
||||
|
||||
$varData = new kintVariableData;
|
||||
$varData->name = $name;
|
||||
|
||||
# first parse the variable based on its type
|
||||
$varType = gettype( $variable );
|
||||
$varType === 'unknown type' and $varType = 'unknown'; # PHP 5.4 inconsistency
|
||||
$methodName = '_parse_' . $varType;
|
||||
|
||||
# objects can be presented in a different way altogether, INSTEAD, not ALONGSIDE the generic parser
|
||||
if ( $varType === 'object' ) {
|
||||
foreach ( self::$_objectParsers as $parserClass ) {
|
||||
$className = 'Kint_Objects_' . $parserClass;
|
||||
|
||||
/** @var $object KintObject */
|
||||
$object = new $className;
|
||||
if ( ( $alternativeTabs = $object->parse( $variable ) ) !== false ) {
|
||||
self::$_skipAlternatives = true;
|
||||
$alternativeDisplay = new kintVariableData;
|
||||
$alternativeDisplay->type = $object->name;
|
||||
$alternativeDisplay->value = $object->value;
|
||||
$alternativeDisplay->name = $name;
|
||||
|
||||
foreach ( $alternativeTabs as $name => $values ) {
|
||||
$alternative = kintParser::factory( $values );
|
||||
$alternative->type = $name;
|
||||
if ( Kint::enabled() === Kint::MODE_RICH ) {
|
||||
empty( $alternative->value ) and $alternative->value = $alternative->extendedValue;
|
||||
$alternativeDisplay->_alternatives[] = $alternative;
|
||||
} else {
|
||||
$alternativeDisplay->extendedValue[] = $alternative;
|
||||
}
|
||||
}
|
||||
|
||||
self::$_skipAlternatives = false;
|
||||
self::$_level = $revert['level'];
|
||||
self::$_objects = $revert['objects'];
|
||||
return $alternativeDisplay;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# base type parser returning false means "stop processing further": e.g. recursion
|
||||
if ( self::$methodName( $variable, $varData ) === false ) {
|
||||
self::$_level--;
|
||||
return $varData;
|
||||
}
|
||||
|
||||
if ( Kint::enabled() === Kint::MODE_RICH && !self::$_skipAlternatives ) {
|
||||
# if an alternative returns something that can be represented in an alternative way, don't :)
|
||||
self::$_skipAlternatives = true;
|
||||
|
||||
# now check whether the variable can be represented in a different way
|
||||
foreach ( self::$_customDataTypes as $parserClass ) {
|
||||
$className = 'Kint_Parsers_' . $parserClass;
|
||||
|
||||
/** @var $parser kintParser */
|
||||
$parser = new $className;
|
||||
$parser->name = $name; # the parser may overwrite the name value, so set it first
|
||||
|
||||
if ( $parser->_parse( $variable ) !== false ) {
|
||||
$varData->_alternatives[] = $parser;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# if alternatives exist, push extendedValue to their front and display it as one of alternatives
|
||||
if ( !empty( $varData->_alternatives ) && isset( $varData->extendedValue ) ) {
|
||||
$_ = new kintVariableData;
|
||||
|
||||
$_->value = $varData->extendedValue;
|
||||
$_->type = 'contents';
|
||||
$_->size = null;
|
||||
|
||||
array_unshift( $varData->_alternatives, $_ );
|
||||
$varData->extendedValue = null;
|
||||
}
|
||||
|
||||
self::$_skipAlternatives = false;
|
||||
}
|
||||
|
||||
self::$_level = $revert['level'];
|
||||
self::$_objects = $revert['objects'];
|
||||
|
||||
if ( strlen( $varData->name ) > 80 ) {
|
||||
$varData->name =
|
||||
self::_substr( $varData->name, 0, 37 )
|
||||
. '...'
|
||||
. self::_substr( $varData->name, -38, null );
|
||||
}
|
||||
return $varData;
|
||||
}
|
||||
|
||||
private static function _checkDepth()
|
||||
{
|
||||
return Kint::$maxLevels != 0 && self::$_level >= Kint::$maxLevels;
|
||||
}
|
||||
|
||||
private static function _isArrayTabular( array $variable )
|
||||
{
|
||||
if ( Kint::enabled() !== Kint::MODE_RICH ) return false;
|
||||
|
||||
$arrayKeys = array();
|
||||
$keys = null;
|
||||
$closeEnough = false;
|
||||
foreach ( $variable as $row ) {
|
||||
if ( !is_array( $row ) || empty( $row ) ) return false;
|
||||
|
||||
foreach ( $row as $col ) {
|
||||
if ( !empty( $col ) && !is_scalar( $col ) ) return false; // todo add tabular "tolerance"
|
||||
}
|
||||
|
||||
if ( isset( $keys ) && !$closeEnough ) {
|
||||
# let's just see if the first two rows have same keys, that's faster and has the
|
||||
# positive side effect of easily spotting missing keys in later rows
|
||||
if ( $keys !== array_keys( $row ) ) return false;
|
||||
|
||||
$closeEnough = true;
|
||||
} else {
|
||||
$keys = array_keys( $row );
|
||||
}
|
||||
|
||||
$arrayKeys = array_unique( array_merge( $arrayKeys, $keys ) );
|
||||
}
|
||||
|
||||
return $arrayKeys;
|
||||
}
|
||||
|
||||
private static function _decorateCell( kintVariableData $kintVar )
|
||||
{
|
||||
if ( $kintVar->extendedValue !== null || !empty( $kintVar->_alternatives ) ) {
|
||||
return '<td>' . Kint_Decorators_Rich::decorate( $kintVar ) . '</td>';
|
||||
}
|
||||
|
||||
$output = '<td';
|
||||
|
||||
if ( $kintVar->value !== null ) {
|
||||
$output .= ' title="' . $kintVar->type;
|
||||
|
||||
if ( $kintVar->size !== null ) {
|
||||
$output .= " (" . $kintVar->size . ")";
|
||||
}
|
||||
|
||||
$output .= '">' . $kintVar->value;
|
||||
} else {
|
||||
$output .= '>';
|
||||
|
||||
if ( $kintVar->type !== 'NULL' ) {
|
||||
$output .= '<u>' . $kintVar->type;
|
||||
|
||||
if ( $kintVar->size !== null ) {
|
||||
$output .= "(" . $kintVar->size . ")";
|
||||
}
|
||||
|
||||
$output .= '</u>';
|
||||
} else {
|
||||
$output .= '<u>NULL</u>';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $output . '</td>';
|
||||
}
|
||||
|
||||
|
||||
public static function escape( $value, $encoding = null )
|
||||
{
|
||||
if ( empty( $value ) ) return $value;
|
||||
|
||||
if ( Kint::enabled() === Kint::MODE_CLI ) {
|
||||
$value = str_replace( "\x1b", "\\x1b", $value );
|
||||
}
|
||||
|
||||
if ( Kint::enabled() === Kint::MODE_CLI || Kint::enabled() === Kint::MODE_WHITESPACE ) return $value;
|
||||
|
||||
$encoding or $encoding = self::_detectEncoding( $value );
|
||||
$value = htmlspecialchars( $value, ENT_NOQUOTES, $encoding === 'ASCII' ? 'UTF-8' : $encoding );
|
||||
|
||||
|
||||
if ( $encoding === 'UTF-8' ) {
|
||||
// todo we could make the symbols hover-title show the code for the invisible symbol
|
||||
# when possible force invisible characters to have some sort of display (experimental)
|
||||
$value = preg_replace( '/[\x00-\x08\x0B\x0C\x0E-\x1F\x80-\x9F]/u', '?', $value );
|
||||
}
|
||||
|
||||
# this call converts all non-ASCII characters into html chars of format
|
||||
if ( function_exists( 'mb_encode_numericentity' ) ) {
|
||||
$value = mb_encode_numericentity(
|
||||
$value,
|
||||
array( 0x80, 0xffff, 0, 0xffff, ),
|
||||
$encoding
|
||||
);
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
|
||||
private static $_dealingWithGlobals = false;
|
||||
|
||||
private static function _parse_array( &$variable, kintVariableData $variableData )
|
||||
{
|
||||
isset( self::$_marker ) or self::$_marker = "\x00" . uniqid();
|
||||
|
||||
# naturally, $GLOBALS variable is an intertwined recursion nightmare, use black magic
|
||||
$globalsDetector = false;
|
||||
if ( array_key_exists( 'GLOBALS', $variable ) && is_array( $variable['GLOBALS'] ) ) {
|
||||
$globalsDetector = "\x01" . uniqid();
|
||||
|
||||
$variable['GLOBALS'][ $globalsDetector ] = true;
|
||||
if ( isset( $variable[ $globalsDetector ] ) ) {
|
||||
unset( $variable[ $globalsDetector ] );
|
||||
self::$_dealingWithGlobals = true;
|
||||
} else {
|
||||
unset( $variable['GLOBALS'][ $globalsDetector ] );
|
||||
$globalsDetector = false;
|
||||
}
|
||||
}
|
||||
|
||||
$variableData->type = 'array';
|
||||
$variableData->size = count( $variable );
|
||||
|
||||
if ( $variableData->size === 0 ) {
|
||||
return;
|
||||
}
|
||||
if ( isset( $variable[ self::$_marker ] ) ) { # recursion; todo mayhaps show from where
|
||||
if ( self::$_dealingWithGlobals ) {
|
||||
$variableData->value = '*RECURSION*';
|
||||
} else {
|
||||
unset( $variable[ self::$_marker ] );
|
||||
$variableData->value = self::$_marker;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if ( self::_checkDepth() ) {
|
||||
$variableData->extendedValue = "*DEPTH TOO GREAT*";
|
||||
return false;
|
||||
}
|
||||
|
||||
$isSequential = self::_isSequential( $variable );
|
||||
|
||||
if ( $variableData->size > 1 && ( $arrayKeys = self::_isArrayTabular( $variable ) ) !== false ) {
|
||||
$variable[ self::$_marker ] = true; # this must be AFTER _isArrayTabular
|
||||
$firstRow = true;
|
||||
$extendedValue = '<table class="kint-report"><thead>';
|
||||
|
||||
foreach ( $variable as $rowIndex => & $row ) {
|
||||
# display strings in their full length
|
||||
self::$_placeFullStringInValue = true;
|
||||
|
||||
if ( $rowIndex === self::$_marker ) continue;
|
||||
|
||||
if ( isset( $row[ self::$_marker ] ) ) {
|
||||
$variableData->value = "*RECURSION*";
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
$extendedValue .= '<tr>';
|
||||
if ( $isSequential ) {
|
||||
$output = '<td>' . '#' . ( $rowIndex + 1 ) . '</td>';
|
||||
} else {
|
||||
$output = self::_decorateCell( kintParser::factory( $rowIndex ) );
|
||||
}
|
||||
if ( $firstRow ) {
|
||||
$extendedValue .= '<th> </th>';
|
||||
}
|
||||
|
||||
# we iterate the known full set of keys from all rows in case some appeared at later rows,
|
||||
# as we only check the first two to assume
|
||||
foreach ( $arrayKeys as $key ) {
|
||||
if ( $firstRow ) {
|
||||
$extendedValue .= '<th>' . self::escape( $key ) . '</th>';
|
||||
}
|
||||
|
||||
if ( !array_key_exists( $key, $row ) ) {
|
||||
$output .= '<td class="kint-empty"></td>';
|
||||
continue;
|
||||
}
|
||||
|
||||
$var = kintParser::factory( $row[ $key ] );
|
||||
|
||||
if ( $var->value === self::$_marker ) {
|
||||
$variableData->value = '*RECURSION*';
|
||||
return false;
|
||||
} elseif ( $var->value === '*RECURSION*' ) {
|
||||
$output .= '<td class="kint-empty"><u>*RECURSION*</u></td>';
|
||||
} else {
|
||||
$output .= self::_decorateCell( $var );
|
||||
}
|
||||
unset( $var );
|
||||
}
|
||||
|
||||
if ( $firstRow ) {
|
||||
$extendedValue .= '</tr></thead><tr>';
|
||||
$firstRow = false;
|
||||
}
|
||||
|
||||
$extendedValue .= $output . '</tr>';
|
||||
}
|
||||
self::$_placeFullStringInValue = false;
|
||||
|
||||
$variableData->extendedValue = $extendedValue . '</table>';
|
||||
|
||||
} else {
|
||||
$variable[ self::$_marker ] = true;
|
||||
$extendedValue = array();
|
||||
|
||||
foreach ( $variable as $key => & $val ) {
|
||||
if ( $key === self::$_marker ) continue;
|
||||
|
||||
$output = kintParser::factory( $val );
|
||||
if ( $output->value === self::$_marker ) {
|
||||
$variableData->value = "*RECURSION*"; // recursion occurred on a higher level, thus $this is recursion
|
||||
return false;
|
||||
}
|
||||
if ( !$isSequential ) {
|
||||
$output->operator = '=>';
|
||||
}
|
||||
$output->name = $isSequential ? null : "'" . $key . "'";
|
||||
$extendedValue[] = $output;
|
||||
}
|
||||
$variableData->extendedValue = $extendedValue;
|
||||
}
|
||||
|
||||
if ( $globalsDetector ) {
|
||||
self::$_dealingWithGlobals = false;
|
||||
}
|
||||
|
||||
unset( $variable[ self::$_marker ] );
|
||||
}
|
||||
|
||||
|
||||
private static function _parse_object( &$variable, kintVariableData $variableData )
|
||||
{
|
||||
if ( function_exists( 'spl_object_hash' ) ) {
|
||||
$hash = spl_object_hash( $variable );
|
||||
} else {
|
||||
ob_start();
|
||||
var_dump( $variable );
|
||||
preg_match( '[#(\d+)]', ob_get_clean(), $match );
|
||||
$hash = $match[1];
|
||||
}
|
||||
|
||||
$castedArray = (array) $variable;
|
||||
$variableData->type = get_class( $variable );
|
||||
$variableData->size = count( $castedArray );
|
||||
|
||||
if ( isset( self::$_objects[ $hash ] ) ) {
|
||||
$variableData->value = '*RECURSION*';
|
||||
return false;
|
||||
}
|
||||
if ( self::_checkDepth() ) {
|
||||
$variableData->extendedValue = "*DEPTH TOO GREAT*";
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
# ArrayObject (and maybe ArrayIterator, did not try yet) unsurprisingly consist of mainly dark magic.
|
||||
# What bothers me most, var_dump sees no problem with it, and ArrayObject also uses a custom,
|
||||
# undocumented serialize function, so you can see the properties in internal functions, but
|
||||
# can never iterate some of them if the flags are not STD_PROP_LIST. Fun stuff.
|
||||
if ( $variableData->type === 'ArrayObject' || is_subclass_of( $variable, 'ArrayObject' ) ) {
|
||||
$arrayObjectFlags = $variable->getFlags();
|
||||
$variable->setFlags( ArrayObject::STD_PROP_LIST );
|
||||
}
|
||||
|
||||
self::$_objects[ $hash ] = true; // todo store reflectorObject here for alternatives cache
|
||||
$reflector = new ReflectionObject( $variable );
|
||||
|
||||
# add link to definition of userland objects
|
||||
if ( Kint::enabled() === Kint::MODE_RICH && Kint::$fileLinkFormat && $reflector->isUserDefined() ) {
|
||||
$url = Kint::getIdeLink( $reflector->getFileName(), $reflector->getStartLine() );
|
||||
|
||||
$class = ( strpos( $url, 'http://' ) === 0 ) ? 'class="kint-ide-link" ' : '';
|
||||
$variableData->type = "<a {$class}href=\"{$url}\">{$variableData->type}</a>";
|
||||
}
|
||||
$variableData->size = 0;
|
||||
|
||||
$extendedValue = array();
|
||||
$encountered = array();
|
||||
|
||||
# copy the object as an array as it provides more info than Reflection (depends)
|
||||
foreach ( $castedArray as $key => $value ) {
|
||||
/* casting object to array:
|
||||
* integer properties are inaccessible;
|
||||
* private variables have the class name prepended to the variable name;
|
||||
* protected variables have a '*' prepended to the variable name.
|
||||
* These prepended values have null bytes on either side.
|
||||
* http://www.php.net/manual/en/language.types.array.php#language.types.array.casting
|
||||
*/
|
||||
if ( $key{0} === "\x00" ) {
|
||||
|
||||
$access = $key{1} === "*" ? "protected" : "private";
|
||||
|
||||
// Remove the access level from the variable name
|
||||
$key = substr( $key, strrpos( $key, "\x00" ) + 1 );
|
||||
} else {
|
||||
$access = "public";
|
||||
}
|
||||
|
||||
$encountered[ $key ] = true;
|
||||
|
||||
$output = kintParser::factory( $value, self::escape( $key ) );
|
||||
$output->access = $access;
|
||||
$output->operator = '->';
|
||||
$extendedValue[] = $output;
|
||||
$variableData->size++;
|
||||
}
|
||||
|
||||
foreach ( $reflector->getProperties() as $property ) {
|
||||
$name = $property->name;
|
||||
if ( $property->isStatic() || isset( $encountered[ $name ] ) ) continue;
|
||||
|
||||
if ( $property->isProtected() ) {
|
||||
$property->setAccessible( true );
|
||||
$access = "protected";
|
||||
} elseif ( $property->isPrivate() ) {
|
||||
$property->setAccessible( true );
|
||||
$access = "private";
|
||||
} else {
|
||||
$access = "public";
|
||||
}
|
||||
|
||||
$value = $property->getValue( $variable );
|
||||
|
||||
$output = kintParser::factory( $value, self::escape( $name ) );
|
||||
$output->access = $access;
|
||||
$output->operator = '->';
|
||||
$extendedValue[] = $output;
|
||||
$variableData->size++;
|
||||
}
|
||||
|
||||
if ( isset( $arrayObjectFlags ) ) {
|
||||
$variable->setFlags( $arrayObjectFlags );
|
||||
}
|
||||
|
||||
if ( $variableData->size ) {
|
||||
$variableData->extendedValue = $extendedValue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static function _parse_boolean( &$variable, kintVariableData $variableData )
|
||||
{
|
||||
$variableData->type = 'bool';
|
||||
$variableData->value = $variable ? 'TRUE' : 'FALSE';
|
||||
}
|
||||
|
||||
private static function _parse_double( &$variable, kintVariableData $variableData )
|
||||
{
|
||||
$variableData->type = 'float';
|
||||
$variableData->value = $variable;
|
||||
}
|
||||
|
||||
private static function _parse_integer( &$variable, kintVariableData $variableData )
|
||||
{
|
||||
$variableData->type = 'integer';
|
||||
$variableData->value = $variable;
|
||||
}
|
||||
|
||||
private static function _parse_null( &$variable, kintVariableData $variableData )
|
||||
{
|
||||
$variableData->type = 'NULL';
|
||||
}
|
||||
|
||||
private static function _parse_resource( &$variable, kintVariableData $variableData )
|
||||
{
|
||||
$resourceType = get_resource_type( $variable );
|
||||
$variableData->type = "resource ({$resourceType})";
|
||||
|
||||
if ( $resourceType === 'stream' && $meta = stream_get_meta_data( $variable ) ) {
|
||||
|
||||
if ( isset( $meta['uri'] ) ) {
|
||||
$file = $meta['uri'];
|
||||
|
||||
if ( function_exists( 'stream_is_local' ) ) {
|
||||
// Only exists on PHP >= 5.2.4
|
||||
if ( stream_is_local( $file ) ) {
|
||||
$file = Kint::shortenPath( $file );
|
||||
}
|
||||
}
|
||||
|
||||
$variableData->value = $file;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static function _parse_string( &$variable, kintVariableData $variableData )
|
||||
{
|
||||
$variableData->type = 'string';
|
||||
|
||||
$encoding = self::_detectEncoding( $variable );
|
||||
if ( $encoding !== 'ASCII' ) {
|
||||
$variableData->type .= ' ' . $encoding;
|
||||
}
|
||||
|
||||
|
||||
$variableData->size = self::_strlen( $variable, $encoding );
|
||||
if ( Kint::enabled() !== Kint::MODE_RICH ) {
|
||||
$variableData->value = '"' . self::escape( $variable, $encoding ) . '"';
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if ( !self::$_placeFullStringInValue ) {
|
||||
|
||||
$strippedString = preg_replace( '[\s+]', ' ', $variable );
|
||||
if ( Kint::$maxStrLength && $variableData->size > Kint::$maxStrLength ) {
|
||||
|
||||
// encode and truncate
|
||||
$variableData->value = '"'
|
||||
. self::escape( self::_substr( $strippedString, 0, Kint::$maxStrLength, $encoding ), $encoding )
|
||||
. '…"';
|
||||
$variableData->extendedValue = self::escape( $variable, $encoding );
|
||||
|
||||
return;
|
||||
} elseif ( $variable !== $strippedString ) { // omit no data from display
|
||||
|
||||
$variableData->value = '"' . self::escape( $variable, $encoding ) . '"';
|
||||
$variableData->extendedValue = self::escape( $variable, $encoding );
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
$variableData->value = '"' . self::escape( $variable, $encoding ) . '"';
|
||||
}
|
||||
|
||||
private static function _parse_unknown( &$variable, kintVariableData $variableData )
|
||||
{
|
||||
$type = gettype( $variable );
|
||||
$variableData->type = "UNKNOWN" . ( !empty( $type ) ? " ({$type})" : '' );
|
||||
$variableData->value = var_export( $variable, true );
|
||||
}
|
||||
|
||||
}
|
@ -1,87 +0,0 @@
|
||||
<?php
|
||||
|
||||
class kintVariableData
|
||||
{
|
||||
/** @var string */
|
||||
public $type;
|
||||
/** @var string */
|
||||
public $access;
|
||||
/** @var string */
|
||||
public $name;
|
||||
/** @var string */
|
||||
public $operator;
|
||||
/** @var int */
|
||||
public $size;
|
||||
/**
|
||||
* @var kintVariableData[] array of kintVariableData objects or strings; displayed collapsed, each element from
|
||||
* the array is a separate possible representation of the dumped var
|
||||
*/
|
||||
public $extendedValue;
|
||||
/** @var string inline value */
|
||||
public $value;
|
||||
|
||||
/** @var kintVariableData[] array of alternative representations for same variable, don't use in custom parsers */
|
||||
public $_alternatives;
|
||||
|
||||
/* *******************************************
|
||||
* HELPERS
|
||||
*/
|
||||
|
||||
protected static function _detectEncoding( $value )
|
||||
{
|
||||
$ret = null;
|
||||
if ( function_exists( 'mb_detect_encoding' ) ) {
|
||||
$mbDetected = mb_detect_encoding( $value );
|
||||
if ( $mbDetected === 'ASCII' ) return 'ASCII';
|
||||
}
|
||||
|
||||
|
||||
if ( !function_exists( 'iconv' ) ) {
|
||||
return !empty( $mbDetected ) ? $mbDetected : 'UTF-8';
|
||||
}
|
||||
|
||||
$md5 = md5( $value );
|
||||
foreach ( Kint::$charEncodings as $encoding ) {
|
||||
# fuck knows why, //IGNORE and //TRANSLIT still throw notice
|
||||
if ( md5( @iconv( $encoding, $encoding, $value ) ) === $md5 ) {
|
||||
return $encoding;
|
||||
}
|
||||
}
|
||||
|
||||
return 'ASCII';
|
||||
}
|
||||
|
||||
/**
|
||||
* returns whether the array:
|
||||
* 1) is numeric and
|
||||
* 2) in sequence starting from zero
|
||||
*
|
||||
* @param array $array
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected static function _isSequential( array $array )
|
||||
{
|
||||
return array_keys( $array ) === range( 0, count( $array ) - 1 );
|
||||
}
|
||||
|
||||
protected static function _strlen( $string, $encoding = null )
|
||||
{
|
||||
if ( function_exists( 'mb_strlen' ) ) {
|
||||
$encoding or $encoding = self::_detectEncoding( $string );
|
||||
return mb_strlen( $string, $encoding );
|
||||
} else {
|
||||
return strlen( $string );
|
||||
}
|
||||
}
|
||||
|
||||
protected static function _substr( $string, $start, $end, $encoding = null )
|
||||
{
|
||||
if ( function_exists( 'mb_substr' ) ) {
|
||||
$encoding or $encoding = self::_detectEncoding( $string );
|
||||
return mb_substr( $string, $start, $end, $encoding );
|
||||
} else {
|
||||
return substr( $string, $start, $end );
|
||||
}
|
||||
}
|
||||
}
|
172
system/ThirdParty/Kint/kint.php
vendored
Normal file
172
system/ThirdParty/Kint/kint.php
vendored
Normal file
@ -0,0 +1,172 @@
|
||||
<?php
|
||||
/**
|
||||
* The MIT License (MIT).
|
||||
*
|
||||
* Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Å leinius (raveren@gmail.com)
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
* the Software without restriction, including without limitation the rights to
|
||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
if (defined('KINT_DIR')) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (version_compare(PHP_VERSION, '5.1.2') < 0) {
|
||||
throw new Exception('Kint 2.0 requires PHP 5.1.2 or higher');
|
||||
}
|
||||
|
||||
define('KINT_DIR', dirname(__FILE__));
|
||||
define('KINT_WIN', DIRECTORY_SEPARATOR !== '/');
|
||||
define('KINT_PHP52', (version_compare(PHP_VERSION, '5.2') >= 0));
|
||||
define('KINT_PHP522', (version_compare(PHP_VERSION, '5.2.2') >= 0));
|
||||
define('KINT_PHP523', (version_compare(PHP_VERSION, '5.2.3') >= 0));
|
||||
define('KINT_PHP524', (version_compare(PHP_VERSION, '5.2.4') >= 0));
|
||||
define('KINT_PHP525', (version_compare(PHP_VERSION, '5.2.5') >= 0));
|
||||
define('KINT_PHP53', (version_compare(PHP_VERSION, '5.3') >= 0));
|
||||
define('KINT_PHP56', (version_compare(PHP_VERSION, '5.6') >= 0));
|
||||
define('KINT_PHP70', (version_compare(PHP_VERSION, '7.0') >= 0));
|
||||
define('KINT_PHP72', (version_compare(PHP_VERSION, '7.2') >= 0));
|
||||
eval(gzuncompress('xœí½]w¹±(ú¾E[ѸÉ1ESŸ–)KŽ,kÆÚ‘-IN&GR¸šdSbL²™nÒ²ãÑYw<EFBFBD>çûpö]ëþ¾óK.ª
|
||||
…<EFBFBD>&)Û3™d\'Ûl P' . "\0" . '
|
||||
…B¡P(tIQDè<EFBFBD>&Ñçh<mú<EFBFBD>¨˜$ñÏr:JÚƒ´ÛfÝ4Ú<EFBFBD>&ù4Ýqa ¯ÕM{Ét00E:è5›¯O^¶N<EFBFBD>^Íou}»ÈÁñ‘W"O\'Ó|ä%÷úƒ´5è<35>Þ·zY>L î8ö ºýb<H>µ:É' . "\0" . ':Ò˳aYG’ñ¸•gÙ¤Õíç…' . "\0" . 'Jò<ùT©ú=H>ŠŒ\'7fËËM?Ž“Q7íŠÌ^2(üjDŸEñIÚ™ô³Qi[ý¤HM+ä?1S\\‹âît8Ž«57y’\'<27>ÒýVç©hUž²ž¹CíîEˆ©u*a[§ýÎ<C3BD>ÀË' . "\0" . 'ßï½ @¾$ý‘
z~øÓy' . "\0" . 'ò<ý8±Å àý;ÒÉFÅ$bÍŒâ<¶’©&Ñ};ñFqÇN•=ˆâ±Ï-ãÁôº?b$¢6½MòB´è…’
³•:H:ïýbâfÀÄz<C384>Nn²nÌ;ÃZyY1ÍS/9d¹›ø2™¤çý¡üCñ6™Ü¸©G“4O&>–ÿ,²‘›öºßɳI' . "\0" . 'õY8¤?½>>¤Ãtäuûl<øALÍ£Q/d<>´ÿ*8ÿL4"¹öQOò4º©ç ƒ¼Ä›<»
fˆ&‹áÓÃÍÈúþèÚKÇ9ã$þ4ó<EFBFBD>óþAc‡CZã,”‹ˆÞtD³»H\'QeQAÀhY}‹¢£é`PW!~Ÿ~â|\'' . "\0" . '´Ë’K<EFBFBD>`I”¾<EFBFBD>ƒd.½ñ[Š&øíJOHÓ‚
?˜œv¿AnCš–)ôb~ÉYD\\ΦN)Q]štn¢
|
||||
õ8)°ë@ €¼€<EFBFBD>+½&,ÃçNtõ{¢€¦Þƒ]C¿åþH¡o‰<EFBFBD>ti‰b¾†¨ºE!Y3Hžå <EFBFBD>…©Tà„T¨û.¢®!H(l¾•eü‡
06]&îÚÉ8zsÞzûêíæÚ&vEí¦íéu«-ä
|
||||
á„%¢
|
||||
5§bA™X¥öJ0ÙlꬲåM<EFBFBD>fsœ0èÿ=Ý\'æ«HzH^„Á3h8,¥VÊêöòd˜ê¾úõaþQq,dgÚ¸Zt¥’0%ÕÞ9yÀ;„iÇœM^<EFBFBD>1œÞM&‰3˜dùôªr7°U[q£ùXË áh:l%9
|
||||
¨¬¥¾!Ö‘Êò8' . "\0" . '¶¨û½¾àiñ\'wª~ä<>Ûõ©º¢ëtr€p ~+‚?zý‘ müòðÅ»[/öþp~ºpØ:úñÍÉéakÿôdz¸=÷i|5jú|WcÝÝ' . "\0" . '2¨„' . "\0" . '™ÙL6GÅ”©\\Ú:1MZgûo<EFBFBD>ˆÀ8zøP<EFBFBD>;:Õ—Ô2<EFBFBD>fÔ&D¼TþWÌÇ¡:§ÖG”Ôz@¢Iˆ”VúQŒn"Œæz-Q‰ïÕ§i²¸p•²+. æ´ê¿Úñú½â÷ûöF,Q%k·›µé‡tPÁ‘"°
|
||||
¦ÉHÉ Ûƒr*}™4a·è£Ò¢\\—º¶[ø÷¥…ål5µrš<EFBFBD>Ò[ó]Qk²âð×õÎWJVs7ÖµR:›Ê1MeJWÓšs–˜5Å%õ)²”LÁWÌ@>H *†?ÅjÒÇUq¹ì–¤Q Ãé·^Çè3¹“dÔI³žµŽ¼ÕÀ
|
||||
ÉcúPü‰#T´
|
||||
ÔÆ*º1›!uÚî€nÜÊz*ËQͨ’¸ªÅq¿ý¶ÛŽúÙ…ü¸¢¹4VãJ©Ðñe°Ùȼ\'3
|
||||
×3òjþYÙcË©á…êV!•£1êG:Oi„«••mgt¨¸“ ¥ÃñD¨=Ä<1Ò1¾ñË—Û^_·Ã£.ë_ÙKº]ê€15ÛÔHÖ¿h\\]Ä#±' . "\0" . 'CÕ?ÿùÉHðÕ‡œ†"u“hÍ…Ï2EI®Êsõ¤8¥8”ê0XÑãðçзTfBJŒ¯¼,‹Ašà—HÎS$±ÒZèLjòàE¬Ô—øªWV«1-žr€œä€šUxòi£fZ¨@¬ûåꦌéS[ô[`@‚ÑÞ¯Ùl’ÑûŠ<C3BB>†Œ;B±Ô"$OS¿Õ.¦LÝš3ô«bê\\Ù?G°-M*zêPhÈÄÒeñÊL¼j࿲šëbÕÖ¼ã¡~‹¥ÒïPˆjþ–0·[nûßd“<1B><>T«ÚA¶•!BóVóžìBSÜâ*‰{J̯×ëUó…?—DÚühë_âÇþÀ¿u)¤Ð¤Á #º<û€#§•8XîÛbBÈ~!
|
||||
Ò¼ß)Q˺X:Zy*ÆVŒâR¼Í‹Ò$ŸdƒìVŽ—‹tTM¢)ˆHyÉä@+Ί÷}TZÍð;4«‹œAI§“Š…’\\<Fìð@²8ÏJ‘˜ðÎ㲸×yR=†™ÎÐ<EFBFBD>_ð¨ÞÎä³Èås5†µà¦¹Ë«m•!\\Ï8+&fmc»ÒÆŒz¦5Ò]0Ûƒ<EFBFBD>i^™vn2ÇweeVš›,Ÿ¤#°˜UЬŒ‡Ú²ð!LSiÆi‰œ‰è<E280B0>¤<>Ð<EFBFBD>+ñcb>Í’ñå%ÌH&t¤ŽåƒÔ!¼Ùè:-&a2éÀðˆÆ-«ß¢˜¯‘Ù¦i\\¡q`÷¤¥XÍ1ÍJ8ŸÁì)ˆ#õ[É_Ù!Âmwª&L… oJD¬E<C2AC>šhÀt4Ñ
™GÍË<ÏŠö¢à¸dâ%ňf×Àd<EFBFBD>¥2שTê ‰2¤ÛÍwð¨¦<EFBFBD>0ïá(åkéŒÏË£S—ÔFÜbŸŒ¸3ÖµÐ(¤‡©/4ŸixÙ§Š@ó<Š…lMQ´¡Z·ú"P_-{‰' . "\0" . '¬—§tò‰Õñ¨›÷A (º÷GÜ Â)$×µïz@§ïæÄ*«õ.×ÊIöÛ¤Ë[Âl\'z<>•d3´éËÌf°o;_ÄdöKè›ÁÊ¥qbaÄ’ðB¡j%SXf“.š›SÚ•8Jì<4A>ÚáVƒehG‚Û›<C39B>N6P–Æ:4"µT3ˆÜ@äb:²«»‹ò†6õÚäWóIéØ‚«Pu–ßÀsr<EFBFBD>öê#œW\\@HY8Ã5•£CÕZG½ÑS"ŧ•l%‘‰5S%Èv‚0°bN%]0¹%ªlîÑ°5TKM‘ª-w|)R¨ÕŽSL;à]·Þ¸pYÊ å<wÖBhOé…Ú{œeÓ¼“§£™ô
S¾¨D()@S‡%Sh<…G<EFBFBD><EFBFBD>5Ö<`emQú¢–¤f;Â/:â(ZÓÑX¨®ÆÐe튷' . "\0" . 'ÊÆpAF©DÄŽ[¯IÏTœ-d«Ðɤò©ôÛ®1×
mûéã·\\„ý:ªÑ
|
||||
mØECô_E[WUþ=‚ªŸqAº=z´üWÍ
|
||||
6 Úä
ÂÃa‹÷ãz1m‹¶{
_¯Šv_e÷¯õw+¨i/€€4ò' . "\0" . '¦Š$<EFBFBD>´\\»r<—F 7»uñNdW:£ Õ*V<EFBFBD>ï¸ñ“O‡ví܇@}M,éØ3Îqd mîzO2IªYF”l<EFBFBD>ZŸ½Šbyš/B"[çbî4
|
||||
¶T&ëÕRÉ>û2ÉÆO•_J©jÓɆbr¥ù<EFBFBD>éäð£Xã‹Š<YŒA‹±·)fð•™Öe5µ×™0–À8@½lÐÅ•N)Šõøñ±³ÊrÚ>Ð|Å<EFBFBD>L¾
œr}y`*
|
||||
ŸP#QX5ö±Î®ÿܨA(åù…A Œ¶f%1YÒxØyŸ\\£ kuÓè†ak
|
||||
ʹešThh烊<EFBFBD>ô&Saj )‚ɪ<EFBFBD>’•J€¡N™^‹Ê
|
||||
ËeZ<EFBFBD>‡Ø¡Át¯È”j€~͉Ò>5Ë' . "\0" . 'IrÊ´ù´-C£)Íè¨@f²j1J–•&RjA£„ÙÒòéh&Çüéø²_' . "\0" . '…_¥ƒqš+M ¨ØÍ\']ÚŸÄf#¨L7Täü0' . "\0" . 'íÊ
â]Q5m®£}í¤-…öèÅ$Ú?88<;k½9ys¨ÕW+çí»ÇGè·„Ý‹ÝüÓ“óÃó×’gpšv}¨£?îŸnƒ4ÄÉÛÃÓýó“ÓPtÞþééþŸ¡ôîž_ðäÅŠ@îJ ÷ì|ÿœ:ÐlÏ«e2«/°$›/9‚®\'Ý2aö’É¥GŽ‘ÔÀd·#±ÕÁqp¢‹AŽÉYJã³dàò´—æét§A…ØjJªDubÙà(`9“5Av 8-£Þâẜ×<ßj!òig‚Ü}çA$Ýî©U}…[ší,l)ˆÂŒ{01é1¹é`M´ºs¥Vö` ½…ud+‹Ênr}ÀÊÀè2ØvFýƒö¥ •qŒE¶î,Aê“h‘1IèjqC/¾\\;S "ÄB*¦$•:£vOÊÖo0€ß––ÃìƒÛ(S<10>¯Ðç=Ó>ÛjÄzÂ=’›u¹µ.i:q`ˆŽb½,C9Ÿ»=Æž î–×' . "\0" . 'ZŒf"u\\0ò¦Ùl^)£Ê¹<C38A>Ç<EFBFBD>–<EFBFBD>˜–xtòŠ:Ö>¡b"{E>
|
||||
£t”Q¼.–Z<bG:Ðz`Rš†$SiþX»àöU‘n€% š‡·ý YæˆO1
êpœi-/rEmj([WÀr‘æàl©öàªÏ ÕÚ_Ò‡7 ùã¥Îd%Nä2W1¾ŠXÄ,»ÞˆZ' . "\0" . '«…´ãݱ' . "\0" . '
|
||||
Ò8Ž•{ã <EFBFBD>‚ã@ÍBIÍ’Ÿ‰E9@"X«KJüÖž38$2DÉð5.Ný`Š<>¯Z;ËÀ1*æu¢0T:Þñ„ïtD „An®×à*V}7³›MÁ+º´2µ‹-<2D>' . "\0" . 'xæÓÇÒ‘Julv2(˜š{©˜L:µÀ¨¢«K¦VK¥BŠsŠJH~îˆø<`§Íú14ÎÌ]€ëçË¢…tJœÞšæñYE9RÕ³˜‰rœ6¨Éá\\<10>_©Â–(T¹J!æòTåkØ’›r”&*³ðSå1=Ù@Xʳ„3Z²3c×<>õ*$“ŒÖîØ|2åí%ëÑnézH,¥X*p²fÕ8;Y‰38»_œ¥›ŠÊúÉ@¹óã?®µ\\=‹ŠÊƒ9)8K4Áœ†Ê,0—Î:•òæÅ\'¹(Y,™XÇñÑr›ß#€bÞg¹ÖJ&È\\ó2å¦q/Z¯ù›+Hß@“¨¢$¶áb9QL|%úªÛ:qnßq1›ßs0ÄÁ&m’wÀc;¡‰ ÞZßTöFcÑVG¹\\Ð…`PT’)m™ü¼<C3BC><<3C>)˜»sÒtèî1µŸž¹S"Òò÷iÎè0¨u“7©½¯Sè˜ÑB Ûoê\\ß¹“DÃùéÑ<C3A9>?ê½}ÃMqø#^ŠZu3ÎÞá@‹¬57ëôðàÝéÙÑ ”Ûp3_¾=Õ:>z}<06>m7ûàäõÛãC4D¬nÌÞ¶ún¾`BŠ¼<C5A0>
|
||||
S¤OGý¿õ»•%0²^6–´•K G6<x' . "\0" . 'µc0˜Šøxù‹¹Ç<»òÜáÈL-ERì2§$±ÂBbJ)¯‰JØ<EFBFBD>ǃOÚAÑ.gj®Yƒdm4p%Óʪ¬Uë©tä7<EFBFBD>•¿O[TYSUêžZWiÊo©M¨O¥y¨oô/âÿ1‘/—[ƒ<ï""úe„”Çã»p©S™ë—#ãp©3é~lÊÈ‹' . "\0" . 'Aèw£÷#±úqð;æJ`3†ê{9<39>öèºõ9[Ðø@ªl1<6C>.r<>o\'å*|.ú<>þ¤5HÚé@Ù FÜb³-ø"Œ\'…' . "\0" . '÷ÂÚ)í½$lyçiT ÙL/̓¬<C692>.Ž²ÄÊžPÄî˺€Í&Ýÿ8” 4ËXY© ùåÔŽ‘úîV%IÿkŒ–ªúK†ŒÊÎ7‚+<¤Þ”<C39E> åÏ@;„Õä—<10>
3ˆ„KŽ“Aee…—7ØPu»<EFBFBD>\'§<EFBFBD>iŽ\'¡3 „]úèŒQå}<EFBFBD>/ö²ñ•m/^ÚÔ˜î:J³:<EFBFBD><EFBFBD>|¦Ô÷½]où2cdQ
|
||||
óZƒþ°?ùZ±=D-ÛKMžP<EFBFBD>?y^+4ôw‘>žô‡·nÔ|¹›£@Íon>TW7‘P˜¸»kkždç¦?èú#‹[PÌ3û<¼}ªµjÀÛ=B/ ¢÷p–»¬u¡@ÙÆɶ<>,6Wðäƒ]ׯoÔà}ZÁ$J¨Â…¨I52äQnVk_aÇQ"P¹t‘胋„åvÂ,/Š‹‘l¥Ç`U<>I5M¡s”ºUIWs‘ÁУÑrI5fÕP¾5•“ËÈŠäÑ®%Ë/XeÒIZ©I”U:f§ë÷›_FVK#v@$æ<>myÿ‚Ú<ŒeKƒœ%¥«‚5^ë`›RåÕÁ7z²-Ž<Ⱦ‘7eíL#)d³¶`ð$Çy
|
||||
¼C÷s HˆÓkrÓÄ<EFBFBD>W¹ì>ª‚û©¼©(ï%Ö¤Ë0ÌsY\'%\\¬â^”ÎØ`öVä]®ÚÔªù
|
||||
Ë‘¼G•œ
)P¨5â[«\'
|
||||
J5èùN\'»Ë&4Ð^9¥Ñ…o/‹<<EFBFBD>×Ü{ɤ’‹¬™É¸>Ô¤Ÿüòe-Ð<EFBFBD>…×µp‡ì…Í:A
|
||||
R5Ôm)nr~1U)âl9ûnõÉ5Èk-Ír<ù’q”B¥°¢ÍæÙùK0×¼M>;¯JM¥7y™º&xJßb„َʘA$°ÐTŠwEš¿”—Äm~?µ²"ÐJ‘CçœQaj‚_¤YÇ"«R½‡^õ6‡rÒOulAõBN£apå\'xHXD+Ð
|
||||
€êt@p즞¸‡@G$*dÚƒ]„P>1þ…' . "\0" . 'T
–ÐB«ìº¤¦)œL•ë8u¢r΋c¾l*¶0`kò.KZ•%¿<>}U£¬ÊYªS”Deé(ðV™kRœ§ž¬:¨õ\'…Äi“¥%Z•ð*¡³-w¤ŽP®ziv±Ž,‡À\'kÒm”¬!3ÐÚ<1A>ZÜ„çC‡4;¨ßZ`ÿr‘¬ü}å¶.?>é\\~ìõ®dJcå)Kü~ï€,ÒÈ:9
Õ9ðÍ’Š|¶I3b<0C>Ö,ïþ54K¶ø—¬)Df{
)…ÅkªáV{¬àbÒÊ
Ñ' . "\0" . 'Jh¸ˆækÁÙœ‚k³§ßs]k²Ú`8Ë@G ó•><3E>¬J' . "\0" . 'ú _-iÕÏJÓ*`9Qü|í]A–wZY01ZÇSž£N-j&ô=Îd$?¬C´<Ö—nÐå÷õðE)*¥d ´Ïõ5E¸SEdJ¸' . "\0" . ' ®’ñ°§öµ,¬´eVç×läL•Ñ!D]<5D>ä¸\'rÎÁËžñAÒt;†)…±NcN~ÖáPñÿDGy<47>$Ëx`+Ió‡Š<¿!6†‰¢ÁuË|ÙÐuI±˜OGÇUÉåq‹A<þØÕj!ž¡œ Þ–tAöÓÌ‘[è¨ÍÛ•iJÊ©uu¡Z b’˜h!sKØCŽÖ1É?´l‘ÓU÷puðúlåðcGh±è˜
|
||||
i¥yžå•(Þ 5R<EFBFBD>Tâ:ÛšZ<EFBFBD>nE&<EFBFBD>€V‘ê]BE' . "\0" . 'D¢îtmDÅJ?Ší(\\ᦤò8UŠƒ%«BÙÑz¼T<EFBFBD>¡}ÑP¨ÉuÚ4Ø_S
|
||||
p÷aëÝ™`þ?퟾9zócTu”46®œÝ¬Ñæ\\²ã <09>»{*cû›d@¨RÚˆÒõÌ<C2B5>!<02>‹ÝëûJ¡ÐŽŸÂ]ˆäšuvÈöˆHRã‘Gø,…¼út=Ž"¿;käµê¼ö†Z<10>ôY€íLàÜ·$u:6oÁÕS«ïé¿óN?¾ \'Ê5#Ühf' . "\0" . 'N*<2A>üZ¨GR\'–<>7’J$ˆLÇÍðúuçÍ<C3A7>€<EFBFBD>ÙØâø)“q¢‘*~/`ù,»ÆÒOñ"<EFBFBD>rîþÒòÁ<EFBFBD>rVít3ëþ<~£RQŽ<07>&‹a‘ß¡I°½ê§y’wn>¡÷Š=pm›}i|¸Z˜ˆ3çmÜW”#ª¼eˆ—ívL)ßãx8Šäl_9ä¿-ódb´k7Ág$܉ªÕ^!¥O¹m‘w#˜ràÞ=yŠ±¤üB™Z‰ÍÅ&ŸÔηo"ÙaBm5<·šó€L
|
||||
¢0¡Á˜×ke¡V\\XˉߌF6°Þö¯G‚^F}=oŸœ¶Î÷u¦
O^¿>|sΓ^ž„’<EFBFBD>Þ½9l½:}Ì“OÞ¾q‘ª´ÖŸŽ„úzxðê„çþéÕÑùáÙÛýƒC“Zõ#ö2;›îÂþ›—ÃÿñnßjÁ‹““ãÃý7<C3BD>J>9å©x:×:Ø?;wa½DA¯7‡6ÞìŸû
xyx`}ý1' . "\0" . 's"ÈC¯Ž£7Îçñ»—‡<E28094>¤–¨ÛI?;ßi\'?Ø©ç~g~sDÚ<44>§‡b¡=ô f½ãtॿ9 P@¦—•9{½|\\RÕñÉ<EFBFBD>PÂ=•l<E280A2>žJýÉN~}ôæ] “¯OÜòúݱŸøæðOÿ¢×#d¨ùo<C3B9>C5ŸŠ”£ÓÃ@’7ŽgÇö—<C3B6>ììÔþ
|
||||
@ˆý⛽ö¾{svè÷â\'¿ñƒ˜}|Ç?ò<>ïùÇ#þ±Â?êüã1ÿhò<68>güc—ìñ<C3AC>çüã/üãgþñ¿ØG@š€<C5A1>qlDI\\áe«üã‚\\ñ<>Ïüã.æD•£Î' . "\0" . 'B3ÿ䘶ú¦‰¥<E280B0>uìËʘ„Ar ÞˆÌæîÃÓÒÎ]”uA°Æ»Óã?£´¶||¼JBœ ^@,á3«ñú<C3B1>Ø?šš«¥Ä»‹ƒåu(' . "\0" . '†‚ÎbXâ‹<EFBFBD>d1¬{ž„wìeäß1“…´9|»<EFBFBD>£pÙ±ií¸² ZfDÙ·\'2E‚Ù4qÊð>i„ñâZwöêè-/¸<ÉÞ§hBÀmp0P£<EFBFBD>ÇWÓ¼ÀõΩô¡¼
|
||||
<EFBFBD>¢õ¢e¡]|hit<@‚ù[›9ÔUpÍDdþ–G.:ÄF´Ò@~GC1çX¡©T(í¨š‹- ƒgÕŠ¨£ÒíØy¥]«õØ¿„‰Ì䧺Ké¾O‘ø‘¨#x´äñ‚‹ÖÖ¢¥ËÑ’Òú%ôž u¥/½
TŽ?é_SãêÊ«\\!4|<›a%¬AõÈØFd=¸ÉWKì9%U·ªKŒÞ2ƒPE<EFBFBD>ÝœCÂPZeÖ$åkÑj•*¢\'ˆÌlÓíË«V/ñ„lÔ
|
||||
R@ôLlØ"5 }«©5±ÉàìT‹ÁnÝÚ$yU¡žÙÈ>²ÆÕ¼Aq õèh+<2B>ÝArÜ!*á ¹rǺ¡¾œõz^¯' . "\0" . 'ÙÞ
ÒwW™Aa@5ÏiÛ(z±dÆXÄt[ä@
|
||||
ùõP2Ƹ2£Roä¼|¤š£ìì<EFBFBD>‹¶Ó0WV™Ékw~þ´½„šög&Z€dÓaAsgM-+Ü9šŽÝ"0–DÝ]q¨¦Æý˜yÉ”Z%‡yÔ•áœ6êë&jwi×VVx¨néx¢ê 5CN‘%ÜNËt¦¥,—b]‰bÑùm*m€žäœœ÷è<>ËR<k<02>¯ÅfL+øUnWèó4À™ÀíŒjšV¬tŒ" -•áu£é<EFBFBD>–…fgŸYÝÁÝ-ì(ÅîNìrßž¾Tâ
|
||||
žk<EFBFBD>¾öfýØ‹ÖÊ™“$hG¦Î“ø²7ƒ]Ø<³æÎ?ˆÎz•œEÅõÂfÉ£gF1à2›DB+TÏMݺ%ñDÍÿÃ^b G:ŒZ‡j˜‰"f&¾©±ááW…ò£Bßç’ÕÂêÅ[¶¹ŒExãÍVo5É0<Ž[ÌJÄ›þ²·8´ûÙ
äÆک¹‰=„µh ù<>c?sU2bº|qа\\\\JÔ®&X±LU0‡dÌ!hlÕ)¼9M#^/4*?åÀ‡’|‡4§O\\Áe½…{‰*šóhv—Ío
¼³pµÎÎÇ’' . "\0" . ',ºÜ¼G<Šš™ÅÁ:ë`ÂÑ}¥ØÕ€—»ý<ÕÚ´>»,}Avœ¡¬øü¨z#)yWR±î¶Š¯ZÖ×Áj"å
u}ïäÕƬ÷½Lј[£‘uÙ)@ï„·~–”c—)˜d“1GÌ
|
||||
S2_ÐÚñÐ=#˜Ýe^Oî³s]`+©<«l.*™Cöö²%v)=ˆ@+¡í¯Ó8ë¾ß²yÄ6K¥Ï;Å8áñ½ü…G×gÞv1
|
||||
¼™¡ÍߘTÒÿŸs¬[™‰Î…·â;~ÝdÃŽ˜-O‰R' . "\0" . 'ÕeX¡€ÆJÄš<EFBFBD>ò}KŒÚÆQ¼cŽ{„TŒ™Úrô•Ò„ Óï•F¢+é¨ëûsß‚½ßUyÕ”›.÷ÏŽŽÀ^ùîü‡•í˜Ûy—•“ž¼Ýl2ØõX\'<EFBFBD>\'N•Öò<EFBFBD>OÌUÆ`Þ•¸ù™b»?JòOà‚cG‡rØXHdÁ+ìe*b½ðjûÊÐ=ª3K±å[—[º/
|
||||
#*"Á¿!vd6jN/
M¢vUê°ÇªëÞ…¬!Ü©’o(ò„Çšã”Ï):÷å¾[ïht˜ËúãApìu;<EFBFBD>¨ZÒÝ›?E†RÖÕÆM”¿Ö‘ˆîK-Dú ÖìΕ“¯¤œz
|
||||
KËaŠJÍ^„ÁëýŸf‘»¤ƒ3hI%´øcD¥€.>ˆi7-òB7ï©%Ä¥ÚyýOb5Ën‹•ÕµÍµ¸Zõý—TL%¬˜Ç²úm»"t¡²nG\\\\~l4VÄ_ÛâÏñç@ü9 «?\\~Ü^^Š?â÷Ó†øóò
|
||||
ïHHj…¼”mAh7ʘ9xîö!æ(åbB{Ýî&<EFBFBD>¸»ÉXÑ}uÆY<EFBFBD>@=Ñ\\%‡
|
||||
ük2,̘<EFBFBD>÷}ë<§½‘t3ÜÇ\\NK‹Nîó3Å<EFBFBD>>¯½Énáú ÖHM’©¾Ãkìˆ<EFBFBD>õUÅ$\\.ƺ“€—T2êF·ýÁ j§2*e`щu½Þ¨GïŠ4ÒOã´#v’ÙúhHï‚ã…Á4éÖÕ“/´ï~®|W_¾==<Ø₩J{sr~tp(Ívªs–+¼4øLÅâ?à<>c&ÿ‰VJ×O™~‚ƒã#VÞz¹KL‰6<Þu ?Ø,ð…â—×åL¯ÐO-VŠñ]I=h+)SXxøœÒâ›Ép€ž`†WÅ¿9ùïNÎÏl!<EFBFBD>
ñËV' . "\0" . 'XBraSõzD(›|’W«u‹JÀ<EFBFBD>Zi|ÜnÔ¢ÆÇžø´¥ŸUw=ñ¹!¤Ë‡ìCª°qQ6q³,@/' . "\0" . '²£ÂJeùnªz¾C5ÆU;bV2ì¹æ…Ožû<EFBFBD>©eA$
”zçà¨ãm:ìé[4(Uªæ¡¶Y‘)ƒ¹
|
||||
…Ý:Ö»@ã< µµ ûCzŽ˜x»€ÎÚdAs§B÷<EFBFBD>z2ÕÜx{ŽÞ>M4µPKåít ¤
•H!^«K¤êN±õ$ã…3€º+í¥(¢Ÿ¡\\Q‹Xà×' . "\0" . '›fƒ,2)näüMÀ‹åž{Ê$pfÐLåc%½Fo»‡oT u¿ÿ·iz{ÓŸ¨¼$mwŸ`Þߦ ¥50ÍTÚ0Éá<C389>Ìy"Ò»˜ówàl…^‚·ÓþµJÜìmv;˜Ø/þ¦[ÒK7:Xß>TÕÁÿdâH¬›†Ù¨«‹´;]ÊUh' . "\0" . '^Ö(Ò>ô³AJGñv²ÖN×0î€È·V6×’µ§ùàÓm–IÜÝ´½½ý„¦<C2A6>Ú¦‚ÍÞÓ4Á&<26>Äœäé´`hÈœLÐ>Q„ì®m=]¥iŸåÉ@5þIo³!G=<7µlm<ÝL»*·èÞ«R½m¢]\'ïyDw;«ë”ü)¹CÕMò÷6…¶Û*<2A>Ão·Mú5¼\\0Ê91¶&¢µýžÂ&=M5¶
"†Ìx“¼ï˺í\'[º†ar
w2åȵy‹³AÿCÊjÚÜÜj¯é~fÃRk»cÚ<63>å<EFBFBD>›¾ìÎÓ§ëk<C3AB>ŽÊÉÓ®©È(<28>×(\'}útëI¢sÒ„5`»×îlë0î†ÚÛë]ÓvÌ4Ô[ëmˆÿœÌ4˜)äÇߦY¿ÐƒØI»«*“³ùSAöî:æ¤éxÜiÎYÝxªÓ‹÷Ÿ8G´§ô‡¦u[Oá?<3F>œúÉY÷š3íjúTν^?OÛbñ–u·×à˜1€À…L¯—ô<E28094>ä Ý‹ £ëÚÚv[–švnŠ~¢J¨~<7E>¥´<C2A5>噚ðfÜdÅ„W²¤°µBÓ}Bcí°z7B<>24)¶ð¥1ß–Ü‚‰ŸÒ<C5B8>˜Ä’Ë»½ñ¤¡›Áq“<71>ÒOÝô–ÉH™>áãµõ´<C3B5>òPì£úÉH3i§»ÙÙ쨌kÙù
˜#H¬þ‡,ÿ¤‰+Q³‰Ök¤[ÛX~<7E>|@_²øVºÕKxºYù0;`jô6)óvĈð¤Ó“sl ¶BD‹<44>®š40¶$Ÿýë&C“nw;ÝÒ\\*j"QŽ–N©–f˜¡ÇŒS]pRÒ]30zøºëðËÐÍÚHÓòœp>.íΪÎàBBt·AB‚²,)±Öh¯%,“OÀí\'<27>´Çòl)ñäÉööÓ§nnZ’;IÓ<49>ÁÜnt6º©Îµ¨%þ—Ê®µ$PK¤±ÖqÙ]—¤©D˜¹4Œ–¸6Tè™"ζ^ʇi·?ºúÃÖV§Kô¡|{Á"6¢.ÈÛÉæ&
å<>§ùx Ë=]Òè¶Mž=ë<>öú“U–kËí\'íí4eÙcØ@X³¿\'V2àè<>íî*0”M"ÚLâ\'«›Û8Ÿ†ýîÈž«OWŸ>!J ¯#tÞ¡VœzÄ&C±§ú”gÓ<>RêKÖé$EdÒÛXË(ù<>ü5³änWìæeÖ\'¦`ÅbvÁÎW‚v{›4̸ôiÖhèÄnž´å8¶·Ó5{)N6%8¦jBôz:Ãk7C‡UŽ“Aêè4M·‰S0“Mf±?ÝV΀$=Q.U™ÎpÝ£A‹ã8\'ŸA¨±&a¯‹$ÃÞc<œ˜´ŸRF>U¢y{s9ŸË‹N£ƒ\\8Lå@v»I£‹Äg·]¾„¶©œRœ“·õÀˆe5#Ì3·¶Ö×I' . "\0" . '0¢ª¹&xäSwAQ!U%Ï>%LNl¬n=%*„p¤¬Ìv{csu<EFBFBD>²˜¬K¶OÖ(uÔåuô6’<EFBFBD>-¬Ü€év{ó‰L/nÒ<EFBFBD>V„{áÀýt4’B$il®u)uðAQ‚”â?LuågŠ4vfñV²)W W¦
|
||||
z’ÜwÅ©É1I™Ð¼I¡Çc–-x7¶¶×hùž¨%¬+há<EFBFBD>¤j½kèõ¶†5¦Beìu‘“\'Ù0™dZ%Xß@
|
||||
ºÂFpM±pMPL“5"ìíMšL”;›uJäJ˜\\\\1±fïÙ^<5E>Ö}wé þ¢T>¹P”[Dp[ÊÎôhŸZjó°Bl#(»‹©ŠRÆ[ìM18ÏN¯Û•å¸<>±\\$‚†ó¯™<’/§' . "\0" . '@ôx7Zß·bi«
HÓà&i¸a˜X¸ñÕ7é€B\'~]ƒð¸Z69À#«Â»,Ë‚W¡Û<
|
||||
×vl»I”gÓQWZÊE×$†«àº´V£îŠ–D<EFBFBD>£õ*`ÙܬÖ)t/`xCÀ®AZ‡ÉGzí,7™Í=p´š©“ì2ÿˆÒ–ÊQ…!‚Ÿ<EFBFBD>‹åsÓõfT¡Œ=‘ç¦ÅM*/ÍC<EFBFBD>ú}´%Š¯rÓ•‰GðB3Ѻ¨@µ<EFBFBD>˜¾×¼¢kĺ€X›ƒ¼Ò¨oÁÿ EŽÃ·uWg̃üº}ž½*pvÕäÁ©±åéòrg<EFBFBD>¿îƒ_‚P>‚@;“|½0L7L‚Rð+
|
||||
»È>ÆÁ<EFBFBD><EFBFBD>TFUðÈæjƒè݈à FáÁƽ’Îþgô¯uËAL7¸¨rŒ€' . "\0" . '`šð8T·ßyࢪ¹¼áÆâ¯H€6¿®n\\…è' . "\0" . '%ˆ¢×V½,¡;b‰0x°¤Æ„ÓÇB¬g>UrM—% D\\R”H-(÷JÖýh—ü¦!c\\|UÆŠÌ°=˜*Q…€€ø¤f5úþ-0JHJ"SK
Á*¡ÔîùRÌõs±YÔ>ß<>,`<EFBFBD>ï
|
||||
¤Øø̉ +hÙÂÓ Ûˆ<EFBFBD><Õ·ˆSœa™KG¢W¢3W%þóÊp¥½jö›¡0’tQhò!Àkê<EFBFBD><#™ªGî©"<þèXBüÈô@á·ÑyÌÂW hÙˆh¢ÏtÒ@’êlÅ7Q&õ@aõ¥‚zZOlRÜÎyc[~ÑÔGQ“15WÊD½"«ÚDÖDjL„j믶u./ÊóðªŒ4ô¢½@W–Ï$ÃIIØ áe¸mµ£z²f[wš
|
||||
Sie½ŠDSSÅxWVË
|
||||
µU¡Ä+´ÊVªFhÚ|_%ËX©ŠŒô¬’PKÆ3ÆR–r
?êW®LYýЕbа7ÔÏZÚx¯ñ4~ÁiGG÷ñ=g•@l\'Ì>îTaWx-£„=ý
|
||||
O±äV
|
||||
õY¶rÖ;±Ö‘©ìÍ=OLíz…ö;W |6šˆÄ¯%08vΆT·×‘Ï1Âç= yÝïîç×Ó¡`V¿¬«¤h8-&à–‘Œ4æ(ˆz_R9&_ó¬ðµÍ:ttØÖ<C398>úA&3H‹¡¨Y»ýu<03>‡£®§Fžö‹#™Ê' . "\0" . '»YǼµÂP¾Ì:Ù(eÿ2<C3BF>·š9Åt¢W×Õ-#÷<>Ohݨ˜º¼¼‰£U"ûŽ»~È<>q.oÆ)f¨ÓfvìmJ”¡1¡`ÝLæ4å41¶4õc[^^¿§2—Å£Jýûêeþürôx×¼Â*è|j.ë¨WÃe:\\ƒ+§…†¡VK5y‘ ö™ñ |:Ðp˦1^ñßñ“Åž—D§–Ïy7篖N*Š”Õ
|
||||
5ý¬©åqö}›<EFBFBD>àÎœ±S‘
|
||||
T?Àx<EFBFBD>UýD#÷äˆfÐfô…Êߪ¨X>H÷cí¡D9{„2¼5^Áà³zvõÖKZ ñ¥-Ëj¾ÈÂý¦*Pþ®<C3BE>ì<EFBFBD>ô×Ì Ðr]p‡™òl83„¡ãöBÒ”3¶é[Àvd<76>€<1F>(¤»¼j¼
|
||||
pÈÜZ¼g5ü¢e=¯wófñ¢-ÃVy¬^‡Çmë¬ûóš¹ Š9Háë©ÛE³˜÷½¹ôâ\'éí<%¬Á—26×<36>™\'¯Wö.Jwú5»cµlbü©/æét"ÈB¾å¸;Ö%÷(uQ/Ç’s:½5<C2BD>äöÚ@wBHз¾<C2BE>̪o/éÛb' . "\0" . 'TÇ»+3ß³ÎxÏÚy‰ÛºÝêÉåçQ¬~ƒï–t<E28093>ç2ù9øŒÀÂîd³§³kÞâË÷¹u¡2rbó€ ·Yn‚“‡åئ 9ŠP_Mªß‚÷ßoÑ¿ÏvßC˜º¼Z“ŠL4Å^R‚.)°°ŽáO]% ¦yn„Žç ïh¡»¿[`h8nÆBʼ˞èRú7u–
œ>6ó(' . "\0" . 'É…º*«fÕáKÝôgÞÔqúáüèé…5KÆYQÑh ÐJ¬äÅhð' . "\0" . 'Ö5Š&Cj;oƒ¼QbÀ׸‹p|3™Œ‹æãÇ<:”ÖÇ7ãú(<28><†§hMSš*\\¶?“‰Ž<08>göÝÙ厨íí|œz‹²À¶¿¨½]µai;]<5D>¯/ÃOÍ܆ë‰8ï&žCT¹4#ص<C398>eoµžµ<C5BE>7; C!³ýÃÃ%Teµz ' . "\0" . 'ºhQص-c' . "\0" . 'ŒÉ¦
|
||||
qb³œÞµ±ƒ …Fl#HÒ• ‘¯à²™EQÒÙ\\åà¬urQ‚×Mâº<C3A2>Œn(ãFY·ö’——Åå³ËÛGÏ÷.‹ÊÅåíÕ£êãä“lK«5Q÷Ú«lC¹j–¼ÉÅ6—pòf>¥D¥Í¤Þs²\'Ú5YߊާݟNU.Ûƒ)ë‡!–2‘Ø&v®æ²iÁʽ•©s¤[ ×Ôæö?$}4ZÉá‹<C3A1>FÆ' . "\0" . 'Bõ4²~zYHxmß~óîø8nêý‘Y¥ðmc»Ä}Ùƒ×
ëlŒpé»$.õ*³‡BŸÒ«æs [©×ëUÄ\'×tƒQ¿Yì!ãÏ+ÊTý6»4” z÷d[eC2ÕVÓ™µÍ£¸<EFBFBD>d¦Lwc9óö²åá Øuó–J¬ ¦#å8/ˆ«êUû<55>õNSËÂ8…õêûøâ/ÉÊß+O¯Á…>\\<5C>ùBŒ(«!3c™L†— <>Ö?X” é¤A½G[ª
|
||||
\\æäìÙ㬟Bw:j¸˜ÒSƒw°%qB¬ƒYGÅ‘Ï' . "\0" . 'ÿØC]ÎFòõ<EFBFBD>Ù+³ûÄNéåžÐ•v«°ßP+[ÐJ?A¸’iåýRG/ngCíôŽHBÄIšƒ‡¾šî†ÆB·Äªž,t cg0x\\îdç8$7’ó:°ìb\'¿ì®£‡é"žæý˜G·Á¹\'¹‰Ówׯ
©˜˜ƒ¬gÅ”ï0é¶#ÖJGôä@f<>HVbטs8â€nÑyùøɧò…zÞ±ü2Bò»0£ŒQdàuó,š8ðºSŸâ„I¢ŽttSS¸}+6åɈµ)Ë£ÄTi<54>êHbÑà' . "\0" . 'û±˜ÅùM‡°ãX[ÖKZÝ–¹&‚DpØód®¤sÌ4Á¡lâ—i{z½H:ï©XIWõåC¾ÕUÏ<55>+\\8Ùb¶½cöBP&u°—?Àö`Þv' . "\0" . 'KYs[=À꿨µ=Âjô#öÌuøœB¿˜èrw
Ž–R{Æ2&‹”h/UµÐ}?€' . "\0" . '“”b
|
||||
‚ù=T3$ÛµbŠ)ˆ$”¤t«¨L2eaÅd«$¥˜‚ÊEB•)I~]°oû”ImêÃÞ:Áj‘<EFBFBD>ÌAÛ"÷<EFBFBD>[:ôº7Â<37>Ò¬Àኪ€,o³¥Ýu¯kAÏÔQuyÙ¯ë„k”öpZƒ‰¹¡5Î3ý8Kâ‡1ÜSÆj“Ì@ž)ê¶\\AiåXÆó.šû‚7‡zWn1ò¯ß^LvZëÑF‡Îä+˳FWÓÙ~¯¸¤·Ò:ð,o Éj7¬vÛÖáòÐYûú;ýŸvªI“ÜÞðÁWðTçP€¹“QIHr$êâ?TÔ:/õNç…Ò+7÷i‰îÓŽ|ÁrŒÙ5ï%k¥ã "bÓk784³NU¢¤mjj<EFBFBD>ÁžíJhŸqð“eÌN8> $]˜ [î\\Ô.Vôr°ÆzÝÖ)<«³„¦Z®=9Ã\\~—¿Ô4‘“Ó³ú¼¶?Ûö\'lPVÍç‡$ï\'ËpÉQù¼›¨ÜF¬UÈ®ýׇTO}uøSkœ‘ýä-‘¼n\'ŸþøB$nx‰û"uÓÁ' . "\0" . 'ïǀû“ OüÊ6Dò¶Ÿ¼-’ŸÕR˜ŠC0Ô#Mt*K[æèâƒ!\\€ÐˆÞšô*ñw<C3B1>µ<EFBFBD>ê<EFBFBD>q½ÉÍÁ¤þÕ6¸2Æs
|
||||
¾ªÀh=G±<EFBFBD>T<EFBFBD>‡êŽß…¦eMˆ¾‹WWÍ1ŠjCYFÛÊà!rT÷~÷ÝêOôÿX»u«ÚcÙª“~]’ÞVé<EFBFBD>=©ìåV3ЬÆÚOêÏ|²{hÿùHóëvå»n-¢?Õ/C»Ä›0ÄâO1¹C»¤mTƒLpvÜT¯z8ÈÜYˆ-?è&߈2ÔÚï¾£¿±Å¢¢’VìÃfðV$N34ñDe£~¬ªð˜È‚”òM§=U*«•w¡î1¿¾ås‰ ZÓøøÃýgÞöœ™·Àì7å=& ‚›ŽÝÓè¶óŸó´G:<EFBFBD>fÈÖ¨%Ω”,iŒ<EFBFBD>ÒêR(”¡šo’b0¾IB
|
||||
²•Næ†{«÷:˜' . "\0" . '5Üc² –à±øj©D*™±e“b/<EFBFBD>¡O}ü‰Í+žÜÑΦ(Ñb0Mmwò“!K<EFBFBD>Ÿ¹>^P ©<EFBFBD>»tãfå3€%1ÎØ*9 Ä¿‹íÖÙ€«²YÝ´#îŠø#~é&Ók7N@W>¶Êt§àå¯7ËÚ<C38B>ë¼}z·5xËÞ˜ ¼aoÏÞÞqCè+S<>u”ü—Jå9ÈüŸ…ü®&Ï«—Å÷—•ÊEcåéeý»Úeqõ¨zY]~Ü—bïìbÙj˜d”‰§ÈêÀT`<60>K›*xÞ9í„x&ü¾S@´¼^L|~˜lŒrš±ôûdµXQ@,`¶õÊ2Ú“AžšIV¶Û°ÉgXÝ]·A<C2B7>ý…Ú†AÀÁ ö<C2A0>ÝÊV÷±iŠRºí΃i5xt‘j1ÑUYËYè;8€®s\\P¯jà²}\\¬nx#;ôzƒ¤ŽŠ!èoÍoy™NU ×(V<>\\À-÷é¾YèªY|Íã§f§N¼™®]ì‰
|
||||
U/ý‹œjƒ»Ð2$—
|
||||
½' . "\0" . 'íF–$¼X¿ª¢6òCùÖEk9nÙÆUÕ„ÕÕ£ƒ¹@«>PÛZc@|ÆöujV.´ÐÔã~ˆKz¶¢Š³ˆl<EFBFBD>‡š$P…¶šÖ
|
||||
Ù*Äv~¢1¬=&HÀÙ”›M²rZ‘:Áº§G»l“5è“Ùz?S¿Êª•ŒÅªÕ{¢²á4ñ"µÔB¤7Š_Òú;{S±‡cLïÞÈñ’Ú~R¢Ü&l5Q[y\\—y¦W2<EFBFBD>r!{•vd¿ŸÍ
|
||||
—žÑI^³í—1KPÚù}îñ0¿?<EFBFBD>0<EFBFBD>ÉòŠJ·/yE’z²/ˆN\'ª‹pteR[œå•üÜKèö…v
å>þα§ñŸñ<|MH]%Vì"µh½ „Ð<E2809E>Ž§Ð_@)û^üõ¼ryöórï<>Å—&ÈD.Öú>,øìÍ<õî¥OÊ.ö—òÔµXˆÇ>S%~Ú$› ¹ÁNM>\\ûvPÛz:L‡^Øü~êXÌg<0F>ÊPef2õP‘a.ScÏk¼¯5»“5Ù“R¾~ÍëR²FÒ“ÐÎÆJ .s°%«¢:Í=OHê+ÕŒ~ ¥e#ss' . "\0" . '‹¿³ü¾<U@‘σ’î<EFBFBD>¶«˜
+‹#ª†U^V¸ °<+u
|
||||
›íxÚCËòA„œ37Ç},…ò™Û¡t’
|
||||
8$²‹ÁAÙܘÉì2ž«ã¤+#<23>?aÁ/ ³;ôAÙ‰÷ùZ2#Ëàï<15>›öÕæYÊdê†X>+‘1Ö(J<>' . "\0" . '^ òœ<C3B2>õÄ”ÓïSØ-‰ÅÞ¶x²]]Ý°noéG®™ã]à!ô™‚S÷Y³"hR½ý<C2BD>uD©r‚¯6&AéO
|
||||
äÒãËürô3ü?,:pJ¨nr¤;.£ ¨a®‚c¨¿Šh³Ü\\J"€k¸yôÛ)+µÔOÀ³î¯°îka¯,¸òœ<C3B2>pþhÔËî7KÇi>ôµ”Þ ¹öSåÍD;¤L0Côð½èêuêÒ<>s“¿bn´zÇY¤KEÅÏ€:ü¼Öã᯲\\®½å.˜
|
||||
>9Jª½½‰z<EFBFBD>‘bˆ +å’Wà«šs–G>¨ÈžðKÏdaåÝ¢r奷É
ECp}0iêª1wJA*÷
¥A²<EFBFBD>”«™Z(Õ˜1¨~ñ²ŸÛ0\\ÑT@Ð3J¦u,ÒÜè^£N µXÿ-¨!•A©‘·¡ 4_MƒP¯ŒDÅ"ëC±§9h4ò^—ümÝcQ<$ˆŠ¬ó>…PB@qPa¿hlÑÓqª–ô›YÓ§!€„«ÄþîÊÅ.¹Ûv7Ÿ[Œ[åäx1¤ˆäëjb*l—PEp⽈ò_׺Ñ×QF£ ïÎ%Ï#ÏZ9yn¸#,ø>‰:‰ü*WY•«3ô臓hܧ3ª“[kH7gò‹içê~{‰È2³°¨Ÿ†ÂVd”øðU5t/îX/J1wj²Ö*»e¦D…;5«Òº¢è¶Ø' . "\0" . '†8þ(l40hcœã£•x±Rk²Ôí½JR©`#_<>ø>ÆU
|
||||
Yv¦ª]¬^Qðú(:ù}<EFBFBD>÷qm±>®}i_ÒÇÆÚ—ô±±îãªjüdf5عßÇ€ÆÏ[TåO?âBÌp͵”²à$Ê¥“„g°7)CÛó<EFBFBD>"cD+{¦SÔ:ü´.(¡R<C2A1>žEv¦Î®Sö—†’–07Íü»ÆäÕUBDνN ^Í™Žú&*AüL^À¿_ãß?âßç/<2F>•ÒgT@{¿(o% Q¦7Ȳ¼2È®y®ØÒ6Ö6ª—å <09>i<EFBFBD>£qv[80ïTÁ¬_ÇV^,÷¯xª?bƒØÚò)M@\'„ø—•øÏÆ3U7µL ìsß;RÚ먊»Î#øU³w6lo“¼HóÖ‹¤H·6ìÍ™Ìz;˜^÷Ù¦L
Ü°?jÑæ°%Öþ.ì–·ÜX<C39C>¨Èz0Л[‡¼žRpFóž¤
ö£Gú¬’¬ñÍæùéÑ<C3A9>?ž¶ÎÞa̤š1€V‚<>Þòù‹.g@@ªÂ½ç# qnÒ“ˆ.1àÒ?€ÿî/•çÍ‹ý•ÿI—A=Þ½ú¼qW}´ü<1D>¸çî^HŒ#ª´q\\ZÝ´ƒ' . "\0" . 'U
ðŸÝÅÒP¼Ï#ÏËU•
÷vǤïdê÷#ðYaJÛ²["æ|Fy4×é•:+,
|
||||
r¿Áã3
|
||||
¡³b ‘A/ÜyŽÊļ(!ò<EFBFBD>5p.ÿ%ÊÕLÓÌ<EFBFBD>¹×½À¸ÿR¤™ G²à<EFBFBD>†¦£lÖ$¤÷’™„ÿ”SçÁrVÇ _TƒIcÎÔ3óà±~µÕyþZ£gú2P9‘<EFBFBD>O‡î×)jûgp˜x/©×Ö¥|3¯y[4<EFBFBD>0ýY°‹ qÀÿº|qøãÑ›¯>÷ XÓ5ðKÑÑl”<EFBFBD>f“k«E…ê_ΪÌÍBË£g–—¦å£‰÷ÈýíÛt 3Ð’„‚lªFïAÎb<<EFBFBD>÷<EFBFBD>ZûVnðdP\\\'S z-L2x;¡¨eÀ¡;Ž<15>åçõ»Êe÷Q"
ˆ"hA†¸&:ÈHˆW¹pQl(xZ Ø]sWöªëÆ2þ&Úñ©Vˆ<56>"¨¡TÅ2ö¯)¾0¤”߀¼õ¥’-;©„‰' . "\0" . '5>)
|
||||
û†@;î h‚“¦¢-Üže[ÊŒýòZ>Ò;[pد&,«PSÿHIðMD¹>Ò÷FšÞÉFßPõT4tú‚JHWPõÂ1£Äí’×#÷ž#ÛYVa°Œ[œ)#¯l#Z–Ö„VõÃѪ[<5B>è2-04Š,¥Wž2À·hD ܪ†:éP¤…òC‘<43>^ËI”ãÓÍsï<73>©È7êÑh¶¯”yÏv[ÍB*1E:¾þpÇO-ѹS„šD<C5A1>›þ û*¡HwÈ3’ª¬W
týf”TJb+d*øŠ>¾&ªò—ê<EFBFBD>l“Ðrp…˜/I FéµáE6¥x0€î7*I²6¬¦cu^YòÞ
|
||||
rf <9Ö%c¬ýe(…Öš>¸
BxzztE\'¶u¢z]âË#|ËãKÄfÝ«¥@ÿ2Ö£Œò?RÎÊ¢ðñ‡¬a¨a{Ýèx¥ÂšBÿ[X{ËòâBw!¹Ž¦uK¬—ÊêƒÇz¢¤5i{t™IãrÙÞ$~O<>—ðN*Àà,CPtX¦–íke¶*ZÎî@ ^ ŠÄËCçJ07ün°ô¬‚º}ón°S”íC©ðVWг&a4ɤ<ÂßèÒ_²h°ôm£)4M¢É&§"\\ŽOóI?¥U’<55><E28099>!<21>~[›õP;$ë9ƒB¥åKÛ.oQÞêªé\\¤” ‹WH‰ŸšÍ£3IjbT´y:Wb^á±(Ê"•³Ÿ ¨2F¥\\¢]r7¥.̆–lþgÍ+•n˜:ˆAÎ ;•½xHuU·R}LÁ<4C>ê%©¾BRݶ[¢â`ìµç’:$:<Ji`Ç\'¸{!w¡v)òh%«nKÒ¿GÞå,¡£&ê&éÛ¼iúJBù<42>7ôä¾ïMŽ+Ûë|æÀQ.]6¾¿l,æÝB¨‘Ê/)É¿4¯†;&:ÂÒYJ1 ŒbæaqÌÅrÓâ<C393>•o_¤Vdm_JS‰•ô™USW\'-WFiq²uQµ`ýK©¢Y1ÍÓofÜýM)™´tll²ÇÎÉD6ßÄ$VKæé0ûànµb¦\\ j#é[&I£l/YYN¿Ó£—çÌy¤‡Z¯ôÕ‚ƒÌx(\'û²Wr–± ˜j‘*cKÃzhW]:áÇt”ÁÔ>ÒûažU¯ÉƒEŽÝ¹o1ïYþà<12><>TªlAâÑÜ 8m´$T>Vÿ|ä
ŽHþ#\\¸ëZQ©Z•´<E280A2>«»ámŠÂÈ÷$¹ÒGGj<47>] jyjg2ódÍnÇ*_º†8«–Æä`ÐVR~±½2lƒYð°í]!gœsÔf×UÊ[ú˜¬DLúqzþ•NÀœCÆõ5G:µž!rgàþ}®nß?Xèú½ÄE1´ÜÛàÏ›ì>øÅ_.«WŸ·jw—ÕŸw“•ÞþÊWŸ×kÛwÕåÇqM·Ì=¦^ÄRÙ21~£}Œ]e]hY ,`&›µ0°Ó@=Ëìm³yñåÉ룉Üiý֖탓×o<C397>Ï£‡Ñÿ
|
||||
œ¼;=;:ùÊs?ùpŸ³´ÊÀ:Ù}“uÓ×bW$ "÷X¬.ÏdÆ{[ZÙ£óuãC@™úM‰¬ÌÚ:OR©ÁÓºu`dØè
“<EFBFBD>-Ú°„q íy¢Z“ÇC™Ï… ¢—YaÑ"ÍdRœÆîìû¬5Éäy‰×”-õë°È0§5èûxD¶ˆø7Dõ–' . "\0" . 'ynßÖ³3h"—€M~Oy<Ï“b`€`´ç“;L`͆‚a’5(m² ÉŠ‹¡Ðø¤Ô®÷\'ÂÜ®²§¡ zhìûôª7ºÑßÞaq‹/1 ß 5 ÄE\'t<îÌ<ê½pW<70>i(˜”¿8 :.¯ñXòemPäžõ÷w¦‡ÒÂó<C382>T§…vøÐ2ÛõhÆâÝÿJß”(&×w@…
|
||||
u,ñÆb8/&`Òò²DsJr‡ègÓâ¬/ªº•›?
.ËÃ}òˬƒQ/u®NÀ(ÁN—„hg…½ê_c‹,iã¬<C3A3>xu«eö·l4a6£9ȉÖH(<28>Vœd"jkO\'ø¥|ÚȤ.‰ˆÓhr˜·8Œ¼"øÀ\'{j?yM`eñP€mNqÛï°
|
||||
@‹†c!dß<EFBFBD>I„½þG¬bï«vÃÌ’<EFBFBD>_®¨±|í~Ù´×r?0u;^ c)`d4 #É=2â_BÆRšs9 ŽŒéXú~îOŒ)ºéÀ‚a1ªÓ!ï•.<ð‹É^ƒ›
â¶HsÜra°`©I‡ù.,j÷‘¢s§AZi㧘fû¢Àâç¹àùSzˆÝ›ˆHÓs"Ä"Œxœ[*\'€¶Î * ÚO‡Ã$T¯=±‚3<
|
||||
µ¿Áþ.!¦Y ?8}Å|<EFBFBD>¥<‘6ƒ‰‡Ä' . "\0" . 'öY¥€‹ 0"¸…ÑžƒàU+€’¥‰Â;<Zjªd½‘eÆÂþi®NâؼÑyÜs-f:Æ*©·PŒŸ…0ó_ Ÿ¤šŽº v<C2A0>êÔJ—×€Ý]à ¸§*ƒÐ|ËH3ƒYd“qñI0¤ªNðò*«Ù<C2AB>ùŽõc<63>ÔMå!§É.(/ó¼Ùá¼)Âwø‹Eç°ƒmàf#‘±{ Ä<C2AF>ÓÎÖ©…ÔÉhómuuç•K¯ N/ƒã3óŽ‚õ{Û®ž»ÈÙ¬íÚï.¨<>ïøO¤ÿÅ܃h]="ó’ÝÕêŒà<EFBFBD>Q|gØ.2_¥§‚Ÿí}<EFBFBD><EFBFBD>DoîØó±ÒÚF¶
|
||||
sàËŠÊ——ÔËp,w™ÑÚù"¹ªºÌÄ1.*àL‘2¿WÁE]I›T
|
||||
HZ‹v7Q¹9Äs³5VŒxbõ½ä@T‘ÜÞ4ÍÀËÛâ‰{×eî{©ÄKŠ¸\'¡! ~À\\ûŠËC^¥g¢vÒùlrõ T˜óõ"¦1©L/2k<32>ß.ƒÕkœJàOk˜½…tv<74>_M<05>ñÄ2™Ñ,Wƒ‘§:˜ZpûœLÒs/ÔÕoÀpûn&e—ïàªJêC†0M@¿—¯´HÄø
|
||||
b}Æ#UÿŒ9k<39><6B>m˜—Ö:wÑ|þloéûŸ¯«;~ÞµÀÇ——<E28094>//ëàôòèT¬Ô\'§n<7F>¾ÝÇÕ»;eo…UQÉVÒš\'Û½3›ù\'6,6rÿVL&/¶èÈ 1‹üù¬u¯s–Yæ®·/Oàü7Uf®ÑËOfØ´LNÿRÀ1œ—ßšú¢ÛR‹œnHo´oz¬!³{nXZз=Ú(¹×ÉoÍ=jø%/ñ~Á}Ü{X»¿–˜‹ÞÊu‹±ÏÀ“[Buèáú¬¶;ÐÁ¿UVÕ¦4…Ã=]l—™úxŽ³ÿMØ£â¿ØMàÿ,„$ørÕÅÔX¾œÚá´ñ³$„%áJ«™\'óì:ƒÐꉶ¯<16>f÷†1¬År©>p?ŽÉM‰%]Äî¯Þ<>€ø|)<29>ª–³
›¸²½èV¥ï®éC‚»*ÿª³<EFBFBD>÷h¦¸]p¶¿.<Ó¡rÿþýƒRc 5ï™Mð^â¡üÚÕ,½¤$dî¼ÛCpô¡<C3B4>Nn&z–æBeí<EFBFBD>Ý,8îŸ<€†' . "\0" . '7.ëàqtõyû.¢«<EFBFBD>;ôÌòr\'H3UÇòTÉbª5‚»Þ½qº×=-Rð§CœpýÞC›³T¯Òd x$C¡bèoñi<EFBFBD>¯áp[Æ1HiI42Îæt(_x&ãJŒ¨“ŠZ&0ŒUT²eX`ĵÂïD<C3AF>I`d¾ÞðØÌꎼdºe*{Ç+’Ž8RŒ@a«/&
|
||||
1µ<EFBFBD>c\\H³2³HŒVV•u×±7ÖòùÅ5H‡÷U¡œäTÉ[|ßÀ±ŒÏ5×<$ïãÃ%
|
||||
k‚£e%2É ‡^†<EFBFBD>á•@ÔñDL:_Š19¥¬VË$“}IR¤t>¯0œX<EFBFBD>‰s4G— •°,új¤”Ý×’½g‰£<EFBFBD> Ä?KEÉÜg+Z$½´5¤ƒëIG<EFBFBD>á;äf+!oÛü³Êq樚÷TŒKæ¡„~³‡ýO/N’v¿¸j^v]4w®~îÂ/‘qY‡;Õn§üdÙ<EFBFBD>Þ#KâK’„`8Ag:†Û¤‡ ×jŸ4¸÷Ù泥B±‡®@.9Ä–èšUÐœÌÚ»@ —~C@ÕÑ€7óˆ¢ífc\'¶éÁÌܬ?Ĉ¿L4(Þ¡¯Žå#ó<0E>˜<11>q¶IÎöeR1Ÿydû<64>•¢¢-ù\\5¹s_À¥ŒÀƒ²†q<E280A0>ö\'[@ëÖå»ê€žý솔ÚEìÅ‘qèå÷‹6ï_¦oŸÁ¢œþôúøp€&¼{ ám_1—4¾S5ã<02>?” å´¼—;Žsê®ïyÃÎqî¹ûoš_wƒ\\‘O«Dyt§<74>¤"C·Qš„(¡(µü9Evx ¶?ÕÓî@e[ËŠSD†þýF§²Éó]6àOeÝ*’Ù†½™ÎMäu“§£H]\'P êº;Wý·§¹Gžµd
|
||||
½A ÃÎß;gçÜqÆvÐ=YÙûÌñÜcÉ\'sno Xú¼"ªÔó/øVŽå¬¢«×‹Î®' . "\0" . '|=†7äûôHü<EFBFBD>y*,Ì~³ºí[–ÕI“&“÷Œ•R±¡í<EFBFBD>2ŽXð!v‚®PÒwôÑ#z<>GùDÍòešïÉÄÎ u›´ÅdÆ c Å/ùÌõo\'Oõp[}Ùùf"m67©÷N¿H”-$OÔX•œ
|
||||
Ë,ACóØñ|_º¥ªìõ•ß€;„ºÇöK(L¦Û_w' . "\0" . '.]SÌýñr–ßmË\'IJ‡†ê?ŠBrýÛsWùeÇÇî;ìß+88ËÙó<>KÃÜBêî©#Páñ&9×rîfõEmÔT":wÜMKFt"ô…á7GÑýÌØofgRÅ÷T¶V™âUë[¸Æ><3E>k¬ <C2AC>c¿ ´b‡' . "\0" . 'Û‚Àà¥<EFBFBD>Ò‚½e%"{±(‰g²BuÇ¢LøþªÛ‹`g¸§ã”rÀt¯s5ŽÕ>Ysës@ïqº¦.Y/â‡FCE)wC;Ç<>—ßj‚á?¿¡ÙUî÷ép?6Üç°‘&£}××DJ1y&ý,rC¼O?™7ÕØÕ¬6:`I`§êJfR²˜ð²úöðk¯bª‡0Éši÷ /æeRÀOHpM¡swl¸{<EFBFBD>t°ˆn2æQB5 Η?È®ô~
|
||||
ü²ç•ßBÇÌ9˜RîZ7¡£Žr³ÚùMžÝ~ÓióÛ·—~ì¤hSÅ+IŽýØw›Sò‚Ì[ºìÿYp±Ç_ë帶ºñdc{}kc»f~?<EFBFBD>·Mž¬?ÙX݆—Kôïõûú8Ê]p-ŠEëRAâßÐ(±SÈKMèü
|
||||
\'Kt¥©Û¿¦—ØCN÷t<EFBFBD> 5‰»øª³qÈrç)*8êkUÇ©<EFBFBD>sY?!«G\\Î]ÿ•‚ ƒ(S)Õ5‚ÍÉ»@Z\\Ü
|
||||
ßy“È(Ü•¸ÕšH*Å÷ww®Ä¦°w&âš$f;óF/OÜ·‰ïï4ï$S”t[<EFBFBD>d0¸§ÿüoMËy`e' . "\0" . 'HI\'`©™§Õ`1Ò dJÉÅy' . "\0" . 'Ò/pXTÁ/<2F>ùX¼¼%¾œ
º-ÝKuVΣ,âÉÝþ /ÔõÂsÊö®„GÁà\'¦&PlzÙ<>ŒÅtãT&q«<71>ò‡ÄRxu«qŒÉlÌÔæ<C394>‘àLŸv%R•#rî¸Ë‚¬•óèýCNÏƺ´Q¨ÄÌ,Šþõˆàìö!￧0™VáRJ·p8‹' . "\0" . 'x6ëÍŠ±Ý}³¯‹ºÔmH1,©ãŠßåd²îqö‹³ôoS<6F>¯Ÿ|þ6Qki3iÑ‹˜=Q]¤Ð<0C>a:ŒN' . "\0" . 'á)Miøa<C3B8>º€( ÝD¹ò`ªü
‘ ¶„™äײ4É.ÔbðíËVžl3§¼f6f‚³Y‘éè)Bó' . "\0" . 'S<þw‰eê@x+†<EFBFBD>ŒYÎ\'§é' . "\0" . '†±ªÍ<EFBFBD><EFBFBD>n@‚
|
||||
¡Â<EFBFBD>M' . "\0" . 'ÃÔ0¯àH °H¥\\Aà?uƒÎ' . "\0" . 'Ìà;{ÊKîÃDéU#Ÿ‘I£¢qº¨ñbáb¡Yˆ;¼2ùñÓP<C393>vvv•ÓèƒT¶¦{¡ß9/¥ˆ\'º‰—ú†ž²í3%Úa' . "\0" . '$,Sjekd²¹/`h×èx\\ Eb<1b(‚€ö®tå¸ê˜' . "\0" . 'R¨Ë¹œ<C2B9>¬ü}å¶.?>é\\~ìõ®d
|
||||
\\×6‰ßÓ½mÄu±JA¿Ñ¥øŸ<EFBFBD>¼ôý¾VøèÈçLÁ×0¬vÕáÝ4üE²8MôÀ°åÁi`ÎfõŽƒè¦Fí«©Vµ:éµüÛ<íŠ#ÝUN±o™ûÓpp/-U·–~[&Öþ+ñ?¯Û#ªBÒ5¡µhSºå={þq8Ùµíp¹ìPqsÆ¢Üy×¥þÄéæ*¦t!³ZS =t<>fÿ=ñ’¯{Í
ÖPµn©ˆòNȃ^¤›b5Š–þô<C3BE>ùUÆôÒ³g/&†ãS`)/´é^\\ôÎ
|
||||
õ™ŸÏñn+€Ã¢gƒzhnŒqµôÑÁ$ÿÒ!Íó,‡V
úmðæ£Þ½+%ƒeêÀýÄÆó÷ŠÜZ²3‹¬Š¼¢Œîo,hË©³ºK`H]§{ØÌåÍNÛF<ûÙ(÷t%HxÁ ×g+Š¿¸õ>‡%†Êy~<EFBFBD>±f1îJF›¹æÍçŽ L' . "\0" . '^çõH†XÙ
|
||||
(D†K(ÏÄkÛù–äÿ=kH³©à‘Ÿ×
|
||||
¸ò#a-\\§bJsŒ½ß·—.<2E>á/ü¥«3è·0<C2B7>rQæÎ/¼NÚšNzÛž·©é¦ÀÛ~©"Ѹœ²,fÌ°sFªkaú¦ÆX¿³Û¢•M\'ãéÄ«OóZ«…Ï&À¦A)êcˆõÎL0–4Í&—€ÊÈ&WÓIvùÃk
ÖÿDï‹òÒNÇÀR«@õRJ<EFBFBD>œRìbŒG™ôcÚ©ÄXþ-\\å,Tºæ^2Ȫչvó&M‡¸ð6{êëq' . "\0" . '‚<EFBFBD>ϧ¤Äk\'¢VPDBK†Œ(=çÿü×ÿ
ÛÞÿóÿþ?øÏÉþ7ýó_ôÏÿEÿüqUÝiXºüØM–jüÛ¡Û=ùï:ýÛiÈ7$ÜÓ%Xÿ©UQP±Bæ§g_Xë9©Íaý’°L4ÈQëjûb}m¸Tç}_ºQ“Dfcx9ÒPºyÕºÊ]¢á ¶ô7Ïß°¡›;«5áîÛØþdðm[»µP[·îÓÒ$5ÕŽ‡¦=]Câ€7šòÝÉ ¤¯@
ÜD/<EFBFBD>·W(a$Óù>àí«·Ã“ã ÊŸVàtˆcœÑîJZtÃÎbÈÔ#Ø‘%"²G]Œèn…Å<E280A6>ØŒuùºøv<C3B8>ôG÷Z<05>[4 -òìáñc‹NÞ“qO®7øêÛ\'i”`üA"»% ÜùAQ€ˆƒòyrkc¬z+íä&¥KIcÀRïEì¯Æ}‰â.ÙÞrÜNÓQ+ŸŽB0ËC±<43>“”e£AmнoõÀFôk,ÕR§´‹X|LÄ<4C>ñÕEL
U¦7b^«3Ké“Óò
|
||||
ÜîÚUˆ± 9-ÊÖ›Ép' . "\0" . 'ömzë—[[ㇿ{º±½±âçææšú¹±½>Ñ' . "\0" . 'O
ÀóóéÖNüe®ìRü¬¿‡oBz=~öX|–"q×B<EFBFBD>£mãhÏÂá.QÉÔF2
#™¿z(ý‹ÍÊrQËÆû[-¥6-ôºÀ#n¡ûòè´?V®<56>ÅãN6˜îcmjA<6A>dYüZh¤<68>á~˜üÞù½óÉeÁÇÎå0-ÁÉÁ–y[™–üUìÝt±bOºß˨ÃÆÐÕòg' . "\0" . '†nÔ0Ã8غ¤kMÕFP÷aËjÔ^ËsŒ»Œø(–?¨ÿÒãÃrúâ&Výî!t
3áAµð55Máªç3J¥…ww齘+”´´G¿b0<>(æ›P.<2E>.VH´‘BŠ<42>RJ¹Õ±°-w˜§2Ì„Üe~ ¤æ,¡Uwû¬ö᪼–=ìkEƒ¥ˆ%D{öâÅ42ÜomÉÁÄ0ý |EDÇíÅM–B¦Ý·ÒI”ªˆÀfSÂÐÓ¡€@¿æT²bZ;' . "\0" . '^A=†‡>¡r´šÈVEÏ·Ùbá(ÔÐó4½‰~WTY±RÝL&ãæãÇqU½¼ó\\áÊQ<14>+и¥(Žš8wÕ&äY}&Ìw7yÚÛ½\\ú¬ðÞ].í}¶×üŒÍ¹{ö8Ù[
|
||||
ñÄB
|
||||
0jì&ƒGPãðîͧf“Œ
‡¤Â•äå,ï_ãöžaÐØvÊêD1i%ÇûgGG±Û˜øÝù+Ûdê’ÊÀn\\ŒÓN?tn’¼0ý>+Ä›“ÿñîäüðŒQAßjôûÀT
æEPµxÅÃ6Á¦Ñt˜æýÍœX½<EFBFBD>\'[TfFÚQããv£5>öÄÿð „~Ví¦Þ6±áÍÈi¿sÞ‹øÛr<1D>kNšóMˆ¹ÝŽÎ~‚x)Èõ¥ú@ K¾2X+óô¨r@ÌÙ0•¿˜cé´<1F>2!-ÔÛ*è72÷R<C3B7>i^hŽ' . "\0" . '𩆨…s¯¢£ø^´ðÔ½´œqâ ¾õ2IÚá!lž*OÊ^Œè/ÓIÒà#ݬ#K)¯!j,ÔT)¸BD<42>êâµ<C3A2>RRvMùv—’Lñžq-Õ!âÞoçÞ¥C5f“þŸÛ*Í#/²¸YÀ®ð~VvBPjÆ\'…¯5LÀWn»QnYPÂ6l\\ /9_l\\ã9:œ.Z¾~‹›Ð•Å1XôG}ò´«’<C2AB>ñ v<C2A0>A 2b ±¢ß¶' . "\0" . '¹òrtO7–ÁY‚ì\'ÜSë1ƒ¨"<22>;Bõ{}x׶Eé;éD9L„Ó•’³s\'˜€¹9C¿Ò †ìÌÔn <20>‘ð°æ' . "\0" . 'û¯lèaî¡Bb ¶Ÿˆ<]±¼dC»v<C2BB>µoªÖ3Ps¦]ŸÍ·f—6q”ÙÆi.›<>' . "\0" . '¼<07>I:Ú<>£ÀÔL' . "\0" . 'í`¤v£zŸ.ѵJ¬|“@€ò‹‡Å FH!ª¢c 1d™Î¹\\ W˜ú§<<19>±žZTigÙ ªïD(ìÕZ¨ 4Éh«Qw' . "\0" . '»Sªª®Ëâfk0Ë‚d7浨ø&óF"«™Í¬2n€Ü~ÖU‘o,h
[j{³Š²F•ñxÂ.HÛoÁ<6F>¤Ó«ô%ûs/¶‚EZë’õºè^ÔÀ„Dù“¶¡—ìqÓXµ*VˆöXM\'Ä+€xEú,-E0|í.<2E>‰FFòÝ' . "\0" . 'XÚ{˜„' . "\0" . 'ÜyöðÐ Ì&“_á8OÇ^U\'ã,Ñ#<23>I 2V׳QòaïÙcøÛ"³F𹛌<E280BA>Ž3ûë2@¬m7”´6ôlž`úd>ï&¸o7;#3`¯ÕÚãeÅÑäVœIŽ–ThüŽô' . "\0" . 'XÈÈežnoä÷» n‹¬H12Ãy"_2ü¤¬A–šÞÇÖ㈽‡caCs³ÓBÆì\\3¢]¦gY6<59>7Ñ•ñž<C3B1>ˆ£NªÁã‡B§Ýj)n¹/)Ã7h$¯¼BWKêDcþX>¼(ôUçñãË⾋<C2BE>QhÕᎪ•T!|‹†’É<Dá•Ñ5*¿Å7ë>\\=®×ë±ÓË ä<"\\yNZ>‘ô‚˜J¡Ë-°
,»íð' . "\0" . '†z0Ã
‹o“ÓÁÄ]ÐÄ6Š]¤‹|y¥¶e˜÷PŽl‘J›‰ äòu8¶ˆˆ³´«Ö' . "\0" . 'u] Š˜ó¨‚Æ•¼9xTÉÞU/êñ#:Ê<›Ó<>%©?Z`Ù] 2z¥£‰^|jí¥ÏßfH}g½™ô?¤€{ɲ¯:eöæð”(<28>Ãz]—&Û@)8m쉎ÙÝ°.vËNx
¨CÎL¼îú0–KDW.þa¤á+W/)w9Õ\\º˜’hÙCT¼†ûêˆPc©–hß>°/#ùk<C3B9>¡º}_
|
||||
HN±ÁåDëªÎcZ¦<EFBFBD>ƒš@KPÑgò‚kÅ«z<ÀÚtd
|
||||
ý„wj”ˆpQ)-_5Äòì¯4Ÿ_\\æ—£ËÉeïòÃÕÏÑçµ;
|
||||
M»@#]Ì÷”èv
åÒ½¤VZùy¦u–+ºéëv•õ¥ËѳÇ' . "\0" . '¸dߊp8 Æ?¶aLé\\{3óÎfÿÓòõ¿ïÉjÞïÜÔÿ*}ÿ}üïcàÿJÇÀ0ó?~´ïXòËl츮ÕËÄœÎ÷0à§×7Ú¼ª•ºEÍL‚dâ’æ$¾ƒu<C692>‚®R‡vÄ*ï€.7‚å+ÒÒZD‡ê¯EN2^Ù¥û_ËÚ·:â˜#C×7s¶¶—<C2B6>;6Å`¼õ»0j‚^3»ô‰~ç,(ü¼ú@£?ê¦ôȽüÙÊFy–ñ·i?ç?)«*ï-Î¯WªÆøBù.{D•²T|Ôû±Wæ(Íž•Äm1‘êQ@{¶™ ³Ñ§f26<°t4ÜüoA|›n<E280BA>æX,Í„ •ëðåq†õ
|
||||
þôóìá¾R!ÞMH6mM¤4Ó²Îמÿí=ñßÌ{"°5;GuŠ†_…¾¢O›F{ãÉŒ\\¸×!EÅ^fõfU,ÓDG´¤±9Ǽ<C387>€Ö K(_^`“Ÿ£½ÙÛ‡PÑRoá;kýÎZaß¼,ðûî@¶ïÎç,°°óB/ê<ƒÀ–óŒ9V<0E>¢ãKØ-ƒ.ÑKξ½éORçE[~×Þê¾uÖM-¯Ör|ðý¬{qa×ÁFÐÞ<C390>' . "\0" . 'H\'Ëõî‘倱ìܯc,F<>µqO/‰YÎ
‰2W†_ÉUá[»,äPPvv>ë¸<|¯q…ïK:÷+•"i°K¹åç ¿á3÷̲£˜ƒ]nMgÛ~×Â:¬Ð×êì
|
||||
›SØ=oß ðã~ƒ<EFBFBD>µ>DèvöÄ–h•ø»7<EFBFBD>»æžz¹¹ ÁJIðÑ
|
||||
¼XË>,!eR?r…µ4j¦à~…åë»êfOšLäk<EFBFBD>ºñgN«yv#¼Tç¸èê<C3A8>ƶ&ê†+B†Zúèùÿü×ÿŽ<‹)â¯ÇÜ\'
|
||||
–ù¯ªûÿ⹃2ÿRMe™½ÓÀN<EFBFBD>›üê¯ÆEèݤž…Zfûæ[Í#Œÿ˜ú–É|L(ZÈ^ƒ©µœc¨þF° ‚¦ëŒ}lƒ©Œ"RîѳÀ±¿^t¬InáÎ' . "\0" . 't¨Xðóoý¶iÔb½In)ÒN–T/ø¹ÿbø—Mœû…ÏýËŽð<C5BD>ã{^»¶æV¯=æçs¼x4ï»D;Ë‚õ¿<C3B5>3x<33>NòŽ`<60>Pö
H#\'õ:ô}h®ÖÁ›Û¼<C39B>û5úÖiîåeàQû
3ì0É*¡‚Ó:E*<EFBFBD>Ù,OÚ™«_{õCî愳$ªúbÃɶ§êòO8 ÈØЗ]7*iÖ‘k„q„³LÕ÷=.;f‘Ö¢«û‘ݼ•8ßì4ó+·^ÜãÎêÜb%×Tg”›qßÌ^øëYk7Þ žµîy\'jöyJéqF@%dQb¦QÓ<EFBFBD> |žòM&>B%I‘ÿAèñ–<EFBFBD>âvRˆl“tº‘®Æ§em²" ÊÔà)bÉŽÊë/WëgÐ6<C390>lÉQ6Qó¢5µ¾)¢…Ž¡
Ó1ŠONç
|
||||
ýû\\çßç:³ÏuæÚ2³¦=íç3m«ä¿MÊ!“òWÄeYè²£¼¸V!ÊbkÂÀµ„ÒxM/Ü}\\õís<C3AD>›éè=‡Ùð<EFBFBD>ZÚÇr™G¿ ‰A†&mãAß~K믬1–à—åm¹<EFBFBD>‰ÜRŒ¥&½Jü]cû\'X\\ öûöúRór²d6×–âjZ ¿ÆI·Òî<C392>ÖnÒ<6E>²%ÕZ´D‹n·UÝN¸*3«,‰ªëŽÛîÅ_.?®5V.?>9¼BÿÝ:ô€ªß©%ë"' . "\0" . 'yRù;ýY,¢Ÿ¸—xãËÞ¿Ó·1|+ÒqÖyaݳšô¬Ö•§]r¯Ž«üÎÆŒf«K³‹µÚ»\'\'#¦v¥\\©˜Ù?RŽÊ^&£w"ðiueâ[ÙËnG¢5Ø‹ª“E
|
||||
XdÈ&*™ƒ·ìÂAqu¡
|
||||
ªÅÏìKîW\\,¸êÚ«Ò;:œôþ·uîÛªµŒ{\\ç)½}d]véž—*d¹¯¾T¡y*Ð`nD¨8S‡çú·h<GGæªîË4˜¼½¿Ì:ïòÁ¬VÄÏ’Oè–D<EFBFBD>¢x=^Š&I.Šï¶Úƒdôºªà¡Ç‰$=§ˆ¼ÂÁ0Éu!A£
Œ.:´¹„mFŠ´3zÎÊ+ú‰½Å÷µ¾ÌÁPb‹™WŠYfe¢4á×Z¾©T’º(—<EFBFBD>‘š§¸ÆÒo8JRRD.½êªœd-"ªÌýo& n’¶ebÕ' . "\0" . 'kÙ†ïQ·#VïWøaäÍ·”¥ÙýDã¬U“ÂG|ýRoñ‹#2ƒOeË,É0‡„*Ø–2Šü£|@,~;9onÛÝù-–Ä3Mfeu6n9<><39>Àý[E' . "\0" . 'U±ÓbÐò‰ö1ùMó8Ø£þ~/®µ™ÅñcF‹Ú
|
||||
nýÓÛ¥=ÌG/ëÝ¥¶Ð—¯sxQ¥és&-qô’ü²Nǜǧ Ù<89>9m<EFBFBD>þøbßiÓ’tÔn<EFBFBD>¿ý!—qW¾jäÙëayùÄ>%ù
À=«ÇÑÁ~_0Doö_º—”IÄ Úúɹüúú^þÔZÿµ+ܺg…9¾Ï·?ß$í_ñõÍØøµû½ýkVˆ“ý×ìàÙñ=ê³"¾¶£¿r?ïÓMë<1A>(|½Ë½H\'Ã
|
||||
HÏL‘h¼ÿv¬=Âêïi×ѱ¾‘¯,,ÈuÍÁ¡XÖ±¼‚gPéG²R`tnĤ»ãÚ5X£Áó"ºà.Ýq<C39D>J”éQ¢ÔY°R²N"wñ¶¯TLۺϊ\\ŽF7iÞŸx\'B¾ö©‘pIš!Þ$¿uoì^¦=‘Ñ…ÛMåØz§Ä®tN©tªzt#Te®\']×8FC4©Ž”<C5BD>”Ñ,~V“0³Cd]^l#ëvW¥¹Èny„¯Àú¤6ˆêºòE§¸Ž~ö«O]spªÐNÓ"íÀÕ<C380>´<03>6©ùA¹u5W*J¿ï&ðç•áJ7zÕì7‹X–¯Çâ?eL!¼kµhƒñü {¾:røŸµ÷ÎŽÞFÇûgçÑÁþñqBSGÏÚRç¾$¥[ß[È.—ö–ê¨f+ôPµ.ê1Ÿ“l’æV~v¾zNsÄX˜P;h“×3<C397>îÿñðtÿÇÃèå»Óýó£“7²Kì
|
||||
¢×+<EFBFBD>Ðé•HQ½Â‹‡²ËÓQŸ½ü]¾ñï×ø÷<EFBFBD>ø÷ù‹Ø:¹€V½>|}rúçèÝ™hšê+T4L‡õ8jš¤:Ù@ø‡¨7ÈÄê:È®+_Ûàç!¦©";z<1C>³Û
|
||||
ÀÀŽØE¬cÔ˜:¶÷b¹EÖÐ0ò–<EFBFBD>Ó¿†8ª@†ÀbՅЋV¨FÊ<EFBFBD>Óä½6%-Ua-Ô·‡ûˆfБ,@H„›CMjéבT÷iqº2,Xµ-I#!"’‡±a;<F6¨mðQ<C3B0>—BÚRÉk›ßêÎK7IßþŸ!¼å=<3D>o«œ=ëNöPÿz“‰é{<7B>Ïc‘þ…±¨¸–€4M:“òNÏ–Õ6ûöB ê®<' . "\0" . '¶—ATµË½' . "\0" . '-ÝÒÍ&GƶB4¶@°5
|
||||
£6@LK*PNÐÿ•¡Ó¸UçÛGO›<EFBFBD>þ›ÄJûí›M;6ßúÈx' . "\0" . '¯ðÁÌÂÑƾ€ŽA÷d†g–iý”=;²šNáÀx%ÆÊpl<¿Ê²(yÒÚçÊ‹h’A÷y[è+hà
|
||||
)f¯¾reÂÕté&ºœ-ôšd0Ä0IAõȇՄjÔ/¢.hÆBoÒzÞöźßNE‹‡ÙÚ
|
||||
Òh½Þ¨GïŠ4 ÚPçßàØ<EFBFBD>«ÌÛWo7×£çÑaëÝÙáiëåáÛÓÃýó×QS¥½99?:8„—õÑìUÿ-ÿ¥ä¡ý•q¯“ˆ³Zú‰³ÉøËÈÄò:ŠZU+×wf©šúñ?¨+¿§Ð}' . "\0" . 'àz ÷Ïq üßA3šÝÿ_^eR”å[üŽ©Å}ÿ[me€Tñ5-?' . "\0" . '6Ùèοš#Ó\'¦ß¸O½¥ñ«ÛY©Ú*°‘«<E28098> ‡”\'<27>°èƒûKËlu 1šÑwJ™ó¡uìDãæh¸Ý]Ëô/ƒ½éóºéˆÂa
ªØ•\\Ý4*¶òôCŠoÞ¸¼Rúh×2ºµH ¿|Ó¿¾ˆ?:!ÅývøÀh¨3žÙ§%TLHÒÞÛú¶\\YŸì†yî":wæ&‘…+Ã^z<>2a¢fÍ]èPµnÚWZ½’ "eÈÊjU¯ì\\6V|î‚éÏ
|
||||
DˆKÌH)y2º:þïéc¤÷é\'<EFBFBD>Qt¿×e€d™&V·ßÿ^™ÇÞùê™p¾¸û¹}oBts“.èÛᘠ–ð°®O<ÃG}Ä? ÑÄ?9üûñp.¾{Ÿ‹=”^pì3ÃÏ
|
||||
2|-U(8ûI¨f›aéF
|
||||
´¤öXW <EFBFBD>U»ÛY÷“:.wš Úæ4€ú—Ä£°N2¡_Ø–«7N•÷é~*¦[$%
|
||||
¡Z¨ßB§ñõEI“2…I⚯3I<¶Þ$k$ÍÉ´Òëøá¨C¦1A•;CüyÓ
|
||||
u˜Rs' . "\0" . ' ÷Û15¢Žˆë¡‡+t¨SÙ2;â),ñi2’ÁIq°%œ;^Ï<EFBFBD>–}<EFBFBD>aFÉMD¨²òpÅÔ.äV,T1<EFBFBD>Óë4Òw7›¶upT¨¿¢N~KâàʲÒv; 3Ücº‰1m£Ò^Ï0ÝØš ôiÈž™j¢¨nQE‘Ú©ý8ºŸ²8o2C[*Ñ%ô2êb®$/1 S\\ÞH/)?OÆáÊ ]y-꼨´<EFBFBD>
|
||||
Àå+’®_l:z?ÊnGn)yÍU]\\e!Ïjš‹ØI=aK.dq
Å ÍYd²¹H]@%<EFBFBD>µ¶' . "\0" . 'RßÅÈ]fº¡•ÇKÂHüKËéýïÏé7ñ¾~wà8<EFBFBD>„"ø:¾¨§ˆyñ7èùo÷ÎÿÎU#Œ} /ƳKv,SÞmwgÂ^óvu®ë¼UŸm¦ð¯.`ýo_½<5F>`ÊGB¦Âõm×´ÁЪ{öv¼‚u–$ïÕ›«ò: 9뤹!¿ðµ¶Pi¼¾nÝßøRLÌ€F·*J<>Ô…
|
||||
P^t' . "\0" . '#sq®¤Ð/y—î·é~«;jf‰€A Ì=cÜ2”E»3$ºGÜ»<C39C>À©¯ã±À4ñ‹ãýƒ?<1F><>¾ŒË£áÍ ä\\¿Ýÿ.”|yøöüUt|ôúèüË(9ÛÃædô5l(</’ÝbÄTñîbæ±câÿ8+<12>Er\'úÜŒÊ:,s‚j}<7D>C†ò<E280A0>íôG^vàÜÿæ“èôðàÝéÙÑÉ›/›B¨šý‹“°ÉCjêPÃnŒ4ÖèGÑjÕDJ3¨<33>˜iè4¹º3?ò>hNúüê
|
||||
Uæ¡««H#Ë}ÑThÉQ&!(âé»®LˆŸ@ùZä$KM9 uìjbOo<4F>A±Û$;Gâq°;\\µ<>ݽ3–"—{ÿ{`<60>Wö…Õê|³ÉbLuvHìªÏ_Ð/†C(¼õz½jGÝ+ƒž#à4‡eï¸ô™eOœ‰Ð w1cv³PºnͶ†éW•ÉÊÇ·ÒnC#…ñ|n“¬{»ê¨<C3AA>ivøÉ›ÊøöÇo¬¿¹#¸oÓ6<C393>DYÉáZ*Õ|!Eˬ¥qö9YPÖÍÃnŸ´9êÕ£GË}îæ£_²(,Þ8‡ÇsSVâ<56>Ý´=½®{Ï›ÛOá´ÎOÿxxz¿<9x÷\'9=99—rFÖ"¶†<Ë&nŸ=‹PZx¿¥äC3‹÷nI—fˆ^ü»¼PèšøŒ¢HF_zø®˜§ý¦š´J[ 4ß_˜Ç8qaTGý¤HéÉÔ¸—·pÚfžÛ{ Q¥#0ýu[ìˬ5väùpq©§4T´zuÝ.€-”þúäåaëüð§s6' . "\0" . '¨øöxÿè
¡Ö9Û{DaS;ƒ~¬Œô<lÐoÑ9hyØÝ•3wvËðÕRði|(#©²}É9¤"V=µ34<33>E¬r¼#ƒ±÷òß…z
OG„‰*QYöCÖïF
Aòð¬Ã1àyø°â¤ì*ƨT?/‰Ž‚â×ïL–v>$y”î~.Ò<EFBFBD> 4î÷4dZý¹…ŽÒÑÔ’ÝnÖÁMV½#ÄÚ$=…SiAÔ¤NØÞˆ¡8P÷JÒºPR&h1EÄäÕE:ÌbFQMêäR¼? >1J"-év {R½«<C2BD>e¬MªŸ÷<C5B8>,uدex
|
||||
W%=èVt#ÿ6MóOÔ<4F>,èEÿD…u!cÂÊD`¾IŠÐ¥ì4¢Œ<>{,fœ °&>|LÔ‰ýMv»T1È:(Á ÄnœTE¢\'¡*E&ŠcK‰Hå<48><C3A5>EHˆÎZzW›d××ƒÔ œÔâ<>l7…á×ïIu\'ã$HÄG"`¡¯µäyZgíiÍ´®ú5®Š’Y-pÀ+E<>Nê®ÌJ¿h\\Ù_Õ‡Y]Y<>û|/a&õDd%@túR_¬ý^%£Ì\\4FdJÍâÅ\'¬Õ?»âZ±›Ë>ì¶rÉóÀ¦ÏN±²²SÕMÍ/Š+Ñœ;ÕZÁ¡¬¡ÕψP´†M»Å•í&²QµÜnC<6E>`€ªb<Ö$ÙU-¤£Sëó¤m5"0Oê*pëY_lŒG×¢Šö<>#ŸÝPöøuGZåï.-‰©Ï>]ð<>l§J<4µ€>üðaþèQ
¸Çi×N²kµh$$<24>Ìb¬µ£ˆ\\ˆ^ÏÝvŠG<EFBFBD>ª…¨(.S\\Õ1HM]¾ã²»Ô†KÈΘæh\'ëk˜úÁjµÚµd”<64>Ò¥»Úðý$¹¶9I…¥gK<67>ÒGK{$§££Ñ›ôöO(ÜýÑUR' . "\0" . 'A¨×5ëQj<EFBFBD>¥ÜÂ<EFBFBD>{!αîÊ<\'·T}d¾Ó¤Ë¿ÑmB$,ᵑÊÒ£
|
||||
ÜTx)–‘ªèçÑÙÉm+DuÉ{¬Ê©”Ëx˜N’Ÿ¬K…œ›Nz+ÛK—qõÑbÓD> ‹œ\'Vì4uþúxѲøN¬SÔ4Õí2œÀŠïËøYg2ÔRšÑj£ñÝR„áPo²<EFBFBD>Xÿw—Γ÷b¡Î†i4Ê&iñ@†HòŸ‚½ŒYÜmZ³D~pœ‚Ôkì:ƒ¬€½¬˜îY>A‡/w}B–,ø"ëö‘]w.®ø2˳êyv[T뀫ÂÐY+„j*°tÒÁ ¸˜\\ÕáÅ©"ÔqÛƒœ Œéqv›æ ´K¨É½ËôÅH½¬ÿóÏôK,P½J~øð<EFBFBD>N—KæêŽÎOL~ªòWVïp‡”îb\\õY2"áßIuGbKŸ%ÏWV›é^ò|µÙ¸3ŠŸ–I±F]\\xDÂ<0C>X¤Í£’5`Âd‡<64>w<EFBFBD><77>ÌH«LH+ ´&(Í+ºÓ°Fù L[pqȯ6+l!Ç¡S’’€<E28099>Ȫ!FJNgé
,’Œ«;Bq±)1(|ý(v4½\'¬6²{†*õ~‚ëLdäÍ3;KÝî’Ø×Õf©;‘¿põ²:ÚAÕnYmRÅ!<Ï+På.V” ¢fVT)wä*%´`j¨t%UYÈÄY@žOšDêjv‘Z¾F$x²›}†9
|
||||
+¤Ý„»[.D<´é”–´Ãôù®ö>ýÔÎ’¼û&ùÐüL\'ÅEóâªF?›<EFBFBD>çÍ«µ^Šš<EFBFBD>°ýJZgHêÇ®À‘Öa+PYªkž‰FɇZDßBC(öý¦<EFBFBD><EFBFBD>•º£:T—j|^¡ž\\Ïz=±„ü ÄñÇ<éU
|
||||
>¿?ÿlH}<-p÷' . "\0" . 'S÷Ó¨XIÃ[ÕîžÈ-R±R€øI`ù&‡QCÕìVPŸŒháE(õj‡MáÌ«ÄëX\'3!æ3PPéw`£èk‚퉆çÙøQE}Ð4x>qªÍì<EFBFBD>vA¬®Hõ£?Á9Àãµ™H
8Ï*
ИkHi.ÖOZ†ºþhw²JÖ' . "\0" . '8x¦éñíÍ.¬kevgL»U€íÄLö»oÃòÉ%„’YI;ɳ™u&´œLvwKØ+¹ªêÁöów“Úƒ†Vï`´<04>¡8@‹€P!ÞS»P.ÕLb(d¸<64>v' . "\0" . '>íBhnIo<49>U*’C:ƒ4ɃP…@)•uÖmì0™J²”ú¬+ÑX")PŒº‹
.G[š<>]ÛmÜÕÖ6Å,¸»S2T¶CÌÕÃbŽÀ¦]t^H<>”²å˜Ò
ˆò¸ó+Y”P?(ëÈ ’ö‡³°íŠ @M,ÃŒ{¤RÏ+j<>£7â _þѧÙ^h]nÌŒ<07>ðøb]b›Èòl~+XS7,E>þ…ªÈOþ-8t«ÍÉ—¼VIâO5‘ÚòR·7Bõ¤jëwÕT…B(“ Ô°zg’þ<>~‚Dï&¬qÿ¬‘Š4ê¦UÃ’]Ö4y˜-(šRéx¸‹¬Ð`·$ÐÞõtYô¥*¶¤H°Ú®Í²ÃžQâÐP0_´ ÛêR
øå[öŠÈ‡Plp–z™ØGæ^ŸÂ2âyykJy>±×ø¾ÂÛHXÖÀ„O¹™³Þ^Èf°÷ꬩ‘Ìœýz^˜æלçÀ«Ê6f‹Ÿ^¿šLƧ©¥b¢$wNV’¥Ï—wƒÛdµ–:ŽºôÕÜ…«±c:Ⱥ
|
||||
‹¸8Àf@‹2]¼Y®1\'/ê-…½¥*œMÃ7•¦uÇpT)ª¸-þîH(öEÕ¨ö^×wÉÄ¢ñrZ®£NÞÅøÇ¥)$ÌjÖuºê,LçuñÛûëR<C3AB>™àÆ’¯–¥"NM‡Ùs' . "\0" . 'ùH(VVõâ’<C3A2>¸ø1ÚåêhqJ+Û5»0 6˜Ô“ÁDnü)…8–ÙÚFj Œ0.4Ò<EFBFBD>=H(qW¢¡V(¿1{~7ÊÔN©ž†UO]¹Ñ=£<>î,gàƒ`¤ÎÚ' . "\0" . '.|j‘ ˆÑìB•‹›~ˆ & UÅÊë!þùÉæ½°®hD
ÑƽeÒ[|ÇÜKkd™^‰Ì±¾f·nu=Ü:k]œ#äƒC‡4}ê<>bëHxž8xÖ¾`lîPg±–À’1v%Ÿw|<7C>^ÀÌcUÆ<55>g‹Å}Ög=<3D>çPÊŲ£V‡õ§ÜÇO¶ø”³ÍªõNoïÁX‹‰Í…èçŸçtW^fC¹ÊDµêotj4W5]|iÂécÈÀJQ¢K]l\'G{j^¾sY\\§¬Š5ž7í.8<ò¢”Þ<E2809D>=ð?Ê<t„Ý£QÒOý¿§]ß{!%ô»Òñ Kºlgpyèï~¾«Mv¿Èo`é¢4<çÕøìL|c¿Z~ƒ&@+&¯R÷Ò]<~ÚŸˆf·§“TlÆʪµæüb±j¤míüõ1ߧxòáÚ*¾£‡·‘^‰ñƒ…«µŠ•SöG?ÿ¬~íåU
|
||||
_»¹<EFBFBD>|TÐÉÇg:ùÐø[4e7»5ýƒ¹$y©„GMŒ„{ö½à:cÀF\'ôȱ¯µý$¨uäÏþhǪñ~ƒ·çøxúÿtè1J•l/[ÀÝJ¶’TWFâïÚDž7›×Yv—nŠœÞn4V6ߧÕGK5<ʬE[›ßU—`W·›' . "\0" . 'âç<C3A2>f%Yɪd¥3Õ£í*0±ƒ,‰ñÙ-Û{êí <20>è…a÷)¨(à=E„CÉÏì½™üº<C3BC>TÖ67kêO£þ´ºƒO!¯ã¤“6E%;òȽ‰gÿ;½¬çÉ°?øÔf£áîXQÿ3:e6×m4›Õ<1C>‹ãÀ<02>*ÐÆzcN;WÌœ&œðSù[4Š7ÛÙ {¤É,<2C>2—$ÿYDâ3µRÈÚæêúøãŽXÓóÞ »]ùØL¦“Ì¢È(»Í“ñÎ<*Þìà9\'}Éj<ue˜ý}¥$ë6m¿ïOL.µß%I²#é¶Ú]MWSVYd<59>´|ngWŠ›Ü¢Û¢sÑšø“§]Vƪº<C2AA>‚뮕”ô„šÆR¢ï<C3AF>@HÄRÔ€þßÅV\\_.FfE¤ìÈŸyÒíO‹fÃîÍNÄô ?gù$M,Æ;ÈFE&ŒZô:
2ñO6J:âßãi§ßM"ÊOÅw¿<77>;ˆ' . "\0" . 'x™þ5ùã4:KF…LyÑŸˆå2M†Ñ(Ï9<ÔOóèMz[‹4¯Ãs˜y¿·>Á+7Ä™«›‚k†B3³±3Ë4tX²´XįGÍAÚ›0š–ÐÛb4|üºNÇnöhz³m±Aoþ“´l®
|
||||
D¢ÏbQù]÷ üç50‹Ù´Ú<EFBFBD>‹žzž
|
||||
ÂgÓIÑï‚;†˜„j>ÐlPÝÛ´Þ¼ÀÍ\'€Ïrôeû7s4ƒþ^w°×<C2B0>ÈÉ2ÕÊáÖ_Òml×ÔŸF}›ÏQ<C38F>+ê>ë‘‹à¿Õ5·‡uf2ÚƒX†<58>v3<76>Ê+žæƒÊeka³?L®ÓÇŇëG‡ƒ<E280A1>餷]{&¾"ñ5*Ä’0™Œ›<C592>ßÞÞÖo×ëY~ýxÑh' . "\0" . 'üR¯†½È>î.á$-Ûl,í=ƒÎFb1y½=¹Yݬ<„õ¹±IŸ+v®ü\\]¬nG«ÛÃñOCüÿ.A¸ôÁîÒwkë›››K<E280BA>ºV׶B% äÐût}|v—ÖTG<02>Ù»Œ«‚«Vè*VD‡@îÇ°' . "\0" . 'FÀaÑ$“<EFBFBD>¨¼Ó¡ã¾q†·<EFBFBD>4÷G8ÿˆ›ù,$#6!Åè@&ÈuÁ|“¾Ð’ä”ö»ÝAZ>ÂÄ®åã¬ØY<C398>¶àÖ¢<C396>kW#ZÛü®s]{<7B>„±Ûù%5l6ªaV/ìzföç‰ÕF…ÚÌòï¹ðO:,¡¸Ò³GÛ…,á#èY9Û>êv?«náÒ#×
|
||||
X=q‰ë&ÅMª×¸EøŸ£DñBbS³?£Dë¤[½RõÕZñ\\,<]£³U®¨Û}ö<EFBFBD>‡•ër]O軟íU^é zýÒ«õ&×k?5oÄx§#EÞI6ÚJ©&Ð:luâV”\\Áb2ÍYÈË×oÒ‘e¹"è̳f[¥bG3]ž0sÏi”¯¾”6MJJµÏ™Ã‹!UÆÙrX…çë|Ö‘SÆp“
ø' . "\0" . '{+7£3_Ê\'I„ÏÁ‘è¦/Oí®ÈUbNÿ×B…À¿í³f
#ÌÁ²ÁçMPl¬ñ³¥<C2B3>öúœ85z¹£ÂšÜ]붟 <20>-,6ÃH\\zC4™dC’nâ\'H7ªOŸ]
´”<EFBFBD>N\'§æ
ÇûU¡1^\\šË-ÙBÍ°øÏ¥¢ˆÊ6BR¥\\19UVãtð>û£ÅWÓµ
³¿ãBUvÌYKE+g´Ñ3€ëÁY¶kÚ .,s<EFBFBD>•SH.Lš¬ši
|
||||
<¿ù–wmÃe¸|Q?[å³=Ãɧqc6{ª:›xÉn}Æ«–P-ÝB9Ø›‚tZŒÜzj½ðüY
|
||||
«-C@üä± &fI0”¬Îªµ<EFBFBD>N‡§¢²ýKhßkÑšR½µŽüÃ?,¡r,' . "\0" . 'nV?¬Ý¬þqõUãï\\ååm£ÀÓ CD]Äz.¹\';5$¢*=$Nµ0<>á$ã"mª;nn/g@¸¸[5o`yEaàኾŸ±ÌDwÂg$—ëÍx¥º jñy(x„õL[j¤~‡«“NMï<4D>‹~0hú5Mº5?íæs)²f»,ÝIAª¸ù,…0Þµ<>Oç`{<KV@À•*Ъ–<C2AA>Tœ¡;©b{Üdä€zP°å&,P' . "\0" . '#(GpÆtÚc9' . "\0" . '¡âR/Ý›x†_®F³"†¤“ò°i oYΑҞÜdÂÝ6‘>±ÙYGª`h©·D=,<3`¥½ÙVÚvdžf2™ä•`ñªªRãjÔ7Ó¡ÖJ¬D_5“ÌNÌ1£q kè[‡Pp—¿±ŽÞÜá[£ákouÒnÛZQ˜…™f™¥¡®Èqß^ºñt«&Az¹+,[*Ükë
³êu{[éúW7€Ìã³6´±¶eœQI\\›3Zmí|[Í\\ÛÔKgPg%#òœš>»ÆýEuK_.U]亮JŒ4<4¢òßûµÛ<C2B5>Y®Š7C+ÓR-õLªø3ôA¶õ ¥¯µËÍ™…-y8C\'œ-™˜(žcâèõü5î–$ȇ^<5E>Û*l<>3‡Ú³ÿ`]66Áo{fÑñ{Y®ÏÖª§C gÒñQqG³ÔÖ^g^8`4Kævz<76>ù«¾MÌà¯Ík%<25>{AÁŸ£Ø„•¦c¹óMª‡<C2AA>r®xv4¬:<3A>ÂáPò?âÚTwþãÿÁˆÃm'));// |