the whole shebang

This commit is contained in:
daniel committed 2014-11-25 16:42:40 +01:00
1 parent 7f74c0613e
commit ab1334c0cf
3686 files changed
+496409 -1

No files matched your search

+223
View File
@@ -0,0 +1,223 @@
<?php // vi: set fenc=utf-8 ts=4 sw=4 et:
/*
* Copyright (C) 2013 Nicolas Grekas - p@tchwork.com
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the (at your option):
* Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
* GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
*/
namespace Patchwork\Utf8;
use Normalizer as n;
use Patchwork\Utf8 as u;
class Bootup
{
static function initAll()
{
self::initUtf8Encode();
self::initMbstring();
self::initIconv();
self::initExif();
self::initIntl();
self::initLocale();
}
static function initUtf8Encode()
{
function_exists('utf8_encode') or require __DIR__ . '/Bootup/utf8_encode.php';
}
static function initMbstring()
{
if (extension_loaded('mbstring'))
{
if ( ((int) ini_get('mbstring.encoding_translation') || in_array(strtolower(ini_get('mbstring.encoding_translation')), array('on', 'yes', 'true')))
&& !in_array(strtolower(ini_get('mbstring.http_input')), array('pass', '8bit', 'utf-8')) )
{
user_error('php.ini settings: Please disable mbstring.encoding_translation or set mbstring.http_input to "pass"', E_USER_WARNING);
}
if (MB_OVERLOAD_STRING & (int) ini_get('mbstring.func_overload'))
{
user_error('php.ini settings: Please disable mbstring.func_overload', E_USER_WARNING);
}
mb_regex_encoding('UTF-8');
ini_set('mbstring.script_encoding', 'pass');
if ('utf-8' !== strtolower(mb_internal_encoding()))
{
mb_internal_encoding('UTF-8');
ini_set('mbstring.internal_encoding', 'UTF-8');
}
if ('none' !== strtolower(mb_substitute_character()))
{
mb_substitute_character('none');
ini_set('mbstring.substitute_character', 'none');
}
if (!in_array(strtolower(mb_http_output()), array('pass', '8bit')))
{
mb_http_output('pass');
ini_set('mbstring.http_output', 'pass');
}
if (!in_array(strtolower(mb_language()), array('uni', 'neutral')))
{
mb_language('uni');
ini_set('mbstring.language', 'uni');
}
}
else if (!defined('MB_OVERLOAD_MAIL'))
{
require __DIR__ . '/Bootup/mbstring.php';
}
}
static function initIconv()
{
if (extension_loaded('iconv'))
{
if ('UTF-8' !== iconv_get_encoding('input_encoding'))
{
iconv_set_encoding('input_encoding', 'UTF-8');
ini_set('iconv.input_encoding', 'UTF-8');
}
if ('UTF-8' !== iconv_get_encoding('internal_encoding'))
{
iconv_set_encoding('internal_encoding', 'UTF-8');
ini_set('iconv.internal_encoding', 'UTF-8');
}
if ('UTF-8' !== iconv_get_encoding('output_encoding'))
{
iconv_set_encoding('output_encoding' , 'UTF-8');
ini_set('iconv.output_encoding', 'UTF-8');
}
}
else if (!defined('ICONV_IMPL'))
{
require __DIR__ . '/Bootup/iconv.php';
}
}
static function initExif()
{
if (extension_loaded('exif'))
{
if (ini_get('exif.encode_unicode') && 'UTF-8' !== strtoupper(ini_get('exif.encode_unicode')))
{
ini_set('exif.encode_unicode', 'UTF-8');
}
if (ini_get('exif.encode_jis') && 'UTF-8' !== strtoupper(ini_get('exif.encode_jis')))
{
ini_set('exif.encode_jis', 'UTF-8');
}
}
}
static function initIntl()
{
if (defined('GRAPHEME_CLUSTER_RX')) return;
preg_match('/^.$/u', '§') or user_error('PCRE is compiled without UTF-8 support', E_USER_WARNING);
extension_loaded('intl') or require __DIR__ . '/Bootup/intl.php';
if (PCRE_VERSION < '8.32')
{
// (CRLF|([ZWNJ-ZWJ]|T+|L*(LV?V+|LV|LVT)T*|L+|[^Control])[Extend]*|[Control])
// This regular expression is not up to date with the latest unicode grapheme cluster definition.
// However, until http://bugs.exim.org/show_bug.cgi?id=1279 is fixed, it's still better than \X
define('GRAPHEME_CLUSTER_RX', '(?:\r\n|(?:[ -~\x{200C}\x{200D}]|[ᆨ-ᇹ]+|[ᄀ-ᅟ]*(?:[가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기까깨꺄꺠꺼께껴꼐꼬꽈꽤꾀꾜꾸꿔꿰뀌뀨끄끠끼나내냐냬너네녀녜노놔놰뇌뇨누눠눼뉘뉴느늬니다대댜댸더데뎌뎨도돠돼되됴두둬뒈뒤듀드듸디따때땨떄떠떼뗘뗴또똬뙈뙤뚀뚜뚸뛔뛰뜌뜨띄띠라래랴럐러레려례로롸뢔뢰료루뤄뤠뤼류르릐리마매먀먜머메며몌모뫄뫠뫼묘무뭐뭬뮈뮤므믜미바배뱌뱨버베벼볘보봐봬뵈뵤부붜붸뷔뷰브븨비빠빼뺘뺴뻐뻬뼈뼤뽀뽜뽸뾔뾰뿌뿨쀄쀠쀼쁘쁴삐사새샤섀서세셔셰소솨쇄쇠쇼수숴쉐쉬슈스싀시싸쌔쌰썌써쎄쎠쎼쏘쏴쐐쐬쑈쑤쒀쒜쒸쓔쓰씌씨아애야얘어에여예오와왜외요우워웨위유으의이자재쟈쟤저제져졔조좌좨죄죠주줘줴쥐쥬즈즤지짜째쨔쨰쩌쩨쪄쪠쪼쫘쫴쬐쬬쭈쭤쮀쮜쮸쯔쯰찌차채챠챼처체쳐쳬초촤쵀최쵸추춰췌취츄츠츼치카캐캬컈커케켜켸코콰쾌쾨쿄쿠쿼퀘퀴큐크킈키타태탸턔터테텨톄토톼퇘퇴툐투퉈퉤튀튜트틔티파패퍄퍠퍼페펴폐포퐈퐤푀표푸풔풰퓌퓨프픠피하해햐햬허헤혀혜호화홰회효후훠훼휘휴흐희히]?[ᅠ-ᆢ]+|[가-힣])[ᆨ-ᇹ]*|[ᄀ-ᅟ]+|[^\p{Cc}\p{Cf}\p{Zl}\p{Zp}])[\p{Mn}\p{Me}\x{09BE}\x{09D7}\x{0B3E}\x{0B57}\x{0BBE}\x{0BD7}\x{0CC2}\x{0CD5}\x{0CD6}\x{0D3E}\x{0D57}\x{0DCF}\x{0DDF}\x{200C}\x{200D}\x{1D165}\x{1D16E}-\x{1D172}]*|[\p{Cc}\p{Cf}\p{Zl}\p{Zp}])');
}
else
{
define('GRAPHEME_CLUSTER_RX', '\X');
}
}
static function initLocale()
{
// With non-UTF-8 locale, basename() bugs.
// Be aware that setlocale() can be slow.
// You'd better properly configure your LANG environment variable to an UTF-8 locale.
if ('' === basename('§'))
{
setlocale(LC_ALL, 'C.UTF-8', 'C');
setlocale(LC_CTYPE, 'en_US.UTF-8', 'fr_FR.UTF-8', 'es_ES.UTF-8', 'de_DE.UTF-8', 'ru_RU.UTF-8', 'pt_BR.UTF-8', 'it_IT.UTF-8', 'ja_JP.UTF-8', 'zh_CN.UTF-8', 0);
}
}
static function filterRequestUri()
{
// Ensures the URL is well formed UTF-8
// When not, assumes Windows-1252 and redirects to the corresponding UTF-8 encoded URL
if (isset($_SERVER['REQUEST_URI']) && !preg_match('//u', urldecode($a = $_SERVER['REQUEST_URI'])))
{
if ($a === u::utf8_decode($a))
{
$a = preg_replace_callback(
'/(?:%[89A-F][0-9A-F])+/i',
function($m) {return urlencode(u::utf8_encode(urldecode($m[0])));},
$a
);
}
else $a = '/';
header('HTTP/1.1 301 Moved Permanently');
header('Location: ' . $a);
exit;
}
}
static function filterRequestInputs($normalization_form = /* n::NFC = */ 4, $pre_lead_comb = '◌')
{
// Ensures inputs are well formed UTF-8
// When not, assumes Windows-1252 and converts to UTF-8
// Tests only values, not keys
$a = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST, &$_ENV);
foreach ($_FILES as &$v) $a[] = array(&$v['name'], &$v['type']);
$len = count($a);
for ($i = 0; $i < $len; ++$i)
{
foreach ($a[$i] as &$v)
{
if (is_array($v)) $a[$len++] =& $v;
else if (preg_match('/[\x80-\xFF]/', $v))
{
if (n::isNormalized($v, $normalization_form)) $w = '';
else
{
$w = n::normalize($v, $normalization_form);
if (false === $w) $v = u::utf8_encode($v);
else $v = $w;
}
if ($v[0] >= "\x80" && false !== $w && isset($pre_lead_comb[0]) && preg_match('/^\p{Mn}/u', $v))
{
// Prevent leading combining chars
// for NFC-safe concatenations.
$v = $pre_lead_comb . $v;
}
}
}
reset($a[$i]);
unset($a[$i]);
}
}
}
@@ -0,0 +1,48 @@
<?php // vi: set fenc=utf-8 ts=4 sw=4 et:
/*
* Copyright (C) 2013 Nicolas Grekas - p@tchwork.com
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the (at your option):
* Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
* GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
*/
use Patchwork\PHP\Shim as s;
const ICONV_IMPL = 'Patchwork';
const ICONV_VERSION = '1.0';
const ICONV_MIME_DECODE_STRICT = 1;
const ICONV_MIME_DECODE_CONTINUE_ON_ERROR = 2;
function iconv($from, $to, $s) {return s\Iconv::iconv($from, $to, $s);};
function iconv_get_encoding($type = 'all') {return s\Iconv::iconv_get_encoding($type);};
function iconv_set_encoding($type, $charset) {return s\Iconv::iconv_set_encoding($type, $charset);};
function iconv_mime_encode($name, $value, $pref = INF) {return s\Iconv::iconv_mime_encode($name, $value, $pref);};
function ob_iconv_handler($buffer, $mode) {return s\Iconv::ob_iconv_handler($buffer, $mode);};
function iconv_mime_decode_headers($encoded_headers, $mode = 0, $charset = INF) {return s\Iconv::iconv_mime_decode_headers($encoded_headers, $mode, $charset);};
if (extension_loaded('mbstring'))
{
function iconv_strlen($s, $enc = INF) {return mb_strlen($s, $enc);};
function iconv_strpos($s, $needle, $offset = 0, $enc = INF) {return mb_strpos($s, $needle, $offset, $enc);};
function iconv_strrpos($s, $needle, $enc = INF) {return mb_strrpos($s, $needle, $enc);};
function iconv_substr($s, $start, $length = 2147483647, $enc = INF) {return mb_substr($s, $start, $length, $enc);};
function iconv_mime_decode($encoded_headers, $mode = 0, $charset = INF) {return mb_decode_mimeheader($encoded_headers, $mode, $charset);};
}
else
{
if (extension_loaded('xml'))
{
function iconv_strlen($s, $enc = INF) {return s\Iconv::strlen1($s, $enc);};
}
else
{
function iconv_strlen($s, $enc = INF) {return s\Iconv::strlen2($s, $enc);};
}
function iconv_strpos($s, $needle, $offset = 0, $enc = INF) {return s\Mbstring::mb_strpos($s, $needle, $offset, $enc);};
function iconv_strrpos($s, $needle, $enc = INF) {return s\Mbstring::mb_strrpos($s, $needle, $enc);};
function iconv_substr($s, $start, $length = 2147483647, $enc = INF) {return s\Mbstring::mb_substr($s, $start, $length, $enc);};
function iconv_mime_decode($encoded_headers, $mode = 0, $charset = INF) {return s\Iconv::iconv_mime_decode($encoded_headers, $mode, $charset);};
}
@@ -0,0 +1,28 @@
<?php // vi: set fenc=utf-8 ts=4 sw=4 et:
/*
* Copyright (C) 2013 Nicolas Grekas - p@tchwork.com
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the (at your option):
* Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
* GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
*/
use Patchwork\PHP\Shim as s;
const GRAPHEME_EXTR_COUNT = 0;
const GRAPHEME_EXTR_MAXBYTES = 1;
const GRAPHEME_EXTR_MAXCHARS = 2;
function normalizer_is_normalized($s, $form = s\Normalizer::NFC) {return s\Normalizer::isNormalized($s, $form);};
function normalizer_normalize($s, $form = s\Normalizer::NFC) {return s\Normalizer::normalize($s, $form);};
function grapheme_extract($s, $size, $type = 0, $start = 0, &$next = 0) {return s\Intl::grapheme_extract($s, $size, $type, $start, $next);};
function grapheme_stripos($s, $needle, $offset = 0) {return s\Intl::grapheme_stripos($s, $needle, $offset);};
function grapheme_stristr($s, $needle, $before_needle = false) {return s\Intl::grapheme_stristr($s, $needle, $before_needle);};
function grapheme_strlen($s) {return s\Intl::grapheme_strlen($s);};
function grapheme_strpos($s, $needle, $offset = 0) {return s\Intl::grapheme_strpos($s, $needle, $offset);};
function grapheme_strripos($s, $needle, $offset = 0) {return s\Intl::grapheme_strripos($s, $needle, $offset);};
function grapheme_strrpos($s, $needle, $offset = 0) {return s\Intl::grapheme_strrpos($s, $needle, $offset);};
function grapheme_strstr($s, $needle, $before_needle = false) {return s\Intl::grapheme_strstr($s, $needle, $before_needle);};
function grapheme_substr($s, $start, $len = 2147483647) {return s\Intl::grapheme_substr($s, $start, $len);};
@@ -0,0 +1,40 @@
<?php // vi: set fenc=utf-8 ts=4 sw=4 et:
/*
* Copyright (C) 2013 Nicolas Grekas - p@tchwork.com
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the (at your option):
* Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
* GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
*/
use Patchwork\PHP\Shim as s;
const MB_OVERLOAD_MAIL = 1;
const MB_OVERLOAD_STRING = 2;
const MB_OVERLOAD_REGEX = 4;
const MB_CASE_UPPER = 0;
const MB_CASE_LOWER = 1;
const MB_CASE_TITLE = 2;
function mb_convert_encoding($s, $to, $from = INF) {return s\Mbstring::mb_convert_encoding($s, $to, $from);};
function mb_decode_mimeheader($s) {return s\Mbstring::mb_decode_mimeheader($s);};
function mb_encode_mimeheader($s, $charset = INF, $transfer_enc = INF, $lf = INF, $indent = INF) {return s\Mbstring::mb_encode_mimeheader($s, $charset, $transfer_enc, $lf, $indent);};
function mb_convert_case($s, $mode, $enc = INF) {return s\Mbstring::mb_convert_case($s, $mode, $enc);};
function mb_internal_encoding($enc = INF) {return s\Mbstring::mb_internal_encoding($enc);};
function mb_list_encodings() {return s\Mbstring::mb_list_encodings();};
function mb_parse_str($s, &$result = array()) {return parse_str($s, $result);};
function mb_strlen($s, $enc = INF) {return s\Mbstring::mb_strlen($s, $enc);};
function mb_strpos($s, $needle, $offset = 0, $enc = INF) {return s\Mbstring::mb_strpos($s, $needle, $offset, $enc);};
function mb_strtolower($s, $enc = INF) {return s\Mbstring::mb_strtolower($s, $enc);};
function mb_strtoupper($s, $enc = INF) {return s\Mbstring::mb_strtoupper($s, $enc);};
function mb_substitute_character($char = INF) {return s\Mbstring::mb_substitute_character($char);};
function mb_substr_count($s, $needle) {return substr_count($s, $needle);};
function mb_substr($s, $start, $length = 2147483647, $enc = INF) {return s\Mbstring::mb_substr($s, $start, $length, $enc);};
function mb_stripos($s, $needle, $offset = 0, $enc = INF) {return s\Mbstring::mb_stripos($s, $needle, $offset, $enc);};
function mb_stristr($s, $needle, $part = false, $enc = INF) {return s\Mbstring::mb_stristr($s, $needle, $part, $enc);};
function mb_strrchr($s, $needle, $part = false, $enc = INF) {return s\Mbstring::mb_strrchr($s, $needle, $part, $enc);};
function mb_strrichr($s, $needle, $part = false, $enc = INF) {return s\Mbstring::mb_strrichr($s, $needle, $part, $enc);};
function mb_strripos($s, $needle, $offset = 0, $enc = INF) {return s\Mbstring::mb_strripos($s, $needle, $offset, $enc);};
function mb_strrpos($s, $needle, $offset = 0, $enc = INF) {return s\Mbstring::mb_strrpos($s, $needle, $offset, $enc);};
function mb_strstr($s, $needle, $part = false, $enc = INF) {return s\Mbstring::mb_strstr($s, $needle, $part, $enc);};
@@ -0,0 +1,14 @@
<?php // vi: set fenc=utf-8 ts=4 sw=4 et:
/*
* Copyright (C) 2013 Nicolas Grekas - p@tchwork.com
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the (at your option):
* Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
* GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
*/
use Patchwork\PHP\Shim as s;
function utf8_encode($s) {return s\Xml::utf8_encode($s);};
function utf8_decode($s) {return s\Xml::utf8_decode($s);};
@@ -0,0 +1 @@
a:2:{i:0;a:104:{i:0;s:2:"ß";i:1;s:2:"İ";i:2;s:2:"ʼn";i:3;s:2:"ǰ";i:4;s:2:"ΐ";i:5;s:2:"ΰ";i:6;s:2:"և";i:7;s:3:"ẖ";i:8;s:3:"ẗ";i:9;s:3:"ẘ";i:10;s:3:"ẙ";i:11;s:3:"ẚ";i:12;s:3:"ẞ";i:13;s:3:"ὐ";i:14;s:3:"ὒ";i:15;s:3:"ὔ";i:16;s:3:"ὖ";i:17;s:3:"ᾀ";i:18;s:3:"ᾁ";i:19;s:3:"ᾂ";i:20;s:3:"ᾃ";i:21;s:3:"ᾄ";i:22;s:3:"ᾅ";i:23;s:3:"ᾆ";i:24;s:3:"ᾇ";i:25;s:3:"ᾈ";i:26;s:3:"ᾉ";i:27;s:3:"ᾊ";i:28;s:3:"ᾋ";i:29;s:3:"ᾌ";i:30;s:3:"ᾍ";i:31;s:3:"ᾎ";i:32;s:3:"ᾏ";i:33;s:3:"ᾐ";i:34;s:3:"ᾑ";i:35;s:3:"ᾒ";i:36;s:3:"ᾓ";i:37;s:3:"ᾔ";i:38;s:3:"ᾕ";i:39;s:3:"ᾖ";i:40;s:3:"ᾗ";i:41;s:3:"ᾘ";i:42;s:3:"ᾙ";i:43;s:3:"ᾚ";i:44;s:3:"ᾛ";i:45;s:3:"ᾜ";i:46;s:3:"ᾝ";i:47;s:3:"ᾞ";i:48;s:3:"ᾟ";i:49;s:3:"ᾠ";i:50;s:3:"ᾡ";i:51;s:3:"ᾢ";i:52;s:3:"ᾣ";i:53;s:3:"ᾤ";i:54;s:3:"ᾥ";i:55;s:3:"ᾦ";i:56;s:3:"ᾧ";i:57;s:3:"ᾨ";i:58;s:3:"ᾩ";i:59;s:3:"ᾪ";i:60;s:3:"ᾫ";i:61;s:3:"ᾬ";i:62;s:3:"ᾭ";i:63;s:3:"ᾮ";i:64;s:3:"ᾯ";i:65;s:3:"ᾲ";i:66;s:3:"ᾳ";i:67;s:3:"ᾴ";i:68;s:3:"ᾶ";i:69;s:3:"ᾷ";i:70;s:3:"ᾼ";i:71;s:3:"ῂ";i:72;s:3:"ῃ";i:73;s:3:"ῄ";i:74;s:3:"ῆ";i:75;s:3:"ῇ";i:76;s:3:"ῌ";i:77;s:3:"ῒ";i:78;s:3:"ΐ";i:79;s:3:"ῖ";i:80;s:3:"ῗ";i:81;s:3:"ῢ";i:82;s:3:"ΰ";i:83;s:3:"ῤ";i:84;s:3:"ῦ";i:85;s:3:"ῧ";i:86;s:3:"ῲ";i:87;s:3:"ῳ";i:88;s:3:"ῴ";i:89;s:3:"ῶ";i:90;s:3:"ῷ";i:91;s:3:"ῼ";i:92;s:3:"ff";i:93;s:3:"fi";i:94;s:3:"fl";i:95;s:3:"ffi";i:96;s:3:"ffl";i:97;s:3:"ſt";i:98;s:3:"st";i:99;s:3:"ﬓ";i:100;s:3:"ﬔ";i:101;s:3:"ﬕ";i:102;s:3:"ﬖ";i:103;s:3:"ﬗ";}i:1;a:104:{i:0;s:2:"ss";i:1;s:3:"i̇";i:2;s:3:"ʼn";i:3;s:3:"ǰ";i:4;s:6:"ΐ";i:5;s:6:"ΰ";i:6;s:4:"եւ";i:7;s:3:"ẖ";i:8;s:3:"ẗ";i:9;s:3:"ẘ";i:10;s:3:"ẙ";i:11;s:3:"aʾ";i:12;s:2:"ss";i:13;s:4:"ὐ";i:14;s:6:"ὒ";i:15;s:6:"ὔ";i:16;s:6:"ὖ";i:17;s:5:"ἀι";i:18;s:5:"ἁι";i:19;s:5:"ἂι";i:20;s:5:"ἃι";i:21;s:5:"ἄι";i:22;s:5:"ἅι";i:23;s:5:"ἆι";i:24;s:5:"ἇι";i:25;s:5:"ἀι";i:26;s:5:"ἁι";i:27;s:5:"ἂι";i:28;s:5:"ἃι";i:29;s:5:"ἄι";i:30;s:5:"ἅι";i:31;s:5:"ἆι";i:32;s:5:"ἇι";i:33;s:5:"ἠι";i:34;s:5:"ἡι";i:35;s:5:"ἢι";i:36;s:5:"ἣι";i:37;s:5:"ἤι";i:38;s:5:"ἥι";i:39;s:5:"ἦι";i:40;s:5:"ἧι";i:41;s:5:"ἠι";i:42;s:5:"ἡι";i:43;s:5:"ἢι";i:44;s:5:"ἣι";i:45;s:5:"ἤι";i:46;s:5:"ἥι";i:47;s:5:"ἦι";i:48;s:5:"ἧι";i:49;s:5:"ὠι";i:50;s:5:"ὡι";i:51;s:5:"ὢι";i:52;s:5:"ὣι";i:53;s:5:"ὤι";i:54;s:5:"ὥι";i:55;s:5:"ὦι";i:56;s:5:"ὧι";i:57;s:5:"ὠι";i:58;s:5:"ὡι";i:59;s:5:"ὢι";i:60;s:5:"ὣι";i:61;s:5:"ὤι";i:62;s:5:"ὥι";i:63;s:5:"ὦι";i:64;s:5:"ὧι";i:65;s:5:"ὰι";i:66;s:4:"αι";i:67;s:4:"άι";i:68;s:4:"ᾶ";i:69;s:6:"ᾶι";i:70;s:4:"αι";i:71;s:5:"ὴι";i:72;s:4:"ηι";i:73;s:4:"ήι";i:74;s:4:"ῆ";i:75;s:6:"ῆι";i:76;s:4:"ηι";i:77;s:6:"ῒ";i:78;s:6:"ΐ";i:79;s:4:"ῖ";i:80;s:6:"ῗ";i:81;s:6:"ῢ";i:82;s:6:"ΰ";i:83;s:4:"ῤ";i:84;s:4:"ῦ";i:85;s:6:"ῧ";i:86;s:5:"ὼι";i:87;s:4:"ωι";i:88;s:4:"ώι";i:89;s:4:"ῶ";i:90;s:6:"ῶι";i:91;s:4:"ωι";i:92;s:2:"ff";i:93;s:2:"fi";i:94;s:2:"fl";i:95;s:3:"ffi";i:96;s:3:"ffl";i:97;s:2:"st";i:98;s:2:"st";i:99;s:4:"մն";i:100;s:4:"մե";i:101;s:4:"մի";i:102;s:4:"վն";i:103;s:4:"մխ";}}
@@ -0,0 +1 @@
a:2:{i:0;a:224:{i:0;s:2:"Ð";i:1;s:2:"Ø";i:2;s:2:"Þ";i:3;s:2:"ð";i:4;s:2:"ø";i:5;s:2:"þ";i:6;s:2:"Đ";i:7;s:2:"đ";i:8;s:2:"Ħ";i:9;s:2:"ħ";i:10;s:2:"ı";i:11;s:2:"ĸ";i:12;s:2:"Ŋ";i:13;s:2:"ŋ";i:14;s:2:"Ŧ";i:15;s:2:"ŧ";i:16;s:2:"ƀ";i:17;s:2:"Ɓ";i:18;s:2:"Ƃ";i:19;s:2:"ƃ";i:20;s:2:"Ƈ";i:21;s:2:"ƈ";i:22;s:2:"Ɖ";i:23;s:2:"Ɗ";i:24;s:2:"Ƌ";i:25;s:2:"ƌ";i:26;s:2:"Ɛ";i:27;s:2:"Ƒ";i:28;s:2:"ƒ";i:29;s:2:"Ɠ";i:30;s:2:"ƕ";i:31;s:2:"Ɩ";i:32;s:2:"Ɨ";i:33;s:2:"Ƙ";i:34;s:2:"ƙ";i:35;s:2:"ƚ";i:36;s:2:"Ɲ";i:37;s:2:"ƞ";i:38;s:2:"Ƣ";i:39;s:2:"ƣ";i:40;s:2:"Ƥ";i:41;s:2:"ƥ";i:42;s:2:"ƫ";i:43;s:2:"Ƭ";i:44;s:2:"ƭ";i:45;s:2:"Ʈ";i:46;s:2:"Ʋ";i:47;s:2:"Ƴ";i:48;s:2:"ƴ";i:49;s:2:"Ƶ";i:50;s:2:"ƶ";i:51;s:2:"Ǥ";i:52;s:2:"ǥ";i:53;s:2:"ȡ";i:54;s:2:"Ȥ";i:55;s:2:"ȥ";i:56;s:2:"ȴ";i:57;s:2:"ȵ";i:58;s:2:"ȶ";i:59;s:2:"ȷ";i:60;s:2:"ȸ";i:61;s:2:"ȹ";i:62;s:2:"Ⱥ";i:63;s:2:"Ȼ";i:64;s:2:"ȼ";i:65;s:2:"Ƚ";i:66;s:2:"Ⱦ";i:67;s:2:"ȿ";i:68;s:2:"ɀ";i:69;s:2:"Ƀ";i:70;s:2:"Ʉ";i:71;s:2:"Ɇ";i:72;s:2:"ɇ";i:73;s:2:"Ɉ";i:74;s:2:"ɉ";i:75;s:2:"Ɍ";i:76;s:2:"ɍ";i:77;s:2:"Ɏ";i:78;s:2:"ɏ";i:79;s:2:"ɓ";i:80;s:2:"ɕ";i:81;s:2:"ɖ";i:82;s:2:"ɗ";i:83;s:2:"ɛ";i:84;s:2:"ɟ";i:85;s:2:"ɠ";i:86;s:2:"ɡ";i:87;s:2:"ɢ";i:88;s:2:"ɦ";i:89;s:2:"ɧ";i:90;s:2:"ɨ";i:91;s:2:"ɪ";i:92;s:2:"ɫ";i:93;s:2:"ɬ";i:94;s:2:"ɭ";i:95;s:2:"ɱ";i:96;s:2:"ɲ";i:97;s:2:"ɳ";i:98;s:2:"ɴ";i:99;s:2:"ɶ";i:100;s:2:"ɼ";i:101;s:2:"ɽ";i:102;s:2:"ɾ";i:103;s:2:"ʀ";i:104;s:2:"ʂ";i:105;s:2:"ʈ";i:106;s:2:"ʉ";i:107;s:2:"ʋ";i:108;s:2:"ʏ";i:109;s:2:"ʐ";i:110;s:2:"ʑ";i:111;s:2:"ʙ";i:112;s:2:"ʛ";i:113;s:2:"ʜ";i:114;s:2:"ʝ";i:115;s:2:"ʟ";i:116;s:2:"ʠ";i:117;s:2:"ʣ";i:118;s:2:"ʥ";i:119;s:2:"ʦ";i:120;s:2:"ʪ";i:121;s:2:"ʫ";i:122;s:3:"ᴀ";i:123;s:3:"ᴁ";i:124;s:3:"ᴃ";i:125;s:3:"ᴄ";i:126;s:3:"ᴅ";i:127;s:3:"ᴆ";i:128;s:3:"ᴇ";i:129;s:3:"ᴊ";i:130;s:3:"ᴋ";i:131;s:3:"ᴌ";i:132;s:3:"ᴍ";i:133;s:3:"ᴏ";i:134;s:3:"ᴘ";i:135;s:3:"ᴛ";i:136;s:3:"ᴜ";i:137;s:3:"ᴠ";i:138;s:3:"ᴡ";i:139;s:3:"ᴢ";i:140;s:3:"ᵫ";i:141;s:3:"ᵬ";i:142;s:3:"ᵭ";i:143;s:3:"ᵮ";i:144;s:3:"ᵯ";i:145;s:3:"ᵰ";i:146;s:3:"ᵱ";i:147;s:3:"ᵲ";i:148;s:3:"ᵳ";i:149;s:3:"ᵴ";i:150;s:3:"ᵵ";i:151;s:3:"ᵶ";i:152;s:3:"ᵺ";i:153;s:3:"ᵻ";i:154;s:3:"ᵽ";i:155;s:3:"ᵾ";i:156;s:3:"ᶀ";i:157;s:3:"ᶁ";i:158;s:3:"ᶂ";i:159;s:3:"ᶃ";i:160;s:3:"ᶄ";i:161;s:3:"ᶅ";i:162;s:3:"ᶆ";i:163;s:3:"ᶇ";i:164;s:3:"ᶈ";i:165;s:3:"ᶉ";i:166;s:3:"ᶊ";i:167;s:3:"ᶌ";i:168;s:3:"ᶍ";i:169;s:3:"ᶎ";i:170;s:3:"ᶏ";i:171;s:3:"ᶑ";i:172;s:3:"ᶒ";i:173;s:3:"ᶓ";i:174;s:3:"ᶖ";i:175;s:3:"ᶙ";i:176;s:3:"ẜ";i:177;s:3:"ẝ";i:178;s:3:"ẞ";i:179;s:3:"Ỻ";i:180;s:3:"ỻ";i:181;s:3:"Ỽ";i:182;s:3:"ỽ";i:183;s:3:"Ỿ";i:184;s:3:"ỿ";i:185;s:3:"₠";i:186;s:3:"₢";i:187;s:3:"₣";i:188;s:3:"₤";i:189;s:3:"₧";i:190;s:3:"₹";i:191;s:3:"℞";i:192;s:3:"〇";i:193;s:3:"′";i:194;s:3:"〝";i:195;s:3:"〞";i:196;s:3:"‖";i:197;s:3:"⁅";i:198;s:3:"⁆";i:199;s:3:"⁎";i:200;s:3:"、";i:201;s:3:"。";i:202;s:3:"〈";i:203;s:3:"〉";i:204;s:3:"《";i:205;s:3:"》";i:206;s:3:"〔";i:207;s:3:"〕";i:208;s:3:"〘";i:209;s:3:"〙";i:210;s:3:"〚";i:211;s:3:"〛";i:212;s:3:"︑";i:213;s:3:"︒";i:214;s:3:"︹";i:215;s:3:"︺";i:216;s:3:"︽";i:217;s:3:"︾";i:218;s:3:"︿";i:219;s:3:"﹀";i:220;s:2:"÷";i:221;s:3:"∥";i:222;s:3:"⦅";i:223;s:3:"⦆";}i:1;a:224:{i:0;s:1:"D";i:1;s:1:"O";i:2;s:2:"TH";i:3;s:1:"d";i:4;s:1:"o";i:5;s:2:"th";i:6;s:1:"D";i:7;s:1:"d";i:8;s:1:"H";i:9;s:1:"h";i:10;s:1:"i";i:11;s:1:"q";i:12;s:1:"N";i:13;s:1:"n";i:14;s:1:"T";i:15;s:1:"t";i:16;s:1:"b";i:17;s:1:"B";i:18;s:1:"B";i:19;s:1:"b";i:20;s:1:"C";i:21;s:1:"c";i:22;s:1:"D";i:23;s:1:"D";i:24;s:1:"D";i:25;s:1:"d";i:26;s:1:"E";i:27;s:1:"F";i:28;s:1:"f";i:29;s:1:"G";i:30;s:2:"hv";i:31;s:1:"I";i:32;s:1:"I";i:33;s:1:"K";i:34;s:1:"k";i:35;s:1:"l";i:36;s:1:"N";i:37;s:1:"n";i:38;s:2:"OI";i:39;s:2:"oi";i:40;s:1:"P";i:41;s:1:"p";i:42;s:1:"t";i:43;s:1:"T";i:44;s:1:"t";i:45;s:1:"T";i:46;s:1:"V";i:47;s:1:"Y";i:48;s:1:"y";i:49;s:1:"Z";i:50;s:1:"z";i:51;s:1:"G";i:52;s:1:"g";i:53;s:1:"d";i:54;s:1:"Z";i:55;s:1:"z";i:56;s:1:"l";i:57;s:1:"n";i:58;s:1:"t";i:59;s:1:"j";i:60;s:2:"db";i:61;s:2:"qp";i:62;s:1:"A";i:63;s:1:"C";i:64;s:1:"c";i:65;s:1:"L";i:66;s:1:"T";i:67;s:1:"s";i:68;s:1:"z";i:69;s:1:"B";i:70;s:1:"U";i:71;s:1:"E";i:72;s:1:"e";i:73;s:1:"J";i:74;s:1:"j";i:75;s:1:"R";i:76;s:1:"r";i:77;s:1:"Y";i:78;s:1:"y";i:79;s:1:"b";i:80;s:1:"c";i:81;s:1:"d";i:82;s:1:"d";i:83;s:1:"e";i:84;s:1:"j";i:85;s:1:"g";i:86;s:1:"g";i:87;s:1:"G";i:88;s:1:"h";i:89;s:1:"h";i:90;s:1:"i";i:91;s:1:"I";i:92;s:1:"l";i:93;s:1:"l";i:94;s:1:"l";i:95;s:1:"m";i:96;s:1:"n";i:97;s:1:"n";i:98;s:1:"N";i:99;s:2:"OE";i:100;s:1:"r";i:101;s:1:"r";i:102;s:1:"r";i:103;s:1:"R";i:104;s:1:"s";i:105;s:1:"t";i:106;s:1:"u";i:107;s:1:"v";i:108;s:1:"Y";i:109;s:1:"z";i:110;s:1:"z";i:111;s:1:"B";i:112;s:1:"G";i:113;s:1:"H";i:114;s:1:"j";i:115;s:1:"L";i:116;s:1:"q";i:117;s:2:"dz";i:118;s:2:"dz";i:119;s:2:"ts";i:120;s:2:"ls";i:121;s:2:"lz";i:122;s:1Line truncated