diff --git a/.gitignore b/.gitignore --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,29 @@ # User extensions /externals/includes/* /src/extensions/* + +# XHPAST +/support/xhpast/*.a +/support/xhpast/*.o +/support/xhpast/parser.yacc.output +/support/xhpast/node_names.hpp +/support/xhpast/xhpast +/support/xhpast/xhpast.exe +/src/parser/xhpast/bin/xhpast + +## NOTE: Don't .gitignore these files! Even though they're build artifacts, we +## want to check them in so users can build xhpast without flex/bison. +# /support/xhpast/parser.yacc.cpp +# /support/xhpast/parser.yacc.hpp +# /support/xhpast/scanner.lex.cpp +# /support/xhpast/scanner.lex.hpp + +# This is an OS X build artifact. +/support/xhpast/xhpast.dSYM + +# libphutil +/support/phutiltestlib/.phutil_module_cache + +# This file overrides "default.pem" if present. +/resources/ssl/custom.pem + diff --git a/externals/cldr/cldr_windows_timezones.xml b/externals/cldr/cldr_windows_timezones.xml new file mode 100644 --- /dev/null +++ b/externals/cldr/cldr_windows_timezones.xml @@ -0,0 +1,769 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/externals/jsonlint/LICENSE b/externals/jsonlint/LICENSE new file mode 100644 --- /dev/null +++ b/externals/jsonlint/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011 Jordi Boggiano + +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. diff --git a/externals/jsonlint/src/Seld/JsonLint/JsonParser.php b/externals/jsonlint/src/Seld/JsonLint/JsonParser.php new file mode 100644 --- /dev/null +++ b/externals/jsonlint/src/Seld/JsonLint/JsonParser.php @@ -0,0 +1,488 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Parser class + * + * Example: + * + * $parser = new JsonParser(); + * // returns null if it's valid json, or an error object + * $parser->lint($json); + * // returns parsed json, like json_decode does, but slower, throws exceptions on failure. + * $parser->parse($json); + * + * Ported from https://github.com/zaach/jsonlint + */ +class JsonLintJsonParser +{ + const DETECT_KEY_CONFLICTS = 1; + const ALLOW_DUPLICATE_KEYS = 2; + const PARSE_TO_ASSOC = 4; + + private $lexer; + + private $flags; + private $stack; + private $vstack; // semantic value stack + private $lstack; // location stack + + private $symbols = array( + 'error' => 2, + 'JSONString' => 3, + 'STRING' => 4, + 'JSONNumber' => 5, + 'NUMBER' => 6, + 'JSONNullLiteral' => 7, + 'NULL' => 8, + 'JSONBooleanLiteral' => 9, + 'TRUE' => 10, + 'FALSE' => 11, + 'JSONText' => 12, + 'JSONValue' => 13, + 'EOF' => 14, + 'JSONObject' => 15, + 'JSONArray' => 16, + '{' => 17, + '}' => 18, + 'JSONMemberList' => 19, + 'JSONMember' => 20, + ':' => 21, + ',' => 22, + '[' => 23, + ']' => 24, + 'JSONElementList' => 25, + '$accept' => 0, + '$end' => 1, + ); + + private $terminals_ = array( + 2 => "error", + 4 => "STRING", + 6 => "NUMBER", + 8 => "NULL", + 10 => "TRUE", + 11 => "FALSE", + 14 => "EOF", + 17 => "{", + 18 => "}", + 21 => ":", + 22 => ",", + 23 => "[", + 24 => "]", + ); + + private $productions_ = array( + 0, + array(3, 1), + array(5, 1), + array(7, 1), + array(9, 1), + array(9, 1), + array(12, 2), + array(13, 1), + array(13, 1), + array(13, 1), + array(13, 1), + array(13, 1), + array(13, 1), + array(15, 2), + array(15, 3), + array(20, 3), + array(19, 1), + array(19, 3), + array(16, 2), + array(16, 3), + array(25, 1), + array(25, 3) + ); + + private $table = array(array(3 => 5, 4 => array(1,12), 5 => 6, 6 => array(1,13), 7 => 3, 8 => array(1,9), 9 => 4, 10 => array(1,10), 11 => array(1,11), 12 => 1, 13 => 2, 15 => 7, 16 => 8, 17 => array(1,14), 23 => array(1,15)), array( 1 => array(3)), array( 14 => array(1,16)), array( 14 => array(2,7), 18 => array(2,7), 22 => array(2,7), 24 => array(2,7)), array( 14 => array(2,8), 18 => array(2,8), 22 => array(2,8), 24 => array(2,8)), array( 14 => array(2,9), 18 => array(2,9), 22 => array(2,9), 24 => array(2,9)), array( 14 => array(2,10), 18 => array(2,10), 22 => array(2,10), 24 => array(2,10)), array( 14 => array(2,11), 18 => array(2,11), 22 => array(2,11), 24 => array(2,11)), array( 14 => array(2,12), 18 => array(2,12), 22 => array(2,12), 24 => array(2,12)), array( 14 => array(2,3), 18 => array(2,3), 22 => array(2,3), 24 => array(2,3)), array( 14 => array(2,4), 18 => array(2,4), 22 => array(2,4), 24 => array(2,4)), array( 14 => array(2,5), 18 => array(2,5), 22 => array(2,5), 24 => array(2,5)), array( 14 => array(2,1), 18 => array(2,1), 21 => array(2,1), 22 => array(2,1), 24 => array(2,1)), array( 14 => array(2,2), 18 => array(2,2), 22 => array(2,2), 24 => array(2,2)), array( 3 => 20, 4 => array(1,12), 18 => array(1,17), 19 => 18, 20 => 19 ), array( 3 => 5, 4 => array(1,12), 5 => 6, 6 => array(1,13), 7 => 3, 8 => array(1,9), 9 => 4, 10 => array(1,10), 11 => array(1,11), 13 => 23, 15 => 7, 16 => 8, 17 => array(1,14), 23 => array(1,15), 24 => array(1,21), 25 => 22 ), array( 1 => array(2,6)), array( 14 => array(2,13), 18 => array(2,13), 22 => array(2,13), 24 => array(2,13)), array( 18 => array(1,24), 22 => array(1,25)), array( 18 => array(2,16), 22 => array(2,16)), array( 21 => array(1,26)), array( 14 => array(2,18), 18 => array(2,18), 22 => array(2,18), 24 => array(2,18)), array( 22 => array(1,28), 24 => array(1,27)), array( 22 => array(2,20), 24 => array(2,20)), array( 14 => array(2,14), 18 => array(2,14), 22 => array(2,14), 24 => array(2,14)), array( 3 => 20, 4 => array(1,12), 20 => 29 ), array( 3 => 5, 4 => array(1,12), 5 => 6, 6 => array(1,13), 7 => 3, 8 => array(1,9), 9 => 4, 10 => array(1,10), 11 => array(1,11), 13 => 30, 15 => 7, 16 => 8, 17 => array(1,14), 23 => array(1,15)), array( 14 => array(2,19), 18 => array(2,19), 22 => array(2,19), 24 => array(2,19)), array( 3 => 5, 4 => array(1,12), 5 => 6, 6 => array(1,13), 7 => 3, 8 => array(1,9), 9 => 4, 10 => array(1,10), 11 => array(1,11), 13 => 31, 15 => 7, 16 => 8, 17 => array(1,14), 23 => array(1,15)), array( 18 => array(2,17), 22 => array(2,17)), array( 18 => array(2,15), 22 => array(2,15)), array( 22 => array(2,21), 24 => array(2,21)), + ); + + private $defaultActions = array( + 16 => array(2, 6) + ); + + /** + * @param string $input JSON string + * @return null|JsonLintParsingException null if no error is found, a JsonLintParsingException containing all details otherwise + */ + public function lint($input) + { + try { + $this->parse($input); + } catch (JsonLintParsingException $e) { + return $e; + } + } + + /** + * @param string $input JSON string + * @return mixed + * @throws JsonLintParsingException + */ + public function parse($input, $flags = 0) + { + $this->failOnBOM($input); + + $this->flags = $flags; + + $this->stack = array(0); + $this->vstack = array(null); + $this->lstack = array(); + + $yytext = ''; + $yylineno = 0; + $yyleng = 0; + $recovering = 0; + $TERROR = 2; + $EOF = 1; + + $this->lexer = new JsonLintLexer(); + $this->lexer->setInput($input); + + $yyloc = $this->lexer->yylloc; + $this->lstack[] = $yyloc; + + $symbol = null; + $preErrorSymbol = null; + $state = null; + $action = null; + $a = null; + $r = null; + $yyval = new stdClass; + $p = null; + $len = null; + $newState = null; + $expected = null; + $errStr = null; + + while (true) { + // retrieve state number from top of stack + $state = $this->stack[count($this->stack)-1]; + + // use default actions if available + if (isset($this->defaultActions[$state])) { + $action = $this->defaultActions[$state]; + } else { + if ($symbol == null) { + $symbol = $this->lex(); + } + // read action for current state and first input + $action = isset($this->table[$state][$symbol]) ? $this->table[$state][$symbol] : false; + } + + // handle parse error + if (!$action || !$action[0]) { + if (!$recovering) { + // Report error + $expected = array(); + foreach ($this->table[$state] as $p => $ignore) { + if (isset($this->terminals_[$p]) && $p > 2) { + $expected[] = "'" . $this->terminals_[$p] . "'"; + } + } + + $message = null; + if (in_array("'STRING'", $expected) && in_array(substr($this->lexer->match, 0, 1), array('"', "'"))) { + $message = "Invalid string"; + if ("'" === substr($this->lexer->match, 0, 1)) { + $message .= ", it appears you used single quotes instead of double quotes"; + } elseif (preg_match('{".+?(\\\\[^"bfnrt/\\\\u])}', $this->lexer->getUpcomingInput(), $match)) { + $message .= ", it appears you have an unescaped backslash at: ".$match[1]; + } elseif (preg_match('{"(?:[^"]+|\\\\")*$}m', $this->lexer->getUpcomingInput())) { + $message .= ", it appears you forgot to terminate the string, or attempted to write a multiline string which is invalid"; + } + } + + $errStr = 'Parse error on line ' . ($yylineno+1) . ":\n"; + $errStr .= $this->lexer->showPosition() . "\n"; + if ($message) { + $errStr .= $message; + } else { + $errStr .= (count($expected) > 1) ? "Expected one of: " : "Expected: "; + $errStr .= implode(', ', $expected); + } + + if (',' === substr(trim($this->lexer->getPastInput()), -1)) { + $errStr .= " - It appears you have an extra trailing comma"; + } + + $this->parseError($errStr, array( + 'text' => $this->lexer->match, + 'token' => !empty($this->terminals_[$symbol]) ? $this->terminals_[$symbol] : $symbol, + 'line' => $this->lexer->yylineno, + 'loc' => $yyloc, + 'expected' => $expected, + )); + } + + // just recovered from another error + if ($recovering == 3) { + if ($symbol == $EOF) { + throw new JsonLintParsingException($errStr ? $errStr : 'Parsing halted.'); + } + + // discard current lookahead and grab another + $yyleng = $this->lexer->yyleng; + $yytext = $this->lexer->yytext; + $yylineno = $this->lexer->yylineno; + $yyloc = $this->lexer->yylloc; + $symbol = $this->lex(); + } + + // try to recover from error + while (true) { + // check for error recovery rule in this state + if (array_key_exists($TERROR, $this->table[$state])) { + break; + } + if ($state == 0) { + throw new JsonLintParsingException($errStr ? $errStr : 'Parsing halted.'); + } + $this->popStack(1); + $state = $this->stack[count($this->stack)-1]; + } + + $preErrorSymbol = $symbol; // save the lookahead token + $symbol = $TERROR; // insert generic error symbol as new lookahead + $state = $this->stack[count($this->stack)-1]; + $action = isset($this->table[$state][$TERROR]) ? $this->table[$state][$TERROR] : false; + $recovering = 3; // allow 3 real symbols to be shifted before reporting a new error + } + + // this shouldn't happen, unless resolve defaults are off + if (is_array($action[0]) && count($action) > 1) { + throw new JsonLintParsingException('Parse Error: multiple actions possible at state: ' . $state . ', token: ' . $symbol); + } + + switch ($action[0]) { + case 1: // shift + $this->stack[] = $symbol; + $this->vstack[] = $this->lexer->yytext; + $this->lstack[] = $this->lexer->yylloc; + $this->stack[] = $action[1]; // push state + $symbol = null; + if (!$preErrorSymbol) { // normal execution/no error + $yyleng = $this->lexer->yyleng; + $yytext = $this->lexer->yytext; + $yylineno = $this->lexer->yylineno; + $yyloc = $this->lexer->yylloc; + if ($recovering > 0) { + $recovering--; + } + } else { // error just occurred, resume old lookahead f/ before error + $symbol = $preErrorSymbol; + $preErrorSymbol = null; + } + break; + + case 2: // reduce + $len = $this->productions_[$action[1]][1]; + + // perform semantic action + $yyval->token = $this->vstack[count($this->vstack) - $len]; // default to $$ = $1 + // default location, uses first token for firsts, last for lasts + $yyval->store = array( // _$ = store + 'first_line' => $this->lstack[count($this->lstack) - ($len ? $len : 1)]['first_line'], + 'last_line' => $this->lstack[count($this->lstack) - 1]['last_line'], + 'first_column' => $this->lstack[count($this->lstack) - ($len ? $len : 1)]['first_column'], + 'last_column' => $this->lstack[count($this->lstack) - 1]['last_column'], + ); + $r = $this->performAction($yyval, $yytext, $yyleng, $yylineno, $action[1], $this->vstack, $this->lstack); + + if (!$r instanceof JsonLintUndefined) { + return $r; + } + + if ($len) { + $this->popStack($len); + } + + $this->stack[] = $this->productions_[$action[1]][0]; // push nonterminal (reduce) + $this->vstack[] = $yyval->token; + $this->lstack[] = $yyval->store; + $newState = $this->table[$this->stack[count($this->stack)-2]][$this->stack[count($this->stack)-1]]; + $this->stack[] = $newState; + break; + + case 3: // accept + + return true; + } + } + + return true; + } + + protected function parseError($str, $hash) + { + throw new JsonLintParsingException($str, $hash); + } + + // $$ = $tokens // needs to be passed by ref? + // $ = $token + // _$ removed, useless? + private function performAction(stdClass $yyval, $yytext, $yyleng, $yylineno, $yystate, &$tokens) + { + // $0 = $len + $len = count($tokens) - 1; + switch ($yystate) { + case 1: + $yytext = preg_replace_callback('{(?:\\\\["bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4})}', array($this, 'stringInterpolation'), $yytext); + $yyval->token = $yytext; + break; + case 2: + if (strpos($yytext, 'e') !== false || strpos($yytext, 'E') !== false) { + $yyval->token = floatval($yytext); + } else { + $yyval->token = strpos($yytext, '.') === false ? intval($yytext) : floatval($yytext); + } + break; + case 3: + $yyval->token = null; + break; + case 4: + $yyval->token = true; + break; + case 5: + $yyval->token = false; + break; + case 6: + return $yyval->token = $tokens[$len-1]; + case 13: + if ($this->flags & self::PARSE_TO_ASSOC) { + $yyval->token = array(); + } else { + $yyval->token = new stdClass; + } + break; + case 14: + $yyval->token = $tokens[$len-1]; + break; + case 15: + $yyval->token = array($tokens[$len-2], $tokens[$len]); + break; + case 16: + $property = $tokens[$len][0]; + if ($this->flags & self::PARSE_TO_ASSOC) { + $yyval->token = array(); + $yyval->token[$property] = $tokens[$len][1]; + } else { + $yyval->token = new stdClass; + $yyval->token->$property = $tokens[$len][1]; + } + break; + case 17: + if ($this->flags & self::PARSE_TO_ASSOC) { + $yyval->token =& $tokens[$len-2]; + $key = $tokens[$len][0]; + if (($this->flags & self::DETECT_KEY_CONFLICTS) && isset($tokens[$len-2][$key])) { + $errStr = 'Parse error on line ' . ($yylineno+1) . ":\n"; + $errStr .= $this->lexer->showPosition() . "\n"; + $errStr .= "Duplicate key: ".$tokens[$len][0]; + throw new JsonLintParsingException($errStr); + } elseif (($this->flags & self::ALLOW_DUPLICATE_KEYS) && isset($tokens[$len-2][$key])) { + // Forget about it... + } + $tokens[$len-2][$key] = $tokens[$len][1]; + } else { + $yyval->token = $tokens[$len-2]; + $key = $tokens[$len][0]; + if (($this->flags & self::DETECT_KEY_CONFLICTS) && isset($tokens[$len-2]->{$key})) { + $errStr = 'Parse error on line ' . ($yylineno+1) . ":\n"; + $errStr .= $this->lexer->showPosition() . "\n"; + $errStr .= "Duplicate key: ".$tokens[$len][0]; + throw new JsonLintParsingException($errStr); + } elseif (($this->flags & self::ALLOW_DUPLICATE_KEYS) && isset($tokens[$len-2]->{$key})) { + $duplicateCount = 1; + do { + $duplicateKey = $key . '.' . $duplicateCount++; + } while (isset($tokens[$len-2]->$duplicateKey)); + $key = $duplicateKey; + } + $tokens[$len-2]->$key = $tokens[$len][1]; + } + break; + case 18: + $yyval->token = array(); + break; + case 19: + $yyval->token = $tokens[$len-1]; + break; + case 20: + $yyval->token = array($tokens[$len]); + break; + case 21: + $tokens[$len-2][] = $tokens[$len]; + $yyval->token = $tokens[$len-2]; + break; + } + + return new JsonLintUndefined(); + } + + private function stringInterpolation($match) + { + switch ($match[0]) { + case '\\\\': + return '\\'; + case '\"': + return '"'; + case '\b': + return chr(8); + case '\f': + return chr(12); + case '\n': + return "\n"; + case '\r': + return "\r"; + case '\t': + return "\t"; + case '\/': + return "/"; + default: + return html_entity_decode('&#x'.ltrim(substr($match[0], 2), '0').';', 0, 'UTF-8'); + } + } + + private function popStack($n) + { + $this->stack = array_slice($this->stack, 0, - (2 * $n)); + $this->vstack = array_slice($this->vstack, 0, - $n); + $this->lstack = array_slice($this->lstack, 0, - $n); + } + + private function lex() + { + $token = $this->lexer->lex(); + if (!$token) { + $token = 1; + } + // if token isn't its numeric value, convert + if (!is_numeric($token)) { + $token = isset($this->symbols[$token]) ? $this->symbols[$token] : $token; + } + + return $token; + } + + private function failOnBOM($input) + { + // UTF-8 ByteOrderMark sequence + $bom = "\xEF\xBB\xBF"; + + if (substr($input, 0, 3) === $bom) { + $this->parseError("BOM detected, make sure your input does not include a Unicode Byte-Order-Mark", array()); + } + } +} \ No newline at end of file diff --git a/externals/jsonlint/src/Seld/JsonLint/Lexer.php b/externals/jsonlint/src/Seld/JsonLint/Lexer.php new file mode 100644 --- /dev/null +++ b/externals/jsonlint/src/Seld/JsonLint/Lexer.php @@ -0,0 +1,215 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Lexer class + * + * Ported from https://github.com/zaach/jsonlint + */ +class JsonLintLexer +{ + private $EOF = 1; + private $rules = array( + 0 => '/^\s+/', + 1 => '/^-?([0-9]|[1-9][0-9]+)(\.[0-9]+)?([eE][+-]?[0-9]+)?\b/', + 2 => '{^"(?>\\\\["bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4}|[^\0-\x1f\\\\"]++)*+"}', + 3 => '/^\{/', + 4 => '/^\}/', + 5 => '/^\[/', + 6 => '/^\]/', + 7 => '/^,/', + 8 => '/^:/', + 9 => '/^true\b/', + 10 => '/^false\b/', + 11 => '/^null\b/', + 12 => '/^$/', + 13 => '/^./', + ); + + private $conditions = array( + "INITIAL" => array( + "rules" => array(0,1,2,3,4,5,6,7,8,9,10,11,12,13), + "inclusive" => true, + ), + ); + + private $conditionStack; + private $input; + private $more; + private $done; + private $matched; + + public $match; + public $yylineno; + public $yyleng; + public $yytext; + public $yylloc; + + public function lex() + { + $r = $this->next(); + if (!$r instanceof JsonLintUndefined) { + return $r; + } + + return $this->lex(); + } + + public function setInput($input) + { + $this->input = $input; + $this->more = false; + $this->done = false; + $this->yylineno = $this->yyleng = 0; + $this->yytext = $this->matched = $this->match = ''; + $this->conditionStack = array('INITIAL'); + $this->yylloc = array('first_line' => 1, 'first_column' => 0, 'last_line' => 1, 'last_column' => 0); + + return $this; + } + + public function showPosition() + { + $pre = str_replace("\n", '', $this->getPastInput()); + $c = str_repeat('-', max(0, strlen($pre) - 1)); // new Array(pre.length + 1).join("-"); + + return $pre . str_replace("\n", '', $this->getUpcomingInput()) . "\n" . $c . "^"; + } + + public function getPastInput() + { + $past = substr($this->matched, 0, strlen($this->matched) - strlen($this->match)); + + return (strlen($past) > 20 ? '...' : '') . substr($past, -20); + } + + public function getUpcomingInput() + { + $next = $this->match; + if (strlen($next) < 20) { + $next .= substr($this->input, 0, 20 - strlen($next)); + } + + return substr($next, 0, 20) . (strlen($next) > 20 ? '...' : ''); + } + + protected function parseError($str, $hash) + { + throw new Exception($str); + } + + private function next() + { + if ($this->done) { + return $this->EOF; + } + if (!$this->input) { + $this->done = true; + } + + $token = null; + $match = null; + $col = null; + $lines = null; + + if (!$this->more) { + $this->yytext = ''; + $this->match = ''; + } + + $rules = $this->getCurrentRules(); + $rulesLen = count($rules); + + for ($i=0; $i < $rulesLen; $i++) { + if (preg_match($this->rules[$rules[$i]], $this->input, $match)) { + preg_match_all('/\n.*/', $match[0], $lines); + $lines = $lines[0]; + if ($lines) { + $this->yylineno += count($lines); + } + + $this->yylloc = array( + 'first_line' => $this->yylloc['last_line'], + 'last_line' => $this->yylineno+1, + 'first_column' => $this->yylloc['last_column'], + 'last_column' => $lines ? strlen($lines[count($lines) - 1]) - 1 : $this->yylloc['last_column'] + strlen($match[0]), + ); + $this->yytext .= $match[0]; + $this->match .= $match[0]; + $this->yyleng = strlen($this->yytext); + $this->more = false; + $this->input = substr($this->input, strlen($match[0])); + $this->matched .= $match[0]; + $token = $this->performAction($rules[$i], $this->conditionStack[count($this->conditionStack)-1]); + if ($token) { + return $token; + } + + return new JsonLintUndefined(); + } + } + + if ($this->input === "") { + return $this->EOF; + } + + $this->parseError( + 'Lexical error on line ' . ($this->yylineno+1) . ". Unrecognized text.\n" . $this->showPosition(), + array( + 'text' => "", + 'token' => null, + 'line' => $this->yylineno, + ) + ); + } + + private function getCurrentRules() + { + return $this->conditions[$this->conditionStack[count($this->conditionStack)-1]]['rules']; + } + + private function performAction($avoiding_name_collisions, $YY_START) + { + switch ($avoiding_name_collisions) { + case 0:/* skip whitespace */ + break; + case 1: + return 6; + break; + case 2: + $this->yytext = substr($this->yytext, 1, $this->yyleng-2); + + return 4; + case 3: + return 17; + case 4: + return 18; + case 5: + return 23; + case 6: + return 24; + case 7: + return 22; + case 8: + return 21; + case 9: + return 10; + case 10: + return 11; + case 11: + return 8; + case 12: + return 14; + case 13: + return 'INVALID'; + } + } +} \ No newline at end of file diff --git a/externals/jsonlint/src/Seld/JsonLint/ParsingException.php b/externals/jsonlint/src/Seld/JsonLint/ParsingException.php new file mode 100644 --- /dev/null +++ b/externals/jsonlint/src/Seld/JsonLint/ParsingException.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +class JsonLintParsingException extends Exception +{ + protected $details; + + public function __construct($message, $details = array()) + { + $this->details = $details; + parent::__construct($message); + } + + public function getDetails() + { + return $this->details; + } +} diff --git a/externals/jsonlint/src/Seld/JsonLint/Undefined.php b/externals/jsonlint/src/Seld/JsonLint/Undefined.php new file mode 100644 --- /dev/null +++ b/externals/jsonlint/src/Seld/JsonLint/Undefined.php @@ -0,0 +1,14 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +class JsonLintUndefined +{ +} diff --git a/externals/porter-stemmer/LICENSE b/externals/porter-stemmer/LICENSE new file mode 100644 --- /dev/null +++ b/externals/porter-stemmer/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2005-2016 Richard Heyes (http://www.phpguru.org/) + +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. diff --git a/externals/porter-stemmer/README.md b/externals/porter-stemmer/README.md new file mode 100644 --- /dev/null +++ b/externals/porter-stemmer/README.md @@ -0,0 +1,42 @@ +# Porter Stemmer by Richard Heyes + +# Installation (with composer) + +```json +{ + "require": { + "camspiers/porter-stemmer": "1.0.0" + } +} +``` + + $ composer install + +# Usage + +```php +$stem = Porter::Stem($word); +``` + +# License + +The MIT License (MIT) + +Copyright (c) 2005-2016 Richard Heyes (http://www.phpguru.org/) + +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. diff --git a/externals/porter-stemmer/src/Porter.php b/externals/porter-stemmer/src/Porter.php new file mode 100644 --- /dev/null +++ b/externals/porter-stemmer/src/Porter.php @@ -0,0 +1,426 @@ + + * + * Originally available under the GPL 2 or greater. Relicensed with permission + * of original authors under the MIT License in 2016. + * + * All rights reserved. + * + * @package PorterStemmer + * @author Richard Heyes + * @author Jon Abernathy + * @copyright 2005-2016 Richard Heyes (http://www.phpguru.org/) + * @license http://www.opensource.org/licenses/mit-license.html MIT License + */ + +/** + * PHP 5 Implementation of the Porter Stemmer algorithm. Certain elements + * were borrowed from the (broken) implementation by Jon Abernathy. + * + * See http://tartarus.org/~martin/PorterStemmer/ for a description of the + * algorithm. + * + * Usage: + * + * $stem = PorterStemmer::Stem($word); + * + * How easy is that? + * + * @package PorterStemmer + * @author Richard Heyes + * @author Jon Abernathy + * @copyright 2005-2016 Richard Heyes (http://www.phpguru.org/) + * @license http://www.opensource.org/licenses/mit-license.html MIT License + */ +class Porter +{ + /** + * Regex for matching a consonant + * + * @var string + */ + private static $regex_consonant = '(?:[bcdfghjklmnpqrstvwxz]|(?<=[aeiou])y|^y)'; + + /** + * Regex for matching a vowel + * + * @var string + */ + private static $regex_vowel = '(?:[aeiou]|(? 1) { + self::replace($word, 'e', ''); + + } elseif (self::m(substr($word, 0, -1)) == 1) { + + if (!self::cvc(substr($word, 0, -1))) { + self::replace($word, 'e', ''); + } + } + } + + // Part b + if (self::m($word) > 1 AND self::doubleConsonant($word) AND substr($word, -1) == 'l') { + $word = substr($word, 0, -1); + } + + return $word; + } + + /** + * Replaces the first string with the second, at the end of the string + * + * If third arg is given, then the preceding string must match that m + * count at least. + * + * @param string $str String to check + * @param string $check Ending to check for + * @param string $repl Replacement string + * @param int $m Optional minimum number of m() to meet + * + * @return bool Whether the $check string was at the end of the $str + * string. True does not necessarily mean that it was + * replaced. + */ + private static function replace(&$str, $check, $repl, $m = null) + { + $len = 0 - strlen($check); + + if (substr($str, $len) == $check) { + $substr = substr($str, 0, $len); + if (is_null($m) OR self::m($substr) > $m) { + $str = $substr . $repl; + } + + return true; + } + + return false; + } + + /** + * What, you mean it's not obvious from the name? + * + * m() measures the number of consonant sequences in $str. if c is + * a consonant sequence and v a vowel sequence, and <..> indicates arbitrary + * presence, + * + * gives 0 + * vc gives 1 + * vcvc gives 2 + * vcvcvc gives 3 + * + * @param string $str The string to return the m count for + * + * @return int The m count + */ + private static function m($str) + { + $c = self::$regex_consonant; + $v = self::$regex_vowel; + + $str = preg_replace("#^$c+#", '', $str); + $str = preg_replace("#$v+$#", '', $str); + + preg_match_all("#($v+$c+)#", $str, $matches); + + return count($matches[1]); + } + + /** + * Returns true/false as to whether the given string contains two + * of the same consonant next to each other at the end of the string. + * + * @param string $str String to check + * + * @return bool Result + */ + private static function doubleConsonant($str) + { + $c = self::$regex_consonant; + + return preg_match("#$c{2}$#", $str, $matches) AND $matches[0]{0} == $matches[0]{1}; + } + + /** + * Checks for ending CVC sequence where second C is not W, X or Y + * + * @param string $str String to check + * + * @return bool Result + */ + private static function cvc($str) + { + $c = self::$regex_consonant; + $v = self::$regex_vowel; + + return preg_match("#($c$v$c)$#", $str, $matches) + AND strlen($matches[1]) == 3 + AND $matches[1]{2} != 'w' + AND $matches[1]{2} != 'x' + AND $matches[1]{2} != 'y'; + } +} diff --git a/resources/php_compat_info.json b/resources/php_compat_info.json new file mode 100644 --- /dev/null +++ b/resources/php_compat_info.json @@ -0,0 +1,64351 @@ +{ + "@generated": true, + "params": { + "array_keys": [ + "4.0.0", + "4.0.0", + "5.0.0" + ], + "array_slice": [ + "4.0.0", + "4.0.0", + "4.0.0", + "5.0.2" + ], + "assert": [ + "4.0.0", + "5.4.8" + ], + "class_exists": [ + "4.0.0", + "5.0.0" + ], + "clearstatcache": [ + "5.3.0", + "5.3.0" + ], + "copy": [ + "4.0.0", + "4.0.0", + "5.3.0" + ], + "debug_backtrace": [ + "4.3.0", + "5.4.0" + ], + "debug_print_backtrace": [ + "5.0.0", + "5.4.0" + ], + "fgetss": [ + "4.0.0", + "4.0.0", + "5.0.0" + ], + "file": [ + "4.0.0", + "4.0.0", + "5.0.0" + ], + "file_get_contents": [ + "4.3.0", + "4.3.0", + "4.3.0", + "5.1.0", + "5.1.0" + ], + "get_browser": [ + "4.0.0", + "4.3.2" + ], + "getopt": [ + "4.3.0", + "5.3.0" + ], + "gettimeofday": [ + "5.1.0" + ], + "htmlentities": [ + "4.0.0", + "4.0.3", + "4.1.0", + "5.2.3" + ], + "htmlspecialchars": [ + "4.0.0", + "4.0.0", + "4.1.0", + "5.2.3" + ], + "idn_to_ascii": [ + "5.2.4", + "5.2.4", + "5.4.0RC3", + "5.4.0RC3" + ], + "idn_to_utf8": [ + "5.2.4", + "5.2.4", + "5.4.0RC3", + "5.4.0RC3" + ], + "ini_get_all": [ + "4.2.0", + "5.3.0" + ], + "is_a": [ + "4.2.0", + "4.2.0", + "5.3.9" + ], + "jdtojewish": [ + "4.0.0", + "4.3.0", + "5.0.0" + ], + "json_decode": [ + "5.2.0", + "5.2.0", + "5.3.0", + "5.4.0" + ], + "json_encode": [ + "5.2.0", + "5.3.0", + "5.5.0" + ], + "ldap_read": [ + "4.0.0", + "4.0.0", + "4.0.0", + "4.0.0", + "4.0.2", + "4.0.2", + "4.0.2", + "4.0.2" + ], + "ldap_search": [ + "4.0.0", + "4.0.0", + "4.0.0", + "4.0.0", + "4.0.2", + "4.0.2", + "4.0.2", + "4.0.2" + ], + "md5": [ + "4.0.0", + "5.0.0" + ], + "md5_file": [ + "4.2.0", + "5.0.0" + ], + "memory_get_usage": [ + "5.2.0" + ], + "microtime": [ + "5.0.0" + ], + "mkdir": [ + "4.0.0", + "4.0.0", + "5.0.0", + "5.0.0" + ], + "nl2br": [ + "4.0.0", + "5.3.0" + ], + "opendir": [ + "4.0.0", + "5.3.0" + ], + "openssl_sign": [ + "4.0.4", + "4.0.4", + "4.0.4", + "5.0.0" + ], + "parse_url": [ + "4.0.0", + "5.1.2" + ], + "preg_replace": [ + "4.0.0", + "4.0.0", + "4.0.0", + "4.0.1", + "5.1.0" + ], + "preg_replace_callback": [ + "4.0.5", + "4.0.5", + "4.0.5", + "4.0.5", + "5.1.0" + ], + "scandir": [ + "5.0.0", + "5.4.0", + "5.4.0" + ], + "sem_acquire": [ + "4.0.0", + "5.6.1RC1" + ], + "session_regenerate_id": [ + "5.1.0" + ], + "sha1": [ + "4.3.0", + "5.0.0" + ], + "sha1_file": [ + "4.3.0", + "5.0.0" + ], + "sqlite_fetch_column_types": [ + "5.0.0", + "5.0.0", + "5.1.0" + ], + "str_replace": [ + "4.0.0", + "4.0.0", + "4.0.0", + "5.0.0" + ], + "stream_copy_to_stream": [ + "5.0.0", + "5.0.0", + "5.0.0", + "5.1.0" + ], + "stream_get_contents": [ + "5.0.0", + "5.0.0", + "5.1.0" + ], + "substr_count": [ + "4.0.0", + "4.0.0", + "5.1.0", + "5.1.0" + ] + }, + "functions": { + "_": { + "ext.name": "gettext", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "__uopz_exit_overload": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "abs": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "acos": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "acosh": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "addcslashes": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "addslashes": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "apc_add": { + "ext.name": "apc", + "ext.min": "3.0.13", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "apc_bin_dump": { + "ext.name": "apc", + "ext.min": "3.1.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "apc_bin_dumpfile": { + "ext.name": "apc", + "ext.min": "3.1.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "apc_bin_load": { + "ext.name": "apc", + "ext.min": "3.1.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "apc_bin_loadfile": { + "ext.name": "apc", + "ext.min": "3.1.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "apc_cache_info": { + "ext.name": "apc", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "apc_cas": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "apc_clear_cache": { + "ext.name": "apc", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "apc_compile_file": { + "ext.name": "apc", + "ext.min": "3.0.13", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "apc_dec": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "apc_define_constants": { + "ext.name": "apc", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "apc_delete": { + "ext.name": "apc", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "apc_delete_file": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "apc_exists": { + "ext.name": "apc", + "ext.min": "3.1.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "apc_fetch": { + "ext.name": "apc", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "apc_inc": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "apc_load_constants": { + "ext.name": "apc", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "apc_sma_info": { + "ext.name": "apc", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "apc_store": { + "ext.name": "apc", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "apcu_add": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_bin_dump": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_bin_dumpfile": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_bin_load": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_bin_loadfile": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_cache_info": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_cas": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_clear_cache": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_dec": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_delete": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_enabled": { + "ext.name": "apcu", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_exists": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_fetch": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_inc": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_key_info": { + "ext.name": "apcu", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_sma_info": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "apcu_store": { + "ext.name": "apcu", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "array_change_key_case": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "array_chunk": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "array_column": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "array_combine": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "array_count_values": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_diff": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "array_diff_assoc": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "array_diff_key": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "array_diff_uassoc": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "array_diff_ukey": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "array_fill": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "array_fill_keys": { + "ext.name": "standard", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "array_filter": { + "ext.name": "standard", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "array_flip": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_intersect": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "array_intersect_assoc": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "array_intersect_key": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "array_intersect_uassoc": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "array_intersect_ukey": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "array_key_exists": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "array_keys": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_map": { + "ext.name": "standard", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "array_merge": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_merge_recursive": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "array_multisort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_pad": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_pop": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_product": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "array_push": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_rand": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_reduce": { + "ext.name": "standard", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "array_replace": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "array_replace_recursive": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "array_reverse": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_search": { + "ext.name": "standard", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "array_shift": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_slice": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_splice": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_sum": { + "ext.name": "standard", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "array_udiff": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "array_udiff_assoc": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_udiff_uassoc": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_uintersect": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_uintersect_assoc": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_uintersect_uassoc": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_unique": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "array_unshift": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_values": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_walk": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "array_walk_recursive": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "arsort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "asin": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "asinh": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "asort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "assert": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "assert_options": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "atan": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "atan2": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "atanh": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "base64_decode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "base64_encode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "base_convert": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "basename": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bcadd": { + "ext.name": "bcmath", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bccomp": { + "ext.name": "bcmath", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bcdiv": { + "ext.name": "bcmath", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bcmod": { + "ext.name": "bcmath", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bcmul": { + "ext.name": "bcmath", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bcpow": { + "ext.name": "bcmath", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bcpowmod": { + "ext.name": "bcmath", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "bcscale": { + "ext.name": "bcmath", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bcsqrt": { + "ext.name": "bcmath", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bcsub": { + "ext.name": "bcmath", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bin2hex": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bind_textdomain_codeset": { + "ext.name": "gettext", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "bindec": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "bindtextdomain": { + "ext.name": "gettext", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "boolval": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "bson_decode": { + "ext.name": "mongo", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "bson_encode": { + "ext.name": "mongo", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "bzclose": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "bzcompress": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "bzdecompress": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "bzerrno": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "bzerror": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "bzerrstr": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "bzflush": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "bzopen": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "bzread": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "bzwrite": { + "ext.name": "bz2", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "cal_days_in_month": { + "ext.name": "calendar", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "cal_from_jd": { + "ext.name": "calendar", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "cal_info": { + "ext.name": "calendar", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "cal_to_jd": { + "ext.name": "calendar", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "call_user_func": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "call_user_func_array": { + "ext.name": "standard", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "call_user_method": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "call_user_method_array": { + "ext.name": "standard", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "ceil": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "chdir": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "checkdate": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "checkdnsrr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "chgrp": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "chmod": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "chop": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "chown": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "chr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "chroot": { + "ext.name": "standard", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "chunk_split": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "class_alias": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "class_exists": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "class_implements": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "class_parents": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "class_uses": { + "ext.name": "spl", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "clearstatcache": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "cli_get_process_title": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "cli_set_process_title": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "closedir": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "closelog": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "collator_asort": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_compare": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_create": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_get_attribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_get_error_code": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_get_error_message": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_get_locale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_get_sort_key": { + "ext.name": "intl", + "ext.min": "1.0.3", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "collator_get_strength": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_set_attribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_set_strength": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_sort": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "collator_sort_with_sort_keys": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "compact": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "connection_aborted": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "connection_status": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "connection_timeout": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "4.0.4" + }, + "constant": { + "ext.name": "standard", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "convert_cyr_string": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "convert_uudecode": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "convert_uuencode": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "copy": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "cos": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "cosh": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "count": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "count_chars": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "crc32": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "create_function": { + "ext.name": "Core", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "crypt": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ctype_alnum": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_alpha": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_cntrl": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_digit": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_graph": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_lower": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_print": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_punct": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_space": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_upper": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ctype_xdigit": { + "ext.name": "ctype", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "curl_close": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "curl_copy_handle": { + "ext.name": "curl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "curl_errno": { + "ext.name": "curl", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "curl_error": { + "ext.name": "curl", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "curl_escape": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_exec": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "curl_file_create": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_getinfo": { + "ext.name": "curl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "curl_init": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "curl_multi_add_handle": { + "ext.name": "curl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "curl_multi_close": { + "ext.name": "curl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "curl_multi_exec": { + "ext.name": "curl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "curl_multi_getcontent": { + "ext.name": "curl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "curl_multi_info_read": { + "ext.name": "curl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "curl_multi_init": { + "ext.name": "curl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "curl_multi_remove_handle": { + "ext.name": "curl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "curl_multi_select": { + "ext.name": "curl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "curl_multi_setopt": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_multi_strerror": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_pause": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_reset": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_setopt": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "curl_setopt_array": { + "ext.name": "curl", + "ext.min": "5.1.3", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "curl_share_close": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_share_init": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_share_setopt": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_strerror": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_unescape": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "curl_version": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "current": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "date": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "date_add": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_create": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "date_create_from_format": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_create_immutable": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "date_create_immutable_from_format": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "date_date_set": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "date_default_timezone_get": { + "ext.name": "date", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "date_default_timezone_set": { + "ext.name": "date", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "date_diff": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_format": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "date_get_last_errors": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_interval_create_from_date_string": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_interval_format": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_isodate_set": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "date_modify": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "date_offset_get": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "date_parse": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "date_parse_from_format": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_sub": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_sun_info": { + "ext.name": "date", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "date_sunrise": { + "ext.name": "date", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "date_sunset": { + "ext.name": "date", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "date_time_set": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "date_timestamp_get": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_timestamp_set": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "date_timezone_get": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "date_timezone_set": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "datefmt_create": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_format": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_format_object": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "datefmt_get_calendar": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_get_calendar_object": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "datefmt_get_datetype": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_get_error_code": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_get_error_message": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_get_locale": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_get_pattern": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_get_timetype": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_get_timezone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "datefmt_get_timezone_id": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_is_lenient": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_localtime": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_parse": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_set_calendar": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_set_lenient": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_set_pattern": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "datefmt_set_timezone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "datefmt_set_timezone_id": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "dcgettext": { + "ext.name": "gettext", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "dcngettext": { + "ext.name": "gettext", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "debug_backtrace": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "debug_print_backtrace": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "debug_zval_dump": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "decbin": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "dechex": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "decoct": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "define": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "define_syslog_variables": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "5.3.29" + }, + "defined": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "deg2rad": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "dgettext": { + "ext.name": "gettext", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "dir": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "dirname": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "disk_free_space": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "disk_total_space": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "diskfreespace": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "dl": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "dngettext": { + "ext.name": "gettext", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "dns_check_record": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "dns_get_mx": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "dns_get_record": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "dom_import_simplexml": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "doubleval": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "each": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "easter_date": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "easter_days": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "empty": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "enchant_broker_describe": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_dict_exists": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_free": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_free_dict": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_get_dict_path": { + "ext.name": "enchant", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_get_error": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_init": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_list_dicts": { + "ext.name": "enchant", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_request_dict": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_request_pwl_dict": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_set_dict_path": { + "ext.name": "enchant", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_broker_set_ordering": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_dict_add_to_personal": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_dict_add_to_session": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_dict_check": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_dict_describe": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_dict_get_error": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_dict_is_in_session": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_dict_quick_check": { + "ext.name": "enchant", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_dict_store_replacement": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "enchant_dict_suggest": { + "ext.name": "enchant", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "end": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ereg": { + "ext.name": "ereg", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ereg_replace": { + "ext.name": "ereg", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "eregi": { + "ext.name": "ereg", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "eregi_replace": { + "ext.name": "ereg", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "error_get_last": { + "ext.name": "standard", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "error_log": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "error_reporting": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "escapeshellarg": { + "ext.name": "standard", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "escapeshellcmd": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "event_add": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_base_free": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_base_loop": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_base_loopbreak": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_base_loopexit": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_base_new": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_base_priority_init": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_base_reinit": { + "ext.name": "libevent", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_base_set": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_base_set": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_disable": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_enable": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_fd_set": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_free": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_new": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_priority_set": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_read": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_set_callback": { + "ext.name": "libevent", + "ext.min": "0.0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_timeout_set": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_watermark_set": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_buffer_write": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_del": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_free": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_new": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_priority_set": { + "ext.name": "libevent", + "ext.min": "0.0.5", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_set": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_timer_add": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_timer_del": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_timer_new": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_timer_pending": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "event_timer_set": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "exec": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "exif_imagetype": { + "ext.name": "exif", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "exif_read_data": { + "ext.name": "exif", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "exif_tagname": { + "ext.name": "exif", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "exif_thumbnail": { + "ext.name": "exif", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "exp": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "explode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "expm1": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "extension_loaded": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "extract": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ezmlm_hash": { + "ext.name": "standard", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "fclose": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "feof": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fflush": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "fgetc": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fgetcsv": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fgets": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fgetss": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "file": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "file_exists": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "file_get_contents": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "file_put_contents": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "fileatime": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "filectime": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "filegroup": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fileinode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "filemtime": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fileowner": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fileperms": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "filesize": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "filetype": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "filter_data": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": "0.10.0", + "php.min": "4.0.0", + "php.max": null + }, + "filter_has_var": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "filter_id": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "filter_input": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "filter_input_array": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "filter_list": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "filter_var": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "filter_var_array": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "finfo_buffer": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "finfo_close": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "finfo_file": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "finfo_open": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "finfo_set_flags": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "floatval": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "flock": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "floor": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "flush": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fmod": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "fnmatch": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "fopen": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "forward_static_call": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "forward_static_call_array": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "fpassthru": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fprintf": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "fputcsv": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "fputs": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fread": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "frenchtojd": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fscanf": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "fseek": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fsockopen": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fstat": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftell": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftok": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ftp_alloc": { + "ext.name": "ftp", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ftp_cdup": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_chdir": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_chmod": { + "ext.name": "ftp", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ftp_close": { + "ext.name": "ftp", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ftp_connect": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_delete": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_exec": { + "ext.name": "ftp", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "ftp_fget": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_fput": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_get": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_get_option": { + "ext.name": "ftp", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ftp_login": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_mdtm": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_mkdir": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_nb_continue": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ftp_nb_fget": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ftp_nb_fput": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ftp_nb_get": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ftp_nb_put": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ftp_nlist": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_pasv": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_put": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_pwd": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_quit": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_raw": { + "ext.name": "ftp", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ftp_rawlist": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_rename": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_rmdir": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_set_option": { + "ext.name": "ftp", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ftp_site": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_size": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftp_ssl_connect": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ftp_systype": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ftruncate": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "func_get_arg": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "func_get_args": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "func_num_args": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "function_exists": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "fwrite": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gc_collect_cycles": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "gc_disable": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "gc_enable": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "gc_enabled": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "gd_info": { + "ext.name": "gd", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_asnum_by_name": { + "ext.name": "geoip", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_continent_code_by_name": { + "ext.name": "geoip", + "ext.min": "1.0.3", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_country_code3_by_name": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_country_code_by_name": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_country_name_by_name": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_database_info": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_db_avail": { + "ext.name": "geoip", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_db_filename": { + "ext.name": "geoip", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_db_get_all_info": { + "ext.name": "geoip", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_domain_by_name": { + "ext.name": "geoip", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_id_by_name": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_isp_by_name": { + "ext.name": "geoip", + "ext.min": "1.0.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_netspeedcell_by_name": { + "ext.name": "geoip", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_org_by_name": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_record_by_name": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_region_by_name": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_region_name_by_code": { + "ext.name": "geoip", + "ext.min": "1.0.5", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_setup_custom_directory": { + "ext.name": "geoip", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "geoip_time_zone_by_country_and_region": { + "ext.name": "geoip", + "ext.min": "1.0.5", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "get_browser": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_called_class": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "get_cfg_var": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_class": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_class_methods": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_class_vars": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_current_user": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_declared_classes": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_declared_interfaces": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "get_declared_traits": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "get_defined_constants": { + "ext.name": "Core", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "get_defined_functions": { + "ext.name": "Core", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "get_defined_vars": { + "ext.name": "Core", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "get_extension_funcs": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_headers": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "get_html_translation_table": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_include_path": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "get_included_files": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_loaded_extensions": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_magic_quotes_gpc": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_magic_quotes_runtime": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_meta_tags": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_object_vars": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_parent_class": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_required_files": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "get_resource_type": { + "ext.name": "Core", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "getcwd": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getdate": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getenv": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gethostbyaddr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gethostbyname": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gethostbynamel": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gethostname": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getimagesize": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getimagesizefromstring": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "getlastmod": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getmxrr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getmygid": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "getmyinode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getmypid": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getmyuid": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getopt": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "getprotobyname": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getprotobynumber": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getrandmax": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getrusage": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getservbyname": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "getservbyport": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gettext": { + "ext.name": "gettext", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gettimeofday": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gettype": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "glob": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "gmdate": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gmmktime": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gmp_abs": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_add": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_and": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_clrbit": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_cmp": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_com": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_div": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_div_q": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_div_qr": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_div_r": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_divexact": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_export": { + "ext.name": "gmp", + "ext.min": "5.6.1RC1", + "ext.max": null, + "php.min": "5.6.1RC1", + "php.max": null + }, + "gmp_fact": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_gcd": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_gcdext": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_hamdist": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_import": { + "ext.name": "gmp", + "ext.min": "5.6.1RC1", + "ext.max": null, + "php.min": "5.6.1RC1", + "php.max": null + }, + "gmp_init": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_intval": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_invert": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_jacobi": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_legendre": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_mod": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_mul": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_neg": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_nextprime": { + "ext.name": "gmp", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "gmp_or": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_perfect_square": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_popcount": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_pow": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_powm": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_prob_prime": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_random": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_random_bits": { + "ext.name": "gmp", + "ext.min": "5.6.3RC1", + "ext.max": null, + "php.min": "5.6.3RC1", + "php.max": null + }, + "gmp_random_range": { + "ext.name": "gmp", + "ext.min": "5.6.3RC1", + "ext.max": null, + "php.min": "5.6.3RC1", + "php.max": null + }, + "gmp_root": { + "ext.name": "gmp", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "gmp_rootrem": { + "ext.name": "gmp", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "gmp_scan0": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_scan1": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_setbit": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_sign": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_sqrt": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_sqrtrem": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_strval": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_sub": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmp_testbit": { + "ext.name": "gmp", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "gmp_xor": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gmstrftime": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "grapheme_extract": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "grapheme_stripos": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "grapheme_stristr": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "grapheme_strlen": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "grapheme_strpos": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "grapheme_strripos": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "grapheme_strrpos": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "grapheme_strstr": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "grapheme_substr": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "gregoriantojd": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzclose": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzcompress": { + "ext.name": "zlib", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "gzdecode": { + "ext.name": "zlib", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "gzdeflate": { + "ext.name": "zlib", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gzencode": { + "ext.name": "zlib", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gzeof": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzfile": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzgetc": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzgets": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzgetss": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzinflate": { + "ext.name": "zlib", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "gzopen": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzpassthru": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzputs": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzread": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzrewind": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzseek": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gztell": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "gzuncompress": { + "ext.name": "zlib", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "gzwrite": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash_algos": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash_copy": { + "ext.name": "hash", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "hash_equals": { + "ext.name": "hash", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "hash_file": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash_final": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash_hmac": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash_hmac_file": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash_init": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash_pbkdf2": { + "ext.name": "hash", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "hash_update": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash_update_file": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hash_update_stream": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "header": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "header_register_callback": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "header_remove": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "headers_list": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "headers_sent": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hebrev": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hebrevc": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "hex2bin": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "hexdec": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "highlight_file": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "highlight_string": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "html_entity_decode": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "htmlentities": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "htmlspecialchars": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "htmlspecialchars_decode": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "http_build_cookie": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_build_query": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "http_build_str": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_build_url": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_cache_etag": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_cache_last_modified": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_chunked_decode": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_date": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_deflate": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_get": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_get_request_body": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_get_request_body_stream": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_get_request_headers": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_head": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_inflate": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_match_etag": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_match_modified": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_match_request_header": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_negotiate": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_negotiate_charset": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_negotiate_content_type": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_negotiate_language": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_parse_cookie": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_parse_headers": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_parse_message": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_parse_params": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_persistent_handles_clean": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_persistent_handles_count": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_persistent_handles_ident": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_post_data": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_post_fields": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_put_data": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_put_file": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_put_stream": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_redirect": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_request": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_request_body_encode": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_request_method_exists": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_request_method_name": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_request_method_register": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_request_method_unregister": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_response_code": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "http_send_content_disposition": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_send_content_type": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_send_data": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_send_file": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_send_last_modified": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_send_status": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_send_stream": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_support": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "http_throttle": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "hypot": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "iconv": { + "ext.name": "iconv", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "iconv_get_encoding": { + "ext.name": "iconv", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "iconv_mime_decode": { + "ext.name": "iconv", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "iconv_mime_decode_headers": { + "ext.name": "iconv", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "iconv_mime_encode": { + "ext.name": "iconv", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "iconv_set_encoding": { + "ext.name": "iconv", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "iconv_strlen": { + "ext.name": "iconv", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "iconv_strpos": { + "ext.name": "iconv", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "iconv_strrpos": { + "ext.name": "iconv", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "iconv_substr": { + "ext.name": "iconv", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "idate": { + "ext.name": "date", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "idn_to_ascii": { + "ext.name": "intl", + "ext.min": "1.0.2", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "idn_to_utf8": { + "ext.name": "intl", + "ext.min": "1.0.2", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "igbinary_serialize": { + "ext.name": "igbinary", + "ext.min": "1.1.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "igbinary_unserialize": { + "ext.name": "igbinary", + "ext.min": "1.1.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ignore_user_abort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "image2wbmp": { + "ext.name": "gd", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "image_type_to_extension": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "image_type_to_mime_type": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imageaffine": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "imageaffinematrixconcat": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "imageaffinematrixget": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "imagealphablending": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imageantialias": { + "ext.name": "gd", + "ext.min": "4.3.2", + "ext.max": null, + "php.min": "4.3.2", + "php.max": null + }, + "imagearc": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagechar": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecharup": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolorallocate": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolorallocatealpha": { + "ext.name": "gd", + "ext.min": "4.3.2", + "ext.max": null, + "php.min": "4.3.2", + "php.max": null + }, + "imagecolorat": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolorclosest": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolorclosestalpha": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagecolorclosesthwb": { + "ext.name": "gd", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "imagecolordeallocate": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolorexact": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolorexactalpha": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagecolormatch": { + "ext.name": "gd", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "imagecolorresolve": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolorresolvealpha": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagecolorset": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolorsforindex": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolorstotal": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecolortransparent": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imageconvolution": { + "ext.name": "gd", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "imagecopy": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecopymerge": { + "ext.name": "gd", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "imagecopymergegray": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagecopyresampled": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagecopyresized": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecreate": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecreatefromgd": { + "ext.name": "gd", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "imagecreatefromgd2": { + "ext.name": "gd", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "imagecreatefromgd2part": { + "ext.name": "gd", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "imagecreatefromgif": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecreatefromjpeg": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecreatefrompng": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagecreatefromstring": { + "ext.name": "gd", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "imagecreatefromwbmp": { + "ext.name": "gd", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "imagecreatefromwebp": { + "ext.name": "gd", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "imagecreatefromxbm": { + "ext.name": "gd", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "imagecreatefromxpm": { + "ext.name": "gd", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "imagecreatetruecolor": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagecrop": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "imagecropauto": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "imagedashedline": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagedestroy": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imageellipse": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagefill": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagefilledarc": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagefilledellipse": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagefilledpolygon": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagefilledrectangle": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagefilltoborder": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagefilter": { + "ext.name": "gd", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "imageflip": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "imagefontheight": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagefontwidth": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imageftbbox": { + "ext.name": "gd", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "imagefttext": { + "ext.name": "gd", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "imagegammacorrect": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagegd": { + "ext.name": "gd", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "imagegd2": { + "ext.name": "gd", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "imagegif": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagegrabscreen": { + "ext.name": "gd", + "ext.min": "5.2.2", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "imagegrabwindow": { + "ext.name": "gd", + "ext.min": "5.2.2", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "imageinterlace": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imageistruecolor": { + "ext.name": "gd", + "ext.min": "4.3.2", + "ext.max": null, + "php.min": "4.3.2", + "php.max": null + }, + "imagejpeg": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagelayereffect": { + "ext.name": "gd", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "imageline": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imageloadfont": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagepalettecopy": { + "ext.name": "gd", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "imagepalettetotruecolor": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "imagepng": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagepolygon": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagepsbbox": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagepsencodefont": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagepsextendfont": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagepsfreefont": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagepsloadfont": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagepsslantfont": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagepstext": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagerectangle": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagerotate": { + "ext.name": "gd", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "imagesavealpha": { + "ext.name": "gd", + "ext.min": "4.3.2", + "ext.max": null, + "php.min": "4.3.2", + "php.max": null + }, + "imagescale": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "imagesetbrush": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagesetinterpolation": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "imagesetpixel": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagesetstyle": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagesetthickness": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagesettile": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagestring": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagestringup": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagesx": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagesy": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagetruecolortopalette": { + "ext.name": "gd", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "imagettfbbox": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagettftext": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imagetypes": { + "ext.name": "gd", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "imagewbmp": { + "ext.name": "gd", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "imagewebp": { + "ext.name": "gd", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "imagexbm": { + "ext.name": "gd", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "imap_8bit": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_alerts": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_append": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_base64": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_binary": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_body": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_bodystruct": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_check": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_clearflag_full": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_close": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_create": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_createmailbox": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_delete": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_deletemailbox": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_errors": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_expunge": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_fetch_overview": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_fetchbody": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_fetchheader": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_fetchmime": { + "ext.name": "imap", + "ext.min": "5.3.6", + "ext.max": null, + "php.min": "5.3.6", + "php.max": null + }, + "imap_fetchstructure": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_fetchtext": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_gc": { + "ext.name": "imap", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "imap_get_quota": { + "ext.name": "imap", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "imap_get_quotaroot": { + "ext.name": "imap", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "imap_getacl": { + "ext.name": "imap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "imap_getmailboxes": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_getsubscribed": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_header": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_headerinfo": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_headers": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_last_error": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_list": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_listmailbox": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_listscan": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_listsubscribed": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_lsub": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_mail": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_mail_compose": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_mail_copy": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_mail_move": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_mailboxmsginfo": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_mime_header_decode": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_msgno": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_mutf7_to_utf8": { + "ext.name": "imap", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "imap_num_msg": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_num_recent": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_open": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_ping": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_qprint": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_rename": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_renamemailbox": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_reopen": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_rfc822_parse_adrlist": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_rfc822_parse_headers": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_rfc822_write_address": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_savebody": { + "ext.name": "imap", + "ext.min": "5.1.3", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "imap_scan": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_scanmailbox": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_search": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_set_quota": { + "ext.name": "imap", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "imap_setacl": { + "ext.name": "imap", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "imap_setflag_full": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_sort": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_status": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_subscribe": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_thread": { + "ext.name": "imap", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "imap_timeout": { + "ext.name": "imap", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "imap_uid": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_undelete": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_unsubscribe": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_utf7_decode": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_utf7_encode": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_utf8": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "imap_utf8_to_mutf7": { + "ext.name": "imap", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "implode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "import_request_variables": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": "5.3.29" + }, + "in_array": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "inclued_get_data": { + "ext.name": "inclued", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "inet_ntop": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "inet_pton": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "ini_alter": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ini_get": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ini_get_all": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ini_restore": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ini_set": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "input_filters_list": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": "0.10.0", + "php.min": "4.0.0", + "php.max": null + }, + "input_get": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": "0.10.0", + "php.min": "4.0.0", + "php.max": null + }, + "input_get_args": { + "ext.name": "filter", + "ext.min": "0.10.0", + "ext.max": "0.10.0", + "php.min": "5.0.0", + "php.max": null + }, + "input_has_variable": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": "0.10.0", + "php.min": "4.0.0", + "php.max": null + }, + "input_name_to_filter": { + "ext.name": "filter", + "ext.min": "0.9.2", + "ext.max": "0.10.0", + "php.min": "4.0.0", + "php.max": null + }, + "interface_exists": { + "ext.name": "Core", + "ext.min": "5.0.2", + "ext.max": null, + "php.min": "5.0.2", + "php.max": null + }, + "intl_error_name": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "intl_get_error_code": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "intl_get_error_message": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "intl_is_failure": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "intlcal_add": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_after": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_before": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_clear": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_create_instance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_equals": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_field_difference": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_from_date_time": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_actual_maximum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_actual_minimum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_available_locales": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_day_of_week_type": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_error_code": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_error_message": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_first_day_of_week": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_greatest_minimum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_keyword_values_for_locale": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_least_maximum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_locale": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_maximum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_minimal_days_in_first_week": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_minimum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_now": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_repeated_wall_time_option": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_skipped_wall_time_option": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_time": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_time_zone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_type": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_get_weekend_transition": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_in_daylight_time": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_is_equivalent_to": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_is_lenient": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_is_set": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_is_weekend": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_roll": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_set": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_set_first_day_of_week": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_set_lenient": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_set_minimal_days_in_first_week": { + "ext.name": "intl", + "ext.min": "5.5.1", + "ext.max": null, + "php.min": "5.5.1", + "php.max": null + }, + "intlcal_set_repeated_wall_time_option": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_set_skipped_wall_time_option": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_set_time": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_set_time_zone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlcal_to_date_time": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlgregcal_create_instance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlgregcal_get_gregorian_change": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlgregcal_is_leap_year": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intlgregcal_set_gregorian_change": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_count_equivalent_ids": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_create_default": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_create_enumeration": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_create_time_zone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_create_time_zone_id_enumeration": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_from_date_time_zone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_canonical_id": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_display_name": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_dst_savings": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_equivalent_id": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_error_code": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_error_message": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_gmt": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_id": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_offset": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_raw_offset": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_region": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_tz_data_version": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_get_unknown": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_has_same_rules": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_to_date_time_zone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intltz_use_daylight_time": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "intval": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ip2long": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "iptcembed": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "iptcparse": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_a": { + "ext.name": "Core", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "is_array": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_bool": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_callable": { + "ext.name": "standard", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "is_dir": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_double": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_executable": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_file": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_finite": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "is_float": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_infinite": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "is_int": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_integer": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_link": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_long": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_nan": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "is_null": { + "ext.name": "standard", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "is_numeric": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_object": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_readable": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_real": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_resource": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_scalar": { + "ext.name": "standard", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "is_soap_fault": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "is_string": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_subclass_of": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_uploaded_file": { + "ext.name": "standard", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "is_writable": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "is_writeable": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "isset": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "iterator_apply": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "iterator_count": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "iterator_to_array": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "jddayofweek": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "jdmonthname": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "jdtofrench": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "jdtogregorian": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "jdtojewish": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "jdtojulian": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "jdtounix": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "jewishtojd": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "join": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "jpeg2wbmp": { + "ext.name": "gd", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "jsmin": { + "ext.name": "jsmin", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.10", + "php.max": null + }, + "jsmin_last_error": { + "ext.name": "jsmin", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.10", + "php.max": null + }, + "jsmin_last_error_msg": { + "ext.name": "jsmin", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.10", + "php.max": null + }, + "json_decode": { + "ext.name": "json", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "json_encode": { + "ext.name": "json", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "json_last_error": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "json_last_error_msg": { + "ext.name": "json", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "juliantojd": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "key": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "key_exists": { + "ext.name": "standard", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "krsort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ksort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "lcfirst": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "lcg_value": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "lchgrp": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "lchown": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "ldap_add": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_bind": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_close": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_compare": { + "ext.name": "ldap", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "ldap_connect": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_control_paged_result": { + "ext.name": "ldap", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ldap_control_paged_result_response": { + "ext.name": "ldap", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ldap_count_entries": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_delete": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_dn2ufn": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_err2str": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_errno": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_error": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_escape": { + "ext.name": "ldap", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "ldap_explode_dn": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_first_attribute": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_first_entry": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_first_reference": { + "ext.name": "ldap", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "ldap_free_result": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_get_attributes": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_get_dn": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_get_entries": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_get_option": { + "ext.name": "ldap", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ldap_get_values": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_get_values_len": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_list": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_mod_add": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_mod_del": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_mod_replace": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_modify": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_modify_batch": { + "ext.name": "ldap", + "ext.min": "5.4.26", + "ext.max": null, + "php.min": "5.4.26", + "php.max": null + }, + "ldap_next_attribute": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_next_entry": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_next_reference": { + "ext.name": "ldap", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "ldap_parse_reference": { + "ext.name": "ldap", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "ldap_parse_result": { + "ext.name": "ldap", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "ldap_read": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_rename": { + "ext.name": "ldap", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "ldap_sasl_bind": { + "ext.name": "ldap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ldap_search": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ldap_set_option": { + "ext.name": "ldap", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ldap_set_rebind_proc": { + "ext.name": "ldap", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ldap_sort": { + "ext.name": "ldap", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ldap_start_tls": { + "ext.name": "ldap", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ldap_unbind": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "levenshtein": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "libxml_clear_errors": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "libxml_disable_entity_loader": { + "ext.name": "libxml", + "ext.min": "5.2.11", + "ext.max": null, + "php.min": "5.2.11", + "php.max": null + }, + "libxml_get_errors": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "libxml_get_last_error": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "libxml_set_external_entity_loader": { + "ext.name": "libxml", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "libxml_set_streams_context": { + "ext.name": "libxml", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "libxml_use_internal_errors": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "link": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "linkinfo": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "list": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "locale_accept_from_http": { + "ext.name": "intl", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "locale_canonicalize": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_compose": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_filter_matches": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_all_variants": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_default": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_display_language": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_display_name": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_display_region": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_display_script": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_display_variant": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_keywords": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_primary_language": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_region": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_get_script": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_lookup": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_parse": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locale_set_default": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "localeconv": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "localtime": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "log": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "log10": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "log1p": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "long2ip": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "lstat": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ltrim": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "lzf_compress": { + "ext.name": "lzf", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "lzf_decompress": { + "ext.name": "lzf", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "lzf_optimized_for": { + "ext.name": "lzf", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "magic_quotes_runtime": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mail": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mailparse_determine_best_xfer_encoding": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_create": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_extract_part": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_extract_part_file": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_extract_whole_part_file": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_free": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_get_part": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_get_part_data": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_get_structure": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_parse": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_msg_parse_file": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_rfc822_parse_addresses": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_stream_encode": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_test": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mailparse_uudecode_all": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "max": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mb_check_encoding": { + "ext.name": "mbstring", + "ext.min": "4.4.3", + "ext.max": null, + "php.min": "4.4.3", + "php.max": null + }, + "mb_convert_case": { + "ext.name": "mbstring", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mb_convert_encoding": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_convert_kana": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_convert_variables": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_decode_mimeheader": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_decode_numericentity": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_detect_encoding": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_detect_order": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_encode_mimeheader": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_encode_numericentity": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_encoding_aliases": { + "ext.name": "mbstring", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "mb_ereg": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_ereg_match": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_ereg_replace": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_ereg_replace_callback": { + "ext.name": "mbstring", + "ext.min": "5.4.1", + "ext.max": null, + "php.min": "5.4.1", + "php.max": null + }, + "mb_ereg_search": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_ereg_search_getpos": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_ereg_search_getregs": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_ereg_search_init": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_ereg_search_pos": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_ereg_search_regs": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_ereg_search_setpos": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_eregi": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_eregi_replace": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_get_info": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_http_input": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_http_output": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_internal_encoding": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_language": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_list_encodings": { + "ext.name": "mbstring", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mb_output_handler": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_parse_str": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_preferred_mime_name": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_regex_encoding": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_regex_set_options": { + "ext.name": "mbstring", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mb_send_mail": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_split": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mb_strcut": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_strimwidth": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_stripos": { + "ext.name": "mbstring", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mb_stristr": { + "ext.name": "mbstring", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mb_strlen": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_strpos": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_strrchr": { + "ext.name": "mbstring", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mb_strrichr": { + "ext.name": "mbstring", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mb_strripos": { + "ext.name": "mbstring", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mb_strrpos": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_strstr": { + "ext.name": "mbstring", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mb_strtolower": { + "ext.name": "mbstring", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mb_strtoupper": { + "ext.name": "mbstring", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mb_strwidth": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_substitute_character": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_substr": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mb_substr_count": { + "ext.name": "mbstring", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mbereg": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbereg_match": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbereg_replace": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbereg_search": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbereg_search_getpos": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbereg_search_getregs": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbereg_search_init": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbereg_search_pos": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbereg_search_regs": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbereg_search_setpos": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mberegi": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mberegi_replace": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbregex_encoding": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mbsplit": { + "ext.name": "mbstring", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mcrypt_cbc": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mcrypt_cfb": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mcrypt_create_iv": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mcrypt_decrypt": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_ecb": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mcrypt_enc_get_algorithms_name": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_enc_get_block_size": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_enc_get_iv_size": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_enc_get_key_size": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_enc_get_modes_name": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_enc_get_supported_key_sizes": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_enc_is_block_algorithm": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_enc_is_block_algorithm_mode": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_enc_is_block_mode": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_enc_self_test": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_encrypt": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_generic": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_generic_deinit": { + "ext.name": "mcrypt", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "mcrypt_generic_end": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_generic_init": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_get_block_size": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mcrypt_get_cipher_name": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mcrypt_get_iv_size": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_get_key_size": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mcrypt_list_algorithms": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_list_modes": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_module_close": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_module_get_algo_block_size": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_module_get_algo_key_size": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_module_get_supported_key_sizes": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_module_is_block_algorithm": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_module_is_block_algorithm_mode": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_module_is_block_mode": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_module_open": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_module_self_test": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "mcrypt_ofb": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "md5": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "md5_file": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mdecrypt_generic": { + "ext.name": "mcrypt", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "memcache_add": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_add_server": { + "ext.name": "memcache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_append": { + "ext.name": "memcache", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "memcache_cas": { + "ext.name": "memcache", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "memcache_close": { + "ext.name": "memcache", + "ext.min": "0.4", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_connect": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_debug": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_decrement": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_delete": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_flush": { + "ext.name": "memcache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_get": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_get_extended_stats": { + "ext.name": "memcache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_get_server_status": { + "ext.name": "memcache", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_get_stats": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_get_version": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_increment": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_pconnect": { + "ext.name": "memcache", + "ext.min": "0.4", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_prepend": { + "ext.name": "memcache", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "memcache_replace": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_set": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_set_compress_threshold": { + "ext.name": "memcache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memcache_set_failure_callback": { + "ext.name": "memcache", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "memcache_set_server_params": { + "ext.name": "memcache", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "memory_get_peak_usage": { + "ext.name": "standard", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "memory_get_usage": { + "ext.name": "standard", + "ext.min": "4.3.2", + "ext.max": null, + "php.min": "4.3.2", + "php.max": null + }, + "metaphone": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "method_exists": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mhash": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mhash_count": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mhash_get_block_size": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mhash_get_hash_name": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mhash_keygen_s2k": { + "ext.name": "mhash", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "microtime": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mime_content_type": { + "ext.name": "fileinfo", + "ext.min": "1.0.5-dev", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "min": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mkdir": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mktime": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "money_format": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "move_uploaded_file": { + "ext.name": "standard", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "msg_get_queue": { + "ext.name": "sysvmsg", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "msg_queue_exists": { + "ext.name": "sysvmsg", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "msg_receive": { + "ext.name": "sysvmsg", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "msg_remove_queue": { + "ext.name": "sysvmsg", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "msg_send": { + "ext.name": "sysvmsg", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "msg_set_queue": { + "ext.name": "sysvmsg", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "msg_stat_queue": { + "ext.name": "sysvmsg", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "msgfmt_create": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgfmt_format": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgfmt_format_message": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgfmt_get_error_code": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgfmt_get_error_message": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgfmt_get_locale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgfmt_get_pattern": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgfmt_parse": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgfmt_parse_message": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgfmt_set_pattern": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msgpack_pack": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "msgpack_serialize": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "msgpack_unpack": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "msgpack_unserialize": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mssql_bind": { + "ext.name": "mssql", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "mssql_close": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_connect": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_data_seek": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_execute": { + "ext.name": "mssql", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "mssql_fetch_array": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_fetch_assoc": { + "ext.name": "mssql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "mssql_fetch_batch": { + "ext.name": "mssql", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "mssql_fetch_field": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_fetch_object": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_fetch_row": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_field_length": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_field_name": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_field_seek": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_field_type": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_free_result": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_free_statement": { + "ext.name": "mssql", + "ext.min": "4.3.2", + "ext.max": null, + "php.min": "4.3.2", + "php.max": null + }, + "mssql_get_last_message": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_guid_string": { + "ext.name": "mssql", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "mssql_init": { + "ext.name": "mssql", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "mssql_min_error_severity": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_min_message_severity": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_next_result": { + "ext.name": "mssql", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "mssql_num_fields": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_num_rows": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_pconnect": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_query": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_result": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mssql_rows_affected": { + "ext.name": "mssql", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "mssql_select_db": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mt_getrandmax": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mt_rand": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mt_srand": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_affected_rows": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_client_encoding": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mysql_close": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_connect": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_create_db": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_data_seek": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_db_name": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_db_query": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_dbname": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_drop_db": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_errno": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_error": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_escape_string": { + "ext.name": "mysql", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "mysql_fetch_array": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_fetch_assoc": { + "ext.name": "mysql", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "mysql_fetch_field": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_fetch_lengths": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_fetch_object": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_fetch_row": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_field_flags": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_field_len": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_field_name": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_field_seek": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_field_table": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_field_type": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_fieldflags": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_fieldlen": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_fieldname": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_fieldtable": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_fieldtype": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_free_result": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_freeresult": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_get_client_info": { + "ext.name": "mysql", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "mysql_get_host_info": { + "ext.name": "mysql", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "mysql_get_proto_info": { + "ext.name": "mysql", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "mysql_get_server_info": { + "ext.name": "mysql", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "mysql_info": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mysql_insert_id": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_list_dbs": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_list_fields": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_list_processes": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mysql_list_tables": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_listdbs": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_listfields": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_listtables": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_num_fields": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_num_rows": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_numfields": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_numrows": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_pconnect": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_ping": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mysql_query": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_real_escape_string": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mysql_result": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_select_db": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_selectdb": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_set_charset": { + "ext.name": "mysql", + "ext.min": "5.2.3", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "mysql_stat": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mysql_table_name": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_tablename": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "mysql_thread_id": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mysql_unbuffered_query": { + "ext.name": "mysql", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "mysqli_affected_rows": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_autocommit": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_begin_transaction": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "mysqli_bind_param": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.3.29" + }, + "mysqli_bind_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.3.29" + }, + "mysqli_change_user": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_character_set_name": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_client_encoding": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.3.29" + }, + "mysqli_close": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_commit": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_connect": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_connect_errno": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_connect_error": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_data_seek": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_debug": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_disable_reads_from_master": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_disable_rpl_parse": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_dump_debug_info": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_embedded_server_end": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_embedded_server_start": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_enable_reads_from_master": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_enable_rpl_parse": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_errno": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_error": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_error_list": { + "ext.name": "mysqli", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "mysqli_escape_string": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_execute": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_fetch": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.3.29" + }, + "mysqli_fetch_all": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_fetch_array": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_fetch_assoc": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_fetch_field": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_fetch_field_direct": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_fetch_fields": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_fetch_lengths": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_fetch_object": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_fetch_row": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_field_count": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_field_seek": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_field_tell": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_free_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_cache_stats": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_charset": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_client_info": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_client_stats": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_client_version": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_connection_stats": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_host_info": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_links_stats": { + "ext.name": "mysqli", + "ext.min": "5.6.0alpha2", + "ext.max": null, + "php.min": "5.6.0alpha2", + "php.max": null + }, + "mysqli_get_metadata": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.3.29" + }, + "mysqli_get_proto_info": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_server_info": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_server_version": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_get_warnings": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_info": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_init": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_insert_id": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_kill": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_master_query": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_more_results": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_multi_query": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_next_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_num_fields": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_num_rows": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_options": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_param_count": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.3.29" + }, + "mysqli_ping": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_poll": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_prepare": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_query": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_real_connect": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_real_escape_string": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_real_query": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_reap_async_query": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_refresh": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "mysqli_release_savepoint": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "mysqli_report": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_rollback": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_rpl_parse_enabled": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_rpl_probe": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_rpl_query_type": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_savepoint": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "mysqli_select_db": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_send_long_data": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.3.29" + }, + "mysqli_send_query": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_set_charset": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_set_local_infile_default": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_set_local_infile_handler": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_set_opt": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_slave_query": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "mysqli_sqlstate": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_ssl_set": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stat": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_affected_rows": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_attr_get": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_attr_set": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_bind_param": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_bind_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_close": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_data_seek": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_errno": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_error": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_error_list": { + "ext.name": "mysqli", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "mysqli_stmt_execute": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_fetch": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_field_count": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_free_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_get_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_get_warnings": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_init": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_insert_id": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_more_results": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_next_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_num_rows": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_param_count": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_prepare": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_reset": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_result_metadata": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_send_long_data": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_sqlstate": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt_store_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_store_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_thread_id": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_thread_safe": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_use_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_warning_count": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "natcasesort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "natsort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "next": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ngettext": { + "ext.name": "gettext", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "nl2br": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "nl_langinfo": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "normalizer_is_normalized": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "normalizer_normalize": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "number_format": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "numfmt_create": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_format": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_format_currency": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_get_attribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_get_error_code": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_get_error_message": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_get_locale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_get_pattern": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_get_symbol": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_get_text_attribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_parse": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_parse_currency": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_set_attribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_set_pattern": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_set_symbol": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "numfmt_set_text_attribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "oauth_get_sbs": { + "ext.name": "OAuth", + "ext.min": "0.99.8", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "oauth_urlencode": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "ob_clean": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ob_deflatehandler": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "ob_end_clean": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ob_end_flush": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ob_etaghandler": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "ob_flush": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ob_get_clean": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ob_get_contents": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ob_get_flush": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ob_get_length": { + "ext.name": "standard", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "ob_get_level": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ob_get_status": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "ob_gzhandler": { + "ext.name": "zlib", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "ob_iconv_handler": { + "ext.name": "iconv", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": "5.3.29" + }, + "ob_implicit_flush": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ob_inflatehandler": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "ob_list_handlers": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ob_start": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ob_tidyhandler": { + "ext.name": "tidy", + "ext.min": "2.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.3.29" + }, + "octdec": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_autocommit": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_binmode": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_close": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_close_all": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_columnprivileges": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_columns": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_commit": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_connect": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_cursor": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_data_source": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_do": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_error": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_errormsg": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_exec": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_execute": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_fetch_array": { + "ext.name": "odbc", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "odbc_fetch_into": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_fetch_object": { + "ext.name": "odbc", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "odbc_fetch_row": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_field_len": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_field_name": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_field_num": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_field_precision": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_field_scale": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_field_type": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_foreignkeys": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_free_result": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_gettypeinfo": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_longreadlen": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_next_result": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_num_fields": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_num_rows": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_pconnect": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_prepare": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_primarykeys": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_procedurecolumns": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_procedures": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_result": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_result_all": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_rollback": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_setoption": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_specialcolumns": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_statistics": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_tableprivileges": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "odbc_tables": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "opcache_compile_file": { + "ext.name": "Zend OPcache", + "ext.min": "7.0.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "opcache_get_configuration": { + "ext.name": "Zend OPcache", + "ext.min": "7.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "opcache_get_status": { + "ext.name": "Zend OPcache", + "ext.min": "7.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "opcache_invalidate": { + "ext.name": "Zend OPcache", + "ext.min": "7.0.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "opcache_is_script_cached": { + "ext.name": "Zend OPcache", + "ext.min": "7.0.4", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "opcache_reset": { + "ext.name": "Zend OPcache", + "ext.min": "7.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "opendir": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "openlog": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "openssl_cipher_iv_length": { + "ext.name": "openssl", + "ext.min": "5.3.3", + "ext.max": null, + "php.min": "5.3.3", + "php.max": null + }, + "openssl_csr_export": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_csr_export_to_file": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_csr_get_public_key": { + "ext.name": "openssl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "openssl_csr_get_subject": { + "ext.name": "openssl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "openssl_csr_new": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_csr_sign": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_decrypt": { + "ext.name": "openssl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "openssl_dh_compute_key": { + "ext.name": "openssl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "openssl_digest": { + "ext.name": "openssl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "openssl_encrypt": { + "ext.name": "openssl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "openssl_error_string": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_free_key": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "openssl_get_cert_locations": { + "ext.name": "openssl", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "openssl_get_cipher_methods": { + "ext.name": "openssl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "openssl_get_md_methods": { + "ext.name": "openssl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "openssl_get_privatekey": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "openssl_get_publickey": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "openssl_open": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "openssl_pbkdf2": { + "ext.name": "openssl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "openssl_pkcs12_export": { + "ext.name": "openssl", + "ext.min": "5.2.2", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "openssl_pkcs12_export_to_file": { + "ext.name": "openssl", + "ext.min": "5.2.2", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "openssl_pkcs12_read": { + "ext.name": "openssl", + "ext.min": "5.2.2", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "openssl_pkcs7_decrypt": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_pkcs7_encrypt": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_pkcs7_sign": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_pkcs7_verify": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_pkey_export": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_pkey_export_to_file": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_pkey_free": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_pkey_get_details": { + "ext.name": "openssl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "openssl_pkey_get_private": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_pkey_get_public": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_pkey_new": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_private_decrypt": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_private_encrypt": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_public_decrypt": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_public_encrypt": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_random_pseudo_bytes": { + "ext.name": "openssl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "openssl_seal": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "openssl_sign": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "openssl_spki_export": { + "ext.name": "openssl", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "openssl_spki_export_challenge": { + "ext.name": "openssl", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "openssl_spki_new": { + "ext.name": "openssl", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "openssl_spki_verify": { + "ext.name": "openssl", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "openssl_verify": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "openssl_x509_check_private_key": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_x509_checkpurpose": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_x509_export": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_x509_export_to_file": { + "ext.name": "openssl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "openssl_x509_fingerprint": { + "ext.name": "openssl", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "openssl_x509_free": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_x509_parse": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "openssl_x509_read": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "ord": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "output_add_rewrite_var": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "output_reset_rewrite_vars": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pack": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "parse_ini_file": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "parse_ini_string": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "parse_str": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "parse_url": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "passthru": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "password_get_info": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "password_hash": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "password_needs_rehash": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "password_verify": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "pathinfo": { + "ext.name": "standard", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "pclose": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pcntl_alarm": { + "ext.name": "pcntl", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pcntl_errno": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "pcntl_exec": { + "ext.name": "pcntl", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pcntl_fork": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "pcntl_get_last_error": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "pcntl_getpriority": { + "ext.name": "pcntl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "pcntl_setpriority": { + "ext.name": "pcntl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "pcntl_signal": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "pcntl_signal_dispatch": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "pcntl_sigprocmask": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "pcntl_sigtimedwait": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "pcntl_sigwaitinfo": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "pcntl_strerror": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "pcntl_wait": { + "ext.name": "pcntl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "pcntl_waitpid": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "pcntl_wexitstatus": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "pcntl_wifexited": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "pcntl_wifsignaled": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "pcntl_wifstopped": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "pcntl_wstopsig": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "pcntl_wtermsig": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "pdf_activate_item": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_bookmark": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_launchlink": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_locallink": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_nameddest": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_note": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_path_point": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_pdflink": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_portfolio_file": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_portfolio_folder": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_table_cell": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_textflow": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_thumbnail": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_add_weblink": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_align": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_arc": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_arcn": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_attach_file": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_document": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_dpart": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_font": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_glyph": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_glyph_ext": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_item": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_layer": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_mc": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_page_ext": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_pattern": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_pattern_ext": { + "ext.name": "pdflib", + "ext.min": "3.0.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_template": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_begin_template_ext": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_circle": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_circular_arc": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_clip": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_close": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_close_font": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_close_graphics": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_close_image": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_close_pdi": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_close_pdi_document": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_close_pdi_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_closepath": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_closepath_fill_stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_closepath_stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_concat": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_continue_text": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_convert_to_unicode": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_create_3dview": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_create_action": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_create_annotation": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_create_bookmark": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_create_field": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_create_fieldgroup": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_create_gstate": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_create_pvf": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_create_textflow": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_curveto": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_define_layer": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_delete": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_delete_path": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_delete_pvf": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_delete_table": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_delete_textflow": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_draw_path": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_ellipse": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_elliptical_arc": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_encoding_set_char": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_document": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_dpart": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_font": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_glyph": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_item": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_layer": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_mc": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_page_ext": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_pattern": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_template": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_end_template_ext": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_endpath": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fill": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fill_graphicsblock": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fill_imageblock": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fill_pdfblock": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fill_stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fill_textblock": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_findfont": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fit_graphics": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fit_image": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fit_pdi_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fit_table": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fit_textflow": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_fit_textline": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_apiname": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_buffer": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_errmsg": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_errnum": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_option": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_parameter": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_pdi_parameter": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_pdi_value": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_string": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_get_value": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_font": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_graphics": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_image": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_matchbox": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_path": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_pdi_page": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_pvf": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_table": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_textflow": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_info_textline": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_initgraphics": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_lineto": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_load_3ddata": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_load_asset": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_load_font": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_load_graphics": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_load_iccprofile": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_load_image": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_makespotcolor": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_mc_point": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_moveto": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_new": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_open_ccitt": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_open_file": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_open_image": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_open_image_file": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_open_pdi": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_open_pdi_document": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_open_pdi_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_pcos_get_number": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_pcos_get_stream": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_pcos_get_string": { + "ext.name": "pdflib", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_place_image": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_place_pdi_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_poca_delete": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_poca_insert": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_poca_new": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_poca_remove": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_process_pdi": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_rect": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_restore": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_resume_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_rotate": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_save": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_scale": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_border_color": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_border_dash": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_border_style": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_graphics_option": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_gstate": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_info": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_layer_dependency": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_option": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_parameter": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_text_option": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_text_pos": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_set_value": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setcolor": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setdash": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setdashpattern": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setflat": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setfont": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setgray": { + "ext.name": "pdflib", + "ext.min": "2.0.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setgray_fill": { + "ext.name": "pdflib", + "ext.min": "2.0.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setgray_stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setlinecap": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setlinejoin": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setlinewidth": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setmatrix": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setmiterlimit": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setpolydash": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setrgbcolor": { + "ext.name": "pdflib", + "ext.min": "2.0.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setrgbcolor_fill": { + "ext.name": "pdflib", + "ext.min": "2.0.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_setrgbcolor_stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_shading": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_shading_pattern": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_shfill": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_show": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_show_boxed": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_show_xy": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_skew": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_stringwidth": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_suspend_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_translate": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_utf16_to_utf32": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_utf16_to_utf8": { + "ext.name": "pdflib", + "ext.min": "2.0.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_utf32_to_utf16": { + "ext.name": "pdflib", + "ext.min": "2.1.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_utf32_to_utf8": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_utf8_to_utf16": { + "ext.name": "pdflib", + "ext.min": "2.0.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdf_utf8_to_utf32": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdo_drivers": { + "ext.name": "PDO", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pfsockopen": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_affected_rows": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_cancel_query": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_client_encoding": { + "ext.name": "pgsql", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "pg_clientencoding": { + "ext.name": "pgsql", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "pg_close": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_cmdtuples": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_connect": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_connect_poll": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "pg_connection_busy": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_connection_reset": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_connection_status": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_consume_input": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "pg_convert": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_copy_from": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_copy_to": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_dbname": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_delete": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_end_copy": { + "ext.name": "pgsql", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "pg_errormessage": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_escape_bytea": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_escape_identifier": { + "ext.name": "pgsql", + "ext.min": "5.4.4", + "ext.max": null, + "php.min": "5.4.4", + "php.max": null + }, + "pg_escape_literal": { + "ext.name": "pgsql", + "ext.min": "5.4.4", + "ext.max": null, + "php.min": "5.4.4", + "php.max": null + }, + "pg_escape_string": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_exec": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_execute": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_fetch_all": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_fetch_all_columns": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_fetch_array": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_fetch_assoc": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_fetch_object": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_fetch_result": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_fetch_row": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_field_is_null": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_field_name": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_field_num": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_field_prtlen": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_field_size": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_field_table": { + "ext.name": "pgsql", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pg_field_type": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_field_type_oid": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_fieldisnull": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_fieldname": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_fieldnum": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_fieldprtlen": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_fieldsize": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_fieldtype": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_flush": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "pg_free_result": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_freeresult": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_get_notify": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_get_pid": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_get_result": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_getlastoid": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_host": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_insert": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_last_error": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_last_notice": { + "ext.name": "pgsql", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "pg_last_oid": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_close": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_create": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_export": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_import": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_open": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_read": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_read_all": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_seek": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_tell": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_truncate": { + "ext.name": "pgsql", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "pg_lo_unlink": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lo_write": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_loclose": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_locreate": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_loexport": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_loimport": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_loopen": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_loread": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_loreadall": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lounlink": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_lowrite": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_meta_data": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_num_fields": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_num_rows": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_numfields": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_numrows": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_options": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_parameter_status": { + "ext.name": "pgsql", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "pg_pconnect": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_ping": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_port": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_prepare": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_put_line": { + "ext.name": "pgsql", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "pg_query": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_query_params": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_result": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_result_error": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_result_error_field": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_result_seek": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_result_status": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_select": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_send_execute": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_send_prepare": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_send_query": { + "ext.name": "pgsql", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "pg_send_query_params": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_set_client_encoding": { + "ext.name": "pgsql", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "pg_set_error_verbosity": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_setclientencoding": { + "ext.name": "pgsql", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "pg_socket": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "pg_trace": { + "ext.name": "pgsql", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "pg_transaction_status": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "pg_tty": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pg_unescape_bytea": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_untrace": { + "ext.name": "pgsql", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "pg_update": { + "ext.name": "pgsql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "pg_version": { + "ext.name": "pgsql", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "php_check_syntax": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.0.4" + }, + "php_egg_logo_guid": { + "ext.name": "standard", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": "5.4.45" + }, + "php_ini_loaded_file": { + "ext.name": "standard", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "php_ini_scanned_files": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "php_logo_guid": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "5.4.45" + }, + "php_real_logo_guid": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "5.4.45" + }, + "php_sapi_name": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "php_strip_whitespace": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "php_uname": { + "ext.name": "standard", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "phpcredits": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "phpinfo": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "phpversion": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pi": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "png2wbmp": { + "ext.name": "gd", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "popen": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pos": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_access": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "posix_ctermid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_errno": { + "ext.name": "posix", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "posix_get_last_error": { + "ext.name": "posix", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "posix_getcwd": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getegid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_geteuid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getgid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getgrgid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getgrnam": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getgroups": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getlogin": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getpgid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getpgrp": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getpid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getppid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getpwnam": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getpwuid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getrlimit": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getsid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_getuid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_initgroups": { + "ext.name": "posix", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "posix_isatty": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_kill": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_mkfifo": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_mknod": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "posix_setegid": { + "ext.name": "posix", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "posix_seteuid": { + "ext.name": "posix", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "posix_setgid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_setpgid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_setsid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_setuid": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_strerror": { + "ext.name": "posix", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "posix_times": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_ttyname": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "posix_uname": { + "ext.name": "posix", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "pow": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "preg_filter": { + "ext.name": "pcre", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "preg_grep": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "preg_last_error": { + "ext.name": "pcre", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "preg_match": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "preg_match_all": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "preg_quote": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "preg_replace": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "preg_replace_callback": { + "ext.name": "pcre", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "preg_split": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "prev": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "print_r": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "printf": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "proc_close": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "proc_get_status": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "proc_nice": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "proc_open": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "proc_terminate": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "property_exists": { + "ext.name": "Core", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "putenv": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "quoted_printable_decode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "quoted_printable_encode": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "quotemeta": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "rad2deg": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "rand": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "range": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "rar_allow_broken_set": { + "ext.name": "rar", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rar_broken_is": { + "ext.name": "rar", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rar_close": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rar_comment_get": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rar_entry_get": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rar_list": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rar_open": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rar_solid_is": { + "ext.name": "rar", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rar_wrapper_cache_stats": { + "ext.name": "rar", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rawurldecode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "rawurlencode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "read_exif_data": { + "ext.name": "exif", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "readdir": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readfile": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readgzfile": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readline": { + "ext.name": "readline", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readline_add_history": { + "ext.name": "readline", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readline_callback_handler_install": { + "ext.name": "readline", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "readline_callback_handler_remove": { + "ext.name": "readline", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "readline_callback_read_char": { + "ext.name": "readline", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "readline_clear_history": { + "ext.name": "readline", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readline_completion_function": { + "ext.name": "readline", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readline_info": { + "ext.name": "readline", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readline_list_history": { + "ext.name": "readline", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readline_on_new_line": { + "ext.name": "readline", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "readline_read_history": { + "ext.name": "readline", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readline_redisplay": { + "ext.name": "readline", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "readline_write_history": { + "ext.name": "readline", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "readlink": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "realpath": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "realpath_cache_get": { + "ext.name": "standard", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "realpath_cache_size": { + "ext.name": "standard", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "recode": { + "ext.name": "recode", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "recode_file": { + "ext.name": "recode", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "recode_string": { + "ext.name": "recode", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "register_shutdown_function": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "register_tick_function": { + "ext.name": "standard", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "rename": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "reset": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "resourcebundle_count": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "resourcebundle_create": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "resourcebundle_get": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "resourcebundle_get_error_code": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "resourcebundle_get_error_message": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "resourcebundle_locales": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "restore_error_handler": { + "ext.name": "Core", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "restore_exception_handler": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "restore_include_path": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "rewind": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "rewinddir": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "rmdir": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "round": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "rsort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "rtrim": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "scandir": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sem_acquire": { + "ext.name": "sysvsem", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sem_get": { + "ext.name": "sysvsem", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sem_release": { + "ext.name": "sysvsem", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sem_remove": { + "ext.name": "sysvsem", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "serialize": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_abort": { + "ext.name": "session", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "session_cache_expire": { + "ext.name": "session", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "session_cache_limiter": { + "ext.name": "session", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "session_commit": { + "ext.name": "session", + "ext.min": "4.4.0", + "ext.max": null, + "php.min": "4.4.0", + "php.max": null + }, + "session_decode": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_destroy": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_encode": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_gc": { + "ext.name": "session", + "ext.min": "5.6.0alpha1", + "ext.max": "5.6.0alpha3", + "php.min": "5.6.0alpha1", + "php.max": "5.6.0alpha3" + }, + "session_get_cookie_params": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_id": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_is_registered": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "5.3.29" + }, + "session_module_name": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_name": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_regenerate_id": { + "ext.name": "session", + "ext.min": "4.3.2", + "ext.max": null, + "php.min": "4.3.2", + "php.max": null + }, + "session_register": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "5.3.29" + }, + "session_register_shutdown": { + "ext.name": "session", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "session_reset": { + "ext.name": "session", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "session_save_path": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_serializer_name": { + "ext.name": "session", + "ext.min": "5.6.0alpha1", + "ext.max": "5.6.0alpha3", + "php.min": "5.6.0alpha1", + "php.max": "5.6.0alpha3" + }, + "session_set_cookie_params": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_set_save_handler": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_start": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_status": { + "ext.name": "session", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "session_unregister": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "5.3.29" + }, + "session_unset": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "session_write_close": { + "ext.name": "session", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "set_error_handler": { + "ext.name": "Core", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "set_exception_handler": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "set_file_buffer": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "set_include_path": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "set_magic_quotes_runtime": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "set_socket_blocking": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "set_time_limit": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "setcookie": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "setlocale": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "setrawcookie": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "settype": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sha1": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "sha1_file": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "shell_exec": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "shm_attach": { + "ext.name": "sysvshm", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "shm_detach": { + "ext.name": "sysvshm", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "shm_get_var": { + "ext.name": "sysvshm", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "shm_has_var": { + "ext.name": "sysvshm", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "shm_put_var": { + "ext.name": "sysvshm", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "shm_remove": { + "ext.name": "sysvshm", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "shm_remove_var": { + "ext.name": "sysvshm", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "shmop_close": { + "ext.name": "shmop", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "shmop_delete": { + "ext.name": "shmop", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "shmop_open": { + "ext.name": "shmop", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "shmop_read": { + "ext.name": "shmop", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "shmop_size": { + "ext.name": "shmop", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "shmop_write": { + "ext.name": "shmop", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "show_source": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "shuffle": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "similar_text": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "simplexml_import_dom": { + "ext.name": "SimpleXML", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "simplexml_load_file": { + "ext.name": "SimpleXML", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "simplexml_load_string": { + "ext.name": "SimpleXML", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sin": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sinh": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "sizeof": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sleep": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "snmp2_get": { + "ext.name": "snmp", + "ext.min": "4.3.11", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "snmp2_getnext": { + "ext.name": "snmp", + "ext.min": "5.0.4", + "ext.max": null, + "php.min": "5.0.4", + "php.max": null + }, + "snmp2_real_walk": { + "ext.name": "snmp", + "ext.min": "4.3.11", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "snmp2_set": { + "ext.name": "snmp", + "ext.min": "4.3.11", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "snmp2_walk": { + "ext.name": "snmp", + "ext.min": "4.3.11", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "snmp3_get": { + "ext.name": "snmp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "snmp3_getnext": { + "ext.name": "snmp", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "snmp3_real_walk": { + "ext.name": "snmp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "snmp3_set": { + "ext.name": "snmp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "snmp3_walk": { + "ext.name": "snmp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "snmp_get_quick_print": { + "ext.name": "snmp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "snmp_get_valueretrieval": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "snmp_read_mib": { + "ext.name": "snmp", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "snmp_set_enum_print": { + "ext.name": "snmp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "snmp_set_oid_numeric_print": { + "ext.name": "snmp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "snmp_set_oid_output_format": { + "ext.name": "snmp", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "snmp_set_quick_print": { + "ext.name": "snmp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "snmp_set_valueretrieval": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "snmpget": { + "ext.name": "snmp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "snmpgetnext": { + "ext.name": "snmp", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "snmprealwalk": { + "ext.name": "snmp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "snmpset": { + "ext.name": "snmp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "snmpwalk": { + "ext.name": "snmp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "snmpwalkoid": { + "ext.name": "snmp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "socket_accept": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_bind": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_clear_error": { + "ext.name": "sockets", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "socket_close": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_cmsg_space": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "socket_connect": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_create": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_create_listen": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_create_pair": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_get_option": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "socket_get_status": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "socket_getopt": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_getpeername": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_getsockname": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_import_stream": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "socket_last_error": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_listen": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_read": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_recv": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_recvfrom": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_recvmsg": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "socket_select": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_send": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_sendmsg": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "socket_sendto": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_set_block": { + "ext.name": "sockets", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "socket_set_blocking": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "socket_set_nonblock": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_set_option": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "socket_set_timeout": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "socket_setopt": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_shutdown": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_strerror": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "socket_write": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "solr_get_version": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "sort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "soundex": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "spl_autoload": { + "ext.name": "spl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "spl_autoload_call": { + "ext.name": "spl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "spl_autoload_extensions": { + "ext.name": "spl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "spl_autoload_functions": { + "ext.name": "spl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "spl_autoload_register": { + "ext.name": "spl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "spl_autoload_unregister": { + "ext.name": "spl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "spl_classes": { + "ext.name": "spl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "spl_object_hash": { + "ext.name": "spl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "split": { + "ext.name": "ereg", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "spliti": { + "ext.name": "ereg", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "sprintf": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sql_regcase": { + "ext.name": "ereg", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sqlite_array_query": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_busy_timeout": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_changes": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_close": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_column": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_create_aggregate": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_create_function": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_current": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_error_string": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_escape_string": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_exec": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_factory": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_fetch_all": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_fetch_array": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_fetch_column_types": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_fetch_object": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_fetch_single": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_fetch_string": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_field_name": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_has_more": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_has_prev": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_last_error": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_last_insert_rowid": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_libencoding": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_libversion": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_next": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_num_fields": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_num_rows": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_open": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_popen": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_prev": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_query": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_rewind": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_seek": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_single_query": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_udf_decode_binary": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_udf_encode_binary": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_unbuffered_query": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqlite_valid": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "sqrt": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "srand": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sscanf": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "ssh2_auth_agent": { + "ext.name": "ssh2", + "ext.min": "0.12", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_auth_hostbased_file": { + "ext.name": "ssh2", + "ext.min": "0.7", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_auth_none": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_auth_password": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_auth_pubkey_file": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_connect": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_exec": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_fetch_stream": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_fingerprint": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_forward_accept": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_forward_listen": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_methods_negotiated": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_poll": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_publickey_add": { + "ext.name": "ssh2", + "ext.min": "0.10", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_publickey_init": { + "ext.name": "ssh2", + "ext.min": "0.10", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_publickey_list": { + "ext.name": "ssh2", + "ext.min": "0.10", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_publickey_remove": { + "ext.name": "ssh2", + "ext.min": "0.10", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_scp_recv": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_scp_send": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_chmod": { + "ext.name": "ssh2", + "ext.min": "0.12", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_lstat": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_mkdir": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_readlink": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_realpath": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_rename": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_rmdir": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_stat": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_symlink": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_sftp_unlink": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_shell": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ssh2_tunnel": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "stat": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "stomp_abort": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_ack": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_begin": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_close": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_commit": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_connect": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_connect_error": { + "ext.name": "stomp", + "ext.min": "0.3.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_error": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_get_read_timeout": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_get_session_id": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_has_frame": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_nack": { + "ext.name": "stomp", + "ext.min": "1.0.6", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_read_frame": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_send": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_set_read_timeout": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_subscribe": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_unsubscribe": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "stomp_version": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "str_getcsv": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "str_ireplace": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "str_pad": { + "ext.name": "standard", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "str_repeat": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "str_replace": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "str_rot13": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "str_shuffle": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "str_split": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "str_word_count": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "strcasecmp": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strchr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strcmp": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strcoll": { + "ext.name": "standard", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "strcspn": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "stream_bucket_append": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_bucket_make_writeable": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_bucket_new": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_bucket_prepend": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_context_create": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_context_get_default": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "stream_context_get_options": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_context_get_params": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "stream_context_set_default": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "stream_context_set_option": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_context_set_params": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_copy_to_stream": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_filter_append": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_filter_prepend": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_filter_register": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_filter_remove": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "stream_get_contents": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_get_filters": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_get_line": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_get_meta_data": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_get_transports": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_get_wrappers": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_is_local": { + "ext.name": "standard", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "stream_register_wrapper": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_resolve_include_path": { + "ext.name": "standard", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "stream_select": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_set_blocking": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_set_chunk_size": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "stream_set_read_buffer": { + "ext.name": "standard", + "ext.min": "5.3.3", + "ext.max": null, + "php.min": "5.3.3", + "php.max": null + }, + "stream_set_timeout": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_set_write_buffer": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "stream_socket_accept": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_socket_client": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_socket_enable_crypto": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "stream_socket_get_name": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_socket_pair": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "stream_socket_recvfrom": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_socket_sendto": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_socket_server": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stream_socket_shutdown": { + "ext.name": "standard", + "ext.min": "5.2.1", + "ext.max": null, + "php.min": "5.2.1", + "php.max": null + }, + "stream_supports_lock": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "stream_wrapper_register": { + "ext.name": "standard", + "ext.min": "4.3.2", + "ext.max": null, + "php.min": "4.3.2", + "php.max": null + }, + "stream_wrapper_restore": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "stream_wrapper_unregister": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "strftime": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strip_tags": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "stripcslashes": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "stripos": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stripslashes": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "stristr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strlen": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strnatcasecmp": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strnatcmp": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strncasecmp": { + "ext.name": "Core", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "strncmp": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strpbrk": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "strpos": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strptime": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "strrchr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strrev": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strripos": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "strrpos": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strspn": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strstr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strtok": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strtolower": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strtotime": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strtoupper": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strtr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "strval": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "substr": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "substr_compare": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "substr_count": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "substr_replace": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_add": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_auth_get_parameter": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_auth_set_parameter": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_blame": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_cat": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_checkout": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_cleanup": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_client_version": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_commit": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_config_ensure": { + "ext.name": "svn", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_copy": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_delete": { + "ext.name": "svn", + "ext.min": "0.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_diff": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_export": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_abort_txn": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_apply_text": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_begin_txn2": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_change_node_prop": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_check_path": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_contents_changed": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_copy": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_delete": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_dir_entries": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_file_contents": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_file_length": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_is_dir": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_is_file": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_make_dir": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_make_file": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_node_created_rev": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_node_prop": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_props_changed": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_revision_prop": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_revision_root": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_txn_root": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_fs_youngest_rev": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_import": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_info": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_lock": { + "ext.name": "svn", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_log": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_ls": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_mkdir": { + "ext.name": "svn", + "ext.min": "0.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_move": { + "ext.name": "svn", + "ext.min": "0.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_propget": { + "ext.name": "svn", + "ext.min": "0.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_proplist": { + "ext.name": "svn", + "ext.min": "0.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_repos_create": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_repos_fs": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_repos_fs_begin_txn_for_commit": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_repos_fs_commit_txn": { + "ext.name": "svn", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_repos_hotcopy": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_repos_open": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_repos_recover": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_resolved": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_revert": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_status": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_switch": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_unlock": { + "ext.name": "svn", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "svn_update": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "symlink": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "sys_get_temp_dir": { + "ext.name": "standard", + "ext.min": "5.2.1", + "ext.max": null, + "php.min": "5.2.1", + "php.max": null + }, + "sys_getloadavg": { + "ext.name": "standard", + "ext.min": "5.1.3", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "syslog": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "system": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "tan": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "tanh": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "tempnam": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "textdomain": { + "ext.name": "gettext", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "tidy_access_count": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_clean_repair": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_config_count": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_create": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": "0.5.3", + "php.min": "4.3.0", + "php.max": null + }, + "tidy_diagnose": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_error_count": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_body": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_config": { + "ext.name": "tidy", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_error_buffer": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_head": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_html": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_html_ver": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_opt_doc": { + "ext.name": "tidy", + "ext.min": "2.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "tidy_get_output": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_release": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_root": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_get_status": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_getopt": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_is_xhtml": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_is_xml": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_load_config": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": "1.2", + "php.min": "4.3.0", + "php.max": "4.4.9" + }, + "tidy_load_config_enc": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": "1.2", + "php.min": "4.3.0", + "php.max": null + }, + "tidy_parse_file": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_parse_string": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_repair_file": { + "ext.name": "tidy", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_repair_string": { + "ext.name": "tidy", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidy_reset_config": { + "ext.name": "tidy", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "4.4.9" + }, + "tidy_save_config": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": "1.2", + "php.min": "4.3.0", + "php.max": "4.4.9" + }, + "tidy_set_encoding": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": "1.2", + "php.min": "4.3.0", + "php.max": "4.4.9" + }, + "tidy_setopt": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": "1.2", + "php.min": "4.3.0", + "php.max": "4.4.9" + }, + "tidy_warning_count": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "time": { + "ext.name": "date", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "time_nanosleep": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "time_sleep_until": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "timezone_abbreviations_list": { + "ext.name": "date", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "timezone_identifiers_list": { + "ext.name": "date", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "timezone_location_get": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "timezone_name_from_abbr": { + "ext.name": "date", + "ext.min": "5.1.3", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "timezone_name_get": { + "ext.name": "date", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "timezone_offset_get": { + "ext.name": "date", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "timezone_open": { + "ext.name": "date", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "timezone_transitions_get": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "timezone_version_get": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "tmpfile": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "token_get_all": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "token_name": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "touch": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "trait_exists": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "transliterator_create": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "transliterator_create_from_rules": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "transliterator_create_inverse": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "transliterator_get_error_code": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "transliterator_get_error_message": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "transliterator_list_ids": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "transliterator_transliterate": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "trigger_error": { + "ext.name": "Core", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "trim": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "uasort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ucfirst": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ucwords": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "uksort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "umask": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "uniqid": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "unixtojd": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "unlink": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "unpack": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "unregister_tick_function": { + "ext.name": "standard", + "ext.min": "4.0.3", + "ext.max": null, + "php.min": "4.0.3", + "php.max": null + }, + "unserialize": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "uopz_backup": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_compose": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_copy": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_delete": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_extend": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_flags": { + "ext.name": "uopz", + "ext.min": "2.0.2", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_function": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_implement": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_overload": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_redefine": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_rename": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_restore": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uopz_undefine": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "uploadprogress_get_contents": { + "ext.name": "uploadprogress", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "uploadprogress_get_info": { + "ext.name": "uploadprogress", + "ext.min": "0.3.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "urldecode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "urlencode": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "use_soap_error_handler": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "user_error": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "usleep": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "usort": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "utf8_decode": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "utf8_encode": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "var_dump": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "var_export": { + "ext.name": "standard", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "version_compare": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "vfprintf": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "vprintf": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "vsprintf": { + "ext.name": "standard", + "ext.min": "4.0.7", + "ext.max": null, + "php.min": "4.0.7", + "php.max": null + }, + "wddx_add_vars": { + "ext.name": "wddx", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "wddx_deserialize": { + "ext.name": "wddx", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "wddx_packet_end": { + "ext.name": "wddx", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "wddx_packet_start": { + "ext.name": "wddx", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "wddx_serialize_value": { + "ext.name": "wddx", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "wddx_serialize_vars": { + "ext.name": "wddx", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "wordwrap": { + "ext.name": "standard", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "xcache_clear_cache": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_coredump": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_count": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_coverager_decode": { + "ext.name": "XCache", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "xcache_coverager_get": { + "ext.name": "XCache", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "xcache_coverager_start": { + "ext.name": "XCache", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "xcache_coverager_stop": { + "ext.name": "XCache", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "xcache_dasm_file": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "xcache_dasm_string": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "xcache_dec": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_get": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_get_data_type": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_get_isref": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "xcache_get_op_type": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_get_opcode": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_get_opcode_spec": { + "ext.name": "XCache", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "xcache_get_refcount": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "xcache_get_special_value": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_get_type": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "xcache_inc": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_info": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_is_autoglobal": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_isset": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_list": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_set": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_unset": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xcache_unset_by_prefix": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "xdebug_break": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_call_class": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_call_file": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_call_function": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_call_line": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_clear_aggr_profiling_data": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta6", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_code_coverage_started": { + "ext.name": "xdebug", + "ext.min": "2.3.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "xdebug_debug_zval": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_debug_zval_stdout": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta4", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_disable": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_dump_aggr_profiling_data": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta6", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_dump_function_trace": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": "1.3.2", + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_dump_superglobals": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_enable": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_get_code_coverage": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_get_collected_errors": { + "ext.name": "xdebug", + "ext.min": "2.1.0beta1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "xdebug_get_declared_vars": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta5", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_get_formatted_function_stack": { + "ext.name": "xdebug", + "ext.min": "2.1.0beta1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "xdebug_get_function_count": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_get_function_stack": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_get_function_trace": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": "1.3.2", + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_get_headers": { + "ext.name": "xdebug", + "ext.min": "2.1.0beta1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "xdebug_get_profiler_filename": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta4", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_get_stack_depth": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_get_tracefile_name": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_is_enabled": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_memory_usage": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_peak_memory_usage": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_print_function_stack": { + "ext.name": "xdebug", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_set_error_handler": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": "2.0.0beta6", + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_start_code_coverage": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_start_error_collection": { + "ext.name": "xdebug", + "ext.min": "2.1.0beta1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "xdebug_start_trace": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_stop_code_coverage": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_stop_error_collection": { + "ext.name": "xdebug", + "ext.min": "2.1.0beta1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "xdebug_stop_trace": { + "ext.name": "xdebug", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_time_index": { + "ext.name": "xdebug", + "ext.min": "1.3.0RC1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xdebug_var_dump": { + "ext.name": "xdebug", + "ext.min": "1.3.0RC1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xhprof_disable": { + "ext.name": "xhprof", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "xhprof_enable": { + "ext.name": "xhprof", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "xhprof_sample_disable": { + "ext.name": "xhprof", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "xhprof_sample_enable": { + "ext.name": "xhprof", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "xml_error_string": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_get_current_byte_index": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_get_current_column_number": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_get_current_line_number": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_get_error_code": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_parse": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_parse_into_struct": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_parser_create": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_parser_create_ns": { + "ext.name": "xml", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "xml_parser_free": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_parser_get_option": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_parser_set_option": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_set_character_data_handler": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_set_default_handler": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_set_element_handler": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_set_end_namespace_decl_handler": { + "ext.name": "xml", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "xml_set_external_entity_ref_handler": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_set_notation_decl_handler": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_set_object": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_set_processing_instruction_handler": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xml_set_start_namespace_decl_handler": { + "ext.name": "xml", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "xml_set_unparsed_entity_decl_handler": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "xmlrpc_decode": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_decode_request": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_encode": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_encode_request": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_get_type": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_is_fault": { + "ext.name": "xmlrpc", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "xmlrpc_parse_method_descriptions": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_server_add_introspection_data": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_server_call_method": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_server_create": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_server_destroy": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_server_register_introspection_callback": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_server_register_method": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlrpc_set_type": { + "ext.name": "xmlrpc", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "xmlwriter_end_attribute": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_end_cdata": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_end_comment": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_end_document": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_end_dtd": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_end_dtd_attlist": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_end_dtd_element": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_end_dtd_entity": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_end_element": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_end_pi": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_flush": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_full_end_element": { + "ext.name": "xmlwriter", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "xmlwriter_open_memory": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_open_uri": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_output_memory": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_set_indent": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_set_indent_string": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_attribute": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_attribute_ns": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_cdata": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_comment": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_document": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_dtd": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_dtd_attlist": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_dtd_element": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_dtd_entity": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_element": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_element_ns": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_start_pi": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_text": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_attribute": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_attribute_ns": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_cdata": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_comment": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_dtd": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_dtd_attlist": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_dtd_element": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_dtd_entity": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_element": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_element_ns": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_pi": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "xmlwriter_write_raw": { + "ext.name": "xmlwriter", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "yaml_emit": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "yaml_emit_file": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "yaml_parse": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "yaml_parse_file": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "yaml_parse_url": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zend_logo_guid": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "5.4.45" + }, + "zend_thread_id": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "zend_version": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "zip_close": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zip_entry_close": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zip_entry_compressedsize": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zip_entry_compressionmethod": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zip_entry_filesize": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zip_entry_name": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zip_entry_open": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zip_entry_read": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zip_open": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zip_read": { + "ext.name": "zip", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "zlib_decode": { + "ext.name": "zlib", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "zlib_encode": { + "ext.name": "zlib", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "zlib_get_coding_type": { + "ext.name": "zlib", + "ext.min": "4.3.2", + "ext.max": null, + "php.min": "4.3.2", + "php.max": null + } + }, + "classes": { + "AMQPChannel": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQPChannelException": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQPConnection": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQPConnectionException": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQPEnvelope": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQPException": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQPExchange": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQPExchangeException": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQPQueue": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQPQueueException": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "APCIterator": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "AppendIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "ArrayIterator": { + "ext.name": "spl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ArrayObject": { + "ext.name": "spl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "BadFunctionCallException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "BadMethodCallException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "CURLFile": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CachingIterator": { + "ext.name": "spl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "CallbackFilterIterator": { + "ext.name": "spl", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "Closure": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Collator": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "Collectable": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Cond": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "DOMAttr": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMCdataSection": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMCharacterData": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMComment": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMConfiguration": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMDocument": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMDocumentFragment": { + "ext.name": "dom", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "DOMDocumentType": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMDomError": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMElement": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMEntity": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMEntityReference": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMErrorHandler": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMException": { + "ext.name": "dom", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "DOMImplementation": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMImplementationList": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMImplementationSource": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMLocator": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMNameList": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMNameSpaceNode": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMNamedNodeMap": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMNode": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMNodeList": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMNotation": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMProcessingInstruction": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMStringExtend": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMStringList": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMText": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMTypeinfo": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMUserDataHandler": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOMXPath": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DateInterval": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "DatePeriod": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "DateTime": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "DateTimeImmutable": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "DateTimeZone": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "Directory": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DirectoryIterator": { + "ext.name": "spl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DomainException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "EmptyIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "ErrorException": { + "ext.name": "Core", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "Exception": { + "ext.name": "Core", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "FilesystemIterator": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FilterIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "Gender\\Gender": { + "ext.name": "gender", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Generator": { + "ext.name": "Core", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "GlobIterator": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "HaruAnnotation": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "HaruDestination": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "HaruDoc": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "HaruEncoder": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "HaruException": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "HaruFont": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "HaruImage": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "HaruOutline": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "HaruPage": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "HttpDeflateStream": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpEncodingException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpHeaderException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpInflateStream": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpInvalidParamException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpMalformedHeadersException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpMessage": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpMessageTypeException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpQueryString": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpQueryStringException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpRequest": { + "ext.name": "http", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpRequestDataShare": { + "ext.name": "http", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpRequestException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpRequestMethodException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpRequestPool": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpRequestPoolException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpResponse": { + "ext.name": "http", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpResponseException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpRuntimeException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpSocketException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpUrlException": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HttpUtil": { + "ext.name": "http", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "Imagick": { + "ext.name": "imagick", + "ext.min": "2.0.0a1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ImagickDraw": { + "ext.name": "imagick", + "ext.min": "2.0.0a1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ImagickDrawException": { + "ext.name": "imagick", + "ext.min": "2.0.0a1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ImagickException": { + "ext.name": "imagick", + "ext.min": "2.0.0a1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ImagickKernel": { + "ext.name": "imagick", + "ext.min": "3.3.0RC1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ImagickKernelException": { + "ext.name": "imagick", + "ext.min": "3.3.0RC1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ImagickPixel": { + "ext.name": "imagick", + "ext.min": "2.0.0a1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ImagickPixelException": { + "ext.name": "imagick", + "ext.min": "2.0.0a1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ImagickPixelIterator": { + "ext.name": "imagick", + "ext.min": "2.0.0a1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ImagickPixelIteratorException": { + "ext.name": "imagick", + "ext.min": "2.0.0a1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "InfiniteIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "IntlBreakIterator": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IntlCalendar": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IntlCodePointBreakIterator": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IntlDateFormatter": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IntlException": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IntlGregorianCalendar": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IntlIterator": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IntlPartsIterator": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IntlRuleBasedBreakIterator": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IntlTimeZone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "InvalidArgumentException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "IteratorIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LengthException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LibXMLError": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LimitIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "Locale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "LogicException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "Memcache": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "MemcachePool": { + "ext.name": "memcache", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "Memcached": { + "ext.name": "memcached", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "MemcachedException": { + "ext.name": "memcached", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "MemcachedServer": { + "ext.name": "memcached", + "ext.min": "2.2.0b1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "MessageFormatter": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "MessagePack": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MessagePackUnpacker": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "Mongo": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoBinData": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoClient": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoCode": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoCollection": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoCommandCursor": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoConnectionException": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoCursor": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoCursorException": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoCursorTimeoutException": { + "ext.name": "mongo", + "ext.min": "1.0.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "MongoDB": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoDBRef": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoDate": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoDeleteBatch": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoDuplicateKeyException": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoException": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoExecutionTimeoutException": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoGridFS": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoGridFSCursor": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoGridFSException": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoGridFSFile": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoId": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoInsertBatch": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoInt32": { + "ext.name": "mongo", + "ext.min": "1.0.9", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "MongoInt64": { + "ext.name": "mongo", + "ext.min": "1.0.9", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "MongoLog": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "MongoMaxKey": { + "ext.name": "mongo", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "MongoMinKey": { + "ext.name": "mongo", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "MongoPool": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "MongoProtocolException": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoRegex": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MongoResultException": { + "ext.name": "mongo", + "ext.min": "1.3.0RC1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoTimestamp": { + "ext.name": "mongo", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "MongoUpdateBatch": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoUtil": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": "0.9.0", + "php.min": "5.0.0", + "php.max": null + }, + "MongoWriteBatch": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MongoWriteConcernException": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MultipleIterator": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Mutex": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "NoRewindIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "Normalizer": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.3.0alpha1", + "php.max": null + }, + "NumberFormatter": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "OAuth": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAuthException": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAuthProvider": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OutOfBoundsException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OutOfRangeException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OverflowException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PDFlib": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PDFlibException": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PDO": { + "ext.name": "PDO", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PDOException": { + "ext.name": "PDO", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PDORow": { + "ext.name": "PDO", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PDOStatement": { + "ext.name": "PDO", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "ParentIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "Phar": { + "ext.name": "phar", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PharData": { + "ext.name": "phar", + "ext.min": "2.0.0a1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PharException": { + "ext.name": "phar", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PharFileInfo": { + "ext.name": "phar", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "Pool": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "RangeException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "RarArchive": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RarEntry": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RarException": { + "ext.name": "rar", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RecursiveArrayIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "RecursiveCachingIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "RecursiveCallbackFilterIterator": { + "ext.name": "spl", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "RecursiveDirectoryIterator": { + "ext.name": "spl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "RecursiveFilterIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "RecursiveIteratorIterator": { + "ext.name": "spl", + "ext.min": "5.1.3", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "RecursiveRegexIterator": { + "ext.name": "spl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RecursiveTreeIterator": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Redis": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RedisArray": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RedisException": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "Reflection": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionClass": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionException": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionExtension": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionFunction": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionFunctionAbstract": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionMethod": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionObject": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionParameter": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionProperty": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ReflectionZendExtension": { + "ext.name": "Reflection", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "RegexIterator": { + "ext.name": "spl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ResourceBundle": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "Riak\\Bucket": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\BucketPropertyList": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Connection": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Crdt\\Counter": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Crdt\\Input\\GetInput": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Crdt\\Input\\UpdateInput": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Exception\\BadArgumentsException": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Exception\\CommunicationException": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Exception\\ConnectionException": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Exception\\NonUniqueException": { + "ext.name": "riak", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Exception\\RiakException": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Exception\\UnexpectedResponseException": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Exception\\UnresolvedConflictException": { + "ext.name": "riak", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Input\\DeleteInput": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Input\\GetInput": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Input\\GetResolverInput": { + "ext.name": "riak", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Input\\IndexInput": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Input\\Input": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Input\\PutInput": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Link": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Functions\\BaseFunction": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Functions\\ErlangFunction": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Functions\\JavascriptFunction": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Input\\BucketInput": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Input\\Input": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Input\\KeyDataListInput": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Input\\KeyListInput": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\MapReduce": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Output\\Output": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Phase\\MapPhase": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Phase\\Phase": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\MapReduce\\Phase\\ReducePhase": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Object": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\ObjectList": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Output\\GetOutput": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Output\\IndexOutput": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Output\\IndexResult": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Output\\IndexResultList": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Output\\Output": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Output\\PutOutput": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Output\\YoungestSiblingResolver": { + "ext.name": "riak", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\PoolInfo": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Property\\CommitHook": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Property\\CommitHookList": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Property\\ModuleFunction": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Property\\ReplicationMode\\Disabled": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Property\\ReplicationMode\\FullSyncOnly": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Property\\ReplicationMode\\RealTimeAndFullSync": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Property\\ReplicationMode\\RealTimeOnly": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Query\\IndexQuery": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Search\\Input\\ParameterBag": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Search\\Output\\DocumentOutput": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Search\\Output\\Output": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Search\\Search": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\ServerInfo": { + "ext.name": "riak", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "RuntimeException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "SNMP": { + "ext.name": "snmp", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SNMPException": { + "ext.name": "snmp", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SQLite3": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLite3Result": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLite3Stmt": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLiteDatabase": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLiteException": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLiteResult": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLiteUnbuffered": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SessionHandler": { + "ext.name": "session", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SimpleXMLElement": { + "ext.name": "SimpleXML", + "ext.min": "5.0.1", + "ext.max": null, + "php.min": "5.0.1", + "php.max": null + }, + "SimpleXMLIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": "5.2.17", + "php.min": "5.1.0", + "php.max": null + }, + "SoapClient": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SoapFault": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SoapHeader": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SoapParam": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SoapServer": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SoapVar": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SolrClient": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrClientException": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrCollapseFunction": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SolrDisMaxQuery": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SolrDocument": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrDocumentField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrException": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrGenericResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrIllegalArgumentException": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrIllegalOperationException": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrInputDocument": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrMissingMandatoryParameterException": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SolrModifiableParams": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrObject": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrParams": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrPingResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrQuery": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrQueryResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrServerException": { + "ext.name": "solr", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SolrUpdateResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SolrUtils": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SphinxClient": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SplDoublyLinkedList": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SplFileInfo": { + "ext.name": "spl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "SplFileObject": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "SplFixedArray": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SplHeap": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SplMaxHeap": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SplMinHeap": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SplObjectStorage": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "SplPriorityQueue": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SplQueue": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SplStack": { + "ext.name": "spl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SplTempFileObject": { + "ext.name": "spl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "Spoofchecker": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "Stomp": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "StompException": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "StompFrame": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "Svn": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SvnNode": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SvnWc": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SvnWcSchedule": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SyncEvent": { + "ext.name": "sync", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SyncMutex": { + "ext.name": "sync", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SyncReaderWriter": { + "ext.name": "sync", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SyncSemaphore": { + "ext.name": "sync", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Thread": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Threaded": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Transliterator": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "UConverter": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "UnderflowException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "UnexpectedValueException": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "VarnishAdmin": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VarnishException": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VarnishLog": { + "ext.name": "varnish", + "ext.min": "0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VarnishStat": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Worker": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XMLDiff\\Base": { + "ext.name": "xmldiff", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XMLDiff\\DOM": { + "ext.name": "xmldiff", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XMLDiff\\Exception": { + "ext.name": "xmldiff", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XMLDiff\\File": { + "ext.name": "xmldiff", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XMLDiff\\Memory": { + "ext.name": "xmldiff", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XMLReader": { + "ext.name": "xmlreader", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XMLWriter": { + "ext.name": "xmlwriter", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "XSLTProcessor": { + "ext.name": "xsl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "Yac": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ZipArchive": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__PHP_Incomplete_Class": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "finfo": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "http\\Client": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Request": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Response": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Cookie": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Encoding\\Stream": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Encoding\\Stream\\Dechunk": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Encoding\\Stream\\Deflate": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Encoding\\Stream\\Inflate": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Env": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Env\\Request": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Env\\Response": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Exception\\BadConversionException": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Exception\\BadHeaderException": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Exception\\BadMessageException": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Exception\\BadMethodCallException": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Exception\\BadQueryStringException": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Exception\\BadUrlException": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Exception\\InvalidArgumentException": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Exception\\RuntimeException": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Exception\\UnexpectedValueException": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Header": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Header\\Parser": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Message": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Message\\Body": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Message\\Parser": { + "ext.name": "http", + "ext.min": "2.2.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Params": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\QueryString": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Url": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "mimemessage": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mysqli": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_driver": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_result": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_sql_exception": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_stmt": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "mysqli_warning": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "parent": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "php_user_filter": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "self": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stackable": { + "ext.name": "pthreads", + "ext.min": "0.0.36", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "static": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "stdClass": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "tidy": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "tidyNode": { + "ext.name": "tidy", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.0.1", + "php.max": null + } + }, + "interfaces": { + "ArrayAccess": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": "5.2.17", + "php.min": "5.1.0", + "php.max": null + }, + "Countable": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "DateTimeInterface": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "Iterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": "5.2.17", + "php.min": "5.1.0", + "php.max": null + }, + "IteratorAggregate": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": "5.2.17", + "php.min": "5.1.0", + "php.max": null + }, + "JsonSerializable": { + "ext.name": "json", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MongoCursorInterface": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "OuterIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "RecursiveIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "Reflector": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "Riak\\MapReduce\\Output\\StreamOutput": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Output\\ConflictResolver": { + "ext.name": "riak", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Output\\KeyStreamOutput": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "Riak\\Property\\ReplicationMode\\ReplicationMode": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SeekableIterator": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "Serializable": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": "5.2.17", + "php.min": "5.1.0", + "php.max": null + }, + "SessionHandlerInterface": { + "ext.name": "session", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SessionIdInterface": { + "ext.name": "session", + "ext.min": "5.5.1", + "ext.max": null, + "php.min": "5.5.1", + "php.max": null + }, + "SplObserver": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "SplSubject": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "Traversable": { + "ext.name": "spl", + "ext.min": "5.1.0", + "ext.max": "5.2.17", + "php.min": "5.1.0", + "php.max": null + }, + "http\\Exception": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "constants": { + "ABDAY_1": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABDAY_2": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABDAY_3": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABDAY_4": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABDAY_5": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABDAY_6": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABDAY_7": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_1": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_10": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_11": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_12": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_2": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_3": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_4": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_5": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_6": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_7": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_8": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ABMON_9": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "AF_INET": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "AF_INET6": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "AF_UNIX": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ALT_DIGITS": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "AMQP_AUTOACK": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_AUTODELETE": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_DURABLE": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_EXCLUSIVE": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_EX_TYPE_DIRECT": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_EX_TYPE_FANOUT": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_EX_TYPE_HEADERS": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_EX_TYPE_TOPIC": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_IFEMPTY": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_IFUNUSED": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_IMMEDIATE": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_INTERNAL": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_MANDATORY": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_MULTIPLE": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_NOLOCAL": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_NOPARAM": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_NOWAIT": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_OS_SOCKET_TIMEOUT_ERRNO": { + "ext.name": "amqp", + "ext.min": "1.0.8", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_PASSIVE": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AMQP_REQUEUE": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "AM_STR": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "APACHE_MAP": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "APCU_APC_FULL_BC": { + "ext.name": "apcu", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "APC_BIN_VERIFY_CRC32": { + "ext.name": "apc", + "ext.min": "3.1.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_BIN_VERIFY_MD5": { + "ext.name": "apc", + "ext.min": "3.1.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_ALL": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_ATIME": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_CTIME": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_DEVICE": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_DTIME": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_FILENAME": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_INODE": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_KEY": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_MD5": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_MEM_SIZE": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_MTIME": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_NONE": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_NUM_HITS": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_REFCOUNT": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_TTL": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_TYPE": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_ITER_VALUE": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_LIST_ACTIVE": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "APC_LIST_DELETED": { + "ext.name": "apc", + "ext.min": "3.1.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "ARRAY_FILTER_USE_BOTH": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "ARRAY_FILTER_USE_KEY": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "ASSERT_ACTIVE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ASSERT_BAIL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ASSERT_CALLBACK": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ASSERT_QUIET_EVAL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ASSERT_WARNING": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "BUS_ADRALN": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "BUS_ADRERR": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "BUS_OBJERR": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CAL_DOW_DAYNO": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_DOW_LONG": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_DOW_SHORT": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_EASTER_ALWAYS_GREGORIAN": { + "ext.name": "calendar", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "CAL_EASTER_ALWAYS_JULIAN": { + "ext.name": "calendar", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "CAL_EASTER_DEFAULT": { + "ext.name": "calendar", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "CAL_EASTER_ROMAN": { + "ext.name": "calendar", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "CAL_FRENCH": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_GREGORIAN": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_JEWISH": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_JEWISH_ADD_ALAFIM": { + "ext.name": "calendar", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "CAL_JEWISH_ADD_ALAFIM_GERESH": { + "ext.name": "calendar", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "CAL_JEWISH_ADD_GERESHAYIM": { + "ext.name": "calendar", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "CAL_JULIAN": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_MONTH_FRENCH": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_MONTH_GREGORIAN_LONG": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_MONTH_GREGORIAN_SHORT": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_MONTH_JEWISH": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_MONTH_JULIAN_LONG": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_MONTH_JULIAN_SHORT": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CAL_NUM_CALS": { + "ext.name": "calendar", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CASE_LOWER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CASE_UPPER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CHAR_MAX": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CLD_CONTINUED": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CLD_DUMPED": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CLD_EXITED": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CLD_KILLED": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CLD_STOPPED": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CLD_TRAPPED": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CL_EXPUNGE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CODESET": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "CONNECTION_ABORTED": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CONNECTION_NORMAL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CONNECTION_TIMEOUT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "COUNT_NORMAL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "COUNT_RECURSIVE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CP_MOVE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CP_UID": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CREDITS_ALL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CREDITS_DOCS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CREDITS_FULLPAGE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CREDITS_GENERAL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CREDITS_GROUP": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CREDITS_MODULES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CREDITS_QA": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CREDITS_SAPI": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CRNCYSTR": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "CRYPT_BLOWFISH": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CRYPT_EXT_DES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CRYPT_MD5": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CRYPT_SALT_LENGTH": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CRYPT_SHA256": { + "ext.name": "standard", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "CRYPT_SHA512": { + "ext.name": "standard", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "CRYPT_STD_DES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "CURLAUTH_ANY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLAUTH_ANYSAFE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLAUTH_BASIC": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLAUTH_DIGEST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLAUTH_DIGEST_IE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLAUTH_GSSNEGOTIATE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLAUTH_NONE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLAUTH_NTLM": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLAUTH_ONLY": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLCLOSEPOLICY_CALLBACK": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": "5.5.30" + }, + "CURLCLOSEPOLICY_LEAST_RECENTLY_USED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": "5.5.30" + }, + "CURLCLOSEPOLICY_LEAST_TRAFFIC": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": "5.5.30" + }, + "CURLCLOSEPOLICY_OLDEST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": "5.5.30" + }, + "CURLCLOSEPOLICY_SLOWEST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": "5.5.30" + }, + "CURLE_ABORTED_BY_CALLBACK": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_BAD_CALLING_ORDER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_BAD_CONTENT_ENCODING": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_BAD_DOWNLOAD_RESUME": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLE_BAD_FUNCTION_ARGUMENT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_BAD_PASSWORD_ENTERED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_COULDNT_CONNECT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_COULDNT_RESOLVE_HOST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_COULDNT_RESOLVE_PROXY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FAILED_INIT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FILESIZE_EXCEEDED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FILE_COULDNT_READ_FILE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_ACCESS_DENIED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_BAD_DOWNLOAD_RESUME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_CANT_GET_HOST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_CANT_RECONNECT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_COULDNT_GET_SIZE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_COULDNT_RETR_FILE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_COULDNT_SET_ASCII": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_COULDNT_SET_BINARY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_COULDNT_STOR_FILE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_COULDNT_USE_REST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_PARTIAL_FILE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLE_FTP_PORT_FAILED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_QUOTE_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_SSL_FAILED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_USER_PASSWORD_INCORRECT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_WEIRD_227_FORMAT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_WEIRD_PASS_REPLY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_WEIRD_PASV_REPLY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_WEIRD_SERVER_REPLY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_WEIRD_USER_REPLY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FTP_WRITE_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_FUNCTION_NOT_FOUND": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_GOT_NOTHING": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_HTTP_NOT_FOUND": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_HTTP_PORT_FAILED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_HTTP_POST_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_HTTP_RANGE_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_HTTP_RETURNED_ERROR": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLE_LDAP_CANNOT_BIND": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_LDAP_INVALID_URL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_LDAP_SEARCH_FAILED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_LIBRARY_NOT_FOUND": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_MALFORMAT_USER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_OBSOLETE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_OK": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_OPERATION_TIMEDOUT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLE_OPERATION_TIMEOUTED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_OUT_OF_MEMORY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_PARTIAL_FILE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_READ_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_RECV_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_SEND_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_SHARE_IN_USE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_SSH": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLE_SSL_CACERT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_SSL_CERTPROBLEM": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_SSL_CIPHER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_SSL_CONNECT_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_SSL_ENGINE_NOTFOUND": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_SSL_ENGINE_SETFAILED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_SSL_PEER_CERTIFICATE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_TELNET_OPTION_SYNTAX": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_TOO_MANY_REDIRECTS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_UNKNOWN_TELNET_OPTION": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_UNSUPPORTED_PROTOCOL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_URL_MALFORMAT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_URL_MALFORMAT_USER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLE_WRITE_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLFTPAUTH_DEFAULT": { + "ext.name": "curl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "CURLFTPAUTH_SSL": { + "ext.name": "curl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "CURLFTPAUTH_TLS": { + "ext.name": "curl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "CURLFTPMETHOD_MULTICWD": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLFTPMETHOD_NOCWD": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLFTPMETHOD_SINGLECWD": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLFTPSSL_ALL": { + "ext.name": "curl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "CURLFTPSSL_CCC_ACTIVE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLFTPSSL_CCC_NONE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLFTPSSL_CCC_PASSIVE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLFTPSSL_CONTROL": { + "ext.name": "curl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "CURLFTPSSL_NONE": { + "ext.name": "curl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "CURLFTPSSL_TRY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLGSSAPI_DELEGATION_FLAG": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLGSSAPI_DELEGATION_POLICY_FLAG": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_APPCONNECT_TIME": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_CERTINFO": { + "ext.name": "curl", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "CURLINFO_CONDITION_UNMET": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_CONNECT_TIME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_CONTENT_LENGTH_DOWNLOAD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_CONTENT_LENGTH_UPLOAD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_CONTENT_TYPE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_COOKIELIST": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_EFFECTIVE_URL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_FILETIME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_FTP_ENTRY_PATH": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_HEADER_OUT": { + "ext.name": "curl", + "ext.min": "5.1.3", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "CURLINFO_HEADER_SIZE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_HTTPAUTH_AVAIL": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_HTTP_CODE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_HTTP_CONNECTCODE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_LASTONE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_LOCAL_IP": { + "ext.name": "curl", + "ext.min": "5.4.7", + "ext.max": null, + "php.min": "5.4.7", + "php.max": null + }, + "CURLINFO_LOCAL_PORT": { + "ext.name": "curl", + "ext.min": "5.4.7", + "ext.max": null, + "php.min": "5.4.7", + "php.max": null + }, + "CURLINFO_NAMELOOKUP_TIME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_NUM_CONNECTS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_OS_ERRNO": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_PRETRANSFER_TIME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_PRIMARY_IP": { + "ext.name": "curl", + "ext.min": "5.4.7", + "ext.max": null, + "php.min": "5.4.7", + "php.max": null + }, + "CURLINFO_PRIMARY_PORT": { + "ext.name": "curl", + "ext.min": "5.4.7", + "ext.max": null, + "php.min": "5.4.7", + "php.max": null + }, + "CURLINFO_PRIVATE": { + "ext.name": "curl", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "CURLINFO_PROXYAUTH_AVAIL": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_REDIRECT_COUNT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_REDIRECT_TIME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_REDIRECT_URL": { + "ext.name": "curl", + "ext.min": "5.3.7", + "ext.max": null, + "php.min": "5.3.7", + "php.max": null + }, + "CURLINFO_REQUEST_SIZE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_RESPONSE_CODE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_RTSP_CLIENT_CSEQ": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_RTSP_CSEQ_RECV": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_RTSP_SERVER_CSEQ": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_RTSP_SESSION_ID": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_SIZE_DOWNLOAD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_SIZE_UPLOAD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_SPEED_DOWNLOAD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_SPEED_UPLOAD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_SSL_ENGINES": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLINFO_SSL_VERIFYRESULT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_STARTTRANSFER_TIME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLINFO_TOTAL_TIME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLMOPT_MAXCONNECTS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLMOPT_PIPELINING": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLMSG_DONE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLM_BAD_EASY_HANDLE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLM_BAD_HANDLE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLM_CALL_MULTI_PERFORM": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLM_INTERNAL_ERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLM_OK": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLM_OUT_OF_MEMORY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_ACCEPTTIMEOUT_MS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_ACCEPT_ENCODING": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_ADDRESS_SCOPE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_APPEND": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_AUTOREFERER": { + "ext.name": "curl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "CURLOPT_BINARYTRANSFER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_BUFFERSIZE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_CAINFO": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_CAPATH": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_CERTINFO": { + "ext.name": "curl", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "CURLOPT_CLOSEPOLICY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": "5.5.30" + }, + "CURLOPT_CONNECTTIMEOUT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_CONNECTTIMEOUT_MS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_CONNECT_ONLY": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_COOKIE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_COOKIEFILE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_COOKIEJAR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_COOKIELIST": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_COOKIESESSION": { + "ext.name": "curl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "CURLOPT_CRLF": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_CRLFILE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_CUSTOMREQUEST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_DIRLISTONLY": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_DNS_CACHE_TIMEOUT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_DNS_SERVERS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_DNS_USE_GLOBAL_CACHE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_EGDSOCKET": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_ENCODING": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FAILONERROR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FILE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FILETIME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FNMATCH_FUNCTION": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_FOLLOWLOCATION": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FORBID_REUSE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FRESH_CONNECT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FTPAPPEND": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FTPLISTONLY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FTPPORT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FTPSSLAUTH": { + "ext.name": "curl", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "CURLOPT_FTP_ACCOUNT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_FTP_ALTERNATIVE_TO_USER": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_FTP_CREATE_MISSING_DIRS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FTP_FILEMETHOD": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLOPT_FTP_RESPONSE_TIMEOUT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_FTP_SKIP_PASV_IP": { + "ext.name": "curl", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "CURLOPT_FTP_SSL": { + "ext.name": "curl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "CURLOPT_FTP_SSL_CCC": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_FTP_USE_EPRT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FTP_USE_EPSV": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_FTP_USE_PRET": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_GSSAPI_DELEGATION": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_HEADER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_HEADERFUNCTION": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_HTTP200ALIASES": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_HTTPAUTH": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_HTTPGET": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_HTTPHEADER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_HTTPPROXYTUNNEL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_HTTP_CONTENT_DECODING": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_HTTP_TRANSFER_DECODING": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_HTTP_VERSION": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_IGNORE_CONTENT_LENGTH": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_INFILE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_INFILESIZE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_INTERFACE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_IPRESOLVE": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLOPT_ISSUERCERT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_KEYPASSWD": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLOPT_KRB4LEVEL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_KRBLEVEL": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_LOCALPORT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_LOCALPORTRANGE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_LOW_SPEED_LIMIT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_LOW_SPEED_TIME": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_MAIL_AUTH": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_MAIL_FROM": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_MAIL_RCPT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_MAXCONNECTS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_MAXFILESIZE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_MAXREDIRS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_MAX_RECV_SPEED_LARGE": { + "ext.name": "curl", + "ext.min": "5.3.7", + "ext.max": null, + "php.min": "5.3.7", + "php.max": null + }, + "CURLOPT_MAX_SEND_SPEED_LARGE": { + "ext.name": "curl", + "ext.min": "5.3.7", + "ext.max": null, + "php.min": "5.3.7", + "php.max": null + }, + "CURLOPT_MUTE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_NETRC": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_NETRC_FILE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_NEW_DIRECTORY_PERMS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_NEW_FILE_PERMS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_NOBODY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_NOPROGRESS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_NOPROXY": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_NOSIGNAL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_PASSWDFUNCTION": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_PASSWORD": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_PORT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_POST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_POSTFIELDS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_POSTQUOTE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_POSTREDIR": { + "ext.name": "curl", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "CURLOPT_PREQUOTE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_PRIVATE": { + "ext.name": "curl", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "CURLOPT_PROGRESSFUNCTION": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLOPT_PROTOCOLS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_PROXY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_PROXYAUTH": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_PROXYPASSWORD": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_PROXYPORT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_PROXYTYPE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_PROXYUSERNAME": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_PROXYUSERPWD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_PROXY_TRANSFER_MODE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_PUT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_QUOTE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_RANDOM_FILE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_RANGE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_READDATA": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_READFUNCTION": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_REDIR_PROTOCOLS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_REFERER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_RESOLVE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_RESUME_FROM": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_RETURNTRANSFER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_RTSP_CLIENT_CSEQ": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_RTSP_REQUEST": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_RTSP_SERVER_CSEQ": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_RTSP_SESSION_ID": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_RTSP_STREAM_URI": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_RTSP_TRANSPORT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_SAFE_UPLOAD": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_SHARE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_SOCKS5_GSSAPI_NEC": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_SOCKS5_GSSAPI_SERVICE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_SSH_AUTH_TYPES": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLOPT_SSH_HOST_PUBLIC_KEY_MD5": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLOPT_SSH_KNOWNHOSTS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_SSH_PRIVATE_KEYFILE": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLOPT_SSH_PUBLIC_KEYFILE": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLOPT_SSLCERT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSLCERTPASSWD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSLCERTTYPE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSLENGINE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSLENGINE_DEFAULT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSLKEY": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSLKEYPASSWD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSLKEYTYPE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSLVERSION": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSL_CIPHER_LIST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSL_OPTIONS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_SSL_SESSIONID_CACHE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_SSL_VERIFYHOST": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_SSL_VERIFYPEER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_STDERR": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_TCP_KEEPALIVE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_TCP_KEEPIDLE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_TCP_KEEPINTVL": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_TCP_NODELAY": { + "ext.name": "curl", + "ext.min": "5.2.1", + "ext.max": null, + "php.min": "5.2.1", + "php.max": null + }, + "CURLOPT_TELNETOPTIONS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_TFTP_BLKSIZE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_TIMECONDITION": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_TIMEOUT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_TIMEOUT_MS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_TIMEVALUE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_TLSAUTH_PASSWORD": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_TLSAUTH_TYPE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_TLSAUTH_USERNAME": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_TRANSFERTEXT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_TRANSFER_ENCODING": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_UNRESTRICTED_AUTH": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_UPLOAD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_URL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_USERAGENT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_USERNAME": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_USERPWD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_USE_SSL": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_VERBOSE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_WILDCARDMATCH": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLOPT_WRITEFUNCTION": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLOPT_WRITEHEADER": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPAUSE_ALL": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPAUSE_CONT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPAUSE_RECV": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPAUSE_RECV_CONT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPAUSE_SEND": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPAUSE_SEND_CONT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_ALL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_DICT": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_FILE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_FTP": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_FTPS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_GOPHER": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_HTTP": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_HTTPS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_IMAP": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_IMAPS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_LDAP": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_LDAPS": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_POP3": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_POP3S": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_RTMP": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_RTMPE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_RTMPS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_RTMPT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_RTMPTE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_RTMPTS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_RTSP": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_SCP": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_SFTP": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_SMTP": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_SMTPS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLPROTO_TELNET": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROTO_TFTP": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROXY_HTTP": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROXY_SOCKS4": { + "ext.name": "curl", + "ext.min": "5.2.10", + "ext.max": null, + "php.min": "5.2.10", + "php.max": null + }, + "CURLPROXY_SOCKS4A": { + "ext.name": "curl", + "ext.min": "5.5.23RC1", + "ext.max": null, + "php.min": "5.5.23RC1", + "php.max": null + }, + "CURLPROXY_SOCKS5": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURLPROXY_SOCKS5_HOSTNAME": { + "ext.name": "curl", + "ext.min": "5.5.23RC1", + "ext.max": null, + "php.min": "5.5.23RC1", + "php.max": null + }, + "CURLSHOPT_NONE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLSHOPT_SHARE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLSHOPT_UNSHARE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLSSH_AUTH_ANY": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLSSH_AUTH_DEFAULT": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLSSH_AUTH_HOST": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLSSH_AUTH_KEYBOARD": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLSSH_AUTH_NONE": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLSSH_AUTH_PASSWORD": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLSSH_AUTH_PUBLICKEY": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURLSSLOPT_ALLOW_BEAST": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLUSESSL_ALL": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLUSESSL_CONTROL": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLUSESSL_NONE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLUSESSL_TRY": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURLVERSION_NOW": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_FNMATCHFUNC_FAIL": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_FNMATCHFUNC_MATCH": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_FNMATCHFUNC_NOMATCH": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_HTTP_VERSION_1_0": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_HTTP_VERSION_1_1": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_HTTP_VERSION_2_0": { + "ext.name": "curl", + "ext.min": "5.5.24RC1", + "ext.max": null, + "php.min": "5.5.24RC1", + "php.max": null + }, + "CURL_HTTP_VERSION_NONE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_IPRESOLVE_V4": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURL_IPRESOLVE_V6": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURL_IPRESOLVE_WHATEVER": { + "ext.name": "curl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "CURL_LOCK_DATA_COOKIE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_LOCK_DATA_DNS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_LOCK_DATA_SSL_SESSION": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_NETRC_IGNORED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_NETRC_OPTIONAL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_NETRC_REQUIRED": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_READFUNC_PAUSE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_ANNOUNCE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_DESCRIBE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_GET_PARAMETER": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_OPTIONS": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_PAUSE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_PLAY": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_RECEIVE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_RECORD": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_SETUP": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_SET_PARAMETER": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_RTSPREQ_TEARDOWN": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_SSLVERSION_DEFAULT": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_SSLVERSION_SSLv2": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_SSLVERSION_SSLv3": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_SSLVERSION_TLSv1": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_SSLVERSION_TLSv1_0": { + "ext.name": "curl", + "ext.min": "5.5.19RC1", + "ext.max": null, + "php.min": "5.5.19RC1", + "php.max": null + }, + "CURL_SSLVERSION_TLSv1_1": { + "ext.name": "curl", + "ext.min": "5.5.19RC1", + "ext.max": null, + "php.min": "5.5.19RC1", + "php.max": null + }, + "CURL_SSLVERSION_TLSv1_2": { + "ext.name": "curl", + "ext.min": "5.5.19RC1", + "ext.max": null, + "php.min": "5.5.19RC1", + "php.max": null + }, + "CURL_TIMECOND_IFMODSINCE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_TIMECOND_IFUNMODSINCE": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_TIMECOND_LASTMOD": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_TIMECOND_NONE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_TLSAUTH_SRP": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "CURL_VERSION_HTTP2": { + "ext.name": "curl", + "ext.min": "5.5.24RC1", + "ext.max": null, + "php.min": "5.5.24RC1", + "php.max": null + }, + "CURL_VERSION_IPV6": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_VERSION_KERBEROS4": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_VERSION_LIBZ": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_VERSION_SSL": { + "ext.name": "curl", + "ext.min": "4.0.2", + "ext.max": null, + "php.min": "4.0.2", + "php.max": null + }, + "CURL_WRITEFUNC_PAUSE": { + "ext.name": "curl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "DATE_ATOM": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DATE_COOKIE": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DATE_ISO8601": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DATE_RFC1036": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DATE_RFC1123": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DATE_RFC2822": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DATE_RFC3339": { + "ext.name": "date", + "ext.min": "5.1.3", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "DATE_RFC822": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DATE_RFC850": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DATE_RSS": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DATE_W3C": { + "ext.name": "date", + "ext.min": "5.1.1", + "ext.max": null, + "php.min": "5.1.1", + "php.max": null + }, + "DAY_1": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "DAY_2": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "DAY_3": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "DAY_4": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "DAY_5": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "DAY_6": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "DAY_7": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "DEBUG_BACKTRACE_IGNORE_ARGS": { + "ext.name": "Core", + "ext.min": "5.3.6", + "ext.max": null, + "php.min": "5.3.6", + "php.max": null + }, + "DEBUG_BACKTRACE_PROVIDE_OBJECT": { + "ext.name": "Core", + "ext.min": "5.3.6", + "ext.max": null, + "php.min": "5.3.6", + "php.max": null + }, + "DEFAULT_INCLUDE_PATH": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DIRECTORY_SEPARATOR": { + "ext.name": "standard", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "DNS_A": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_A6": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_AAAA": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_ALL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_ANY": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_CNAME": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_HINFO": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_MX": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_NAPTR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_NS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_PTR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_SOA": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_SRV": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DNS_TXT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "DOMSTRING_SIZE_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_HIERARCHY_REQUEST_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_INDEX_SIZE_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_INUSE_ATTRIBUTE_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_INVALID_ACCESS_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_INVALID_CHARACTER_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_INVALID_MODIFICATION_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_INVALID_STATE_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_NAMESPACE_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_NOT_FOUND_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_NOT_SUPPORTED_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_NO_DATA_ALLOWED_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_NO_MODIFICATION_ALLOWED_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_PHP_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_SYNTAX_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_VALIDATION_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "DOM_WRONG_DOCUMENT_ERR": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "D_FMT": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "D_T_FMT": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ENC7BIT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ENC8BIT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ENCBASE64": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ENCBINARY": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ENCHANT_ISPELL": { + "ext.name": "enchant", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ENCHANT_MYSPELL": { + "ext.name": "enchant", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ENCOTHER": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ENCQUOTEDPRINTABLE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ENT_COMPAT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ENT_DISALLOWED": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ENT_HTML401": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ENT_HTML5": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ENT_IGNORE": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ENT_NOQUOTES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ENT_QUOTES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ENT_SUBSTITUTE": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ENT_XHTML": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ENT_XML1": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ERA": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ERA_D_FMT": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ERA_D_T_FMT": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ERA_T_FMT": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "EVBUFFER_EOF": { + "ext.name": "libevent", + "ext.min": "0.0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EVBUFFER_ERROR": { + "ext.name": "libevent", + "ext.min": "0.0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EVBUFFER_READ": { + "ext.name": "libevent", + "ext.min": "0.0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EVBUFFER_TIMEOUT": { + "ext.name": "libevent", + "ext.min": "0.0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EVBUFFER_WRITE": { + "ext.name": "libevent", + "ext.min": "0.0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EVLOOP_NONBLOCK": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EVLOOP_ONCE": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EV_PERSIST": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EV_READ": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EV_SIGNAL": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EV_TIMEOUT": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EV_WRITE": { + "ext.name": "libevent", + "ext.min": "0.0.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "EXIF_USE_MBSTRING": { + "ext.name": "exif", + "ext.min": "4.0.1", + "ext.max": null, + "php.min": "4.0.1", + "php.max": null + }, + "EXTR_IF_EXISTS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "EXTR_OVERWRITE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "EXTR_PREFIX_ALL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "EXTR_PREFIX_IF_EXISTS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "EXTR_PREFIX_INVALID": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "EXTR_PREFIX_SAME": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "EXTR_REFS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "EXTR_SKIP": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_ALL": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_COMPILE_ERROR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_COMPILE_WARNING": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_CORE_ERROR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_CORE_WARNING": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_DEPRECATED": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "E_ERROR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_NOTICE": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_PARSE": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_RECOVERABLE_ERROR": { + "ext.name": "Core", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "E_STRICT": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "E_USER_DEPRECATED": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "E_USER_ERROR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_USER_NOTICE": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_USER_WARNING": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "E_WARNING": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FALSE": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILEINFO_COMPRESS": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "5.2.17" + }, + "FILEINFO_CONTINUE": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILEINFO_DEVICES": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILEINFO_MIME": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILEINFO_MIME_ENCODING": { + "ext.name": "fileinfo", + "ext.min": "1.0.5-dev", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FILEINFO_MIME_TYPE": { + "ext.name": "fileinfo", + "ext.min": "1.0.5-dev", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FILEINFO_NONE": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILEINFO_PRESERVE_ATIME": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILEINFO_RAW": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILEINFO_SYMLINK": { + "ext.name": "fileinfo", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILE_APPEND": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILE_BINARY": { + "ext.name": "standard", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "FILE_IGNORE_NEW_LINES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILE_NO_DEFAULT_CONTEXT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILE_SKIP_EMPTY_LINES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILE_TEXT": { + "ext.name": "standard", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "FILE_USE_INCLUDE_PATH": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_CALLBACK": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_DEFAULT": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_ALLOW_FRACTION": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_ALLOW_HEX": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_ALLOW_OCTAL": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_ALLOW_SCIENTIFIC": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_ALLOW_THOUSAND": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_ARRAY": { + "ext.name": "filter", + "ext.min": "0.10.0", + "ext.max": "0.10.0", + "php.min": "5.0.0", + "php.max": null + }, + "FILTER_FLAG_EMPTY_STRING_NULL": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_ENCODE_AMP": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_ENCODE_HIGH": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_ENCODE_LOW": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_HOST_REQUIRED": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_IPV4": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_IPV6": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_NONE": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_NO_ENCODE_QUOTES": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_NO_PRIV_RANGE": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_NO_RES_RANGE": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_PATH_REQUIRED": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_QUERY_REQUIRED": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_SCALAR": { + "ext.name": "filter", + "ext.min": "0.10.0", + "ext.max": "0.10.0", + "php.min": "5.0.0", + "php.max": null + }, + "FILTER_FLAG_SCHEME_REQUIRED": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_STRIP_BACKTICK": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "FILTER_FLAG_STRIP_HIGH": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FLAG_STRIP_LOW": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_FORCE_ARRAY": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "FILTER_NULL_ON_FAILURE": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "FILTER_REQUIRE_ARRAY": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "FILTER_REQUIRE_SCALAR": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "FILTER_SANITIZE_ALL": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_SANITIZE_EMAIL": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_SANITIZE_ENCODED": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_SANITIZE_FULL_SPECIAL_CHARS": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.3.3", + "php.max": null + }, + "FILTER_SANITIZE_MAGIC_QUOTES": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_SANITIZE_NUMBER_FLOAT": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_SANITIZE_NUMBER_INT": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_SANITIZE_SPECIAL_CHARS": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_SANITIZE_STRING": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_SANITIZE_STRIPPED": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_SANITIZE_URL": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_UNSAFE_RAW": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_VALIDATE_ALL": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_VALIDATE_BOOLEAN": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_VALIDATE_EMAIL": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_VALIDATE_FLOAT": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_VALIDATE_INT": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_VALIDATE_IP": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_VALIDATE_MAC": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "FILTER_VALIDATE_REGEXP": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FILTER_VALIDATE_URL": { + "ext.name": "filter", + "ext.min": "0.9.4", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FNM_CASEFOLD": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FNM_NOESCAPE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FNM_PATHNAME": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FNM_PERIOD": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FORCE_DEFLATE": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FORCE_GZIP": { + "ext.name": "zlib", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FPE_FLTDIV": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FPE_FLTINV": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FPE_FLTOVF": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FPE_FLTRES": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FPE_FLTSUB": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FPE_FLTUND": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FPE_INTDIV": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FPE_INTOVF": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "FTP_ASCII": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FTP_AUTORESUME": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "FTP_AUTOSEEK": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "FTP_BINARY": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FTP_FAILED": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "FTP_FINISHED": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "FTP_IMAGE": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FTP_MOREDATA": { + "ext.name": "ftp", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "FTP_TEXT": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FTP_TIMEOUT_SEC": { + "ext.name": "ftp", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FT_INTERNAL": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FT_NOT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FT_PEEK": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FT_PREFETCHTEXT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "FT_UID": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "GD_BUNDLED": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "GD_EXTRA_VERSION": { + "ext.name": "gd", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "GD_MAJOR_VERSION": { + "ext.name": "gd", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "GD_MINOR_VERSION": { + "ext.name": "gd", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "GD_RELEASE_VERSION": { + "ext.name": "gd", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "GD_VERSION": { + "ext.name": "gd", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "GEOIP_ASNUM_EDITION": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_CABLEDSL_SPEED": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_CITY_EDITION_REV0": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_CITY_EDITION_REV1": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_CORPORATE_SPEED": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_COUNTRY_EDITION": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_DIALUP_SPEED": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_DOMAIN_EDITION": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_ISP_EDITION": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_NETSPEED_EDITION": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_NETSPEED_EDITION_REV1": { + "ext.name": "geoip", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_ORG_EDITION": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_PROXY_EDITION": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_REGION_EDITION_REV0": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_REGION_EDITION_REV1": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GEOIP_UNKNOWN_SPEED": { + "ext.name": "geoip", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "GLOB_AVAILABLE_FLAGS": { + "ext.name": "standard", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "GLOB_BRACE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "GLOB_ERR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "GLOB_MARK": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "GLOB_NOCHECK": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "GLOB_NOESCAPE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "GLOB_NOSORT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "GLOB_ONLYDIR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "GMP_BIG_ENDIAN": { + "ext.name": "gmp", + "ext.min": "5.6.1RC1", + "ext.max": null, + "php.min": "5.6.1RC1", + "php.max": null + }, + "GMP_LITTLE_ENDIAN": { + "ext.name": "gmp", + "ext.min": "5.6.1RC1", + "ext.max": null, + "php.min": "5.6.1RC1", + "php.max": null + }, + "GMP_LSW_FIRST": { + "ext.name": "gmp", + "ext.min": "5.6.1RC1", + "ext.max": null, + "php.min": "5.6.1RC1", + "php.max": null + }, + "GMP_MPIR_VERSION": { + "ext.name": "gmp", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "GMP_MSW_FIRST": { + "ext.name": "gmp", + "ext.min": "5.6.1RC1", + "ext.max": null, + "php.min": "5.6.1RC1", + "php.max": null + }, + "GMP_NATIVE_ENDIAN": { + "ext.name": "gmp", + "ext.min": "5.6.1RC1", + "ext.max": null, + "php.min": "5.6.1RC1", + "php.max": null + }, + "GMP_ROUND_MINUSINF": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "GMP_ROUND_PLUSINF": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "GMP_ROUND_ZERO": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "GMP_VERSION": { + "ext.name": "gmp", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "GRAPHEME_EXTR_COUNT": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "GRAPHEME_EXTR_MAXBYTES": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "GRAPHEME_EXTR_MAXCHARS": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "HASH_HMAC": { + "ext.name": "hash", + "ext.min": "1.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "HTML_ENTITIES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "HTML_SPECIALCHARS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "HTTP_AUTH_ANY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_AUTH_BASIC": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_AUTH_DIGEST": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_AUTH_DIGEST_IE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_AUTH_GSSNEG": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_AUTH_NTLM": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_COOKIE_HTTPONLY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_COOKIE_PARSE_RAW": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_COOKIE_SECURE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_LEVEL_DEF": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_LEVEL_MAX": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_LEVEL_MIN": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_STRATEGY_DEF": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_STRATEGY_FILT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_STRATEGY_FIXED": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_STRATEGY_HUFF": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_STRATEGY_RLE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_TYPE_GZIP": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_TYPE_RAW": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_DEFLATE_TYPE_ZLIB": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_ENCODING_STREAM_FLUSH_FULL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_ENCODING_STREAM_FLUSH_NONE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_ENCODING_STREAM_FLUSH_SYNC": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_ENCODING": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_HEADER": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_INVALID_PARAM": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_MALFORMED_HEADERS": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_MESSAGE_TYPE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_QUERYSTRING": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_REQUEST": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_REQUEST_METHOD": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_REQUEST_POOL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_RESPONSE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_RUNTIME": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_SOCKET": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_E_URL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_IPRESOLVE_ANY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_IPRESOLVE_V4": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_IPRESOLVE_V6": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_ACL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_BASELINE_CONTROL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_CHECKIN": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_CHECKOUT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_CONNECT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_COPY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_DELETE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_GET": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_HEAD": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_LABEL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_LOCK": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_MERGE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_MKACTIVITY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_MKCOL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_MKWORKSPACE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_MOVE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_OPTIONS": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_POST": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_PROPFIND": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_PROPPATCH": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_PUT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_REPORT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_TRACE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_UNCHECKOUT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_UNLOCK": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_UPDATE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_METH_VERSION_CONTROL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_MSG_NONE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_MSG_REQUEST": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_MSG_RESPONSE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PARAMS_ALLOW_COMMA": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PARAMS_ALLOW_FAILURE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PARAMS_DEFAULT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PARAMS_RAISE_ERROR": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_POSTREDIR_301": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_POSTREDIR_302": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_POSTREDIR_ALL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PROXY_HTTP": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PROXY_HTTP_1_0": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PROXY_SOCKS4": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PROXY_SOCKS4A": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PROXY_SOCKS5": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_PROXY_SOCKS5_HOSTNAME": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_QUERYSTRING_TYPE_ARRAY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_QUERYSTRING_TYPE_BOOL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_QUERYSTRING_TYPE_FLOAT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_QUERYSTRING_TYPE_INT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_QUERYSTRING_TYPE_OBJECT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_QUERYSTRING_TYPE_STRING": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_REDIRECT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_REDIRECT_FOUND": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_REDIRECT_PERM": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_REDIRECT_POST": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_REDIRECT_PROXY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_REDIRECT_TEMP": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SSL_VERSION_ANY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SSL_VERSION_SSLv2": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SSL_VERSION_SSLv3": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SSL_VERSION_TLSv1": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SUPPORT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SUPPORT_ENCODINGS": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SUPPORT_EVENTS": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SUPPORT_MAGICMIME": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SUPPORT_REQUESTS": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_SUPPORT_SSLREQUESTS": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_FROM_ENV": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_JOIN_PATH": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_JOIN_QUERY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_REPLACE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_STRIP_ALL": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_STRIP_AUTH": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_STRIP_FRAGMENT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_STRIP_PASS": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_STRIP_PATH": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_STRIP_PORT": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_STRIP_QUERY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_URL_STRIP_USER": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_VERSION_1_0": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_VERSION_1_1": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_VERSION_ANY": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "HTTP_VERSION_NONE": { + "ext.name": "http", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": "5.5.30" + }, + "ICONV_IMPL": { + "ext.name": "iconv", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "ICONV_MIME_DECODE_CONTINUE_ON_ERROR": { + "ext.name": "iconv", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ICONV_MIME_DECODE_STRICT": { + "ext.name": "iconv", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ICONV_VERSION": { + "ext.name": "iconv", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "IDNA_ALLOW_UNASSIGNED": { + "ext.name": "intl", + "ext.min": "1.0.2", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_CHECK_BIDI": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_CHECK_CONTEXTJ": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_DEFAULT": { + "ext.name": "intl", + "ext.min": "1.0.2", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_BIDI": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_CONTEXTJ": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_DISALLOWED": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_DOMAIN_NAME_TOO_LONG": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_EMPTY_LABEL": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_HYPHEN_3_4": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_INVALID_ACE_LABEL": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_LABEL_HAS_DOT": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_LABEL_TOO_LONG": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_LEADING_COMBINING_MARK": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_LEADING_HYPHEN": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_PUNYCODE": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_ERROR_TRAILING_HYPHEN": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_NONTRANSITIONAL_TO_ASCII": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_NONTRANSITIONAL_TO_UNICODE": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IDNA_USE_STD3_RULES": { + "ext.name": "intl", + "ext.min": "1.0.2", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "ILL_BADSTK": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ILL_COPROC": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ILL_ILLADR": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ILL_ILLOPC": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ILL_ILLOPN": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ILL_ILLTRP": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ILL_PRVOPC": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ILL_PRVREG": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "IMAGETYPE_BMP": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_COUNT": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "IMAGETYPE_GIF": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_ICO": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "IMAGETYPE_IFF": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_JB2": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_JP2": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_JPC": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_JPEG": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_JPEG2000": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_JPX": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_PNG": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_PSD": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_SWC": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_SWF": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_TIFF_II": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_TIFF_MM": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_UNKNOWN": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "IMAGETYPE_WBMP": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAGETYPE_XBM": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAP_CLOSETIMEOUT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAP_GC_ELT": { + "ext.name": "imap", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "IMAP_GC_ENV": { + "ext.name": "imap", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "IMAP_GC_TEXTS": { + "ext.name": "imap", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "IMAP_OPENTIMEOUT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAP_READTIMEOUT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMAP_WRITETIMEOUT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_AFFINE_ROTATE": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_AFFINE_SCALE": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_AFFINE_SHEAR_HORIZONTAL": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_AFFINE_SHEAR_VERTICAL": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_AFFINE_TRANSLATE": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_ARC_CHORD": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_ARC_EDGED": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_ARC_NOFILL": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_ARC_PIE": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_ARC_ROUNDED": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_BELL": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_BESSEL": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_BICUBIC": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_BICUBIC_FIXED": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_BILINEAR_FIXED": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_BLACKMAN": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_BOX": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_BSPLINE": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_CATMULLROM": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_COLOR_BRUSHED": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_COLOR_STYLED": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_COLOR_STYLEDBRUSHED": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_COLOR_TILED": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_COLOR_TRANSPARENT": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_CROP_BLACK": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_CROP_DEFAULT": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_CROP_SIDES": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_CROP_THRESHOLD": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_CROP_TRANSPARENT": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_CROP_WHITE": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_EFFECT_ALPHABLEND": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_EFFECT_NORMAL": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_EFFECT_OVERLAY": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_EFFECT_REPLACE": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_BRIGHTNESS": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_COLORIZE": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_CONTRAST": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_EDGEDETECT": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_EMBOSS": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_GAUSSIAN_BLUR": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_GRAYSCALE": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_MEAN_REMOVAL": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_NEGATE": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_PIXELATE": { + "ext.name": "gd", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "IMG_FILTER_SELECTIVE_BLUR": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FILTER_SMOOTH": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_FLIP_BOTH": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_FLIP_HORIZONTAL": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_FLIP_VERTICAL": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_GAUSSIAN": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_GD2_COMPRESSED": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_GD2_RAW": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_GENERALIZED_CUBIC": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_GIF": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_HAMMING": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_HANNING": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_HERMITE": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_JPEG": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_JPG": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_MITCHELL": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_NEAREST_NEIGHBOUR": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_PNG": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_POWER": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_QUADRATIC": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_SINC": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_TRIANGLE": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_WBMP": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "IMG_WEIGHTED4": { + "ext.name": "gd", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IMG_XPM": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INF": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INFO_ALL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INFO_CONFIGURATION": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INFO_CREDITS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INFO_ENVIRONMENT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INFO_GENERAL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INFO_LICENSE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INFO_MODULES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INFO_VARIABLES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INI_ALL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INI_PERDIR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INI_SCANNER_NORMAL": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "INI_SCANNER_RAW": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "INI_SCANNER_TYPED": { + "ext.name": "standard", + "ext.min": "5.6.1RC1", + "ext.max": null, + "php.min": "5.6.1RC1", + "php.max": null + }, + "INI_SYSTEM": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INI_USER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INPUT_COOKIE": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INPUT_ENV": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INPUT_GET": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INPUT_POST": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INPUT_REQUEST": { + "ext.name": "filter", + "ext.min": "0.11.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "INPUT_SERVER": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INPUT_SESSION": { + "ext.name": "filter", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "INTL_ICU_DATA_VERSION": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.3.7", + "php.max": null + }, + "INTL_ICU_VERSION": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.3.7", + "php.max": null + }, + "INTL_IDNA_VARIANT_2003": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "INTL_IDNA_VARIANT_UTS46": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "INTL_MAX_LOCALE_LEN": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "IPPROTO_IP": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "IPPROTO_IPV6": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "IPV6_HOPLIMIT": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IPV6_MULTICAST_HOPS": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "IPV6_MULTICAST_IF": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "IPV6_MULTICAST_LOOP": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "IPV6_PKTINFO": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IPV6_RECVHOPLIMIT": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IPV6_RECVPKTINFO": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IPV6_RECVTCLASS": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IPV6_TCLASS": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IPV6_UNICAST_HOPS": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "IP_MULTICAST_IF": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "IP_MULTICAST_LOOP": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "IP_MULTICAST_TTL": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "JSMIN_ERROR_NONE": { + "ext.name": "jsmin", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.10", + "php.max": null + }, + "JSMIN_ERROR_UNTERMINATED_COMMENT": { + "ext.name": "jsmin", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.10", + "php.max": null + }, + "JSMIN_ERROR_UNTERMINATED_REGEX": { + "ext.name": "jsmin", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.10", + "php.max": null + }, + "JSMIN_ERROR_UNTERMINATED_STRING": { + "ext.name": "jsmin", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.10", + "php.max": null + }, + "JSON_BIGINT_AS_STRING": { + "ext.name": "json", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "JSON_ERROR_CTRL_CHAR": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_ERROR_DEPTH": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_ERROR_INF_OR_NAN": { + "ext.name": "json", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "JSON_ERROR_NONE": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_ERROR_RECURSION": { + "ext.name": "json", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "JSON_ERROR_STATE_MISMATCH": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_ERROR_SYNTAX": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_ERROR_UNSUPPORTED_TYPE": { + "ext.name": "json", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "JSON_ERROR_UTF8": { + "ext.name": "json", + "ext.min": "5.3.3", + "ext.max": null, + "php.min": "5.3.3", + "php.max": null + }, + "JSON_FORCE_OBJECT": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_HEX_AMP": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_HEX_APOS": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_HEX_QUOT": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_HEX_TAG": { + "ext.name": "json", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "JSON_NUMERIC_CHECK": { + "ext.name": "json", + "ext.min": "5.3.3", + "ext.max": null, + "php.min": "5.3.3", + "php.max": null + }, + "JSON_OBJECT_AS_ARRAY": { + "ext.name": "json", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "JSON_PARTIAL_OUTPUT_ON_ERROR": { + "ext.name": "json", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "JSON_PRESERVE_ZERO_FRACTION": { + "ext.name": "json", + "ext.min": "5.6.6RC1", + "ext.max": null, + "php.min": "5.6.6RC1", + "php.max": null + }, + "JSON_PRETTY_PRINT": { + "ext.name": "json", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "JSON_UNESCAPED_SLASHES": { + "ext.name": "json", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "JSON_UNESCAPED_UNICODE": { + "ext.name": "json", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "LATT_HASCHILDREN": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LATT_HASNOCHILDREN": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LATT_MARKED": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LATT_NOINFERIORS": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LATT_NOSELECT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LATT_REFERRAL": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LATT_UNMARKED": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LC_ALL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LC_COLLATE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LC_CTYPE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LC_MESSAGES": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LC_MONETARY": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LC_NUMERIC": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LC_TIME": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_DEREF_ALWAYS": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_DEREF_FINDING": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_DEREF_NEVER": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_DEREF_SEARCHING": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_ESCAPE_DN": { + "ext.name": "ldap", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "LDAP_ESCAPE_FILTER": { + "ext.name": "ldap", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "LDAP_MODIFY_BATCH_ADD": { + "ext.name": "ldap", + "ext.min": "5.4.26", + "ext.max": null, + "php.min": "5.4.26", + "php.max": null + }, + "LDAP_MODIFY_BATCH_ATTRIB": { + "ext.name": "ldap", + "ext.min": "5.4.26", + "ext.max": null, + "php.min": "5.4.26", + "php.max": null + }, + "LDAP_MODIFY_BATCH_MODTYPE": { + "ext.name": "ldap", + "ext.min": "5.4.26", + "ext.max": null, + "php.min": "5.4.26", + "php.max": null + }, + "LDAP_MODIFY_BATCH_REMOVE": { + "ext.name": "ldap", + "ext.min": "5.4.26", + "ext.max": null, + "php.min": "5.4.26", + "php.max": null + }, + "LDAP_MODIFY_BATCH_REMOVE_ALL": { + "ext.name": "ldap", + "ext.min": "5.4.26", + "ext.max": null, + "php.min": "5.4.26", + "php.max": null + }, + "LDAP_MODIFY_BATCH_REPLACE": { + "ext.name": "ldap", + "ext.min": "5.4.26", + "ext.max": null, + "php.min": "5.4.26", + "php.max": null + }, + "LDAP_MODIFY_BATCH_VALUES": { + "ext.name": "ldap", + "ext.min": "5.4.26", + "ext.max": null, + "php.min": "5.4.26", + "php.max": null + }, + "LDAP_OPT_CLIENT_CONTROLS": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_DEBUG_LEVEL": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_DEREF": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_DIAGNOSTIC_MESSAGE": { + "ext.name": "ldap", + "ext.min": "5.6.11RC1", + "ext.max": null, + "php.min": "5.6.11RC1", + "php.max": null + }, + "LDAP_OPT_ERROR_NUMBER": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_ERROR_STRING": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_HOST_NAME": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_MATCHED_DN": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_NETWORK_TIMEOUT": { + "ext.name": "ldap", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "LDAP_OPT_PROTOCOL_VERSION": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_REFERRALS": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_RESTART": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_SERVER_CONTROLS": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_SIZELIMIT": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_TIMELIMIT": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_TIMEOUT": { + "ext.name": "ldap", + "ext.min": "5.6.14RC1", + "ext.max": null, + "php.min": "5.6.14RC1", + "php.max": null + }, + "LDAP_OPT_X_SASL_AUTHCID": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_X_SASL_AUTHZID": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_X_SASL_MECH": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LDAP_OPT_X_SASL_REALM": { + "ext.name": "ldap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LIBEXSLT_DOTTED_VERSION": { + "ext.name": "xsl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "LIBEXSLT_VERSION": { + "ext.name": "xsl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "LIBXML_COMPACT": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_DOTTED_VERSION": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_DTDATTR": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_DTDLOAD": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_DTDVALID": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_ERR_ERROR": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_ERR_FATAL": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_ERR_NONE": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_ERR_WARNING": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_HTML_NODEFDTD": { + "ext.name": "libxml", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "LIBXML_HTML_NOIMPLIED": { + "ext.name": "libxml", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "LIBXML_LOADED_VERSION": { + "ext.name": "libxml", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "LIBXML_NOBLANKS": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_NOCDATA": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_NOEMPTYTAG": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_NOENT": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_NOERROR": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_NONET": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_NOWARNING": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_NOXMLDECL": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_NSCLEAN": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_PARSEHUGE": { + "ext.name": "libxml", + "ext.min": "5.2.12", + "ext.max": null, + "php.min": "5.2.12", + "php.max": null + }, + "LIBXML_PEDANTIC": { + "ext.name": "libxml", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "LIBXML_SCHEMA_CREATE": { + "ext.name": "libxml", + "ext.min": "5.5.2", + "ext.max": null, + "php.min": "5.5.2", + "php.max": null + }, + "LIBXML_VERSION": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXML_XINCLUDE": { + "ext.name": "libxml", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "LIBXSLT_DOTTED_VERSION": { + "ext.name": "xsl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "LIBXSLT_VERSION": { + "ext.name": "xsl", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "LOCK_EX": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOCK_NB": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOCK_SH": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOCK_UN": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_ALERT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_AUTH": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_AUTHPRIV": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_CONS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_CRIT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_CRON": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_DAEMON": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_DEBUG": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_EMERG": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_ERR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_INFO": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_KERN": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_LOCAL0": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_LOCAL1": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_LOCAL2": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_LOCAL3": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_LOCAL4": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_LOCAL5": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_LOCAL6": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_LOCAL7": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_LPR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_MAIL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_NDELAY": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_NEWS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_NOTICE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_NOWAIT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_ODELAY": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_PERROR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_PID": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_SYSLOG": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_USER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_UUCP": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "LOG_WARNING": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MAILPARSE_EXTRACT_OUTPUT": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MAILPARSE_EXTRACT_RETURN": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MAILPARSE_EXTRACT_STREAM": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MB_CASE_LOWER": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "MB_CASE_TITLE": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "MB_CASE_UPPER": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "MB_OVERLOAD_MAIL": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "MB_OVERLOAD_REGEX": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "MB_OVERLOAD_STRING": { + "ext.name": "mbstring", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "MCAST_BLOCK_SOURCE": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MCAST_JOIN_GROUP": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MCAST_JOIN_SOURCE_GROUP": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MCAST_LEAVE_GROUP": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MCAST_LEAVE_SOURCE_GROUP": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MCAST_UNBLOCK_SOURCE": { + "ext.name": "sockets", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MCRYPT_3DES": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_ARCFOUR": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_ARCFOUR_IV": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_BLOWFISH": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_CAST_128": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_CAST_256": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_CRYPT": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_DECRYPT": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_DES": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_DES_COMPAT": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_DEV_RANDOM": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_DEV_URANDOM": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_ENCRYPT": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_ENIGNA": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_GOST": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_IDEA": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_LOKI97": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_MARS": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_MODE_CBC": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_MODE_CFB": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_MODE_ECB": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_MODE_NOFB": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_MODE_OFB": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_MODE_STREAM": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_PANAMA": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RAND": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RC2": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RC4": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RC6": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RC6_128": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RC6_192": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RC6_256": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RIJNDAEL_128": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RIJNDAEL_192": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_RIJNDAEL_256": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_SAFER128": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_SAFER64": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_SAFERPLUS": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_SERPENT": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_SERPENT_128": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_SERPENT_192": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_SERPENT_256": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_SKIPJACK": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_TEAN": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_THREEWAY": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_TRIPLEDES": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_TWOFISH": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_TWOFISH128": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_TWOFISH192": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_TWOFISH256": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_WAKE": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MCRYPT_XTEA": { + "ext.name": "mcrypt", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MEMCACHE_COMPRESSED": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "MEMCACHE_HAVE_SESSION": { + "ext.name": "memcache", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "MEMCACHE_SERIALIZED": { + "ext.name": "memcache", + "ext.min": "0.2", + "ext.max": "0.2", + "php.min": "4.3.3", + "php.max": null + }, + "MEMCACHE_USER1": { + "ext.name": "memcache", + "ext.min": "3.0.8", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "MEMCACHE_USER2": { + "ext.name": "memcache", + "ext.min": "3.0.8", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "MEMCACHE_USER3": { + "ext.name": "memcache", + "ext.min": "3.0.8", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "MEMCACHE_USER4": { + "ext.name": "memcache", + "ext.min": "3.0.8", + "ext.max": null, + "php.min": "4.3.11", + "php.max": null + }, + "MHASH_ADLER32": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_CRC32": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_CRC32B": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_FNV132": { + "ext.name": "hash", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MHASH_FNV164": { + "ext.name": "hash", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MHASH_FNV1A32": { + "ext.name": "hash", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MHASH_FNV1A64": { + "ext.name": "hash", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MHASH_GOST": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_HAVAL128": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_HAVAL160": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_HAVAL192": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_HAVAL224": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_HAVAL256": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_JOAAT": { + "ext.name": "hash", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "MHASH_MD2": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_MD4": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_MD5": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_RIPEMD128": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_RIPEMD160": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_RIPEMD256": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_RIPEMD320": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_SHA1": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_SHA224": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_SHA256": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_SHA384": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_SHA512": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_SNEFRU128": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_SNEFRU256": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_TIGER": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_TIGER128": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_TIGER160": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MHASH_WHIRLPOOL": { + "ext.name": "mhash", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MONGO_STREAMS": { + "ext.name": "mongo", + "ext.min": "1.4.2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_IO_COMPLETED": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_IO_PROGRESS": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_IO_READ": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_IO_WRITE": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_BATCHINSERT": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_CMD_DELETE": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_CMD_INSERT": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_CMD_UPDATE": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_DELETE": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_GETMORE": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_INSERT": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_KILLCURSOR": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_QUERY": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_RESPONSE_HEADER": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_UPDATE": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_WRITE_BATCH": { + "ext.name": "mongo", + "ext.min": "1.5.0RC1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_LOG_WRITE_REPLY": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_TYPE_IO_INIT": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_STREAM_NOTIFY_TYPE_LOG": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_SUPPORTS_AUTH_MECHANISM_GSSAPI": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_SUPPORTS_AUTH_MECHANISM_MONGODB_CR": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_SUPPORTS_AUTH_MECHANISM_MONGODB_X509": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_SUPPORTS_AUTH_MECHANISM_PLAIN": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_SUPPORTS_AUTH_MECHANISM_SCRAM_SHA1": { + "ext.name": "mongo", + "ext.min": "1.6.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MONGO_SUPPORTS_SSL": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MONGO_SUPPORTS_STREAMS": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "MON_1": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_10": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_11": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_12": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_2": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_3": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_4": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_5": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_6": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_7": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_8": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MON_9": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MSG_CMSG_CLOEXEC": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MSG_CONFIRM": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MSG_CTRUNC": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MSG_DONTROUTE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MSG_DONTWAIT": { + "ext.name": "sockets", + "ext.min": "5.2.10", + "ext.max": null, + "php.min": "5.2.10", + "php.max": null + }, + "MSG_EAGAIN": { + "ext.name": "sysvmsg", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "MSG_ENOMSG": { + "ext.name": "sysvmsg", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "MSG_EOF": { + "ext.name": "sockets", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "MSG_EOR": { + "ext.name": "sockets", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "MSG_ERRQUEUE": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MSG_EXCEPT": { + "ext.name": "sysvmsg", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MSG_IPC_NOWAIT": { + "ext.name": "sysvmsg", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MSG_MORE": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MSG_NOERROR": { + "ext.name": "sysvmsg", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MSG_NOSIGNAL": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MSG_OOB": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MSG_PEEK": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MSG_TRUNC": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MSG_WAITALL": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "MSG_WAITFORONE": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MSSQL_ASSOC": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MSSQL_BOTH": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MSSQL_NUM": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MYSQLI_ASSOC": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_ASYNC": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_AUTO_INCREMENT_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_BINARY_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_BLOB_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_BOTH": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS": { + "ext.name": "mysqli", + "ext.min": "5.6.0RC3", + "ext.max": null, + "php.min": "5.6.0RC3", + "php.max": null + }, + "MYSQLI_CLIENT_COMPRESS": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CLIENT_FOUND_ROWS": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CLIENT_IGNORE_SPACE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CLIENT_INTERACTIVE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CLIENT_NO_SCHEMA": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CLIENT_SSL": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CURSOR_TYPE_FOR_UPDATE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CURSOR_TYPE_NO_CURSOR": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CURSOR_TYPE_READ_ONLY": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_CURSOR_TYPE_SCROLLABLE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_DATA_TRUNCATED": { + "ext.name": "mysqli", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "MYSQLI_DEBUG_TRACE_ENABLED": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_ENUM_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_GROUP_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_INIT_COMMAND": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_MULTIPLE_KEY_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_NOT_NULL_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_NO_DATA": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_NO_DEFAULT_VALUE_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_NUM": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_NUM_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_ON_UPDATE_NOW_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_OPT_CAN_HANDLE_EXPIRED_PASSWORDS": { + "ext.name": "mysqli", + "ext.min": "5.4.12", + "ext.max": null, + "php.min": "5.4.12", + "php.max": null + }, + "MYSQLI_OPT_CONNECT_TIMEOUT": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_OPT_INT_AND_FLOAT_NATIVE": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_OPT_LOCAL_INFILE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_OPT_NET_CMD_BUFFER_SIZE": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_OPT_NET_READ_BUFFER_SIZE": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_OPT_SSL_VERIFY_SERVER_CERT": { + "ext.name": "mysqli", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "MYSQLI_PART_KEY_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_PRI_KEY_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_READ_DEFAULT_FILE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_READ_DEFAULT_GROUP": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_REFRESH_BACKUP_LOG": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_REFRESH_GRANT": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_REFRESH_HOSTS": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_REFRESH_LOG": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_REFRESH_MASTER": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_REFRESH_SLAVE": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_REFRESH_STATUS": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_REFRESH_TABLES": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_REFRESH_THREADS": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_REPORT_ALL": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_REPORT_ERROR": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_REPORT_INDEX": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_REPORT_OFF": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_REPORT_STRICT": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_RPL_ADMIN": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "MYSQLI_RPL_MASTER": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "MYSQLI_RPL_SLAVE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": "5.2.17" + }, + "MYSQLI_SERVER_PS_OUT_PARAMS": { + "ext.name": "mysqli", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "MYSQLI_SERVER_PUBLIC_KEY": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MYSQLI_SERVER_QUERY_NO_GOOD_INDEX_USED": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_SERVER_QUERY_NO_INDEX_USED": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_SERVER_QUERY_WAS_SLOW": { + "ext.name": "mysqli", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "MYSQLI_SET_CHARSET_DIR": { + "ext.name": "mysqli", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "MYSQLI_SET_CHARSET_NAME": { + "ext.name": "mysqli", + "ext.min": "5.2.5", + "ext.max": null, + "php.min": "5.2.5", + "php.max": null + }, + "MYSQLI_SET_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_STMT_ATTR_CURSOR_TYPE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_STMT_ATTR_PREFETCH_ROWS": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_STORE_RESULT": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_STORE_RESULT_COPY_DATA": { + "ext.name": "mysqli", + "ext.min": "5.6.0beta2", + "ext.max": null, + "php.min": "5.6.0beta2", + "php.max": null + }, + "MYSQLI_TIMESTAMP_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TRANS_COR_AND_CHAIN": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MYSQLI_TRANS_COR_AND_NO_CHAIN": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MYSQLI_TRANS_COR_NO_RELEASE": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MYSQLI_TRANS_COR_RELEASE": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MYSQLI_TRANS_START_READ_ONLY": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MYSQLI_TRANS_START_READ_WRITE": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MYSQLI_TRANS_START_WITH_CONSISTENT_SNAPSHOT": { + "ext.name": "mysqli", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "MYSQLI_TYPE_BIT": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_BLOB": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_CHAR": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_DATE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_DATETIME": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_DECIMAL": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_DOUBLE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_ENUM": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_FLOAT": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_GEOMETRY": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_INT24": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_INTERVAL": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_LONG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_LONGLONG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_LONG_BLOB": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_MEDIUM_BLOB": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_NEWDATE": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_NEWDECIMAL": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_NULL": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_SET": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_SHORT": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_STRING": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_TIME": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_TIMESTAMP": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_TINY": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_TINY_BLOB": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_VAR_STRING": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_TYPE_YEAR": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_UNIQUE_KEY_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_UNSIGNED_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_USE_RESULT": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQLI_ZEROFILL_FLAG": { + "ext.name": "mysqli", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "MYSQL_ASSOC": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MYSQL_BOTH": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "MYSQL_CLIENT_COMPRESS": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MYSQL_CLIENT_IGNORE_SPACE": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MYSQL_CLIENT_INTERACTIVE": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MYSQL_CLIENT_SSL": { + "ext.name": "mysql", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "MYSQL_NUM": { + "ext.name": "mysql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_1_PI": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_2_PI": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_2_SQRTPI": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_E": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_EULER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_LN10": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_LN2": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_LNPI": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_LOG10E": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_LOG2E": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_PI": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_PI_2": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_PI_4": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_SQRT1_2": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_SQRT2": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_SQRT3": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "M_SQRTPI": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "NAN": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "NIL": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "NOEXPR": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "NULL": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OAUTH_AUTH_TYPE_AUTHORIZATION": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_AUTH_TYPE_FORM": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_AUTH_TYPE_NONE": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_AUTH_TYPE_URI": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_BAD_NONCE": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_BAD_TIMESTAMP": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_CONSUMER_KEY_REFUSED": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_CONSUMER_KEY_UNKNOWN": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_HTTP_METHOD_DELETE": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_HTTP_METHOD_GET": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_HTTP_METHOD_HEAD": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_HTTP_METHOD_POST": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_HTTP_METHOD_PUT": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_INVALID_SIGNATURE": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_OK": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_PARAMETER_ABSENT": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_REQENGINE_CURL": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_REQENGINE_STREAMS": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_SIGNATURE_METHOD_REJECTED": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_SIG_METHOD_HMACSHA1": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_SIG_METHOD_HMACSHA256": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_SIG_METHOD_PLAINTEXT": { + "ext.name": "OAuth", + "ext.min": "1.2", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_SIG_METHOD_RSASHA1": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_SSLCHECK_BOTH": { + "ext.name": "OAuth", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_SSLCHECK_HOST": { + "ext.name": "OAuth", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_SSLCHECK_NONE": { + "ext.name": "OAuth", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_SSLCHECK_PEER": { + "ext.name": "OAuth", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_TOKEN_EXPIRED": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_TOKEN_REJECTED": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_TOKEN_REVOKED": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_TOKEN_USED": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "OAUTH_VERIFIER_INVALID": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "ODBC_BINMODE_CONVERT": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ODBC_BINMODE_PASSTHRU": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ODBC_BINMODE_RETURN": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ODBC_TYPE": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OPENSSL_ALGO_DSS1": { + "ext.name": "openssl", + "ext.min": "5.2.8", + "ext.max": null, + "php.min": "5.2.8", + "php.max": null + }, + "OPENSSL_ALGO_MD2": { + "ext.name": "openssl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "OPENSSL_ALGO_MD4": { + "ext.name": "openssl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "OPENSSL_ALGO_MD5": { + "ext.name": "openssl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "OPENSSL_ALGO_RMD160": { + "ext.name": "openssl", + "ext.min": "5.4.8", + "ext.max": null, + "php.min": "5.4.8", + "php.max": null + }, + "OPENSSL_ALGO_SHA1": { + "ext.name": "openssl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "OPENSSL_ALGO_SHA224": { + "ext.name": "openssl", + "ext.min": "5.4.8", + "ext.max": null, + "php.min": "5.4.8", + "php.max": null + }, + "OPENSSL_ALGO_SHA256": { + "ext.name": "openssl", + "ext.min": "5.4.8", + "ext.max": null, + "php.min": "5.4.8", + "php.max": null + }, + "OPENSSL_ALGO_SHA384": { + "ext.name": "openssl", + "ext.min": "5.4.8", + "ext.max": null, + "php.min": "5.4.8", + "php.max": null + }, + "OPENSSL_ALGO_SHA512": { + "ext.name": "openssl", + "ext.min": "5.4.8", + "ext.max": null, + "php.min": "5.4.8", + "php.max": null + }, + "OPENSSL_CIPHER_3DES": { + "ext.name": "openssl", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "OPENSSL_CIPHER_AES_128_CBC": { + "ext.name": "openssl", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "OPENSSL_CIPHER_AES_192_CBC": { + "ext.name": "openssl", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "OPENSSL_CIPHER_AES_256_CBC": { + "ext.name": "openssl", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "OPENSSL_CIPHER_DES": { + "ext.name": "openssl", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "OPENSSL_CIPHER_RC2_128": { + "ext.name": "openssl", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "OPENSSL_CIPHER_RC2_40": { + "ext.name": "openssl", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "OPENSSL_CIPHER_RC2_64": { + "ext.name": "openssl", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "OPENSSL_DEFAULT_STREAM_CIPHERS": { + "ext.name": "openssl", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "OPENSSL_KEYTYPE_DH": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "OPENSSL_KEYTYPE_DSA": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "OPENSSL_KEYTYPE_EC": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "OPENSSL_KEYTYPE_RSA": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "OPENSSL_NO_PADDING": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "OPENSSL_PKCS1_OAEP_PADDING": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "OPENSSL_PKCS1_PADDING": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "OPENSSL_RAW_DATA": { + "ext.name": "openssl", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "OPENSSL_SSLV23_PADDING": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "OPENSSL_TLSEXT_SERVER_NAME": { + "ext.name": "openssl", + "ext.min": "5.3.2", + "ext.max": null, + "php.min": "5.3.2", + "php.max": null + }, + "OPENSSL_VERSION_NUMBER": { + "ext.name": "openssl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "OPENSSL_VERSION_TEXT": { + "ext.name": "openssl", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "OPENSSL_ZERO_PADDING": { + "ext.name": "openssl", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "OP_ANONYMOUS": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OP_DEBUG": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OP_EXPUNGE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OP_HALFOPEN": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OP_PROTOTYPE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OP_READONLY": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OP_SECURE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OP_SHORTCACHE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "OP_SILENT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PASSWORD_BCRYPT": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "PASSWORD_BCRYPT_DEFAULT_COST": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "PASSWORD_DEFAULT": { + "ext.name": "standard", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "PATHINFO_BASENAME": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PATHINFO_DIRNAME": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PATHINFO_EXTENSION": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PATHINFO_FILENAME": { + "ext.name": "standard", + "ext.min": "5.2.0RC1", + "ext.max": null, + "php.min": "5.2.0RC1", + "php.max": null + }, + "PATH_SEPARATOR": { + "ext.name": "standard", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "PCNTL_E2BIG": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_EACCES": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_EAGAIN": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ECHILD": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_EFAULT": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_EINTR": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_EINVAL": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_EIO": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_EISDIR": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ELIBBAD": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ELOOP": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_EMFILE": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ENAMETOOLONG": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ENFILE": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ENOENT": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ENOEXEC": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ENOMEM": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ENOTDIR": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_EPERM": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ESRCH": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCNTL_ETXTBSY": { + "ext.name": "pcntl", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": null + }, + "PCRE_VERSION": { + "ext.name": "pcre", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "PEAR_EXTENSION_DIR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PEAR_INSTALL_DIR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_ASSOC": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_BAD_RESPONSE": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_BOTH": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_COMMAND_OK": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_CONNECTION_AUTH_OK": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_CONNECTION_AWAITING_RESPONSE": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_CONNECTION_BAD": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_CONNECTION_MADE": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_CONNECTION_OK": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_CONNECTION_SETENV": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_CONNECTION_SSL_STARTUP": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_CONNECTION_STARTED": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_CONNECT_ASYNC": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_CONNECT_FORCE_NEW": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_CONV_FORCE_NULL": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_CONV_IGNORE_DEFAULT": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_CONV_IGNORE_NOT_NULL": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_COPY_IN": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_COPY_OUT": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_CONTEXT": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_INTERNAL_POSITION": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_INTERNAL_QUERY": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_MESSAGE_DETAIL": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_MESSAGE_HINT": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_MESSAGE_PRIMARY": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_SEVERITY": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_SOURCE_FILE": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_SOURCE_FUNCTION": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_SOURCE_LINE": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_SQLSTATE": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DIAG_STATEMENT_POSITION": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DML_ASYNC": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DML_ESCAPE": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_DML_EXEC": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DML_NO_CONV": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_DML_STRING": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_EMPTY_QUERY": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_ERRORS_DEFAULT": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_ERRORS_TERSE": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_ERRORS_VERBOSE": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_FATAL_ERROR": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_LIBPQ_VERSION": { + "ext.name": "pgsql", + "ext.min": "5.4.4", + "ext.max": null, + "php.min": "5.4.4", + "php.max": null + }, + "PGSQL_LIBPQ_VERSION_STR": { + "ext.name": "pgsql", + "ext.min": "5.4.4", + "ext.max": null, + "php.min": "5.4.4", + "php.max": null + }, + "PGSQL_NONFATAL_ERROR": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_NUM": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_POLLING_ACTIVE": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_POLLING_FAILED": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_POLLING_OK": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_POLLING_READING": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_POLLING_WRITING": { + "ext.name": "pgsql", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "PGSQL_SEEK_CUR": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_SEEK_END": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_SEEK_SET": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_STATUS_LONG": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_STATUS_STRING": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PGSQL_TRANSACTION_ACTIVE": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PGSQL_TRANSACTION_IDLE": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PGSQL_TRANSACTION_INERROR": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PGSQL_TRANSACTION_INTRANS": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PGSQL_TRANSACTION_UNKNOWN": { + "ext.name": "pgsql", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PGSQL_TUPLES_OK": { + "ext.name": "pgsql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_BINARY": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_BINARY_READ": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "PHP_BINDIR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_CONFIG_FILE_PATH": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_CONFIG_FILE_SCAN_DIR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_DATADIR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_DEBUG": { + "ext.name": "Core", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "PHP_EOL": { + "ext.name": "Core", + "ext.min": "4.3.10", + "ext.max": null, + "php.min": "4.3.10", + "php.max": null + }, + "PHP_EXTENSION_DIR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_EXTRA_VERSION": { + "ext.name": "Core", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "PHP_INT_MAX": { + "ext.name": "Core", + "ext.min": "4.4.0", + "ext.max": null, + "php.min": "4.4.0", + "php.max": null + }, + "PHP_INT_SIZE": { + "ext.name": "Core", + "ext.min": "4.4.0", + "ext.max": null, + "php.min": "4.4.0", + "php.max": null + }, + "PHP_LIBDIR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_LOCALSTATEDIR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_MAJOR_VERSION": { + "ext.name": "Core", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "PHP_MANDIR": { + "ext.name": "Core", + "ext.min": "5.3.7", + "ext.max": null, + "php.min": "5.3.7", + "php.max": null + }, + "PHP_MAXPATHLEN": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_MINOR_VERSION": { + "ext.name": "Core", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "PHP_NORMAL_READ": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "PHP_OS": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_CLEAN": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_CLEANABLE": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_CONT": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_DISABLED": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_END": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_FINAL": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_FLUSH": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_FLUSHABLE": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_REMOVABLE": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_START": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_STARTED": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_STDFLAGS": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_OUTPUT_HANDLER_WRITE": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_PREFIX": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "PHP_QUERY_RFC1738": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_QUERY_RFC3986": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_RELEASE_VERSION": { + "ext.name": "Core", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "PHP_ROUND_HALF_DOWN": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_ROUND_HALF_EVEN": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_ROUND_HALF_ODD": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_ROUND_HALF_UP": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_SAPI": { + "ext.name": "Core", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "PHP_SESSION_ACTIVE": { + "ext.name": "session", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_SESSION_DISABLED": { + "ext.name": "session", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_SESSION_NONE": { + "ext.name": "session", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "PHP_SHLIB_SUFFIX": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_SYSCONFDIR": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_URL_FRAGMENT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_URL_HOST": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_URL_PASS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_URL_PATH": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_URL_PORT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_URL_QUERY": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_URL_SCHEME": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_URL_USER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_VERSION": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PHP_VERSION_ID": { + "ext.name": "Core", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "PHP_WINDOWS_NT_DOMAIN_CONTROLLER": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_NT_SERVER": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_NT_WORKSTATION": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_VERSION_BUILD": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_VERSION_MAJOR": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_VERSION_MINOR": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_VERSION_PLATFORM": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_VERSION_PRODUCTTYPE": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_VERSION_SP_MAJOR": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_VERSION_SP_MINOR": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_WINDOWS_VERSION_SUITEMASK": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PHP_ZTS": { + "ext.name": "Core", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "PKCS7_BINARY": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "PKCS7_DETACHED": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "PKCS7_NOATTR": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "PKCS7_NOCERTS": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "PKCS7_NOCHAIN": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "PKCS7_NOINTERN": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "PKCS7_NOSIGS": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "PKCS7_NOVERIFY": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "PKCS7_TEXT": { + "ext.name": "openssl", + "ext.min": "4.0.6", + "ext.max": null, + "php.min": "4.0.6", + "php.max": null + }, + "PM_STR": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "PNG_ALL_FILTERS": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PNG_FILTER_AVG": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PNG_FILTER_NONE": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PNG_FILTER_PAETH": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PNG_FILTER_SUB": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PNG_FILTER_UP": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PNG_NO_FILTER": { + "ext.name": "gd", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "POLL_ERR": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "POLL_HUP": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "POLL_IN": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "POLL_MSG": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "POLL_OUT": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "POLL_PRI": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "POSIX_F_OK": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "POSIX_R_OK": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "POSIX_S_IFBLK": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "POSIX_S_IFCHR": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "POSIX_S_IFIFO": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "POSIX_S_IFREG": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "POSIX_S_IFSOCK": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "POSIX_W_OK": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "POSIX_X_OK": { + "ext.name": "posix", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "PREG_BACKTRACK_LIMIT_ERROR": { + "ext.name": "pcre", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PREG_BAD_UTF8_ERROR": { + "ext.name": "pcre", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PREG_BAD_UTF8_OFFSET_ERROR": { + "ext.name": "pcre", + "ext.min": "5.2.9", + "ext.max": null, + "php.min": "5.2.9", + "php.max": null + }, + "PREG_GREP_INVERT": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PREG_INTERNAL_ERROR": { + "ext.name": "pcre", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PREG_NO_ERROR": { + "ext.name": "pcre", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PREG_OFFSET_CAPTURE": { + "ext.name": "pcre", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "PREG_PATTERN_ORDER": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PREG_RECURSION_LIMIT_ERROR": { + "ext.name": "pcre", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "PREG_SET_ORDER": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PREG_SPLIT_DELIM_CAPTURE": { + "ext.name": "pcre", + "ext.min": "4.0.5", + "ext.max": null, + "php.min": "4.0.5", + "php.max": null + }, + "PREG_SPLIT_NO_EMPTY": { + "ext.name": "pcre", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PREG_SPLIT_OFFSET_CAPTURE": { + "ext.name": "pcre", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "PRIO_PGRP": { + "ext.name": "pcntl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "PRIO_PROCESS": { + "ext.name": "pcntl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "PRIO_USER": { + "ext.name": "pcntl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "PSFS_ERR_FATAL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PSFS_FEED_ME": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PSFS_FLAG_FLUSH_CLOSE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PSFS_FLAG_FLUSH_INC": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PSFS_FLAG_NORMAL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PSFS_PASS_ON": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "PTHREADS_ALLOW_GLOBALS": { + "ext.name": "pthreads", + "ext.min": "2.0.1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PTHREADS_ALLOW_HEADERS": { + "ext.name": "pthreads", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PTHREADS_INHERIT_ALL": { + "ext.name": "pthreads", + "ext.min": "0.0.43", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PTHREADS_INHERIT_CLASSES": { + "ext.name": "pthreads", + "ext.min": "0.0.43", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PTHREADS_INHERIT_COMMENTS": { + "ext.name": "pthreads", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PTHREADS_INHERIT_CONSTANTS": { + "ext.name": "pthreads", + "ext.min": "0.0.43", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PTHREADS_INHERIT_FUNCTIONS": { + "ext.name": "pthreads", + "ext.min": "0.0.43", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PTHREADS_INHERIT_INCLUDES": { + "ext.name": "pthreads", + "ext.min": "0.0.43", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PTHREADS_INHERIT_INI": { + "ext.name": "pthreads", + "ext.min": "0.0.43", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "PTHREADS_INHERIT_NONE": { + "ext.name": "pthreads", + "ext.min": "0.0.43", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "RADIXCHAR": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "RAR_HOST_BEOS": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RAR_HOST_MACOS": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RAR_HOST_MSDOS": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RAR_HOST_OS2": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RAR_HOST_UNIX": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "RAR_HOST_WIN32": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "READLINE_LIB": { + "ext.name": "readline", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SA_ALL": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SA_MESSAGES": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SA_RECENT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SA_UIDNEXT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SA_UIDVALIDITY": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SA_UNSEEN": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SCANDIR_SORT_ASCENDING": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SCANDIR_SORT_DESCENDING": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SCANDIR_SORT_NONE": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SCM_CREDENTIALS": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "SCM_RIGHTS": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "SEARCHD_ERROR": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SEARCHD_OK": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SEARCHD_RETRY": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SEARCHD_WARNING": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SEEK_CUR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SEEK_END": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SEEK_SET": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SEGV_ACCERR": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SEGV_MAPERR": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SE_FREE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SE_NOPREFETCH": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SE_UID": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SID": { + "ext.name": "session", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SIGABRT": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGALRM": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGBABY": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGBUS": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGCHLD": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGCLD": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGCONT": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGFPE": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGHUP": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGILL": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGINT": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGIO": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGIOT": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGKILL": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGPIPE": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGPOLL": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGPROF": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGPWR": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGQUIT": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGSEGV": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGSTKFLT": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGSTOP": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGSYS": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGTERM": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGTRAP": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGTSTP": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGTTIN": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGTTOU": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGURG": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGUSR1": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGUSR2": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGVTALRM": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGWINCH": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGXCPU": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIGXFSZ": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIG_BLOCK": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SIG_DFL": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIG_ERR": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIG_IGN": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SIG_SETMASK": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SIG_UNBLOCK": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SI_ASYNCIO": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SI_KERNEL": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SI_MESGQ": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SI_NOINFO": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SI_QUEUE": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SI_SIGIO": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SI_TIMER": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SI_TKILL": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SI_USER": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SNMP_BIT_STR": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_COUNTER": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_COUNTER64": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_INTEGER": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_IPADDRESS": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_NULL": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_OBJECT_ID": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_OCTET_STR": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_OID_OUTPUT_FULL": { + "ext.name": "snmp", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "SNMP_OID_OUTPUT_MODULE": { + "ext.name": "snmp", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SNMP_OID_OUTPUT_NONE": { + "ext.name": "snmp", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SNMP_OID_OUTPUT_NUMERIC": { + "ext.name": "snmp", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "SNMP_OID_OUTPUT_SUFFIX": { + "ext.name": "snmp", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SNMP_OID_OUTPUT_UCD": { + "ext.name": "snmp", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SNMP_OPAQUE": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_TIMETICKS": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_UINTEGER": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_UNSIGNED": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_VALUE_LIBRARY": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_VALUE_OBJECT": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SNMP_VALUE_PLAIN": { + "ext.name": "snmp", + "ext.min": "4.3.3", + "ext.max": null, + "php.min": "4.3.3", + "php.max": null + }, + "SOAP_1_1": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_1_2": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_ACTOR_NEXT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_ACTOR_NONE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_ACTOR_UNLIMATERECEIVER": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_AUTHENTICATION_BASIC": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_AUTHENTICATION_DIGEST": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_COMPRESSION_ACCEPT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_COMPRESSION_DEFLATE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_COMPRESSION_GZIP": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_DOCUMENT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_ENCODED": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_ENC_ARRAY": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_ENC_OBJECT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_FUNCTIONS_ALL": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_LITERAL": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_PERSISTENCE_REQUEST": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_PERSISTENCE_SESSION": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_RPC": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_SINGLE_ELEMENT_ARRAYS": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_SSL_METHOD_SSLv2": { + "ext.name": "soap", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "SOAP_SSL_METHOD_SSLv23": { + "ext.name": "soap", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "SOAP_SSL_METHOD_SSLv3": { + "ext.name": "soap", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "SOAP_SSL_METHOD_TLS": { + "ext.name": "soap", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "SOAP_USE_XSI_ARRAY_TYPE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOAP_WAIT_ONE_WAY_CALLS": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SOCKET_E2BIG": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EACCES": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EADDRINUSE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EADDRNOTAVAIL": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EADV": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EAFNOSUPPORT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EAGAIN": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EALREADY": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EBADE": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EBADF": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EBADFD": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EBADMSG": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EBADR": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EBADRQC": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EBADSLT": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EBUSY": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ECHRNG": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ECOMM": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ECONNABORTED": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ECONNREFUSED": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ECONNRESET": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EDESTADDRREQ": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EDISCON": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EDQUOT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EEXIST": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EFAULT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EHOSTDOWN": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EHOSTUNREACH": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EIDRM": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EINPROGRESS": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EINTR": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EINVAL": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EIO": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EISCONN": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EISDIR": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EISNAM": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EL2HLT": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EL2NSYNC": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EL3HLT": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EL3RST": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ELNRNG": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ELOOP": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EMEDIUMTYPE": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EMFILE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EMLINK": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EMSGSIZE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EMULTIHOP": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENAMETOOLONG": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ENETDOWN": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ENETRESET": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ENETUNREACH": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ENFILE": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOANO": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOBUFS": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ENOCSI": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENODATA": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENODEV": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOENT": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOLCK": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOLINK": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOMEDIUM": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOMEM": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOMSG": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENONET": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOPROTOOPT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ENOSPC": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOSR": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOSTR": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOSYS": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOTBLK": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOTCONN": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ENOTDIR": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOTEMPTY": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ENOTSOCK": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ENOTTY": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENOTUNIQ": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ENXIO": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EOPNOTSUPP": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EPERM": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EPFNOSUPPORT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EPIPE": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EPROCLIM": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EPROTO": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EPROTONOSUPPORT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EPROTOTYPE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EREMCHG": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EREMOTE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EREMOTEIO": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ERESTART": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EROFS": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ESHUTDOWN": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ESOCKTNOSUPPORT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ESPIPE": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ESRMNT": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ESTALE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ESTRPIPE": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ETIME": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_ETIMEDOUT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_ETOOMANYREFS": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EUNATCH": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EUSERS": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EWOULDBLOCK": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_EXDEV": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_EXFULL": { + "ext.name": "sockets", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SOCKET_HOST_NOT_FOUND": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_NOTINITIALISED": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_NO_ADDRESS": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_NO_DATA": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_NO_RECOVERY": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_SYSNOTREADY": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_TRY_AGAIN": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCKET_VERNOTSUPPORTED": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCK_DGRAM": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCK_RAW": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCK_RDM": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCK_SEQPACKET": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOCK_STREAM": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOLR_EXTENSION_VERSION": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SOLR_MAJOR_VERSION": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SOLR_MINOR_VERSION": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SOLR_PATCH_VERSION": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "SOL_SOCKET": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOL_TCP": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOL_UDP": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SOMAXCONN": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SORTARRIVAL": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORTCC": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORTDATE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORTFROM": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORTSIZE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORTSUBJECT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORTTO": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORT_ASC": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORT_DESC": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORT_FLAG_CASE": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SORT_LOCALE_STRING": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORT_NATURAL": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "SORT_NUMERIC": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORT_REGULAR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SORT_STRING": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SO_BINDTODEVICE": { + "ext.name": "sockets", + "ext.min": "5.4.18", + "ext.max": null, + "php.min": "5.4.18", + "php.max": null + }, + "SO_BROADCAST": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_DEBUG": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_DONTROUTE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_ERROR": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_FREE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SO_KEEPALIVE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_LINGER": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_NOSERVER": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SO_OOBINLINE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_PASSCRED": { + "ext.name": "sockets", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "SO_RCVBUF": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_RCVLOWAT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_RCVTIMEO": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_REUSEADDR": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_REUSEPORT": { + "ext.name": "sockets", + "ext.min": "5.4.10", + "ext.max": null, + "php.min": "5.4.10", + "php.max": null + }, + "SO_SNDBUF": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_SNDLOWAT": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_SNDTIMEO": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SO_TYPE": { + "ext.name": "sockets", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "SPH_ATTR_BOOL": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_ATTR_FLOAT": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_ATTR_INTEGER": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_ATTR_MULTI": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_ATTR_ORDINAL": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_ATTR_TIMESTAMP": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_FILTER_FLOATRANGE": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_FILTER_RANGE": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_FILTER_VALUES": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_GROUPBY_ATTR": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_GROUPBY_ATTRPAIR": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_GROUPBY_DAY": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_GROUPBY_MONTH": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_GROUPBY_WEEK": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_GROUPBY_YEAR": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_MATCH_ALL": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_MATCH_ANY": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_MATCH_BOOLEAN": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_MATCH_EXTENDED": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_MATCH_EXTENDED2": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_MATCH_FULLSCAN": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_MATCH_PHRASE": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_RANK_BM25": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_RANK_EXPR": { + "ext.name": "sphinx", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "SPH_RANK_FIELDMASK": { + "ext.name": "sphinx", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "SPH_RANK_MATCHANY": { + "ext.name": "sphinx", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "SPH_RANK_NONE": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_RANK_PROXIMITY": { + "ext.name": "sphinx", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "SPH_RANK_PROXIMITY_BM25": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_RANK_SPH04": { + "ext.name": "sphinx", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "SPH_RANK_TOTAL": { + "ext.name": "sphinx", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "SPH_RANK_WORDCOUNT": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_SORT_ATTR_ASC": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_SORT_ATTR_DESC": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_SORT_EXPR": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_SORT_EXTENDED": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_SORT_RELEVANCE": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SPH_SORT_TIME_SEGMENTS": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "SQLBIT": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQLCHAR": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQLFLT4": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQLFLT8": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQLFLTN": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQLINT1": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQLINT2": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQLINT4": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQLITE3_ASSOC": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_BLOB": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_BOTH": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_FLOAT": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_INTEGER": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_NULL": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_NUM": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_OPEN_CREATE": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_OPEN_READONLY": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_OPEN_READWRITE": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE3_TEXT": { + "ext.name": "sqlite3", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "SQLITE_ABORT": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_ASSOC": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_AUTH": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_BOTH": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_BUSY": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_CANTOPEN": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_CONSTRAINT": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_CORRUPT": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_DONE": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_EMPTY": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_ERROR": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_FORMAT": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_FULL": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_INTERNAL": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_INTERRUPT": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_IOERR": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_LOCKED": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_MISMATCH": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_MISUSE": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_NOLFS": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_NOMEM": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_NOTADB": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_NOTFOUND": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_NUM": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_OK": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_PERM": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_PROTOCOL": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_READONLY": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_ROW": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_SCHEMA": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLITE_TOOBIG": { + "ext.name": "sqlite", + "ext.min": "2.0-dev", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "SQLTEXT": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQLVARCHAR": { + "ext.name": "mssql", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_BEST_ROWID": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_BIGINT": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_BINARY": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_BIT": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CHAR": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CONCURRENCY": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CONCUR_LOCK": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CONCUR_READ_ONLY": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CONCUR_ROWVER": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CONCUR_VALUES": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CURSOR_DYNAMIC": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CURSOR_FORWARD_ONLY": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CURSOR_KEYSET_DRIVEN": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CURSOR_STATIC": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CURSOR_TYPE": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CUR_USE_DRIVER": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CUR_USE_IF_NEEDED": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_CUR_USE_ODBC": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_DATE": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_DECIMAL": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_DOUBLE": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_ENSURE": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_FETCH_FIRST": { + "ext.name": "odbc", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SQL_FETCH_NEXT": { + "ext.name": "odbc", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "SQL_FLOAT": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_INDEX_ALL": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_INDEX_UNIQUE": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_INTEGER": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_KEYSET_SIZE": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_LONGVARBINARY": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_LONGVARCHAR": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_NO_NULLS": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_NULLABLE": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_NUMERIC": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_ODBC_CURSORS": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_QUICK": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_REAL": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_ROWVER": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_SCOPE_CURROW": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_SCOPE_SESSION": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_SCOPE_TRANSACTION": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_SMALLINT": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_TIME": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_TIMESTAMP": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_TINYINT": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_TYPE_DATE": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_TYPE_TIME": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_TYPE_TIMESTAMP": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_VARBINARY": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_VARCHAR": { + "ext.name": "odbc", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SQL_WCHAR": { + "ext.name": "odbc", + "ext.min": "5.4.32RC1", + "ext.max": null, + "php.min": "5.4.32RC1", + "php.max": null + }, + "SQL_WLONGVARCHAR": { + "ext.name": "odbc", + "ext.min": "5.4.32RC1", + "ext.max": null, + "php.min": "5.4.32RC1", + "php.max": null + }, + "SQL_WVARCHAR": { + "ext.name": "odbc", + "ext.min": "5.4.32RC1", + "ext.max": null, + "php.min": "5.4.32RC1", + "php.max": null + }, + "SSH2_DEFAULT_TERMINAL": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_DEFAULT_TERM_HEIGHT": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_DEFAULT_TERM_UNIT": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_DEFAULT_TERM_WIDTH": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_FINGERPRINT_HEX": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_FINGERPRINT_MD5": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_FINGERPRINT_RAW": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_FINGERPRINT_SHA1": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_POLLERR": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_POLLEXT": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_POLLHUP": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_POLLIN": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_POLLNVAL": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_POLLOUT": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_POLL_CHANNEL_CLOSED": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_POLL_LISTENER_CLOSED": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_POLL_SESSION_CLOSED": { + "ext.name": "ssh2", + "ext.min": "0.8", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_STREAM_STDERR": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_STREAM_STDIO": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_TERM_UNIT_CHARS": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SSH2_TERM_UNIT_PIXELS": { + "ext.name": "ssh2", + "ext.min": "0.5", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STDERR": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "STDIN": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "STDOUT": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "STREAM_BUFFER_FULL": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "STREAM_BUFFER_LINE": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "STREAM_BUFFER_NONE": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "STREAM_CAST_AS_STREAM": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "STREAM_CAST_FOR_SELECT": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "STREAM_CLIENT_ASYNC_CONNECT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CLIENT_CONNECT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CLIENT_PERSISTENT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_ANY_CLIENT": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_ANY_SERVER": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_SSLv23_CLIENT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_SSLv23_SERVER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_SSLv2_CLIENT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_SSLv2_SERVER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_SSLv3_CLIENT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_SSLv3_SERVER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_TLS_CLIENT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_TLS_SERVER": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_TLSv1_0_SERVER": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_TLSv1_1_SERVER": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "STREAM_CRYPTO_METHOD_TLSv1_2_SERVER": { + "ext.name": "standard", + "ext.min": "5.6.0alpha3", + "ext.max": null, + "php.min": "5.6.0alpha3", + "php.max": null + }, + "STREAM_ENFORCE_SAFE_MODE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": "5.3.29" + }, + "STREAM_FILTER_ALL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_FILTER_READ": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_FILTER_WRITE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_IGNORE_URL": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_IPPROTO_ICMP": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "STREAM_IPPROTO_IP": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_IPPROTO_RAW": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "STREAM_IPPROTO_TCP": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "STREAM_IPPROTO_UDP": { + "ext.name": "standard", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "STREAM_IS_URL": { + "ext.name": "standard", + "ext.min": "5.2.4", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "STREAM_META_ACCESS": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "STREAM_META_GROUP": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "STREAM_META_GROUP_NAME": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "STREAM_META_OWNER": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "STREAM_META_OWNER_NAME": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "STREAM_META_TOUCH": { + "ext.name": "standard", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "STREAM_MKDIR_RECURSIVE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_MUST_SEEK": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_AUTH_REQUIRED": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_AUTH_RESULT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_COMPLETED": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_CONNECT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_FAILURE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_FILE_SIZE_IS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_MIME_TYPE_IS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_PROGRESS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_REDIRECTED": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_RESOLVE": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_SEVERITY_ERR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_SEVERITY_INFO": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_NOTIFY_SEVERITY_WARN": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_OOB": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_OPTION_BLOCKING": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "STREAM_OPTION_READ_BUFFER": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "STREAM_OPTION_READ_TIMEOUT": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "STREAM_OPTION_WRITE_BUFFER": { + "ext.name": "standard", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "STREAM_PEEK": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_PF_INET": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_PF_INET6": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_PF_UNIX": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_REPORT_ERRORS": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SERVER_BIND": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SERVER_LISTEN": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SHUT_RD": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SHUT_RDWR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SHUT_WR": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SOCK_DGRAM": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SOCK_RAW": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SOCK_RDM": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SOCK_SEQPACKET": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_SOCK_STREAM": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_URL_STAT_LINK": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_URL_STAT_QUIET": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STREAM_USE_PATH": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STR_PAD_BOTH": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STR_PAD_LEFT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "STR_PAD_RIGHT": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ST_SET": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ST_SILENT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ST_UID": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SUNFUNCS_RET_DOUBLE": { + "ext.name": "date", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "SUNFUNCS_RET_STRING": { + "ext.name": "date", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "SUNFUNCS_RET_TIMESTAMP": { + "ext.name": "date", + "ext.min": "5.1.2", + "ext.max": null, + "php.min": "5.1.2", + "php.max": null + }, + "SVN_ALL": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_CONFIG": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_CONFIG_DIR": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_DEFAULT_PASSWORD": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_DEFAULT_USERNAME": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_DONT_STORE_PASSWORDS": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_NON_INTERACTIVE": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_NO_AUTH_CACHE": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_SERVER_GROUP": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_SSL_SERVER_CERT_INFO": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_AUTH_PARAM_SSL_SERVER_FAILURES": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_DISCOVER_CHANGED_PATHS": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_FS_CONFIG_FS_TYPE": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_FS_TYPE_BDB": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_FS_TYPE_FSFS": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_NODE_DIR": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_NODE_FILE": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_NODE_NONE": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_NODE_UNKNOWN": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_NON_RECURSIVE": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_NO_IGNORE": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_OMIT_MESSAGES": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_PROP_REVISION_AUTHOR": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_PROP_REVISION_DATE": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_PROP_REVISION_LOG": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_PROP_REVISION_ORIG_DATE": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_REVISION_BASE": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_REVISION_COMMITTED": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_REVISION_HEAD": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_REVISION_INITIAL": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_REVISION_PREV": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_REVISION_UNSPECIFIED": { + "ext.name": "svn", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_SHOW_UPDATES": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_STOP_ON_COPY": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_SCHEDULE_ADD": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_SCHEDULE_DELETE": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_SCHEDULE_NORMAL": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_SCHEDULE_REPLACE": { + "ext.name": "svn", + "ext.min": "0.3", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_ADDED": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_CONFLICTED": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_DELETED": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_EXTERNAL": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_IGNORED": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_INCOMPLETE": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_MERGED": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_MISSING": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_MODIFIED": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_NONE": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_NORMAL": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_OBSTRUCTED": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_REPLACED": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "SVN_WC_STATUS_UNVERSIONED": { + "ext.name": "svn", + "ext.min": "0.1", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TCP_NODELAY": { + "ext.name": "sockets", + "ext.min": "5.2.7", + "ext.max": null, + "php.min": "5.2.7", + "php.max": null + }, + "THOUSEP": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "TIDY_NODETYPE_ASP": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_CDATA": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_COMMENT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_DOCTYPE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_END": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_JSTE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_PHP": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_PROCINS": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_ROOT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_SECTION": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_START": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_STARTEND": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_TEXT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_NODETYPE_XMLDECL": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_A": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_ABBR": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_ACRONYM": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_ADDRESS": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_ALIGN": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_APPLET": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_AREA": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_B": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BASE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BASEFONT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BDO": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BGSOUND": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BIG": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BLINK": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BLOCKQUOTE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BODY": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BR": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_BUTTON": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_CAPTION": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_CENTER": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_CITE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_CODE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_COL": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_COLGROUP": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_COMMENT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_DD": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_DEL": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_DFN": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_DIR": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_DIV": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_DL": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_DT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_EM": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_EMBED": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_FIELDSET": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_FONT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_FORM": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_FRAME": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_FRAMESET": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_H1": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_H2": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_H3": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_H4": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_H5": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_H6": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_HEAD": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_HR": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_HTML": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_I": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_IFRAME": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_ILAYER": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_IMG": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_INPUT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_INS": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_ISINDEX": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_KBD": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_KEYGEN": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_LABEL": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_LAYER": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_LEGEND": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_LI": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_LINK": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_LISTING": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_MAP": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_MARQUEE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_MENU": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_META": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_MULTICOL": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_NOBR": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_NOEMBED": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_NOFRAMES": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_NOLAYER": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_NOSAVE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_NOSCRIPT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_OBJECT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_OL": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_OPTGROUP": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_OPTION": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_P": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_PARAM": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_PLAINTEXT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_PRE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_Q": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_RB": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_RBC": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_RP": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_RT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_RTC": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_RUBY": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_S": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SAMP": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SCRIPT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SELECT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SERVER": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SERVLET": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SMALL": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SPACER": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SPAN": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_STRIKE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_STRONG": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_STYLE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SUB": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_SUP": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_TABLE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_TBODY": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_TD": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_TEXTAREA": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_TFOOT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_TH": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_THEAD": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_TITLE": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_TR": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_TT": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_U": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_UL": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_UNKNOWN": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_VAR": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_WBR": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TIDY_TAG_XMP": { + "ext.name": "tidy", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "TRAP_BRKPT": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "TRAP_TRACE": { + "ext.name": "pcntl", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "TRUE": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TYPEAPPLICATION": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TYPEAUDIO": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TYPEIMAGE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TYPEMESSAGE": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TYPEMODEL": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TYPEMULTIPART": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TYPEOTHER": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TYPETEXT": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "TYPEVIDEO": { + "ext.name": "imap", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "T_ABSTRACT": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_AND_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ARRAY": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ARRAY_CAST": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_AS": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_BAD_CHARACTER": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_BOOLEAN_AND": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_BOOLEAN_OR": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_BOOL_CAST": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_BREAK": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_CALLABLE": { + "ext.name": "tokenizer", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "T_CASE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_CATCH": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_CHARACTER": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_CLASS": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_CLASS_C": { + "ext.name": "tokenizer", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "T_CLONE": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_CLOSE_TAG": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_COMMENT": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_CONCAT_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_CONST": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_CONSTANT_ENCAPSED_STRING": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_CONTINUE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_CURLY_OPEN": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DEC": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DECLARE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DEFAULT": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DIR": { + "ext.name": "tokenizer", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "T_DIV_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DNUMBER": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DO": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DOC_COMMENT": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DOLLAR_OPEN_CURLY_BRACES": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DOUBLE_ARROW": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DOUBLE_CAST": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_DOUBLE_COLON": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ECHO": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ELLIPSIS": { + "ext.name": "tokenizer", + "ext.min": "5.6.0alpha1", + "ext.max": null, + "php.min": "5.6.0alpha1", + "php.max": null + }, + "T_ELSE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ELSEIF": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_EMPTY": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ENCAPSED_AND_WHITESPACE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ENDDECLARE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ENDFOR": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ENDFOREACH": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ENDIF": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ENDSWITCH": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ENDWHILE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_END_HEREDOC": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_EVAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_EXIT": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_EXTENDS": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_FILE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_FINAL": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_FINALLY": { + "ext.name": "tokenizer", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "T_FMT": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "T_FMT_AMPM": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "T_FOR": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_FOREACH": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_FUNCTION": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_FUNC_C": { + "ext.name": "tokenizer", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "T_GLOBAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_GOTO": { + "ext.name": "tokenizer", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "T_HALT_COMPILER": { + "ext.name": "tokenizer", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "T_IF": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_IMPLEMENTS": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_INC": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_INCLUDE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_INCLUDE_ONCE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_INLINE_HTML": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_INSTANCEOF": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_INSTEADOF": { + "ext.name": "tokenizer", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "T_INTERFACE": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_INT_CAST": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ISSET": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_IS_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_IS_GREATER_OR_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_IS_IDENTICAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_IS_NOT_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_IS_NOT_IDENTICAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_IS_SMALLER_OR_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_LINE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_LIST": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_LNUMBER": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_LOGICAL_AND": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_LOGICAL_OR": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_LOGICAL_XOR": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_METHOD_C": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_MINUS_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_ML_COMMENT": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": "4.4.9" + }, + "T_MOD_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_MUL_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_NAMESPACE": { + "ext.name": "tokenizer", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "T_NEW": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_NS_C": { + "ext.name": "tokenizer", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "T_NS_SEPARATOR": { + "ext.name": "tokenizer", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "T_NUM_STRING": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_OBJECT_CAST": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_OBJECT_OPERATOR": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_OLD_FUNCTION": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": "4.4.9" + }, + "T_OPEN_TAG": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_OPEN_TAG_WITH_ECHO": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_OR_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_PAAMAYIM_NEKUDOTAYIM": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_PLUS_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_POW": { + "ext.name": "tokenizer", + "ext.min": "5.6.0RC1", + "ext.max": null, + "php.min": "5.6.0RC1", + "php.max": null + }, + "T_POW_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "5.6.0RC1", + "ext.max": null, + "php.min": "5.6.0RC1", + "php.max": null + }, + "T_PRINT": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_PRIVATE": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_PROTECTED": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_PUBLIC": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_REQUIRE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_REQUIRE_ONCE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_RETURN": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_SL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_SL_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_SR": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_SR_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_START_HEREDOC": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_STATIC": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_STRING": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_STRING_CAST": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_STRING_VARNAME": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_SWITCH": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_THROW": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_TRAIT": { + "ext.name": "tokenizer", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "T_TRAIT_C": { + "ext.name": "tokenizer", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "T_TRY": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_UNSET": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_UNSET_CAST": { + "ext.name": "tokenizer", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "T_USE": { + "ext.name": "tokenizer", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "T_VAR": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_VARIABLE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_WHILE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_WHITESPACE": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_XOR_EQUAL": { + "ext.name": "tokenizer", + "ext.min": "4.2.0", + "ext.max": null, + "php.min": "4.2.0", + "php.max": null + }, + "T_YIELD": { + "ext.name": "tokenizer", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "ULOC_ACTUAL_LOCALE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ULOC_VALID_LOCALE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "UNKNOWN_TYPE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "UPLOAD_ERR_CANT_WRITE": { + "ext.name": "Core", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "UPLOAD_ERR_EXTENSION": { + "ext.name": "Core", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "UPLOAD_ERR_FORM_SIZE": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "UPLOAD_ERR_INI_SIZE": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "UPLOAD_ERR_NO_FILE": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "UPLOAD_ERR_NO_TMP_DIR": { + "ext.name": "Core", + "ext.min": "4.3.10", + "ext.max": null, + "php.min": "4.3.10", + "php.max": null + }, + "UPLOAD_ERR_OK": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "UPLOAD_ERR_PARTIAL": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "U_AMBIGUOUS_ALIAS_WARNING": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BAD_VARIABLE_DEFINITION": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_ASSIGN_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_ERROR_LIMIT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_ERROR_START": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_HEX_DIGITS_EXPECTED": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_INIT_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_INTERNAL_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_MALFORMED_RULE_TAG": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_MISMATCHED_PAREN": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_NEW_LINE_IN_QUOTED_STRING": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_RULE_EMPTY_SET": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_RULE_SYNTAX": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_SEMICOLON_EXPECTED": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_UNCLOSED_SET": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_UNDEFINED_VARIABLE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_UNRECOGNIZED_OPTION": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BRK_VARIABLE_REDFINITION": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_BUFFER_OVERFLOW_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_CE_NOT_FOUND_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_COLLATOR_VERSION_MISMATCH": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_DIFFERENT_UCA_VERSION": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ENUM_OUT_OF_SYNC_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ERROR_LIMIT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ERROR_WARNING_LIMIT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ERROR_WARNING_START": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_FILE_ACCESS_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_FMT_PARSE_ERROR_LIMIT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_FMT_PARSE_ERROR_START": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_ACE_PREFIX_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_CHECK_BIDI_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "U_IDNA_ERROR_LIMIT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_ERROR_START": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_LABEL_TOO_LONG_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_PROHIBITED_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_STD3_ASCII_RULES_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_UNASSIGNED_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_VERIFICATION_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_IDNA_ZERO_LENGTH_LABEL_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ILLEGAL_ARGUMENT_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ILLEGAL_CHARACTER": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ILLEGAL_CHAR_FOUND": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ILLEGAL_CHAR_IN_SEGMENT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ILLEGAL_ESCAPE_SEQUENCE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ILLEGAL_PAD_POSITION": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INDEX_OUTOFBOUNDS_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INTERNAL_PROGRAM_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INTERNAL_TRANSLITERATOR_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVALID_CHAR_FOUND": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVALID_FORMAT_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVALID_FUNCTION": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVALID_ID": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVALID_PROPERTY_PATTERN": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVALID_RBT_SYNTAX": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVALID_STATE_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVALID_TABLE_FILE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVALID_TABLE_FORMAT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_INVARIANT_CONVERSION_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MALFORMED_EXPONENTIAL_PATTERN": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MALFORMED_PRAGMA": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MALFORMED_RULE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MALFORMED_SET": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MALFORMED_SYMBOL_REFERENCE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MALFORMED_UNICODE_ESCAPE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MALFORMED_VARIABLE_DEFINITION": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MALFORMED_VARIABLE_REFERENCE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MEMORY_ALLOCATION_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MESSAGE_PARSE_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MISMATCHED_SEGMENT_DELIMITERS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MISPLACED_ANCHOR_START": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MISPLACED_COMPOUND_FILTER": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MISPLACED_CURSOR_OFFSET": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MISPLACED_QUANTIFIER": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MISSING_OPERATOR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MISSING_RESOURCE_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MISSING_SEGMENT_CLOSE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_ANTE_CONTEXTS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_COMPOUND_FILTERS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_CURSORS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_DECIMAL_SEPARATORS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_DECIMAL_SEPERATORS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_EXPONENTIAL_SYMBOLS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_PAD_SPECIFIERS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_PERCENT_SYMBOLS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_PERMILL_SYMBOLS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_MULTIPLE_POST_CONTEXTS": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_NO_SPACE_AVAILABLE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_NO_WRITE_PERMISSION": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_PARSE_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_PARSE_ERROR_LIMIT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_PARSE_ERROR_START": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_PATTERN_SYNTAX_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_PRIMARY_TOO_LONG_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_BAD_ESCAPE_SEQUENCE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_BAD_INTERVAL": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_ERROR_LIMIT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_ERROR_START": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_INTERNAL_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_INVALID_BACK_REF": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_INVALID_FLAG": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_INVALID_STATE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_LOOK_BEHIND_LIMIT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_MAX_LT_MIN": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_MISMATCHED_PAREN": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_NUMBER_TOO_BIG": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_PROPERTY_SYNTAX": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_RULE_SYNTAX": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_SET_CONTAINS_STRING": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_REGEX_UNIMPLEMENTED": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_RESOURCE_TYPE_MISMATCH": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_RULE_MASK_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_SAFECLONE_ALLOCATED_WARNING": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_SORT_KEY_TOO_SHORT_WARNING": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_STANDARD_ERROR_LIMIT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_STATE_OLD_WARNING": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_STATE_TOO_OLD_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_STRINGPREP_CHECK_BIDI_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_STRINGPREP_PROHIBITED_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_STRINGPREP_UNASSIGNED_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_STRING_NOT_TERMINATED_WARNING": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_TOO_MANY_ALIASES_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_TRAILING_BACKSLASH": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_TRUNCATED_CHAR_FOUND": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNCLOSED_SEGMENT": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNDEFINED_SEGMENT_REFERENCE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNDEFINED_VARIABLE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNEXPECTED_TOKEN": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNMATCHED_BRACES": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNQUOTED_SPECIAL": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNSUPPORTED_ATTRIBUTE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNSUPPORTED_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNSUPPORTED_ESCAPE_SEQUENCE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNSUPPORTED_PROPERTY": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_UNTERMINATED_QUOTE": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_USELESS_COLLATOR_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_USING_DEFAULT_WARNING": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_USING_FALLBACK_WARNING": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_VARIABLE_RANGE_EXHAUSTED": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_VARIABLE_RANGE_OVERLAP": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "U_ZERO_ERROR": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "VARNISH_COMPAT_2": { + "ext.name": "varnish", + "ext.min": "0.9.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_COMPAT_3": { + "ext.name": "varnish", + "ext.min": "0.9.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_CONFIG_COMPAT": { + "ext.name": "varnish", + "ext.min": "0.9.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_CONFIG_HOST": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_CONFIG_IDENT": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_CONFIG_PORT": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_CONFIG_SECRET": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_CONFIG_TIMEOUT": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_AUTH": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_CANT": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_CLOSE": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_COMMS": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_OK": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_PARAM": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_SYNTAX": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_TOOFEW": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_TOOMANY": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_UNIMPL": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "VARNISH_STATUS_UNKNOWN": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "WNOHANG": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "WSDL_CACHE_BOTH": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "WSDL_CACHE_DISK": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "WSDL_CACHE_MEMORY": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "WSDL_CACHE_NONE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "WUNTRACED": { + "ext.name": "pcntl", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "X509_PURPOSE_ANY": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "X509_PURPOSE_CRL_SIGN": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "X509_PURPOSE_NS_SSL_SERVER": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "X509_PURPOSE_SMIME_ENCRYPT": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "X509_PURPOSE_SMIME_SIGN": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "X509_PURPOSE_SSL_CLIENT": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "X509_PURPOSE_SSL_SERVER": { + "ext.name": "openssl", + "ext.min": "4.0.4", + "ext.max": null, + "php.min": "4.0.4", + "php.max": null + }, + "XCACHE_MODULES": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XCACHE_VERSION": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ADD": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ADD_ARRAY_ELEMENT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ADD_CHAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ADD_INTERFACE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ADD_STRING": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ADD_TRAIT": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "XC_ADD_VAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_ADD": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_BW_AND": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_BW_OR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_BW_XOR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_CONCAT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_DIM": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_DIV": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_MOD": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_MUL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_OBJ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_POW": { + "ext.name": "XCache", + "ext.min": "3.2.0", + "ext.max": null, + "php.min": "5.6.0", + "php.max": null + }, + "XC_ASSIGN_REF": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_SL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_SR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ASSIGN_SUB": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_BEGIN_SILENCE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_BIND_TRAITS": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "XC_BOOL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_BOOL_NOT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_BOOL_XOR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_BRK": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_BW_AND": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_BW_NOT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_BW_OR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_BW_XOR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_CASE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_CAST": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_CATCH": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_CLONE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_CONCAT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_CONT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_DECLARE_CLASS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_DECLARE_CONST": { + "ext.name": "XCache", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XC_DECLARE_FUNCTION": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_DECLARE_INHERITED_CLASS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_DECLARE_INHERITED_CLASS_DELAYED": { + "ext.name": "XCache", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XC_DECLARE_LAMBDA_FUNCTION": { + "ext.name": "XCache", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XC_DISCARD_EXCEPTION": { + "ext.name": "XCache", + "ext.min": "3.1.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "XC_DIV": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_DO_FCALL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_DO_FCALL_BY_NAME": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ECHO": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_END_SILENCE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_EXIT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_EXT_FCALL_BEGIN": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_EXT_FCALL_END": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_EXT_NOP": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_EXT_STMT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FAST_CALL": { + "ext.name": "XCache", + "ext.min": "3.1.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "XC_FAST_RET": { + "ext.name": "XCache", + "ext.min": "3.1.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "XC_FETCH_CLASS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_CONSTANT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_DIM_FUNC_ARG": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_DIM_IS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_DIM_R": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_DIM_RW": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_DIM_TMP_VAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_DIM_UNSET": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_DIM_W": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_FUNC_ARG": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_IS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_OBJ_FUNC_ARG": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_OBJ_IS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_OBJ_R": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_OBJ_RW": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_OBJ_UNSET": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_OBJ_W": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_R": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_RW": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_UNSET": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FETCH_W": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FE_FETCH": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FE_RESET": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_FREE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_GENERATOR_RETURN": { + "ext.name": "XCache", + "ext.min": "3.1.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "XC_GOTO": { + "ext.name": "XCache", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XC_HANDLE_EXCEPTION": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_INCLUDE_OR_EVAL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_INIT_ARRAY": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_INIT_FCALL_BY_NAME": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_INIT_METHOD_CALL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_INIT_NS_FCALL_BY_NAME": { + "ext.name": "XCache", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XC_INIT_STATIC_METHOD_CALL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_INIT_STRING": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_INSTANCEOF": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ISSET_ISEMPTY_DIM_OBJ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ISSET_ISEMPTY_PROP_OBJ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_ISSET_ISEMPTY_VAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_ARRAY": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_BOOL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_CONST": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_CONSTANT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_CONSTANT_ARRAY": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_CV": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_DOUBLE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_EQUAL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_IDENTICAL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_LONG": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_NOT_EQUAL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_NOT_IDENTICAL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_NULL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_OBJECT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_RESOURCE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_SMALLER": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_SMALLER_OR_EQUAL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_STRING": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_TMP_VAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_UNICODE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_UNUSED": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_IS_VAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_JMP": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_JMPNZ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_JMPNZ_EX": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_JMPZ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_JMPZNZ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_JMPZ_EX": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_JMP_SET": { + "ext.name": "XCache", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "XC_JMP_SET_VAR": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "XC_MOD": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_MUL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_NEW": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_NOP": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_NULL?": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_ARG": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_ASSIGN": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_BIT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_BRK": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_CAST": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_CLASS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_CONT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_DECLARE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_FCALL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_FCLASS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_FE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_FETCH": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_IFACE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_INCLUDE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_INIT_FCALL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_ISSET": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_JMPADDR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_OPLINE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_SEND": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_SEND_NOREF": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_STD": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_TMP": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_UCLASS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_UNUSED": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OPSPEC_VAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_OP_DATA": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_POST_DEC": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_POST_DEC_OBJ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_POST_INC": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_POST_INC_OBJ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_POW": { + "ext.name": "XCache", + "ext.min": "3.2.0", + "ext.max": null, + "php.min": "5.6.0", + "php.max": null + }, + "XC_PRE_DEC": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_PRE_DEC_OBJ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_PRE_INC": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_PRE_INC_OBJ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_PRINT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_QM_ASSIGN": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_QM_ASSIGN_VAR": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "XC_RAISE_ABSTRACT_ERROR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_RECV": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_RECV_INIT": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_RECV_VARIADIC": { + "ext.name": "XCache", + "ext.min": "3.2.0", + "ext.max": null, + "php.min": "5.6.0", + "php.max": null + }, + "XC_RETURN": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_RETURN_BY_REF": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "XC_SEND_REF": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_SEND_UNPACK": { + "ext.name": "XCache", + "ext.min": "3.2.0", + "ext.max": null, + "php.min": "5.6.0", + "php.max": null + }, + "XC_SEND_VAL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_SEND_VAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_SEND_VAR_NO_REF": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_SEPARATE": { + "ext.name": "XCache", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "XC_SIZEOF_TEMP_VARIABLE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_SL": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_SR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_SUB": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_SWITCH_FREE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_THROW": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_TICKS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_TYPE_PHP": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_TYPE_VAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_UNDEF": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_UNSET_DIM": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_UNSET_OBJ": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_UNSET_VAR": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_USER_OPCODE": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_VERIFY_ABSTRACT_CLASS": { + "ext.name": "XCache", + "ext.min": "1.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XC_YIELD": { + "ext.name": "XCache", + "ext.min": "3.1.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "XDEBUG_CC_BRANCH_CHECK": { + "ext.name": "xdebug", + "ext.min": "2.3.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "XDEBUG_CC_DEAD_CODE": { + "ext.name": "xdebug", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XDEBUG_CC_UNUSED": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta2", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XDEBUG_STACK_NO_DESC": { + "ext.name": "xdebug", + "ext.min": "2.3.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "XDEBUG_TRACE_APPEND": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XDEBUG_TRACE_COMPUTERIZED": { + "ext.name": "xdebug", + "ext.min": "2.0.0beta1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XDEBUG_TRACE_HTML": { + "ext.name": "xdebug", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "XDEBUG_TRACE_NAKED_FILENAME": { + "ext.name": "xdebug", + "ext.min": "2.3.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "XHPROF_FLAGS_CPU": { + "ext.name": "xhprof", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "XHPROF_FLAGS_MEMORY": { + "ext.name": "xhprof", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "XHPROF_FLAGS_NO_BUILTINS": { + "ext.name": "xhprof", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "XML_ATTRIBUTE_CDATA": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_DECL_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_ENTITY": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_ENUMERATION": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_ID": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_IDREF": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_IDREFS": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_NMTOKEN": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_NMTOKENS": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ATTRIBUTE_NOTATION": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_CDATA_SECTION_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_COMMENT_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_DOCUMENT_FRAG_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_DOCUMENT_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_DOCUMENT_TYPE_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_DTD_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ELEMENT_DECL_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ELEMENT_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ENTITY_DECL_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ENTITY_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ENTITY_REF_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_ERROR_ASYNC_ENTITY": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_BAD_CHAR_REF": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_BINARY_ENTITY_REF": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_DUPLICATE_ATTRIBUTE": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_EXTERNAL_ENTITY_HANDLING": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_INCORRECT_ENCODING": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_INVALID_TOKEN": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_JUNK_AFTER_DOC_ELEMENT": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_MISPLACED_XML_PI": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_NONE": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_NO_ELEMENTS": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_NO_MEMORY": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_PARAM_ENTITY_REF": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_PARTIAL_CHAR": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_RECURSIVE_ENTITY_REF": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_SYNTAX": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_TAG_MISMATCH": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_UNCLOSED_CDATA_SECTION": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_UNCLOSED_TOKEN": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_UNDEFINED_ENTITY": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_ERROR_UNKNOWN_ENCODING": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_HTML_DOCUMENT_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_LOCAL_NAMESPACE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_NAMESPACE_DECL_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_NOTATION_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_OPTION_CASE_FOLDING": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_OPTION_SKIP_TAGSTART": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_OPTION_SKIP_WHITE": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_OPTION_TARGET_ENCODING": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_PI_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XML_SAX_IMPL": { + "ext.name": "xml", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "XML_TEXT_NODE": { + "ext.name": "dom", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_1999_NAMESPACE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_1999_TIMEINSTANT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_ANYTYPE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_ANYURI": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_ANYXML": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_BASE64BINARY": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_BOOLEAN": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_BYTE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_DATE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_DATETIME": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_DECIMAL": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_DOUBLE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_DURATION": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_ENTITIES": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_ENTITY": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_FLOAT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_GDAY": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_GMONTH": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_GMONTHDAY": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_GYEAR": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_GYEARMONTH": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_HEXBINARY": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_ID": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_IDREF": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_IDREFS": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_INT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_INTEGER": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_LANGUAGE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_LONG": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NAME": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NAMESPACE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NCNAME": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NEGATIVEINTEGER": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NMTOKEN": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NMTOKENS": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NONNEGATIVEINTEGER": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NONPOSITIVEINTEGER": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NORMALIZEDSTRING": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_NOTATION": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_POSITIVEINTEGER": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_QNAME": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_SHORT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_STRING": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_TIME": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_TOKEN": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_UNSIGNEDBYTE": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_UNSIGNEDINT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_UNSIGNEDLONG": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSD_UNSIGNEDSHORT": { + "ext.name": "soap", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSL_CLONE_ALWAYS": { + "ext.name": "xsl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSL_CLONE_AUTO": { + "ext.name": "xsl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSL_CLONE_NEVER": { + "ext.name": "xsl", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "XSL_SECPREF_CREATE_DIRECTORY": { + "ext.name": "xsl", + "ext.min": "5.3.9", + "ext.max": null, + "php.min": "5.3.9", + "php.max": null + }, + "XSL_SECPREF_DEFAULT": { + "ext.name": "xsl", + "ext.min": "5.3.9", + "ext.max": null, + "php.min": "5.3.9", + "php.max": null + }, + "XSL_SECPREF_NONE": { + "ext.name": "xsl", + "ext.min": "5.3.9", + "ext.max": null, + "php.min": "5.3.9", + "php.max": null + }, + "XSL_SECPREF_READ_FILE": { + "ext.name": "xsl", + "ext.min": "5.3.9", + "ext.max": null, + "php.min": "5.3.9", + "php.max": null + }, + "XSL_SECPREF_READ_NETWORK": { + "ext.name": "xsl", + "ext.min": "5.3.9", + "ext.max": null, + "php.min": "5.3.9", + "php.max": null + }, + "XSL_SECPREF_WRITE_FILE": { + "ext.name": "xsl", + "ext.min": "5.3.9", + "ext.max": null, + "php.min": "5.3.9", + "php.max": null + }, + "XSL_SECPREF_WRITE_NETWORK": { + "ext.name": "xsl", + "ext.min": "5.3.9", + "ext.max": null, + "php.min": "5.3.9", + "php.max": null + }, + "YAC_MAX_KEY_LEN": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAC_MAX_RAW_COMPRESSED_LEN": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAC_MAX_VALUE_RAW_LEN": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAC_SERIALIZER": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAC_VERSION": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_ANY_BREAK": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_ANY_ENCODING": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_ANY_SCALAR_STYLE": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_BINARY_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_BOOL_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_CRLN_BREAK": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_CR_BREAK": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_DOUBLE_QUOTED_SCALAR_STYLE": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_FLOAT_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_FOLDED_SCALAR_STYLE": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_INT_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_LITERAL_SCALAR_STYLE": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_LN_BREAK": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_MAP_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_MERGE_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_NULL_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_PHP_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_PLAIN_SCALAR_STYLE": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_SEQ_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_SINGLE_QUOTED_SCALAR_STYLE": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_STR_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_TIMESTAMP_TAG": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_UTF16BE_ENCODING": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_UTF16LE_ENCODING": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YAML_UTF8_ENCODING": { + "ext.name": "yaml", + "ext.min": "0.6.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "YESEXPR": { + "ext.name": "standard", + "ext.min": "4.1.0", + "ext.max": null, + "php.min": "4.1.0", + "php.max": null + }, + "ZEND_ACC_ABSTRACT": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_CLASS": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_FETCH": { + "ext.name": "uopz", + "ext.min": "2.0.2", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_FINAL": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_INTERFACE": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_PPP_MASK": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_PRIVATE": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_PROTECTED": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_PUBLIC": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_STATIC": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ACC_TRAIT": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ADD_INTERFACE": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_ADD_TRAIT": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_DEBUG_BUILD": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ZEND_EXIT": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_FETCH_CLASS": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_INSTANCEOF": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_MULTIBYTE": { + "ext.name": "Core", + "ext.min": "5.3.4", + "ext.max": null, + "php.min": "5.3.4", + "php.max": "5.3.29" + }, + "ZEND_NEW": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_THREAD_SAFE": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "ZEND_THROW": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_USER_OPCODE_CONTINUE": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_USER_OPCODE_DISPATCH": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_USER_OPCODE_DISPATCH_TO": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_USER_OPCODE_ENTER": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_USER_OPCODE_LEAVE": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZEND_USER_OPCODE_RETURN": { + "ext.name": "uopz", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZLIB_ENCODING_DEFLATE": { + "ext.name": "zlib", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZLIB_ENCODING_GZIP": { + "ext.name": "zlib", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "ZLIB_ENCODING_RAW": { + "ext.name": "zlib", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "__CLASS__": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "__COMPILER_HALT_OFFSET__": { + "ext.name": "Core", + "ext.min": "5.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "__DIR__": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__FILE__": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "__FUNCTION__": { + "ext.name": "Core", + "ext.min": "4.3.0", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "__LINE__": { + "ext.name": "Core", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "__METHOD__": { + "ext.name": "Core", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__NAMESPACE__": { + "ext.name": "Core", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__TRAIT__": { + "ext.name": "Core", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "http\\Client\\Curl\\AUTH_ANY": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\AUTH_BASIC": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\AUTH_DIGEST": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\AUTH_DIGEST_IE": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\AUTH_GSSNEG": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\AUTH_NTLM": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\AUTH_SPNEGO": { + "ext.name": "http", + "ext.min": "2.1.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\HTTP_VERSION_1_0": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\HTTP_VERSION_1_1": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\HTTP_VERSION_2_0": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\HTTP_VERSION_ANY": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\IPRESOLVE_ANY": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\IPRESOLVE_V4": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\IPRESOLVE_V6": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\POSTREDIR_301": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\POSTREDIR_302": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\POSTREDIR_303": { + "ext.name": "http", + "ext.min": "2.1.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\POSTREDIR_ALL": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\PROXY_HTTP": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\PROXY_HTTP_1_0": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\PROXY_SOCKS4": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\PROXY_SOCKS4A": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\PROXY_SOCKS5": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\PROXY_SOCKS5_HOSTNAME": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\SSL_VERSION_ANY": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\SSL_VERSION_SSLv2": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\SSL_VERSION_SSLv3": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\SSL_VERSION_TLSv1": { + "ext.name": "http", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\SSL_VERSION_TLSv1_0": { + "ext.name": "http", + "ext.min": "2.1.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\SSL_VERSION_TLSv1_1": { + "ext.name": "http", + "ext.min": "2.1.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "http\\Client\\Curl\\SSL_VERSION_TLSv1_2": { + "ext.name": "http", + "ext.min": "2.1.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "methods": { + "AMQPChannel": { + "__construct": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "commitTransaction": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getChannelId": { + "ext.name": "amqp", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getConnection": { + "ext.name": "amqp", + "ext.min": "1.4.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPrefetchCount": { + "ext.name": "amqp", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPrefetchSize": { + "ext.name": "amqp", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "isConnected": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "qos": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rollbackTransaction": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setPrefetchCount": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setPrefetchSize": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "startTransaction": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "AMQPChannelException": { + "__construct": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__toString": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getCode": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFile": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLine": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMessage": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPrevious": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTrace": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTraceAsString": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "AMQPConnection": { + "__construct": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "connect": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "disconnect": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getHost": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLogin": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPassword": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPort": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getReadTimeout": { + "ext.name": "amqp", + "ext.min": "1.0.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTimeout": { + "ext.name": "amqp", + "ext.min": "1.0.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getVhost": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getWriteTimeout": { + "ext.name": "amqp", + "ext.min": "1.0.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "isConnected": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pconnect": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pdisconnect": { + "ext.name": "amqp", + "ext.min": "1.0.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "reconnect": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setHost": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setLogin": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setPassword": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setPort": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setReadTimeout": { + "ext.name": "amqp", + "ext.min": "1.0.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setTimeout": { + "ext.name": "amqp", + "ext.min": "1.0.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setVhost": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setWriteTimeout": { + "ext.name": "amqp", + "ext.min": "1.0.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "AMQPConnectionException": { + "__construct": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__toString": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getCode": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFile": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLine": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMessage": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPrevious": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTrace": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTraceAsString": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "AMQPEnvelope": { + "__construct": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getAppId": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getBody": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getContentEncoding": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getContentType": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getCorrelationId": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDeliveryMode": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDeliveryTag": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getExchangeName": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getExpiration": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getHeader": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getHeaders": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMessageId": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPriority": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getReplyTo": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getRoutingKey": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTimestamp": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getType": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getUserId": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "isRedelivery": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "AMQPException": { + "__construct": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__toString": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getCode": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFile": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLine": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMessage": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPrevious": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTrace": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTraceAsString": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "AMQPExchange": { + "__construct": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "bind": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "declare": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "declareExchange": { + "ext.name": "amqp", + "ext.min": "1.0.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getArgument": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getArguments": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getChannel": { + "ext.name": "amqp", + "ext.min": "1.4.0beta2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getConnection": { + "ext.name": "amqp", + "ext.min": "1.4.0beta2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFlags": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getName": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getType": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "publish": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setArgument": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setArguments": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setFlags": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setName": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setType": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "AMQPExchangeException": { + "__construct": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__toString": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getCode": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFile": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLine": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMessage": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPrevious": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTrace": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTraceAsString": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "AMQPQueue": { + "__construct": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ack": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "bind": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "cancel": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "consume": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "declare": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "declareQueue": { + "ext.name": "amqp", + "ext.min": "1.0.10", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getArgument": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getArguments": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getChannel": { + "ext.name": "amqp", + "ext.min": "1.4.0beta1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getConnection": { + "ext.name": "amqp", + "ext.min": "1.4.0beta2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFlags": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getName": { + "ext.name": "amqp", + "ext.min": "0.3.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "nack": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "purge": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "reject": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setArgument": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setArguments": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setFlags": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setName": { + "ext.name": "amqp", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "unbind": { + "ext.name": "amqp", + "ext.min": "0.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "AMQPQueueException": { + "__construct": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__toString": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getCode": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFile": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLine": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMessage": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPrevious": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTrace": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTraceAsString": { + "ext.name": "amqp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "DateInterval": { + "__construct": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__set_state": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__wakeup": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "createFromDateString": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "format": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "DatePeriod": { + "__construct": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__set_state": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__wakeup": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getDateInterval": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.6.5RC1", + "php.max": null + }, + "getEndDate": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.6.5RC1", + "php.max": null + }, + "getStartDate": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.6.5RC1", + "php.max": null + } + }, + "DateTime": { + "__construct": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__set_state": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__wakeup": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": "5.4.37" + }, + "add": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "createFromFormat": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "createFromImmutable": { + "ext.name": "date", + "ext.min": "5.6.8RC1", + "ext.max": null, + "php.min": "5.6.8RC1", + "php.max": null + }, + "diff": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": "5.4.37" + }, + "format": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": "5.4.37" + }, + "getLastErrors": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getOffset": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": "5.4.37" + }, + "getTimestamp": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": "5.4.37" + }, + "getTimezone": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": "5.4.37" + }, + "modify": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setDate": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setISODate": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setTime": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setTimestamp": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setTimezone": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sub": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "DateTimeImmutable": { + "__construct": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "__set_state": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "add": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createFromFormat": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createFromMutable": { + "ext.name": "date", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "getLastErrors": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "modify": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setDate": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setISODate": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setTime": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setTimestamp": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setTimezone": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "sub": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "DateTimeInterface": { + "__wakeup": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "diff": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "format": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getOffset": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getTimestamp": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getTimezone": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "DateTimeZone": { + "__construct": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__set_state": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__wakeup": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLocation": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getName": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getOffset": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTransitions": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "listAbbreviations": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "listIdentifiers": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "Gender\\Gender": { + "__construct": { + "ext.name": "gender", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__destruct": { + "ext.name": "gender", + "ext.min": "0.6.0", + "ext.max": "0.7.0", + "php.min": "5.3.0", + "php.max": null + }, + "connect": { + "ext.name": "gender", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "country": { + "ext.name": "gender", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "get": { + "ext.name": "gender", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isNick": { + "ext.name": "gender", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "similarNames": { + "ext.name": "gender", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "trace": { + "ext.name": "gender", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "HaruAnnotation": { + "setBorderStyle": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setHighlightMode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setIcon": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setOpened": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "HaruDestination": { + "setFit": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFitB": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFitBH": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFitBV": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFitH": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFitR": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFitV": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setXYZ": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "HaruDoc": { + "__construct": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "addPage": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "addPageLabel": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "createOutline": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCurrentEncoder": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCurrentPage": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getEncoder": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getFont": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getInfoAttr": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getPageLayout": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getPageMode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getStreamSize": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "insertPage": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "loadJPEG": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "loadPNG": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "loadRaw": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "loadTTC": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "loadTTF": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "loadType1": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "output": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "readFromStream": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "resetError": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "resetStream": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "save": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "saveToStream": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setCompressionMode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setCurrentEncoder": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setEncryptionMode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setInfoAttr": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setInfoDateAttr": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setOpenAction": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setPageLayout": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setPageMode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setPagesConfiguration": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setPassword": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setPermission": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "useCNSEncodings": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "useCNSFonts": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "useCNTEncodings": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "useCNTFonts": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "useJPEncodings": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "useJPFonts": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "useKREncodings": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "useKRFonts": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "HaruEncoder": { + "getByteType": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getType": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getUnicode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getWritingMode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "HaruException": { + "__construct": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "__toString": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getFile": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getLine": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getMessage": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getPrevious": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getTrace": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getTraceAsString": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "HaruFont": { + "MeasureText": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getAscent": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCapHeight": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getDescent": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getEncodingName": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getFontName": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getTextWidth": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getUnicodeWidth": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getXHeight": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "HaruImage": { + "addSMask": { + "ext.name": "haru", + "ext.min": "1.0.3", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getBitsPerComponent": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getColorSpace": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getHeight": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getSize": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getWidth": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setColorMask": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setMaskImage": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "HaruOutline": { + "setDestination": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setOpened": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "HaruPage": { + "Concat": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "MeasureText": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "arc": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "beginText": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "circle": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "closePath": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "createDestination": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "createLinkAnnotation": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "createTextAnnotation": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "createURLAnnotation": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "curveTo": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "curveTo2": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "curveTo3": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "drawImage": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "ellipse": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "endPath": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "endText": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "eoFillStroke": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "eofill": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "fill": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "fillStroke": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCMYKFill": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCMYKStroke": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCharSpace": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCurrentFont": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCurrentFontSize": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCurrentPos": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getCurrentTextPos": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getDash": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getFillingColorSpace": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getFlatness": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getGMode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getGrayFill": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getGrayStroke": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getHeight": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getHorizontalScaling": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getLineCap": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getLineJoin": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getLineWidth": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getMiterLimit": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getRGBFill": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getRGBStroke": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getStrokingColorSpace": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getTextLeading": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getTextMatrix": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getTextRenderingMode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getTextRise": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getTextWidth": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getTransMatrix": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getWidth": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getWordSpace": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "lineTo": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "moveTextPos": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "moveTo": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "moveToNextLine": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "rectangle": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setCMYKFill": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setCMYKStroke": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setCharSpace": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setDash": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFlatness": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFontAndSize": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setGrayFill": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setGrayStroke": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setHeight": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setHorizontalScaling": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setLineCap": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setLineJoin": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setLineWidth": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setMiterLimit": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setRGBFill": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setRGBStroke": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setRotate": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setSize": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setSlideShow": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setTextLeading": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setTextMatrix": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setTextRenderingMode": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setTextRise": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setWidth": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setWordSpace": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setZoom": { + "ext.name": "haru", + "ext.min": "1.0.3", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "showText": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "showTextNextLine": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "stroke": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "textOut": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "textRect": { + "ext.name": "haru", + "ext.min": "0.0.1", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "http\\Env\\Request": { + "getCookie": { + "ext.name": "http", + "ext.min": "2.2.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "http\\Env\\Response": { + "setCookie": { + "ext.name": "http", + "ext.min": "2.2.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "http\\Header\\Parser": { + "getState": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "parse": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "stream": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "http\\Message\\Parser": { + "configure": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getAvailableConfiguration": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getAvailableOptions": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Collator": { + "__construct": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "asort": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "compare": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getAttribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLocale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getSortKey": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getStrength": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setAttribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setStrength": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sort": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sortWithSortKeys": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "IntlBreakIterator": { + "createCharacterInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createCodePointInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createLineInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createSentenceInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createTitleInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createWordInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "current": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "first": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "following": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getLocale": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getPartsIterator": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getText": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "isBoundary": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "last": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "next": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "preceding": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "previous": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setText": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "IntlCalendar": { + "add": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "after": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "before": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "clear": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "equals": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "fieldDifference": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "fromDateTime": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "get": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getActualMaximum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getActualMinimum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getAvailableLocales": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getDayOfWeekType": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getFirstDayOfWeek": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getGreatestMinimum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getKeywordValuesForLocale": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getLeastMaximum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getLocale": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getMaximum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getMinimalDaysInFirstWeek": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getMinimum": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getNow": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getRepeatedWallTimeOption": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getSkippedWallTimeOption": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getTime": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getTimeZone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getType": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getWeekendTransition": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "inDaylightTime": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "isEquivalentTo": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "isLenient": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "isSet": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "isWeekend": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "roll": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "set": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setFirstDayOfWeek": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setLenient": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setMinimalDaysInFirstWeek": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setRepeatedWallTimeOption": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setSkippedWallTimeOption": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setTime": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setTimeZone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "toDateTime": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "IntlCodePointBreakIterator": { + "getLastCodePoint": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "IntlDateFormatter": { + "__construct": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "create": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "format": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "formatObject": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getCalendar": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getCalendarObject": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getDateType": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getLocale": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getPattern": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getTimeType": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getTimeZone": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getTimeZoneId": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "isLenient": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "localtime": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "parse": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "setCalendar": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "setLenient": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "setPattern": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "setTimeZone": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "setTimeZoneId": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + } + }, + "IntlGregorianCalendar": { + "__construct": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getGregorianChange": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "isLeapYear": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setGregorianChange": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "IntlPartsIterator": { + "getBreakIterator": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "IntlRuleBasedBreakIterator": { + "__construct": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getBinaryRules": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getRuleStatus": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getRuleStatusVec": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getRules": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "IntlTimeZone": { + "countEquivalentIDs": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createDefault": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createEnumeration": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createTimeZone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createTimeZoneIDEnumeration": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "fromDateTimeZone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getCanonicalID": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getDSTSavings": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getDisplayName": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getEquivalentID": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getGMT": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getID": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getOffset": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getRawOffset": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getRegion": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getTZDataVersion": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getUnknown": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "hasSameRules": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "toDateTimeZone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "useDaylightTime": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "Locale": { + "acceptFromHttp": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "canonicalize": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "composeLocale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "filterMatches": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getAllVariants": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDefault": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayLanguage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayName": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayRegion": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayScript": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayVariant": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getKeywords": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPrimaryLanguage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getRegion": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getScript": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lookup": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "parseLocale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setDefault": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "MessageFormatter": { + "__construct": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "format": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "formatMessage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLocale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPattern": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "parse": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "parseMessage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setPattern": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "Normalizer": { + "isNormalized": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.3.0alpha1", + "php.max": null + }, + "normalize": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.3.0alpha1", + "php.max": null + } + }, + "NumberFormatter": { + "__construct": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "format": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "formatCurrency": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getAttribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLocale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPattern": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getSymbol": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTextAttribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "parse": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "parseCurrency": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setAttribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setPattern": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setSymbol": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setTextAttribute": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "ResourceBundle": { + "__construct": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "count": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "create": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "get": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getLocales": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + } + }, + "Spoofchecker": { + "__construct": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "areConfusable": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "isSuspicious": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "setAllowedLocales": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "setChecks": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + } + }, + "Transliterator": { + "create": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "createFromRules": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "createInverse": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "listIDs": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "transliterate": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + } + }, + "UConverter": { + "__construct": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "convert": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "fromUCallback": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getAliases": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getAvailable": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getDestinationEncoding": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getDestinationType": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getErrorCode": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getErrorMessage": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getSourceEncoding": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getSourceType": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getStandards": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getSubstChars": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "reasonText": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setDestinationEncoding": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setSourceEncoding": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "setSubstChars": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "toUCallback": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "transcode": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "mimemessage": { + "add_child": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "enum_uue": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "extract_body": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "extract_headers": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "extract_uue": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "get_child": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "get_child_count": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "get_parent": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "mimemessage": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + }, + "remove": { + "ext.name": "mailparse", + "ext.min": "0.9", + "ext.max": null, + "php.min": "4.3.0", + "php.max": null + } + }, + "Mongo": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "forceError": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getPoolSize": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getSlave": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getSlaveOkay": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "lastError": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "poolDebug": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "prevError": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "resetError": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setPoolSize": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setSlaveOkay": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "switchSlave": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoBinData": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoClient": { + "__construct": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "__get": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "close": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "connect": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "dropDB": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getConnections": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getHosts": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getReadPreference": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getWriteConcern": { + "ext.name": "mongo", + "ext.min": "1.5.0RC2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "killCursor": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "listDBs": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "selectCollection": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "selectDB": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "setReadPreference": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "setWriteConcern": { + "ext.name": "mongo", + "ext.min": "1.5.0RC2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoCode": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoCollection": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__get": { + "ext.name": "mongo", + "ext.min": "1.0.2", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "aggregate": { + "ext.name": "mongo", + "ext.min": "1.3.0beta2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "aggregateCursor": { + "ext.name": "mongo", + "ext.min": "1.5.0RC2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "batchInsert": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "count": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "createDBRef": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "createIndex": { + "ext.name": "mongo", + "ext.min": "1.5.0RC1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "deleteIndex": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "deleteIndexes": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "distinct": { + "ext.name": "mongo", + "ext.min": "1.2.12", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "drop": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "ensureIndex": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "find": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "findAndModify": { + "ext.name": "mongo", + "ext.min": "1.3.0beta2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "findOne": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDBRef": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getIndexInfo": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getName": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getReadPreference": { + "ext.name": "mongo", + "ext.min": "1.3.0beta1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getSlaveOkay": { + "ext.name": "mongo", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getWriteConcern": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "group": { + "ext.name": "mongo", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "insert": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "parallelCollectionScan": { + "ext.name": "mongo", + "ext.min": "1.5.0RC2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "remove": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "save": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setReadPreference": { + "ext.name": "mongo", + "ext.min": "1.3.0beta1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "setSlaveOkay": { + "ext.name": "mongo", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setWriteConcern": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "toIndexString": { + "ext.name": "mongo", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "update": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "validate": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoCommandCursor": { + "__construct": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "createFromDocument": { + "ext.name": "mongo", + "ext.min": "1.5.0RC2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoCursor": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "addOption": { + "ext.name": "mongo", + "ext.min": "1.0.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "awaitData": { + "ext.name": "mongo", + "ext.min": "1.2.12", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "count": { + "ext.name": "mongo", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "explain": { + "ext.name": "mongo", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "fields": { + "ext.name": "mongo", + "ext.min": "1.0.6", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getNext": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "hasNext": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "hint": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "immortal": { + "ext.name": "mongo", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "limit": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "maxTimeMS": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "partial": { + "ext.name": "mongo", + "ext.min": "1.2.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "reset": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setFlag": { + "ext.name": "mongo", + "ext.min": "1.3.0beta1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "skip": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "slaveOkay": { + "ext.name": "mongo", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "snapshot": { + "ext.name": "mongo", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "sort": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "tailable": { + "ext.name": "mongo", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "MongoCursorException": { + "getHost": { + "ext.name": "mongo", + "ext.min": "1.2.5", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoCursorInterface": { + "batchSize": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "dead": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getReadPreference": { + "ext.name": "mongo", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "info": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "setReadPreference": { + "ext.name": "mongo", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "timeout": { + "ext.name": "mongo", + "ext.min": "1.6.0RC3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "MongoDB": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__get": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "authenticate": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "command": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "createCollection": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "createDBRef": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "drop": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "dropCollection": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "execute": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "forceError": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getCollectionInfo": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getCollectionNames": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDBRef": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getGridFS": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getProfilingLevel": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getReadPreference": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getSlaveOkay": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getWriteConcern": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "lastError": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "listCollections": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "prevError": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "repair": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "resetError": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "selectCollection": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setProfilingLevel": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setReadPreference": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setSlaveOkay": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setWriteConcern": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoDBRef": { + "create": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "get": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isRef": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoDate": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__set_state": { + "ext.name": "mongo", + "ext.min": "1.6.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "toDateTime": { + "ext.name": "mongo", + "ext.min": "1.6.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "MongoDeleteBatch": { + "__construct": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoGridFS": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "delete": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "get": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "put": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "storeBytes": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "storeFile": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "storeUpload": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoGridFSCursor": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoGridFSFile": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getBytes": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getFilename": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getResource": { + "ext.name": "mongo", + "ext.min": "1.3.0", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getSize": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "write": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoId": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__set_state": { + "ext.name": "mongo", + "ext.min": "1.0.8", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getHostname": { + "ext.name": "mongo", + "ext.min": "1.0.8", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getInc": { + "ext.name": "mongo", + "ext.min": "1.0.11", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getPID": { + "ext.name": "mongo", + "ext.min": "1.0.11", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getTimestamp": { + "ext.name": "mongo", + "ext.min": "1.0.2", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "isValid": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoInsertBatch": { + "__construct": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoInt32": { + "__construct": { + "ext.name": "mongo", + "ext.min": "1.0.9", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "1.0.9", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "MongoInt64": { + "__construct": { + "ext.name": "mongo", + "ext.min": "1.0.9", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "1.0.9", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "MongoLog": { + "getCallback": { + "ext.name": "mongo", + "ext.min": "1.3.0beta1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getLevel": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getModule": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setCallback": { + "ext.name": "mongo", + "ext.min": "1.3.0beta1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "setLevel": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setModule": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "MongoPool": { + "getSize": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "info": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setSize": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "MongoRegex": { + "__construct": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoResultException": { + "getDocument": { + "ext.name": "mongo", + "ext.min": "1.3.0RC1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getHost": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoTimestamp": { + "__construct": { + "ext.name": "mongo", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "__toString": { + "ext.name": "mongo", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "MongoUpdateBatch": { + "__construct": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoWriteBatch": { + "add": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "execute": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getBatchInfo": { + "ext.name": "mongo", + "ext.min": "1.5.0RC2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getItemCount": { + "ext.name": "mongo", + "ext.min": "1.5.0RC2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoWriteConcernException": { + "getDocument": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MessagePack": { + "__construct": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "pack": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setOption": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "unpack": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "unpacker": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MessagePackUnpacker": { + "__construct": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__destruct": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "data": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "execute": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "feed": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "reset": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setOption": { + "ext.name": "msgpack", + "ext.min": "0.5.2", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "OAuth": { + "__construct": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "__destruct": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "disableDebug": { + "ext.name": "OAuth", + "ext.min": "0.99.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "disableRedirects": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "disableSSLChecks": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "enableDebug": { + "ext.name": "OAuth", + "ext.min": "0.99.4", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "enableRedirects": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "enableSSLChecks": { + "ext.name": "OAuth", + "ext.min": "0.99.5", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "fetch": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "generateSignature": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getAccessToken": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getCAPath": { + "ext.name": "OAuth", + "ext.min": "0.99.8", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getLastResponse": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getLastResponseHeaders": { + "ext.name": "OAuth", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getLastResponseInfo": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getRequestHeader": { + "ext.name": "OAuth", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getRequestToken": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setAuthType": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setCAPath": { + "ext.name": "OAuth", + "ext.min": "0.99.8", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setNonce": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setRSACertificate": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setRequestEngine": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setSSLChecks": { + "ext.name": "OAuth", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setTimeout": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setTimestamp": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setToken": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setVersion": { + "ext.name": "OAuth", + "ext.min": "0.99.1", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "OAuthProvider": { + "__construct": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "addRequiredParameter": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "callTimestampNonceHandler": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "callconsumerHandler": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "calltokenHandler": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "checkOAuthRequest": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "consumerHandler": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "generateToken": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "is2LeggedEndpoint": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "isRequestTokenEndpoint": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "removeRequiredParameter": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "reportProblem": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setParam": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setRequestTokenPath": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "timestampNonceHandler": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "tokenHandler": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "PDFlib": { + "__construct": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "activate_item": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "add_nameddest": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "add_path_point": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "add_portfolio_file": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "add_portfolio_folder": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "add_table_cell": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "add_textflow": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "add_thumbnail": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "align": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "arc": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "arcn": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_document": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_dpart": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_font": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_glyph": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_glyph_ext": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_item": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_layer": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_mc": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_page_ext": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_pattern": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_pattern_ext": { + "ext.name": "pdflib", + "ext.min": "3.0.2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_template": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "begin_template_ext": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "circle": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "circular_arc": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "clip": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "close_font": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "close_graphics": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "close_image": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "close_pdi": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "close_pdi_document": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "close_pdi_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "closepath": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "closepath_fill_stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "closepath_stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "concat": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "continue_text": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "convert_to_unicode": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create_3dview": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create_action": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create_annotation": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create_bookmark": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create_field": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create_fieldgroup": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create_gstate": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create_pvf": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "create_textflow": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "curveto": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "define_layer": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete_path": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete_pvf": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete_table": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete_textflow": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "draw_path": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ellipse": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "elliptical_arc": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "encoding_set_char": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_document": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_dpart": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_font": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_glyph": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_item": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_layer": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_mc": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_page_ext": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_pattern": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_template": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "end_template_ext": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "endpath": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fill": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fill_graphicsblock": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fill_imageblock": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fill_pdfblock": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fill_stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fill_textblock": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fit_graphics": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fit_image": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fit_pdi_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fit_table": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fit_textflow": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "fit_textline": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_apiname": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_buffer": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_errmsg": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_errnum": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_option": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_parameter": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_pdi_parameter": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_pdi_value": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_string": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_value": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_font": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_graphics": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_image": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_matchbox": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_path": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_pdi_page": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_pvf": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_table": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_textflow": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info_textline": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "initgraphics": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lineto": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "load_3ddata": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "load_asset": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "load_font": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "load_graphics": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "load_iccprofile": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "load_image": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "makespotcolor": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mc_point": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "moveto": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "open_image": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "open_pdi": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "open_pdi_document": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "open_pdi_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pcos_get_number": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pcos_get_stream": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pcos_get_string": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "poca_delete": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "poca_insert": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "poca_new": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "poca_remove": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "process_pdi": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rect": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "restore": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "resume_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rotate": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "save": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "scale": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set_graphics_option": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set_gstate": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set_info": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set_layer_dependency": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set_option": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set_parameter": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set_text_option": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set_text_pos": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set_value": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setcolor": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setdash": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setdashpattern": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setflat": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setfont": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setlinecap": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setlinejoin": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setlinewidth": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setmatrix": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setmiterlimit": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setpolydash": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "shading": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "shading_pattern": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "shfill": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "show": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "show_boxed": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "show_xy": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "skew": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "stringwidth": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "stroke": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "suspend_page": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "translate": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "utf16_to_utf32": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "utf16_to_utf8": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "utf32_to_utf16": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "utf32_to_utf8": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "utf8_to_utf16": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "utf8_to_utf32": { + "ext.name": "pdflib", + "ext.min": "3.0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "PDFlibException": { + "get_apiname": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_errmsg": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get_errnum": { + "ext.name": "pdflib", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "Collectable": { + "chunk": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "count": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "extend": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "from": { + "ext.name": "pthreads", + "ext.min": "2.0.9", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getTerminationInfo": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isGarbage": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isRunning": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isTerminated": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isWaiting": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "lock": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "merge": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "notify": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "pop": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "run": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setGarbage": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "shift": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "synchronized": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "unlock": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "wait": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Cond": { + "__construct": { + "ext.name": "pthreads", + "ext.min": "0.0.39", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "broadcast": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "create": { + "ext.name": "pthreads", + "ext.min": "0.0.39", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "destroy": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "signal": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "wait": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Mutex": { + "__construct": { + "ext.name": "pthreads", + "ext.min": "0.0.39", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "create": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "destroy": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "lock": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "trylock": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "unlock": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Pool": { + "__construct": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__destruct": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "collect": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "resize": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "shutdown": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "submit": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "submitTo": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Thread": { + "__destruct": { + "ext.name": "pthreads", + "ext.min": "3.0.0", + "ext.max": "3.0.6", + "php.min": "5.3.0", + "php.max": null + }, + "chunk": { + "ext.name": "pthreads", + "ext.min": "0.0.45", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "count": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "detach": { + "ext.name": "pthreads", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "extend": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "from": { + "ext.name": "pthreads", + "ext.min": "2.0.9", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCount": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCreatorId": { + "ext.name": "pthreads", + "ext.min": "0.0.36", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCurrentThread": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCurrentThreadId": { + "ext.name": "pthreads", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getMax": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPeak": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getTerminationInfo": { + "ext.name": "pthreads", + "ext.min": "0.0.45", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getThread": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getThreadId": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "globally": { + "ext.name": "pthreads", + "ext.min": "2.0.1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isBusy": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isJoined": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isRunning": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isStarted": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isTerminated": { + "ext.name": "pthreads", + "ext.min": "0.0.44", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isWaiting": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "join": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "kill": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": "3.0.6", + "php.min": "5.3.0", + "php.max": null + }, + "lock": { + "ext.name": "pthreads", + "ext.min": "0.0.40", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "merge": { + "ext.name": "pthreads", + "ext.min": "0.0.44", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "notify": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "pop": { + "ext.name": "pthreads", + "ext.min": "0.0.45", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "run": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "shift": { + "ext.name": "pthreads", + "ext.min": "0.0.45", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "start": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "synchronized": { + "ext.name": "pthreads", + "ext.min": "0.0.40", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "unlock": { + "ext.name": "pthreads", + "ext.min": "0.0.40", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "wait": { + "ext.name": "pthreads", + "ext.min": "0.0.33", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Threaded": { + "chunk": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "count": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "extend": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "from": { + "ext.name": "pthreads", + "ext.min": "2.0.9", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getTerminationInfo": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isRunning": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isTerminated": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isWaiting": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "lock": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "merge": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "notify": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "pop": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "run": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "shift": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "synchronized": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "unlock": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "wait": { + "ext.name": "pthreads", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Worker": { + "chunk": { + "ext.name": "pthreads", + "ext.min": "0.0.45", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "count": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "detach": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "extend": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "from": { + "ext.name": "pthreads", + "ext.min": "2.0.9", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCreatorId": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCurrentThread": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCurrentThreadId": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getStacked": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getTerminationInfo": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getThreadId": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "globally": { + "ext.name": "pthreads", + "ext.min": "2.0.1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isJoined": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isRunning": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isShutdown": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isStarted": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isTerminated": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isWaiting": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isWorking": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "join": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "kill": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "lock": { + "ext.name": "pthreads", + "ext.min": "0.0.40", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "merge": { + "ext.name": "pthreads", + "ext.min": "0.0.44", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "notify": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "pop": { + "ext.name": "pthreads", + "ext.min": "0.0.45", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "run": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "shift": { + "ext.name": "pthreads", + "ext.min": "0.0.45", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "shutdown": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "stack": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "start": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "synchronized": { + "ext.name": "pthreads", + "ext.min": "0.0.40", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "unlock": { + "ext.name": "pthreads", + "ext.min": "0.0.40", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "unstack": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "wait": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "RarArchive": { + "__toString": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "close": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getComment": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getEntries": { + "ext.name": "rar", + "ext.min": "2.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getEntry": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "isBroken": { + "ext.name": "rar", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "isSolid": { + "ext.name": "rar", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "open": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setAllowBroken": { + "ext.name": "rar", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "RarEntry": { + "__toString": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "extract": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getAttr": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getCrc": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFileTime": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getHostOs": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMethod": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getName": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPackedSize": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPosition": { + "ext.name": "rar", + "ext.min": "3.0.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getStream": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getUnpackedSize": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getVersion": { + "ext.name": "rar", + "ext.min": "0.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "isDirectory": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "isEncrypted": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "RarException": { + "isUsingExceptions": { + "ext.name": "rar", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setUsingExceptions": { + "ext.name": "rar", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "Redis": { + "__construct": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__destruct": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "_prefix": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "_serialize": { + "ext.name": "redis", + "ext.min": "2.2.5", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "_unserialize": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "append": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "auth": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "bgSave": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "bgrewriteaof": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "bitcount": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "bitop": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "bitpos": { + "ext.name": "redis", + "ext.min": "2.2.5", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "blPop": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "brPop": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "brpoplpush": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "clearLastError": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "client": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "close": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "config": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "connect": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "dbSize": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "debug": { + "ext.name": "redis", + "ext.min": "2.2.7", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "decr": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "decrBy": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "del": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "discard": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "dump": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "echo": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "eval": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "evalsha": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "evaluate": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "evaluateSha": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "exec": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "exists": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "expire": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "expireAt": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "flushAll": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "flushDB": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getAuth": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getBit": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDBNum": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getHost": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getKeys": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getLastError": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMode": { + "ext.name": "redis", + "ext.min": "2.2.7", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMultiple": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getOption": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPersistentID": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPort": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getRange": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getReadTimeout": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getSet": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getTimeout": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hDel": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hExists": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hGet": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hGetAll": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hIncrBy": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hIncrByFloat": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hKeys": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hLen": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hMget": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hMset": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hSet": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hSetNx": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hVals": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "hscan": { + "ext.name": "redis", + "ext.min": "2.2.5", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "incr": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "incrBy": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "incrByFloat": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "isConnected": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "keys": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lGet": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lGetRange": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lInsert": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lLen": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lPop": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lPush": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lPushx": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lRemove": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lSet": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lSize": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lastSave": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lindex": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "listTrim": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lrange": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lrem": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ltrim": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mget": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "migrate": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "move": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mset": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "msetnx": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "multi": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "object": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "open": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pconnect": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "persist": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pexpire": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pexpireAt": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pfadd": { + "ext.name": "redis", + "ext.min": "2.2.7", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pfcount": { + "ext.name": "redis", + "ext.min": "2.2.7", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pfmerge": { + "ext.name": "redis", + "ext.min": "2.2.7", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ping": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pipeline": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "popen": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "psetex": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "psubscribe": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pttl": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "publish": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "pubsub": { + "ext.name": "redis", + "ext.min": "2.2.5", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "punsubscribe": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rPop": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rPush": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rPushx": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "randomKey": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rawCommand": { + "ext.name": "redis", + "ext.min": "2.2.7", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rename": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "renameKey": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "renameNx": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "resetStat": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "restore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "rpoplpush": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sAdd": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sContains": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sDiff": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sDiffStore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sGetMembers": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sInter": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sInterStore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sMembers": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sMove": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sPop": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sRandMember": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sRemove": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sSize": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sUnion": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sUnionStore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "save": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "scan": { + "ext.name": "redis", + "ext.min": "2.2.5", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "scard": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "script": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "select": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sendEcho": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setBit": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setOption": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setRange": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setTimeout": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setex": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setnx": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sismember": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "slaveof": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "slowlog": { + "ext.name": "redis", + "ext.min": "2.2.4", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sort": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sortAsc": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sortAscAlpha": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sortDesc": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sortDescAlpha": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "srem": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "sscan": { + "ext.name": "redis", + "ext.min": "2.2.5", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "strlen": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "subscribe": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "substr": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "time": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ttl": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "type": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "unsubscribe": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "unwatch": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "wait": { + "ext.name": "redis", + "ext.min": "2.2.5", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "watch": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zAdd": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zCard": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zCount": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zDelete": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zDeleteRangeByRank": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zDeleteRangeByScore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zIncrBy": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zInter": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRange": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRangeByLex": { + "ext.name": "redis", + "ext.min": "2.2.7", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRangeByScore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRank": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRem": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRemRangeByRank": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRemRangeByScore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRemove": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRemoveRangeByScore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRevRangeByScore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zRevRank": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zReverseRange": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zScore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zSize": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zUnion": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zinterstore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zrevrange": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zscan": { + "ext.name": "redis", + "ext.min": "2.2.5", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "zunionstore": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "RedisArray": { + "__call": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "__construct": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "_distributor": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "_function": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "_hosts": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "_instance": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "_rehash": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "_target": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "bgsave": { + "ext.name": "redis", + "ext.min": "2.2.7", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "del": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "discard": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "exec": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "flushall": { + "ext.name": "redis", + "ext.min": "2.2.4", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "flushdb": { + "ext.name": "redis", + "ext.min": "2.2.4", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getMultiple": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getOption": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "keys": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mget": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "mset": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "multi": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "ping": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "save": { + "ext.name": "redis", + "ext.min": "2.2.7", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "select": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setOption": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "unwatch": { + "ext.name": "redis", + "ext.min": "2.2.3", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "Reflection": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getModifierNames": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionClass": { + "__construct": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__toString": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getConstant": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getConstants": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getConstructor": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDefaultProperties": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDocComment": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getEndLine": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getExtension": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getExtensionName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getFileName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getInterfaceNames": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getInterfaces": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getMethod": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getMethods": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getModifiers": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getNamespaceName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getParentClass": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getProperties": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getProperty": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getShortName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getStartLine": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getStaticProperties": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getStaticPropertyValue": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getTraitAliases": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getTraitNames": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getTraits": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "hasConstant": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "hasMethod": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "hasProperty": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "implementsInterface": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "inNamespace": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isAbstract": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isCloneable": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isFinal": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isInstance": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isInstantiable": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isInterface": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isInternal": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isIterateable": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isSubclassOf": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isTrait": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isUserDefined": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "newInstance": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "newInstanceArgs": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "newInstanceWithoutConstructor": { + "ext.name": "Reflection", + "ext.min": "5.4.0", + "ext.max": null, + "php.min": "5.4.0", + "php.max": null + }, + "setStaticPropertyValue": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionExtension": { + "__construct": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__toString": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getClassNames": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getClasses": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getConstants": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDependencies": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getFunctions": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getINIEntries": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getVersion": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "info": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isPersistent": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isTemporary": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionFunction": { + "__construct": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getClosure": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "invoke": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "invokeArgs": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isDisabled": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionFunctionAbstract": { + "__toString": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getClosureScopeClass": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getClosureThis": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDocComment": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getEndLine": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getExtension": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getExtensionName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getFileName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getNamespaceName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getNumberOfParameters": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getNumberOfRequiredParameters": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getParameters": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getShortName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getStartLine": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getStaticVariables": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "inNamespace": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isClosure": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isDeprecated": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isGenerator": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isInternal": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isUserDefined": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isVariadic": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "returnsReference": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionMethod": { + "__construct": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getClosure": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDeclaringClass": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getModifiers": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getPrototype": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "invoke": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "invokeArgs": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isAbstract": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isConstructor": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isDestructor": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isFinal": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isPrivate": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isProtected": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isPublic": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isStatic": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setAccessible": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionObject": { + "__construct": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionParameter": { + "__construct": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__toString": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "allowsNull": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "canBePassedByValue": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getClass": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDeclaringClass": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDeclaringFunction": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDefaultValue": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDefaultValueConstantName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getPosition": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isArray": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isCallable": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isDefaultValueAvailable": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isDefaultValueConstant": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isOptional": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isPassedByReference": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isVariadic": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionProperty": { + "__construct": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__toString": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDeclaringClass": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getDocComment": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getModifiers": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getValue": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isDefault": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isPrivate": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isProtected": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isPublic": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isStatic": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setAccessible": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setValue": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionZendExtension": { + "__construct": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "__toString": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getAuthor": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getCopyright": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getName": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getURL": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getVersion": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "Reflector": { + "__toString": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "Riak\\Bucket": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "counter": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "delete": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "get": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getConflictResolver": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getConnection": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getKeyList": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getKeyStream": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getName": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPropertyList": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "index": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "indexQuery": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "put": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setConflictResolver": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPropertyList": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\BucketPropertyList": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getAllowMult": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getBackend": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getBasicQuorum": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getBigVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCHashKeyFun": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getDW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getLastWriteWins": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getLinkFun": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNValue": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNotFoundOk": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getOldVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPostCommitHookList": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPreCommitHookList": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getRW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getReplicationMode": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getSearchEnabled": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getSmallVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getYoungVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setAllowMult": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setBackend": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setBasicQuorum": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setBigVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setCHashKeyFun": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setDW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setLastWriteWins": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setLinkFun": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setNValue": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setNotFoundOk": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setOldVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPostCommitHookList": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPreCommitHookList": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setRW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setReplicationMode": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setSearchEnabled": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setSmallVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setYoungVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Connection": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getBucket": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getHost": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPort": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getServerInfo": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ping": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Crdt\\Counter": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "get": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "increment": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "incrementAndGet": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Crdt\\Input\\GetInput": { + "getBasicQuorum": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNotFoundOk": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPR": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getR": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setBasicQuorum": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setNotFoundOk": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPR": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setR": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Crdt\\Input\\UpdateInput": { + "getDW": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPW": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getW": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setDW": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPW": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setW": { + "ext.name": "riak", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Input\\DeleteInput": { + "getDW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getRW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setDW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setRW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Input\\GetInput": { + "getBasicQuorum": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getIfModifiedVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNotFoundOk": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getReturnDeletedVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getReturnHead": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setBasicQuorum": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setIfModifiedVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setNotFoundOk": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setR": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setReturnDeletedVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setReturnHead": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Input\\GetResolverInput": { + "__construct": { + "ext.name": "riak", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getConflictResolver": { + "ext.name": "riak", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Input\\IndexInput": { + "getContinuation": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getMaxResults": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setContinuation": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setMaxResults": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Input\\PutInput": { + "getDW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getIfNoneMatch": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getIfNotModified": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getReturnBody": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getReturnHead": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setDW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setIfNoneMatch": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setIfNotModified": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setReturnBody": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setReturnHead": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setW": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Link": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getBucketName": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getKey": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getTag": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Functions\\BaseFunction": { + "toArray": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Functions\\ErlangFunction": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Functions\\JavascriptFunction": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "anon": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "named": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Input\\BucketInput": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setIndexFilter": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Input\\Input": { + "getValue": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Input\\KeyDataListInput": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "add": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Input\\KeyListInput": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addArray": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addSingle": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\MapReduce": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addPhase": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "run": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setInput": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "toArray": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "toJson": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Output\\Output": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPhaseNumber": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getValue": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Output\\StreamOutput": { + "receive": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Phase\\MapPhase": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Phase\\Phase": { + "toArray": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Phase\\ReducePhase": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Object": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addIndex": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addLink": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addMetadata": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCharset": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getContent": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getContentEncoding": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getContentType": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getIndexMap": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getKey": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getLastModified": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getLastModifiedUSecs": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getLinkList": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getMetadataMap": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getVClock": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getVTag": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isDeleted": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setCharset": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setContent": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setContentEncoding": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setContentType": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setKey": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setVClock": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\ObjectList": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "first": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isEmpty": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "last": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Output\\ConflictResolver": { + "resolve": { + "ext.name": "riak", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Output\\GetOutput": { + "isUnchanged": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Output\\IndexOutput": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getContinuation": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getResultList": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Output\\IndexResult": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getKey": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Output\\IndexResultList": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.7.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Output\\KeyStreamOutput": { + "process": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Output\\Output": { + "getFirstObject": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getKey": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getObject": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getObjectList": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getVClock": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "hasObject": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "hasSiblings": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\PoolInfo": { + "getNumActiveConnection": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNumActivePersistentConnection": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNumReconnect": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Property\\CommitHook": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getErlFunction": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getErlModule": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getJsName": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isErlang": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isJavascript": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Property\\CommitHookList": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Property\\ModuleFunction": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getFunction": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getModule": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setFunction": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setModule": { + "ext.name": "riak", + "ext.min": "0.6.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Query\\IndexQuery": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getExactValue": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getName": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getRangeValue": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isRangeQuery": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setExactValue": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setName": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setRangeValue": { + "ext.name": "riak", + "ext.min": "0.4.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Search\\Input\\ParameterBag": { + "getDefaultField": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getDefaultOperation": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getFieldLimits": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getFilter": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPresort": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getRowLimit": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getSort": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getStartOffset": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setDefaultField": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setDefaultOperation": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setFieldLimits": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setFilter": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPresort": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setRowLimit": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setSort": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setStartOffset": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Search\\Output\\DocumentOutput": { + "getFields": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Search\\Output\\Output": { + "getDocuments": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getMaxScore": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNumFound": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "hasMaxScore": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "hasNumFound": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\Search\\Search": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "search": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\ServerInfo": { + "__construct": { + "ext.name": "riak", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNode": { + "ext.name": "riak", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getServerVersion": { + "ext.name": "riak", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "SolrClient": { + "__clone": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__sleep": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__wakeup": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addDocument": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addDocuments": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "commit": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "deleteById": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "deleteByIds": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "deleteByQueries": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "deleteByQuery": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getById": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getByIds": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getDebug": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getOptions": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "optimize": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "ping": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "query": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "request": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "rollback": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setResponseWriter": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setServlet": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "system": { + "ext.name": "solr", + "ext.min": "1.1.0b", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "threads": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrCollapseFunction": { + "__construct": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__sleep": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__toString": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "__wakeup": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getField": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getHint": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getMax": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getMin": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNullPolicy": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getSize": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setField": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setHint": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setMax": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setMin": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setNullPolicy": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setSize": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "SolrDisMaxQuery": { + "__construct": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addBigramPhraseField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addBoostQuery": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addPhraseField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addQueryField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addTrigramPhraseField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addUserField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "removeBigramPhraseField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "removeBoostQuery": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "removePhraseField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "removeQueryField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "removeTrigramPhraseField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "removeUserField": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setBigramPhraseFields": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setBigramPhraseSlop": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setBoostFunction": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setBoostQuery": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setMinimumMatch": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPhraseFields": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPhraseSlop": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setQueryAlt": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setQueryPhraseSlop": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setTieBreaker": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setTrigramPhraseFields": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setTrigramPhraseSlop": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setUserFields": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "useDisMaxQueryParser": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "useEDisMaxQueryParser": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "SolrDocument": { + "__clone": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__get": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__isset": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__set": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__unset": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "clear": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "deleteField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "fieldExists": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFieldCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFieldNames": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getInputDocument": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "merge": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "reset": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "sort": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "toArray": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrDocumentField": { + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrException": { + "getInternalInfo": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrGenericResponse": { + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrInputDocument": { + "__clone": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__sleep": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__wakeup": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "clear": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "deleteField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "fieldExists": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getBoost": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFieldBoost": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFieldCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFieldNames": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "merge": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "reset": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setBoost": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFieldBoost": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "sort": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "toArray": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrModifiableParams": { + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrObject": { + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getPropertyNames": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrParams": { + "__clone": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__toString": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "add": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addParam": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "get": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getParam": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getParams": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getPreparedParams": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "set": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setParam": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "toString": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrPingResponse": { + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrQuery": { + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addExpandFilterQuery": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addExpandSortField": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addFacetDateField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addFacetDateOther": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addFacetField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addFacetQuery": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addFilterQuery": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addGroupField": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addGroupFunction": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addGroupQuery": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addGroupSortField": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "addHighlightField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addMltField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addMltQueryField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addSortField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addStatsFacet": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "addStatsField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "collapse": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getExpand": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getExpandFilterQueries": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getExpandQuery": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getExpandRows": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getExpandSortFields": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getFacet": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetDateEnd": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetDateFields": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetDateGap": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetDateHardEnd": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetDateOther": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetDateStart": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetFields": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetLimit": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetMethod": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetMinCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetMissing": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetOffset": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetPrefix": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetQueries": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFacetSort": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFields": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getFilterQueries": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getGroup": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupCachePercent": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupFacet": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupFields": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupFormat": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupFunctions": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupLimit": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupMain": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupNGroups": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupOffset": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupQueries": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupSortFields": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getGroupTruncate": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getHighlight": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightAlternateField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightFields": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightFormatter": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightFragmenter": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightFragsize": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightHighlightMultiTerm": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightMaxAlternateFieldLength": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightMaxAnalyzedChars": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightMergeContiguous": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightRegexMaxAnalyzedChars": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightRegexPattern": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightRegexSlop": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightRequireFieldMatch": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightSimplePost": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightSimplePre": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightSnippets": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHighlightUsePhraseHighlighter": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMlt": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltBoost": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltFields": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltMaxNumQueryTerms": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltMaxNumTokens": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltMaxWordLength": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltMinDocFrequency": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltMinTermFrequency": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltMinWordLength": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getMltQueryFields": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getQuery": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getRows": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getSortFields": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getStart": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getStats": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getStatsFacets": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getStatsFields": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTerms": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsIncludeLowerBound": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsIncludeUpperBound": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsLimit": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsLowerBound": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsMaxCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsMinCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsPrefix": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsReturnRaw": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsSort": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTermsUpperBound": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getTimeAllowed": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeExpandFilterQuery": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "removeExpandSortField": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "removeFacetDateField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeFacetDateOther": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeFacetField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeFacetQuery": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeFilterQuery": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeHighlightField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeMltField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeMltQueryField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeSortField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeStatsFacet": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "removeStatsField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setEchoHandler": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setEchoParams": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setExpand": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setExpandQuery": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setExpandRows": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setExplainOther": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacet": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetDateEnd": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetDateGap": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetDateHardEnd": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetDateStart": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetEnumCacheMinDefaultFrequency": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetLimit": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetMethod": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetMinCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetMissing": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetOffset": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetPrefix": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setFacetSort": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setGroup": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setGroupCachePercent": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setGroupFacet": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setGroupFormat": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setGroupLimit": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setGroupMain": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setGroupNGroups": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setGroupOffset": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setGroupTruncate": { + "ext.name": "solr", + "ext.min": "2.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setHighlight": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightAlternateField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightFormatter": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightFragmenter": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightFragsize": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightHighlightMultiTerm": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightMaxAlternateFieldLength": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightMaxAnalyzedChars": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightMergeContiguous": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightRegexMaxAnalyzedChars": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightRegexPattern": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightRegexSlop": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightRequireFieldMatch": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightSimplePost": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightSimplePre": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightSnippets": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setHighlightUsePhraseHighlighter": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setMlt": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setMltBoost": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setMltCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setMltMaxNumQueryTerms": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setMltMaxNumTokens": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setMltMaxWordLength": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setMltMinDocFrequency": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setMltMinTermFrequency": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setMltMinWordLength": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setOmitHeader": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setQuery": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setRows": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setShowDebugInfo": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setStart": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setStats": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTerms": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsField": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsIncludeLowerBound": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsIncludeUpperBound": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsLimit": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsLowerBound": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsMaxCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsMinCount": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsPrefix": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsReturnRaw": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsSort": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTermsUpperBound": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setTimeAllowed": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrQueryResponse": { + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrResponse": { + "getArrayResponse": { + "ext.name": "solr", + "ext.min": "2.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getDigestedResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHttpStatus": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getHttpStatusMessage": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getRawRequest": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getRawRequestHeaders": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getRawResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getRawResponseHeaders": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getRequestUrl": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "setParseMode": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "success": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrUpdateResponse": { + "__construct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "__destruct": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SolrUtils": { + "digestJsonResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "digestXmlResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "escapeQueryChars": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getSolrVersion": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "queryPhrase": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + }, + "SphinxClient": { + "__construct": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "__sleep": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "__wakeup": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "addQuery": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "buildExcerpts": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "buildKeywords": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "close": { + "ext.name": "sphinx", + "ext.min": "1.0.3", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "escapeString": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getLastError": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "getLastWarning": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "open": { + "ext.name": "sphinx", + "ext.min": "1.0.3", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "query": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "resetFilters": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "resetGroupBy": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "runQueries": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setArrayResult": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setConnectTimeout": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFieldWeights": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFilter": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFilterFloatRange": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setFilterRange": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setGeoAnchor": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setGroupBy": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setGroupDistinct": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setIDRange": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setIndexWeights": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setLimits": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setMatchMode": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setMaxQueryTime": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setOverride": { + "ext.name": "sphinx", + "ext.min": "1.0.3", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "setRankingMode": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setRetries": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setSelect": { + "ext.name": "sphinx", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "setServer": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "setSortMode": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + }, + "status": { + "ext.name": "sphinx", + "ext.min": "1.0.3", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "updateAttributes": { + "ext.name": "sphinx", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.1.3", + "php.max": null + } + }, + "Directory": { + "close": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "read": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + }, + "rewind": { + "ext.name": "standard", + "ext.min": "4.0.0", + "ext.max": null, + "php.min": "4.0.0", + "php.max": null + } + }, + "php_user_filter": { + "filter": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "onClose": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "onCreate": { + "ext.name": "standard", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "Stomp": { + "__construct": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "__destruct": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "abort": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "ack": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "begin": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "commit": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "error": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "getReadTimeout": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "getSessionId": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "hasFrame": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "nack": { + "ext.name": "stomp", + "ext.min": "1.0.6", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "readFrame": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "send": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "setReadTimeout": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "subscribe": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + }, + "unsubscribe": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + } + }, + "StompException": { + "getDetails": { + "ext.name": "stomp", + "ext.min": "1.0.1", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + } + }, + "StompFrame": { + "__construct": { + "ext.name": "stomp", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.2.2", + "php.max": null + } + }, + "VarnishAdmin": { + "__construct": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "auth": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "ban": { + "ext.name": "varnish", + "ext.min": "0.6", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "banUrl": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "clearPanic": { + "ext.name": "varnish", + "ext.min": "0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "connect": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "disconnect": { + "ext.name": "varnish", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getPanic": { + "ext.name": "varnish", + "ext.min": "0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getParams": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getVclList": { + "ext.name": "varnish", + "ext.min": "0.9.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "isRunning": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setCompat": { + "ext.name": "varnish", + "ext.min": "0.9.2", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setHost": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setIdent": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setParam": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setPort": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setSecret": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "setTimeout": { + "ext.name": "varnish", + "ext.min": "0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "start": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "stop": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "vclUse": { + "ext.name": "varnish", + "ext.min": "0.9.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "VarnishLog": { + "__construct": { + "ext.name": "varnish", + "ext.min": "0.4", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "VarnishStat": { + "__construct": { + "ext.name": "varnish", + "ext.min": "0.3", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "XMLDiff\\Base": { + "__construct": { + "ext.name": "xmldiff", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "diff": { + "ext.name": "xmldiff", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "merge": { + "ext.name": "xmldiff", + "ext.min": "0.8.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Yac": { + "add": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "delete": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "dump": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "flush": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "get": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "info": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "set": { + "ext.name": "yac", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "ZipArchive": { + "addEmptyDir": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "addFile": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "addFromString": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "addGlob": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "addPattern": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "close": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "deleteIndex": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "deleteName": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "extractTo": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getArchiveComment": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getCommentIndex": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getCommentName": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getExternalAttributesIndex": { + "ext.name": "zip", + "ext.min": "1.12.4", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getExternalAttributesName": { + "ext.name": "zip", + "ext.min": "1.12.4", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFromIndex": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getFromName": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getNameIndex": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getStatusString": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getStream": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "locateName": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "open": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "renameIndex": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "renameName": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setArchiveComment": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setCommentIndex": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setCommentName": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setCompressionIndex": { + "ext.name": "zip", + "ext.min": "1.13.1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setCompressionName": { + "ext.name": "zip", + "ext.min": "1.13.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setExternalAttributesIndex": { + "ext.name": "zip", + "ext.min": "1.12.4", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setExternalAttributesName": { + "ext.name": "zip", + "ext.min": "1.12.4", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setPassword": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "statIndex": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "statName": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "unchangeAll": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "unchangeArchive": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "unchangeIndex": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "unchangeName": { + "ext.name": "zip", + "ext.min": "1.6.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + } + }, + "static_methods": { + "DateInterval": { + "__set_state": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "createFromDateString": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "DatePeriod": { + "__set_state": { + "ext.name": "date", + "ext.min": "5.3.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "DateTime": { + "__set_state": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "createFromFormat": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "createFromImmutable": { + "ext.name": "date", + "ext.min": "5.6.8RC1", + "ext.max": null, + "php.min": "5.6.8RC1", + "php.max": null + }, + "getLastErrors": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "DateTimeImmutable": { + "__set_state": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createFromFormat": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createFromMutable": { + "ext.name": "date", + "ext.min": "5.6.0beta1", + "ext.max": null, + "php.min": "5.6.0beta1", + "php.max": null + }, + "getLastErrors": { + "ext.name": "date", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "DateTimeZone": { + "__set_state": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "listAbbreviations": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "listIdentifiers": { + "ext.name": "date", + "ext.min": "5.2.0", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "http\\Env\\Request": { + "getCookie": { + "ext.name": "http", + "ext.min": "2.2.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "http\\Env\\Response": { + "setCookie": { + "ext.name": "http", + "ext.min": "2.2.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "http\\Header\\Parser": { + "getState": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "parse": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "stream": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "http\\Message\\Parser": { + "configure": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getAvailableConfiguration": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getAvailableOptions": { + "ext.name": "http", + "ext.min": "2.3.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Collator": { + "create": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "IntlBreakIterator": { + "createCharacterInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createCodePointInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createLineInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createSentenceInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createTitleInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createWordInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "IntlCalendar": { + "createInstance": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "fromDateTime": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getAvailableLocales": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getKeywordValuesForLocale": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getNow": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "IntlDateFormatter": { + "create": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "formatObject": { + "ext.name": "intl", + "ext.min": "1.0.0RC1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + } + }, + "IntlTimeZone": { + "countEquivalentIDs": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createDefault": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createEnumeration": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createTimeZone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "createTimeZoneIDEnumeration": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "fromDateTimeZone": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getCanonicalID": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getEquivalentID": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getGMT": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getRegion": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getTZDataVersion": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getUnknown": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "Locale": { + "acceptFromHttp": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "canonicalize": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "composeLocale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "filterMatches": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getAllVariants": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDefault": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayLanguage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayName": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayRegion": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayScript": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getDisplayVariant": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getKeywords": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getPrimaryLanguage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getRegion": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "getScript": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "lookup": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "parseLocale": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setDefault": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "MessageFormatter": { + "create": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "formatMessage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "parseMessage": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "Normalizer": { + "isNormalized": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.3.0alpha1", + "php.max": null + }, + "normalize": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.3.0alpha1", + "php.max": null + } + }, + "NumberFormatter": { + "create": { + "ext.name": "intl", + "ext.min": "1.0.0beta", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "ResourceBundle": { + "create": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "getLocales": { + "ext.name": "intl", + "ext.min": "1.1.0", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + } + }, + "Transliterator": { + "create": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "createFromRules": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + }, + "listIDs": { + "ext.name": "intl", + "ext.min": "2.0.0b1", + "ext.max": null, + "php.min": "5.2.4", + "php.max": null + } + }, + "UConverter": { + "getAliases": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getAvailable": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "getStandards": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "reasonText": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + }, + "transcode": { + "ext.name": "intl", + "ext.min": "5.5.0", + "ext.max": null, + "php.min": "5.5.0", + "php.max": null + } + }, + "Mongo": { + "getPoolSize": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "poolDebug": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "setPoolSize": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoClient": { + "getConnections": { + "ext.name": "mongo", + "ext.min": "1.3.0RC3", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "killCursor": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoCollection": { + "toIndexString": { + "ext.name": "mongo", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoCommandCursor": { + "createFromDocument": { + "ext.name": "mongo", + "ext.min": "1.5.0RC2", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoDBRef": { + "create": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "get": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "isRef": { + "ext.name": "mongo", + "ext.min": "0.9.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "MongoDate": { + "__set_state": { + "ext.name": "mongo", + "ext.min": "1.6.0RC1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "MongoId": { + "__set_state": { + "ext.name": "mongo", + "ext.min": "1.0.8", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getHostname": { + "ext.name": "mongo", + "ext.min": "1.0.8", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "isValid": { + "ext.name": "mongo", + "ext.min": "1.5.0alpha1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + } + }, + "MongoLog": { + "getCallback": { + "ext.name": "mongo", + "ext.min": "1.3.0beta1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "getLevel": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "getModule": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setCallback": { + "ext.name": "mongo", + "ext.min": "1.3.0beta1", + "ext.max": null, + "php.min": "5.2.6", + "php.max": null + }, + "setLevel": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setModule": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "MongoPool": { + "getSize": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "info": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "setSize": { + "ext.name": "mongo", + "ext.min": "1.2.3", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "OAuthProvider": { + "generateToken": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + }, + "reportProblem": { + "ext.name": "OAuth", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.1.0", + "php.max": null + } + }, + "Collectable": { + "extend": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "from": { + "ext.name": "pthreads", + "ext.min": "2.0.9", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Cond": { + "broadcast": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "create": { + "ext.name": "pthreads", + "ext.min": "0.0.39", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "destroy": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "signal": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "wait": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Mutex": { + "create": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "destroy": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "lock": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "trylock": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "unlock": { + "ext.name": "pthreads", + "ext.min": "0.0.37", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Thread": { + "__destruct": { + "ext.name": "pthreads", + "ext.min": "3.0.0", + "ext.max": "3.0.6", + "php.min": "5.3.0", + "php.max": null + }, + "extend": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "from": { + "ext.name": "pthreads", + "ext.min": "2.0.9", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCurrentThread": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCurrentThreadId": { + "ext.name": "pthreads", + "ext.min": "0.1.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "globally": { + "ext.name": "pthreads", + "ext.min": "2.0.1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Threaded": { + "extend": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "from": { + "ext.name": "pthreads", + "ext.min": "2.0.9", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Worker": { + "extend": { + "ext.name": "pthreads", + "ext.min": "2.0.8", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "from": { + "ext.name": "pthreads", + "ext.min": "2.0.9", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCurrentThread": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getCurrentThreadId": { + "ext.name": "pthreads", + "ext.min": "1.0.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "globally": { + "ext.name": "pthreads", + "ext.min": "2.0.1", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "RarArchive": { + "open": { + "ext.name": "rar", + "ext.min": "2.0.0b2", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "RarException": { + "isUsingExceptions": { + "ext.name": "rar", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + }, + "setUsingExceptions": { + "ext.name": "rar", + "ext.min": "2.0.0RC1", + "ext.max": null, + "php.min": "5.2.0", + "php.max": null + } + }, + "Reflection": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + }, + "getModifierNames": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionClass": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionExtension": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionFunction": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionMethod": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionParameter": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionProperty": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "ReflectionZendExtension": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "Reflector": { + "export": { + "ext.name": "Reflection", + "ext.min": "5.0.0", + "ext.max": null, + "php.min": "5.0.0", + "php.max": null + } + }, + "Riak\\MapReduce\\Functions\\JavascriptFunction": { + "anon": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "named": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "Riak\\PoolInfo": { + "getNumActiveConnection": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNumActivePersistentConnection": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + }, + "getNumReconnect": { + "ext.name": "riak", + "ext.min": "0.5.0", + "ext.max": null, + "php.min": "5.3.0", + "php.max": null + } + }, + "SolrUtils": { + "digestJsonResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "digestXmlResponse": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "escapeQueryChars": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "getSolrVersion": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + }, + "queryPhrase": { + "ext.name": "solr", + "ext.min": "0.9.11", + "ext.max": null, + "php.min": "5.2.3", + "php.max": null + } + } + }, + "functions_windows": { + "apache_child_terminate": false, + "chroot": false, + "getrusage": false, + "imagecreatefromxpm": false, + "lchgrp": false, + "lchown": false, + "nl_langinfo": false, + "strptime": false, + "sys_getloadavg": false, + "checkdnsrr": "5.3.0", + "dns_get_record": "5.3.0", + "fnmatch": "5.3.0", + "getmxrr": "5.3.0", + "getopt": "5.3.0", + "imagecolorclosesthwb": "5.3.0", + "inet_ntop": "5.3.0", + "inet_pton": "5.3.0", + "link": "5.3.0", + "linkinfo": "5.3.0", + "readlink": "5.3.0", + "socket_create_pair": "5.3.0", + "stream_socket_pair": "5.3.0", + "symlink": "5.3.0", + "time_nanosleep": "5.3.0", + "time_sleep_until": "5.3.0" + } +} diff --git a/resources/ssl/README b/resources/ssl/README new file mode 100644 --- /dev/null +++ b/resources/ssl/README @@ -0,0 +1,45 @@ +This document describes how to set Certificate Authority information. +Usually, you need to do this only if you're using a self-signed certificate. + + +OSX after Yosemite +================== + +If you're using a version of Mac OSX after Yosemite, you can not configure +certificates from the command line. All libphutil and arcanist options +related to CA configuration are ignored. + +Instead, you need to add them to the system keychain. The easiest way to do this +is to visit the site in Safari and choose to permanently accept the certificate. + +You can also use `security add-trusted-cert` from the command line. + + +All Other Systems +================= + +If "curl.cainfo" is not set (or you are using PHP older than 5.3.7, where the +option was introduced), libphutil uses the "default.pem" certificate authority +bundle when making HTTPS requests with cURL. This bundle is extracted from +Mozilla's certificates by cURL: + + http://curl.haxx.se/docs/caextract.html + +If you want to use a different CA bundle (for example, because you use +self-signed certificates), set "curl.cainfo" if you're using PHP 5.3.7 or newer, +or create a file (or symlink) in this directory named "custom.pem". + +If "custom.pem" is present, that file will be used instead of "default.pem". + +If you receive errors using your "custom.pem" file, you can test it directly +with `curl` by running a command like this: + + curl -v --cacert path/to/your/custom.pem https://phabricator.example.com/ + +Replace "path/to/your/custom.pem" with the path to your "custom.pem" file, +and replace "https://phabricator.example.com" with the real URL of your +Phabricator install. + +The initial lines of output from `curl` should give you information about the +SSL handshake and certificate verification, which may be helpful in resolving +the issue. diff --git a/resources/ssl/default.pem b/resources/ssl/default.pem new file mode 100644 --- /dev/null +++ b/resources/ssl/default.pem @@ -0,0 +1,3893 @@ +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Wed Jan 20 04:12:04 2016 +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## +## Conversion done with mk-ca-bundle.pl version 1.25. +## SHA1: 0ab47e2f41518f8d223eab517cb799e5b071231e +## + + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +AddTrust Low-Value Services Root +================================ +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU +cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO +ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 +54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr +oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 +Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui +GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w +HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw +HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt +ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr +mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj +ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +AddTrust Public Services Root +============================= +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU +cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ +BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l +dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu +nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i +d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG +Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw +HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G +A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G +A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 +JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 +Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H +EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +AddTrust Qualified Certificates Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU +cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx +CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx +64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 +KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o +L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR +wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU +MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE +BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y +azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze +RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB +iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +RSA Security 2048 v3 +==================== +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK +ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy +MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb +BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 +Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb +WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH +KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP ++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E +FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY +v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj +0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj +VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 +nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Global CA 2 +==================== +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw +MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ +NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k +LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA +Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b +HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH +K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 +srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh +ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL +OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC +x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF +H4z1Ir+rzoPz4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +Visa eCommerce Root +=================== +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG +EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug +QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 +WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm +VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL +F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b +RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 +TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI +/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs +GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc +CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW +YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz +zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +Certum Root CA +============== +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK +ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla +Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u +by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x +wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL +kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ +89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K +Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P +NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ +GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg +GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ +0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS +qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +Comodo Secure Services root +=========================== +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw +MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi +BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP +9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc +rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC +oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V +p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E +FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj +YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm +aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL +DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw +pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H +RR3B7Hzs/Sk= +-----END CERTIFICATE----- + +Comodo Trusted Services root +============================ +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw +MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h +bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw +IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 +3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y +/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 +juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS +ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud +DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp +ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl +cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA +BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l +R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O +9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx +ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 +XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk +lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB +lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy +lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt +66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn +wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh +D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy +BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie +J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud +DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU +a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv +Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 +UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm +VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK ++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW +IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 +WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X +f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II +4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 +VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx +OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg +DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij +KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K +DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv +BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp +p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 +nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX +MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM +Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz +uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT +BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj +YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB +BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD +VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 +ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE +AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV +qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s +hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z +POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 +Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp +8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC +bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu +g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p +vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr +qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA +============================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE +ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w +HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh +bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt +vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P +jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca +C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth +vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 +22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV +HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v +dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN +BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR +EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw +MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y +nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +UTN USERFirst Hardware Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd +BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx +OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 +eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz +ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI +wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd +tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 +i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf +Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw +gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF +lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF +UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW +XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 +lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn +iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 +nfhmqA== +-----END CERTIFICATE----- + +Camerfirma Chambers of Commerce Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx +NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp +cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn +MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU +xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH +NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW +DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV +d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud +EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v +cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P +AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh +bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD +VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi +fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD +L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN +UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n +ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 +erfutGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +Camerfirma Global Chambersign Root +================================== +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx +NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt +YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg +MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J +1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O +by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl +6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c +8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ +BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j +aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B +Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj +aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y +ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA +PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y +gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ +PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 +IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes +t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +NetLock Notary (Class A) Root +============================= +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI +EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j +ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX +DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH +EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD +VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz +cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM +D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ +z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC +/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 +tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 +4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG +A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC +Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv +bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn +LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 +ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz +IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh +IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu +b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg +Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp +bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 +ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP +ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB +CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr +KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM +8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj +YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH +AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw +Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg +U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 +LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh +cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT +dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC +AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh +3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm +vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk +fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 +fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ +EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl +1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ +lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro +g14= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +Swisscom Root CA 1 +================== +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG +EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy +dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 +MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln +aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC +IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM +MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF +NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe +AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC +b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn +7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN +cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp +WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 +haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY +MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw +HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 +MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn +jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ +MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H +VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl +vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl +OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 +1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq +nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy +x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW +NY6E0F/6MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +DST ACES CA X6 +============== +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT +MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha +MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE +CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI +DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa +pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow +GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy +MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu +Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy +dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU +CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 +5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t +Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs +vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 +oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw +EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN +MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp +c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq +t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C +jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg +vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF +ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR +AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend +jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO +peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR +7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi +GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 +OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm +5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr +44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf +Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m +Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp +mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk +vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf +KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br +NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj +viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT +BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X +DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 +aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG +9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 +N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm ++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH +6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu +MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h +qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 +FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs +ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc +celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X +CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB +tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P +4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F +kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L +3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx +/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa +DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP +e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu +WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ +DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub +DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +WellsSecure Public Root Certificate Authority +============================================= +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM +F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw +NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl +bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD +VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 +iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 +i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 +bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB +K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB +AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu +cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm +lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB +i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww +GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI +K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 +bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj +qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es +E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ +tylv2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +IGC/A +===== +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD +VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE +Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy +MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI +EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT +STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 +TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW +So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy +HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd +frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ +tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB +egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC +iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK +q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q +MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI +lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF +0mBWWg== +-----END CERTIFICATE----- + +Security Communication EV RootCA1 +================================= +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE +BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl +Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO +/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX +WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z +ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 +bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK +9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm +iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG +Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW +mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW +T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE +BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL +EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 +MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz +dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT +GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG +d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N +oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc +QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ +PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb +MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG +IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD +VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 +LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A +dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA +4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg +AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA +egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 +Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO +PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv +c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h +cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw +IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT +WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV +MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp +Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal +HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT +nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE +aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK +yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB +S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 +============================================================================================================================= +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH +DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q +aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry +b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV +BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg +S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 +MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl +IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF +n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl +IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft +dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl +cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO +Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 +xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR +6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd +BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 +N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT +y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh +LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M +dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +Buypass Class 2 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 +MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M +cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 +0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 +0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R +uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV +1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt +7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 +fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w +wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- + +EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 +========================================================================== +-----BEGIN CERTIFICATE----- +MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg +QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe +Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p +ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt +IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by +X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b +gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr +eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ +TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy +Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn +uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI +qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm +ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 +Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW +Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t +FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm +zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k +XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT +bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU +RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK +1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt +2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ +Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 +AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +CNNIC ROOT +========== +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE +ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw +OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD +o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz +VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT +VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or +czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK +y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC +wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S +lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 +Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM +O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 +BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 +G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m +mxE= +-----END CERTIFICATE----- + +ApplicationCA - Japanese Government +=================================== +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT +SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw +MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl +cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 +fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN +wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE +jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu +nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU +WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV +BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD +vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs +o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g +/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD +io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW +dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G3 +============================================= +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz +NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo +YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT +LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j +K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE +c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C +IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu +dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr +2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 +cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE +Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s +t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +thawte Primary Root CA - G2 +=========================== +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC +VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu +IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg +Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV +MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG +b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt +IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS +LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 +8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU +mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN +G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K +rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +thawte Primary Root CA - G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w +ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD +VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG +A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At +P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC ++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY +7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW +vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ +KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK +A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC +8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm +er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G2 +============================================= +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 +OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl +b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG +BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc +KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ +EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m +ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 +npaqBA+K +-----END CERTIFICATE----- + +VeriSign Universal Root Certification Authority +=============================================== +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj +1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP +MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 +9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I +AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR +tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G +CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O +a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 +Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx +Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx +P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P +wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 +mJO37M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G4 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 +b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz +ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo +b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 +Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz +rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw +HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u +Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD +A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx +AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +============================================ +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G2 +================================== +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC +TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l +ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ +5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn +vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj +CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil +e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR +OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI +CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 +48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi +trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 +qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB +AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC +ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA +A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz ++51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj +f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN +kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk +CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF +URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb +CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h +oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV +IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm +66+KAQ== +-----END CERTIFICATE----- + +CA Disig +======== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK +QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw +MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz +bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm +GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD +Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo +hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt +ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w +gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P +AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz +aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff +ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa +BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t +WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 +mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K +ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA +4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- + +Juur-SK +======= +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA +c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw +DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG +SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy +aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf +TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC ++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw +UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa +Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF +MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD +HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh +AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA +cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr +AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw +cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G +A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo +ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL +abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 +IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh +Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 +yyqcjg== +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +ACEDICOM Root +============= +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD +T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 +MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG +A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk +WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD +YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew +MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb +m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk +HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT +xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 +3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 +2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq +TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz +4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU +9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg +aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP +eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk +zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 +ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI +KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq +nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE +I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp +MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o +tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG +EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz +MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu +QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ +03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK +ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU ++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC +PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT +OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK +F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK +0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ +0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB +leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID +AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ +SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG +NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l +Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga +kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q +hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs +g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 +aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 +nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC +ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo +Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z +WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +Chambers of Commerce Root - 2008 +================================ +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy +Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl +ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF +EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl +cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA +XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj +h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ +ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk +NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g +D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 +lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ +0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 +EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI +G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ +BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh +bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh +bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC +CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH +AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 +wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH +3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU +RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 +M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 +YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF +9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK +zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG +nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ +-----END CERTIFICATE----- + +Global Chambersign Root - 2008 +============================== +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx +NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg +Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ +QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf +VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf +XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 +ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB +/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA +TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M +H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe +Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF +HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB +AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT +BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE +BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm +aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm +aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp +1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 +dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG +/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 +ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s +dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg +9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH +foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du +qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr +P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq +c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +Certinomis - Autorité Racine +============================= +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg +LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG +A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw +JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa +wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly +Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw +2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N +jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q +c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC +lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb +xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g +530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna +4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x +WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva +R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 +nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B +CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv +JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE +qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b +WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE +wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ +vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +Root CA Generalitat Valenciana +============================== +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE +ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 +IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 +WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE +CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 +F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B +ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ +D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte +JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB +AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n +dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB +ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl +AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA +YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy +AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt +AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA +YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu +AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA +OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 +dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV +BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S +b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh +TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz +Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 +NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH +iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt ++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +EC-ACC +====== +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE +BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w +ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD +VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE +CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT +BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 +MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt +SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl +Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh +cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK +w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT +ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 +HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a +E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw +0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD +VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 +Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l +dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ +lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa +Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe +l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 +E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D +5EI= +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2011 +======================================================= +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT +O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y +aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT +AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo +IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI +1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa +71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u +8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH +3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ +MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 +MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu +b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt +XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD +/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N +7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM +BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE +AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky +MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz +IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ +wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa +by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 +zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f +YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 +oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l +EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 +hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 +EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 +jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY +iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI +WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 +JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx +K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ +Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC +4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo +2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz +lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem +OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 +vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +Trustis FPS Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 +IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV +BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ +RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk +H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa +cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt +o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA +AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd +BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c +GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC +yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P +8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV +l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl +iB6XzCGcKQENZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ +Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 +dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu +c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv +bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 +aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 +fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm +N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN +Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T +tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX +e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA +2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs +HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib +D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +StartCom Certification Authority G2 +=================================== +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE +ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O +o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG +4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi +Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul +Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs +O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H +vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L +nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS +FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa +z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ +KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk +J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ +JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG +/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc +nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld +blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc +l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm +7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm +obp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +EE Certification Centre Root CA +=============================== +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy +dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw +MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB +UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy +ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM +TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 +rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw +93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN +P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ +MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF +BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj +xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM +lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU +3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM +dcGWxZ0= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2007 +================================================= +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X +DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl +a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN +BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp +bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N +YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv +KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya +KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT +rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC +AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s +Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO +Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb +BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK +poRq0Tl9 +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +PSCProcert +========== +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk +ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ +MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz +dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl +cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw +IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw +MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w +DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD +ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp +Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC +wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA +3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh +RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO +EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2 +0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU +td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw +Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp +r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/ +AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz +Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId +xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp +ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH +EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h +Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k +ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG +9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG +MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG +LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52 +ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy +YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o +dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq +T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN +g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q +uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1 +n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn +FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo +5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq +3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5 +poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y +eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km +-----END CERTIFICATE----- + +China Internet Network Information Center EV Certificates Root +============================================================== +-----BEGIN CERTIFICATE----- +MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D +aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg +Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG +A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM +PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl +cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y +jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV +98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H +klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23 +KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC +7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD +glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5 +0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM +7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws +ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0 +5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8= +-----END CERTIFICATE----- + +Swisscom Root CA 2 +================== +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG +EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy +dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2 +MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln +aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC +IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM +LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo +ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ +wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH +Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a +SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS +NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab +mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY +Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3 +qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw +HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O +BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu +MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO +v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ +82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz +o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs +a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx +OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW +mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o ++sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC +rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX +5OfNeOI5wSsSnqaeG8XmDtkx2Q== +-----END CERTIFICATE----- + +Swisscom Root EV CA 2 +===================== +-----BEGIN CERTIFICATE----- +MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE +BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl +cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN +MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT +HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg +Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz +o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy +Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti +GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li +qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH +Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG +alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa +m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox +bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi +xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED +MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB +bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL +j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU +wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7 +XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH +59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/ +23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq +J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA +HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi +uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW +l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc= +-----END CERTIFICATE----- + +CA Disig Root R1 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy +3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8 +u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2 +m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk +CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa +YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6 +vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL +LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX +ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is +XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ +04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B +LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM +CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb +VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85 +YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS +ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix +lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N +UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ +a7+h89n07eLw4+1knj0vllJPgFOL +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +E-Tugra Certification Authority +=============================== +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w +DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls +ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw +NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx +QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl +cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD +DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd +hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K +CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g +ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ +BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 +E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz +rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq +jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 +dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG +MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK +kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO +XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 +VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo +a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc +dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV +KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT +Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 +8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G +C7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +QuoVadis Root CA 1 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +QuoVadis Root CA 2 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +QuoVadis Root CA 3 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +DigiCert Assured ID Root G2 +=========================== +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +DigiCert Assured ID Root G3 +=========================== +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +DigiCert Global Root G2 +======================= +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +DigiCert Global Root G3 +======================= +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE----- + +DigiCert Trusted Root G4 +======================== +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE----- + +WoSign +====== +-----BEGIN CERTIFICATE----- +MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g +QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ +BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA +vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO +CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX +2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5 +KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR ++ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez +EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk +lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2 +8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY +yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C +AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R +8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 +LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq +T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj +y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC +2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes +5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/ +EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh +mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx +kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi +kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w== +-----END CERTIFICATE----- + +WoSign China +============ +-----BEGIN CERTIFICATE----- +MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv +geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD +VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k +8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5 +uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85 +dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5 +Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy +b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc +76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m ++Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6 +yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX +GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA +A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 +yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY +r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115 +j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A +kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97 +qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y +jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB +ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv +T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO +kI26oQ== +-----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn +dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ +FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ +5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG +x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX +2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL +OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 +sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C +GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 +WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt +rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ +nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg +tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW +sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp +pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA +zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq +ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 +7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz +0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j +Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn +RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O ++T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq +/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE +Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM +lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 +yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ +eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW +FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ +7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ +Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM +8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi +FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi +yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c +J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw +sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl +OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P +AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV +MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF +JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G3 +================================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC +TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l +ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y +olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t +x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy +EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K +Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur +mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 +1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp +07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo +FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE +41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu +yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq +KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 +v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA +8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b +8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r +mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq +1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI +JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV +tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= +-----END CERTIFICATE----- + +Staat der Nederlanden EV Root CA +================================ +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M +MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl +cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk +SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW +O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r +0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 +Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV +XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr +08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV +0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd +74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx +fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa +ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu +c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq +5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN +b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN +f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi +5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 +WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK +DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy +eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== +-----END CERTIFICATE----- + +IdenTrust Commercial Root CA 1 +============================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +IdenTrust Public Sector Root CA 1 +================================= +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy +bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug +b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw +HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT +DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx +OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP +/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz +HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU +s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y +TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 +0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z +iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi +nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ +vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO +e4pIb4tF9g== +-----END CERTIFICATE----- + +Entrust Root Certification Authority - EC1 +========================================== +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx +FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn +YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw +FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs +LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy +AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef +9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h +vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 +kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +CFCA EV ROOT +============ +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 +========================================================= +-----BEGIN CERTIFICATE----- +MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN +BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp +bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg +RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw +ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w +SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE +n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp +ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537 +jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m +ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP +9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV +4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH +HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI +hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo +BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq +URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl +lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8 +B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU= +-----END CERTIFICATE----- + +TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 +========================================================= +-----BEGIN CERTIFICATE----- +MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G +A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls +acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5 +MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL +BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf +aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm +aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a +2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED +wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb +HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV ++DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT +9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R +fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy +o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW +hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1 +O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw== +-----END CERTIFICATE----- + +Certinomis - Root CA +==================== +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg +LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx +EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD +ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos +P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo +d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap +z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00 +8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x +RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE +6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t +FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV +PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH +i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj +YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I +6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV +WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw +Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX +lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ +y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9 +Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng +DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi +I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM +cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr +hkIGuUE= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GB CA +=============================== +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG +EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw +MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds +b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX +scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP +rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk +9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o +Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg +GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI +hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD +dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 +VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui +HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +Certification Authority of WoSign G2 +==================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g +QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx +CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai +XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du +W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9 +5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK +v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI +hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY +P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3 +TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu ++sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+ +7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg= +-----END CERTIFICATE----- + +CA WoSign ECC Root +================== +-----BEGIN CERTIFICATE----- +MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD +TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v +dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK +ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI +zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU +t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw +QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R +MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0 +Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu +a/GRspBl9JrmkO5K +-----END CERTIFICATE----- diff --git a/resources/timezones/windows_timezones.json b/resources/timezones/windows_timezones.json new file mode 100644 --- /dev/null +++ b/resources/timezones/windows_timezones.json @@ -0,0 +1,126 @@ +{ + "Egypt Standard Time": "Africa/Cairo", + "Morocco Standard Time": "Africa/Casablanca", + "South Africa Standard Time": "Africa/Johannesburg", + "W. Central Africa Standard Time": "Africa/Lagos", + "E. Africa Standard Time": "Africa/Nairobi", + "Libya Standard Time": "Africa/Tripoli", + "Namibia Standard Time": "Africa/Windhoek", + "Aleutian Standard Time": "America/Adak", + "Alaskan Standard Time": "America/Anchorage", + "Tocantins Standard Time": "America/Araguaina", + "Paraguay Standard Time": "America/Asuncion", + "Bahia Standard Time": "America/Bahia", + "SA Pacific Standard Time": "America/Bogota", + "Argentina Standard Time": "America/Buenos_Aires", + "Eastern Standard Time (Mexico)": "America/Cancun", + "Venezuela Standard Time": "America/Caracas", + "SA Eastern Standard Time": "America/Cayenne", + "Central Standard Time": "America/Chicago", + "Mountain Standard Time (Mexico)": "America/Chihuahua", + "Central Brazilian Standard Time": "America/Cuiaba", + "Mountain Standard Time": "America/Denver", + "Greenland Standard Time": "America/Godthab", + "Turks And Caicos Standard Time": "America/Grand_Turk", + "Central America Standard Time": "America/Guatemala", + "Atlantic Standard Time": "America/Halifax", + "Cuba Standard Time": "America/Havana", + "US Eastern Standard Time": "America/Indianapolis", + "SA Western Standard Time": "America/La_Paz", + "Pacific Standard Time": "America/Los_Angeles", + "Central Standard Time (Mexico)": "America/Mexico_City", + "Saint Pierre Standard Time": "America/Miquelon", + "Montevideo Standard Time": "America/Montevideo", + "Eastern Standard Time": "America/New_York", + "US Mountain Standard Time": "America/Phoenix", + "Haiti Standard Time": "America/Port-au-Prince", + "Canada Central Standard Time": "America/Regina", + "Pacific SA Standard Time": "America/Santiago", + "E. South America Standard Time": "America/Sao_Paulo", + "Newfoundland Standard Time": "America/St_Johns", + "Pacific Standard Time (Mexico)": "America/Tijuana", + "Central Asia Standard Time": "Asia/Almaty", + "Jordan Standard Time": "Asia/Amman", + "Arabic Standard Time": "Asia/Baghdad", + "Azerbaijan Standard Time": "Asia/Baku", + "SE Asia Standard Time": "Asia/Bangkok", + "Altai Standard Time": "Asia/Barnaul", + "Middle East Standard Time": "Asia/Beirut", + "India Standard Time": "Asia/Calcutta", + "Transbaikal Standard Time": "Asia/Chita", + "Sri Lanka Standard Time": "Asia/Colombo", + "Syria Standard Time": "Asia/Damascus", + "Bangladesh Standard Time": "Asia/Dhaka", + "Arabian Standard Time": "Asia/Dubai", + "West Bank Standard Time": "Asia/Hebron", + "W. Mongolia Standard Time": "Asia/Hovd", + "North Asia East Standard Time": "Asia/Irkutsk", + "Israel Standard Time": "Asia/Jerusalem", + "Afghanistan Standard Time": "Asia/Kabul", + "Russia Time Zone 11": "Asia/Kamchatka", + "Pakistan Standard Time": "Asia/Karachi", + "Nepal Standard Time": "Asia/Katmandu", + "North Asia Standard Time": "Asia/Krasnoyarsk", + "Magadan Standard Time": "Asia/Magadan", + "N. Central Asia Standard Time": "Asia/Novosibirsk", + "Omsk Standard Time": "Asia/Omsk", + "North Korea Standard Time": "Asia/Pyongyang", + "Myanmar Standard Time": "Asia/Rangoon", + "Arab Standard Time": "Asia/Riyadh", + "Sakhalin Standard Time": "Asia/Sakhalin", + "Korea Standard Time": "Asia/Seoul", + "China Standard Time": "Asia/Shanghai", + "Singapore Standard Time": "Asia/Singapore", + "Russia Time Zone 10": "Asia/Srednekolymsk", + "Taipei Standard Time": "Asia/Taipei", + "West Asia Standard Time": "Asia/Tashkent", + "Georgian Standard Time": "Asia/Tbilisi", + "Iran Standard Time": "Asia/Tehran", + "Tokyo Standard Time": "Asia/Tokyo", + "Tomsk Standard Time": "Asia/Tomsk", + "Ulaanbaatar Standard Time": "Asia/Ulaanbaatar", + "Vladivostok Standard Time": "Asia/Vladivostok", + "Yakutsk Standard Time": "Asia/Yakutsk", + "Ekaterinburg Standard Time": "Asia/Yekaterinburg", + "Caucasus Standard Time": "Asia/Yerevan", + "Azores Standard Time": "Atlantic/Azores", + "Cape Verde Standard Time": "Atlantic/Cape_Verde", + "Greenwich Standard Time": "Atlantic/Reykjavik", + "Cen. Australia Standard Time": "Australia/Adelaide", + "E. Australia Standard Time": "Australia/Brisbane", + "AUS Central Standard Time": "Australia/Darwin", + "Aus Central W. Standard Time": "Australia/Eucla", + "Tasmania Standard Time": "Australia/Hobart", + "Lord Howe Standard Time": "Australia/Lord_Howe", + "W. Australia Standard Time": "Australia/Perth", + "AUS Eastern Standard Time": "Australia/Sydney", + "Dateline Standard Time": "Etc/GMT+12", + "Astrakhan Standard Time": "Europe/Astrakhan", + "W. Europe Standard Time": "Europe/Berlin", + "GTB Standard Time": "Europe/Bucharest", + "Central Europe Standard Time": "Europe/Budapest", + "E. Europe Standard Time": "Europe/Chisinau", + "Turkey Standard Time": "Europe/Istanbul", + "Kaliningrad Standard Time": "Europe/Kaliningrad", + "FLE Standard Time": "Europe/Kiev", + "GMT Standard Time": "Europe/London", + "Belarus Standard Time": "Europe/Minsk", + "Russian Standard Time": "Europe/Moscow", + "Romance Standard Time": "Europe/Paris", + "Russia Time Zone 3": "Europe/Samara", + "Central European Standard Time": "Europe/Warsaw", + "Mauritius Standard Time": "Indian/Mauritius", + "Samoa Standard Time": "Pacific/Apia", + "New Zealand Standard Time": "Pacific/Auckland", + "Bougainville Standard Time": "Pacific/Bougainville", + "Chatham Islands Standard Time": "Pacific/Chatham", + "Easter Island Standard Time": "Pacific/Easter", + "Fiji Standard Time": "Pacific/Fiji", + "Central Pacific Standard Time": "Pacific/Guadalcanal", + "Hawaiian Standard Time": "Pacific/Honolulu", + "Line Islands Standard Time": "Pacific/Kiritimati", + "Marquesas Standard Time": "Pacific/Marquesas", + "Norfolk Standard Time": "Pacific/Norfolk", + "West Pacific Standard Time": "Pacific/Port_Moresby", + "Tonga Standard Time": "Pacific/Tongatapu" +} diff --git a/scripts/__init_script__.php b/scripts/__init_script__.php deleted file mode 100644 --- a/scripts/__init_script__.php +++ /dev/null @@ -1,58 +0,0 @@ -setLocale(PhutilLocale::loadLocale('en_US')) - ->setTranslations(PhutilTranslation::getTranslationMapForLocale('en_US')); diff --git a/scripts/build_xhpast.php b/scripts/build_xhpast.php new file mode 100755 --- /dev/null +++ b/scripts/build_xhpast.php @@ -0,0 +1,7 @@ +#!/usr/bin/env php +setTagline(pht('daemon executor')); +$args->setSynopsis(<<parse( + array( + array( + 'name' => 'trace', + 'help' => pht('Enable debug tracing.'), + ), + array( + 'name' => 'trace-memory', + 'help' => pht('Enable debug memory tracing.'), + ), + array( + 'name' => 'verbose', + 'help' => pht('Enable verbose activity logging.'), + ), + array( + 'name' => 'label', + 'short' => 'l', + 'param' => 'label', + 'help' => pht( + 'Optional process label. Makes "%s" nicer, no behavioral effects.', + 'ps'), + ), + array( + 'name' => 'daemon', + 'wildcard' => true, + ), + )); + +$trace_memory = $args->getArg('trace-memory'); +$trace_mode = $args->getArg('trace') || $trace_memory; +$verbose = $args->getArg('verbose'); + +if (function_exists('posix_isatty') && posix_isatty(STDIN)) { + fprintf(STDERR, pht('Reading daemon configuration from stdin...')."\n"); +} +$config = @file_get_contents('php://stdin'); +$config = id(new PhutilJSONParser())->parse($config); + +PhutilTypeSpec::checkMap( + $config, + array( + 'log' => 'optional string|null', + 'argv' => 'optional list', + 'load' => 'optional list', + 'down' => 'optional int', + )); + +$log = idx($config, 'log'); + +if ($log) { + ini_set('error_log', $log); + PhutilErrorHandler::setErrorListener(array('PhutilDaemon', 'errorListener')); +} + +$load = idx($config, 'load', array()); +foreach ($load as $library) { + $library = Filesystem::resolvePath($library); + phutil_load_library($library); +} + +PhutilErrorHandler::initialize(); + +$daemon = $args->getArg('daemon'); +if (!$daemon) { + throw new PhutilArgumentUsageException( + pht('Specify which class of daemon to start.')); +} else if (count($daemon) > 1) { + throw new PhutilArgumentUsageException( + pht('Specify exactly one daemon to start.')); +} else { + $daemon = head($daemon); + if (!class_exists($daemon)) { + throw new PhutilArgumentUsageException( + pht( + 'No class "%s" exists in any known library.', + $daemon)); + } else if (!is_subclass_of($daemon, 'PhutilDaemon')) { + throw new PhutilArgumentUsageException( + pht( + 'Class "%s" is not a subclass of "%s".', + $daemon, + 'PhutilDaemon')); + } +} + +$argv = idx($config, 'argv', array()); +$daemon = newv($daemon, array($argv)); + +if ($trace_mode) { + $daemon->setTraceMode(); +} + +if ($trace_memory) { + $daemon->setTraceMemory(); +} + +if ($verbose) { + $daemon->setVerbose(true); +} + +$down_duration = idx($config, 'down'); +if ($down_duration) { + $daemon->setScaledownDuration($down_duration); +} + +$daemon->execute(); diff --git a/scripts/daemon/launch_daemon.php b/scripts/daemon/launch_daemon.php new file mode 100755 --- /dev/null +++ b/scripts/daemon/launch_daemon.php @@ -0,0 +1,13 @@ +#!/usr/bin/env php +run(); diff --git a/scripts/daemon/torture/resist-death.php b/scripts/daemon/torture/resist-death.php new file mode 100755 --- /dev/null +++ b/scripts/daemon/torture/resist-death.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php + 0) { + ob_end_clean(); + } + + error_reporting(E_ALL | E_STRICT); + + $config_map = array( + // Always display script errors. Without this, they may not appear, which is + // unhelpful when users encounter a problem. On the web this is a security + // concern because you don't want to expose errors to clients, but in a + // script context we always want to show errors. + 'display_errors' => true, + + // Send script error messages to the server's `error_log` setting. + 'log_errors' => true, + + // Set the error log to the default, so errors go to stderr. Without this + // errors may end up in some log, and users may not know where the log is + // or check it. + 'error_log' => null, + + // XDebug raises a fatal error if the call stack gets too deep, but the + // default setting is 100, which we may exceed legitimately with module + // includes (and in other cases, like recursive filesystem operations + // applied to 100+ levels of directory nesting). Stop it from triggering: + // we explicitly limit recursive algorithms which should be limited. + // + // After Feb 2014, XDebug interprets a value of 0 to mean "do not allow any + // function calls". Previously, 0 effectively disabled this check. For + // context, see T5027. + 'xdebug.max_nesting_level' => PHP_INT_MAX, + + // Don't limit memory, doing so just generally just prevents us from + // processing large inputs without many tangible benefits. + 'memory_limit' => -1, + ); + + foreach ($config_map as $config_key => $config_value) { + ini_set($config_key, $config_value); + } + + if (!ini_get('date.timezone')) { + // If the timezone isn't set, PHP issues a warning whenever you try to parse + // a date (like those from Git or Mercurial logs), even if the date contains + // timezone information (like "PST" or "-0700") which makes the + // environmental timezone setting is completely irrelevant. We never rely on + // the system timezone setting in any capacity, so prevent PHP from flipping + // out by setting it to a safe default (UTC) if it isn't set to some other + // value. + date_default_timezone_set('UTC'); + } + + // Adjust `include_path`. + ini_set('include_path', implode(PATH_SEPARATOR, array( + dirname(dirname(__FILE__)).'/externals/includes', + ini_get('include_path'), + ))); + + // Disable the insanely dangerous XML entity loader by default. + if (function_exists('libxml_disable_entity_loader')) { + libxml_disable_entity_loader(true); + } + + // Now, load the library. + + $root = dirname(dirname(dirname(__FILE__))); + require_once $root.'/src/__phutil_library_init__.php'; + + PhutilErrorHandler::initialize(); + + // If "variables_order" excludes "E", silently repair it so that $_ENV has + // the values we expect. + PhutilExecutionEnvironment::repairMissingVariablesOrder(); + + $router = PhutilSignalRouter::initialize(); + + $handler = new PhutilBacktraceSignalHandler(); + $router->installHandler('phutil.backtrace', $handler); + + $handler = new PhutilConsoleMetricsSignalHandler(); + $router->installHandler('phutil.winch', $handler); +} + +__arcanist_init_script__(); \ No newline at end of file diff --git a/scripts/phutil_rebuild_map.php b/scripts/phutil_rebuild_map.php new file mode 100755 --- /dev/null +++ b/scripts/phutil_rebuild_map.php @@ -0,0 +1,78 @@ +#!/usr/bin/env php +setTagline(pht('rebuild the library map file')); +$args->setSynopsis(<<parseStandardArguments(); +$args->parse( + array( + array( + 'name' => 'quiet', + 'help' => pht('Do not write status messages to stderr.'), + ), + array( + 'name' => 'drop-cache', + 'help' => pht( + 'Drop the symbol cache and rebuild the entire map from scratch.'), + ), + array( + 'name' => 'limit', + 'param' => 'N', + 'default' => 8, + 'help' => pht( + 'Controls the number of symbol mapper subprocesses run at once. '. + 'Defaults to 8.'), + ), + array( + 'name' => 'show', + 'help' => pht( + 'Print symbol map to stdout instead of writing it to the map file.'), + ), + array( + 'name' => 'ugly', + 'help' => pht( + 'Use faster but less readable serialization for %s.', + '--show'), + ), + array( + 'name' => 'root', + 'wildcard' => true, + ), + )); + +$root = $args->getArg('root'); +if (count($root) !== 1) { + throw new Exception(pht('Provide exactly one library root!')); +} +$root = Filesystem::resolvePath(head($root)); + +$builder = new PhutilLibraryMapBuilder($root); +$builder->setQuiet($args->getArg('quiet')); +$builder->setSubprocessLimit($args->getArg('limit')); + +if ($args->getArg('drop-cache')) { + $builder->dropSymbolCache(); +} + +if ($args->getArg('show')) { + $library_map = $builder->buildMap(); + + if ($args->getArg('ugly')) { + echo json_encode($library_map); + } else { + echo id(new PhutilJSON())->encodeFormatted($library_map); + } +} else { + $builder->buildAndWriteMap(); +} + +exit(0); diff --git a/scripts/phutil_symbols.php b/scripts/phutil_symbols.php new file mode 100755 --- /dev/null +++ b/scripts/phutil_symbols.php @@ -0,0 +1,586 @@ +#!/usr/bin/env php +setTagline(pht('identify symbols in a PHP source file')); +$args->setSynopsis(<<parseStandardArguments(); +$args->parse( + array( + array( + 'name' => 'all', + 'help' => pht( + 'Report all symbols, including built-ins and declared externals.'), + ), + array( + 'name' => 'ugly', + 'help' => pht('Do not prettify JSON output.'), + ), + array( + 'name' => 'path', + 'wildcard' => true, + 'help' => pht('PHP Source file to analyze.'), + ), + )); + +$paths = $args->getArg('path'); +if (count($paths) !== 1) { + throw new Exception(pht('Specify exactly one path!')); +} +$path = Filesystem::resolvePath(head($paths)); + +$show_all = $args->getArg('all'); + +$source_code = Filesystem::readFile($path); + +try { + $tree = XHPASTTree::newFromData($source_code); +} catch (XHPASTSyntaxErrorException $ex) { + $result = array( + 'error' => $ex->getMessage(), + 'line' => $ex->getErrorLine(), + 'file' => $path, + ); + $json = new PhutilJSON(); + echo $json->encodeFormatted($result); + exit(0); +} + +$root = $tree->getRootNode(); +$root->buildSelectCache(); + +// -( Unsupported Constructs )------------------------------------------------ + +$namespaces = $root->selectDescendantsOfType('n_NAMESPACE'); +foreach ($namespaces as $namespace) { + phutil_fail_on_unsupported_feature($namespace, $path, pht('namespaces')); +} + +$uses = $root->selectDescendantsOfType('n_USE'); +foreach ($namespaces as $namespace) { + phutil_fail_on_unsupported_feature( + $namespace, $path, pht('namespace `%s` statements', 'use')); +} + +$possible_traits = $root->selectDescendantsOfType('n_CLASS_DECLARATION'); +foreach ($possible_traits as $possible_trait) { + $attributes = $possible_trait->getChildByIndex(0); + // Can't use getChildByIndex here because not all classes have attributes + foreach ($attributes->getChildren() as $attribute) { + if (strtolower($attribute->getConcreteString()) === 'trait') { + phutil_fail_on_unsupported_feature($possible_trait, $path, pht('traits')); + } + } +} + + +// -( Marked Externals )------------------------------------------------------ + + +// Identify symbols marked with "@phutil-external-symbol", so we exclude them +// from the dependency list. + +$externals = array(); +$doc_parser = new PhutilDocblockParser(); +foreach ($root->getTokens() as $token) { + if ($token->getTypeName() === 'T_DOC_COMMENT') { + list($block, $special) = $doc_parser->parse($token->getValue()); + + $ext_list = idx($special, 'phutil-external-symbol'); + $ext_list = (array)$ext_list; + $ext_list = array_filter($ext_list); + + foreach ($ext_list as $ext_ref) { + $matches = null; + if (preg_match('/^\s*(\S+)\s+(\S+)/', $ext_ref, $matches)) { + $externals[$matches[1]][$matches[2]] = true; + } + } + } +} + + +// -( Declarations and Dependencies )----------------------------------------- + + +// The first stage of analysis is to find all the symbols we declare in the +// file (like functions and classes) and all the symbols we use in the file +// (like calling functions and invoking classes). Later, we filter this list +// to exclude builtins. + + +$have = array(); // For symbols we declare. +$need = array(); // For symbols we use. +$xmap = array(); // For extended classes and implemented interfaces. + + +// -( Functions )------------------------------------------------------------- + + +// Find functions declared in this file. + +// This is "function f() { ... }". +$functions = $root->selectDescendantsOfType('n_FUNCTION_DECLARATION'); +foreach ($functions as $function) { + $name = $function->getChildByIndex(2); + if ($name->getTypeName() === 'n_EMPTY') { + // This is an anonymous function; don't record it into the symbol + // index. + continue; + } + $have[] = array( + 'type' => 'function', + 'symbol' => $name, + ); +} + + +// Find functions used by this file. Uses: +// +// - Explicit Call +// - String literal passed to call_user_func() or call_user_func_array() +// - String literal in array literal in call_user_func()/call_user_func_array() +// +// TODO: Possibly support these: +// +// - String literal in ReflectionFunction(). + +// This is "f();". +$calls = $root->selectDescendantsOfType('n_FUNCTION_CALL'); +foreach ($calls as $call) { + $name = $call->getChildByIndex(0); + if ($name->getTypeName() === 'n_VARIABLE' || + $name->getTypeName() === 'n_VARIABLE_VARIABLE') { + // Ignore these, we can't analyze them. + continue; + } + if ($name->getTypeName() === 'n_CLASS_STATIC_ACCESS') { + // These are "C::f()", we'll pick this up later on. + continue; + } + $call_name = $name->getConcreteString(); + if ($call_name === 'call_user_func' || + $call_name === 'call_user_func_array') { + $params = $call->getChildByIndex(1)->getChildren(); + if (!count($params)) { + // This is a bare call_user_func() with no arguments; just ignore it. + continue; + } + $symbol = array_shift($params); + $type = 'function'; + $symbol_value = $symbol->getStringLiteralValue(); + $pos = strpos($symbol_value, '::'); + if ($pos) { + $type = 'class'; + $symbol_value = substr($symbol_value, 0, $pos); + } else if ($symbol->getTypeName() === 'n_ARRAY_LITERAL') { + try { + $type = 'class'; + $symbol_value = idx($symbol->evalStatic(), 0); + } catch (Exception $ex) {} + } + if ($symbol_value && strpos($symbol_value, '$') === false) { + $need[] = array( + 'type' => $type, + 'name' => $symbol_value, + 'symbol' => $symbol, + ); + } + } else { + $need[] = array( + 'type' => 'function', + 'symbol' => $name, + ); + } +} + + +// -( Classes )--------------------------------------------------------------- + + +// Find classes declared by this file. + + +// This is "class X ... { ... }". +$classes = $root->selectDescendantsOfType('n_CLASS_DECLARATION'); +foreach ($classes as $class) { + $class_name = $class->getChildByIndex(1); + $have[] = array( + 'type' => 'class', + 'symbol' => $class_name, + ); +} + + +// Find classes used by this file. We identify these: +// +// - class ... extends X +// - new X +// - Static method call +// - Static property access +// - Use of class constant +// - typehints +// - catch +// - instanceof +// - newv() +// +// TODO: Possibly support these: +// +// - String literal in ReflectionClass(). + + +// This is "class X ... { ... }". +$classes = $root->selectDescendantsOfType('n_CLASS_DECLARATION'); +foreach ($classes as $class) { + $class_name = $class->getChildByIndex(1)->getConcreteString(); + $extends = $class->getChildByIndex(2); + foreach ($extends->selectDescendantsOfType('n_CLASS_NAME') as $parent) { + $need[] = array( + 'type' => 'class', + 'symbol' => $parent, + ); + + // Track all 'extends' in the extension map. + $xmap[$class_name][] = $parent->getConcreteString(); + } +} + +// This is "new X()". +$uses_of_new = $root->selectDescendantsOfType('n_NEW'); +foreach ($uses_of_new as $new_operator) { + $name = $new_operator->getChildByIndex(0); + if ($name->getTypeName() === 'n_VARIABLE' || + $name->getTypeName() === 'n_VARIABLE_VARIABLE') { + continue; + } + $need[] = array( + 'type' => 'class', + 'symbol' => $name, + ); +} + +// This covers all of "X::$y", "X::y()" and "X::CONST". +$static_uses = $root->selectDescendantsOfType('n_CLASS_STATIC_ACCESS'); +foreach ($static_uses as $static_use) { + $name = $static_use->getChildByIndex(0); + if ($name->getTypeName() !== 'n_CLASS_NAME') { + continue; + } + $need[] = array( + 'type' => 'class', + 'symbol' => $name, + ); +} + +// This is "function (X $x)". +$parameters = $root->selectDescendantsOfType('n_DECLARATION_PARAMETER'); +foreach ($parameters as $parameter) { + $hint = $parameter->getChildByIndex(0); + if ($hint->getTypeName() !== 'n_CLASS_NAME') { + continue; + } + $need[] = array( + 'type' => 'class/interface', + 'symbol' => $hint, + ); +} + +$returns = $root->selectDescendantsOfType('n_DECLARATION_RETURN'); +foreach ($returns as $return) { + $hint = $return->getChildByIndex(0); + if ($hint->getTypeName() !== 'n_CLASS_NAME') { + continue; + } + $need[] = array( + 'type' => 'class/interface', + 'symbol' => $hint, + ); +} + +// This is "catch (Exception $ex)". +$catches = $root->selectDescendantsOfType('n_CATCH'); +foreach ($catches as $catch) { + $need[] = array( + 'type' => 'class/interface', + 'symbol' => $catch->getChildOfType(0, 'n_CLASS_NAME'), + ); +} + +// This is "$x instanceof X". +$instanceofs = $root->selectDescendantsOfType('n_BINARY_EXPRESSION'); +foreach ($instanceofs as $instanceof) { + $operator = $instanceof->getChildOfType(1, 'n_OPERATOR'); + if ($operator->getConcreteString() !== 'instanceof') { + continue; + } + $class = $instanceof->getChildByIndex(2); + if ($class->getTypeName() !== 'n_CLASS_NAME') { + continue; + } + $need[] = array( + 'type' => 'class/interface', + 'symbol' => $class, + ); +} + +// This is "newv('X')". +$calls = $root->selectDescendantsOfType('n_FUNCTION_CALL'); +foreach ($calls as $call) { + $call_name = $call->getChildByIndex(0)->getConcreteString(); + if ($call_name !== 'newv') { + continue; + } + $params = $call->getChildByIndex(1)->getChildren(); + if (!count($params)) { + continue; + } + $symbol = reset($params); + $symbol_value = $symbol->getStringLiteralValue(); + if ($symbol_value && strpos($symbol_value, '$') === false) { + $need[] = array( + 'type' => 'class', + 'name' => $symbol_value, + 'symbol' => $symbol, + ); + } +} + + +// -( Interfaces )------------------------------------------------------------ + + +// Find interfaces declared in this file. + + +// This is "interface X .. { ... }". +$interfaces = $root->selectDescendantsOfType('n_INTERFACE_DECLARATION'); +foreach ($interfaces as $interface) { + $interface_name = $interface->getChildByIndex(1); + $have[] = array( + 'type' => 'interface', + 'symbol' => $interface_name, + ); +} + + +// Find interfaces used by this file. We identify these: +// +// - class ... implements X +// - interface ... extends X + + +// This is "class X ... { ... }". +$classes = $root->selectDescendantsOfType('n_CLASS_DECLARATION'); +foreach ($classes as $class) { + $class_name = $class->getChildByIndex(1)->getConcreteString(); + $implements = $class->getChildByIndex(3); + $interfaces = $implements->selectDescendantsOfType('n_CLASS_NAME'); + foreach ($interfaces as $interface) { + $need[] = array( + 'type' => 'interface', + 'symbol' => $interface, + ); + + // Track 'class ... implements' in the extension map. + $xmap[$class_name][] = $interface->getConcreteString(); + } +} + + +// This is "interface X ... { ... }". +$interfaces = $root->selectDescendantsOfType('n_INTERFACE_DECLARATION'); +foreach ($interfaces as $interface) { + $interface_name = $interface->getChildByIndex(1)->getConcreteString(); + + $extends = $interface->getChildByIndex(2); + foreach ($extends->selectDescendantsOfType('n_CLASS_NAME') as $parent) { + $need[] = array( + 'type' => 'interface', + 'symbol' => $parent, + ); + + // Track 'interface ... extends' in the extension map. + $xmap[$interface_name][] = $parent->getConcreteString(); + } +} + + +// -( Analysis )-------------------------------------------------------------- + + +$declared_symbols = array(); +foreach ($have as $key => $spec) { + $name = $spec['symbol']->getConcreteString(); + $declared_symbols[$spec['type']][$name] = $spec['symbol']->getOffset(); +} + +$required_symbols = array(); +foreach ($need as $key => $spec) { + $name = idx($spec, 'name'); + if (!$name) { + $name = $spec['symbol']->getConcreteString(); + } + + $type = $spec['type']; + foreach (explode('/', $type) as $libtype) { + if (!$show_all) { + if (!empty($externals[$libtype][$name])) { + // Ignore symbols declared as externals. + continue 2; + } + if (!empty($builtins[$libtype][$name])) { + // Ignore symbols declared as builtins. + continue 2; + } + } + if (!empty($declared_symbols[$libtype][$name])) { + // We declare this symbol, so don't treat it as a requirement. + continue 2; + } + } + if (!empty($required_symbols[$type][$name])) { + // Report only the first use of a symbol, since reporting all of them + // isn't terribly informative. + continue; + } + $required_symbols[$type][$name] = $spec['symbol']->getOffset(); +} + +$result = array( + 'have' => $declared_symbols, + 'need' => $required_symbols, + 'xmap' => $xmap, +); + + +// -( Output )---------------------------------------------------------------- + + +if ($args->getArg('ugly')) { + echo json_encode($result); +} else { + $json = new PhutilJSON(); + echo $json->encodeFormatted($result); +} + + +// -( Library )--------------------------------------------------------------- + +function phutil_fail_on_unsupported_feature(XHPASTNode $node, $file, $what) { + $line = $node->getLineNumber(); + $message = phutil_console_wrap( + pht( + '`%s` has limited support for features introduced after PHP 5.2.3. '. + 'This library uses an unsupported feature (%s) on line %d of %s.', + 'arc liberate', + $what, + $line, + Filesystem::readablePath($file))); + + $result = array( + 'error' => $message, + 'line' => $line, + 'file' => $file, + ); + $json = new PhutilJSON(); + echo $json->encodeFormatted($result); + exit(0); +} + +function phutil_symbols_get_builtins() { + $builtin = array(); + $builtin['classes'] = get_declared_classes(); + $builtin['interfaces'] = get_declared_interfaces(); + + $funcs = get_defined_functions(); + $builtin['functions'] = $funcs['internal']; + + $compat = json_decode( + file_get_contents( + dirname(__FILE__).'/../resources/php_compat_info.json'), + true); + + foreach (array('functions', 'classes', 'interfaces') as $type) { + // Developers may not have every extension that a library potentially uses + // installed. We supplement the list of declared functions and classes with + // a list of known extension functions to avoid raising false positives just + // because you don't have pcntl, etc. + $extensions = array_keys($compat[$type]); + $builtin[$type] = array_merge($builtin[$type], $extensions); + } + + return array( + 'class' => array_fill_keys($builtin['classes'], true) + array( + 'static' => true, + 'parent' => true, + 'self' => true, + + 'PhutilBootloader' => true, + + // PHP7 defines these new parent classes of "Exception", but they do not + // exist prior to PHP7. It's possible to use them safely in PHP5, in + // some cases, to write code which is compatible with either PHP5 or + // PHP7, but it's hard for us tell if a particular use is safe or not. + // For now, assume users know what they're doing and that uses are safe. + // For discussion, see T12855. + 'Throwable' => true, + 'Error' => true, + 'ParseError' => true, + + // PHP7 types. + 'bool' => true, + 'float' => true, + 'int' => true, + 'string' => true, + 'iterable' => true, + 'object' => true, + 'void' => true, + ), + 'function' => array_filter( + array( + 'empty' => true, + 'isset' => true, + 'die' => true, + + // These are provided by libphutil but not visible in the map. + + 'phutil_is_windows' => true, + 'phutil_load_library' => true, + 'phutil_is_hiphop_runtime' => true, + + // HPHP/i defines these functions as 'internal', but they are NOT + // builtins and do not exist in vanilla PHP. Make sure we don't mark + // them as builtin since we need to add dependencies for them. + 'idx' => false, + 'id' => false, + ) + array_fill_keys($builtin['functions'], true)), + 'interface' => array_fill_keys($builtin['interfaces'], true), + ); +} diff --git a/scripts/test/deferred_log.php b/scripts/test/deferred_log.php new file mode 100755 --- /dev/null +++ b/scripts/test/deferred_log.php @@ -0,0 +1,9 @@ +#!/usr/bin/env php +setTagline(pht('test syntax highlighters')); +$args->setSynopsis(<<parseStandardArguments(); +$args->parse( + array( + array( + 'name' => 'language', + 'param' => 'language', + 'help' => pht('Choose the highlight language.'), + ), + )); + +$language = $args->getArg('language'); +$corpus = file_get_contents('php://stdin'); + +echo id(new PhutilDefaultSyntaxHighlighterEngine()) + ->setConfig('pygments.enabled', true) + ->highlightSource($language, $corpus); diff --git a/scripts/test/http.php b/scripts/test/http.php new file mode 100755 --- /dev/null +++ b/scripts/test/http.php @@ -0,0 +1,45 @@ +#!/usr/bin/env php +parseStandardArguments(); +$args->parse( + array( + array( + 'name' => 'attach', + 'param' => 'file', + 'help' => pht('Attach a file to the request.'), + ), + array( + 'name' => 'url', + 'wildcard' => true, + ), + )); + +$uri = $args->getArg('url'); +if (count($uri) !== 1) { + throw new PhutilArgumentUsageException( + pht('Specify exactly one URL to retrieve.')); +} +$uri = head($uri); + +$method = 'GET'; +$data = ''; +$timeout = 30; + +$future = id(new HTTPSFuture($uri, $data)) + ->setMethod($method) + ->setTimeout($timeout); + +$attach_file = $args->getArg('attach'); +if ($attach_file !== null) { + $future->attachFileData( + 'file', + Filesystem::readFile($attach_file), + basename($attach_file), + Filesystem::getMimeType($attach_file)); +} + +print_r($future->resolve()); diff --git a/scripts/test/interactive_editor.php b/scripts/test/interactive_editor.php new file mode 100755 --- /dev/null +++ b/scripts/test/interactive_editor.php @@ -0,0 +1,59 @@ +#!/usr/bin/env php +setTagline(pht('test %s class', 'InteractiveEditor')); +$args->setSynopsis(<<parseStandardArguments(); +$args->parse( + array( + array( + 'name' => 'fallback', + 'param' => 'editor', + 'help' => pht('Set the fallback editor.'), + ), + array( + 'name' => 'line', + 'short' => 'l', + 'param' => 'number', + 'help' => pht('Open at line number __number__.'), + ), + array( + 'name' => 'name', + 'param' => 'filename', + 'help' => pht('Set edited file name.'), + ), + )); + +if ($args->getArg('help')) { + $args->printHelpAndExit(); +} + +$editor = new PhutilInteractiveEditor( + pht("The wizard quickly\njinxed the gnomes\nbefore they vaporized.")); + +$name = $args->getArg('name'); +if ($name) { + $editor->setName($name); +} + +$line = $args->getArg('line'); +if ($line) { + $editor->setLineOffset($line); +} + +$fallback = $args->getArg('fallback'); +if ($fallback) { + $editor->setFallbackEditor($fallback); +} + +$result = $editor->editInteractively(); +echo pht('Edited Text:')."\n{$result}\n"; diff --git a/scripts/test/lipsum.php b/scripts/test/lipsum.php new file mode 100755 --- /dev/null +++ b/scripts/test/lipsum.php @@ -0,0 +1,46 @@ +#!/usr/bin/env php +setTagline(pht('test context-free grammars')); +$args->setSynopsis(<<parseStandardArguments(); +$args->parse( + array( + array( + 'name' => 'class', + 'wildcard' => true, + ), + )); + +$class = $args->getArg('class'); +if (count($class) !== 1) { + $args->printHelpAndExit(); +} +$class = reset($class); + +$symbols = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhutilContextFreeGrammar') + ->execute(); + +$symbols = ipull($symbols, 'name', 'name'); + +if (empty($symbols[$class])) { + $available = implode(', ', array_keys($symbols)); + throw new PhutilArgumentUsageException( + pht( + "Class '%s' is not a defined, concrete subclass of %s. ". + "Available classes are: %s", + $class, + 'PhutilContextFreeGrammar', + $available)); +} + +$object = newv($class, array()); +echo $object->generate()."\n"; diff --git a/scripts/test/mime.php b/scripts/test/mime.php new file mode 100755 --- /dev/null +++ b/scripts/test/mime.php @@ -0,0 +1,40 @@ +#!/usr/bin/env php +setTagline(pht('test %s', 'Filesystem::getMimeType()')); +$args->setSynopsis(<<parseStandardArguments(); +$args->parse( + array( + array( + 'name' => 'default', + 'param' => 'mimetype', + 'help' => pht( + 'Use __mimetype__ as default instead of built-in default.'), + ), + array( + 'name' => 'file', + 'wildcard' => true, + ), + )); + +$file = $args->getArg('file'); +if (count($file) !== 1) { + $args->printHelpAndExit(); +} + +$file = reset($file); + +$default = $args->getArg('default'); +if ($default) { + echo Filesystem::getMimeType($file, $default)."\n"; +} else { + echo Filesystem::getMimeType($file)."\n"; +} diff --git a/scripts/test/paypal.php b/scripts/test/paypal.php new file mode 100755 --- /dev/null +++ b/scripts/test/paypal.php @@ -0,0 +1,24 @@ +#!/usr/bin/env php +setHost('https://api-3t.sandbox.paypal.com/nvp') + ->setAPIUsername('sdk-three_api1.sdk.com') + ->setAPIPassword('QFZCWN5HZM8VBG7Q') + ->setAPISignature('A-IzJhZZjhg29XQ2qnhapuwxIDzyAZQ92FRP5dqBzVesOkzbdUONzmOU'); + +$future->setRawPayPalQuery( + 'SetExpressCheckout', + array( + 'PAYMENTREQUEST_0_AMT' => '1.23', + 'PAYMENTREQUEST_0_CURRENCYCODE' => 'USD', + 'RETURNURL' => 'http://www.example.com/?return=1', + 'CANCELURL' => 'http://www.example.com/?cancel=1', + 'PAYMENTREQUEST_0_PAYMENTACTION' => 'Sale', + )); + +print_r($future->resolve()); diff --git a/scripts/test/progress_bar.php b/scripts/test/progress_bar.php new file mode 100755 --- /dev/null +++ b/scripts/test/progress_bar.php @@ -0,0 +1,71 @@ +#!/usr/bin/env php +parseStandardArguments(); + +echo pht( + "PROGRESS BAR TEST SCRIPT\n\n". + "This script is a test script for `%s`. It will draw some progress bars, ". + "and generally allow you to test bar behaviors and changes.", + 'PhutilConsoleProgressBar'); +echo "\n\n"; +echo pht( + "GENERAL NOTES\n\n". + " - When run as `%s`, no progress bars should be shown ". + "(stderr is not a tty).\n". + " - When run in a narrow terminal, the bar should resize automatically ". + "to fit the terminal.\n". + " - When run with `%s`, the bar should not be drawn.\n", + 'php -f progress_bar.php 2>&1 | more', + '--trace'); +echo "\n\n"; + +echo pht('STANDARD PROGRESS BAR')."\n"; +$n = 80; +$bar = id(new PhutilConsoleProgressBar()) + ->setTotal($n); +for ($ii = 0; $ii < $n; $ii++) { + $bar->update(1); + usleep(10000); +} +$bar->done(); + +echo "\n".pht( + "INTERRUPTED PROGRESS BAR\n". + "This bar will be interrupted by an exception.\n". + "It should clean itself up.")."\n"; +try { + run_interrupt_bar(); +} catch (Exception $ex) { + echo pht('Caught exception!')."\n"; +} + +echo "\n".pht( + "RESIZING BARS\n". + "If you resize the window while a progress bars draws, it should more or ". + "less detect the change."); + +$n = 1024; +$bar = id(new PhutilConsoleProgressBar()) + ->setTotal($n); +for ($ii = 0; $ii < $n; $ii++) { + $bar->update(1); + usleep(10000); +} +$bar->done(); + +function run_interrupt_bar() { + $bar = id(new PhutilConsoleProgressBar()) + ->setTotal(100); + + for ($ii = 0; $ii < 100; $ii++) { + if ($ii === 20) { + throw new Exception(pht('Boo!')); + } + $bar->update(1); + usleep(10000); + } +} diff --git a/scripts/test/prompt.php b/scripts/test/prompt.php new file mode 100755 --- /dev/null +++ b/scripts/test/prompt.php @@ -0,0 +1,35 @@ +#!/usr/bin/env php +setTagline(pht('test console prompting')); +$args->setSynopsis(<<parseStandardArguments(); +$args->parse( + array( + array( + 'name' => 'history', + 'param' => 'file', + 'default' => '', + 'help' => pht('Use specified history __file__.'), + ), + array( + 'name' => 'prompt', + 'param' => 'text', + 'default' => pht('Enter some text:'), + 'help' => pht('Change the prompt text to __text__.'), + ), + )); + +$result = phutil_console_prompt( + $args->getArg('prompt'), + $args->getArg('history')); + +$console = PhutilConsole::getConsole(); +$console->writeOut("%s\n", pht('Input is: %s', $result)); diff --git a/scripts/test/service_profiler.php b/scripts/test/service_profiler.php new file mode 100755 --- /dev/null +++ b/scripts/test/service_profiler.php @@ -0,0 +1,15 @@ +#!/usr/bin/env php +getServiceCallLog()); diff --git a/scripts/timezones/generate_windows_timezone_map.php b/scripts/timezones/generate_windows_timezone_map.php new file mode 100755 --- /dev/null +++ b/scripts/timezones/generate_windows_timezone_map.php @@ -0,0 +1,46 @@ +#!/usr/bin/env php +windowsZones->mapTimezones->mapZone; +foreach ($zones as $zone) { + $windows_name = (string)$zone['other']; + $target_name = (string)$zone['type']; + + // Ignore the offset-based timezones from the CLDR map, since we handle + // these later. + if (isset($ignore[$windows_name])) { + continue; + } + + // We've already seen this timezone so we don't need to add it to the map + // again. + if (isset($result_map[$windows_name])) { + continue; + } + + $result_map[$windows_name] = $target_name; +} + +asort($result_map); + +echo id(new PhutilJSON()) + ->encodeFormatted($result_map); diff --git a/scripts/update_compat_info.php b/scripts/update_compat_info.php new file mode 100755 --- /dev/null +++ b/scripts/update_compat_info.php @@ -0,0 +1,140 @@ +#!/usr/bin/env php + + * @return map + */ +function parse_compat_info(array $compat) { + return array( + 'ext.name' => $compat['ext.name'], + 'ext.min' => nonempty($compat['ext.min'], null), + 'ext.max' => nonempty($compat['ext.max'], null), + 'php.min' => nonempty($compat['php.min'], null), + 'php.max' => nonempty($compat['php.max'], null), + ); +} + +$client = new \Bartlett\Reflect\Client(); +$api = $client->api('reference'); + +foreach ($api->dir() as $extension) { + $result = $api->show( + $extension->name, + false, + false, + false, + true, + true, + true, + true, + true); + + foreach ($result['constants'] as $constant => $compat) { + $output['constants'][$constant] = parse_compat_info($compat); + } + + foreach ($result['functions'] as $function => $compat) { + $output['functions'][$function] = parse_compat_info($compat); + + if (idx($compat, 'parameters')) { + $output['params'][$function] = explode(', ', $compat['parameters']); + } + } + + foreach ($result['classes'] as $class => $compat) { + $output['classes'][$class] = parse_compat_info($compat); + } + + foreach ($result['interfaces'] as $interface => $compat) { + $output['interfaces'][$interface] = parse_compat_info($compat); + } + + foreach ($result['methods'] as $class => $methods) { + $output['methods'][$class] = array(); + + foreach ($methods as $method => $compat) { + $output['methods'][$class][$method] = parse_compat_info($compat); + } + } + + foreach ($result['static methods'] as $class => $methods) { + $output['static_methods'][$class] = array(); + + foreach ($methods as $method => $compat) { + $output['static_methods'][$class][$method] = parse_compat_info($compat); + } + } +} + +ksort($output['params']); +ksort($output['functions']); +ksort($output['classes']); +ksort($output['interfaces']); +ksort($output['constants']); + +// Grepped from PHP Manual. +// TODO: Can we get this from PHP CompatInfo? +// See https://github.com/llaville/php-compat-info/issues/185. +$output['functions_windows'] = array( + 'apache_child_terminate' => false, + 'chroot' => false, + 'getrusage' => false, + 'imagecreatefromxpm' => false, + 'lchgrp' => false, + 'lchown' => false, + 'nl_langinfo' => false, + 'strptime' => false, + 'sys_getloadavg' => false, + 'checkdnsrr' => '5.3.0', + 'dns_get_record' => '5.3.0', + 'fnmatch' => '5.3.0', + 'getmxrr' => '5.3.0', + 'getopt' => '5.3.0', + 'imagecolorclosesthwb' => '5.3.0', + 'inet_ntop' => '5.3.0', + 'inet_pton' => '5.3.0', + 'link' => '5.3.0', + 'linkinfo' => '5.3.0', + 'readlink' => '5.3.0', + 'socket_create_pair' => '5.3.0', + 'stream_socket_pair' => '5.3.0', + 'symlink' => '5.3.0', + 'time_nanosleep' => '5.3.0', + 'time_sleep_until' => '5.3.0', +); + +Filesystem::writeFile( + phutil_get_library_root('phutil').'/../'.$target, + id(new PhutilJSON())->encodeFormatted($output)); + +echo pht('Done.')."\n"; diff --git a/scripts/utils/aws-s3.php b/scripts/utils/aws-s3.php new file mode 100755 --- /dev/null +++ b/scripts/utils/aws-s3.php @@ -0,0 +1,22 @@ +#!/usr/bin/env php +setTagline(pht('AWS CLI Client for S3')); +$args->setSynopsis(<<parseStandardArguments(); + +$workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhutilAWSS3ManagementWorkflow') + ->execute(); + +$workflows[] = new PhutilHelpArgumentWorkflow(); +$args->parseWorkflows($workflows); diff --git a/scripts/utils/directory_fixture.php b/scripts/utils/directory_fixture.php new file mode 100755 --- /dev/null +++ b/scripts/utils/directory_fixture.php @@ -0,0 +1,94 @@ +#!/usr/bin/env php +setTagline(pht('edit directory fixtures')); +$args->setSynopsis(<<parseStandardArguments(); +$args->parse(array( + array( + 'name' => 'create', + 'help' => pht('Create a new fixture.'), + ), + array( + 'name' => 'read-only', + 'help' => pht('Do not save changes made to the fixture.'), + ), + array( + 'name' => 'files', + 'wildcard' => true, + ), +)); + +$is_create = $args->getArg('create'); +$is_read_only = $args->getArg('read-only'); +$console = PhutilConsole::getConsole(); + +$files = $args->getArg('files'); +if (count($files) !== 1) { + throw new PhutilArgumentUsageException( + pht('Specify exactly one file to create or edit.')); +} +$file = head($files); + +if ($is_create) { + if (Filesystem::pathExists($file)) { + throw new PhutilArgumentUsageException( + pht( + 'File "%s" already exists, so you can not %s it.', + $file, + '--create')); + } + $fixture = PhutilDirectoryFixture::newEmptyFixture(); +} else { + if (!Filesystem::pathExists($file)) { + throw new PhutilArgumentUsageException( + pht( + 'File "%s" does not exist! Use %s to create a new fixture.', + $file, + '--create')); + } + $fixture = PhutilDirectoryFixture::newFromArchive($file); +} + +$console->writeOut( + "%s\n\n", + pht('Spawning an interactive shell. Working directory is:')); +$console->writeOut( + " %s\n\n", + $fixture->getPath()); +if ($is_read_only) { + $console->writeOut( + "%s\n", + pht('Exit the shell when done (this fixture is read-only).')); +} else { + $console->writeOut( + "%s\n", + pht('Exit the shell after making changes.')); +} + +$err = phutil_passthru('cd %s && sh', $fixture->getPath()); +if ($err) { + $console->writeOut( + "%s\n", + pht('Shell exited with error %d, discarding changes.', $err)); + exit($err); +} else if ($is_read_only) { + $console->writeOut( + "%s\n", + pht('Invoked in read-only mode, discarding changes.')); +} else { + $console->writeOut("%s\n", pht('Updating archive...')); + $fixture->saveToArchive($file); + $console->writeOut("%s\n", pht('Done.')); +} diff --git a/scripts/utils/lock.php b/scripts/utils/lock.php new file mode 100755 --- /dev/null +++ b/scripts/utils/lock.php @@ -0,0 +1,82 @@ +#!/usr/bin/env php +setTagline(pht('acquire and hold a lockfile')); +$args->setSynopsis(<<parseStandardArguments(); +$args->parse(array( + array( + 'name' => 'test', + 'help' => pht('Instead of holding the lock, release it and exit.'), + ), + array( + 'name' => 'hold', + 'help' => pht('Hold indefinitely without prompting.'), + ), + array( + 'name' => 'wait', + 'param' => 'n', + 'help' => pht('Block for up to __n__ seconds waiting for the lock.'), + 'default' => 0, + ), + array( + 'name' => 'file', + 'wildcard' => true, + ), +)); + + +$file = $args->getArg('file'); +if (count($file) !== 1) { + $args->printHelpAndExit(); +} +$file = head($file); + +$console = PhutilConsole::getConsole(); +$console->writeOut( + "%s\n", + pht('This process has PID %d. Acquiring lock...', getmypid())); + +$lock = PhutilFileLock::newForPath($file); + +try { + $lock->lock($args->getArg('wait')); +} catch (PhutilFileLockException $ex) { + $console->writeOut( + "**%s** %s\n", + pht('UNABLE TO ACQUIRE LOCK:'), + pht('Lock is already held.')); + exit(1); +} + +// NOTE: This string is magic, the unit tests look for it. +$console->writeOut("%s\n", pht('LOCK ACQUIRED')); +if ($args->getArg('test')) { + $lock->unlock(); + exit(0); +} + +if ($args->getArg('hold')) { + while (true) { + sleep(1); + } +} + +while (!$console->confirm(pht('Release lock?'))) { + // Keep asking until they say yes. +} + +$console->writeOut("%s\n", pht('Unlocking...')); +$lock->unlock(); + +$console->writeOut("%s\n", pht('Done.')); +exit(0); diff --git a/scripts/utils/prosediff.php b/scripts/utils/prosediff.php new file mode 100755 --- /dev/null +++ b/scripts/utils/prosediff.php @@ -0,0 +1,50 @@ +#!/usr/bin/env php +setTagline(pht('show prose differences')); +$args->setSynopsis(<<parseStandardArguments(); +$args->parse( + array( + array( + 'name' => 'files', + 'wildcard' => true, + ), + )); + +$files = $args->getArg('files'); +if (count($files) !== 2) { + $args->printHelpAndExit(); +} +$old_file = head($files); +$new_file = last($files); + +$old_data = Filesystem::readFile($old_file); +$new_data = Filesystem::readFile($new_file); + +$engine = new PhutilProseDifferenceEngine(); + +$prose_diff = $engine->getDiff($old_data, $new_data); + +foreach ($prose_diff->getParts() as $part) { + switch ($part['type']) { + case '-': + echo tsprintf('%B', $part['text']); + break; + case '+': + echo tsprintf('%B', $part['text']); + break; + case '=': + echo tsprintf('%B', $part['text']); + break; + } +} diff --git a/scripts/utils/utf8.php b/scripts/utils/utf8.php new file mode 100755 --- /dev/null +++ b/scripts/utils/utf8.php @@ -0,0 +1,170 @@ +#!/usr/bin/env php +setTagline(pht('utf8 charset test script')); +$args->setSynopsis(<<parseStandardArguments(); +$args->parse(array( + array( + 'name' => 'context', + 'short' => 'C', + 'param' => 'lines', + 'default' => 3, + 'help' => pht( + 'Show __lines__ lines of context instead of the default 3.'), + 'conflicts' => array( + 'test' => pht('with %s, context is not shown.', '--test'), + ), + ), + array( + 'name' => 'test', + 'short' => 't', + 'help' => pht('Print file names containing invalid UTF-8 to stdout.'), + ), + array( + 'name' => 'files', + 'wildcard' => true, + ), +)); + + +$is_test = $args->getArg('test'); +$context = $args->getArg('context'); +$files = $args->getArg('files'); + +if (empty($files)) { + $args->printHelpAndExit(); +} + +if ($is_test) { + $err = test($files); +} else { + $err = show($files, $context); +} +exit($err); + + +function read($file) { + if ($file === '-') { + return file_get_contents('php://stdin'); + } else { + return Filesystem::readFile($file); + } +} + +function name($file) { + if ($file === '-') { + return 'stdin'; + } else { + return $file; + } +} + +function test(array $files) { + foreach ($files as $file) { + $data = read($file); + if (!phutil_is_utf8($data)) { + echo name($file)."\n"; + } + } + + return 0; +} + +function show(array $files, $context) { + foreach ($files as $file) { + $data = read($file); + $ok = phutil_is_utf8($data); + if ($ok) { + echo pht('OKAY'); + } else { + echo pht('FAIL'); + } + echo ' '.name($file)."\n"; + + if (!$ok) { + $lines = explode("\n", $data); + $len = count($lines); + $map = array(); + $bad = array(); + foreach ($lines as $n => $line) { + if (phutil_is_utf8($line)) { + continue; + } + $bad[$n] = true; + for ($jj = max(0, $n - $context); + $jj < min($len, $n + 1 + $context); + $jj++) { + $map[$jj] = true; + } + } + + $width = strlen(max(array_keys($map))); + + // Set $last such that we print a newline on the first iteration through + // the loop. + $last = -2; + foreach ($map as $idx => $ignored) { + if ($idx !== $last + 1) { + echo "\n"; + } + $last = $idx; + + $line = $lines[$idx]; + if (!empty($bad[$idx])) { + $line = show_problems($line); + } + + printf(" % {$width}d %s\n", $idx + 1, $line); + } + echo "\n"; + } + } + + return 0; +} + +function show_problems($line) { + $regex = + "/^(". + "[\x01-\x7F]+". + "|([\xC2-\xDF][\x80-\xBF])". + "|([\xE0-\xEF][\x80-\xBF][\x80-\xBF])". + "|([\xF0-\xF4][\x80-\xBF][\x80-\xBF][\x80-\xBF]))/"; + + $out = ''; + while (strlen($line)) { + $match = null; + if (preg_match($regex, $line, $match)) { + $out .= $match[1]; + $line = substr($line, strlen($match[1])); + } else { + $chr = sprintf('<0x%0X>', ord($line[0])); + $chr = phutil_console_format('##%s##', $chr); + $out .= $chr; + $line = substr($line, 1); + } + } + + return $out; +} diff --git a/src/__phutil_library_init__.php b/src/__phutil_library_init__.php --- a/src/__phutil_library_init__.php +++ b/src/__phutil_library_init__.php @@ -1,3 +1,70 @@ setType('class') + ->setName($class_name) + ->selectAndLoadSymbols(); + + if (!$symbols) { + throw new PhutilMissingSymbolException( + $class_name, + pht('class or interface'), + pht( + "the class or interface '%s' is not defined in the library ". + "map for any loaded %s library.", + $class_name, + 'phutil')); + } + } catch (PhutilMissingSymbolException $ex) { + $should_throw = true; + + foreach (debug_backtrace() as $backtrace) { + if (empty($backtrace['function'])) { + continue; + } + + switch ($backtrace['function']) { + case 'class_exists': + case 'interface_exists': + case 'method_exists': + case 'property_exists': + case 'trait_exists': + $should_throw = false; + break; + } + } + + if (!$should_throw) { + return false; + } + + // If there are other SPL autoloaders installed, we need to give them a + // chance to load the class. Throw the exception if we're the last + // autoloader; if not, swallow it and let them take a shot. + $autoloaders = spl_autoload_functions(); + $last = end($autoloaders); + if ($last == __FUNCTION__) { + throw $ex; + } + } +} + +spl_autoload_register('__phutil_autoload', $throw = true); + phutil_register_library('arcanist', __FILE__); diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -9,6 +9,486 @@ phutil_register_library_map(array( '__library_version__' => 2, 'class' => array( + 'AASTNode' => 'parser/aast/api/AASTNode.php', + 'AASTNodeList' => 'parser/aast/api/AASTNodeList.php', + 'AASTToken' => 'parser/aast/api/AASTToken.php', + 'AASTTree' => 'parser/aast/api/AASTTree.php', + 'AbstractDirectedGraph' => 'utils/AbstractDirectedGraph.php', + 'AbstractDirectedGraphTestCase' => 'utils/__tests__/AbstractDirectedGraphTestCase.php', + 'AphrontAccessDeniedQueryException' => 'aphront/storage/exception/AphrontAccessDeniedQueryException.php', + 'AphrontBaseMySQLDatabaseConnection' => 'aphront/storage/connection/mysql/AphrontBaseMySQLDatabaseConnection.php', + 'AphrontCharacterSetQueryException' => 'aphront/storage/exception/AphrontCharacterSetQueryException.php', + 'AphrontConnectionLostQueryException' => 'aphront/storage/exception/AphrontConnectionLostQueryException.php', + 'AphrontConnectionQueryException' => 'aphront/storage/exception/AphrontConnectionQueryException.php', + 'AphrontCountQueryException' => 'aphront/storage/exception/AphrontCountQueryException.php', + 'AphrontDatabaseConnection' => 'aphront/storage/connection/AphrontDatabaseConnection.php', + 'AphrontDatabaseTransactionState' => 'aphront/storage/connection/AphrontDatabaseTransactionState.php', + 'AphrontDeadlockQueryException' => 'aphront/storage/exception/AphrontDeadlockQueryException.php', + 'AphrontDuplicateKeyQueryException' => 'aphront/storage/exception/AphrontDuplicateKeyQueryException.php', + 'AphrontHTTPHeaderParser' => 'aphront/headerparser/AphrontHTTPHeaderParser.php', + 'AphrontHTTPHeaderParserTestCase' => 'aphront/headerparser/__tests__/AphrontHTTPHeaderParserTestCase.php', + 'AphrontInvalidCredentialsQueryException' => 'aphront/storage/exception/AphrontInvalidCredentialsQueryException.php', + 'AphrontIsolatedDatabaseConnection' => 'aphront/storage/connection/AphrontIsolatedDatabaseConnection.php', + 'AphrontLockTimeoutQueryException' => 'aphront/storage/exception/AphrontLockTimeoutQueryException.php', + 'AphrontMultipartParser' => 'aphront/multipartparser/AphrontMultipartParser.php', + 'AphrontMultipartParserTestCase' => 'aphront/multipartparser/__tests__/AphrontMultipartParserTestCase.php', + 'AphrontMultipartPart' => 'aphront/multipartparser/AphrontMultipartPart.php', + 'AphrontMySQLDatabaseConnection' => 'aphront/storage/connection/mysql/AphrontMySQLDatabaseConnection.php', + 'AphrontMySQLiDatabaseConnection' => 'aphront/storage/connection/mysql/AphrontMySQLiDatabaseConnection.php', + 'AphrontNotSupportedQueryException' => 'aphront/storage/exception/AphrontNotSupportedQueryException.php', + 'AphrontObjectMissingQueryException' => 'aphront/storage/exception/AphrontObjectMissingQueryException.php', + 'AphrontParameterQueryException' => 'aphront/storage/exception/AphrontParameterQueryException.php', + 'AphrontQueryException' => 'aphront/storage/exception/AphrontQueryException.php', + 'AphrontQueryTimeoutQueryException' => 'aphront/storage/exception/AphrontQueryTimeoutQueryException.php', + 'AphrontRecoverableQueryException' => 'aphront/storage/exception/AphrontRecoverableQueryException.php', + 'AphrontRequestStream' => 'aphront/requeststream/AphrontRequestStream.php', + 'AphrontSchemaQueryException' => 'aphront/storage/exception/AphrontSchemaQueryException.php', + 'AphrontScopedUnguardedWriteCapability' => 'aphront/writeguard/AphrontScopedUnguardedWriteCapability.php', + 'AphrontWriteGuard' => 'aphront/writeguard/AphrontWriteGuard.php', + 'BaseHTTPFuture' => 'future/http/BaseHTTPFuture.php', + 'CaseInsensitiveArray' => 'utils/CaseInsensitiveArray.php', + 'CaseInsensitiveArrayTestCase' => 'utils/__tests__/CaseInsensitiveArrayTestCase.php', + 'CommandException' => 'future/exec/CommandException.php', + 'ConduitClient' => 'conduit/ConduitClient.php', + 'ConduitClientException' => 'conduit/ConduitClientException.php', + 'ConduitClientTestCase' => 'conduit/__tests__/ConduitClientTestCase.php', + 'ConduitFuture' => 'conduit/ConduitFuture.php', + 'ExecFuture' => 'future/exec/ExecFuture.php', + 'ExecFutureTestCase' => 'future/exec/__tests__/ExecFutureTestCase.php', + 'ExecPassthruTestCase' => 'future/exec/__tests__/ExecPassthruTestCase.php', + 'FileFinder' => 'filesystem/FileFinder.php', + 'FileFinderTestCase' => 'filesystem/__tests__/FileFinderTestCase.php', + 'FileList' => 'filesystem/FileList.php', + 'Filesystem' => 'filesystem/Filesystem.php', + 'FilesystemException' => 'filesystem/FilesystemException.php', + 'FilesystemTestCase' => 'filesystem/__tests__/FilesystemTestCase.php', + 'Future' => 'future/Future.php', + 'FutureIterator' => 'future/FutureIterator.php', + 'FutureIteratorTestCase' => 'future/__tests__/FutureIteratorTestCase.php', + 'FutureProxy' => 'future/FutureProxy.php', + 'HTTPFuture' => 'future/http/HTTPFuture.php', + 'HTTPFutureCURLResponseStatus' => 'future/http/status/HTTPFutureCURLResponseStatus.php', + 'HTTPFutureCertificateResponseStatus' => 'future/http/status/HTTPFutureCertificateResponseStatus.php', + 'HTTPFutureHTTPResponseStatus' => 'future/http/status/HTTPFutureHTTPResponseStatus.php', + 'HTTPFutureParseResponseStatus' => 'future/http/status/HTTPFutureParseResponseStatus.php', + 'HTTPFutureResponseStatus' => 'future/http/status/HTTPFutureResponseStatus.php', + 'HTTPFutureTransportResponseStatus' => 'future/http/status/HTTPFutureTransportResponseStatus.php', + 'HTTPSFuture' => 'future/http/HTTPSFuture.php', + 'ImmediateFuture' => 'future/ImmediateFuture.php', + 'LibphutilUSEnglishTranslation' => 'internationalization/translation/LibphutilUSEnglishTranslation.php', + 'LinesOfALarge' => 'filesystem/linesofalarge/LinesOfALarge.php', + 'LinesOfALargeExecFuture' => 'filesystem/linesofalarge/LinesOfALargeExecFuture.php', + 'LinesOfALargeExecFutureTestCase' => 'filesystem/linesofalarge/__tests__/LinesOfALargeExecFutureTestCase.php', + 'LinesOfALargeFile' => 'filesystem/linesofalarge/LinesOfALargeFile.php', + 'LinesOfALargeFileTestCase' => 'filesystem/linesofalarge/__tests__/LinesOfALargeFileTestCase.php', + 'MFilterTestHelper' => 'utils/__tests__/MFilterTestHelper.php', + 'PHPASTParserTestCase' => 'parser/xhpast/__tests__/PHPASTParserTestCase.php', + 'PhageAction' => 'phage/action/PhageAction.php', + 'PhageAgentAction' => 'phage/action/PhageAgentAction.php', + 'PhageAgentBootloader' => 'phage/bootloader/PhageAgentBootloader.php', + 'PhageAgentTestCase' => 'phage/__tests__/PhageAgentTestCase.php', + 'PhageExecuteAction' => 'phage/action/PhageExecuteAction.php', + 'PhageLocalAction' => 'phage/action/PhageLocalAction.php', + 'PhagePHPAgent' => 'phage/agent/PhagePHPAgent.php', + 'PhagePHPAgentBootloader' => 'phage/bootloader/PhagePHPAgentBootloader.php', + 'PhagePlanAction' => 'phage/action/PhagePlanAction.php', + 'Phobject' => 'object/Phobject.php', + 'PhobjectTestCase' => 'object/__tests__/PhobjectTestCase.php', + 'PhutilAPCKeyValueCache' => 'cache/PhutilAPCKeyValueCache.php', + 'PhutilAWSCloudFormationFuture' => 'future/aws/PhutilAWSCloudFormationFuture.php', + 'PhutilAWSCloudWatchFuture' => 'future/aws/PhutilAWSCloudWatchFuture.php', + 'PhutilAWSEC2Future' => 'future/aws/PhutilAWSEC2Future.php', + 'PhutilAWSException' => 'future/aws/PhutilAWSException.php', + 'PhutilAWSFuture' => 'future/aws/PhutilAWSFuture.php', + 'PhutilAWSManagementWorkflow' => 'future/aws/management/PhutilAWSManagementWorkflow.php', + 'PhutilAWSS3DeleteManagementWorkflow' => 'future/aws/management/PhutilAWSS3DeleteManagementWorkflow.php', + 'PhutilAWSS3Future' => 'future/aws/PhutilAWSS3Future.php', + 'PhutilAWSS3GetManagementWorkflow' => 'future/aws/management/PhutilAWSS3GetManagementWorkflow.php', + 'PhutilAWSS3ManagementWorkflow' => 'future/aws/management/PhutilAWSS3ManagementWorkflow.php', + 'PhutilAWSS3PutManagementWorkflow' => 'future/aws/management/PhutilAWSS3PutManagementWorkflow.php', + 'PhutilAWSv4Signature' => 'future/aws/PhutilAWSv4Signature.php', + 'PhutilAWSv4SignatureTestCase' => 'future/aws/__tests__/PhutilAWSv4SignatureTestCase.php', + 'PhutilAggregateException' => 'error/PhutilAggregateException.php', + 'PhutilAllCapsEnglishLocale' => 'internationalization/locales/PhutilAllCapsEnglishLocale.php', + 'PhutilAmazonAuthAdapter' => 'auth/PhutilAmazonAuthAdapter.php', + 'PhutilArgumentParser' => 'parser/argument/PhutilArgumentParser.php', + 'PhutilArgumentParserException' => 'parser/argument/exception/PhutilArgumentParserException.php', + 'PhutilArgumentParserTestCase' => 'parser/argument/__tests__/PhutilArgumentParserTestCase.php', + 'PhutilArgumentSpecification' => 'parser/argument/PhutilArgumentSpecification.php', + 'PhutilArgumentSpecificationException' => 'parser/argument/exception/PhutilArgumentSpecificationException.php', + 'PhutilArgumentSpecificationTestCase' => 'parser/argument/__tests__/PhutilArgumentSpecificationTestCase.php', + 'PhutilArgumentSpellingCorrector' => 'parser/argument/PhutilArgumentSpellingCorrector.php', + 'PhutilArgumentSpellingCorrectorTestCase' => 'parser/argument/__tests__/PhutilArgumentSpellingCorrectorTestCase.php', + 'PhutilArgumentUsageException' => 'parser/argument/exception/PhutilArgumentUsageException.php', + 'PhutilArgumentWorkflow' => 'parser/argument/workflow/PhutilArgumentWorkflow.php', + 'PhutilArray' => 'utils/PhutilArray.php', + 'PhutilArrayTestCase' => 'utils/__tests__/PhutilArrayTestCase.php', + 'PhutilArrayWithDefaultValue' => 'utils/PhutilArrayWithDefaultValue.php', + 'PhutilAsanaAuthAdapter' => 'auth/PhutilAsanaAuthAdapter.php', + 'PhutilAsanaFuture' => 'future/asana/PhutilAsanaFuture.php', + 'PhutilAuthAdapter' => 'auth/PhutilAuthAdapter.php', + 'PhutilAuthConfigurationException' => 'auth/exception/PhutilAuthConfigurationException.php', + 'PhutilAuthCredentialException' => 'auth/exception/PhutilAuthCredentialException.php', + 'PhutilAuthException' => 'auth/exception/PhutilAuthException.php', + 'PhutilAuthUserAbortedException' => 'auth/exception/PhutilAuthUserAbortedException.php', + 'PhutilBacktraceSignalHandler' => 'future/exec/PhutilBacktraceSignalHandler.php', + 'PhutilBallOfPHP' => 'phage/util/PhutilBallOfPHP.php', + 'PhutilBinaryAnalyzer' => 'filesystem/binary/PhutilBinaryAnalyzer.php', + 'PhutilBinaryAnalyzerTestCase' => 'filesystem/binary/__tests__/PhutilBinaryAnalyzerTestCase.php', + 'PhutilBitbucketAuthAdapter' => 'auth/PhutilBitbucketAuthAdapter.php', + 'PhutilBootloader' => 'moduleutils/PhutilBootloader.php', + 'PhutilBootloaderException' => 'moduleutils/PhutilBootloaderException.php', + 'PhutilBritishEnglishLocale' => 'internationalization/locales/PhutilBritishEnglishLocale.php', + 'PhutilBufferedIterator' => 'utils/PhutilBufferedIterator.php', + 'PhutilBufferedIteratorTestCase' => 'utils/__tests__/PhutilBufferedIteratorTestCase.php', + 'PhutilBugtraqParser' => 'parser/PhutilBugtraqParser.php', + 'PhutilBugtraqParserTestCase' => 'parser/__tests__/PhutilBugtraqParserTestCase.php', + 'PhutilCIDRBlock' => 'ip/PhutilCIDRBlock.php', + 'PhutilCIDRList' => 'ip/PhutilCIDRList.php', + 'PhutilCLikeCodeSnippetContextFreeGrammar' => 'grammar/code/PhutilCLikeCodeSnippetContextFreeGrammar.php', + 'PhutilCalendarAbsoluteDateTime' => 'parser/calendar/data/PhutilCalendarAbsoluteDateTime.php', + 'PhutilCalendarContainerNode' => 'parser/calendar/data/PhutilCalendarContainerNode.php', + 'PhutilCalendarDateTime' => 'parser/calendar/data/PhutilCalendarDateTime.php', + 'PhutilCalendarDateTimeTestCase' => 'parser/calendar/data/__tests__/PhutilCalendarDateTimeTestCase.php', + 'PhutilCalendarDocumentNode' => 'parser/calendar/data/PhutilCalendarDocumentNode.php', + 'PhutilCalendarDuration' => 'parser/calendar/data/PhutilCalendarDuration.php', + 'PhutilCalendarEventNode' => 'parser/calendar/data/PhutilCalendarEventNode.php', + 'PhutilCalendarNode' => 'parser/calendar/data/PhutilCalendarNode.php', + 'PhutilCalendarProxyDateTime' => 'parser/calendar/data/PhutilCalendarProxyDateTime.php', + 'PhutilCalendarRawNode' => 'parser/calendar/data/PhutilCalendarRawNode.php', + 'PhutilCalendarRecurrenceList' => 'parser/calendar/data/PhutilCalendarRecurrenceList.php', + 'PhutilCalendarRecurrenceRule' => 'parser/calendar/data/PhutilCalendarRecurrenceRule.php', + 'PhutilCalendarRecurrenceRuleTestCase' => 'parser/calendar/data/__tests__/PhutilCalendarRecurrenceRuleTestCase.php', + 'PhutilCalendarRecurrenceSet' => 'parser/calendar/data/PhutilCalendarRecurrenceSet.php', + 'PhutilCalendarRecurrenceSource' => 'parser/calendar/data/PhutilCalendarRecurrenceSource.php', + 'PhutilCalendarRecurrenceTestCase' => 'parser/calendar/data/__tests__/PhutilCalendarRecurrenceTestCase.php', + 'PhutilCalendarRelativeDateTime' => 'parser/calendar/data/PhutilCalendarRelativeDateTime.php', + 'PhutilCalendarRootNode' => 'parser/calendar/data/PhutilCalendarRootNode.php', + 'PhutilCalendarUserNode' => 'parser/calendar/data/PhutilCalendarUserNode.php', + 'PhutilCallbackFilterIterator' => 'utils/PhutilCallbackFilterIterator.php', + 'PhutilCallbackSignalHandler' => 'future/exec/PhutilCallbackSignalHandler.php', + 'PhutilChannel' => 'channel/PhutilChannel.php', + 'PhutilChannelChannel' => 'channel/PhutilChannelChannel.php', + 'PhutilChannelTestCase' => 'channel/__tests__/PhutilChannelTestCase.php', + 'PhutilChunkedIterator' => 'utils/PhutilChunkedIterator.php', + 'PhutilChunkedIteratorTestCase' => 'utils/__tests__/PhutilChunkedIteratorTestCase.php', + 'PhutilClassMapQuery' => 'symbols/PhutilClassMapQuery.php', + 'PhutilCloudWatchMetric' => 'future/aws/PhutilCloudWatchMetric.php', + 'PhutilCodeSnippetContextFreeGrammar' => 'grammar/code/PhutilCodeSnippetContextFreeGrammar.php', + 'PhutilCommandString' => 'xsprintf/PhutilCommandString.php', + 'PhutilConsole' => 'console/PhutilConsole.php', + 'PhutilConsoleBlock' => 'console/view/PhutilConsoleBlock.php', + 'PhutilConsoleError' => 'console/view/PhutilConsoleError.php', + 'PhutilConsoleFormatter' => 'console/PhutilConsoleFormatter.php', + 'PhutilConsoleInfo' => 'console/view/PhutilConsoleInfo.php', + 'PhutilConsoleList' => 'console/view/PhutilConsoleList.php', + 'PhutilConsoleLogLine' => 'console/view/PhutilConsoleLogLine.php', + 'PhutilConsoleMessage' => 'console/PhutilConsoleMessage.php', + 'PhutilConsoleMetrics' => 'console/PhutilConsoleMetrics.php', + 'PhutilConsoleMetricsSignalHandler' => 'future/exec/PhutilConsoleMetricsSignalHandler.php', + 'PhutilConsoleProgressBar' => 'console/PhutilConsoleProgressBar.php', + 'PhutilConsoleServer' => 'console/PhutilConsoleServer.php', + 'PhutilConsoleServerChannel' => 'console/PhutilConsoleServerChannel.php', + 'PhutilConsoleSkip' => 'console/view/PhutilConsoleSkip.php', + 'PhutilConsoleStdinNotInteractiveException' => 'console/PhutilConsoleStdinNotInteractiveException.php', + 'PhutilConsoleSyntaxHighlighter' => 'markup/syntax/highlighter/PhutilConsoleSyntaxHighlighter.php', + 'PhutilConsoleTable' => 'console/view/PhutilConsoleTable.php', + 'PhutilConsoleView' => 'console/view/PhutilConsoleView.php', + 'PhutilConsoleWarning' => 'console/view/PhutilConsoleWarning.php', + 'PhutilConsoleWrapTestCase' => 'console/__tests__/PhutilConsoleWrapTestCase.php', + 'PhutilContextFreeGrammar' => 'grammar/PhutilContextFreeGrammar.php', + 'PhutilCowsay' => 'utils/PhutilCowsay.php', + 'PhutilCowsayTestCase' => 'utils/__tests__/PhutilCowsayTestCase.php', + 'PhutilCsprintfTestCase' => 'xsprintf/__tests__/PhutilCsprintfTestCase.php', + 'PhutilCzechLocale' => 'internationalization/locales/PhutilCzechLocale.php', + 'PhutilDaemon' => 'daemon/PhutilDaemon.php', + 'PhutilDaemonHandle' => 'daemon/PhutilDaemonHandle.php', + 'PhutilDaemonOverseer' => 'daemon/PhutilDaemonOverseer.php', + 'PhutilDaemonOverseerModule' => 'daemon/PhutilDaemonOverseerModule.php', + 'PhutilDaemonPool' => 'daemon/PhutilDaemonPool.php', + 'PhutilDefaultSyntaxHighlighter' => 'markup/syntax/highlighter/PhutilDefaultSyntaxHighlighter.php', + 'PhutilDefaultSyntaxHighlighterEngine' => 'markup/syntax/engine/PhutilDefaultSyntaxHighlighterEngine.php', + 'PhutilDefaultSyntaxHighlighterEnginePygmentsFuture' => 'markup/syntax/highlighter/pygments/PhutilDefaultSyntaxHighlighterEnginePygmentsFuture.php', + 'PhutilDefaultSyntaxHighlighterEngineTestCase' => 'markup/syntax/engine/__tests__/PhutilDefaultSyntaxHighlighterEngineTestCase.php', + 'PhutilDeferredLog' => 'filesystem/PhutilDeferredLog.php', + 'PhutilDeferredLogTestCase' => 'filesystem/__tests__/PhutilDeferredLogTestCase.php', + 'PhutilDiffBinaryAnalyzer' => 'filesystem/binary/PhutilDiffBinaryAnalyzer.php', + 'PhutilDirectedScalarGraph' => 'utils/PhutilDirectedScalarGraph.php', + 'PhutilDirectoryFixture' => 'filesystem/PhutilDirectoryFixture.php', + 'PhutilDirectoryKeyValueCache' => 'cache/PhutilDirectoryKeyValueCache.php', + 'PhutilDisqusAuthAdapter' => 'auth/PhutilDisqusAuthAdapter.php', + 'PhutilDivinerSyntaxHighlighter' => 'markup/syntax/highlighter/PhutilDivinerSyntaxHighlighter.php', + 'PhutilDocblockParser' => 'parser/PhutilDocblockParser.php', + 'PhutilDocblockParserTestCase' => 'parser/__tests__/PhutilDocblockParserTestCase.php', + 'PhutilEditDistanceMatrix' => 'utils/PhutilEditDistanceMatrix.php', + 'PhutilEditDistanceMatrixTestCase' => 'utils/__tests__/PhutilEditDistanceMatrixTestCase.php', + 'PhutilEditorConfig' => 'parser/PhutilEditorConfig.php', + 'PhutilEditorConfigTestCase' => 'parser/__tests__/PhutilEditorConfigTestCase.php', + 'PhutilEmailAddress' => 'parser/PhutilEmailAddress.php', + 'PhutilEmailAddressTestCase' => 'parser/__tests__/PhutilEmailAddressTestCase.php', + 'PhutilEmojiLocale' => 'internationalization/locales/PhutilEmojiLocale.php', + 'PhutilEmptyAuthAdapter' => 'auth/PhutilEmptyAuthAdapter.php', + 'PhutilEnglishCanadaLocale' => 'internationalization/locales/PhutilEnglishCanadaLocale.php', + 'PhutilErrorHandler' => 'error/PhutilErrorHandler.php', + 'PhutilErrorHandlerTestCase' => 'error/__tests__/PhutilErrorHandlerTestCase.php', + 'PhutilErrorTrap' => 'error/PhutilErrorTrap.php', + 'PhutilEvent' => 'events/PhutilEvent.php', + 'PhutilEventConstants' => 'events/constant/PhutilEventConstants.php', + 'PhutilEventEngine' => 'events/PhutilEventEngine.php', + 'PhutilEventListener' => 'events/PhutilEventListener.php', + 'PhutilEventType' => 'events/constant/PhutilEventType.php', + 'PhutilExampleBufferedIterator' => 'utils/PhutilExampleBufferedIterator.php', + 'PhutilExcessiveServiceCallsDaemon' => 'daemon/torture/PhutilExcessiveServiceCallsDaemon.php', + 'PhutilExecChannel' => 'channel/PhutilExecChannel.php', + 'PhutilExecPassthru' => 'future/exec/PhutilExecPassthru.php', + 'PhutilExecutableFuture' => 'future/exec/PhutilExecutableFuture.php', + 'PhutilExecutionEnvironment' => 'utils/PhutilExecutionEnvironment.php', + 'PhutilExtensionsTestCase' => 'moduleutils/__tests__/PhutilExtensionsTestCase.php', + 'PhutilFacebookAuthAdapter' => 'auth/PhutilFacebookAuthAdapter.php', + 'PhutilFatalDaemon' => 'daemon/torture/PhutilFatalDaemon.php', + 'PhutilFileLock' => 'filesystem/PhutilFileLock.php', + 'PhutilFileLockTestCase' => 'filesystem/__tests__/PhutilFileLockTestCase.php', + 'PhutilFileTree' => 'filesystem/PhutilFileTree.php', + 'PhutilFrenchLocale' => 'internationalization/locales/PhutilFrenchLocale.php', + 'PhutilGermanLocale' => 'internationalization/locales/PhutilGermanLocale.php', + 'PhutilGitBinaryAnalyzer' => 'filesystem/binary/PhutilGitBinaryAnalyzer.php', + 'PhutilGitHubAuthAdapter' => 'auth/PhutilGitHubAuthAdapter.php', + 'PhutilGitHubFuture' => 'future/github/PhutilGitHubFuture.php', + 'PhutilGitHubResponse' => 'future/github/PhutilGitHubResponse.php', + 'PhutilGitURI' => 'parser/PhutilGitURI.php', + 'PhutilGitURITestCase' => 'parser/__tests__/PhutilGitURITestCase.php', + 'PhutilGoogleAuthAdapter' => 'auth/PhutilGoogleAuthAdapter.php', + 'PhutilHTTPEngineExtension' => 'future/http/PhutilHTTPEngineExtension.php', + 'PhutilHTTPResponse' => 'parser/http/PhutilHTTPResponse.php', + 'PhutilHTTPResponseParser' => 'parser/http/PhutilHTTPResponseParser.php', + 'PhutilHTTPResponseParserTestCase' => 'parser/http/__tests__/PhutilHTTPResponseParserTestCase.php', + 'PhutilHangForeverDaemon' => 'daemon/torture/PhutilHangForeverDaemon.php', + 'PhutilHashingIterator' => 'utils/PhutilHashingIterator.php', + 'PhutilHashingIteratorTestCase' => 'utils/__tests__/PhutilHashingIteratorTestCase.php', + 'PhutilHelpArgumentWorkflow' => 'parser/argument/workflow/PhutilHelpArgumentWorkflow.php', + 'PhutilHgsprintfTestCase' => 'xsprintf/__tests__/PhutilHgsprintfTestCase.php', + 'PhutilHighIntensityIntervalDaemon' => 'daemon/torture/PhutilHighIntensityIntervalDaemon.php', + 'PhutilICSParser' => 'parser/calendar/ics/PhutilICSParser.php', + 'PhutilICSParserException' => 'parser/calendar/ics/PhutilICSParserException.php', + 'PhutilICSParserTestCase' => 'parser/calendar/ics/__tests__/PhutilICSParserTestCase.php', + 'PhutilICSWriter' => 'parser/calendar/ics/PhutilICSWriter.php', + 'PhutilICSWriterTestCase' => 'parser/calendar/ics/__tests__/PhutilICSWriterTestCase.php', + 'PhutilINIParserException' => 'parser/exception/PhutilINIParserException.php', + 'PhutilIPAddress' => 'ip/PhutilIPAddress.php', + 'PhutilIPAddressTestCase' => 'ip/__tests__/PhutilIPAddressTestCase.php', + 'PhutilIPv4Address' => 'ip/PhutilIPv4Address.php', + 'PhutilIPv6Address' => 'ip/PhutilIPv6Address.php', + 'PhutilInRequestKeyValueCache' => 'cache/PhutilInRequestKeyValueCache.php', + 'PhutilInteractiveEditor' => 'console/PhutilInteractiveEditor.php', + 'PhutilInvalidRuleParserGeneratorException' => 'parser/generator/exception/PhutilInvalidRuleParserGeneratorException.php', + 'PhutilInvalidStateException' => 'exception/PhutilInvalidStateException.php', + 'PhutilInvalidStateExceptionTestCase' => 'exception/__tests__/PhutilInvalidStateExceptionTestCase.php', + 'PhutilInvisibleSyntaxHighlighter' => 'markup/syntax/highlighter/PhutilInvisibleSyntaxHighlighter.php', + 'PhutilIrreducibleRuleParserGeneratorException' => 'parser/generator/exception/PhutilIrreducibleRuleParserGeneratorException.php', + 'PhutilJIRAAuthAdapter' => 'auth/PhutilJIRAAuthAdapter.php', + 'PhutilJSON' => 'parser/PhutilJSON.php', + 'PhutilJSONFragmentLexer' => 'lexer/PhutilJSONFragmentLexer.php', + 'PhutilJSONFragmentLexerHighlighterTestCase' => 'markup/syntax/highlighter/__tests__/PhutilJSONFragmentLexerHighlighterTestCase.php', + 'PhutilJSONParser' => 'parser/PhutilJSONParser.php', + 'PhutilJSONParserException' => 'parser/exception/PhutilJSONParserException.php', + 'PhutilJSONParserTestCase' => 'parser/__tests__/PhutilJSONParserTestCase.php', + 'PhutilJSONProtocolChannel' => 'channel/PhutilJSONProtocolChannel.php', + 'PhutilJSONProtocolChannelTestCase' => 'channel/__tests__/PhutilJSONProtocolChannelTestCase.php', + 'PhutilJSONTestCase' => 'parser/__tests__/PhutilJSONTestCase.php', + 'PhutilJavaCodeSnippetContextFreeGrammar' => 'grammar/code/PhutilJavaCodeSnippetContextFreeGrammar.php', + 'PhutilJavaFragmentLexer' => 'lexer/PhutilJavaFragmentLexer.php', + 'PhutilKeyValueCache' => 'cache/PhutilKeyValueCache.php', + 'PhutilKeyValueCacheNamespace' => 'cache/PhutilKeyValueCacheNamespace.php', + 'PhutilKeyValueCacheProfiler' => 'cache/PhutilKeyValueCacheProfiler.php', + 'PhutilKeyValueCacheProxy' => 'cache/PhutilKeyValueCacheProxy.php', + 'PhutilKeyValueCacheStack' => 'cache/PhutilKeyValueCacheStack.php', + 'PhutilKeyValueCacheTestCase' => 'cache/__tests__/PhutilKeyValueCacheTestCase.php', + 'PhutilKoreanLocale' => 'internationalization/locales/PhutilKoreanLocale.php', + 'PhutilLDAPAuthAdapter' => 'auth/PhutilLDAPAuthAdapter.php', + 'PhutilLanguageGuesser' => 'parser/PhutilLanguageGuesser.php', + 'PhutilLanguageGuesserTestCase' => 'parser/__tests__/PhutilLanguageGuesserTestCase.php', + 'PhutilLexer' => 'lexer/PhutilLexer.php', + 'PhutilLexerSyntaxHighlighter' => 'markup/syntax/highlighter/PhutilLexerSyntaxHighlighter.php', + 'PhutilLibraryConflictException' => 'moduleutils/PhutilLibraryConflictException.php', + 'PhutilLibraryMapBuilder' => 'moduleutils/PhutilLibraryMapBuilder.php', + 'PhutilLibraryTestCase' => '__tests__/PhutilLibraryTestCase.php', + 'PhutilLipsumContextFreeGrammar' => 'grammar/PhutilLipsumContextFreeGrammar.php', + 'PhutilLocale' => 'internationalization/PhutilLocale.php', + 'PhutilLocaleTestCase' => 'internationalization/__tests__/PhutilLocaleTestCase.php', + 'PhutilLock' => 'filesystem/PhutilLock.php', + 'PhutilLockException' => 'filesystem/PhutilLockException.php', + 'PhutilLogFileChannel' => 'channel/PhutilLogFileChannel.php', + 'PhutilLunarPhase' => 'utils/PhutilLunarPhase.php', + 'PhutilLunarPhaseTestCase' => 'utils/__tests__/PhutilLunarPhaseTestCase.php', + 'PhutilMarkupEngine' => 'markup/PhutilMarkupEngine.php', + 'PhutilMarkupTestCase' => 'markup/__tests__/PhutilMarkupTestCase.php', + 'PhutilMemcacheKeyValueCache' => 'cache/PhutilMemcacheKeyValueCache.php', + 'PhutilMercurialBinaryAnalyzer' => 'filesystem/binary/PhutilMercurialBinaryAnalyzer.php', + 'PhutilMethodNotImplementedException' => 'error/PhutilMethodNotImplementedException.php', + 'PhutilMetricsChannel' => 'channel/PhutilMetricsChannel.php', + 'PhutilMissingSymbolException' => 'symbols/exception/PhutilMissingSymbolException.php', + 'PhutilModuleUtilsTestCase' => 'moduleutils/__tests__/PhutilModuleUtilsTestCase.php', + 'PhutilNiceDaemon' => 'daemon/torture/PhutilNiceDaemon.php', + 'PhutilNumber' => 'internationalization/PhutilNumber.php', + 'PhutilOAuth1AuthAdapter' => 'auth/PhutilOAuth1AuthAdapter.php', + 'PhutilOAuth1Future' => 'future/oauth/PhutilOAuth1Future.php', + 'PhutilOAuth1FutureTestCase' => 'future/oauth/__tests__/PhutilOAuth1FutureTestCase.php', + 'PhutilOAuthAuthAdapter' => 'auth/PhutilOAuthAuthAdapter.php', + 'PhutilOnDiskKeyValueCache' => 'cache/PhutilOnDiskKeyValueCache.php', + 'PhutilOpaqueEnvelope' => 'error/PhutilOpaqueEnvelope.php', + 'PhutilOpaqueEnvelopeKey' => 'error/PhutilOpaqueEnvelopeKey.php', + 'PhutilOpaqueEnvelopeTestCase' => 'error/__tests__/PhutilOpaqueEnvelopeTestCase.php', + 'PhutilPHPCodeSnippetContextFreeGrammar' => 'grammar/code/PhutilPHPCodeSnippetContextFreeGrammar.php', + 'PhutilPHPFragmentLexer' => 'lexer/PhutilPHPFragmentLexer.php', + 'PhutilPHPFragmentLexerHighlighterTestCase' => 'markup/syntax/highlighter/__tests__/PhutilPHPFragmentLexerHighlighterTestCase.php', + 'PhutilPHPFragmentLexerTestCase' => 'lexer/__tests__/PhutilPHPFragmentLexerTestCase.php', + 'PhutilPHPObjectProtocolChannel' => 'channel/PhutilPHPObjectProtocolChannel.php', + 'PhutilPHPObjectProtocolChannelTestCase' => 'channel/__tests__/PhutilPHPObjectProtocolChannelTestCase.php', + 'PhutilParserGenerator' => 'parser/PhutilParserGenerator.php', + 'PhutilParserGeneratorException' => 'parser/generator/exception/PhutilParserGeneratorException.php', + 'PhutilParserGeneratorTestCase' => 'parser/__tests__/PhutilParserGeneratorTestCase.php', + 'PhutilPayPalAPIFuture' => 'future/paypal/PhutilPayPalAPIFuture.php', + 'PhutilPerson' => 'internationalization/PhutilPerson.php', + 'PhutilPersonTest' => 'internationalization/__tests__/PhutilPersonTest.php', + 'PhutilPhabricatorAuthAdapter' => 'auth/PhutilPhabricatorAuthAdapter.php', + 'PhutilPhtTestCase' => 'internationalization/__tests__/PhutilPhtTestCase.php', + 'PhutilPirateEnglishLocale' => 'internationalization/locales/PhutilPirateEnglishLocale.php', + 'PhutilPortugueseBrazilLocale' => 'internationalization/locales/PhutilPortugueseBrazilLocale.php', + 'PhutilPortuguesePortugalLocale' => 'internationalization/locales/PhutilPortuguesePortugalLocale.php', + 'PhutilPostmarkFuture' => 'future/postmark/PhutilPostmarkFuture.php', + 'PhutilPregsprintfTestCase' => 'xsprintf/__tests__/PhutilPregsprintfTestCase.php', + 'PhutilProcessGroupDaemon' => 'daemon/torture/PhutilProcessGroupDaemon.php', + 'PhutilProseDiff' => 'utils/PhutilProseDiff.php', + 'PhutilProseDiffTestCase' => 'utils/__tests__/PhutilProseDiffTestCase.php', + 'PhutilProseDifferenceEngine' => 'utils/PhutilProseDifferenceEngine.php', + 'PhutilProtocolChannel' => 'channel/PhutilProtocolChannel.php', + 'PhutilProxyException' => 'error/PhutilProxyException.php', + 'PhutilProxyIterator' => 'utils/PhutilProxyIterator.php', + 'PhutilPygmentizeBinaryAnalyzer' => 'filesystem/binary/PhutilPygmentizeBinaryAnalyzer.php', + 'PhutilPygmentizeParser' => 'parser/PhutilPygmentizeParser.php', + 'PhutilPygmentizeParserTestCase' => 'parser/__tests__/PhutilPygmentizeParserTestCase.php', + 'PhutilPygmentsSyntaxHighlighter' => 'markup/syntax/highlighter/PhutilPygmentsSyntaxHighlighter.php', + 'PhutilPythonFragmentLexer' => 'lexer/PhutilPythonFragmentLexer.php', + 'PhutilQsprintfInterface' => 'xsprintf/PhutilQsprintfInterface.php', + 'PhutilQueryStringParser' => 'parser/PhutilQueryStringParser.php', + 'PhutilQueryStringParserTestCase' => 'parser/__tests__/PhutilQueryStringParserTestCase.php', + 'PhutilRainbowSyntaxHighlighter' => 'markup/syntax/highlighter/PhutilRainbowSyntaxHighlighter.php', + 'PhutilRawEnglishLocale' => 'internationalization/locales/PhutilRawEnglishLocale.php', + 'PhutilReadableSerializer' => 'readableserializer/PhutilReadableSerializer.php', + 'PhutilReadableSerializerTestCase' => 'readableserializer/__tests__/PhutilReadableSerializerTestCase.php', + 'PhutilRealNameContextFreeGrammar' => 'grammar/PhutilRealNameContextFreeGrammar.php', + 'PhutilRemarkupBlockInterpreter' => 'markup/engine/remarkup/blockrule/PhutilRemarkupBlockInterpreter.php', + 'PhutilRemarkupBlockRule' => 'markup/engine/remarkup/blockrule/PhutilRemarkupBlockRule.php', + 'PhutilRemarkupBlockStorage' => 'markup/engine/remarkup/PhutilRemarkupBlockStorage.php', + 'PhutilRemarkupBoldRule' => 'markup/engine/remarkup/markuprule/PhutilRemarkupBoldRule.php', + 'PhutilRemarkupCodeBlockRule' => 'markup/engine/remarkup/blockrule/PhutilRemarkupCodeBlockRule.php', + 'PhutilRemarkupDefaultBlockRule' => 'markup/engine/remarkup/blockrule/PhutilRemarkupDefaultBlockRule.php', + 'PhutilRemarkupDelRule' => 'markup/engine/remarkup/markuprule/PhutilRemarkupDelRule.php', + 'PhutilRemarkupDocumentLinkRule' => 'markup/engine/remarkup/markuprule/PhutilRemarkupDocumentLinkRule.php', + 'PhutilRemarkupEngine' => 'markup/engine/PhutilRemarkupEngine.php', + 'PhutilRemarkupEngineTestCase' => 'markup/engine/__tests__/PhutilRemarkupEngineTestCase.php', + 'PhutilRemarkupEscapeRemarkupRule' => 'markup/engine/remarkup/markuprule/PhutilRemarkupEscapeRemarkupRule.php', + 'PhutilRemarkupHeaderBlockRule' => 'markup/engine/remarkup/blockrule/PhutilRemarkupHeaderBlockRule.php', + 'PhutilRemarkupHighlightRule' => 'markup/engine/remarkup/markuprule/PhutilRemarkupHighlightRule.php', + 'PhutilRemarkupHorizontalRuleBlockRule' => 'markup/engine/remarkup/blockrule/PhutilRemarkupHorizontalRuleBlockRule.php', + 'PhutilRemarkupHyperlinkRule' => 'markup/engine/remarkup/markuprule/PhutilRemarkupHyperlinkRule.php', + 'PhutilRemarkupInlineBlockRule' => 'markup/engine/remarkup/blockrule/PhutilRemarkupInlineBlockRule.php', + 'PhutilRemarkupInterpreterBlockRule' => 'markup/engine/remarkup/blockrule/PhutilRemarkupInterpreterBlockRule.php', + 'PhutilRemarkupItalicRule' => 'markup/engine/remarkup/markuprule/PhutilRemarkupItalicRule.php', + 'PhutilRemarkupLinebreaksRule' => 'markup/engine/remarkup/markuprule/PhutilRemarkupLinebreaksRule.php', + 'PhutilRemarkupListBlockRule' => 'markup/engine/remarkup/blockrule/PhutilRemarkupListBlockRule.php', + 'PhutilRemarkupLiteralBlockRule' => 'markup/engine/remarkup/blockrule/PhutilRemarkupLiteralBlockRule.php', + 'PhutilRemarkupMonospaceRule' => 'markup/engine/remarkup/markuprule/PhutilRemarkupMonospaceRule.php', + 'PhutilRemarkupNoteBlockRule' => 'markup/engine/remarkup/blockrule/PhutilRemarkupNoteBlockRule.php', + 'PhutilRemarkupQuotesBlockRule' => 'markup/engine/remarkup/blockrule/PhutilRemarkupQuotesBlockRule.php', + 'PhutilRemarkupReplyBlockRule' => 'markup/engine/remarkup/blockrule/PhutilRemarkupReplyBlockRule.php', + 'PhutilRemarkupRule' => 'markup/engine/remarkup/markuprule/PhutilRemarkupRule.php', + 'PhutilRemarkupSimpleTableBlockRule' => 'markup/engine/remarkup/blockrule/PhutilRemarkupSimpleTableBlockRule.php', + 'PhutilRemarkupTableBlockRule' => 'markup/engine/remarkup/blockrule/PhutilRemarkupTableBlockRule.php', + 'PhutilRemarkupTestInterpreterRule' => 'markup/engine/remarkup/blockrule/PhutilRemarkupTestInterpreterRule.php', + 'PhutilRemarkupUnderlineRule' => 'markup/engine/remarkup/markuprule/PhutilRemarkupUnderlineRule.php', + 'PhutilRope' => 'utils/PhutilRope.php', + 'PhutilRopeTestCase' => 'utils/__tests__/PhutilRopeTestCase.php', + 'PhutilSafeHTML' => 'markup/PhutilSafeHTML.php', + 'PhutilSafeHTMLProducerInterface' => 'markup/PhutilSafeHTMLProducerInterface.php', + 'PhutilSafeHTMLTestCase' => 'markup/__tests__/PhutilSafeHTMLTestCase.php', + 'PhutilSaturateStdoutDaemon' => 'daemon/torture/PhutilSaturateStdoutDaemon.php', + 'PhutilSearchQueryCompiler' => 'search/PhutilSearchQueryCompiler.php', + 'PhutilSearchQueryCompilerSyntaxException' => 'search/PhutilSearchQueryCompilerSyntaxException.php', + 'PhutilSearchQueryCompilerTestCase' => 'search/__tests__/PhutilSearchQueryCompilerTestCase.php', + 'PhutilSearchQueryToken' => 'search/PhutilSearchQueryToken.php', + 'PhutilSearchStemmer' => 'search/PhutilSearchStemmer.php', + 'PhutilSearchStemmerTestCase' => 'search/__tests__/PhutilSearchStemmerTestCase.php', + 'PhutilServiceProfiler' => 'serviceprofiler/PhutilServiceProfiler.php', + 'PhutilShellLexer' => 'lexer/PhutilShellLexer.php', + 'PhutilShellLexerTestCase' => 'lexer/__tests__/PhutilShellLexerTestCase.php', + 'PhutilSignalHandler' => 'future/exec/PhutilSignalHandler.php', + 'PhutilSignalRouter' => 'future/exec/PhutilSignalRouter.php', + 'PhutilSimpleOptions' => 'parser/PhutilSimpleOptions.php', + 'PhutilSimpleOptionsLexer' => 'lexer/PhutilSimpleOptionsLexer.php', + 'PhutilSimpleOptionsLexerTestCase' => 'lexer/__tests__/PhutilSimpleOptionsLexerTestCase.php', + 'PhutilSimpleOptionsTestCase' => 'parser/__tests__/PhutilSimpleOptionsTestCase.php', + 'PhutilSimplifiedChineseLocale' => 'internationalization/locales/PhutilSimplifiedChineseLocale.php', + 'PhutilSlackAuthAdapter' => 'auth/PhutilSlackAuthAdapter.php', + 'PhutilSlackFuture' => 'future/slack/PhutilSlackFuture.php', + 'PhutilSocketChannel' => 'channel/PhutilSocketChannel.php', + 'PhutilSortVector' => 'utils/PhutilSortVector.php', + 'PhutilSpanishSpainLocale' => 'internationalization/locales/PhutilSpanishSpainLocale.php', + 'PhutilSprite' => 'sprites/PhutilSprite.php', + 'PhutilSpriteSheet' => 'sprites/PhutilSpriteSheet.php', + 'PhutilStreamIterator' => 'utils/PhutilStreamIterator.php', + 'PhutilSubversionBinaryAnalyzer' => 'filesystem/binary/PhutilSubversionBinaryAnalyzer.php', + 'PhutilSymbolLoader' => 'symbols/PhutilSymbolLoader.php', + 'PhutilSyntaxHighlighter' => 'markup/syntax/highlighter/PhutilSyntaxHighlighter.php', + 'PhutilSyntaxHighlighterEngine' => 'markup/syntax/engine/PhutilSyntaxHighlighterEngine.php', + 'PhutilSyntaxHighlighterException' => 'markup/syntax/highlighter/PhutilSyntaxHighlighterException.php', + 'PhutilSystem' => 'utils/PhutilSystem.php', + 'PhutilSystemTestCase' => 'utils/__tests__/PhutilSystemTestCase.php', + 'PhutilTerminalString' => 'xsprintf/PhutilTerminalString.php', + 'PhutilTestPhobject' => 'object/__tests__/PhutilTestPhobject.php', + 'PhutilTortureTestDaemon' => 'daemon/torture/PhutilTortureTestDaemon.php', + 'PhutilTraditionalChineseLocale' => 'internationalization/locales/PhutilTraditionalChineseLocale.php', + 'PhutilTranslation' => 'internationalization/PhutilTranslation.php', + 'PhutilTranslationTestCase' => 'internationalization/__tests__/PhutilTranslationTestCase.php', + 'PhutilTranslator' => 'internationalization/PhutilTranslator.php', + 'PhutilTranslatorTestCase' => 'internationalization/__tests__/PhutilTranslatorTestCase.php', + 'PhutilTsprintfTestCase' => 'xsprintf/__tests__/PhutilTsprintfTestCase.php', + 'PhutilTwitchAuthAdapter' => 'auth/PhutilTwitchAuthAdapter.php', + 'PhutilTwitchFuture' => 'future/twitch/PhutilTwitchFuture.php', + 'PhutilTwitterAuthAdapter' => 'auth/PhutilTwitterAuthAdapter.php', + 'PhutilTypeCheckException' => 'parser/exception/PhutilTypeCheckException.php', + 'PhutilTypeExtraParametersException' => 'parser/exception/PhutilTypeExtraParametersException.php', + 'PhutilTypeLexer' => 'lexer/PhutilTypeLexer.php', + 'PhutilTypeMissingParametersException' => 'parser/exception/PhutilTypeMissingParametersException.php', + 'PhutilTypeSpec' => 'parser/PhutilTypeSpec.php', + 'PhutilTypeSpecTestCase' => 'parser/__tests__/PhutilTypeSpecTestCase.php', + 'PhutilURI' => 'parser/PhutilURI.php', + 'PhutilURITestCase' => 'parser/__tests__/PhutilURITestCase.php', + 'PhutilUSEnglishLocale' => 'internationalization/locales/PhutilUSEnglishLocale.php', + 'PhutilUTF8StringTruncator' => 'utils/PhutilUTF8StringTruncator.php', + 'PhutilUTF8TestCase' => 'utils/__tests__/PhutilUTF8TestCase.php', + 'PhutilUnknownSymbolParserGeneratorException' => 'parser/generator/exception/PhutilUnknownSymbolParserGeneratorException.php', + 'PhutilUnreachableRuleParserGeneratorException' => 'parser/generator/exception/PhutilUnreachableRuleParserGeneratorException.php', + 'PhutilUnreachableTerminalParserGeneratorException' => 'parser/generator/exception/PhutilUnreachableTerminalParserGeneratorException.php', + 'PhutilUrisprintfTestCase' => 'xsprintf/__tests__/PhutilUrisprintfTestCase.php', + 'PhutilUtilsTestCase' => 'utils/__tests__/PhutilUtilsTestCase.php', + 'PhutilVeryWowEnglishLocale' => 'internationalization/locales/PhutilVeryWowEnglishLocale.php', + 'PhutilWordPressAuthAdapter' => 'auth/PhutilWordPressAuthAdapter.php', + 'PhutilWordPressFuture' => 'future/wordpress/PhutilWordPressFuture.php', + 'PhutilXHPASTBinary' => 'parser/xhpast/bin/PhutilXHPASTBinary.php', + 'PhutilXHPASTSyntaxHighlighter' => 'markup/syntax/highlighter/PhutilXHPASTSyntaxHighlighter.php', + 'PhutilXHPASTSyntaxHighlighterFuture' => 'markup/syntax/highlighter/xhpast/PhutilXHPASTSyntaxHighlighterFuture.php', + 'PhutilXHPASTSyntaxHighlighterTestCase' => 'markup/syntax/highlighter/__tests__/PhutilXHPASTSyntaxHighlighterTestCase.php', + 'QueryFuture' => 'future/query/QueryFuture.php', + 'TempFile' => 'filesystem/TempFile.php', + 'TestAbstractDirectedGraph' => 'utils/__tests__/TestAbstractDirectedGraph.php', + 'XHPASTNode' => 'parser/xhpast/api/XHPASTNode.php', + 'XHPASTNodeTestCase' => 'parser/xhpast/api/__tests__/XHPASTNodeTestCase.php', + 'XHPASTSyntaxErrorException' => 'parser/xhpast/api/XHPASTSyntaxErrorException.php', + 'XHPASTToken' => 'parser/xhpast/api/XHPASTToken.php', + 'XHPASTTree' => 'parser/xhpast/api/XHPASTTree.php', + 'XHPASTTreeTestCase' => 'parser/xhpast/api/__tests__/XHPASTTreeTestCase.php', + 'XsprintfUnknownConversionException' => 'xsprintf/exception/XsprintfUnknownConversionException.php', 'ArcanistAbstractMethodBodyXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistAbstractMethodBodyXHPASTLinterRule.php', 'ArcanistAbstractMethodBodyXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistAbstractMethodBodyXHPASTLinterRuleTestCase.php', 'ArcanistAbstractPrivateMethodXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistAbstractPrivateMethodXHPASTLinterRule.php', @@ -460,7 +940,140 @@ 'XUnitTestEngine' => 'unit/engine/XUnitTestEngine.php', 'XUnitTestResultParserTestCase' => 'unit/parser/__tests__/XUnitTestResultParserTestCase.php', ), - 'function' => array(), + 'function' => array( + 'array_fuse' => 'utils/utils.php', + 'array_interleave' => 'utils/utils.php', + 'array_mergev' => 'utils/utils.php', + 'array_select_keys' => 'utils/utils.php', + 'assert_instances_of' => 'utils/utils.php', + 'assert_stringlike' => 'utils/utils.php', + 'coalesce' => 'utils/utils.php', + 'csprintf' => 'xsprintf/csprintf.php', + 'exec_manual' => 'future/exec/execx.php', + 'execx' => 'future/exec/execx.php', + 'head' => 'utils/utils.php', + 'head_key' => 'utils/utils.php', + 'hgsprintf' => 'xsprintf/hgsprintf.php', + 'hsprintf' => 'markup/render.php', + 'id' => 'utils/utils.php', + 'idx' => 'utils/utils.php', + 'idxv' => 'utils/utils.php', + 'ifilter' => 'utils/utils.php', + 'igroup' => 'utils/utils.php', + 'ipull' => 'utils/utils.php', + 'isort' => 'utils/utils.php', + 'jsprintf' => 'xsprintf/jsprintf.php', + 'last' => 'utils/utils.php', + 'last_key' => 'utils/utils.php', + 'ldap_sprintf' => 'xsprintf/ldapsprintf.php', + 'mfilter' => 'utils/utils.php', + 'mgroup' => 'utils/utils.php', + 'mpull' => 'utils/utils.php', + 'msort' => 'utils/utils.php', + 'msortv' => 'utils/utils.php', + 'newv' => 'utils/utils.php', + 'nonempty' => 'utils/utils.php', + 'phlog' => 'error/phlog.php', + 'pht' => 'internationalization/pht.php', + 'phutil_censor_credentials' => 'utils/utils.php', + 'phutil_console_confirm' => 'console/format.php', + 'phutil_console_format' => 'console/format.php', + 'phutil_console_get_terminal_width' => 'console/format.php', + 'phutil_console_prompt' => 'console/format.php', + 'phutil_console_require_tty' => 'console/format.php', + 'phutil_console_select' => 'console/format.php', + 'phutil_console_wrap' => 'console/format.php', + 'phutil_count' => 'internationalization/pht.php', + 'phutil_date_format' => 'utils/viewutils.php', + 'phutil_deprecated' => 'moduleutils/moduleutils.php', + 'phutil_error_listener_example' => 'error/phlog.php', + 'phutil_escape_html' => 'markup/render.php', + 'phutil_escape_html_newlines' => 'markup/render.php', + 'phutil_escape_uri' => 'markup/render.php', + 'phutil_escape_uri_path_component' => 'markup/render.php', + 'phutil_fnmatch' => 'utils/utils.php', + 'phutil_format_bytes' => 'utils/viewutils.php', + 'phutil_format_relative_time' => 'utils/viewutils.php', + 'phutil_format_relative_time_detailed' => 'utils/viewutils.php', + 'phutil_format_units_generic' => 'utils/viewutils.php', + 'phutil_fwrite_nonblocking_stream' => 'utils/utils.php', + 'phutil_get_current_library_name' => 'moduleutils/moduleutils.php', + 'phutil_get_library_name_for_root' => 'moduleutils/moduleutils.php', + 'phutil_get_library_root' => 'moduleutils/moduleutils.php', + 'phutil_get_library_root_for_path' => 'moduleutils/moduleutils.php', + 'phutil_get_signal_name' => 'future/exec/execx.php', + 'phutil_get_system_locale' => 'utils/utf8.php', + 'phutil_hashes_are_identical' => 'utils/utils.php', + 'phutil_implode_html' => 'markup/render.php', + 'phutil_ini_decode' => 'utils/utils.php', + 'phutil_is_hiphop_runtime' => 'utils/utils.php', + 'phutil_is_system_locale_available' => 'utils/utf8.php', + 'phutil_is_utf8' => 'utils/utf8.php', + 'phutil_is_utf8_slowly' => 'utils/utf8.php', + 'phutil_is_utf8_with_only_bmp_characters' => 'utils/utf8.php', + 'phutil_is_windows' => 'utils/utils.php', + 'phutil_json_decode' => 'utils/utils.php', + 'phutil_json_encode' => 'utils/utils.php', + 'phutil_load_library' => 'moduleutils/core.php', + 'phutil_loggable_string' => 'utils/utils.php', + 'phutil_parse_bytes' => 'utils/viewutils.php', + 'phutil_passthru' => 'future/exec/execx.php', + 'phutil_person' => 'internationalization/pht.php', + 'phutil_register_library' => 'moduleutils/core.php', + 'phutil_register_library_map' => 'moduleutils/core.php', + 'phutil_safe_html' => 'markup/render.php', + 'phutil_set_system_locale' => 'utils/utf8.php', + 'phutil_split_lines' => 'utils/utils.php', + 'phutil_tag' => 'markup/render.php', + 'phutil_tag_div' => 'markup/render.php', + 'phutil_unescape_uri_path_component' => 'markup/render.php', + 'phutil_units' => 'utils/utils.php', + 'phutil_utf8_console_strlen' => 'utils/utf8.php', + 'phutil_utf8_convert' => 'utils/utf8.php', + 'phutil_utf8_encode_codepoint' => 'utils/utf8.php', + 'phutil_utf8_hard_wrap' => 'utils/utf8.php', + 'phutil_utf8_hard_wrap_html' => 'utils/utf8.php', + 'phutil_utf8_is_cjk' => 'utils/utf8.php', + 'phutil_utf8_is_combining_character' => 'utils/utf8.php', + 'phutil_utf8_strlen' => 'utils/utf8.php', + 'phutil_utf8_strtolower' => 'utils/utf8.php', + 'phutil_utf8_strtoupper' => 'utils/utf8.php', + 'phutil_utf8_strtr' => 'utils/utf8.php', + 'phutil_utf8_ucwords' => 'utils/utf8.php', + 'phutil_utf8ize' => 'utils/utf8.php', + 'phutil_utf8v' => 'utils/utf8.php', + 'phutil_utf8v_codepoints' => 'utils/utf8.php', + 'phutil_utf8v_combine_characters' => 'utils/utf8.php', + 'phutil_utf8v_combined' => 'utils/utf8.php', + 'phutil_validate_json' => 'utils/utils.php', + 'phutil_var_export' => 'utils/utils.php', + 'ppull' => 'utils/utils.php', + 'pregsprintf' => 'xsprintf/pregsprintf.php', + 'qsprintf' => 'xsprintf/qsprintf.php', + 'qsprintf_check_scalar_type' => 'xsprintf/qsprintf.php', + 'qsprintf_check_type' => 'xsprintf/qsprintf.php', + 'queryfx' => 'xsprintf/queryfx.php', + 'queryfx_all' => 'xsprintf/queryfx.php', + 'queryfx_one' => 'xsprintf/queryfx.php', + 'tsprintf' => 'xsprintf/tsprintf.php', + 'urisprintf' => 'xsprintf/urisprintf.php', + 'vcsprintf' => 'xsprintf/csprintf.php', + 'vjsprintf' => 'xsprintf/jsprintf.php', + 'vqsprintf' => 'xsprintf/qsprintf.php', + 'vurisprintf' => 'xsprintf/urisprintf.php', + 'xhp_parser_node_constants' => 'parser/xhpast/parser_nodes.php', + 'xhpast_parser_token_constants' => 'parser/xhpast/parser_tokens.php', + 'xsprintf' => 'xsprintf/xsprintf.php', + 'xsprintf_callback_example' => 'xsprintf/xsprintf.php', + 'xsprintf_command' => 'xsprintf/csprintf.php', + 'xsprintf_javascript' => 'xsprintf/jsprintf.php', + 'xsprintf_ldap' => 'xsprintf/ldapsprintf.php', + 'xsprintf_mercurial' => 'xsprintf/hgsprintf.php', + 'xsprintf_query' => 'xsprintf/qsprintf.php', + 'xsprintf_regex' => 'xsprintf/pregsprintf.php', + 'xsprintf_terminal' => 'xsprintf/tsprintf.php', + 'xsprintf_uri' => 'xsprintf/urisprintf.php', + ), 'xmap' => array( 'ArcanistAbstractMethodBodyXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistAbstractMethodBodyXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', @@ -912,5 +1525,516 @@ 'PytestTestEngine' => 'ArcanistUnitTestEngine', 'XUnitTestEngine' => 'ArcanistUnitTestEngine', 'XUnitTestResultParserTestCase' => 'PhutilTestCase', + 'AASTNode' => 'Phobject', + 'AASTNodeList' => array( + 'Phobject', + 'Countable', + 'Iterator', + ), + 'AASTToken' => 'Phobject', + 'AASTTree' => 'Phobject', + 'AbstractDirectedGraph' => 'Phobject', + 'AbstractDirectedGraphTestCase' => 'PhutilTestCase', + 'AphrontAccessDeniedQueryException' => 'AphrontQueryException', + 'AphrontBaseMySQLDatabaseConnection' => 'AphrontDatabaseConnection', + 'AphrontCharacterSetQueryException' => 'AphrontQueryException', + 'AphrontConnectionLostQueryException' => 'AphrontRecoverableQueryException', + 'AphrontConnectionQueryException' => 'AphrontQueryException', + 'AphrontCountQueryException' => 'AphrontQueryException', + 'AphrontDatabaseConnection' => array( + 'Phobject', + 'PhutilQsprintfInterface', + ), + 'AphrontDatabaseTransactionState' => 'Phobject', + 'AphrontDeadlockQueryException' => 'AphrontRecoverableQueryException', + 'AphrontDuplicateKeyQueryException' => 'AphrontQueryException', + 'AphrontHTTPHeaderParser' => 'Phobject', + 'AphrontHTTPHeaderParserTestCase' => 'PhutilTestCase', + 'AphrontInvalidCredentialsQueryException' => 'AphrontQueryException', + 'AphrontIsolatedDatabaseConnection' => 'AphrontDatabaseConnection', + 'AphrontLockTimeoutQueryException' => 'AphrontRecoverableQueryException', + 'AphrontMultipartParser' => 'Phobject', + 'AphrontMultipartParserTestCase' => 'PhutilTestCase', + 'AphrontMultipartPart' => 'Phobject', + 'AphrontMySQLDatabaseConnection' => 'AphrontBaseMySQLDatabaseConnection', + 'AphrontMySQLiDatabaseConnection' => 'AphrontBaseMySQLDatabaseConnection', + 'AphrontNotSupportedQueryException' => 'AphrontQueryException', + 'AphrontObjectMissingQueryException' => 'AphrontQueryException', + 'AphrontParameterQueryException' => 'AphrontQueryException', + 'AphrontQueryException' => 'Exception', + 'AphrontQueryTimeoutQueryException' => 'AphrontRecoverableQueryException', + 'AphrontRecoverableQueryException' => 'AphrontQueryException', + 'AphrontRequestStream' => 'Phobject', + 'AphrontSchemaQueryException' => 'AphrontQueryException', + 'AphrontScopedUnguardedWriteCapability' => 'Phobject', + 'AphrontWriteGuard' => 'Phobject', + 'BaseHTTPFuture' => 'Future', + 'CaseInsensitiveArray' => 'PhutilArray', + 'CaseInsensitiveArrayTestCase' => 'PhutilTestCase', + 'CommandException' => 'Exception', + 'ConduitClient' => 'Phobject', + 'ConduitClientException' => 'Exception', + 'ConduitClientTestCase' => 'PhutilTestCase', + 'ConduitFuture' => 'FutureProxy', + 'ExecFuture' => 'PhutilExecutableFuture', + 'ExecFutureTestCase' => 'PhutilTestCase', + 'ExecPassthruTestCase' => 'PhutilTestCase', + 'FileFinder' => 'Phobject', + 'FileFinderTestCase' => 'PhutilTestCase', + 'FileList' => 'Phobject', + 'Filesystem' => 'Phobject', + 'FilesystemException' => 'Exception', + 'FilesystemTestCase' => 'PhutilTestCase', + 'Future' => 'Phobject', + 'FutureIterator' => array( + 'Phobject', + 'Iterator', + ), + 'FutureIteratorTestCase' => 'PhutilTestCase', + 'FutureProxy' => 'Future', + 'HTTPFuture' => 'BaseHTTPFuture', + 'HTTPFutureCURLResponseStatus' => 'HTTPFutureResponseStatus', + 'HTTPFutureCertificateResponseStatus' => 'HTTPFutureResponseStatus', + 'HTTPFutureHTTPResponseStatus' => 'HTTPFutureResponseStatus', + 'HTTPFutureParseResponseStatus' => 'HTTPFutureResponseStatus', + 'HTTPFutureResponseStatus' => 'Exception', + 'HTTPFutureTransportResponseStatus' => 'HTTPFutureResponseStatus', + 'HTTPSFuture' => 'BaseHTTPFuture', + 'ImmediateFuture' => 'Future', + 'LibphutilUSEnglishTranslation' => 'PhutilTranslation', + 'LinesOfALarge' => array( + 'Phobject', + 'Iterator', + ), + 'LinesOfALargeExecFuture' => 'LinesOfALarge', + 'LinesOfALargeExecFutureTestCase' => 'PhutilTestCase', + 'LinesOfALargeFile' => 'LinesOfALarge', + 'LinesOfALargeFileTestCase' => 'PhutilTestCase', + 'MFilterTestHelper' => 'Phobject', + 'PHPASTParserTestCase' => 'PhutilTestCase', + 'PhageAction' => 'Phobject', + 'PhageAgentAction' => 'PhageAction', + 'PhageAgentBootloader' => 'Phobject', + 'PhageAgentTestCase' => 'PhutilTestCase', + 'PhageExecuteAction' => 'PhageAction', + 'PhageLocalAction' => 'PhageAgentAction', + 'PhagePHPAgent' => 'Phobject', + 'PhagePHPAgentBootloader' => 'PhageAgentBootloader', + 'PhagePlanAction' => 'PhageAction', + 'Phobject' => 'Iterator', + 'PhobjectTestCase' => 'PhutilTestCase', + 'PhutilAPCKeyValueCache' => 'PhutilKeyValueCache', + 'PhutilAWSCloudFormationFuture' => 'PhutilAWSFuture', + 'PhutilAWSCloudWatchFuture' => 'PhutilAWSFuture', + 'PhutilAWSEC2Future' => 'PhutilAWSFuture', + 'PhutilAWSException' => 'Exception', + 'PhutilAWSFuture' => 'FutureProxy', + 'PhutilAWSManagementWorkflow' => 'PhutilArgumentWorkflow', + 'PhutilAWSS3DeleteManagementWorkflow' => 'PhutilAWSS3ManagementWorkflow', + 'PhutilAWSS3Future' => 'PhutilAWSFuture', + 'PhutilAWSS3GetManagementWorkflow' => 'PhutilAWSS3ManagementWorkflow', + 'PhutilAWSS3ManagementWorkflow' => 'PhutilAWSManagementWorkflow', + 'PhutilAWSS3PutManagementWorkflow' => 'PhutilAWSS3ManagementWorkflow', + 'PhutilAWSv4Signature' => 'Phobject', + 'PhutilAWSv4SignatureTestCase' => 'PhutilTestCase', + 'PhutilAggregateException' => 'Exception', + 'PhutilAllCapsEnglishLocale' => 'PhutilLocale', + 'PhutilAmazonAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilArgumentParser' => 'Phobject', + 'PhutilArgumentParserException' => 'Exception', + 'PhutilArgumentParserTestCase' => 'PhutilTestCase', + 'PhutilArgumentSpecification' => 'Phobject', + 'PhutilArgumentSpecificationException' => 'PhutilArgumentParserException', + 'PhutilArgumentSpecificationTestCase' => 'PhutilTestCase', + 'PhutilArgumentSpellingCorrector' => 'Phobject', + 'PhutilArgumentSpellingCorrectorTestCase' => 'PhutilTestCase', + 'PhutilArgumentUsageException' => 'PhutilArgumentParserException', + 'PhutilArgumentWorkflow' => 'Phobject', + 'PhutilArray' => array( + 'Phobject', + 'Countable', + 'ArrayAccess', + 'Iterator', + ), + 'PhutilArrayTestCase' => 'PhutilTestCase', + 'PhutilArrayWithDefaultValue' => 'PhutilArray', + 'PhutilAsanaAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilAsanaFuture' => 'FutureProxy', + 'PhutilAuthAdapter' => 'Phobject', + 'PhutilAuthConfigurationException' => 'PhutilAuthException', + 'PhutilAuthCredentialException' => 'PhutilAuthException', + 'PhutilAuthException' => 'Exception', + 'PhutilAuthUserAbortedException' => 'PhutilAuthException', + 'PhutilBacktraceSignalHandler' => 'PhutilSignalHandler', + 'PhutilBallOfPHP' => 'Phobject', + 'PhutilBinaryAnalyzer' => 'Phobject', + 'PhutilBinaryAnalyzerTestCase' => 'PhutilTestCase', + 'PhutilBitbucketAuthAdapter' => 'PhutilOAuth1AuthAdapter', + 'PhutilBootloaderException' => 'Exception', + 'PhutilBritishEnglishLocale' => 'PhutilLocale', + 'PhutilBufferedIterator' => array( + 'Phobject', + 'Iterator', + ), + 'PhutilBufferedIteratorTestCase' => 'PhutilTestCase', + 'PhutilBugtraqParser' => 'Phobject', + 'PhutilBugtraqParserTestCase' => 'PhutilTestCase', + 'PhutilCIDRBlock' => 'Phobject', + 'PhutilCIDRList' => 'Phobject', + 'PhutilCLikeCodeSnippetContextFreeGrammar' => 'PhutilCodeSnippetContextFreeGrammar', + 'PhutilCalendarAbsoluteDateTime' => 'PhutilCalendarDateTime', + 'PhutilCalendarContainerNode' => 'PhutilCalendarNode', + 'PhutilCalendarDateTime' => 'Phobject', + 'PhutilCalendarDateTimeTestCase' => 'PhutilTestCase', + 'PhutilCalendarDocumentNode' => 'PhutilCalendarContainerNode', + 'PhutilCalendarDuration' => 'Phobject', + 'PhutilCalendarEventNode' => 'PhutilCalendarContainerNode', + 'PhutilCalendarNode' => 'Phobject', + 'PhutilCalendarProxyDateTime' => 'PhutilCalendarDateTime', + 'PhutilCalendarRawNode' => 'PhutilCalendarContainerNode', + 'PhutilCalendarRecurrenceList' => 'PhutilCalendarRecurrenceSource', + 'PhutilCalendarRecurrenceRule' => 'PhutilCalendarRecurrenceSource', + 'PhutilCalendarRecurrenceRuleTestCase' => 'PhutilTestCase', + 'PhutilCalendarRecurrenceSet' => 'Phobject', + 'PhutilCalendarRecurrenceSource' => 'Phobject', + 'PhutilCalendarRecurrenceTestCase' => 'PhutilTestCase', + 'PhutilCalendarRelativeDateTime' => 'PhutilCalendarProxyDateTime', + 'PhutilCalendarRootNode' => 'PhutilCalendarContainerNode', + 'PhutilCalendarUserNode' => 'PhutilCalendarNode', + 'PhutilCallbackFilterIterator' => 'FilterIterator', + 'PhutilCallbackSignalHandler' => 'PhutilSignalHandler', + 'PhutilChannel' => 'Phobject', + 'PhutilChannelChannel' => 'PhutilChannel', + 'PhutilChannelTestCase' => 'PhutilTestCase', + 'PhutilChunkedIterator' => array( + 'Phobject', + 'Iterator', + ), + 'PhutilChunkedIteratorTestCase' => 'PhutilTestCase', + 'PhutilClassMapQuery' => 'Phobject', + 'PhutilCloudWatchMetric' => 'Phobject', + 'PhutilCodeSnippetContextFreeGrammar' => 'PhutilContextFreeGrammar', + 'PhutilCommandString' => 'Phobject', + 'PhutilConsole' => 'Phobject', + 'PhutilConsoleBlock' => 'PhutilConsoleView', + 'PhutilConsoleError' => 'PhutilConsoleLogLine', + 'PhutilConsoleFormatter' => 'Phobject', + 'PhutilConsoleInfo' => 'PhutilConsoleLogLine', + 'PhutilConsoleList' => 'PhutilConsoleView', + 'PhutilConsoleLogLine' => 'PhutilConsoleView', + 'PhutilConsoleMessage' => 'Phobject', + 'PhutilConsoleMetrics' => 'Phobject', + 'PhutilConsoleMetricsSignalHandler' => 'PhutilSignalHandler', + 'PhutilConsoleProgressBar' => 'Phobject', + 'PhutilConsoleServer' => 'Phobject', + 'PhutilConsoleServerChannel' => 'PhutilChannelChannel', + 'PhutilConsoleSkip' => 'PhutilConsoleLogLine', + 'PhutilConsoleStdinNotInteractiveException' => 'Exception', + 'PhutilConsoleSyntaxHighlighter' => 'Phobject', + 'PhutilConsoleTable' => 'PhutilConsoleView', + 'PhutilConsoleView' => 'Phobject', + 'PhutilConsoleWarning' => 'PhutilConsoleLogLine', + 'PhutilConsoleWrapTestCase' => 'PhutilTestCase', + 'PhutilContextFreeGrammar' => 'Phobject', + 'PhutilCowsay' => 'Phobject', + 'PhutilCowsayTestCase' => 'PhutilTestCase', + 'PhutilCsprintfTestCase' => 'PhutilTestCase', + 'PhutilCzechLocale' => 'PhutilLocale', + 'PhutilDaemon' => 'Phobject', + 'PhutilDaemonHandle' => 'Phobject', + 'PhutilDaemonOverseer' => 'Phobject', + 'PhutilDaemonOverseerModule' => 'Phobject', + 'PhutilDaemonPool' => 'Phobject', + 'PhutilDefaultSyntaxHighlighter' => 'Phobject', + 'PhutilDefaultSyntaxHighlighterEngine' => 'PhutilSyntaxHighlighterEngine', + 'PhutilDefaultSyntaxHighlighterEnginePygmentsFuture' => 'FutureProxy', + 'PhutilDefaultSyntaxHighlighterEngineTestCase' => 'PhutilTestCase', + 'PhutilDeferredLog' => 'Phobject', + 'PhutilDeferredLogTestCase' => 'PhutilTestCase', + 'PhutilDiffBinaryAnalyzer' => 'PhutilBinaryAnalyzer', + 'PhutilDirectedScalarGraph' => 'AbstractDirectedGraph', + 'PhutilDirectoryFixture' => 'Phobject', + 'PhutilDirectoryKeyValueCache' => 'PhutilKeyValueCache', + 'PhutilDisqusAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilDivinerSyntaxHighlighter' => 'Phobject', + 'PhutilDocblockParser' => 'Phobject', + 'PhutilDocblockParserTestCase' => 'PhutilTestCase', + 'PhutilEditDistanceMatrix' => 'Phobject', + 'PhutilEditDistanceMatrixTestCase' => 'PhutilTestCase', + 'PhutilEditorConfig' => 'Phobject', + 'PhutilEditorConfigTestCase' => 'PhutilTestCase', + 'PhutilEmailAddress' => 'Phobject', + 'PhutilEmailAddressTestCase' => 'PhutilTestCase', + 'PhutilEmojiLocale' => 'PhutilLocale', + 'PhutilEmptyAuthAdapter' => 'PhutilAuthAdapter', + 'PhutilEnglishCanadaLocale' => 'PhutilLocale', + 'PhutilErrorHandler' => 'Phobject', + 'PhutilErrorHandlerTestCase' => 'PhutilTestCase', + 'PhutilErrorTrap' => 'Phobject', + 'PhutilEvent' => 'Phobject', + 'PhutilEventConstants' => 'Phobject', + 'PhutilEventEngine' => 'Phobject', + 'PhutilEventListener' => 'Phobject', + 'PhutilEventType' => 'PhutilEventConstants', + 'PhutilExampleBufferedIterator' => 'PhutilBufferedIterator', + 'PhutilExcessiveServiceCallsDaemon' => 'PhutilTortureTestDaemon', + 'PhutilExecChannel' => 'PhutilChannel', + 'PhutilExecPassthru' => 'PhutilExecutableFuture', + 'PhutilExecutableFuture' => 'Future', + 'PhutilExecutionEnvironment' => 'Phobject', + 'PhutilExtensionsTestCase' => 'PhutilTestCase', + 'PhutilFacebookAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilFatalDaemon' => 'PhutilTortureTestDaemon', + 'PhutilFileLock' => 'PhutilLock', + 'PhutilFileLockTestCase' => 'PhutilTestCase', + 'PhutilFileTree' => 'Phobject', + 'PhutilFrenchLocale' => 'PhutilLocale', + 'PhutilGermanLocale' => 'PhutilLocale', + 'PhutilGitBinaryAnalyzer' => 'PhutilBinaryAnalyzer', + 'PhutilGitHubAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilGitHubFuture' => 'FutureProxy', + 'PhutilGitHubResponse' => 'Phobject', + 'PhutilGitURI' => 'Phobject', + 'PhutilGitURITestCase' => 'PhutilTestCase', + 'PhutilGoogleAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilHTTPEngineExtension' => 'Phobject', + 'PhutilHTTPResponse' => 'Phobject', + 'PhutilHTTPResponseParser' => 'Phobject', + 'PhutilHTTPResponseParserTestCase' => 'PhutilTestCase', + 'PhutilHangForeverDaemon' => 'PhutilTortureTestDaemon', + 'PhutilHashingIterator' => array( + 'PhutilProxyIterator', + 'Iterator', + ), + 'PhutilHashingIteratorTestCase' => 'PhutilTestCase', + 'PhutilHelpArgumentWorkflow' => 'PhutilArgumentWorkflow', + 'PhutilHgsprintfTestCase' => 'PhutilTestCase', + 'PhutilHighIntensityIntervalDaemon' => 'PhutilTortureTestDaemon', + 'PhutilICSParser' => 'Phobject', + 'PhutilICSParserException' => 'Exception', + 'PhutilICSParserTestCase' => 'PhutilTestCase', + 'PhutilICSWriter' => 'Phobject', + 'PhutilICSWriterTestCase' => 'PhutilTestCase', + 'PhutilINIParserException' => 'Exception', + 'PhutilIPAddress' => 'Phobject', + 'PhutilIPAddressTestCase' => 'PhutilTestCase', + 'PhutilIPv4Address' => 'PhutilIPAddress', + 'PhutilIPv6Address' => 'PhutilIPAddress', + 'PhutilInRequestKeyValueCache' => 'PhutilKeyValueCache', + 'PhutilInteractiveEditor' => 'Phobject', + 'PhutilInvalidRuleParserGeneratorException' => 'PhutilParserGeneratorException', + 'PhutilInvalidStateException' => 'Exception', + 'PhutilInvalidStateExceptionTestCase' => 'PhutilTestCase', + 'PhutilInvisibleSyntaxHighlighter' => 'Phobject', + 'PhutilIrreducibleRuleParserGeneratorException' => 'PhutilParserGeneratorException', + 'PhutilJIRAAuthAdapter' => 'PhutilOAuth1AuthAdapter', + 'PhutilJSON' => 'Phobject', + 'PhutilJSONFragmentLexer' => 'PhutilLexer', + 'PhutilJSONFragmentLexerHighlighterTestCase' => 'PhutilTestCase', + 'PhutilJSONParser' => 'Phobject', + 'PhutilJSONParserException' => 'Exception', + 'PhutilJSONParserTestCase' => 'PhutilTestCase', + 'PhutilJSONProtocolChannel' => 'PhutilProtocolChannel', + 'PhutilJSONProtocolChannelTestCase' => 'PhutilTestCase', + 'PhutilJSONTestCase' => 'PhutilTestCase', + 'PhutilJavaCodeSnippetContextFreeGrammar' => 'PhutilCLikeCodeSnippetContextFreeGrammar', + 'PhutilJavaFragmentLexer' => 'PhutilLexer', + 'PhutilKeyValueCache' => 'Phobject', + 'PhutilKeyValueCacheNamespace' => 'PhutilKeyValueCacheProxy', + 'PhutilKeyValueCacheProfiler' => 'PhutilKeyValueCacheProxy', + 'PhutilKeyValueCacheProxy' => 'PhutilKeyValueCache', + 'PhutilKeyValueCacheStack' => 'PhutilKeyValueCache', + 'PhutilKeyValueCacheTestCase' => 'PhutilTestCase', + 'PhutilKoreanLocale' => 'PhutilLocale', + 'PhutilLDAPAuthAdapter' => 'PhutilAuthAdapter', + 'PhutilLanguageGuesser' => 'Phobject', + 'PhutilLanguageGuesserTestCase' => 'PhutilTestCase', + 'PhutilLexer' => 'Phobject', + 'PhutilLexerSyntaxHighlighter' => 'PhutilSyntaxHighlighter', + 'PhutilLibraryConflictException' => 'Exception', + 'PhutilLibraryMapBuilder' => 'Phobject', + 'PhutilLibraryTestCase' => 'PhutilTestCase', + 'PhutilLipsumContextFreeGrammar' => 'PhutilContextFreeGrammar', + 'PhutilLocale' => 'Phobject', + 'PhutilLocaleTestCase' => 'PhutilTestCase', + 'PhutilLock' => 'Phobject', + 'PhutilLockException' => 'Exception', + 'PhutilLogFileChannel' => 'PhutilChannelChannel', + 'PhutilLunarPhase' => 'Phobject', + 'PhutilLunarPhaseTestCase' => 'PhutilTestCase', + 'PhutilMarkupEngine' => 'Phobject', + 'PhutilMarkupTestCase' => 'PhutilTestCase', + 'PhutilMemcacheKeyValueCache' => 'PhutilKeyValueCache', + 'PhutilMercurialBinaryAnalyzer' => 'PhutilBinaryAnalyzer', + 'PhutilMethodNotImplementedException' => 'Exception', + 'PhutilMetricsChannel' => 'PhutilChannelChannel', + 'PhutilMissingSymbolException' => 'Exception', + 'PhutilModuleUtilsTestCase' => 'PhutilTestCase', + 'PhutilNiceDaemon' => 'PhutilTortureTestDaemon', + 'PhutilNumber' => 'Phobject', + 'PhutilOAuth1AuthAdapter' => 'PhutilAuthAdapter', + 'PhutilOAuth1Future' => 'FutureProxy', + 'PhutilOAuth1FutureTestCase' => 'PhutilTestCase', + 'PhutilOAuthAuthAdapter' => 'PhutilAuthAdapter', + 'PhutilOnDiskKeyValueCache' => 'PhutilKeyValueCache', + 'PhutilOpaqueEnvelope' => 'Phobject', + 'PhutilOpaqueEnvelopeKey' => 'Phobject', + 'PhutilOpaqueEnvelopeTestCase' => 'PhutilTestCase', + 'PhutilPHPCodeSnippetContextFreeGrammar' => 'PhutilCLikeCodeSnippetContextFreeGrammar', + 'PhutilPHPFragmentLexer' => 'PhutilLexer', + 'PhutilPHPFragmentLexerHighlighterTestCase' => 'PhutilTestCase', + 'PhutilPHPFragmentLexerTestCase' => 'PhutilTestCase', + 'PhutilPHPObjectProtocolChannel' => 'PhutilProtocolChannel', + 'PhutilPHPObjectProtocolChannelTestCase' => 'PhutilTestCase', + 'PhutilParserGenerator' => 'Phobject', + 'PhutilParserGeneratorException' => 'Exception', + 'PhutilParserGeneratorTestCase' => 'PhutilTestCase', + 'PhutilPayPalAPIFuture' => 'FutureProxy', + 'PhutilPersonTest' => array( + 'Phobject', + 'PhutilPerson', + ), + 'PhutilPhabricatorAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilPhtTestCase' => 'PhutilTestCase', + 'PhutilPirateEnglishLocale' => 'PhutilLocale', + 'PhutilPortugueseBrazilLocale' => 'PhutilLocale', + 'PhutilPortuguesePortugalLocale' => 'PhutilLocale', + 'PhutilPostmarkFuture' => 'FutureProxy', + 'PhutilPregsprintfTestCase' => 'PhutilTestCase', + 'PhutilProcessGroupDaemon' => 'PhutilTortureTestDaemon', + 'PhutilProseDiff' => 'Phobject', + 'PhutilProseDiffTestCase' => 'PhutilTestCase', + 'PhutilProseDifferenceEngine' => 'Phobject', + 'PhutilProtocolChannel' => 'PhutilChannelChannel', + 'PhutilProxyException' => 'Exception', + 'PhutilProxyIterator' => array( + 'Phobject', + 'Iterator', + ), + 'PhutilPygmentizeBinaryAnalyzer' => 'PhutilBinaryAnalyzer', + 'PhutilPygmentizeParser' => 'Phobject', + 'PhutilPygmentizeParserTestCase' => 'PhutilTestCase', + 'PhutilPygmentsSyntaxHighlighter' => 'Phobject', + 'PhutilPythonFragmentLexer' => 'PhutilLexer', + 'PhutilQueryStringParser' => 'Phobject', + 'PhutilQueryStringParserTestCase' => 'PhutilTestCase', + 'PhutilRainbowSyntaxHighlighter' => 'Phobject', + 'PhutilRawEnglishLocale' => 'PhutilLocale', + 'PhutilReadableSerializer' => 'Phobject', + 'PhutilReadableSerializerTestCase' => 'PhutilTestCase', + 'PhutilRealNameContextFreeGrammar' => 'PhutilContextFreeGrammar', + 'PhutilRemarkupBlockInterpreter' => 'Phobject', + 'PhutilRemarkupBlockRule' => 'Phobject', + 'PhutilRemarkupBlockStorage' => 'Phobject', + 'PhutilRemarkupBoldRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupCodeBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupDefaultBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupDelRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupDocumentLinkRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupEngine' => 'PhutilMarkupEngine', + 'PhutilRemarkupEngineTestCase' => 'PhutilTestCase', + 'PhutilRemarkupEscapeRemarkupRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupHeaderBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupHighlightRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupHorizontalRuleBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupHyperlinkRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupInlineBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupInterpreterBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupItalicRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupLinebreaksRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupListBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupLiteralBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupMonospaceRule' => 'PhutilRemarkupRule', + 'PhutilRemarkupNoteBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupQuotesBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupReplyBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupRule' => 'Phobject', + 'PhutilRemarkupSimpleTableBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupTableBlockRule' => 'PhutilRemarkupBlockRule', + 'PhutilRemarkupTestInterpreterRule' => 'PhutilRemarkupBlockInterpreter', + 'PhutilRemarkupUnderlineRule' => 'PhutilRemarkupRule', + 'PhutilRope' => 'Phobject', + 'PhutilRopeTestCase' => 'PhutilTestCase', + 'PhutilSafeHTML' => 'Phobject', + 'PhutilSafeHTMLTestCase' => 'PhutilTestCase', + 'PhutilSaturateStdoutDaemon' => 'PhutilTortureTestDaemon', + 'PhutilSearchQueryCompiler' => 'Phobject', + 'PhutilSearchQueryCompilerSyntaxException' => 'Exception', + 'PhutilSearchQueryCompilerTestCase' => 'PhutilTestCase', + 'PhutilSearchQueryToken' => 'Phobject', + 'PhutilSearchStemmer' => 'Phobject', + 'PhutilSearchStemmerTestCase' => 'PhutilTestCase', + 'PhutilServiceProfiler' => 'Phobject', + 'PhutilShellLexer' => 'PhutilLexer', + 'PhutilShellLexerTestCase' => 'PhutilTestCase', + 'PhutilSignalHandler' => 'Phobject', + 'PhutilSignalRouter' => 'Phobject', + 'PhutilSimpleOptions' => 'Phobject', + 'PhutilSimpleOptionsLexer' => 'PhutilLexer', + 'PhutilSimpleOptionsLexerTestCase' => 'PhutilTestCase', + 'PhutilSimpleOptionsTestCase' => 'PhutilTestCase', + 'PhutilSimplifiedChineseLocale' => 'PhutilLocale', + 'PhutilSlackAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilSlackFuture' => 'FutureProxy', + 'PhutilSocketChannel' => 'PhutilChannel', + 'PhutilSortVector' => 'Phobject', + 'PhutilSpanishSpainLocale' => 'PhutilLocale', + 'PhutilSprite' => 'Phobject', + 'PhutilSpriteSheet' => 'Phobject', + 'PhutilStreamIterator' => array( + 'Phobject', + 'Iterator', + ), + 'PhutilSubversionBinaryAnalyzer' => 'PhutilBinaryAnalyzer', + 'PhutilSyntaxHighlighter' => 'Phobject', + 'PhutilSyntaxHighlighterEngine' => 'Phobject', + 'PhutilSyntaxHighlighterException' => 'Exception', + 'PhutilSystem' => 'Phobject', + 'PhutilSystemTestCase' => 'PhutilTestCase', + 'PhutilTerminalString' => 'Phobject', + 'PhutilTestPhobject' => 'Phobject', + 'PhutilTortureTestDaemon' => 'PhutilDaemon', + 'PhutilTraditionalChineseLocale' => 'PhutilLocale', + 'PhutilTranslation' => 'Phobject', + 'PhutilTranslationTestCase' => 'PhutilTestCase', + 'PhutilTranslator' => 'Phobject', + 'PhutilTranslatorTestCase' => 'PhutilTestCase', + 'PhutilTsprintfTestCase' => 'PhutilTestCase', + 'PhutilTwitchAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilTwitchFuture' => 'FutureProxy', + 'PhutilTwitterAuthAdapter' => 'PhutilOAuth1AuthAdapter', + 'PhutilTypeCheckException' => 'Exception', + 'PhutilTypeExtraParametersException' => 'Exception', + 'PhutilTypeLexer' => 'PhutilLexer', + 'PhutilTypeMissingParametersException' => 'Exception', + 'PhutilTypeSpec' => 'Phobject', + 'PhutilTypeSpecTestCase' => 'PhutilTestCase', + 'PhutilURI' => 'Phobject', + 'PhutilURITestCase' => 'PhutilTestCase', + 'PhutilUSEnglishLocale' => 'PhutilLocale', + 'PhutilUTF8StringTruncator' => 'Phobject', + 'PhutilUTF8TestCase' => 'PhutilTestCase', + 'PhutilUnknownSymbolParserGeneratorException' => 'PhutilParserGeneratorException', + 'PhutilUnreachableRuleParserGeneratorException' => 'PhutilParserGeneratorException', + 'PhutilUnreachableTerminalParserGeneratorException' => 'PhutilParserGeneratorException', + 'PhutilUrisprintfTestCase' => 'PhutilTestCase', + 'PhutilUtilsTestCase' => 'PhutilTestCase', + 'PhutilVeryWowEnglishLocale' => 'PhutilLocale', + 'PhutilWordPressAuthAdapter' => 'PhutilOAuthAuthAdapter', + 'PhutilWordPressFuture' => 'FutureProxy', + 'PhutilXHPASTBinary' => 'Phobject', + 'PhutilXHPASTSyntaxHighlighter' => 'Phobject', + 'PhutilXHPASTSyntaxHighlighterFuture' => 'FutureProxy', + 'PhutilXHPASTSyntaxHighlighterTestCase' => 'PhutilTestCase', + 'QueryFuture' => 'Future', + 'TempFile' => 'Phobject', + 'TestAbstractDirectedGraph' => 'AbstractDirectedGraph', + 'XHPASTNode' => 'AASTNode', + 'XHPASTNodeTestCase' => 'PhutilTestCase', + 'XHPASTSyntaxErrorException' => 'Exception', + 'XHPASTToken' => 'AASTToken', + 'XHPASTTree' => 'AASTTree', + 'XHPASTTreeTestCase' => 'PhutilTestCase', + 'XsprintfUnknownConversionException' => 'InvalidArgumentException', ), )); diff --git a/src/__tests__/PhutilLibraryTestCase.php b/src/__tests__/PhutilLibraryTestCase.php new file mode 100644 --- /dev/null +++ b/src/__tests__/PhutilLibraryTestCase.php @@ -0,0 +1,191 @@ +setLibrary($this->getLibraryName()) + ->selectAndLoadSymbols(); + $this->assertTrue(true); + } + + /** + * This is more of an acceptance test case instead of a unit test. It verifies + * that all the library map is up-to-date. + */ + public function testLibraryMap() { + $root = $this->getLibraryRoot(); + $library = phutil_get_library_name_for_root($root); + + $new_library_map = id(new PhutilLibraryMapBuilder($root)) + ->buildMap(); + + $bootloader = PhutilBootloader::getInstance(); + $old_library_map = $bootloader->getLibraryMapWithoutExtensions($library); + unset($old_library_map[PhutilLibraryMapBuilder::LIBRARY_MAP_VERSION_KEY]); + + $identical = ($new_library_map === $old_library_map); + if (!$identical) { + $differences = $this->getMapDifferences( + $old_library_map, + $new_library_map); + sort($differences); + } else { + $differences = array(); + } + + $this->assertTrue( + $identical, + pht( + "The library map is out of date. Rebuild it with `%s`.\n". + "These entries differ: %s.", + 'arc liberate', + implode(', ', $differences))); + } + + + private function getMapDifferences($old, $new) { + $changed = array(); + + $all = $old + $new; + foreach ($all as $key => $value) { + $old_exists = array_key_exists($key, $old); + $new_exists = array_key_exists($key, $new); + + // One map has it and the other does not, so mark it as changed. + if ($old_exists != $new_exists) { + $changed[] = $key; + continue; + } + + $oldv = idx($old, $key); + $newv = idx($new, $key); + if ($oldv === $newv) { + continue; + } + + if (is_array($oldv) && is_array($newv)) { + $child_changed = $this->getMapDifferences($oldv, $newv); + foreach ($child_changed as $child) { + $changed[] = $key.'.'.$child; + } + } else { + $changed[] = $key; + } + } + + return $changed; + } + + + /** + * This is more of an acceptance test case instead of a unit test. It verifies + * that methods in subclasses have the same visibility as the method in the + * parent class. + */ + public function testMethodVisibility() { + $symbols = id(new PhutilSymbolLoader()) + ->setLibrary($this->getLibraryName()) + ->selectSymbolsWithoutLoading(); + + $classes = array(); + foreach ($symbols as $symbol) { + if ($symbol['type'] == 'class') { + $classes[$symbol['name']] = new ReflectionClass($symbol['name']); + } + } + + $failures = array(); + + foreach ($classes as $class_name => $class) { + $parents = array(); + $parent = $class; + while ($parent = $parent->getParentClass()) { + $parents[] = $parent; + } + + $interfaces = $class->getInterfaces(); + + foreach ($class->getMethods() as $method) { + $method_name = $method->getName(); + + foreach (array_merge($parents, $interfaces) as $extends) { + if ($extends->hasMethod($method_name)) { + $xmethod = $extends->getMethod($method_name); + + if (!$this->compareVisibility($xmethod, $method)) { + $failures[] = pht( + 'Class "%s" implements method "%s" with the wrong visibility. '. + 'The method has visibility "%s", but it is defined in parent '. + '"%s" with visibility "%s". In Phabricator, a method which '. + 'overrides another must always have the same visibility.', + $class_name, + $method_name, + $this->getVisibility($method), + $extends->getName(), + $this->getVisibility($xmethod)); + } + + // We found a declaration somewhere, so stop looking. + break; + } + } + } + } + + $this->assertTrue( + empty($failures), + "\n\n".implode("\n\n", $failures)); + } + + /** + * Get the name of the library currently being tested. + */ + protected function getLibraryName() { + return phutil_get_library_name_for_root($this->getLibraryRoot()); + } + + /** + * Get the root directory for the library currently being tested. + */ + protected function getLibraryRoot() { + $caller = id(new ReflectionClass($this))->getFileName(); + return phutil_get_library_root_for_path($caller); + } + + private function compareVisibility( + ReflectionMethod $parent_method, + ReflectionMethod $method) { + + static $bitmask; + + if ($bitmask === null) { + $bitmask = ReflectionMethod::IS_PUBLIC; + $bitmask += ReflectionMethod::IS_PROTECTED; + $bitmask += ReflectionMethod::IS_PRIVATE; + } + + $parent_modifiers = $parent_method->getModifiers(); + $modifiers = $method->getModifiers(); + return !(($parent_modifiers ^ $modifiers) & $bitmask); + } + + private function getVisibility(ReflectionMethod $method) { + if ($method->isPrivate()) { + return 'private'; + } else if ($method->isProtected()) { + return 'protected'; + } else { + return 'public'; + } + } + +} diff --git a/src/aphront/headerparser/AphrontHTTPHeaderParser.php b/src/aphront/headerparser/AphrontHTTPHeaderParser.php new file mode 100644 --- /dev/null +++ b/src/aphront/headerparser/AphrontHTTPHeaderParser.php @@ -0,0 +1,150 @@ +name = null; + $this->content = null; + + $parts = explode(':', $raw_header, 2); + $this->name = trim($parts[0]); + if (count($parts) > 1) { + $this->content = trim($parts[1]); + } + + $this->pairs = null; + + return $this; + } + + public function getHeaderName() { + $this->requireParse(); + return $this->name; + } + + public function getHeaderContent() { + $this->requireParse(); + return $this->content; + } + + public function getHeaderContentAsPairs() { + $content = $this->getHeaderContent(); + + + $state = 'prekey'; + $length = strlen($content); + + $pair_name = null; + $pair_value = null; + + $pairs = array(); + $ii = 0; + while ($ii < $length) { + $c = $content[$ii]; + + switch ($state) { + case 'prekey'; + // We're eating space in front of a key. + if ($c == ' ') { + $ii++; + break; + } + $pair_name = ''; + $state = 'key'; + break; + case 'key'; + // We're parsing a key name until we find "=" or ";". + if ($c == ';') { + $state = 'done'; + break; + } + + if ($c == '=') { + $ii++; + $state = 'value'; + break; + } + + $ii++; + $pair_name .= $c; + break; + case 'value': + // We found an "=", so now figure out if the value is quoted + // or not. + if ($c == '"') { + $ii++; + $state = 'quoted'; + break; + } + $state = 'unquoted'; + break; + case 'quoted': + // We're in a quoted string, parse until we find the closing quote. + if ($c == '"') { + $ii++; + $state = 'done'; + break; + } + + $ii++; + $pair_value .= $c; + break; + case 'unquoted': + // We're in an unquoted string, parse until we find a space or a + // semicolon. + if ($c == ' ' || $c == ';') { + $state = 'done'; + break; + } + $ii++; + $pair_value .= $c; + break; + case 'done': + // We parsed something, so eat any trailing whitespace and semicolons + // and look for a new value. + if ($c == ' ' || $c == ';') { + $ii++; + break; + } + + $pairs[] = array( + $pair_name, + $pair_value, + ); + + $pair_name = null; + $pair_value = null; + + $state = 'prekey'; + break; + } + } + + if ($state == 'quoted') { + throw new Exception( + pht( + 'Header has unterminated double quote for key "%s".', + $pair_name)); + } + + if ($pair_name !== null) { + $pairs[] = array( + $pair_name, + $pair_value, + ); + } + + return $pairs; + } + + private function requireParse() { + if ($this->name === null) { + throw new PhutilInvalidStateException('parseRawHeader'); + } + } + +} diff --git a/src/aphront/headerparser/__tests__/AphrontHTTPHeaderParserTestCase.php b/src/aphront/headerparser/__tests__/AphrontHTTPHeaderParserTestCase.php new file mode 100644 --- /dev/null +++ b/src/aphront/headerparser/__tests__/AphrontHTTPHeaderParserTestCase.php @@ -0,0 +1,108 @@ +parseRawHeader($input); + + $actual_name = $parser->getHeaderName(); + $actual_content = $parser->getHeaderContent(); + + $this->assertEqual( + $expect_name, + $actual_name, + pht('Header name for: %s', $input)); + + $this->assertEqual( + $expect_content, + $actual_content, + pht('Header content for: %s', $input)); + + if (isset($case[3])) { + $expect_pairs = $case[3]; + + $caught = null; + try { + $actual_pairs = $parser->getHeaderContentAsPairs(); + } catch (Exception $ex) { + $caught = $ex; + } + + if ($expect_pairs === false) { + $this->assertEqual( + true, + ($caught instanceof Exception), + pht('Expect exception for header pairs of: %s', $input)); + } else { + $this->assertEqual( + $expect_pairs, + $actual_pairs, + pht('Header pairs for: %s', $input)); + } + } + } + } + + +} diff --git a/src/aphront/multipartparser/AphrontMultipartParser.php b/src/aphront/multipartparser/AphrontMultipartParser.php new file mode 100644 --- /dev/null +++ b/src/aphront/multipartparser/AphrontMultipartParser.php @@ -0,0 +1,249 @@ +contentType = $content_type; + return $this; + } + + public function getContentType() { + return $this->contentType; + } + + public function beginParse() { + $content_type = $this->getContentType(); + if ($content_type === null) { + throw new PhutilInvalidStateException('setContentType'); + } + + if (!preg_match('(^multipart/form-data)', $content_type)) { + throw new Exception( + pht( + 'Expected "multipart/form-data" content type when executing a '. + 'multipart body read.')); + } + + $type_parts = preg_split('(\s*;\s*)', $content_type); + $boundary = null; + foreach ($type_parts as $type_part) { + $matches = null; + if (preg_match('(^boundary=(.*))', $type_part, $matches)) { + $boundary = $matches[1]; + break; + } + } + + if ($boundary === null) { + throw new Exception( + pht('Received "multipart/form-data" request with no "boundary".')); + } + + $this->parts = array(); + $this->part = null; + + $this->buffer = ''; + $this->boundary = $boundary; + + // We're looking for a (usually empty) body before the first boundary. + $this->state = 'bodynewline'; + } + + public function continueParse($bytes) { + $this->buffer .= $bytes; + + $continue = true; + while ($continue) { + switch ($this->state) { + case 'endboundary': + // We've just parsed a boundary. Next, we expect either "--" (which + // indicates we've reached the end of the parts) or "\r\n" (which + // indicates we should read the headers for the next part). + + if (strlen($this->buffer) < 2) { + // We don't have enough bytes yet, so wait for more. + $continue = false; + break; + } + + if (!strncmp($this->buffer, '--', 2)) { + // This is "--" after a boundary, so we're done. We'll read the + // rest of the body (the "epilogue") and discard it. + $this->buffer = substr($this->buffer, 2); + $this->state = 'epilogue'; + + $this->part = null; + break; + } + + if (!strncmp($this->buffer, "\r\n", 2)) { + // This is "\r\n" after a boundary, so we're going to going to + // read the headers for a part. + $this->buffer = substr($this->buffer, 2); + $this->state = 'header'; + + // Create the object to hold the part we're about to read. + $part = new AphrontMultipartPart(); + $this->parts[] = $part; + $this->part = $part; + break; + } + + throw new Exception( + pht('Expected "\r\n" or "--" after multipart data boundary.')); + case 'header': + // We've just parsed a boundary, followed by "\r\n". We are going + // to read the headers for this part. They are in the form of HTTP + // headers and terminated by "\r\n". The section is terminated by + // a line with no header on it. + + if (strlen($this->buffer) < 2) { + // We don't have enough data to find a "\r\n", so wait for more. + $continue = false; + break; + } + + if (!strncmp("\r\n", $this->buffer, 2)) { + // This line immediately began "\r\n", so we're done with parsing + // headers. Start parsing the body. + $this->buffer = substr($this->buffer, 2); + $this->state = 'body'; + break; + } + + // This is an actual header, so look for the end of it. + $header_len = strpos($this->buffer, "\r\n"); + if ($header_len === false) { + // We don't have a full header yet, so wait for more data. + $continue = false; + break; + } + + $header_buf = substr($this->buffer, 0, $header_len); + $this->part->appendRawHeader($header_buf); + + $this->buffer = substr($this->buffer, $header_len + 2); + break; + case 'body': + // We've parsed a boundary and headers, and are parsing the data for + // this part. The data is terminated by "\r\n--", then the boundary. + + // We'll look for "\r\n", then switch to the "bodynewline" state if + // we find it. + + $marker = "\r"; + $marker_pos = strpos($this->buffer, $marker); + + if ($marker_pos === false) { + // There's no "\r" anywhere in the buffer, so we can just read it + // as provided. Then, since we read all the data, we're done until + // we get more. + + // Note that if we're in the preamble, we won't have a "part" + // object and will just discard the data. + if ($this->part) { + $this->part->appendData($this->buffer); + } + $this->buffer = ''; + $continue = false; + break; + } + + if ($marker_pos > 0) { + // If there are bytes before the "\r", + if ($this->part) { + $this->part->appendData(substr($this->buffer, 0, $marker_pos)); + } + $this->buffer = substr($this->buffer, $marker_pos); + } + + $expect = "\r\n"; + $expect_len = strlen($expect); + if (strlen($this->buffer) < $expect_len) { + // We don't have enough bytes yet to know if this is "\r\n" + // or not. + $continue = false; + break; + } + + if (strncmp($this->buffer, $expect, $expect_len)) { + // The next two bytes aren't "\r\n", so eat them and go looking + // for more newlines. + if ($this->part) { + $this->part->appendData(substr($this->buffer, 0, $expect_len)); + } + $this->buffer = substr($this->buffer, $expect_len); + break; + } + + // Eat the "\r\n". + $this->buffer = substr($this->buffer, $expect_len); + $this->state = 'bodynewline'; + break; + case 'bodynewline': + // We've parsed a newline in a body, or we just started parsing the + // request. In either case, we're looking for "--", then the boundary. + // If we find it, this section is done. If we don't, we consume the + // bytes and move on. + + $expect = '--'.$this->boundary; + $expect_len = strlen($expect); + + if (strlen($this->buffer) < $expect_len) { + // We don't have enough bytes yet, so wait for more. + $continue = false; + break; + } + + if (strncmp($this->buffer, $expect, $expect_len)) { + // This wasn't the boundary, so return to the "body" state and + // consume it. (But first, we need to append the "\r\n" which we + // ate earlier.) + if ($this->part) { + $this->part->appendData("\r\n"); + } + $this->state = 'body'; + break; + } + + // This is the boundary, so toss it and move on. + $this->buffer = substr($this->buffer, $expect_len); + $this->state = 'endboundary'; + break; + case 'epilogue': + // We just discard any epilogue. + $this->buffer = ''; + $continue = false; + break; + default: + throw new Exception( + pht( + 'Unknown parser state "%s".\n', + $this->state)); + } + } + } + + public function endParse() { + if ($this->state !== 'epilogue') { + throw new Exception( + pht( + 'Expected "multipart/form-data" parse to end '. + 'in state "epilogue".')); + } + + return $this->parts; + } + + +} diff --git a/src/aphront/multipartparser/AphrontMultipartPart.php b/src/aphront/multipartparser/AphrontMultipartPart.php new file mode 100644 --- /dev/null +++ b/src/aphront/multipartparser/AphrontMultipartPart.php @@ -0,0 +1,96 @@ +parseRawHeader($bytes); + + $header_name = $parser->getHeaderName(); + + $this->headers[] = array( + $header_name, + $parser->getHeaderContent(), + ); + + if (strtolower($header_name) === 'content-disposition') { + $pairs = $parser->getHeaderContentAsPairs(); + foreach ($pairs as $pair) { + list($key, $value) = $pair; + switch ($key) { + case 'filename': + $this->filename = $value; + break; + case 'name': + $this->name = $value; + break; + } + } + } + + return $this; + } + + public function appendData($bytes) { + $this->byteSize += strlen($bytes); + + if ($this->isVariable()) { + $this->value .= $bytes; + } else { + if (!$this->tempFile) { + $this->tempFile = new TempFile(getmypid().'.upload'); + } + Filesystem::appendFile($this->tempFile, $bytes); + } + + return $this; + } + + public function isVariable() { + return ($this->filename === null); + } + + public function getName() { + return $this->name; + } + + public function getVariableValue() { + if (!$this->isVariable()) { + throw new Exception(pht('This part is not a variable!')); + } + + return $this->value; + } + + public function getPHPFileDictionary() { + if (!$this->tempFile) { + $this->appendData(''); + } + + $mime_type = 'application/octet-stream'; + foreach ($this->headers as $header) { + list($name, $value) = $header; + if (strtolower($name) == 'content-type') { + $mime_type = $value; + break; + } + } + + return array( + 'name' => $this->filename, + 'type' => $mime_type, + 'tmp_name' => (string)$this->tempFile, + 'error' => 0, + 'size' => $this->byteSize, + ); + } + +} diff --git a/src/aphront/multipartparser/__tests__/AphrontMultipartParserTestCase.php b/src/aphront/multipartparser/__tests__/AphrontMultipartParserTestCase.php new file mode 100644 --- /dev/null +++ b/src/aphront/multipartparser/__tests__/AphrontMultipartParserTestCase.php @@ -0,0 +1,45 @@ + 'simple.txt', + 'variables' => array( + array('a', 'b'), + ), + ), + ); + + $data_dir = dirname(__FILE__).'/data/'; + foreach ($map as $test_case) { + $data = Filesystem::readFile($data_dir.$test_case['data']); + $data = str_replace("\n", "\r\n", $data); + + $parser = id(new AphrontMultipartParser()) + ->setContentType('multipart/form-data; boundary=ABCDEFG'); + $parser->beginParse(); + $parser->continueParse($data); + $parts = $parser->endParse(); + + $variables = array(); + foreach ($parts as $part) { + if (!$part->isVariable()) { + continue; + } + + $variables[] = array( + $part->getName(), + $part->getVariableValue(), + ); + } + + $expect_variables = idx($test_case, 'variables', array()); + $this->assertEqual($expect_variables, $variables); + } + } + + + +} diff --git a/src/aphront/multipartparser/__tests__/data/simple.txt b/src/aphront/multipartparser/__tests__/data/simple.txt new file mode 100644 --- /dev/null +++ b/src/aphront/multipartparser/__tests__/data/simple.txt @@ -0,0 +1,5 @@ +--ABCDEFG +Content-Disposition: form-data; name="a" + +b +--ABCDEFG-- diff --git a/src/aphront/requeststream/AphrontRequestStream.php b/src/aphront/requeststream/AphrontRequestStream.php new file mode 100644 --- /dev/null +++ b/src/aphront/requeststream/AphrontRequestStream.php @@ -0,0 +1,92 @@ +encoding = $encoding; + return $this; + } + + public function getEncoding() { + return $this->encoding; + } + + public function getIterator() { + if (!$this->iterator) { + $this->iterator = new PhutilStreamIterator($this->getStream()); + } + return $this->iterator; + } + + public function readData() { + if (!$this->iterator) { + $iterator = $this->getIterator(); + $iterator->rewind(); + } else { + $iterator = $this->getIterator(); + } + + if (!$iterator->valid()) { + return null; + } + + $data = $iterator->current(); + $iterator->next(); + + return $data; + } + + private function getStream() { + if (!$this->stream) { + $this->stream = $this->newStream(); + } + + return $this->stream; + } + + private function newStream() { + $stream = fopen('php://input', 'rb'); + if (!$stream) { + throw new Exception( + pht( + 'Failed to open stream "%s" for reading.', + 'php://input')); + } + + $encoding = $this->getEncoding(); + if ($encoding === 'gzip') { + // This parameter is magic. Values 0-15 express a time/memory tradeoff, + // but the largest value (15) corresponds to only 32KB of memory and + // data encoded with a smaller window size than the one we pass can not + // be decompressed. Always pass the maximum window size. + + // Additionally, you can add 16 (to enable gzip) or 32 (to enable both + // gzip and zlib). Add 32 to support both. + $zlib_window = 15 + 32; + + $ok = stream_filter_append( + $stream, + 'zlib.inflate', + STREAM_FILTER_READ, + array( + 'window' => $zlib_window, + )); + if (!$ok) { + throw new Exception( + pht( + 'Failed to append filter "%s" to input stream while processing '. + 'a request with "%s" encoding.', + 'zlib.inflate', + $encoding)); + } + } + + return $stream; + } + +} diff --git a/src/aphront/storage/connection/AphrontDatabaseConnection.php b/src/aphront/storage/connection/AphrontDatabaseConnection.php new file mode 100644 --- /dev/null +++ b/src/aphront/storage/connection/AphrontDatabaseConnection.php @@ -0,0 +1,284 @@ +close(); + } + + final public function setLastActiveEpoch($epoch) { + $this->lastActiveEpoch = $epoch; + return $this; + } + + final public function getLastActiveEpoch() { + return $this->lastActiveEpoch; + } + + final public function setPersistent($persistent) { + $this->persistent = $persistent; + return $this; + } + + final public function getPersistent() { + return $this->persistent; + } + + public function queryData($pattern/* , $arg, $arg, ... */) { + $args = func_get_args(); + array_unshift($args, $this); + return call_user_func_array('queryfx_all', $args); + } + + public function query($pattern/* , $arg, $arg, ... */) { + $args = func_get_args(); + array_unshift($args, $this); + return call_user_func_array('queryfx', $args); + } + + + public function supportsAsyncQueries() { + return false; + } + + public function supportsParallelQueries() { + return false; + } + + public function setReadOnly($read_only) { + $this->readOnly = $read_only; + return $this; + } + + public function getReadOnly() { + return $this->readOnly; + } + + public function setQueryTimeout($query_timeout) { + $this->queryTimeout = $query_timeout; + return $this; + } + + public function getQueryTimeout() { + return $this->queryTimeout; + } + + public function asyncQuery($raw_query) { + throw new Exception(pht('Async queries are not supported.')); + } + + public static function resolveAsyncQueries(array $conns, array $asyncs) { + throw new Exception(pht('Async queries are not supported.')); + } + + +/* -( Global Locks )------------------------------------------------------- */ + + + public function rememberLock($lock) { + if (isset($this->locks[$lock])) { + throw new Exception( + pht( + 'Trying to remember lock "%s", but this lock has already been '. + 'remembered.', + $lock)); + } + + $this->locks[$lock] = true; + return $this; + } + + + public function forgetLock($lock) { + if (empty($this->locks[$lock])) { + throw new Exception( + pht( + 'Trying to forget lock "%s", but this connection does not remember '. + 'that lock.', + $lock)); + } + + unset($this->locks[$lock]); + return $this; + } + + + public function forgetAllLocks() { + $this->locks = array(); + return $this; + } + + + public function isHoldingAnyLock() { + return (bool)$this->locks; + } + + +/* -( Transaction Management )--------------------------------------------- */ + + + /** + * Begin a transaction, or set a savepoint if the connection is already + * transactional. + * + * @return this + * @task xaction + */ + public function openTransaction() { + $state = $this->getTransactionState(); + $point = $state->getSavepointName(); + $depth = $state->getDepth(); + + $new_transaction = ($depth == 0); + if ($new_transaction) { + $this->query('START TRANSACTION'); + } else { + $this->query('SAVEPOINT '.$point); + } + + $state->increaseDepth(); + + return $this; + } + + + /** + * Commit a transaction, or stage a savepoint for commit once the entire + * transaction completes if inside a transaction stack. + * + * @return this + * @task xaction + */ + public function saveTransaction() { + $state = $this->getTransactionState(); + $depth = $state->decreaseDepth(); + + if ($depth == 0) { + $this->query('COMMIT'); + } + + return $this; + } + + + /** + * Rollback a transaction, or unstage the last savepoint if inside a + * transaction stack. + * + * @return this + */ + public function killTransaction() { + $state = $this->getTransactionState(); + $depth = $state->decreaseDepth(); + + if ($depth == 0) { + $this->query('ROLLBACK'); + } else { + $this->query('ROLLBACK TO SAVEPOINT '.$state->getSavepointName()); + } + + return $this; + } + + + /** + * Returns true if the connection is transactional. + * + * @return bool True if the connection is currently transactional. + * @task xaction + */ + public function isInsideTransaction() { + $state = $this->getTransactionState(); + return ($state->getDepth() > 0); + } + + + /** + * Get the current @{class:AphrontDatabaseTransactionState} object, or create + * one if none exists. + * + * @return AphrontDatabaseTransactionState Current transaction state. + * @task xaction + */ + protected function getTransactionState() { + if (!$this->transactionState) { + $this->transactionState = new AphrontDatabaseTransactionState(); + } + return $this->transactionState; + } + + + /** + * @task xaction + */ + public function beginReadLocking() { + $this->getTransactionState()->beginReadLocking(); + return $this; + } + + + /** + * @task xaction + */ + public function endReadLocking() { + $this->getTransactionState()->endReadLocking(); + return $this; + } + + + /** + * @task xaction + */ + public function isReadLocking() { + return $this->getTransactionState()->isReadLocking(); + } + + + /** + * @task xaction + */ + public function beginWriteLocking() { + $this->getTransactionState()->beginWriteLocking(); + return $this; + } + + + /** + * @task xaction + */ + public function endWriteLocking() { + $this->getTransactionState()->endWriteLocking(); + return $this; + } + + + /** + * @task xaction + */ + public function isWriteLocking() { + return $this->getTransactionState()->isWriteLocking(); + } + +} diff --git a/src/aphront/storage/connection/AphrontDatabaseTransactionState.php b/src/aphront/storage/connection/AphrontDatabaseTransactionState.php new file mode 100644 --- /dev/null +++ b/src/aphront/storage/connection/AphrontDatabaseTransactionState.php @@ -0,0 +1,105 @@ +depth; + } + + public function increaseDepth() { + return ++$this->depth; + } + + public function decreaseDepth() { + if ($this->depth == 0) { + throw new Exception( + pht( + 'Too many calls to %s or %s!', + 'saveTransaction()', + 'killTransaction()')); + } + + return --$this->depth; + } + + public function getSavepointName() { + return 'Aphront_Savepoint_'.$this->depth; + } + + public function beginReadLocking() { + $this->readLockLevel++; + return $this; + } + + public function endReadLocking() { + if ($this->readLockLevel == 0) { + throw new Exception( + pht( + 'Too many calls to %s!', + __FUNCTION__.'()')); + } + $this->readLockLevel--; + return $this; + } + + public function isReadLocking() { + return ($this->readLockLevel > 0); + } + + public function beginWriteLocking() { + $this->writeLockLevel++; + return $this; + } + + public function endWriteLocking() { + if ($this->writeLockLevel == 0) { + throw new Exception( + pht( + 'Too many calls to %s!', + __FUNCTION__.'()')); + } + $this->writeLockLevel--; + return $this; + } + + public function isWriteLocking() { + return ($this->writeLockLevel > 0); + } + + public function __destruct() { + if ($this->depth) { + throw new Exception( + pht( + 'Process exited with an open transaction! The transaction '. + 'will be implicitly rolled back. Calls to %s must always be '. + 'paired with a call to %s or %s.', + 'openTransaction()', + 'saveTransaction()', + 'killTransaction()')); + } + if ($this->readLockLevel) { + throw new Exception( + pht( + 'Process exited with an open read lock! Call to %s '. + 'must always be paired with a call to %s.', + 'beginReadLocking()', + 'endReadLocking()')); + } + if ($this->writeLockLevel) { + throw new Exception( + pht( + 'Process exited with an open write lock! Call to %s '. + 'must always be paired with a call to %s.', + 'beginWriteLocking()', + 'endWriteLocking()')); + } + } + +} diff --git a/src/aphront/storage/connection/AphrontIsolatedDatabaseConnection.php b/src/aphront/storage/connection/AphrontIsolatedDatabaseConnection.php new file mode 100644 --- /dev/null +++ b/src/aphront/storage/connection/AphrontIsolatedDatabaseConnection.php @@ -0,0 +1,129 @@ +configuration = $configuration; + + if (self::$nextInsertID === null) { + // Generate test IDs into a distant ID space to reduce the risk of + // collisions and make them distinctive. + self::$nextInsertID = 55555000000 + mt_rand(0, 1000); + } + } + + public function openConnection() { + return; + } + + public function close() { + return; + } + + public function escapeUTF8String($string) { + return ''; + } + + public function escapeBinaryString($string) { + return ''; + } + + public function escapeColumnName($name) { + return ''; + } + + public function escapeMultilineComment($comment) { + return ''; + } + + public function escapeStringForLikeClause($value) { + return ''; + } + + private function getConfiguration($key, $default = null) { + return idx($this->configuration, $key, $default); + } + + public function getInsertID() { + return $this->insertID; + } + + public function getAffectedRows() { + return $this->affectedRows; + } + + public function selectAllResults() { + return $this->allResults; + } + + public function executeRawQuery($raw_query) { + + // NOTE: "[\s<>K]*" allows any number of (properly escaped) comments to + // appear prior to the allowed keyword, since this connection escapes + // them as "" (above). + + $keywords = array( + 'INSERT', + 'UPDATE', + 'DELETE', + 'START', + 'SAVEPOINT', + 'COMMIT', + 'ROLLBACK', + ); + $preg_keywords = array(); + foreach ($keywords as $key => $word) { + $preg_keywords[] = preg_quote($word, '/'); + } + $preg_keywords = implode('|', $preg_keywords); + + if (!preg_match('/^[\s<>K]*('.$preg_keywords.')\s*/i', $raw_query)) { + throw new AphrontNotSupportedQueryException( + pht( + "Database isolation currently only supports some queries. You are ". + "trying to issue a query which does not begin with an allowed ". + "keyword (%s): '%s'.", + implode(', ', $keywords), + $raw_query)); + } + + $this->transcript[] = $raw_query; + + // NOTE: This method is intentionally simplified for now, since we're only + // using it to stub out inserts/updates. In the future it will probably need + // to grow more powerful. + + $this->allResults = array(); + + // NOTE: We jitter the insert IDs to keep tests honest; a test should cover + // the relationship between objects, not their exact insertion order. This + // guarantees that IDs are unique but makes it impossible to hard-code tests + // against this specific implementation detail. + self::$nextInsertID += mt_rand(1, 10); + $this->insertID = self::$nextInsertID; + $this->affectedRows = 1; + } + + public function executeRawQueries(array $raw_queries) { + $results = array(); + foreach ($raw_queries as $id => $raw_query) { + $results[$id] = array(); + } + return $results; + } + + public function getQueryTranscript() { + return $this->transcript; + } + +} diff --git a/src/aphront/storage/connection/mysql/AphrontBaseMySQLDatabaseConnection.php b/src/aphront/storage/connection/mysql/AphrontBaseMySQLDatabaseConnection.php new file mode 100644 --- /dev/null +++ b/src/aphront/storage/connection/mysql/AphrontBaseMySQLDatabaseConnection.php @@ -0,0 +1,384 @@ +configuration = $configuration; + } + + public function __clone() { + $this->establishConnection(); + } + + public function openConnection() { + $this->requireConnection(); + } + + public function close() { + if ($this->lastResult) { + $this->lastResult = null; + } + if ($this->connection) { + $this->closeConnection(); + $this->connection = null; + } + } + + public function escapeColumnName($name) { + return '`'.str_replace('`', '``', $name).'`'; + } + + + public function escapeMultilineComment($comment) { + // These can either terminate a comment, confuse the hell out of the parser, + // make MySQL execute the comment as a query, or, in the case of semicolon, + // are quasi-dangerous because the semicolon could turn a broken query into + // a working query plus an ignored query. + + static $map = array( + '--' => '(DOUBLEDASH)', + '*/' => '(STARSLASH)', + '//' => '(SLASHSLASH)', + '#' => '(HASH)', + '!' => '(BANG)', + ';' => '(SEMICOLON)', + ); + + $comment = str_replace( + array_keys($map), + array_values($map), + $comment); + + // For good measure, kill anything else that isn't a nice printable + // character. + $comment = preg_replace('/[^\x20-\x7F]+/', ' ', $comment); + + return '/* '.$comment.' */'; + } + + public function escapeStringForLikeClause($value) { + $value = addcslashes($value, '\%_'); + $value = $this->escapeUTF8String($value); + return $value; + } + + protected function getConfiguration($key, $default = null) { + return idx($this->configuration, $key, $default); + } + + private function establishConnection() { + $host = $this->getConfiguration('host'); + $database = $this->getConfiguration('database'); + + $profiler = PhutilServiceProfiler::getInstance(); + $call_id = $profiler->beginServiceCall( + array( + 'type' => 'connect', + 'host' => $host, + 'database' => $database, + )); + + $retries = max(1, $this->getConfiguration('retries', 3)); + while ($retries--) { + try { + $conn = $this->connect(); + $profiler->endServiceCall($call_id, array()); + break; + } catch (AphrontQueryException $ex) { + if ($retries && $ex->getCode() == 2003) { + $class = get_class($ex); + $message = $ex->getMessage(); + phlog(pht('Retrying (%d) after %s: %s', $retries, $class, $message)); + } else { + $profiler->endServiceCall($call_id, array()); + throw $ex; + } + } + } + + $this->connection = $conn; + } + + protected function requireConnection() { + if (!$this->connection) { + if ($this->connectionPool) { + $this->connection = array_pop($this->connectionPool); + } else { + $this->establishConnection(); + } + } + return $this->connection; + } + + protected function beginAsyncConnection() { + $connection = $this->requireConnection(); + $this->connection = null; + return $connection; + } + + protected function endAsyncConnection($connection) { + if ($this->connection) { + $this->connectionPool[] = $this->connection; + } + $this->connection = $connection; + } + + public function selectAllResults() { + $result = array(); + $res = $this->lastResult; + if ($res == null) { + throw new Exception(pht('No query result to fetch from!')); + } + while (($row = $this->fetchAssoc($res))) { + $result[] = $row; + } + return $result; + } + + public function executeRawQuery($raw_query) { + $this->lastResult = null; + $retries = max(1, $this->getConfiguration('retries', 3)); + while ($retries--) { + try { + $this->requireConnection(); + $is_write = $this->checkWrite($raw_query); + + $profiler = PhutilServiceProfiler::getInstance(); + $call_id = $profiler->beginServiceCall( + array( + 'type' => 'query', + 'config' => $this->configuration, + 'query' => $raw_query, + 'write' => $is_write, + )); + + $result = $this->rawQuery($raw_query); + + $profiler->endServiceCall($call_id, array()); + + if ($this->nextError) { + $result = null; + } + + if ($result) { + $this->lastResult = $result; + break; + } + + $this->throwQueryException($this->connection); + } catch (AphrontConnectionLostQueryException $ex) { + $can_retry = ($retries > 0); + + if ($this->isInsideTransaction()) { + // Zero out the transaction state to prevent a second exception + // ("program exited with open transaction") from being thrown, since + // we're about to throw a more relevant/useful one instead. + $state = $this->getTransactionState(); + while ($state->getDepth()) { + $state->decreaseDepth(); + } + + $can_retry = false; + } + + if ($this->isHoldingAnyLock()) { + $this->forgetAllLocks(); + $can_retry = false; + } + + $this->close(); + + if (!$can_retry) { + throw $ex; + } + } + } + } + + public function executeRawQueries(array $raw_queries) { + if (!$raw_queries) { + return array(); + } + + $is_write = false; + foreach ($raw_queries as $key => $raw_query) { + $is_write = $is_write || $this->checkWrite($raw_query); + $raw_queries[$key] = rtrim($raw_query, "\r\n\t ;"); + } + + $profiler = PhutilServiceProfiler::getInstance(); + $call_id = $profiler->beginServiceCall( + array( + 'type' => 'multi-query', + 'config' => $this->configuration, + 'queries' => $raw_queries, + 'write' => $is_write, + )); + + $results = $this->rawQueries($raw_queries); + + $profiler->endServiceCall($call_id, array()); + + return $results; + } + + protected function processResult($result) { + if (!$result) { + try { + $this->throwQueryException($this->requireConnection()); + } catch (Exception $ex) { + return $ex; + } + } else if (is_bool($result)) { + return $this->getAffectedRows(); + } + $rows = array(); + while (($row = $this->fetchAssoc($result))) { + $rows[] = $row; + } + $this->freeResult($result); + return $rows; + } + + protected function checkWrite($raw_query) { + // NOTE: The opening "(" allows queries in the form of: + // + // (SELECT ...) UNION (SELECT ...) + $is_write = !preg_match('/^[(]*(SELECT|SHOW|EXPLAIN)\s/', $raw_query); + if ($is_write) { + if ($this->getReadOnly()) { + throw new Exception( + pht( + 'Attempting to issue a write query on a read-only '. + 'connection (to database "%s")!', + $this->getConfiguration('database'))); + } + AphrontWriteGuard::willWrite(); + return true; + } + + return false; + } + + protected function throwQueryException($connection) { + if ($this->nextError) { + $errno = $this->nextError; + $error = pht('Simulated error.'); + $this->nextError = null; + } else { + $errno = $this->getErrorCode($connection); + $error = $this->getErrorDescription($connection); + } + $this->throwQueryCodeException($errno, $error); + } + + private function throwCommonException($errno, $error) { + $message = pht('#%d: %s', $errno, $error); + + switch ($errno) { + case 2013: // Connection Dropped + throw new AphrontConnectionLostQueryException($message); + case 2006: // Gone Away + $more = pht( + "This error may occur if your MySQL '%s' or '%s' ". + "configuration values are set too low.", + 'wait_timeout', + 'max_allowed_packet'); + throw new AphrontConnectionLostQueryException("{$message}\n\n{$more}"); + case 1213: // Deadlock + throw new AphrontDeadlockQueryException($message); + case 1205: // Lock wait timeout exceeded + throw new AphrontLockTimeoutQueryException($message); + case 1062: // Duplicate Key + // NOTE: In some versions of MySQL we get a key name back here, but + // older versions just give us a key index ("key 2") so it's not + // portable to parse the key out of the error and attach it to the + // exception. + throw new AphrontDuplicateKeyQueryException($message); + case 1044: // Access denied to database + case 1142: // Access denied to table + case 1143: // Access denied to column + case 1227: // Access denied (e.g., no SUPER for SHOW SLAVE STATUS). + throw new AphrontAccessDeniedQueryException($message); + case 1045: // Access denied (auth) + throw new AphrontInvalidCredentialsQueryException($message); + case 1146: // No such table + case 1049: // No such database + case 1054: // Unknown column "..." in field list + throw new AphrontSchemaQueryException($message); + } + + // TODO: 1064 is syntax error, and quite terrible in production. + + return null; + } + + protected function throwConnectionException($errno, $error, $user, $host) { + $this->throwCommonException($errno, $error); + + $message = pht( + 'Attempt to connect to %s@%s failed with error #%d: %s.', + $user, + $host, + $errno, + $error); + + throw new AphrontConnectionQueryException($message, $errno); + } + + + protected function throwQueryCodeException($errno, $error) { + $this->throwCommonException($errno, $error); + + $message = pht( + '#%d: %s', + $errno, + $error); + + throw new AphrontQueryException($message, $errno); + } + + /** + * Force the next query to fail with a simulated error. This should be used + * ONLY for unit tests. + */ + public function simulateErrorOnNextQuery($error) { + $this->nextError = $error; + return $this; + } + + /** + * Check inserts for characters outside of the BMP. Even with the strictest + * settings, MySQL will silently truncate data when it encounters these, which + * can lead to data loss and security problems. + */ + protected function validateUTF8String($string) { + if (phutil_is_utf8($string)) { + return; + } + + throw new AphrontCharacterSetQueryException( + pht( + 'Attempting to construct a query using a non-utf8 string when '. + 'utf8 is expected. Use the `%%B` conversion to escape binary '. + 'strings data.')); + } + +} diff --git a/src/aphront/storage/connection/mysql/AphrontMySQLDatabaseConnection.php b/src/aphront/storage/connection/mysql/AphrontMySQLDatabaseConnection.php new file mode 100644 --- /dev/null +++ b/src/aphront/storage/connection/mysql/AphrontMySQLDatabaseConnection.php @@ -0,0 +1,233 @@ +validateUTF8String($string); + return $this->escapeBinaryString($string); + } + + public function escapeBinaryString($string) { + return mysql_real_escape_string($string, $this->requireConnection()); + } + + public function getInsertID() { + return mysql_insert_id($this->requireConnection()); + } + + public function getAffectedRows() { + return mysql_affected_rows($this->requireConnection()); + } + + protected function closeConnection() { + mysql_close($this->requireConnection()); + } + + protected function connect() { + if (!function_exists('mysql_connect')) { + // We have to '@' the actual call since it can spew all sorts of silly + // noise, but it will also silence fatals caused by not having MySQL + // installed, which has bitten me on three separate occasions. Make sure + // such failures are explicit and loud. + throw new Exception( + pht( + 'About to call %s, but the PHP MySQL extension is not available!', + 'mysql_connect()')); + } + + $user = $this->getConfiguration('user'); + $host = $this->getConfiguration('host'); + $port = $this->getConfiguration('port'); + + if ($port) { + $host .= ':'.$port; + } + + $database = $this->getConfiguration('database'); + + $pass = $this->getConfiguration('pass'); + if ($pass instanceof PhutilOpaqueEnvelope) { + $pass = $pass->openEnvelope(); + } + + $timeout = $this->getConfiguration('timeout'); + $timeout_ini = 'mysql.connect_timeout'; + if ($timeout) { + $old_timeout = ini_get($timeout_ini); + ini_set($timeout_ini, $timeout); + } + + try { + $conn = @mysql_connect( + $host, + $user, + $pass, + $new_link = true, + $flags = 0); + } catch (Exception $ex) { + if ($timeout) { + ini_set($timeout_ini, $old_timeout); + } + throw $ex; + } + + if ($timeout) { + ini_set($timeout_ini, $old_timeout); + } + + if (!$conn) { + $errno = mysql_errno(); + $error = mysql_error(); + $this->throwConnectionException($errno, $error, $user, $host); + } + + if ($database !== null) { + $ret = @mysql_select_db($database, $conn); + if (!$ret) { + $this->throwQueryException($conn); + } + } + + $ok = @mysql_set_charset('utf8mb4', $conn); + if (!$ok) { + mysql_set_charset('binary', $conn); + } + + return $conn; + } + + protected function rawQuery($raw_query) { + return @mysql_query($raw_query, $this->requireConnection()); + } + + /** + * @phutil-external-symbol function mysql_multi_query + * @phutil-external-symbol function mysql_fetch_result + * @phutil-external-symbol function mysql_more_results + * @phutil-external-symbol function mysql_next_result + */ + protected function rawQueries(array $raw_queries) { + $conn = $this->requireConnection(); + $results = array(); + + if (!function_exists('mysql_multi_query')) { + foreach ($raw_queries as $key => $raw_query) { + $results[$key] = $this->processResult($this->rawQuery($raw_query)); + } + return $results; + } + + if (!mysql_multi_query(implode("\n;\n\n", $raw_queries), $conn)) { + $ex = $this->processResult(false); + return array_fill_keys(array_keys($raw_queries), $ex); + } + + $processed_all = false; + foreach ($raw_queries as $key => $raw_query) { + $results[$key] = $this->processResult(@mysql_fetch_result($conn)); + if (!mysql_more_results($conn)) { + $processed_all = true; + break; + } + mysql_next_result($conn); + } + + if (!$processed_all) { + throw new Exception( + pht('There are some results left in the result set.')); + } + + return $results; + } + + protected function freeResult($result) { + mysql_free_result($result); + } + + public function supportsParallelQueries() { + // fb_parallel_query() doesn't support results with different columns. + return false; + } + + /** + * @phutil-external-symbol function fb_parallel_query + */ + public function executeParallelQueries( + array $queries, + array $conns = array()) { + assert_instances_of($conns, __CLASS__); + + $map = array(); + $is_write = false; + foreach ($queries as $id => $query) { + $is_write = $is_write || $this->checkWrite($query); + $conn = idx($conns, $id, $this); + + $host = $conn->getConfiguration('host'); + $port = 0; + $match = null; + if (preg_match('/(.+):(.+)/', $host, $match)) { + list(, $host, $port) = $match; + } + + $pass = $conn->getConfiguration('pass'); + if ($pass instanceof PhutilOpaqueEnvelope) { + $pass = $pass->openEnvelope(); + } + + $map[$id] = array( + 'sql' => $query, + 'ip' => $host, + 'port' => $port, + 'username' => $conn->getConfiguration('user'), + 'password' => $pass, + 'db' => $conn->getConfiguration('database'), + ); + } + + $profiler = PhutilServiceProfiler::getInstance(); + $call_id = $profiler->beginServiceCall( + array( + 'type' => 'multi-query', + 'queries' => $queries, + 'write' => $is_write, + )); + + $map = fb_parallel_query($map); + + $profiler->endServiceCall($call_id, array()); + + $results = array(); + $pos = 0; + $err_pos = 0; + foreach ($queries as $id => $query) { + $errno = idx(idx($map, 'errno', array()), $err_pos); + $err_pos++; + if ($errno) { + try { + $this->throwQueryCodeException($errno, $map['error'][$id]); + } catch (Exception $ex) { + $results[$id] = $ex; + } + continue; + } + $results[$id] = $map['result'][$pos]; + $pos++; + } + return $results; + } + + protected function fetchAssoc($result) { + return mysql_fetch_assoc($result); + } + + protected function getErrorCode($connection) { + return mysql_errno($connection); + } + + protected function getErrorDescription($connection) { + return mysql_error($connection); + } + +} diff --git a/src/aphront/storage/connection/mysql/AphrontMySQLiDatabaseConnection.php b/src/aphront/storage/connection/mysql/AphrontMySQLiDatabaseConnection.php new file mode 100644 --- /dev/null +++ b/src/aphront/storage/connection/mysql/AphrontMySQLiDatabaseConnection.php @@ -0,0 +1,210 @@ +validateUTF8String($string); + return $this->escapeBinaryString($string); + } + + public function escapeBinaryString($string) { + return $this->requireConnection()->escape_string($string); + } + + public function getInsertID() { + return $this->requireConnection()->insert_id; + } + + public function getAffectedRows() { + return $this->requireConnection()->affected_rows; + } + + protected function closeConnection() { + if ($this->connectionOpen) { + $this->requireConnection()->close(); + $this->connectionOpen = false; + } + } + + protected function connect() { + if (!class_exists('mysqli', false)) { + throw new Exception(pht( + 'About to call new %s, but the PHP MySQLi extension is not available!', + 'mysqli()')); + } + + $user = $this->getConfiguration('user'); + $host = $this->getConfiguration('host'); + $port = $this->getConfiguration('port'); + $database = $this->getConfiguration('database'); + + $pass = $this->getConfiguration('pass'); + if ($pass instanceof PhutilOpaqueEnvelope) { + $pass = $pass->openEnvelope(); + } + + // If the host is "localhost", the port is ignored and mysqli attempts to + // connect over a socket. + if ($port) { + if ($host === 'localhost' || $host === null) { + $host = '127.0.0.1'; + } + } + + $conn = mysqli_init(); + + $timeout = $this->getConfiguration('timeout'); + if ($timeout) { + $conn->options(MYSQLI_OPT_CONNECT_TIMEOUT, $timeout); + } + + if ($this->getPersistent()) { + $host = 'p:'.$host; + } + + @$conn->real_connect( + $host, + $user, + $pass, + $database, + $port); + + $errno = $conn->connect_errno; + if ($errno) { + $error = $conn->connect_error; + $this->throwConnectionException($errno, $error, $user, $host); + } + + $this->connectionOpen = true; + + $ok = @$conn->set_charset('utf8mb4'); + if (!$ok) { + $ok = $conn->set_charset('binary'); + } + + return $conn; + } + + protected function rawQuery($raw_query) { + $conn = $this->requireConnection(); + $time_limit = $this->getQueryTimeout(); + + // If we have a query time limit, run this query synchronously but use + // the async API. This allows us to kill queries which take too long + // without requiring any configuration on the server side. + if ($time_limit && $this->supportsAsyncQueries()) { + $conn->query($raw_query, MYSQLI_ASYNC); + + $read = array($conn); + $error = array($conn); + $reject = array($conn); + + $result = mysqli::poll($read, $error, $reject, $time_limit); + + if ($result === false) { + $this->closeConnection(); + throw new Exception( + pht('Failed to poll mysqli connection!')); + } else if ($result === 0) { + $this->closeConnection(); + throw new AphrontQueryTimeoutQueryException( + pht( + 'Query timed out after %s second(s)!', + new PhutilNumber($time_limit))); + } + + return @$conn->reap_async_query(); + } + + return @$conn->query($raw_query); + } + + protected function rawQueries(array $raw_queries) { + $conn = $this->requireConnection(); + + $have_result = false; + $results = array(); + + foreach ($raw_queries as $key => $raw_query) { + if (!$have_result) { + // End line in front of semicolon to allow single line comments at the + // end of queries. + $have_result = $conn->multi_query(implode("\n;\n\n", $raw_queries)); + } else { + $have_result = $conn->next_result(); + } + + array_shift($raw_queries); + + $result = $conn->store_result(); + if (!$result && !$this->getErrorCode($conn)) { + $result = true; + } + $results[$key] = $this->processResult($result); + } + + if ($conn->more_results()) { + throw new Exception( + pht('There are some results left in the result set.')); + } + + return $results; + } + + protected function freeResult($result) { + $result->free_result(); + } + + protected function fetchAssoc($result) { + return $result->fetch_assoc(); + } + + protected function getErrorCode($connection) { + return $connection->errno; + } + + protected function getErrorDescription($connection) { + return $connection->error; + } + + public function supportsAsyncQueries() { + return defined('MYSQLI_ASYNC'); + } + + public function asyncQuery($raw_query) { + $this->checkWrite($raw_query); + $async = $this->beginAsyncConnection(); + $async->query($raw_query, MYSQLI_ASYNC); + return $async; + } + + public static function resolveAsyncQueries(array $conns, array $asyncs) { + assert_instances_of($conns, __CLASS__); + assert_instances_of($asyncs, 'mysqli'); + + $read = $error = $reject = array(); + foreach ($asyncs as $async) { + $read[] = $error[] = $reject[] = $async; + } + + if (!mysqli::poll($read, $error, $reject, 0)) { + return array(); + } + + $results = array(); + foreach ($read as $async) { + $key = array_search($async, $asyncs, $strict = true); + $conn = $conns[$key]; + $conn->endAsyncConnection($async); + $results[$key] = $conn->processResult($async->reap_async_query()); + } + return $results; + } + +} diff --git a/src/aphront/storage/exception/AphrontAccessDeniedQueryException.php b/src/aphront/storage/exception/AphrontAccessDeniedQueryException.php new file mode 100644 --- /dev/null +++ b/src/aphront/storage/exception/AphrontAccessDeniedQueryException.php @@ -0,0 +1,4 @@ +query = $query; + } + + public function getQuery() { + return $this->query; + } + +} diff --git a/src/aphront/storage/exception/AphrontQueryException.php b/src/aphront/storage/exception/AphrontQueryException.php new file mode 100644 --- /dev/null +++ b/src/aphront/storage/exception/AphrontQueryException.php @@ -0,0 +1,6 @@ +dispose(); + * + * Normally, you do not need to manage guards yourself -- the Aphront stack + * handles it for you. + * + * This class accepts a callback, which will be invoked when a write is + * attempted. The callback should validate the presence of a CSRF token in + * the request, or abort the request (e.g., by throwing an exception) if a + * valid token isn't present. + * + * @param callable CSRF callback. + * @return this + * @task manage + */ + public function __construct($callback) { + if (self::$instance) { + throw new Exception( + pht( + 'An %s already exists. Dispose of the previous guard '. + 'before creating a new one.', + __CLASS__)); + } + if (self::$allowUnguardedWrites) { + throw new Exception( + pht( + 'An %s is being created in a context which permits '. + 'unguarded writes unconditionally. This is not allowed and '. + 'indicates a serious error.', + __CLASS__)); + } + $this->callback = $callback; + self::$instance = $this; + } + + + /** + * Dispose of the active write guard. You must call this method when you are + * done with a write guard. You do not normally need to call this yourself. + * + * @return void + * @task manage + */ + public function dispose() { + if (!self::$instance) { + throw new Exception(pht( + 'Attempting to dispose of write guard, but no write guard is active!')); + } + + if ($this->allowDepth > 0) { + throw new Exception( + pht( + 'Imbalanced %s: more %s calls than %s calls.', + __CLASS__, + 'beginUnguardedWrites()', + 'endUnguardedWrites()')); + } + self::$instance = null; + } + + + /** + * Determine if there is an active write guard. + * + * @return bool + * @task manage + */ + public static function isGuardActive() { + return (bool)self::$instance; + } + + /** + * Return on instance of AphrontWriteGuard if it's active, or null + * + * @return AphrontWriteGuard|null + */ + public static function getInstance() { + return self::$instance; + } + + +/* -( Protecting Writes )-------------------------------------------------- */ + + + /** + * Declare intention to perform a write, validating that writes are allowed. + * You should call this method before executing a write whenever you implement + * a new storage engine where information can be permanently kept. + * + * Writes are permitted if: + * + * - The request has valid CSRF tokens. + * - Unguarded writes have been temporarily enabled by a call to + * @{method:beginUnguardedWrites}. + * - All write guarding has been disabled with + * @{method:allowDangerousUnguardedWrites}. + * + * If none of these conditions are true, this method will throw and prevent + * the write. + * + * @return void + * @task protect + */ + public static function willWrite() { + if (!self::$instance) { + if (!self::$allowUnguardedWrites) { + throw new Exception( + pht( + 'Unguarded write! There must be an active %s to perform writes.', + __CLASS__)); + } else { + // Unguarded writes are being allowed unconditionally. + return; + } + } + + $instance = self::$instance; + if ($instance->allowDepth == 0) { + call_user_func($instance->callback); + } + } + + +/* -( Disabling Write Protection )----------------------------------------- */ + + + /** + * Enter a scope which permits unguarded writes. This works like + * @{method:beginUnguardedWrites} but returns an object which will end + * the unguarded write scope when its __destruct() method is called. This + * is useful to more easily handle exceptions correctly in unguarded write + * blocks: + * + * // Restores the guard even if do_logging() throws. + * function unguarded_scope() { + * $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites(); + * do_logging(); + * } + * + * @return AphrontScopedUnguardedWriteCapability Object which ends unguarded + * writes when it leaves scope. + * @task disable + */ + public static function beginScopedUnguardedWrites() { + self::beginUnguardedWrites(); + return new AphrontScopedUnguardedWriteCapability(); + } + + + /** + * Begin a block which permits unguarded writes. You should use this very + * sparingly, and only for things like logging where CSRF is not a concern. + * + * You must pair every call to @{method:beginUnguardedWrites} with a call to + * @{method:endUnguardedWrites}: + * + * AphrontWriteGuard::beginUnguardedWrites(); + * do_logging(); + * AphrontWriteGuard::endUnguardedWrites(); + * + * @return void + * @task disable + */ + public static function beginUnguardedWrites() { + if (!self::$instance) { + return; + } + self::$instance->allowDepth++; + } + + /** + * Declare that you have finished performing unguarded writes. You must + * call this exactly once for each call to @{method:beginUnguardedWrites}. + * + * @return void + * @task disable + */ + public static function endUnguardedWrites() { + if (!self::$instance) { + return; + } + if (self::$instance->allowDepth <= 0) { + throw new Exception( + pht( + 'Imbalanced %s: more %s calls than %s calls.', + __CLASS__, + 'endUnguardedWrites()', + 'beginUnguardedWrites()')); + } + self::$instance->allowDepth--; + } + + + /** + * Allow execution of unguarded writes. This is ONLY appropriate for use in + * script contexts or other contexts where you are guaranteed to never be + * vulnerable to CSRF concerns. Calling this method is EXTREMELY DANGEROUS + * if you do not understand the consequences. + * + * If you need to perform unguarded writes on an otherwise guarded workflow + * which is vulnerable to CSRF, use @{method:beginUnguardedWrites}. + * + * @return void + * @task disable + */ + public static function allowDangerousUnguardedWrites($allow) { + if (self::$instance) { + throw new Exception( + pht( + 'You can not unconditionally disable %s by calling %s while a write '. + 'guard is active. Use %s to temporarily allow unguarded writes.', + __CLASS__, + __FUNCTION__.'()', + 'beginUnguardedWrites()')); + } + self::$allowUnguardedWrites = true; + } + +} diff --git a/src/auth/PhutilAmazonAuthAdapter.php b/src/auth/PhutilAmazonAuthAdapter.php new file mode 100644 --- /dev/null +++ b/src/auth/PhutilAmazonAuthAdapter.php @@ -0,0 +1,80 @@ +getOAuthAccountData('user_id'); + } + + public function getAccountEmail() { + return $this->getOAuthAccountData('email'); + } + + public function getAccountName() { + return null; + } + + public function getAccountImageURI() { + return null; + } + + public function getAccountURI() { + return null; + } + + public function getAccountRealName() { + return $this->getOAuthAccountData('name'); + } + + protected function getAuthenticateBaseURI() { + return 'https://www.amazon.com/ap/oa'; + } + + protected function getTokenBaseURI() { + return 'https://api.amazon.com/auth/o2/token'; + } + + public function getScope() { + return 'profile'; + } + + public function getExtraAuthenticateParameters() { + return array( + 'response_type' => 'code', + ); + } + + public function getExtraTokenParameters() { + return array( + 'grant_type' => 'authorization_code', + ); + } + + protected function loadOAuthAccountData() { + $uri = new PhutilURI('https://api.amazon.com/user/profile'); + $uri->setQueryParam('access_token', $this->getAccessToken()); + + $future = new HTTPSFuture($uri); + list($body) = $future->resolvex(); + + try { + return phutil_json_decode($body); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Expected valid JSON response from Amazon account data request.'), + $ex); + } + } + +} diff --git a/src/auth/PhutilAsanaAuthAdapter.php b/src/auth/PhutilAsanaAuthAdapter.php new file mode 100644 --- /dev/null +++ b/src/auth/PhutilAsanaAuthAdapter.php @@ -0,0 +1,86 @@ +getOAuthAccountData('id'); + } + + public function getAccountEmail() { + return $this->getOAuthAccountData('email'); + } + + public function getAccountName() { + return null; + } + + public function getAccountImageURI() { + $photo = $this->getOAuthAccountData('photo', array()); + if (is_array($photo)) { + return idx($photo, 'image_128x128'); + } else { + return null; + } + } + + public function getAccountURI() { + return null; + } + + public function getAccountRealName() { + return $this->getOAuthAccountData('name'); + } + + protected function getAuthenticateBaseURI() { + return 'https://app.asana.com/-/oauth_authorize'; + } + + protected function getTokenBaseURI() { + return 'https://app.asana.com/-/oauth_token'; + } + + public function getScope() { + return null; + } + + public function getExtraAuthenticateParameters() { + return array( + 'response_type' => 'code', + ); + } + + public function getExtraTokenParameters() { + return array( + 'grant_type' => 'authorization_code', + ); + } + + public function getExtraRefreshParameters() { + return array( + 'grant_type' => 'refresh_token', + ); + } + + public function supportsTokenRefresh() { + return true; + } + + protected function loadOAuthAccountData() { + return id(new PhutilAsanaFuture()) + ->setAccessToken($this->getAccessToken()) + ->setRawAsanaQuery('users/me') + ->resolve(); + } + +} diff --git a/src/auth/PhutilAuthAdapter.php b/src/auth/PhutilAuthAdapter.php new file mode 100644 --- /dev/null +++ b/src/auth/PhutilAuthAdapter.php @@ -0,0 +1,123 @@ +` is globally unique and always identifies the + * same identity. + * + * If the adapter was unable to authenticate an identity, it should return + * `null`. + * + * @return string|null Unique account identifier, or `null` if authentication + * failed. + */ + abstract public function getAccountID(); + + + /** + * Get a string identifying this adapter, like "ldap". This string should be + * unique to the adapter class. + * + * @return string Unique adapter identifier. + */ + abstract public function getAdapterType(); + + + /** + * Get a string identifying the domain this adapter is acting on. This allows + * an adapter (like LDAP) to act against different identity domains without + * conflating credentials. For providers like Facebook or Google, the adapters + * just return the relevant domain name. + * + * @return string Domain the adapter is associated with. + */ + abstract public function getAdapterDomain(); + + + /** + * Generate a string uniquely identifying this adapter configuration. Within + * the scope of a given key, all account IDs must uniquely identify exactly + * one identity. + * + * @return string Unique identifier for this adapter configuration. + */ + public function getAdapterKey() { + return $this->getAdapterType().':'.$this->getAdapterDomain(); + } + + + /** + * Optionally, return an email address associated with this account. + * + * @return string|null An email address associated with the account, or + * `null` if data is not available. + */ + public function getAccountEmail() { + return null; + } + + + /** + * Optionally, return a human readable username associated with this account. + * + * @return string|null Account username, or `null` if data isn't available. + */ + public function getAccountName() { + return null; + } + + + /** + * Optionally, return a URI corresponding to a human-viewable profile for + * this account. + * + * @return string|null A profile URI associated with this account, or + * `null` if the data isn't available. + */ + public function getAccountURI() { + return null; + } + + + /** + * Optionally, return a profile image URI associated with this account. + * + * @return string|null URI for an account profile image, or `null` if one is + * not available. + */ + public function getAccountImageURI() { + return null; + } + + + /** + * Optionally, return a real name associated with this account. + * + * @return string|null A human real name, or `null` if this data is not + * available. + */ + public function getAccountRealName() { + return null; + } + +} diff --git a/src/auth/PhutilBitbucketAuthAdapter.php b/src/auth/PhutilBitbucketAuthAdapter.php new file mode 100644 --- /dev/null +++ b/src/auth/PhutilBitbucketAuthAdapter.php @@ -0,0 +1,73 @@ +getUserInfo(), 'username'); + } + + public function getAccountName() { + return idx($this->getUserInfo(), 'display_name'); + } + + public function getAccountURI() { + $name = $this->getAccountID(); + if (strlen($name)) { + return 'https://bitbucket.org/'.$name; + } + return null; + } + + public function getAccountImageURI() { + return idx($this->getUserInfo(), 'avatar'); + } + + public function getAccountRealName() { + $parts = array( + idx($this->getUserInfo(), 'first_name'), + idx($this->getUserInfo(), 'last_name'), + ); + $parts = array_filter($parts); + return implode(' ', $parts); + } + + public function getAdapterType() { + return 'bitbucket'; + } + + public function getAdapterDomain() { + return 'bitbucket.org'; + } + + protected function getRequestTokenURI() { + return 'https://bitbucket.org/api/1.0/oauth/request_token'; + } + + protected function getAuthorizeTokenURI() { + return 'https://bitbucket.org/api/1.0/oauth/authenticate'; + } + + protected function getValidateTokenURI() { + return 'https://bitbucket.org/api/1.0/oauth/access_token'; + } + + private function getUserInfo() { + if ($this->userInfo === null) { + // We don't need any of the data in the handshake, but do need to + // finish the process. This makes sure we've completed the handshake. + $this->getHandshakeData(); + + $uri = new PhutilURI('https://bitbucket.org/api/1.0/user'); + + $data = $this->newOAuth1Future($uri) + ->setMethod('GET') + ->resolveJSON(); + + $this->userInfo = idx($data, 'user', array()); + } + return $this->userInfo; + } + +} diff --git a/src/auth/PhutilDisqusAuthAdapter.php b/src/auth/PhutilDisqusAuthAdapter.php new file mode 100644 --- /dev/null +++ b/src/auth/PhutilDisqusAuthAdapter.php @@ -0,0 +1,84 @@ +getOAuthAccountData('id'); + } + + public function getAccountEmail() { + return $this->getOAuthAccountData('email'); + } + + public function getAccountName() { + return $this->getOAuthAccountData('username'); + } + + public function getAccountImageURI() { + return $this->getOAuthAccountData('avatar', 'permalink'); + } + + public function getAccountURI() { + return $this->getOAuthAccountData('profileUrl'); + } + + public function getAccountRealName() { + return $this->getOAuthAccountData('name'); + } + + protected function getAuthenticateBaseURI() { + return 'https://disqus.com/api/oauth/2.0/authorize/'; + } + + protected function getTokenBaseURI() { + return 'https://disqus.com/api/oauth/2.0/access_token/'; + } + + public function getScope() { + return 'read'; + } + + public function getExtraAuthenticateParameters() { + return array( + 'response_type' => 'code', + ); + } + + public function getExtraTokenParameters() { + return array( + 'grant_type' => 'authorization_code', + ); + } + + protected function loadOAuthAccountData() { + $uri = new PhutilURI('https://disqus.com/api/3.0/users/details.json'); + $uri->setQueryParam('api_key', $this->getClientID()); + $uri->setQueryParam('access_token', $this->getAccessToken()); + $uri = (string)$uri; + + $future = new HTTPSFuture($uri); + $future->setMethod('GET'); + list($body) = $future->resolvex(); + + try { + $data = phutil_json_decode($body); + return $data['response']; + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Expected valid JSON response from Disqus account data request.'), + $ex); + } + } + +} diff --git a/src/auth/PhutilEmptyAuthAdapter.php b/src/auth/PhutilEmptyAuthAdapter.php new file mode 100644 --- /dev/null +++ b/src/auth/PhutilEmptyAuthAdapter.php @@ -0,0 +1,42 @@ +adapterDomain = $adapter_domain; + return $this; + } + + public function getAdapterDomain() { + return $this->adapterDomain; + } + + public function setAdapterType($adapter_type) { + $this->adapterType = $adapter_type; + return $this; + } + + public function getAdapterType() { + return $this->adapterType; + } + + public function setAccountID($account_id) { + $this->accountID = $account_id; + return $this; + } + + public function getAccountID() { + return $this->accountID; + } + +} diff --git a/src/auth/PhutilFacebookAuthAdapter.php b/src/auth/PhutilFacebookAuthAdapter.php new file mode 100644 --- /dev/null +++ b/src/auth/PhutilFacebookAuthAdapter.php @@ -0,0 +1,114 @@ +requireSecureBrowsing = $require_secure_browsing; + return $this; + } + + public function getAdapterType() { + return 'facebook'; + } + + public function getAdapterDomain() { + return 'facebook.com'; + } + + public function getAccountID() { + return $this->getOAuthAccountData('id'); + } + + public function getAccountEmail() { + return $this->getOAuthAccountData('email'); + } + + public function getAccountName() { + $link = $this->getOAuthAccountData('link'); + if (!$link) { + return null; + } + + $matches = null; + if (!preg_match('@/([^/]+)$@', $link, $matches)) { + return null; + } + + return $matches[1]; + } + + public function getAccountImageURI() { + $picture = $this->getOAuthAccountData('picture'); + if ($picture) { + $picture_data = idx($picture, 'data'); + if ($picture_data) { + return idx($picture_data, 'url'); + } + } + return null; + } + + public function getAccountURI() { + return $this->getOAuthAccountData('link'); + } + + public function getAccountRealName() { + return $this->getOAuthAccountData('name'); + } + + public function getAccountSecuritySettings() { + return $this->getOAuthAccountData('security_settings'); + } + + protected function getAuthenticateBaseURI() { + return 'https://www.facebook.com/dialog/oauth'; + } + + protected function getTokenBaseURI() { + return 'https://graph.facebook.com/oauth/access_token'; + } + + protected function loadOAuthAccountData() { + $fields = array( + 'id', + 'name', + 'email', + 'link', + 'security_settings', + 'picture', + ); + + $uri = new PhutilURI('https://graph.facebook.com/me'); + $uri->setQueryParam('access_token', $this->getAccessToken()); + $uri->setQueryParam('fields', implode(',', $fields)); + list($body) = id(new HTTPSFuture($uri))->resolvex(); + + $data = null; + try { + $data = phutil_json_decode($body); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Expected valid JSON response from Facebook account data request.'), + $ex); + } + + if ($this->requireSecureBrowsing) { + if (empty($data['security_settings']['secure_browsing']['enabled'])) { + throw new Exception( + pht( + 'This Phabricator install requires you to enable Secure Browsing '. + 'on your Facebook account in order to use it to log in to '. + 'Phabricator. For more information, see %s', + 'https://www.facebook.com/help/156201551113407/')); + } + } + + return $data; + } + +} diff --git a/src/auth/PhutilGitHubAuthAdapter.php b/src/auth/PhutilGitHubAuthAdapter.php new file mode 100644 --- /dev/null +++ b/src/auth/PhutilGitHubAuthAdapter.php @@ -0,0 +1,72 @@ +getOAuthAccountData('id'); + } + + public function getAccountEmail() { + return $this->getOAuthAccountData('email'); + } + + public function getAccountName() { + return $this->getOAuthAccountData('login'); + } + + public function getAccountImageURI() { + return $this->getOAuthAccountData('avatar_url'); + } + + public function getAccountURI() { + $name = $this->getAccountName(); + if (strlen($name)) { + return 'https://github.com/'.$name; + } + return null; + } + + public function getAccountRealName() { + return $this->getOAuthAccountData('name'); + } + + protected function getAuthenticateBaseURI() { + return 'https://github.com/login/oauth/authorize'; + } + + protected function getTokenBaseURI() { + return 'https://github.com/login/oauth/access_token'; + } + + protected function loadOAuthAccountData() { + $uri = new PhutilURI('https://api.github.com/user'); + $uri->setQueryParam('access_token', $this->getAccessToken()); + + $future = new HTTPSFuture($uri); + + // NOTE: GitHub requires a User-Agent string. + $future->addHeader('User-Agent', __CLASS__); + + list($body) = $future->resolvex(); + + try{ + return phutil_json_decode($body); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Expected valid JSON response from GitHub account data request.'), + $ex); + } + } + +} diff --git a/src/auth/PhutilGoogleAuthAdapter.php b/src/auth/PhutilGoogleAuthAdapter.php new file mode 100644 --- /dev/null +++ b/src/auth/PhutilGoogleAuthAdapter.php @@ -0,0 +1,181 @@ +getOAuthAccountData('emails', array()); + foreach ($emails as $email) { + if (idx($email, 'type') == 'account') { + return idx($email, 'value'); + } + } + + throw new Exception( + pht( + 'Expected to retrieve an "account" email from Google Plus API call '. + 'to identify account, but failed.')); + } + + public function getAccountEmail() { + return $this->getAccountID(); + } + + public function getAccountName() { + // Guess account name from email address, this is just a hint anyway. + $email = $this->getAccountEmail(); + $email = explode('@', $email); + $email = head($email); + return $email; + } + + public function getAccountImageURI() { + $image = $this->getOAuthAccountData('image', array()); + $uri = idx($image, 'url'); + + // Change the "sz" parameter ("size") from the default to 100 to ask for + // a 100x100px image. + if ($uri !== null) { + $uri = new PhutilURI($uri); + $uri->setQueryParam('sz', 100); + $uri = (string)$uri; + } + + return $uri; + } + + public function getAccountURI() { + return $this->getOAuthAccountData('url'); + } + + public function getAccountRealName() { + $name = $this->getOAuthAccountData('name', array()); + + // TODO: This could probably be made cleaner by looking up the API, but + // this should work to unbreak logins. + + $parts = array(); + $parts[] = idx($name, 'givenName'); + unset($name['givenName']); + $parts[] = idx($name, 'familyName'); + unset($name['familyName']); + $parts = array_merge($parts, $name); + $parts = array_filter($parts); + + return implode(' ', $parts); + } + + protected function getAuthenticateBaseURI() { + return 'https://accounts.google.com/o/oauth2/auth'; + } + + protected function getTokenBaseURI() { + return 'https://accounts.google.com/o/oauth2/token'; + } + + public function getScope() { + $scopes = array( + 'email', + 'profile', + ); + + return implode(' ', $scopes); + } + + public function getExtraAuthenticateParameters() { + return array( + 'response_type' => 'code', + ); + } + + public function getExtraTokenParameters() { + return array( + 'grant_type' => 'authorization_code', + ); + } + + protected function loadOAuthAccountData() { + $uri = new PhutilURI('https://www.googleapis.com/plus/v1/people/me'); + $uri->setQueryParam('access_token', $this->getAccessToken()); + + $future = new HTTPSFuture($uri); + list($status, $body) = $future->resolve(); + + if ($status->isError()) { + $this->tryToThrowSpecializedError($status, $body); + throw $status; + } + + try { + return phutil_json_decode($body); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Expected valid JSON response from Google account data request.'), + $ex); + } + } + + private function tryToThrowSpecializedError($status, $raw_body) { + if (!($status instanceof HTTPFutureHTTPResponseStatus)) { + return; + } + + if ($status->getStatusCode() != 403) { + return; + } + + $body = phutil_json_decode($raw_body); + if (!$body) { + return; + } + + if (empty($body['error']['errors'][0])) { + return; + } + + $error = $body['error']['errors'][0]; + $domain = idx($error, 'domain'); + $reason = idx($error, 'reason'); + + if ($domain == 'usageLimits' && $reason == 'accessNotConfigured') { + throw new PhutilAuthConfigurationException( + pht( + 'Google returned an "%s" error. This usually means you need to '. + 'enable the "Google+ API" in your Google Cloud Console, under '. + '"APIs".'. + "\n\n". + 'Around March 2014, Google made some API changes which require this '. + 'configuration adjustment.'. + "\n\n". + 'Normally, you can resolve this issue by going to %s, then '. + 'clicking "API Project", then "APIs & auth", then turning the '. + '"Google+ API" on. The names you see on the console may be '. + 'different depending on how your integration is set up. If you '. + 'are not sure, you can hunt through the projects until you find '. + 'the one associated with the right Application ID under '. + '"Credentials". The Application ID this install is using is "%s".'. + "\n\n". + '(If you are unable to log into Phabricator, you can use '. + '"%s" to recover access to an administrator account.)'. + "\n\n". + 'Full HTTP Response'. + "\n\n%s", + 'accessNotConfigured', + 'https://console.developers.google.com/', + $this->getClientID(), + 'bin/auth recover', + $raw_body)); + } + } + +} diff --git a/src/auth/PhutilJIRAAuthAdapter.php b/src/auth/PhutilJIRAAuthAdapter.php new file mode 100644 --- /dev/null +++ b/src/auth/PhutilJIRAAuthAdapter.php @@ -0,0 +1,162 @@ +jiraBaseURI = $jira_base_uri; + return $this; + } + + public function getJIRABaseURI() { + return $this->jiraBaseURI; + } + + public function getAccountID() { + // Make sure the handshake is finished; this method is used for its + // side effect by Auth providers. + $this->getHandshakeData(); + + return idx($this->getUserInfo(), 'key'); + } + + public function getAccountName() { + return idx($this->getUserInfo(), 'name'); + } + + public function getAccountImageURI() { + $avatars = idx($this->getUserInfo(), 'avatarUrls'); + if ($avatars) { + return idx($avatars, '48x48'); + } + return null; + } + + public function getAccountRealName() { + return idx($this->getUserInfo(), 'displayName'); + } + + public function getAccountEmail() { + return idx($this->getUserInfo(), 'emailAddress'); + } + + public function getAdapterType() { + return 'jira'; + } + + public function getAdapterDomain() { + return $this->adapterDomain; + } + + public function setAdapterDomain($domain) { + $this->adapterDomain = $domain; + return $this; + } + + protected function getSignatureMethod() { + return 'RSA-SHA1'; + } + + protected function getRequestTokenURI() { + return $this->getJIRAURI('plugins/servlet/oauth/request-token'); + } + + protected function getAuthorizeTokenURI() { + return $this->getJIRAURI('plugins/servlet/oauth/authorize'); + } + + protected function getValidateTokenURI() { + return $this->getJIRAURI('plugins/servlet/oauth/access-token'); + } + + private function getJIRAURI($path) { + return rtrim($this->jiraBaseURI, '/').'/'.ltrim($path, '/'); + } + + private function getUserInfo() { + if ($this->userInfo === null) { + $this->currentSession = $this->newJIRAFuture('rest/auth/1/session', 'GET') + ->resolveJSON(); + + // The session call gives us the username, but not the user key or other + // information. Make a second call to get additional information. + + $params = array( + 'username' => $this->currentSession['name'], + ); + + $this->userInfo = $this->newJIRAFuture('rest/api/2/user', 'GET', $params) + ->resolveJSON(); + } + + return $this->userInfo; + } + + public static function newJIRAKeypair() { + $config = array( + 'digest_alg' => 'sha512', + 'private_key_bits' => 4096, + 'private_key_type' => OPENSSL_KEYTYPE_RSA, + ); + + $res = openssl_pkey_new($config); + if (!$res) { + throw new Exception(pht('%s failed!', 'openssl_pkey_new()')); + } + + $private_key = null; + $ok = openssl_pkey_export($res, $private_key); + if (!$ok) { + throw new Exception(pht('%s failed!', 'openssl_pkey_export()')); + } + + $public_key = openssl_pkey_get_details($res); + if (!$ok || empty($public_key['key'])) { + throw new Exception(pht('%s failed!', 'openssl_pkey_get_details()')); + } + $public_key = $public_key['key']; + + return array($public_key, $private_key); + } + + + /** + * JIRA indicates that the user has clicked the "Deny" button by passing a + * well known `oauth_verifier` value ("denied"), which we check for here. + */ + protected function willFinishOAuthHandshake() { + $jira_magic_word = 'denied'; + if ($this->getVerifier() == $jira_magic_word) { + throw new PhutilAuthUserAbortedException(); + } + } + + public function newJIRAFuture($path, $method, $params = array()) { + $uri = new PhutilURI($this->getJIRAURI($path)); + if ($method == 'GET') { + $uri->setQueryParams($params); + $params = array(); + } else { + // For other types of requests, JIRA expects the request body to be + // JSON encoded. + $params = json_encode($params); + } + + // JIRA returns a 415 error if we don't provide a Content-Type header. + + return $this->newOAuth1Future($uri, $params) + ->setMethod($method) + ->addHeader('Content-Type', 'application/json'); + } + +} diff --git a/src/auth/PhutilLDAPAuthAdapter.php b/src/auth/PhutilLDAPAuthAdapter.php new file mode 100644 --- /dev/null +++ b/src/auth/PhutilLDAPAuthAdapter.php @@ -0,0 +1,505 @@ +hostname = $host; + return $this; + } + + public function setPort($port) { + $this->port = $port; + return $this; + } + + public function getAdapterDomain() { + return 'self'; + } + + public function setBaseDistinguishedName($base_distinguished_name) { + $this->baseDistinguishedName = $base_distinguished_name; + return $this; + } + + public function setSearchAttributes(array $search_attributes) { + $this->searchAttributes = $search_attributes; + return $this; + } + + public function setUsernameAttribute($username_attribute) { + $this->usernameAttribute = $username_attribute; + return $this; + } + + public function setRealNameAttributes(array $attributes) { + $this->realNameAttributes = $attributes; + return $this; + } + + public function setLDAPVersion($ldap_version) { + $this->ldapVersion = $ldap_version; + return $this; + } + + public function setLDAPReferrals($ldap_referrals) { + $this->ldapReferrals = $ldap_referrals; + return $this; + } + + public function setLDAPStartTLS($ldap_start_tls) { + $this->ldapStartTLS = $ldap_start_tls; + return $this; + } + + public function setAnonymousUsername($anonymous_username) { + $this->anonymousUsername = $anonymous_username; + return $this; + } + + public function setAnonymousPassword( + PhutilOpaqueEnvelope $anonymous_password) { + $this->anonymousPassword = $anonymous_password; + return $this; + } + + public function setLoginUsername($login_username) { + $this->loginUsername = $login_username; + return $this; + } + + public function setLoginPassword(PhutilOpaqueEnvelope $login_password) { + $this->loginPassword = $login_password; + return $this; + } + + public function setActiveDirectoryDomain($domain) { + $this->activeDirectoryDomain = $domain; + return $this; + } + + public function setAlwaysSearch($always_search) { + $this->alwaysSearch = $always_search; + return $this; + } + + public function getAccountID() { + return $this->readLDAPRecordAccountID($this->getLDAPUserData()); + } + + public function getAccountName() { + return $this->readLDAPRecordAccountName($this->getLDAPUserData()); + } + + public function getAccountRealName() { + return $this->readLDAPRecordRealName($this->getLDAPUserData()); + } + + public function getAccountEmail() { + return $this->readLDAPRecordEmail($this->getLDAPUserData()); + } + + public function readLDAPRecordAccountID(array $record) { + $key = $this->usernameAttribute; + if (!strlen($key)) { + $key = head($this->searchAttributes); + } + return $this->readLDAPData($record, $key); + } + + public function readLDAPRecordAccountName(array $record) { + return $this->readLDAPRecordAccountID($record); + } + + public function readLDAPRecordRealName(array $record) { + $parts = array(); + foreach ($this->realNameAttributes as $attribute) { + $parts[] = $this->readLDAPData($record, $attribute); + } + $parts = array_filter($parts); + + if ($parts) { + return implode(' ', $parts); + } + + return null; + } + + public function readLDAPRecordEmail(array $record) { + return $this->readLDAPData($record, 'mail'); + } + + private function getLDAPUserData() { + if ($this->ldapUserData === null) { + $this->ldapUserData = $this->loadLDAPUserData(); + } + + return $this->ldapUserData; + } + + private function readLDAPData(array $data, $key, $default = null) { + $list = idx($data, $key); + if ($list === null) { + // At least in some cases (and maybe in all cases) the results from + // ldap_search() are keyed in lowercase. If we missed on the first + // try, retry with a lowercase key. + $list = idx($data, phutil_utf8_strtolower($key)); + } + + // NOTE: In most cases, the property is an array, like: + // + // array( + // 'count' => 1, + // 0 => 'actual-value-we-want', + // ) + // + // However, in at least the case of 'dn', the property is a bare string. + + if (is_scalar($list) && strlen($list)) { + return $list; + } else if (is_array($list)) { + return $list[0]; + } else { + return $default; + } + } + + private function formatLDAPAttributeSearch($attribute, $login_user) { + // If the attribute contains the literal token "${login}", treat it as a + // query and substitute the user's login name for the token. + + if (strpos($attribute, '${login}') !== false) { + $escaped_user = ldap_sprintf('%S', $login_user); + $attribute = str_replace('${login}', $escaped_user, $attribute); + return $attribute; + } + + // Otherwise, treat it as a simple attribute search. + + return ldap_sprintf( + '%Q=%S', + $attribute, + $login_user); + } + + private function loadLDAPUserData() { + $conn = $this->establishConnection(); + + $login_user = $this->loginUsername; + $login_pass = $this->loginPassword; + + if ($this->shouldBindWithoutIdentity()) { + $distinguished_name = null; + $search_query = null; + foreach ($this->searchAttributes as $attribute) { + $search_query = $this->formatLDAPAttributeSearch( + $attribute, + $login_user); + $record = $this->searchLDAPForRecord($search_query); + if ($record) { + $distinguished_name = $this->readLDAPData($record, 'dn'); + break; + } + } + if ($distinguished_name === null) { + throw new PhutilAuthCredentialException(); + } + } else { + $search_query = $this->formatLDAPAttributeSearch( + head($this->searchAttributes), + $login_user); + if ($this->activeDirectoryDomain) { + $distinguished_name = ldap_sprintf( + '%s@%Q', + $login_user, + $this->activeDirectoryDomain); + } else { + $distinguished_name = ldap_sprintf( + '%Q,%Q', + $search_query, + $this->baseDistinguishedName); + } + } + + $this->bindLDAP($conn, $distinguished_name, $login_pass); + + $result = $this->searchLDAPForRecord($search_query); + if (!$result) { + // This is unusual (since the bind succeeded) but we've seen it at least + // once in the wild, where the anonymous user is allowed to search but + // the credentialed user is not. + + // If we don't have anonymous credentials, raise an explicit exception + // here since we'll fail a typehint if we don't return an array anyway + // and this is a more useful error. + + // If we do have anonymous credentials, we'll rebind and try the search + // again below. Doing this automatically means things work correctly more + // often without requiring additional configuration. + if (!$this->shouldBindWithoutIdentity()) { + // No anonymous credentials, so we just fail here. + throw new Exception( + pht( + 'LDAP: Failed to retrieve record for user "%s" when searching. '. + 'Credentialed users may not be able to search your LDAP server. '. + 'Try configuring anonymous credentials or fully anonymous binds.', + $login_user)); + } else { + // Rebind as anonymous and try the search again. + $user = $this->anonymousUsername; + $pass = $this->anonymousPassword; + $this->bindLDAP($conn, $user, $pass); + + $result = $this->searchLDAPForRecord($search_query); + if (!$result) { + throw new Exception( + pht( + 'LDAP: Failed to retrieve record for user "%s" when searching '. + 'with both user and anonymous credentials.', + $login_user)); + } + } + } + + return $result; + } + + private function establishConnection() { + if (!$this->ldapConnection) { + $host = $this->hostname; + $port = $this->port; + + $profiler = PhutilServiceProfiler::getInstance(); + $call_id = $profiler->beginServiceCall( + array( + 'type' => 'ldap', + 'call' => 'connect', + 'host' => $host, + 'port' => $this->port, + )); + + $conn = @ldap_connect($host, $this->port); + + $profiler->endServiceCall( + $call_id, + array( + 'ok' => (bool)$conn, + )); + + if (!$conn) { + throw new Exception( + pht('Unable to connect to LDAP server (%s:%d).', $host, $port)); + } + + $options = array( + LDAP_OPT_PROTOCOL_VERSION => (int)$this->ldapVersion, + LDAP_OPT_REFERRALS => (int)$this->ldapReferrals, + ); + + foreach ($options as $name => $value) { + $ok = @ldap_set_option($conn, $name, $value); + if (!$ok) { + $this->raiseConnectionException( + $conn, + pht( + "Unable to set LDAP option '%s' to value '%s'!", + $name, + $value)); + } + } + + if ($this->ldapStartTLS) { + $profiler = PhutilServiceProfiler::getInstance(); + $call_id = $profiler->beginServiceCall( + array( + 'type' => 'ldap', + 'call' => 'start-tls', + )); + + // NOTE: This boils down to a function call to ldap_start_tls_s() in + // C, which is a service call. + $ok = @ldap_start_tls($conn); + + $profiler->endServiceCall( + $call_id, + array()); + + if (!$ok) { + $this->raiseConnectionException( + $conn, + pht('Unable to start TLS connection when connecting to LDAP.')); + } + } + + if ($this->shouldBindWithoutIdentity()) { + $user = $this->anonymousUsername; + $pass = $this->anonymousPassword; + $this->bindLDAP($conn, $user, $pass); + } + + $this->ldapConnection = $conn; + } + + return $this->ldapConnection; + } + + + private function searchLDAPForRecord($dn) { + $conn = $this->establishConnection(); + + $results = $this->searchLDAP('%Q', $dn); + + if (!$results) { + return null; + } + + if (count($results) > 1) { + throw new Exception( + pht( + 'LDAP record query returned more than one result. The query must '. + 'uniquely identify a record.')); + } + + return head($results); + } + + public function searchLDAP($pattern /* ... */) { + $args = func_get_args(); + $query = call_user_func_array('ldap_sprintf', $args); + + $conn = $this->establishConnection(); + + $profiler = PhutilServiceProfiler::getInstance(); + $call_id = $profiler->beginServiceCall( + array( + 'type' => 'ldap', + 'call' => 'search', + 'dn' => $this->baseDistinguishedName, + 'query' => $query, + )); + + $result = @ldap_search($conn, $this->baseDistinguishedName, $query); + + $profiler->endServiceCall($call_id, array()); + + if (!$result) { + $this->raiseConnectionException( + $conn, + pht('LDAP search failed.')); + } + + $entries = @ldap_get_entries($conn, $result); + + if (!$entries) { + $this->raiseConnectionException( + $conn, + pht('Failed to get LDAP entries from search result.')); + } + + $results = array(); + for ($ii = 0; $ii < $entries['count']; $ii++) { + $results[] = $entries[$ii]; + } + + return $results; + } + + private function raiseConnectionException($conn, $message) { + $errno = @ldap_errno($conn); + $error = @ldap_error($conn); + + // This is `LDAP_INVALID_CREDENTIALS`. + if ($errno == 49) { + throw new PhutilAuthCredentialException(); + } + + if ($errno || $error) { + $full_message = pht( + "LDAP Exception: %s\nLDAP Error #%d: %s", + $message, + $errno, + $error); + } else { + $full_message = pht( + 'LDAP Exception: %s', + $message); + } + + throw new Exception($full_message); + } + + private function bindLDAP($conn, $user, PhutilOpaqueEnvelope $pass) { + $profiler = PhutilServiceProfiler::getInstance(); + $call_id = $profiler->beginServiceCall( + array( + 'type' => 'ldap', + 'call' => 'bind', + 'user' => $user, + )); + + // NOTE: ldap_bind() dumps cleartext passwords into logs by default. Keep + // it quiet. + if (strlen($user)) { + $ok = @ldap_bind($conn, $user, $pass->openEnvelope()); + } else { + $ok = @ldap_bind($conn); + } + + $profiler->endServiceCall($call_id, array()); + + if (!$ok) { + if (strlen($user)) { + $this->raiseConnectionException( + $conn, + pht('Failed to bind to LDAP server (as user "%s").', $user)); + } else { + $this->raiseConnectionException( + $conn, + pht('Failed to bind to LDAP server (without username).')); + } + } + } + + + /** + * Determine if this adapter should attempt to bind to the LDAP server + * without a user identity. + * + * Generally, we can bind directly if we have a username/password, or if the + * "Always Search" flag is set, indicating that the empty username and + * password are sufficient. + * + * @return bool True if the adapter should perform binds without identity. + */ + private function shouldBindWithoutIdentity() { + return $this->alwaysSearch || strlen($this->anonymousUsername); + } + +} diff --git a/src/auth/PhutilOAuth1AuthAdapter.php b/src/auth/PhutilOAuth1AuthAdapter.php new file mode 100644 --- /dev/null +++ b/src/auth/PhutilOAuth1AuthAdapter.php @@ -0,0 +1,211 @@ +privateKey = $private_key; + return $this; + } + + public function getPrivateKey() { + return $this->privateKey; + } + + public function setCallbackURI($callback_uri) { + $this->callbackURI = $callback_uri; + return $this; + } + + public function getCallbackURI() { + return $this->callbackURI; + } + + public function setVerifier($verifier) { + $this->verifier = $verifier; + return $this; + } + + public function getVerifier() { + return $this->verifier; + } + + public function setConsumerSecret(PhutilOpaqueEnvelope $consumer_secret) { + $this->consumerSecret = $consumer_secret; + return $this; + } + + public function getConsumerSecret() { + return $this->consumerSecret; + } + + public function setConsumerKey($consumer_key) { + $this->consumerKey = $consumer_key; + return $this; + } + + public function getConsumerKey() { + return $this->consumerKey; + } + + public function setTokenSecret($token_secret) { + $this->tokenSecret = $token_secret; + return $this; + } + + public function getTokenSecret() { + return $this->tokenSecret; + } + + public function setToken($token) { + $this->token = $token; + return $this; + } + + public function getToken() { + return $this->token; + } + + protected function getHandshakeData() { + if ($this->handshakeData === null) { + $this->finishOAuthHandshake(); + } + return $this->handshakeData; + } + + abstract protected function getRequestTokenURI(); + abstract protected function getAuthorizeTokenURI(); + abstract protected function getValidateTokenURI(); + + protected function getSignatureMethod() { + return 'HMAC-SHA1'; + } + + public function getContentSecurityPolicyFormActions() { + return array( + $this->getAuthorizeTokenURI(), + ); + } + + protected function newOAuth1Future($uri, $data = array()) { + $future = id(new PhutilOAuth1Future($uri, $data)) + ->setMethod('POST') + ->setSignatureMethod($this->getSignatureMethod()); + + $consumer_key = $this->getConsumerKey(); + if (strlen($consumer_key)) { + $future->setConsumerKey($consumer_key); + } else { + throw new Exception( + pht( + '%s is required!', + 'setConsumerKey()')); + } + + $consumer_secret = $this->getConsumerSecret(); + if ($consumer_secret) { + $future->setConsumerSecret($consumer_secret); + } + + if (strlen($this->getToken())) { + $future->setToken($this->getToken()); + } + + if (strlen($this->getTokenSecret())) { + $future->setTokenSecret($this->getTokenSecret()); + } + + if ($this->getPrivateKey()) { + $future->setPrivateKey($this->getPrivateKey()); + } + + return $future; + } + + public function getClientRedirectURI() { + $request_token_uri = $this->getRequestTokenURI(); + + $future = $this->newOAuth1Future($request_token_uri); + if (strlen($this->getCallbackURI())) { + $future->setCallbackURI($this->getCallbackURI()); + } + + list($body) = $future->resolvex(); + $data = id(new PhutilQueryStringParser())->parseQueryString($body); + + // NOTE: Per the spec, this value MUST be the string 'true'. + $confirmed = idx($data, 'oauth_callback_confirmed'); + if ($confirmed !== 'true') { + throw new Exception( + pht("Expected '%s' to be '%s'!", 'oauth_callback_confirmed', 'true')); + } + + $this->readTokenAndTokenSecret($data); + + $authorize_token_uri = new PhutilURI($this->getAuthorizeTokenURI()); + $authorize_token_uri->setQueryParam('oauth_token', $this->getToken()); + + return (string)$authorize_token_uri; + } + + protected function finishOAuthHandshake() { + $this->willFinishOAuthHandshake(); + + if (!$this->getToken()) { + throw new Exception(pht('Expected token to finish OAuth handshake!')); + } + if (!$this->getVerifier()) { + throw new Exception(pht('Expected verifier to finish OAuth handshake!')); + } + + $validate_uri = $this->getValidateTokenURI(); + $params = array( + 'oauth_verifier' => $this->getVerifier(), + ); + + list($body) = $this->newOAuth1Future($validate_uri, $params)->resolvex(); + $data = id(new PhutilQueryStringParser())->parseQueryString($body); + + $this->readTokenAndTokenSecret($data); + + $this->handshakeData = $data; + } + + private function readTokenAndTokenSecret(array $data) { + $token = idx($data, 'oauth_token'); + if (!$token) { + throw new Exception(pht("Expected '%s' in response!", 'oauth_token')); + } + + $token_secret = idx($data, 'oauth_token_secret'); + if (!$token_secret) { + throw new Exception( + pht("Expected '%s' in response!", 'oauth_token_secret')); + } + + $this->setToken($token); + $this->setTokenSecret($token_secret); + + return $this; + } + + /** + * Hook that allows subclasses to take actions before the OAuth handshake + * is completed. + */ + protected function willFinishOAuthHandshake() { + return; + } + +} diff --git a/src/auth/PhutilOAuthAuthAdapter.php b/src/auth/PhutilOAuthAuthAdapter.php new file mode 100644 --- /dev/null +++ b/src/auth/PhutilOAuthAuthAdapter.php @@ -0,0 +1,229 @@ +getAuthenticateBaseURI()); + $uri->setQueryParam('client_id', $this->getClientID()); + $uri->setQueryParam('scope', $this->getScope()); + $uri->setQueryParam('redirect_uri', $this->getRedirectURI()); + $uri->setQueryParam('state', $this->getState()); + + foreach ($this->getExtraAuthenticateParameters() as $key => $value) { + $uri->setQueryParam($key, $value); + } + + return (string)$uri; + } + + public function getAdapterType() { + $this_class = get_class($this); + $type_name = str_replace('PhutilAuthAdapterOAuth', '', $this_class); + return strtolower($type_name); + } + + public function setState($state) { + $this->state = $state; + return $this; + } + + public function getState() { + return $this->state; + } + + public function setCode($code) { + $this->code = $code; + return $this; + } + + public function getCode() { + return $this->code; + } + + public function setRedirectURI($redirect_uri) { + $this->redirectURI = $redirect_uri; + return $this; + } + + public function getRedirectURI() { + return $this->redirectURI; + } + + public function getExtraAuthenticateParameters() { + return array(); + } + + public function getExtraTokenParameters() { + return array(); + } + + public function getExtraRefreshParameters() { + return array(); + } + + public function setScope($scope) { + $this->scope = $scope; + return $this; + } + + public function getScope() { + return $this->scope; + } + + public function setClientSecret(PhutilOpaqueEnvelope $client_secret) { + $this->clientSecret = $client_secret; + return $this; + } + + public function getClientSecret() { + return $this->clientSecret; + } + + public function setClientID($client_id) { + $this->clientID = $client_id; + return $this; + } + + public function getClientID() { + return $this->clientID; + } + + public function getAccessToken() { + return $this->getAccessTokenData('access_token'); + } + + public function getAccessTokenExpires() { + return $this->getAccessTokenData('expires_epoch'); + } + + public function getRefreshToken() { + return $this->getAccessTokenData('refresh_token'); + } + + protected function getAccessTokenData($key, $default = null) { + if ($this->accessTokenData === null) { + $this->accessTokenData = $this->loadAccessTokenData(); + } + + return idx($this->accessTokenData, $key, $default); + } + + public function supportsTokenRefresh() { + return false; + } + + public function refreshAccessToken($refresh_token) { + $this->accessTokenData = $this->loadRefreshTokenData($refresh_token); + return $this; + } + + protected function loadRefreshTokenData($refresh_token) { + $params = array( + 'refresh_token' => $refresh_token, + ) + $this->getExtraRefreshParameters(); + + // NOTE: Make sure we return the refresh_token so that subsequent + // calls to getRefreshToken() return it; providers normally do not echo + // it back for token refresh requests. + + return $this->makeTokenRequest($params) + array( + 'refresh_token' => $refresh_token, + ); + } + + protected function loadAccessTokenData() { + $code = $this->getCode(); + if (!$code) { + throw new PhutilInvalidStateException('setCode'); + } + + $params = array( + 'code' => $this->getCode(), + ) + $this->getExtraTokenParameters(); + + return $this->makeTokenRequest($params); + } + + private function makeTokenRequest(array $params) { + $uri = $this->getTokenBaseURI(); + $query_data = array( + 'client_id' => $this->getClientID(), + 'client_secret' => $this->getClientSecret()->openEnvelope(), + 'redirect_uri' => $this->getRedirectURI(), + ) + $params; + + $future = new HTTPSFuture($uri, $query_data); + $future->setMethod('POST'); + list($body) = $future->resolvex(); + + $data = $this->readAccessTokenResponse($body); + + if (isset($data['expires_in'])) { + $data['expires_epoch'] = $data['expires_in']; + } else if (isset($data['expires'])) { + $data['expires_epoch'] = $data['expires']; + } + + // If we got some "expires" value back, interpret it as an epoch timestamp + // if it's after the year 2010 and as a relative number of seconds + // otherwise. + if (isset($data['expires_epoch'])) { + if ($data['expires_epoch'] < (60 * 60 * 24 * 365 * 40)) { + $data['expires_epoch'] += time(); + } + } + + if (isset($data['error'])) { + throw new Exception(pht('Access token error: %s', $data['error'])); + } + + return $data; + } + + protected function readAccessTokenResponse($body) { + // NOTE: Most providers either return JSON or HTTP query strings, so try + // both mechanisms. If your provider does something else, override this + // method. + + $data = json_decode($body, true); + + if (!is_array($data)) { + $data = array(); + parse_str($body, $data); + } + + if (empty($data['access_token']) && + empty($data['error'])) { + throw new Exception( + pht('Failed to decode OAuth access token response: %s', $body)); + } + + return $data; + } + + protected function getOAuthAccountData($key, $default = null) { + if ($this->oauthAccountData === null) { + $this->oauthAccountData = $this->loadOAuthAccountData(); + } + + return idx($this->oauthAccountData, $key, $default); + } + +} diff --git a/src/auth/PhutilPhabricatorAuthAdapter.php b/src/auth/PhutilPhabricatorAuthAdapter.php new file mode 100644 --- /dev/null +++ b/src/auth/PhutilPhabricatorAuthAdapter.php @@ -0,0 +1,102 @@ +phabricatorBaseURI = $uri; + return $this; + } + + public function getPhabricatorBaseURI() { + return $this->phabricatorBaseURI; + } + + public function getAdapterDomain() { + return $this->adapterDomain; + } + + public function setAdapterDomain($domain) { + $this->adapterDomain = $domain; + return $this; + } + + public function getAdapterType() { + return 'phabricator'; + } + + public function getAccountID() { + return $this->getOAuthAccountData('phid'); + } + + public function getAccountEmail() { + return $this->getOAuthAccountData('primaryEmail'); + } + + public function getAccountName() { + return $this->getOAuthAccountData('userName'); + } + + public function getAccountImageURI() { + return $this->getOAuthAccountData('image'); + } + + public function getAccountURI() { + return $this->getOAuthAccountData('uri'); + } + + public function getAccountRealName() { + return $this->getOAuthAccountData('realName'); + } + + protected function getAuthenticateBaseURI() { + return $this->getPhabricatorURI('oauthserver/auth/'); + } + + protected function getTokenBaseURI() { + return $this->getPhabricatorURI('oauthserver/token/'); + } + + public function getScope() { + return ''; + } + + public function getExtraAuthenticateParameters() { + return array( + 'response_type' => 'code', + ); + } + + public function getExtraTokenParameters() { + return array( + 'grant_type' => 'authorization_code', + ); + } + + protected function loadOAuthAccountData() { + $uri = id(new PhutilURI($this->getPhabricatorURI('api/user.whoami'))) + ->setQueryParam('access_token', $this->getAccessToken()); + list($body) = id(new HTTPSFuture($uri))->resolvex(); + + try { + $data = phutil_json_decode($body); + return $data['result']; + } catch (PhutilJSONParserException $ex) { + throw new Exception( + pht( + 'Expected valid JSON response from Phabricator %s request.', + 'user.whoami'), + $ex); + } + } + + private function getPhabricatorURI($path) { + return rtrim($this->phabricatorBaseURI, '/').'/'.ltrim($path, '/'); + } + +} diff --git a/src/auth/PhutilSlackAuthAdapter.php b/src/auth/PhutilSlackAuthAdapter.php new file mode 100644 --- /dev/null +++ b/src/auth/PhutilSlackAuthAdapter.php @@ -0,0 +1,61 @@ +getOAuthAccountData('user'); + return idx($user, 'id'); + } + + public function getAccountEmail() { + $user = $this->getOAuthAccountData('user'); + return idx($user, 'email'); + } + + public function getAccountImageURI() { + $user = $this->getOAuthAccountData('user'); + return idx($user, 'image_512'); + } + + public function getAccountRealName() { + $user = $this->getOAuthAccountData('user'); + return idx($user, 'name'); + } + + protected function getAuthenticateBaseURI() { + return 'https://slack.com/oauth/authorize'; + } + + protected function getTokenBaseURI() { + return 'https://slack.com/api/oauth.access'; + } + + public function getScope() { + return 'identity.basic,identity.team,identity.avatar'; + } + + public function getExtraAuthenticateParameters() { + return array( + 'response_type' => 'code', + ); + } + + protected function loadOAuthAccountData() { + return id(new PhutilSlackFuture()) + ->setAccessToken($this->getAccessToken()) + ->setRawSlackQuery('users.identity') + ->resolve(); + } + +} diff --git a/src/auth/PhutilTwitchAuthAdapter.php b/src/auth/PhutilTwitchAuthAdapter.php new file mode 100644 --- /dev/null +++ b/src/auth/PhutilTwitchAuthAdapter.php @@ -0,0 +1,76 @@ +getOAuthAccountData('_id'); + } + + public function getAccountEmail() { + return $this->getOAuthAccountData('email'); + } + + public function getAccountName() { + return $this->getOAuthAccountData('name'); + } + + public function getAccountImageURI() { + return $this->getOAuthAccountData('logo'); + } + + public function getAccountURI() { + $name = $this->getAccountName(); + if ($name) { + return 'http://www.twitch.tv/'.$name; + } + return null; + } + + public function getAccountRealName() { + return $this->getOAuthAccountData('display_name'); + } + + protected function getAuthenticateBaseURI() { + return 'https://api.twitch.tv/kraken/oauth2/authorize'; + } + + protected function getTokenBaseURI() { + return 'https://api.twitch.tv/kraken/oauth2/token'; + } + + public function getScope() { + return 'user_read'; + } + + public function getExtraAuthenticateParameters() { + return array( + 'response_type' => 'code', + ); + } + + public function getExtraTokenParameters() { + return array( + 'grant_type' => 'authorization_code', + ); + } + + protected function loadOAuthAccountData() { + return id(new PhutilTwitchFuture()) + ->setClientID($this->getClientID()) + ->setAccessToken($this->getAccessToken()) + ->setRawTwitchQuery('user') + ->resolve(); + } + +} diff --git a/src/auth/PhutilTwitterAuthAdapter.php b/src/auth/PhutilTwitterAuthAdapter.php new file mode 100644 --- /dev/null +++ b/src/auth/PhutilTwitterAuthAdapter.php @@ -0,0 +1,73 @@ +getHandshakeData(), 'user_id'); + } + + public function getAccountName() { + return idx($this->getHandshakeData(), 'screen_name'); + } + + public function getAccountURI() { + $name = $this->getAccountName(); + if (strlen($name)) { + return 'https://twitter.com/'.$name; + } + return null; + } + + public function getAccountImageURI() { + $info = $this->getUserInfo(); + return idx($info, 'profile_image_url'); + } + + public function getAccountRealName() { + $info = $this->getUserInfo(); + return idx($info, 'name'); + } + + public function getAdapterType() { + return 'twitter'; + } + + public function getAdapterDomain() { + return 'twitter.com'; + } + + protected function getRequestTokenURI() { + return 'https://api.twitter.com/oauth/request_token'; + } + + protected function getAuthorizeTokenURI() { + return 'https://api.twitter.com/oauth/authorize'; + } + + protected function getValidateTokenURI() { + return 'https://api.twitter.com/oauth/access_token'; + } + + private function getUserInfo() { + if ($this->userInfo === null) { + $uri = new PhutilURI('https://api.twitter.com/1.1/users/show.json'); + $uri->setQueryParams( + array( + 'user_id' => $this->getAccountID(), + )); + + $data = $this->newOAuth1Future($uri) + ->setMethod('GET') + ->resolveJSON(); + + $this->userInfo = $data; + } + return $this->userInfo; + } + +} diff --git a/src/auth/PhutilWordPressAuthAdapter.php b/src/auth/PhutilWordPressAuthAdapter.php new file mode 100644 --- /dev/null +++ b/src/auth/PhutilWordPressAuthAdapter.php @@ -0,0 +1,73 @@ +getOAuthAccountData('ID'); + } + + public function getAccountEmail() { + return $this->getOAuthAccountData('email'); + } + + public function getAccountName() { + return $this->getOAuthAccountData('username'); + } + + public function getAccountImageURI() { + return $this->getOAuthAccountData('avatar_URL'); + } + + public function getAccountURI() { + return $this->getOAuthAccountData('profile_URL'); + } + + public function getAccountRealName() { + return $this->getOAuthAccountData('display_name'); + } + + protected function getAuthenticateBaseURI() { + return 'https://public-api.wordpress.com/oauth2/authorize'; + } + + protected function getTokenBaseURI() { + return 'https://public-api.wordpress.com/oauth2/token'; + } + + public function getScope() { + return 'user_read'; + } + + public function getExtraAuthenticateParameters() { + return array( + 'response_type' => 'code', + 'blog_id' => 0, + ); + } + + public function getExtraTokenParameters() { + return array( + 'grant_type' => 'authorization_code', + ); + } + + protected function loadOAuthAccountData() { + return id(new PhutilWordPressFuture()) + ->setClientID($this->getClientID()) + ->setAccessToken($this->getAccessToken()) + ->setRawWordPressQuery('/me/') + ->resolve(); + } + +} diff --git a/src/auth/exception/PhutilAuthConfigurationException.php b/src/auth/exception/PhutilAuthConfigurationException.php new file mode 100644 --- /dev/null +++ b/src/auth/exception/PhutilAuthConfigurationException.php @@ -0,0 +1,6 @@ + $value) { + if ($is_apcu) { + apcu_store($key, $value, $ttl); + } else { + apc_store($key, $value, $ttl); + } + } + + return $this; + } + + public function deleteKeys(array $keys) { + static $is_apcu; + if ($is_apcu === null) { + $is_apcu = self::isAPCu(); + } + + foreach ($keys as $key) { + if ($is_apcu) { + apcu_delete($key); + } else { + apc_delete($key); + } + } + + return $this; + } + + public function destroyCache() { + static $is_apcu; + if ($is_apcu === null) { + $is_apcu = self::isAPCu(); + } + + if ($is_apcu) { + apcu_clear_cache(); + } else { + apc_clear_cache('user'); + } + + return $this; + } + + private static function isAPCu() { + return function_exists('apcu_fetch'); + } + +} diff --git a/src/cache/PhutilDirectoryKeyValueCache.php b/src/cache/PhutilDirectoryKeyValueCache.php new file mode 100644 --- /dev/null +++ b/src/cache/PhutilDirectoryKeyValueCache.php @@ -0,0 +1,244 @@ +validateKeys($keys); + + try { + $this->lockCache(); + } catch (PhutilLockException $ex) { + return array(); + } + + $now = time(); + + $results = array(); + foreach ($keys as $key) { + $key_file = $this->getKeyFile($key); + try { + $data = Filesystem::readFile($key_file); + } catch (FilesystemException $ex) { + continue; + } + + $data = unserialize($data); + if (!$data) { + continue; + } + + if (isset($data['ttl']) && $data['ttl'] < $now) { + continue; + } + + $results[$key] = $data['value']; + } + + $this->unlockCache(); + + return $results; + } + + + public function setKeys(array $keys, $ttl = null) { + $this->validateKeys(array_keys($keys)); + + $this->lockCache(15); + + if ($ttl) { + $ttl_epoch = time() + $ttl; + } else { + $ttl_epoch = null; + } + + foreach ($keys as $key => $value) { + $dict = array( + 'value' => $value, + ); + if ($ttl_epoch) { + $dict['ttl'] = $ttl_epoch; + } + + try { + $key_file = $this->getKeyFile($key); + $key_dir = dirname($key_file); + if (!Filesystem::pathExists($key_dir)) { + Filesystem::createDirectory( + $key_dir, + $mask = 0755, + $recursive = true); + } + + $new_file = $key_file.'.new'; + Filesystem::writeFile($new_file, serialize($dict)); + Filesystem::rename($new_file, $key_file); + } catch (FilesystemException $ex) { + phlog($ex); + } + } + + $this->unlockCache(); + + return $this; + } + + + public function deleteKeys(array $keys) { + $this->validateKeys($keys); + + $this->lockCache(15); + + foreach ($keys as $key) { + $path = $this->getKeyFile($key); + Filesystem::remove($path); + + // If removing this key leaves the directory empty, clean it up. Then + // clean up any empty parent directories. + $path = dirname($path); + do { + if (!Filesystem::isDescendant($path, $this->getCacheDirectory())) { + break; + } + if (Filesystem::listDirectory($path, true)) { + break; + } + Filesystem::remove($path); + $path = dirname($path); + } while (true); + } + + $this->unlockCache(); + + return $this; + } + + + public function destroyCache() { + Filesystem::remove($this->getCacheDirectory()); + return $this; + } + + +/* -( Cache Storage )------------------------------------------------------ */ + + + /** + * @task storage + */ + public function setCacheDirectory($directory) { + $this->cacheDirectory = rtrim($directory, '/').'/'; + return $this; + } + + + /** + * @task storage + */ + private function getCacheDirectory() { + if (!$this->cacheDirectory) { + throw new PhutilInvalidStateException('setCacheDirectory'); + } + return $this->cacheDirectory; + } + + + /** + * @task storage + */ + private function getKeyFile($key) { + // Colon is a drive separator on Windows. + $key = str_replace(':', '_', $key); + + // NOTE: We add ".cache" to each file so we don't get a collision if you + // set the keys "a" and "a/b". Without ".cache", the file "a" would need + // to be both a file and a directory. + return $this->getCacheDirectory().$key.'.cache'; + } + + + /** + * @task storage + */ + private function validateKeys(array $keys) { + foreach ($keys as $key) { + // NOTE: Use of "." is reserved for ".lock", "key.new" and "key.cache". + // Use of "_" is reserved for converting ":". + if (!preg_match('@^[a-zA-Z0-9/:-]+$@', $key)) { + throw new Exception( + pht( + "Invalid key '%s': directory caches may only contain letters, ". + "numbers, hyphen, colon and slash.", + $key)); + } + } + } + + + /** + * @task storage + */ + private function lockCache($wait = 0) { + if ($this->lock) { + throw new Exception( + pht( + 'Trying to %s with a lock!', + __FUNCTION__.'()')); + } + + if (!Filesystem::pathExists($this->getCacheDirectory())) { + Filesystem::createDirectory($this->getCacheDirectory(), 0755, true); + } + + $lock = PhutilFileLock::newForPath($this->getCacheDirectory().'.lock'); + $lock->lock($wait); + + $this->lock = $lock; + } + + + /** + * @task storage + */ + private function unlockCache() { + if (!$this->lock) { + throw new PhutilInvalidStateException('lockCache'); + } + + $this->lock->unlock(); + $this->lock = null; + } + +} diff --git a/src/cache/PhutilInRequestKeyValueCache.php b/src/cache/PhutilInRequestKeyValueCache.php new file mode 100644 --- /dev/null +++ b/src/cache/PhutilInRequestKeyValueCache.php @@ -0,0 +1,118 @@ +limit = $limit; + return $this; + } + + +/* -( Key-Value Cache Implementation )------------------------------------- */ + + + public function isAvailable() { + return true; + } + + public function getKeys(array $keys) { + $results = array(); + $now = time(); + foreach ($keys as $key) { + if (!isset($this->cache[$key]) && !array_key_exists($key, $this->cache)) { + continue; + } + if (isset($this->ttl[$key]) && ($this->ttl[$key] < $now)) { + continue; + } + $results[$key] = $this->cache[$key]; + } + + return $results; + } + + public function setKeys(array $keys, $ttl = null) { + + foreach ($keys as $key => $value) { + $this->cache[$key] = $value; + } + + if ($ttl) { + $end = time() + $ttl; + foreach ($keys as $key => $value) { + $this->ttl[$key] = $end; + } + } else { + foreach ($keys as $key => $value) { + unset($this->ttl[$key]); + } + } + + if ($this->limit) { + $count = count($this->cache); + if ($count > $this->limit) { + $remove = array(); + foreach ($this->cache as $key => $value) { + $remove[] = $key; + + $count--; + if ($count <= $this->limit) { + break; + } + } + + $this->deleteKeys($remove); + } + } + + return $this; + } + + public function deleteKeys(array $keys) { + foreach ($keys as $key) { + unset($this->cache[$key]); + unset($this->ttl[$key]); + } + + return $this; + } + + public function getAllKeys() { + return $this->cache; + } + + public function destroyCache() { + $this->cache = array(); + $this->ttl = array(); + + return $this; + } + +} diff --git a/src/cache/PhutilKeyValueCache.php b/src/cache/PhutilKeyValueCache.php new file mode 100644 --- /dev/null +++ b/src/cache/PhutilKeyValueCache.php @@ -0,0 +1,121 @@ +getKeys(array($key)); + return idx($map, $key, $default); + } + + + /** + * Set a single key in cache. See @{method:setKeys} to set multiple keys at + * once. + * + * See @{method:setKeys} for a description of TTLs. + * + * @param string Key to set. + * @param wild Value to set. + * @param int|null Optional TTL. + * @return this + * @task kvimpl + */ + final public function setKey($key, $value, $ttl = null) { + return $this->setKeys(array($key => $value), $ttl); + } + + + /** + * Delete a key from the cache. See @{method:deleteKeys} to delete multiple + * keys at once. + * + * @param string Key to delete. + * @return this + * @task kvimpl + */ + final public function deleteKey($key) { + return $this->deleteKeys(array($key)); + } + + + /** + * Get data from the cache. + * + * @param list List of cache keys to retrieve. + * @return dict Dictionary of keys that were found in the + * cache. Keys not present in the cache are + * omitted, so you can detect a cache miss. + * @task kvimpl + */ + abstract public function getKeys(array $keys); + + + /** + * Put data into the key-value cache. + * + * With a TTL ("time to live"), the cache will automatically delete the key + * after a specified number of seconds. By default, there is no expiration + * policy and data will persist in cache indefinitely. + * + * @param dict Map of cache keys to values. + * @param int|null TTL for cache keys, in seconds. + * @return this + * @task kvimpl + */ + abstract public function setKeys(array $keys, $ttl = null); + + + /** + * Delete a list of keys from the cache. + * + * @param list List of keys to delete. + * @return this + * @task kvimpl + */ + abstract public function deleteKeys(array $keys); + + + /** + * Completely destroy all data in the cache. + * + * @return this + * @task kvimpl + */ + abstract public function destroyCache(); + +} diff --git a/src/cache/PhutilKeyValueCacheNamespace.php b/src/cache/PhutilKeyValueCacheNamespace.php new file mode 100644 --- /dev/null +++ b/src/cache/PhutilKeyValueCacheNamespace.php @@ -0,0 +1,65 @@ +namespace = $namespace.':'; + + return $this; + } + + public function setKeys(array $keys, $ttl = null) { + return parent::setKeys(array_combine( + $this->prefixKeys(array_keys($keys)), + $keys), $ttl); + } + + public function getKeys(array $keys) { + $results = parent::getKeys($this->prefixKeys($keys)); + + if (!$results) { + return array(); + } + + return array_combine( + $this->unprefixKeys(array_keys($results)), + $results); + } + + public function deleteKeys(array $keys) { + return parent::deleteKeys($this->prefixKeys($keys)); + } + + private function prefixKeys(array $keys) { + if ($this->namespace == null) { + throw new Exception(pht('Namespace not set.')); + } + + $prefixed_keys = array(); + foreach ($keys as $key) { + $prefixed_keys[] = $this->namespace.$key; + } + + return $prefixed_keys; + } + + private function unprefixKeys(array $keys) { + if ($this->namespace == null) { + throw new Exception(pht('Namespace not set.')); + } + + $unprefixed_keys = array(); + foreach ($keys as $key) { + $unprefixed_keys[] = substr($key, strlen($this->namespace)); + } + + return $unprefixed_keys; + } + +} diff --git a/src/cache/PhutilKeyValueCacheProfiler.php b/src/cache/PhutilKeyValueCacheProfiler.php new file mode 100644 --- /dev/null +++ b/src/cache/PhutilKeyValueCacheProfiler.php @@ -0,0 +1,108 @@ +name = $name; + return $this; + } + + public function getName() { + return $this->name; + } + + /** + * Set a profiler for cache operations. + * + * @param PhutilServiceProfiler Service profiler. + * @return this + * @task kvimpl + */ + public function setProfiler(PhutilServiceProfiler $profiler) { + $this->profiler = $profiler; + return $this; + } + + + /** + * Get the current profiler. + * + * @return PhutilServiceProfiler|null Profiler, or null if none is set. + * @task kvimpl + */ + public function getProfiler() { + return $this->profiler; + } + + + public function getKeys(array $keys) { + $call_id = null; + if ($this->getProfiler()) { + $call_id = $this->getProfiler()->beginServiceCall( + array( + 'type' => 'kvcache-get', + 'name' => $this->getName(), + 'keys' => $keys, + )); + } + + $results = parent::getKeys($keys); + + if ($call_id !== null) { + $this->getProfiler()->endServiceCall( + $call_id, + array( + 'hits' => array_keys($results), + )); + } + + return $results; + } + + + public function setKeys(array $keys, $ttl = null) { + $call_id = null; + if ($this->getProfiler()) { + $call_id = $this->getProfiler()->beginServiceCall( + array( + 'type' => 'kvcache-set', + 'name' => $this->getName(), + 'keys' => array_keys($keys), + 'ttl' => $ttl, + )); + } + + $result = parent::setKeys($keys, $ttl); + + if ($call_id !== null) { + $this->getProfiler()->endServiceCall($call_id, array()); + } + + return $result; + } + + + public function deleteKeys(array $keys) { + $call_id = null; + if ($this->getProfiler()) { + $call_id = $this->getProfiler()->beginServiceCall( + array( + 'type' => 'kvcache-del', + 'name' => $this->getName(), + 'keys' => $keys, + )); + } + + $result = parent::deleteKeys($keys); + + if ($call_id !== null) { + $this->getProfiler()->endServiceCall($call_id, array()); + } + + return $result; + } + +} diff --git a/src/cache/PhutilKeyValueCacheProxy.php b/src/cache/PhutilKeyValueCacheProxy.php new file mode 100644 --- /dev/null +++ b/src/cache/PhutilKeyValueCacheProxy.php @@ -0,0 +1,45 @@ +proxy = $proxy; + } + + final protected function getProxy() { + return $this->proxy; + } + + public function isAvailable() { + return $this->getProxy()->isAvailable(); + } + + + public function getKeys(array $keys) { + return $this->getProxy()->getKeys($keys); + } + + + public function setKeys(array $keys, $ttl = null) { + return $this->getProxy()->setKeys($keys, $ttl); + } + + + public function deleteKeys(array $keys) { + return $this->getProxy()->deleteKeys($keys); + } + + + public function destroyCache() { + return $this->getProxy()->destroyCache(); + } + + public function __call($method, array $arguments) { + return call_user_func_array( + array($this->getProxy(), $method), + $arguments); + } + +} diff --git a/src/cache/PhutilKeyValueCacheStack.php b/src/cache/PhutilKeyValueCacheStack.php new file mode 100644 --- /dev/null +++ b/src/cache/PhutilKeyValueCacheStack.php @@ -0,0 +1,131 @@ + Ordered list of key-value caches. + * @return this + * @task config + */ + public function setCaches(array $caches) { + assert_instances_of($caches, 'PhutilKeyValueCache'); + $this->cachesForward = $caches; + $this->cachesBackward = array_reverse($caches); + + return $this; + } + + + /** + * Set the readthrough TTL for the next cache operation. The TTL applies to + * any keys set by the next call to @{method:getKey} or @{method:getKeys}, + * and is reset after the call finishes. + * + * // If this causes any caches to fill, they'll fill with a 15-second TTL. + * $stack->setNextTTL(15)->getKey('porcupine'); + * + * // TTL does not persist; this will use no TTL. + * $stack->getKey('hedgehog'); + * + * @param int TTL in seconds. + * @return this + * + * @task config + */ + public function setNextTTL($ttl) { + $this->nextTTL = $ttl; + return $this; + } + + +/* -( Key-Value Cache Implementation )------------------------------------- */ + + + public function getKeys(array $keys) { + + $remaining = array_fuse($keys); + $results = array(); + $missed = array(); + + try { + foreach ($this->cachesForward as $cache) { + $result = $cache->getKeys($remaining); + $remaining = array_diff_key($remaining, $result); + $results += $result; + if (!$remaining) { + while ($cache = array_pop($missed)) { + // TODO: This sets too many results in the closer caches, although + // it probably isn't a big deal in most cases; normally we're just + // filling the request cache. + $cache->setKeys($result, $this->nextTTL); + } + break; + } + $missed[] = $cache; + } + $this->nextTTL = null; + } catch (Exception $ex) { + $this->nextTTL = null; + throw $ex; + } + + return $results; + } + + + public function setKeys(array $keys, $ttl = null) { + foreach ($this->cachesBackward as $cache) { + $cache->setKeys($keys, $ttl); + } + } + + + public function deleteKeys(array $keys) { + foreach ($this->cachesBackward as $cache) { + $cache->deleteKeys($keys); + } + } + + + public function destroyCache() { + foreach ($this->cachesBackward as $cache) { + $cache->destroyCache(); + } + } + +} diff --git a/src/cache/PhutilMemcacheKeyValueCache.php b/src/cache/PhutilMemcacheKeyValueCache.php new file mode 100644 --- /dev/null +++ b/src/cache/PhutilMemcacheKeyValueCache.php @@ -0,0 +1,153 @@ +bucketKeys($keys); + $results = array(); + + foreach ($buckets as $bucket => $bucket_keys) { + $conn = $this->getConnection($bucket); + $result = $conn->get($bucket_keys); + if (!$result) { + // If the call fails, treat it as a miss on all keys. + $result = array(); + } + + $results += $result; + } + + return $results; + } + + public function setKeys(array $keys, $ttl = null) { + $buckets = $this->bucketKeys(array_keys($keys)); + + // Memcache interprets TTLs as: + // + // - Seconds from now, for values from 1 to 2592000 (30 days). + // - Epoch timestamp, for values larger than 2592000. + // + // We support only relative TTLs, so convert excessively large relative + // TTLs into epoch TTLs. + if ($ttl > 2592000) { + $effective_ttl = time() + $ttl; + } else { + $effective_ttl = $ttl; + } + + foreach ($buckets as $bucket => $bucket_keys) { + $conn = $this->getConnection($bucket); + + foreach ($bucket_keys as $key) { + $conn->set($key, $keys[$key], 0, $effective_ttl); + } + } + + return $this; + } + + public function deleteKeys(array $keys) { + $buckets = $this->bucketKeys($keys); + + foreach ($buckets as $bucket => $bucket_keys) { + $conn = $this->getConnection($bucket); + foreach ($bucket_keys as $key) { + $conn->delete($key); + } + } + + return $this; + } + + public function destroyCache() { + foreach ($this->servers as $key => $spec) { + $this->getConnection($key)->flush(); + } + return $this; + } + + +/* -( Managing Memcache )-------------------------------------------------- */ + + + /** + * Set available memcache servers. For example: + * + * $cache->setServers( + * array( + * array( + * 'host' => '10.0.0.20', + * 'port' => 11211, + * ), + * array( + * 'host' => '10.0.0.21', + * 'port' => 11211, + * ), + * )); + * + * @param list List of server specifications. + * @return this + * @task memcache + */ + public function setServers(array $servers) { + $this->servers = array_values($servers); + return $this; + } + + private function bucketKeys(array $keys) { + $buckets = array(); + $n = count($this->servers); + + if (!$n) { + throw new PhutilInvalidStateException('setServers'); + } + + foreach ($keys as $key) { + $bucket = (int)((crc32($key) & 0x7FFFFFFF) % $n); + $buckets[$bucket][] = $key; + } + + return $buckets; + } + + + /** + * @phutil-external-symbol function memcache_pconnect + */ + private function getConnection($server) { + if (empty($this->connections[$server])) { + $spec = $this->servers[$server]; + $host = $spec['host']; + $port = $spec['port']; + + $conn = memcache_pconnect($host, $spec['port']); + + if (!$conn) { + throw new Exception( + pht( + 'Unable to connect to memcache server (%s:%d)!', + $host, + $port)); + } + + $this->connections[$server] = $conn; + } + return $this->connections[$server]; + } + +} diff --git a/src/cache/PhutilOnDiskKeyValueCache.php b/src/cache/PhutilOnDiskKeyValueCache.php new file mode 100644 --- /dev/null +++ b/src/cache/PhutilOnDiskKeyValueCache.php @@ -0,0 +1,205 @@ +wait = $wait; + return $this; + } + + public function getKeys(array $keys) { + $now = time(); + + $results = array(); + $reloaded = false; + foreach ($keys as $key) { + + // Try to read the value from cache. If we miss, load (or reload) the + // cache. + + while (true) { + if (isset($this->cache[$key])) { + $val = $this->cache[$key]; + if (empty($val['ttl']) || $val['ttl'] >= $now) { + $results[$key] = $val['val']; + break; + } + } + + if ($reloaded) { + break; + } + + $this->loadCache($hold_lock = false); + $reloaded = true; + } + } + + return $results; + } + + + public function setKeys(array $keys, $ttl = null) { + if ($ttl) { + $ttl_epoch = time() + $ttl; + } else { + $ttl_epoch = null; + } + + $dicts = array(); + foreach ($keys as $key => $value) { + $dict = array( + 'val' => $value, + ); + if ($ttl_epoch) { + $dict['ttl'] = $ttl_epoch; + } + $dicts[$key] = $dict; + } + + $this->loadCache($hold_lock = true); + foreach ($dicts as $key => $dict) { + $this->cache[$key] = $dict; + } + $this->saveCache(); + + return $this; + } + + + public function deleteKeys(array $keys) { + $this->loadCache($hold_lock = true); + foreach ($keys as $key) { + unset($this->cache[$key]); + } + $this->saveCache(); + + return $this; + } + + + public function destroyCache() { + Filesystem::remove($this->getCacheFile()); + return $this; + } + + +/* -( Cache Storage )------------------------------------------------------ */ + + + /** + * @task storage + */ + public function setCacheFile($file) { + $this->cacheFile = $file; + return $this; + } + + + /** + * @task storage + */ + private function loadCache($hold_lock) { + if ($this->lock) { + throw new Exception( + pht( + 'Trying to %s with a lock!', + __FUNCTION__.'()')); + } + + $lock = PhutilFileLock::newForPath($this->getCacheFile().'.lock'); + try { + $lock->lock($this->wait); + } catch (PhutilLockException $ex) { + if ($hold_lock) { + throw $ex; + } else { + $this->cache = array(); + return; + } + } + + try { + $this->cache = array(); + if (Filesystem::pathExists($this->getCacheFile())) { + $cache = unserialize(Filesystem::readFile($this->getCacheFile())); + if ($cache) { + $this->cache = $cache; + } + } + } catch (Exception $ex) { + $lock->unlock(); + throw $ex; + } + + if ($hold_lock) { + $this->lock = $lock; + } else { + $lock->unlock(); + } + } + + + /** + * @task storage + */ + private function saveCache() { + if (!$this->lock) { + throw new PhutilInvalidStateException('loadCache'); + } + + // We're holding a lock so we're safe to do a write to a well-known file. + // Write to the same directory as the cache so the rename won't imply a + // copy across volumes. + $new = $this->getCacheFile().'.new'; + Filesystem::writeFile($new, serialize($this->cache)); + Filesystem::rename($new, $this->getCacheFile()); + + $this->lock->unlock(); + $this->lock = null; + } + + + /** + * @task storage + */ + private function getCacheFile() { + if (!$this->cacheFile) { + throw new PhutilInvalidStateException('setCacheFile'); + } + return $this->cacheFile; + } + +} diff --git a/src/cache/__tests__/PhutilKeyValueCacheTestCase.php b/src/cache/__tests__/PhutilKeyValueCacheTestCase.php new file mode 100644 --- /dev/null +++ b/src/cache/__tests__/PhutilKeyValueCacheTestCase.php @@ -0,0 +1,267 @@ +doCacheTest($cache); + $cache->destroyCache(); + } + + public function testInRequestCacheLimit() { + $cache = new PhutilInRequestKeyValueCache(); + $cache->setLimit(4); + + $cache->setKey(1, 1); + $cache->setKey(2, 2); + $cache->setKey(3, 3); + $cache->setKey(4, 4); + + $this->assertEqual( + array( + 1 => 1, + 2 => 2, + 3 => 3, + 4 => 4, + ), + $cache->getAllKeys()); + + + $cache->setKey(5, 5); + + $this->assertEqual( + array( + 2 => 2, + 3 => 3, + 4 => 4, + 5 => 5, + ), + $cache->getAllKeys()); + } + + public function testOnDiskCache() { + $cache = new PhutilOnDiskKeyValueCache(); + $cache->setCacheFile(new TempFile()); + $this->doCacheTest($cache); + $cache->destroyCache(); + } + + public function testAPCCache() { + $cache = new PhutilAPCKeyValueCache(); + if (!$cache->isAvailable()) { + $this->assertSkipped(pht('Cache not available.')); + } + $this->doCacheTest($cache); + } + + public function testDirectoryCache() { + $cache = new PhutilDirectoryKeyValueCache(); + + $dir = Filesystem::createTemporaryDirectory(); + $cache->setCacheDirectory($dir); + $this->doCacheTest($cache); + $cache->destroyCache(); + } + + public function testDirectoryCacheSpecialDirectoryRules() { + $cache = new PhutilDirectoryKeyValueCache(); + + $dir = Filesystem::createTemporaryDirectory(); + $dir = $dir.'/dircache/'; + $cache->setCacheDirectory($dir); + + $cache->setKey('a', 1); + $this->assertEqual(true, Filesystem::pathExists($dir.'/a.cache')); + + $cache->setKey('a/b', 1); + $this->assertEqual(true, Filesystem::pathExists($dir.'/a/')); + $this->assertEqual(true, Filesystem::pathExists($dir.'/a/b.cache')); + + $cache->deleteKey('a/b'); + $this->assertEqual(false, Filesystem::pathExists($dir.'/a/')); + $this->assertEqual(false, Filesystem::pathExists($dir.'/a/b.cache')); + + $cache->destroyCache(); + $this->assertEqual(false, Filesystem::pathExists($dir)); + } + + public function testNamespaceCache() { + $namespace = 'namespace'.mt_rand(); + $in_request_cache = new PhutilInRequestKeyValueCache(); + $cache = new PhutilKeyValueCacheNamespace($in_request_cache); + $cache->setNamespace($namespace); + + $test_info = get_class($cache); + $keys = array( + 'key1' => mt_rand(), + 'key2' => '', + 'key3' => 'Phabricator', + ); + $cache->setKeys($keys); + $cached_keys = $in_request_cache->getAllKeys(); + + foreach ($keys as $key => $value) { + $cached_key = $namespace.':'.$key; + + $this->assertTrue( + isset($cached_keys[$cached_key]), + $test_info); + + $this->assertEqual( + $value, + $cached_keys[$cached_key], + $test_info); + } + + $cache->destroyCache(); + + $this->doCacheTest($cache); + $cache->destroyCache(); + } + + public function testCacheStack() { + $req_cache = new PhutilInRequestKeyValueCache(); + $disk_cache = new PhutilOnDiskKeyValueCache(); + $disk_cache->setCacheFile(new TempFile()); + $apc_cache = new PhutilAPCKeyValueCache(); + + $stack = array( + $req_cache, + $disk_cache, + ); + + if ($apc_cache->isAvailable()) { + $stack[] = $apc_cache; + } + + $cache = new PhutilKeyValueCacheStack(); + $cache->setCaches($stack); + + $this->doCacheTest($cache); + + $disk_cache->destroyCache(); + $req_cache->destroyCache(); + } + + private function doCacheTest(PhutilKeyValueCache $cache) { + $key1 = 'test:'.mt_rand(); + $key2 = 'test:'.mt_rand(); + + $default = 'cache-miss'; + $value1 = 'cache-hit1'; + $value2 = 'cache-hit2'; + + $test_info = get_class($cache); + + // Test that we miss correctly on missing values. + + $this->assertEqual( + $default, + $cache->getKey($key1, $default), + $test_info); + $this->assertEqual( + array( + ), + $cache->getKeys(array($key1, $key2)), + $test_info); + + + // Test that we can set individual keys. + + $cache->setKey($key1, $value1); + $this->assertEqual( + $value1, + $cache->getKey($key1, $default), + $test_info); + $this->assertEqual( + array( + $key1 => $value1, + ), + $cache->getKeys(array($key1, $key2)), + $test_info); + + + // Test that we can delete individual keys. + + $cache->deleteKey($key1); + + $this->assertEqual( + $default, + $cache->getKey($key1, $default), + $test_info); + $this->assertEqual( + array( + ), + $cache->getKeys(array($key1, $key2)), + $test_info); + + + + // Test that we can set multiple keys. + + $cache->setKeys( + array( + $key1 => $value1, + $key2 => $value2, + )); + + $this->assertEqual( + $value1, + $cache->getKey($key1, $default), + $test_info); + $this->assertEqual( + array( + $key1 => $value1, + $key2 => $value2, + ), + $cache->getKeys(array($key1, $key2)), + $test_info); + + + // Test that we can delete multiple keys. + + $cache->deleteKeys(array($key1, $key2)); + + $this->assertEqual( + $default, + $cache->getKey($key1, $default), + $test_info); + $this->assertEqual( + array( + ), + $cache->getKeys(array($key1, $key2)), + $test_info); + + + // NOTE: The TTL tests are necessarily slow (we must sleep() through the + // TTLs) and do not work with APC (it does not TTL until the next request) + // so they're disabled by default. If you're developing the cache stack, + // it may be useful to run them. + + return; + + // Test that keys expire when they TTL. + + $cache->setKey($key1, $value1, 1); + $cache->setKey($key2, $value2, 5); + + $this->assertEqual($value1, $cache->getKey($key1, $default)); + $this->assertEqual($value2, $cache->getKey($key2, $default)); + + sleep(2); + + $this->assertEqual($default, $cache->getKey($key1, $default)); + $this->assertEqual($value2, $cache->getKey($key2, $default)); + + + // Test that setting a 0 TTL overwrites a nonzero TTL. + + $cache->setKey($key1, $value1, 1); + $this->assertEqual($value1, $cache->getKey($key1, $default)); + $cache->setKey($key1, $value1, 0); + $this->assertEqual($value1, $cache->getKey($key1, $default)); + sleep(2); + $this->assertEqual($value1, $cache->getKey($key1, $default)); + } + +} diff --git a/src/channel/PhutilChannel.php b/src/channel/PhutilChannel.php new file mode 100644 --- /dev/null +++ b/src/channel/PhutilChannel.php @@ -0,0 +1,426 @@ +obuf = new PhutilRope(); + } + + +/* -( Reading and Writing )------------------------------------------------ */ + + + /** + * Read from the channel. A channel defines the format of data that is read + * from it, so this method may return strings, objects, or anything else. + * + * The default implementation returns bytes. + * + * @return wild Data from the channel, normally bytes. + * + * @task io + */ + public function read() { + $result = $this->ibuf; + $this->ibuf = ''; + return $result; + } + + + /** + * Write to the channel. A channel defines what data format it accepts, + * so this method may take strings, objects, or anything else. + * + * The default implementation accepts bytes. + * + * @param wild Data to write to the channel, normally bytes. + * @return this + * + * @task io + */ + public function write($bytes) { + if (!is_scalar($bytes)) { + throw new Exception( + pht( + '%s may only write strings!', + __METHOD__.'()')); + } + + $this->obuf->append($bytes); + return $this; + } + + +/* -( Waiting for Activity )----------------------------------------------- */ + + + /** + * Wait for any activity on a list of channels. Convenience wrapper around + * @{method:waitForActivity}. + * + * @param list A list of channels to wait for. + * @param dict Options, see above. + * @return void + * + * @task wait + */ + public static function waitForAny(array $channels, array $options = array()) { + return self::waitForActivity($channels, $channels, $options); + } + + + /** + * Wait (using select()) for channels to become ready for reads or writes. + * This method blocks until some channel is ready to be updated. + * + * It does not provide a way to determine which channels are ready to be + * updated. The expectation is that you'll just update every channel. This + * might change eventually. + * + * Available options are: + * + * - 'read' (list) Additional streams to select for read. + * - 'write' (list) Additional streams to select for write. + * - 'except' (list) Additional streams to select for except. + * - 'timeout' (float) Select timeout, defaults to 1. + * + * NOTE: Extra streams must be //streams//, not //sockets//, because this + * method uses `stream_select()`, not `socket_select()`. + * + * @param list List of channels to wait for reads on. + * @param list List of channels to wait for writes on. + * @return void + * + * @task wait + */ + public static function waitForActivity( + array $reads, + array $writes, + array $options = array()) { + + assert_instances_of($reads, __CLASS__); + assert_instances_of($writes, __CLASS__); + + $read = idx($options, 'read', array()); + $write = idx($options, 'write', array()); + $except = idx($options, 'except', array()); + $wait = idx($options, 'timeout', 1); + + // TODO: It would be nice to just be able to categorically reject these as + // unselectable. + foreach (array($reads, $writes) as $channels) { + foreach ($channels as $channel) { + $r_sockets = $channel->getReadSockets(); + $w_sockets = $channel->getWriteSockets(); + + // If any channel has no read sockets and no write sockets, assume it + // isn't selectable and return immediately (effectively degrading to a + // busy wait). + + if (!$r_sockets && !$w_sockets) { + return false; + } + } + } + + foreach ($reads as $channel) { + // If any of the read channels have data in read buffers, return + // immediately. If we don't, we risk running select() on a bunch of + // sockets which won't become readable because the data the application + // expects is already in a read buffer. + + if (!$channel->isReadBufferEmpty()) { + return; + } + + $r_sockets = $channel->getReadSockets(); + foreach ($r_sockets as $socket) { + $read[] = $socket; + $except[] = $socket; + } + } + + foreach ($writes as $channel) { + if ($channel->isWriteBufferEmpty()) { + // If the channel's write buffer is empty, don't select the write + // sockets, since they're writable immediately. + $w_sockets = array(); + } else { + $w_sockets = $channel->getWriteSockets(); + } + + foreach ($w_sockets as $socket) { + $write[] = $socket; + $except[] = $socket; + } + } + + if (!$read && !$write && !$except) { + return false; + } + + $wait_sec = (int)$wait; + $wait_usec = 1000000 * ($wait - $wait_sec); + + @stream_select($read, $write, $except, $wait_sec, $wait_usec); + } + + +/* -( Responding to Activity )--------------------------------------------- */ + + + /** + * Updates the channel, filling input buffers and flushing output buffers. + * Returns false if the channel has closed. + * + * @return bool True if the channel is still open. + * + * @task update + */ + public function update() { + $maximum_read = PHP_INT_MAX; + if ($this->readBufferSize !== null) { + $maximum_read = ($this->readBufferSize - strlen($this->ibuf)); + } + + while ($maximum_read > 0) { + $in = $this->readBytes($maximum_read); + if (!strlen($in)) { + // Reading is blocked for now. + break; + } + $this->ibuf .= $in; + $maximum_read -= strlen($in); + } + + while ($this->obuf->getByteLength()) { + $len = $this->writeBytes($this->obuf->getAnyPrefix()); + if (!$len) { + // Writing is blocked for now. + break; + } + $this->obuf->removeBytesFromHead($len); + } + + return $this->isOpen(); + } + + +/* -( Channel Implementation )--------------------------------------------- */ + + + /** + * Set a channel name. This is primarily intended to allow you to debug + * channel code more easily, by naming channels something meaningful. + * + * @param string Channel name. + * @return this + * + * @task impl + */ + public function setName($name) { + $this->name = $name; + return $this; + } + + + /** + * Get the channel name, as set by @{method:setName}. + * + * @return string Name of the channel. + * + * @task impl + */ + public function getName() { + return coalesce($this->name, get_class($this)); + } + + + /** + * Test if the channel is open: active, can be read from and written to, etc. + * + * @return bool True if the channel is open. + * + * @task impl + */ + abstract public function isOpen(); + + + /** + * Close the channel for writing. + * + * @return void + * @task impl + */ + abstract public function closeWriteChannel(); + + /** + * Test if the channel is open for reading. + * + * @return bool True if the channel is open for reading. + * + * @task impl + */ + public function isOpenForReading() { + return $this->isOpen(); + } + + + /** + * Test if the channel is open for writing. + * + * @return bool True if the channel is open for writing. + * + * @task impl + */ + public function isOpenForWriting() { + return $this->isOpen(); + } + + + /** + * Read from the channel's underlying I/O. + * + * @param int Maximum number of bytes to read. + * @return string Bytes, if available. + * + * @task impl + */ + abstract protected function readBytes($length); + + + /** + * Write to the channel's underlying I/O. + * + * @param string Bytes to write. + * @return int Number of bytes written. + * + * @task impl + */ + abstract protected function writeBytes($bytes); + + + /** + * Get sockets to select for reading. + * + * @return list Read sockets. + * + * @task impl + */ + protected function getReadSockets() { + return array(); + } + + + /** + * Get sockets to select for writing. + * + * @return list Write sockets. + * + * @task impl + */ + protected function getWriteSockets() { + return array(); + } + + + /** + * Set the maximum size of the channel's read buffer. Reads will artificially + * block once the buffer reaches this size until the in-process buffer is + * consumed. + * + * @param int|null Maximum read buffer size, or `null` for a limitless buffer. + * @return this + * @task impl + */ + public function setReadBufferSize($size) { + $this->readBufferSize = $size; + return $this; + } + + + /** + * Test state of the read buffer. + * + * @return bool True if the read buffer is empty. + * + * @task impl + */ + public function isReadBufferEmpty() { + return (strlen($this->ibuf) == 0); + } + + + /** + * Test state of the write buffer. + * + * @return bool True if the write buffer is empty. + * + * @task impl + */ + public function isWriteBufferEmpty() { + return !$this->getWriteBufferSize(); + } + + + /** + * Get the number of bytes we're currently waiting to write. + * + * @return int Number of waiting bytes. + * + * @task impl + */ + public function getWriteBufferSize() { + return $this->obuf->getByteLength(); + } + + + /** + * Wait for any buffered writes to complete. This is a blocking call. When + * the call returns, the write buffer will be empty. + * + * @task impl + */ + public function flush() { + while (!$this->isWriteBufferEmpty()) { + self::waitForAny(array($this)); + if (!$this->update()) { + throw new Exception(pht('Channel closed while flushing output!')); + } + } + return $this; + } + +} diff --git a/src/channel/PhutilChannelChannel.php b/src/channel/PhutilChannelChannel.php new file mode 100644 --- /dev/null +++ b/src/channel/PhutilChannelChannel.php @@ -0,0 +1,112 @@ +channel = $channel; + $this->didConstruct(); + } + + protected function didConstruct() { + // Hook for subclasses. + } + + public function read() { + return $this->channel->read(); + } + + public function write($message) { + $this->channel->write($message); + return $this; + } + + public function update() { + return $this->channel->update(); + } + + public function isOpen() { + return $this->channel->isOpen(); + } + + public function closeWriteChannel() { + return $this->channel->closeWriteChannel(); + } + + public function isOpenForReading() { + return $this->channel->isOpenForReading(); + } + + public function isOpenForWriting() { + return $this->channel->isOpenForWriting(); + } + + protected function readBytes($length) { + $this->throwOnRawByteOperations(); + } + + protected function writeBytes($bytes) { + $this->throwOnRawByteOperations(); + } + + protected function getReadSockets() { + return $this->channel->getReadSockets(); + } + + protected function getWriteSockets() { + return $this->channel->getWriteSockets(); + } + + public function setReadBufferSize($size) { + $this->channel->setReadBufferSize($size); + return $this; + } + + public function isReadBufferEmpty() { + return $this->channel->isReadBufferEmpty(); + } + + public function isWriteBufferEmpty() { + return $this->channel->isWriteBufferEmpty(); + } + + public function getWriteBufferSize() { + return $this->channel->getWriteBufferSize(); + } + + public function flush() { + $this->channel->flush(); + return $this; + } + + protected function getUnderlyingChannel() { + return $this->channel; + } + + private function throwOnRawByteOperations() { + + // NOTE: You should only be able to end up here if you subclass this class + // and implement your subclass incorrectly, since the byte methods are + // protected. + + throw new Exception( + pht( + 'Do not call %s or %s directly on a %s. Instead, call %s or %s.', + 'readBytes()', + 'writeBytes()', + __CLASS__, + 'read()', + 'write()')); + } + +} diff --git a/src/channel/PhutilExecChannel.php b/src/channel/PhutilExecChannel.php new file mode 100644 --- /dev/null +++ b/src/channel/PhutilExecChannel.php @@ -0,0 +1,173 @@ +write("GET / HTTP/1.0\n\n"); + * while (true) { + * echo $channel->read(); + * + * PhutilChannel::waitForAny(array($channel)); + * if (!$channel->update()) { + * // Break out of the loop when the channel closes. + * break; + * } + * } + * + * This script makes an HTTP request to "example.com". This example is heavily + * contrived. In most cases, @{class:ExecFuture} and other futures constructs + * offer a much easier way to solve problems which involve system commands, and + * @{class:HTTPFuture} and other HTTP constructs offer a much easier way to + * solve problems which involve HTTP. + * + * @{class:PhutilExecChannel} is generally useful only when a program acts like + * a server but performs I/O on stdin/stdout, and you need to act like a client + * or interact with the program at the same time as you manage traditional + * socket connections. Examples are Mercurial operating in "cmdserve" mode, git + * operating in "receive-pack" mode, etc. It is unlikely that any reasonable + * use of this class is concise enough to make a short example out of, so you + * get a contrived one instead. + * + * See also @{class:PhutilSocketChannel}, for a similar channel that uses + * sockets for I/O. + * + * Since @{class:ExecFuture} already supports buffered I/O and socket selection, + * the implementation of this class is fairly straightforward. + * + * @task construct Construction + */ +final class PhutilExecChannel extends PhutilChannel { + + private $future; + private $stderrHandler; + + +/* -( Construction )------------------------------------------------------- */ + + + /** + * Construct an exec channel from a @{class:ExecFuture}. The future should + * **NOT** have been started yet (e.g., with `isReady()` or `start()`), + * because @{class:ExecFuture} closes stdin by default when futures start. + * If stdin has been closed, you will be unable to write on the channel. + * + * @param ExecFuture Future to use as an underlying I/O source. + * @task construct + */ + public function __construct(ExecFuture $future) { + parent::__construct(); + + // Make an empty write to keep the stdin pipe open. By default, futures + // close this pipe when they start. + $future->write('', $keep_pipe = true); + + // Start the future so that reads and writes work immediately. + $future->isReady(); + + $this->future = $future; + } + + public function __destruct() { + if (!$this->future->isReady()) { + $this->future->resolveKill(); + } + } + + public function update() { + $this->future->isReady(); + return parent::update(); + } + + public function isOpen() { + return !$this->future->isReady(); + } + + protected function readBytes($length) { + list($stdout, $stderr) = $this->future->read(); + $this->future->discardBuffers(); + + if (strlen($stderr)) { + if ($this->stderrHandler) { + call_user_func($this->stderrHandler, $this, $stderr); + } else { + throw new Exception( + pht('Unexpected output to stderr on exec channel: %s', $stderr)); + } + } + + return $stdout; + } + + public function write($bytes) { + $this->future->write($bytes, $keep_pipe = true); + } + + public function closeWriteChannel() { + $this->future->write('', $keep_pipe = false); + } + + protected function writeBytes($bytes) { + throw new Exception(pht('%s can not write bytes directly!', 'ExecFuture')); + } + + protected function getReadSockets() { + return $this->future->getReadSockets(); + } + + protected function getWriteSockets() { + return $this->future->getWriteSockets(); + } + + public function isReadBufferEmpty() { + // Check both the channel and future read buffers, since either could have + // data. + return parent::isReadBufferEmpty() && $this->future->isReadBufferEmpty(); + } + + public function setReadBufferSize($size) { + // NOTE: We may end up using 2x the buffer size here, one inside + // ExecFuture and one inside the Channel. We could tune this eventually, but + // it should be fine for now. + parent::setReadBufferSize($size); + $this->future->setReadBufferSize($size); + return $this; + } + + public function isWriteBufferEmpty() { + return $this->future->isWriteBufferEmpty(); + } + + public function getWriteBufferSize() { + return $this->future->getWriteBufferSize(); + } + + /** + * If the wrapped @{class:ExecFuture} outputs data to stderr, we normally + * throw an exception. Instead, you can provide a callback handler that will + * be invoked and passed the data. It should have this signature: + * + * function f(PhutilExecChannel $channel, $stderr) { + * // ... + * } + * + * The `$channel` will be this channel object, and `$stderr` will be a string + * with bytes received over stderr. + * + * You can set a handler which does nothing to effectively ignore and discard + * any output on stderr. + * + * @param callable Handler to invoke when stderr data is received. + * @return this + */ + public function setStderrHandler($handler) { + $this->stderrHandler = $handler; + return $this; + } + +} diff --git a/src/channel/PhutilJSONProtocolChannel.php b/src/channel/PhutilJSONProtocolChannel.php new file mode 100644 --- /dev/null +++ b/src/channel/PhutilJSONProtocolChannel.php @@ -0,0 +1,94 @@ + + * + * ...where is an 8-character, zero-padded integer written as a string. + * For example, this is a valid message: + * + * 00000015{"key":"value"} + * + * @task protocol + */ + protected function encodeMessage($message) { + $message = json_encode($message); + $len = sprintf( + '%0'.self::SIZE_LENGTH.'.'.self::SIZE_LENGTH.'d', + strlen($message)); + return "{$len}{$message}"; + } + + + /** + * Decode a message received from the other end of the channel. Messages are + * decoded as associative arrays. + * + * @task protocol + */ + protected function decodeStream($data) { + $this->buf .= $data; + + $objects = array(); + while (strlen($this->buf) >= $this->byteLengthOfNextChunk) { + switch ($this->mode) { + case self::MODE_LENGTH: + $len = substr($this->buf, 0, self::SIZE_LENGTH); + $this->buf = substr($this->buf, self::SIZE_LENGTH); + + $this->mode = self::MODE_OBJECT; + $this->byteLengthOfNextChunk = (int)$len; + break; + case self::MODE_OBJECT: + $data = substr($this->buf, 0, $this->byteLengthOfNextChunk); + $this->buf = substr($this->buf, $this->byteLengthOfNextChunk); + + try { + $objects[] = phutil_json_decode($data); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Failed to decode JSON object.'), + $ex); + } + + $this->mode = self::MODE_LENGTH; + $this->byteLengthOfNextChunk = self::SIZE_LENGTH; + break; + } + } + + return $objects; + } + +} diff --git a/src/channel/PhutilLogFileChannel.php b/src/channel/PhutilLogFileChannel.php new file mode 100644 --- /dev/null +++ b/src/channel/PhutilLogFileChannel.php @@ -0,0 +1,41 @@ +logfile = fopen($path, 'a'); + $this->log('--- '.getmypid().' ---'); + return $this; + } + + public function read() { + $buffer = parent::read(); + + if (strlen($buffer)) { + $this->log('>>> '.phutil_loggable_string($buffer)); + } + + return $buffer; + } + + public function write($message) { + if (strlen($message)) { + $this->log('<<< '.phutil_loggable_string($message)); + } + + return parent::write($message); + } + + private function log($message) { + if ($this->logfile) { + fwrite($this->logfile, $message."\n"); + } + } + +} diff --git a/src/channel/PhutilMetricsChannel.php b/src/channel/PhutilMetricsChannel.php new file mode 100644 --- /dev/null +++ b/src/channel/PhutilMetricsChannel.php @@ -0,0 +1,85 @@ +bytesWritten; + } + + /** + * Get the number of bytes that have been read from the channel. This excludes + * any bytes which have been received but not actually read by anything, and + * thus may underreport compared to actual activity on the wire. + * + * @return int Bytes read. + * @task metrics + */ + public function getBytesRead() { + return $this->bytesRead; + } + + + /** + * Get the elapsed wall time since this channel opened. + * + * @return float Wall time, in seconds. + * @task metrics + */ + public function getWallTime() { + return microtime(true) - $this->startTime; + } + + +/* -( Implementation )----------------------------------------------------- */ + + + /** + * @task impl + */ + protected function didConstruct() { + $this->startTime = microtime(true); + } + + + /** + * @task impl + */ + public function read() { + $buffer = parent::read(); + $this->bytesRead += strlen($buffer); + return $buffer; + } + + + /** + * @task impl + */ + public function write($message) { + $this->bytesWritten += strlen($message); + return parent::write($message); + } + +} diff --git a/src/channel/PhutilPHPObjectProtocolChannel.php b/src/channel/PhutilPHPObjectProtocolChannel.php new file mode 100644 --- /dev/null +++ b/src/channel/PhutilPHPObjectProtocolChannel.php @@ -0,0 +1,90 @@ + + * + * ...where is a 4-byte unsigned big-endian integer. + * + * @task protocol + */ + protected function encodeMessage($message) { + $message = serialize($message); + $len = pack('N', strlen($message)); + return "{$len}{$message}"; + } + + + /** + * Decode a message received from the other end of the channel. + * + * @task protocol + */ + protected function decodeStream($data) { + $this->buf .= $data; + + $objects = array(); + while (strlen($this->buf) >= $this->byteLengthOfNextChunk) { + switch ($this->mode) { + case self::MODE_LENGTH: + $len = substr($this->buf, 0, self::SIZE_LENGTH); + $this->buf = substr($this->buf, self::SIZE_LENGTH); + + $this->mode = self::MODE_OBJECT; + $this->byteLengthOfNextChunk = head(unpack('N', $len)); + break; + case self::MODE_OBJECT: + $data = substr($this->buf, 0, $this->byteLengthOfNextChunk); + $this->buf = substr($this->buf, $this->byteLengthOfNextChunk); + + $obj = @unserialize($data); + if ($obj === false) { + throw new Exception(pht('Failed to unserialize object: %s', $data)); + } else { + $objects[] = $obj; + } + + $this->mode = self::MODE_LENGTH; + $this->byteLengthOfNextChunk = self::SIZE_LENGTH; + break; + } + } + + return $objects; + } + +} diff --git a/src/channel/PhutilProtocolChannel.php b/src/channel/PhutilProtocolChannel.php new file mode 100644 --- /dev/null +++ b/src/channel/PhutilProtocolChannel.php @@ -0,0 +1,139 @@ +decodeStream($data); + foreach ($messages as $message) { + $this->addMessage($message); + } + } + + if (!$this->messages) { + return null; + } + + return array_shift($this->messages); + } + + + /** + * Write a message to the channel. + * + * @param wild Some message. + * @return this + * + * @task io + */ + public function write($message) { + $bytes = $this->encodeMessage($message); + return parent::write($bytes); + } + + + /** + * Add a message to the queue. While you normally do not need to do this, + * you can use it to inject out-of-band messages. + * + * @param wild Some message. + * @return this + * + * @task io + */ + public function addMessage($message) { + $this->messages[] = $message; + return $this; + } + + +/* -( Protocol Implementation )-------------------------------------------- */ + + + /** + * Encode a message for transmission. + * + * @param wild Some message. + * @return string The message serialized into a wire format for + * transmission. + * + * @task protocol + */ + abstract protected function encodeMessage($message); + + + /** + * Decode bytes from the underlying channel into zero or more complete + * messages. The messages should be returned. + * + * This method is called as data is available. It will receive incoming + * data only once, and must buffer any data which represents only part of + * a message. Once a complete message is received, it can return the message + * and discard that part of the buffer. + * + * Generally, a protocol channel should maintain a read buffer, implement + * a parser in this method, and store parser state on the object to be able + * to process incoming data in small chunks. + * + * @param string One or more bytes from the underlying channel. + * @return list Zero or more parsed messages. + * + * @task protocol + */ + abstract protected function decodeStream($data); + + +/* -( Waiting for Activity )----------------------------------------------- */ + + + /** + * Wait for a message, blocking until one is available. + * + * @return wild A message. + * + * @task wait + */ + public function waitForMessage() { + while (true) { + $is_open = $this->update(); + $message = $this->read(); + if ($message !== null) { + return $message; + } + + if (!$is_open) { + break; + } + + self::waitForAny(array($this)); + } + + throw new Exception(pht('Channel closed while waiting for message!')); + } + +} diff --git a/src/channel/PhutilSocketChannel.php b/src/channel/PhutilSocketChannel.php new file mode 100644 --- /dev/null +++ b/src/channel/PhutilSocketChannel.php @@ -0,0 +1,192 @@ +readSocket = $read_socket; + if ($write_socket) { + $this->writeSocket = $write_socket; + } else { + $this->writeSocket = $read_socket; + $this->isSingleSocket = true; + } + } + + public function __destruct() { + $this->closeSockets(); + } + + + /** + * Creates a pair of socket channels that are connected to each other. This + * is mostly useful for writing unit tests of, e.g., protocol channels. + * + * list($x, $y) = PhutilSocketChannel::newChannelPair(); + * + * @task construct + */ + public static function newChannelPair() { + $sockets = null; + + $domain = phutil_is_windows() ? STREAM_PF_INET : STREAM_PF_UNIX; + $pair = stream_socket_pair($domain, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP); + if (!$pair) { + throw new Exception(pht('%s failed!', 'stream_socket_pair()')); + } + + $x = new PhutilSocketChannel($pair[0]); + $y = new PhutilSocketChannel($pair[1]); + + return array($x, $y); + } + + public function isOpen() { + return ($this->isOpenForReading() || $this->isOpenForWriting()); + } + + public function isOpenForReading() { + return (bool)$this->readSocket; + } + + public function isOpenForWriting() { + return (bool)$this->writeSocket; + } + + protected function readBytes($length) { + $socket = $this->readSocket; + if (!$socket) { + return ''; + } + + $data = @fread($socket, min($length, 64 * 1024)); + + if ($data === false) { + $this->closeReadSocket(); + $data = ''; + } + + // NOTE: fread() continues returning empty string after the socket is + // closed, we need to check for EOF explicitly. + if ($data === '') { + if (feof($socket)) { + $this->closeReadSocket(); + } + } + + return $data; + } + + protected function writeBytes($bytes) { + $socket = $this->writeSocket; + if (!$socket) { + return 0; + } + + $len = phutil_fwrite_nonblocking_stream($socket, $bytes); + if ($len === false) { + $this->closeWriteSocket(); + return 0; + } + return $len; + } + + protected function getReadSockets() { + if ($this->readSocket) { + return array($this->readSocket); + } + return array(); + } + + protected function getWriteSockets() { + if ($this->writeSocket) { + return array($this->writeSocket); + } else { + return array(); + } + } + + private function closeReadSocket() { + $this->closeOneSocket($this->readSocket); + $this->readSocket = null; + if ($this->isSingleSocket) { + $this->writeSocket = null; + } + } + + private function closeWriteSocket() { + $this->closeOneSocket($this->writeSocket); + $this->writeSocket = null; + if ($this->isSingleSocket) { + $this->readSocket = null; + } + } + + public function closeWriteChannel() { + $this->closeWriteSocket(); + } + + private function closeOneSocket($socket) { + if (!$socket) { + return; + } + // We should also stream_socket_shutdown() here but HHVM throws errors + // with it (for example 'Unexpected object type PlainFile'). We depend + // just on fclose() until it is fixed. + @fclose($socket); + } + + private function closeSockets() { + $this->closeReadSocket(); + $this->closeWriteSocket(); + } + +} diff --git a/src/channel/__tests__/PhutilChannelTestCase.php b/src/channel/__tests__/PhutilChannelTestCase.php new file mode 100644 --- /dev/null +++ b/src/channel/__tests__/PhutilChannelTestCase.php @@ -0,0 +1,45 @@ +write($str_len_8); + while (true) { + $x->update(); + $y->update(); + $read = $y->read(); + if (strlen($read)) { + break; + } + } + + // We expect to read the entire message. + $this->assertEqual($str_len_8, $read); + + + // Again, with a read buffer limit. + + $y->setReadBufferSize(4); + $x->write($str_len_8); + + while (true) { + $x->update(); + $y->update(); + $read = $y->read(); + if (strlen($read)) { + break; + } + } + + // We expect to see only the first 4 bytes of the message. + $this->assertEqual($str_len_4, $read); + } + +} diff --git a/src/channel/__tests__/PhutilJSONProtocolChannelTestCase.php b/src/channel/__tests__/PhutilJSONProtocolChannelTestCase.php new file mode 100644 --- /dev/null +++ b/src/channel/__tests__/PhutilJSONProtocolChannelTestCase.php @@ -0,0 +1,26 @@ + mt_rand(), + 'list' => array(1, 2, 3), + 'null' => null, + ); + + $xp->write($dict); + $xp->flush(); + $result = $yp->waitForMessage(); + + $this->assertEqual( + $dict, + $result, + pht('Values are identical.')); + } + +} diff --git a/src/channel/__tests__/PhutilPHPObjectProtocolChannelTestCase.php b/src/channel/__tests__/PhutilPHPObjectProtocolChannelTestCase.php new file mode 100644 --- /dev/null +++ b/src/channel/__tests__/PhutilPHPObjectProtocolChannelTestCase.php @@ -0,0 +1,66 @@ + mt_rand(), + ); + + $xp->write($object); + $xp->flush(); + $result = $yp->waitForMessage(); + + $this->assertTrue( + (array)$object === (array)$result, + pht('Values are identical.')); + + $this->assertFalse( + $object === $result, + pht('Objects are not the same.')); + } + + public function testCloseSocketWriteChannel() { + list($x, $y) = PhutilSocketChannel::newChannelPair(); + $xp = new PhutilPHPObjectProtocolChannel($x); + $yp = new PhutilPHPObjectProtocolChannel($y); + + $yp->closeWriteChannel(); + $yp->update(); + + // NOTE: This test is more broad than the implementation needs to be. A + // better test would be to verify that this throws an exception: + // + // $xp->waitForMessage(); + // + // However, if the test breaks, that method will hang forever instead of + // returning, which would be hard to diagnose. Since the current + // implementation shuts down the entire channel, just test for that. + + $this->assertFalse($xp->update(), pht('Expected channel to close.')); + } + + public function testCloseExecWriteChannel() { + $future = new ExecFuture('cat'); + + // If this test breaks, we want to explode, not hang forever. + $future->setTimeout(5); + + $exec_channel = new PhutilExecChannel($future); + $exec_channel->write('quack'); + $exec_channel->closeWriteChannel(); + + // If `closeWriteChannel()` did what it is supposed to, this will just + // echo "quack" and exit with no error code. If the channel did not close, + // this will time out after 5 seconds and throw. + $future->resolvex(); + + $this->assertTrue(true); + } + + +} diff --git a/src/conduit/ConduitClient.php b/src/conduit/ConduitClient.php new file mode 100644 --- /dev/null +++ b/src/conduit/ConduitClient.php @@ -0,0 +1,395 @@ +connectionID; + } + + public function __construct($uri) { + $this->uri = new PhutilURI($uri); + if (!strlen($this->uri->getDomain())) { + throw new Exception( + pht("Conduit URI '%s' must include a valid host.", $uri)); + } + $this->host = $this->uri->getDomain(); + } + + /** + * Override the domain specified in the service URI and provide a specific + * host identity. + * + * This can be used to connect to a specific node in a cluster environment. + */ + public function setHost($host) { + $this->host = $host; + return $this; + } + + public function getHost() { + return $this->host; + } + + public function setConduitToken($conduit_token) { + $this->conduitToken = $conduit_token; + return $this; + } + + public function getConduitToken() { + return $this->conduitToken; + } + + public function setOAuthToken($oauth_token) { + $this->oauthToken = $oauth_token; + return $this; + } + + public function callMethodSynchronous($method, array $params) { + return $this->callMethod($method, $params)->resolve(); + } + + public function didReceiveResponse($method, $data) { + if ($method == 'conduit.connect') { + $this->sessionKey = idx($data, 'sessionKey'); + $this->connectionID = idx($data, 'connectionID'); + } + return $data; + } + + public function setTimeout($timeout) { + $this->timeout = $timeout; + return $this; + } + + public function setSigningKeys( + $public_key, + PhutilOpaqueEnvelope $private_key) { + + $this->publicKey = $public_key; + $this->privateKey = $private_key; + return $this; + } + + public function callMethod($method, array $params) { + + $meta = array(); + + if ($this->sessionKey) { + $meta['sessionKey'] = $this->sessionKey; + } + + if ($this->connectionID) { + $meta['connectionID'] = $this->connectionID; + } + + if ($method == 'conduit.connect') { + $certificate = idx($params, 'certificate'); + if ($certificate) { + $token = time(); + $params['authToken'] = $token; + $params['authSignature'] = sha1($token.$certificate); + } + unset($params['certificate']); + } + + if ($this->privateKey && $this->publicKey) { + $meta['auth.type'] = self::AUTH_ASYMMETRIC; + $meta['auth.key'] = $this->publicKey; + $meta['auth.host'] = $this->getHostStringForSignature(); + + $signature = $this->signRequest($method, $params, $meta); + $meta['auth.signature'] = $signature; + } + + if ($this->conduitToken) { + $meta['token'] = $this->conduitToken; + } + + if ($this->oauthToken) { + $meta['access_token'] = $this->oauthToken; + } + + if ($meta) { + $params['__conduit__'] = $meta; + } + + $uri = id(clone $this->uri)->setPath('/api/'.$method); + + $data = array( + 'params' => json_encode($params), + 'output' => 'json', + + // This is a hint to Phabricator that the client expects a Conduit + // response. It is not necessary, but provides better error messages in + // some cases. + '__conduit__' => true, + ); + + // Always use the cURL-based HTTPSFuture, for proxy support and other + // protocol edge cases that HTTPFuture does not support. + $core_future = new HTTPSFuture($uri, $data); + $core_future->addHeader('Host', $this->getHostStringForHeader()); + + $core_future->setMethod('POST'); + $core_future->setTimeout($this->timeout); + + if ($this->username !== null) { + $core_future->setHTTPBasicAuthCredentials( + $this->username, + $this->password); + } + + return id(new ConduitFuture($core_future)) + ->setClient($this, $method); + } + + public function setBasicAuthCredentials($username, $password) { + $this->username = $username; + $this->password = new PhutilOpaqueEnvelope($password); + return $this; + } + + private function getHostStringForHeader() { + return $this->newHostString(false); + } + + private function getHostStringForSignature() { + return $this->newHostString(true); + } + + /** + * Build a string describing the host for this request. + * + * This method builds strings in two modes: with explicit ports for request + * signing (which always include the port number) and with implicit ports + * for use in the "Host:" header of requests (which omit the port number if + * the port is the same as the default port for the protocol). + * + * This implicit port behavior is similar to what browsers do, so it is less + * likely to get us into trouble with webserver configurations. + * + * @param bool True to include the port explicitly. + * @return string String describing the host for the request. + */ + private function newHostString($with_explicit_port) { + $host = $this->getHost(); + + $uri = new PhutilURI($this->uri); + $protocol = $uri->getProtocol(); + $port = $uri->getPort(); + + $implicit_ports = array( + 'https' => 443, + ); + $default_port = 80; + + $implicit_port = idx($implicit_ports, $protocol, $default_port); + + if ($with_explicit_port) { + if (!$port) { + $port = $implicit_port; + } + } else { + if ($port == $implicit_port) { + $port = null; + } + } + + if (!$port) { + $result = $host; + } else { + $result = $host.':'.$port; + } + + return $result; + } + + private function signRequest( + $method, + array $params, + array $meta) { + + $input = self::encodeRequestDataForSignature( + $method, + $params, + $meta); + + $signature = null; + $result = openssl_sign( + $input, + $signature, + $this->privateKey->openEnvelope()); + if (!$result) { + throw new Exception( + pht('Unable to sign Conduit request with signing key.')); + } + + return self::SIGNATURE_CONSIGN_1.base64_encode($signature); + } + + public static function verifySignature( + $method, + array $params, + array $meta, + $openssl_public_key) { + + $auth_type = idx($meta, 'auth.type'); + switch ($auth_type) { + case self::AUTH_ASYMMETRIC: + break; + default: + throw new Exception( + pht( + 'Unable to verify request signature, specified "%s" '. + '("%s") is unknown.', + 'auth.type', + $auth_type)); + } + + $public_key = idx($meta, 'auth.key'); + if (!strlen($public_key)) { + throw new Exception( + pht( + 'Unable to verify request signature, no "%s" present in '. + 'request protocol information.', + 'auth.key')); + } + + $signature = idx($meta, 'auth.signature'); + if (!strlen($signature)) { + throw new Exception( + pht( + 'Unable to verify request signature, no "%s" present '. + 'in request protocol information.', + 'auth.signature')); + } + + $prefix = self::SIGNATURE_CONSIGN_1; + if (strncmp($signature, $prefix, strlen($prefix)) !== 0) { + throw new Exception( + pht( + 'Unable to verify request signature, signature format is not '. + 'known.')); + } + $signature = substr($signature, strlen($prefix)); + + $input = self::encodeRequestDataForSignature( + $method, + $params, + $meta); + + $signature = base64_decode($signature); + + $trap = new PhutilErrorTrap(); + $result = @openssl_verify( + $input, + $signature, + $openssl_public_key); + $err = $trap->getErrorsAsString(); + $trap->destroy(); + + if ($result === 1) { + // Signature is good. + return true; + } else if ($result === 0) { + // Signature is bad. + throw new Exception( + pht( + 'Request signature verification failed: signature is not correct.')); + } else { + // Some kind of error. + if (strlen($err)) { + throw new Exception( + pht( + 'OpenSSL encountered an error verifying the request signature: %s', + $err)); + } else { + throw new Exception( + pht( + 'OpenSSL encountered an unknown error verifying the request: %s', + $err)); + } + } + } + + private static function encodeRequestDataForSignature( + $method, + array $params, + array $meta) { + + unset($meta['auth.signature']); + + $structure = array( + 'method' => $method, + 'protocol' => $meta, + 'parameters' => $params, + ); + + return self::encodeRawDataForSignature($structure); + } + + public static function encodeRawDataForSignature($data) { + $out = array(); + + if (is_array($data)) { + if (!$data || (array_keys($data) == range(0, count($data) - 1))) { + $out[] = 'A'; + $out[] = count($data); + $out[] = ':'; + foreach ($data as $value) { + $out[] = self::encodeRawDataForSignature($value); + } + } else { + ksort($data); + $out[] = 'O'; + $out[] = count($data); + $out[] = ':'; + foreach ($data as $key => $value) { + $out[] = self::encodeRawDataForSignature($key); + $out[] = self::encodeRawDataForSignature($value); + } + } + } else if (is_string($data)) { + $out[] = 'S'; + $out[] = strlen($data); + $out[] = ':'; + $out[] = $data; + } else if (is_int($data)) { + $out[] = 'I'; + $out[] = strlen((string)$data); + $out[] = ':'; + $out[] = (string)$data; + } else if (is_null($data)) { + $out[] = 'N'; + $out[] = ':'; + } else if ($data === true) { + $out[] = 'B1:'; + } else if ($data === false) { + $out[] = 'B0:'; + } else { + throw new Exception( + pht( + 'Unexpected data type in request data: %s.', + gettype($data))); + } + + return implode('', $out); + } + +} diff --git a/src/conduit/ConduitClientException.php b/src/conduit/ConduitClientException.php new file mode 100644 --- /dev/null +++ b/src/conduit/ConduitClientException.php @@ -0,0 +1,16 @@ +errorCode = $code; + } + + public function getErrorCode() { + return $this->errorCode; + } + +} diff --git a/src/conduit/ConduitFuture.php b/src/conduit/ConduitFuture.php new file mode 100644 --- /dev/null +++ b/src/conduit/ConduitFuture.php @@ -0,0 +1,76 @@ +client = $client; + $this->conduitMethod = $method; + return $this; + } + + public function isReady() { + if ($this->profilerCallID === null) { + $profiler = PhutilServiceProfiler::getInstance(); + + $this->profilerCallID = $profiler->beginServiceCall( + array( + 'type' => 'conduit', + 'method' => $this->conduitMethod, + 'size' => $this->getProxiedFuture()->getHTTPRequestByteLength(), + )); + } + + return parent::isReady(); + } + + protected function didReceiveResult($result) { + if ($this->profilerCallID !== null) { + $profiler = PhutilServiceProfiler::getInstance(); + $profiler->endServiceCall( + $this->profilerCallID, + array()); + } + + list($status, $body, $headers) = $result; + if ($status->isError()) { + throw $status; + } + + $raw = $body; + + $shield = 'for(;;);'; + if (!strncmp($raw, $shield, strlen($shield))) { + $raw = substr($raw, strlen($shield)); + } + + $data = null; + try { + $data = phutil_json_decode($raw); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht( + 'Host returned HTTP/200, but invalid JSON data in response to '. + 'a Conduit method call.'), + $ex); + } + + if ($data['error_code']) { + throw new ConduitClientException( + $data['error_code'], + $data['error_info']); + } + + $result = $data['result']; + + $result = $this->client->didReceiveResponse( + $this->conduitMethod, + $result); + + return $result; + } + +} diff --git a/src/conduit/__tests__/ConduitClientTestCase.php b/src/conduit/__tests__/ConduitClientTestCase.php new file mode 100644 --- /dev/null +++ b/src/conduit/__tests__/ConduitClientTestCase.php @@ -0,0 +1,34 @@ + array( + 'nothing' => null, + 'emptystring' => '', + ), + 'empty' => array( + ), + 'list' => array( + 15, + 'quack', + true, + false, + ), + 'a' => array( + 'key' => 'value', + 'key2' => 'value2', + ), + ); + + $expect = + 'O4:S1:aO2:S3:keyS5:valueS4:key2S6:value2S5:emptyA0:S4:listA4:I2:15'. + 'S5:quackB1:B0:S1:zO2:S11:emptystringS0:S7:nothingN:'; + + $this->assertEqual( + $expect, + ConduitClient::encodeRawDataForSignature($input)); + } + +} diff --git a/src/console/PhutilConsole.php b/src/console/PhutilConsole.php new file mode 100644 --- /dev/null +++ b/src/console/PhutilConsole.php @@ -0,0 +1,295 @@ +disabledTypes = new PhutilArrayWithDefaultValue(); + } + + + /** + * Get the current console. If there's no active console, a new local console + * is created (see @{method:newLocalConsole} for details). You can change the + * active console with @{method:setConsole}. + * + * @return PhutilConsole Active console. + * @task construct + */ + public static function getConsole() { + if (empty(self::$console)) { + self::setConsole(self::newLocalConsole()); + } + return self::$console; + } + + + /** + * Set the active console. + * + * @param PhutilConsole + * @return void + * @task construct + */ + public static function setConsole(PhutilConsole $console) { + self::$console = $console; + } + + + /** + * Create a new console attached to stdin/stdout/stderr of this process. + * This is how consoles normally work -- for instance, writing output with + * @{method:writeOut} prints directly to stdout. If you don't create a + * console explicitly, a new local console is created for you. + * + * @return PhutilConsole A new console which operates on the pipes of this + * process. + * @task construct + */ + public static function newLocalConsole() { + return self::newConsoleForServer(new PhutilConsoleServer()); + } + + + public static function newConsoleForServer(PhutilConsoleServer $server) { + $console = new PhutilConsole(); + $console->server = $server; + return $console; + } + + + public static function newRemoteConsole() { + $io_channel = new PhutilSocketChannel( + fopen('php://stdin', 'r'), + fopen('php://stdout', 'w')); + $protocol_channel = new PhutilPHPObjectProtocolChannel($io_channel); + + $console = new PhutilConsole(); + $console->channel = $protocol_channel; + + return $console; + } + + +/* -( Interfacing with the User )------------------------------------------ */ + + + public function confirm($prompt, $default = false) { + $message = id(new PhutilConsoleMessage()) + ->setType(PhutilConsoleMessage::TYPE_CONFIRM) + ->setData( + array( + 'prompt' => $prompt, + 'default' => $default, + )); + + $this->writeMessage($message); + $response = $this->waitForMessage(); + + return $response->getData(); + } + + public function prompt($prompt, $history = '') { + $message = id(new PhutilConsoleMessage()) + ->setType(PhutilConsoleMessage::TYPE_PROMPT) + ->setData( + array( + 'prompt' => $prompt, + 'history' => $history, + )); + + $this->writeMessage($message); + $response = $this->waitForMessage(); + + return $response->getData(); + } + + public function sendMessage($data) { + $message = id(new PhutilConsoleMessage())->setData($data); + return $this->writeMessage($message); + } + + public function writeOut($pattern /* , ... */) { + $args = func_get_args(); + return $this->writeTextMessage(PhutilConsoleMessage::TYPE_OUT, $args); + } + + public function writeErr($pattern /* , ... */) { + $args = func_get_args(); + return $this->writeTextMessage(PhutilConsoleMessage::TYPE_ERR, $args); + } + + public function writeLog($pattern /* , ... */) { + $args = func_get_args(); + return $this->writeTextMessage(PhutilConsoleMessage::TYPE_LOG, $args); + } + + public function beginRedirectOut() { + // We need as small buffer as possible. 0 means infinite, 1 means 4096 in + // PHP < 5.4.0. + ob_start(array($this, 'redirectOutCallback'), 2); + $this->flushing = true; + } + + public function endRedirectOut() { + $this->flushing = false; + ob_end_flush(); + } + + +/* -( Internals )---------------------------------------------------------- */ + + // Must be public because it is called from output buffering. + public function redirectOutCallback($string) { + if (strlen($string)) { + $this->flushing = false; + $this->writeOut('%s', $string); + $this->flushing = true; + } + return ''; + } + + private function writeTextMessage($type, array $argv) { + + $message = id(new PhutilConsoleMessage()) + ->setType($type) + ->setData($argv); + + $this->writeMessage($message); + + return $this; + } + + private function writeMessage(PhutilConsoleMessage $message) { + if ($this->disabledTypes[$message->getType()]) { + return $this; + } + + if ($this->flushing) { + ob_flush(); + } + if ($this->channel) { + $this->channel->write($message); + $this->channel->flush(); + } else { + $response = $this->server->handleMessage($message); + if ($response) { + $this->messages[] = $response; + } + } + return $this; + } + + private function waitForMessage() { + if ($this->channel) { + $message = $this->channel->waitForMessage(); + } else if ($this->messages) { + $message = array_shift($this->messages); + } else { + throw new Exception( + pht( + '%s called with no messages!', + __FUNCTION__.'()')); + } + + return $message; + } + + public function getServer() { + return $this->server; + } + + private function disableMessageType($type) { + $this->disabledTypes[$type] += 1; + return $this; + } + + private function enableMessageType($type) { + if ($this->disabledTypes[$type] == 0) { + throw new Exception(pht("Message type '%s' is already enabled!", $type)); + } + $this->disabledTypes[$type] -= 1; + return $this; + } + + public function disableOut() { + return $this->disableMessageType(PhutilConsoleMessage::TYPE_OUT); + } + + public function enableOut() { + return $this->enableMessageType(PhutilConsoleMessage::TYPE_OUT); + } + + public function isLogEnabled() { + $message = id(new PhutilConsoleMessage()) + ->setType(PhutilConsoleMessage::TYPE_ENABLED) + ->setData( + array( + 'which' => PhutilConsoleMessage::TYPE_LOG, + )); + + $this->writeMessage($message); + $response = $this->waitForMessage(); + + return $response->getData(); + } + + public function isErrATTY() { + $message = id(new PhutilConsoleMessage()) + ->setType(PhutilConsoleMessage::TYPE_TTY) + ->setData( + array( + 'which' => PhutilConsoleMessage::TYPE_ERR, + )); + + $this->writeMessage($message); + $response = $this->waitForMessage(); + + return $response->getData(); + } + + public function getErrCols() { + $message = id(new PhutilConsoleMessage()) + ->setType(PhutilConsoleMessage::TYPE_COLS) + ->setData( + array( + 'which' => PhutilConsoleMessage::TYPE_ERR, + )); + + $this->writeMessage($message); + $response = $this->waitForMessage(); + + return $response->getData(); + } + + +} diff --git a/src/console/PhutilConsoleFormatter.php b/src/console/PhutilConsoleFormatter.php new file mode 100644 --- /dev/null +++ b/src/console/PhutilConsoleFormatter.php @@ -0,0 +1,98 @@ + 0, + 'red' => 1, + 'green' => 2, + 'yellow' => 3, + 'blue' => 4, + 'magenta' => 5, + 'cyan' => 6, + 'white' => 7, + 'default' => 9, + ); + + private static $disableANSI; + + public static function disableANSI($disable) { + self::$disableANSI = $disable; + } + + public static function getDisableANSI() { + if (self::$disableANSI === null) { + $term = phutil_utf8_strtolower(getenv('TERM')); + // ansicon enables ANSI support on Windows + if (!$term && getenv('ANSICON')) { + $term = 'ansi'; + } + + if (phutil_is_windows() && $term !== 'cygwin' && $term !== 'ansi') { + self::$disableANSI = true; + } else if (!defined('STDOUT')) { + self::$disableANSI = true; + } else if (function_exists('posix_isatty') && !posix_isatty(STDOUT)) { + self::$disableANSI = true; + } else { + self::$disableANSI = false; + } + } + return self::$disableANSI; + } + + public static function formatString($format /* ... */) { + $args = func_get_args(); + $args[0] = self::interpretFormat($args[0]); + return call_user_func_array('sprintf', $args); + } + + public static function replaceColorCode($matches) { + $codes = self::$colorCodes; + $offset = 30 + $codes[$matches[2]]; + $default = 39; + if ($matches[1] == 'bg') { + $offset += 10; + $default += 10; + } + + return chr(27).'['.$offset.'m'.$matches[3].chr(27).'['.$default.'m'; + } + + public static function interpretFormat($format) { + $colors = implode('|', array_keys(self::$colorCodes)); + + // Sequence should be preceded by start-of-string or non-backslash + // escaping. + $bold_re = '/(?(.*)@sU', + '\3', + $format); + } else { + $esc = chr(27); + $bold = $esc.'[1m'.'\\1'.$esc.'[m'; + $underline = $esc.'[4m'.'\\1'.$esc.'[m'; + $invert = $esc.'[7m'.'\\1'.$esc.'[m'; + + $format = preg_replace($bold_re, $bold, $format); + $format = preg_replace($underline_re, $underline, $format); + $format = preg_replace($invert_re, $invert, $format); + $format = preg_replace_callback( + '@<(fg|bg):('.$colors.')>(.*)@sU', + array(__CLASS__, 'replaceColorCode'), + $format); + } + + // Remove backslash escaping + return preg_replace('/\\\\(\*\*.*\*\*|__.*__|##.*##)/sU', '\1', $format); + } + +} diff --git a/src/console/PhutilConsoleMessage.php b/src/console/PhutilConsoleMessage.php new file mode 100644 --- /dev/null +++ b/src/console/PhutilConsoleMessage.php @@ -0,0 +1,39 @@ +data = $data; + return $this; + } + + public function getData() { + return $this->data; + } + + public function setType($type) { + $this->type = $type; + return $this; + } + + public function getType() { + return $this->type; + } + +} diff --git a/src/console/PhutilConsoleMetrics.php b/src/console/PhutilConsoleMetrics.php new file mode 100644 --- /dev/null +++ b/src/console/PhutilConsoleMetrics.php @@ -0,0 +1,65 @@ +width = false; + + return $this; + } + + public function getTerminalWidth() { + if ($this->width === false) { + $this->width = $this->computeTerminalWidth(); + } + + return $this->width; + } + + private function computeTerminalWidth() { + if (phutil_is_windows()) { + // TODO: Figure out how to do this on Windows. + return null; + } + + $tmp = new TempFile(); + + // NOTE: We can't just execute this because it won't be connected to a TTY + // if we do. + $err = id(new PhutilExecPassthru('tput cols > %s', $tmp)) + ->resolve(); + $stdout = Filesystem::readFile($tmp); + unset($tmp); + + if ($err) { + return null; + } + + $width = (int)trim($stdout); + if ($width > 0) { + return $width; + } + + return null; + } +} diff --git a/src/console/PhutilConsoleProgressBar.php b/src/console/PhutilConsoleProgressBar.php new file mode 100644 --- /dev/null +++ b/src/console/PhutilConsoleProgressBar.php @@ -0,0 +1,179 @@ +setTotal(count($stuff)); + * + * // As you complete the work, update the progress bar. + * foreach ($stuff as $thing) { + * do_stuff($thing); + * $bar->update(1); + * } + * + * // When complete, mark the work done to clear the bar. + * $bar->done(); + * + * The progress bar attempts to account for various special cases, notably: + * + * - If stderr is not a TTY, the bar will not be drawn (for example, if + * it is being piped to a log file). + * - If the Phutil log output is enabled (usually because `--trace` was + * specified), the bar will not be drawn. + * - The bar will be resized to the width of the console if possible. + * + */ +final class PhutilConsoleProgressBar extends Phobject { + + private $work; + private $done; + private $drawn; + private $console; + private $finished; + private $lastUpdate; + private $quiet = false; + + public function setConsole(PhutilConsole $console) { + $this->console = $console; + return $this; + } + + private function getConsole() { + if ($this->console) { + return $this->console; + } + return PhutilConsole::getConsole(); + } + + public function setTotal($work) { + $this->work = $work; + $this->redraw(); + return $this; + } + + public function setQuiet($quiet) { + $this->quiet = $quiet; + return $this; + } + + public function update($work) { + $this->done += $work; + $this->redraw(); + return $this; + } + + private function redraw() { + if ($this->lastUpdate + 0.1 > microtime(true)) { + // We redrew the bar very recently; skip this update. + return $this; + } + + return $this->draw(); + } + + + /** + * Explicitly redraw the bar. + * + * Normally, the progress bar is automatically redrawn periodically, but + * you may want to force it to draw. + * + * For example, we force a draw after pre-filling the bar when resuming + * large file uploads in `arc upload`. Otherwise, the bar may sit at 0% + * until the first chunk completes. + */ + public function draw() { + if ($this->quiet) { + return; + } + + if ($this->finished) { + return; + } + + if (!$this->work) { + // There's no work to be done, so don't draw the bar. + return; + } + + $console = $this->getConsole(); + if ($console->isErrATTY() === false) { + return; + } + + if ($console->isLogEnabled()) { + return; + } + + // Width of the stuff other than the progress bar itself. + $chrome_width = strlen('[] 100.0% '); + + $char_width = $this->getWidth(); + if ($char_width < $chrome_width) { + return; + } + + $this->lastUpdate = microtime(true); + + if (!$this->drawn) { + $this->drawn = true; + } + + $percent = $this->done / $this->work; + + $max_width = $char_width - $chrome_width; + $bar_width = $percent * $max_width; + $bar_int = floor($bar_width); + $bar_frac = $bar_width - $bar_int; + + $frac_map = array( + '', + '-', + '~', + ); + $frac_char = $frac_map[floor($bar_frac * count($frac_map))]; + + $pattern = "[%-{$max_width}.{$max_width}s] % 5s%%"; + $out = sprintf( + $pattern, + str_repeat('=', $bar_int).$frac_char, + sprintf('%.1f', 100 * $percent)); + + $this->eraseLine(); + $console->writeErr('%s', $out); + + return $this; + } + + public function done($clean_exit = true) { + $console = $this->getConsole(); + if ($this->drawn) { + $this->eraseLine(); + if ($clean_exit) { + $console->writeErr("%s\n", pht('Done.')); + } + } + $this->finished = true; + } + + private function eraseLine() { + $string = str_repeat(' ', $this->getWidth()); + + $console = $this->getConsole(); + $console->writeErr("\r%s\r", $string); + } + + private function getWidth() { + $console = $this->getConsole(); + $width = $console->getErrCols(); + return min(nonempty($width, 78), 78); + } + + public function __destruct() { + $this->done($clean_exit = false); + } + +} diff --git a/src/console/PhutilConsoleServer.php b/src/console/PhutilConsoleServer.php new file mode 100644 --- /dev/null +++ b/src/console/PhutilConsoleServer.php @@ -0,0 +1,158 @@ +getData(); + $type = $message->getType(); + + switch ($type) { + + case PhutilConsoleMessage::TYPE_CONFIRM: + $ok = phutil_console_confirm($data['prompt'], !$data['default']); + return $this->buildMessage( + PhutilConsoleMessage::TYPE_INPUT, + $ok); + + case PhutilConsoleMessage::TYPE_PROMPT: + $response = phutil_console_prompt( + $data['prompt'], + idx($data, 'history')); + return $this->buildMessage( + PhutilConsoleMessage::TYPE_INPUT, + $response); + + case PhutilConsoleMessage::TYPE_OUT: + $this->writeText(STDOUT, $data); + return null; + + case PhutilConsoleMessage::TYPE_ERR: + $this->writeText(STDERR, $data); + return null; + + case PhutilConsoleMessage::TYPE_LOG: + if ($this->enableLog) { + $this->writeText(STDERR, $data); + } + return null; + + case PhutilConsoleMessage::TYPE_ENABLED: + switch ($data['which']) { + case PhutilConsoleMessage::TYPE_LOG: + $enabled = $this->enableLog; + break; + default: + $enabled = true; + break; + } + return $this->buildMessage( + PhutilConsoleMessage::TYPE_IS_ENABLED, + $enabled); + + case PhutilConsoleMessage::TYPE_TTY: + case PhutilConsoleMessage::TYPE_COLS: + switch ($data['which']) { + case PhutilConsoleMessage::TYPE_OUT: + $which = STDOUT; + break; + case PhutilConsoleMessage::TYPE_ERR: + $which = STDERR; + break; + } + switch ($type) { + case PhutilConsoleMessage::TYPE_TTY: + if (function_exists('posix_isatty')) { + $is_a_tty = posix_isatty($which); + } else { + $is_a_tty = null; + } + return $this->buildMessage( + PhutilConsoleMessage::TYPE_IS_TTY, + $is_a_tty); + case PhutilConsoleMessage::TYPE_COLS: + // TODO: This is an approximation which might not be perfectly + // accurate. + $width = phutil_console_get_terminal_width(); + return $this->buildMessage( + PhutilConsoleMessage::TYPE_COL_WIDTH, + $width); + } + break; + + default: + if ($this->handler) { + return call_user_func($this->handler, $message); + } else { + throw new Exception( + pht( + "Received unknown console message of type '%s'.", + $type)); + } + + } + } + + /** + * Set handler called for unknown messages. + * + * @param callable Signature: (PhutilConsoleMessage $message). + */ + public function setHandler($callback) { + $this->handler = $callback; + return $this; + } + + private function buildMessage($type, $data) { + $response = new PhutilConsoleMessage(); + $response->setType($type); + $response->setData($data); + return $response; + } + + public function addExecFutureClient(ExecFuture $future) { + $io_channel = new PhutilExecChannel($future); + $protocol_channel = new PhutilPHPObjectProtocolChannel($io_channel); + $server_channel = new PhutilConsoleServerChannel($protocol_channel); + $io_channel->setStderrHandler(array($server_channel, 'didReceiveStderr')); + return $this->addClient($server_channel); + } + + public function addClient(PhutilConsoleServerChannel $channel) { + $this->clients[] = $channel; + return $this; + } + + public function setEnableLog($enable) { + $this->enableLog = $enable; + return $this; + } + + public function run() { + while ($this->clients) { + PhutilChannel::waitForAny($this->clients); + foreach ($this->clients as $key => $client) { + if (!$client->update()) { + // If the client has exited, remove it from the list of clients. + // We still need to process any remaining buffered I/O. + unset($this->clients[$key]); + } + while ($message = $client->read()) { + $response = $this->handleMessage($message); + if ($response) { + $client->write($response); + } + } + } + } + } + + private function writeText($where, array $argv) { + $text = call_user_func_array('phutil_console_format', $argv); + fprintf($where, '%s', $text); + } + +} diff --git a/src/console/PhutilConsoleServerChannel.php b/src/console/PhutilConsoleServerChannel.php new file mode 100644 --- /dev/null +++ b/src/console/PhutilConsoleServerChannel.php @@ -0,0 +1,12 @@ +setType(PhutilConsoleMessage::TYPE_ERR) + ->setData(array('%s', $stderr)); + $this->getUnderlyingChannel()->addMessage($message); + } + +} diff --git a/src/console/PhutilConsoleStdinNotInteractiveException.php b/src/console/PhutilConsoleStdinNotInteractiveException.php new file mode 100644 --- /dev/null +++ b/src/console/PhutilConsoleStdinNotInteractiveException.php @@ -0,0 +1,18 @@ +setName('shopping_list') + * ->setLineOffset(15) + * ->editInteractively(); + * + * This will launch the user's $EDITOR to edit the specified '$document', and + * return their changes into '$result'. + * + * @task create Creating a New Editor + * @task edit Editing Interactively + * @task config Configuring Options + */ +final class PhutilInteractiveEditor extends Phobject { + + private $name = ''; + private $content = ''; + private $offset = 0; + private $preferred; + private $fallback; + + +/* -( Creating a New Editor )---------------------------------------------- */ + + + /** + * Constructs an interactive editor, using the text of a document. + * + * @param string Document text. + * @return $this + * + * @task create + */ + public function __construct($content) { + $this->setContent($content); + } + + +/* -( Editing Interactively )----------------------------------------------- */ + + + /** + * Launch an editor and edit the content. The edited content will be + * returned. + * + * @return string Edited content. + * @throws Exception The editor exited abnormally or something untoward + * occurred. + * + * @task edit + */ + public function editInteractively() { + $name = $this->getName(); + $content = $this->getContent(); + + if (phutil_is_windows()) { + $content = str_replace("\n", "\r\n", $content); + } + + $tmp = Filesystem::createTemporaryDirectory('edit.'); + $path = $tmp.DIRECTORY_SEPARATOR.$name; + + try { + Filesystem::writeFile($path, $content); + } catch (Exception $ex) { + Filesystem::remove($tmp); + throw $ex; + } + + $editor = $this->getEditor(); + $offset = $this->getLineOffset(); + + $err = $this->invokeEditor($editor, $path, $offset); + + if ($err) { + Filesystem::remove($tmp); + throw new Exception(pht('Editor exited with an error code (#%d).', $err)); + } + + try { + $result = Filesystem::readFile($path); + Filesystem::remove($tmp); + } catch (Exception $ex) { + Filesystem::remove($tmp); + throw $ex; + } + + if (phutil_is_windows()) { + $result = str_replace("\r\n", "\n", $result); + } + + $this->setContent($result); + + return $this->getContent(); + } + + private function invokeEditor($editor, $path, $offset) { + // NOTE: Popular Windows editors like Notepad++ and GitPad do not support + // line offsets, so just ignore the offset feature on Windows. We rarely + // use it anyway. + + $offset_flag = ''; + if ($offset && !phutil_is_windows()) { + $offset = (int)$offset; + if (preg_match('/^mate/', $editor)) { + $offset_flag = csprintf('-l %d', $offset); + } else { + $offset_flag = csprintf('+%d', $offset); + } + } + + $cmd = csprintf( + '%C %C %s', + $editor, + $offset_flag, + $path); + + return phutil_passthru('%C', $cmd); + } + + +/* -( Configuring Options )------------------------------------------------- */ + + + /** + * Set the line offset where the cursor should be positioned when the editor + * opens. By default, the cursor will be positioned at the start of the + * content. + * + * @param int Line number where the cursor should be positioned. + * @return $this + * + * @task config + */ + public function setLineOffset($offset) { + $this->offset = (int)$offset; + return $this; + } + + + /** + * Get the current line offset. See setLineOffset(). + * + * @return int Current line offset. + * + * @task config + */ + public function getLineOffset() { + return $this->offset; + } + + + /** + * Set the document name. Depending on the editor, this may be exposed to + * the user and can give them a sense of what they're editing. + * + * @param string Document name. + * @return $this + * + * @task config + */ + public function setName($name) { + $name = preg_replace('/[^A-Z0-9._-]+/i', '', $name); + $this->name = $name; + return $this; + } + + + /** + * Get the current document name. See @{method:setName} for details. + * + * @return string Current document name. + * + * @task config + */ + public function getName() { + if (!strlen($this->name)) { + return 'untitled'; + } + return $this->name; + } + + + /** + * Set the text content to be edited. + * + * @param string New content. + * @return $this + * + * @task config + */ + public function setContent($content) { + $this->content = $content; + return $this; + } + + + /** + * Retrieve the current content. + * + * @return string + * + * @task config + */ + public function getContent() { + return $this->content; + } + + + /** + * Set the fallback editor program to be used if the env variable $EDITOR + * is not available and there is no `editor` binary in PATH. + * + * @param string Command-line editing program (e.g. 'emacs', 'vi') + * @return $this + * + * @task config + */ + public function setFallbackEditor($editor) { + $this->fallback = $editor; + return $this; + } + + + /** + * Set the preferred editor program. If set, this will override all other + * sources of editor configuration, like $EDITOR. + * + * @param string Command-line editing program (e.g. 'emacs', 'vi') + * @return $this + * + * @task config + */ + public function setPreferredEditor($editor) { + $this->preferred = $editor; + return $this; + } + + + /** + * Get the name of the editor program to use. The value of the environmental + * variable $EDITOR will be used if available; otherwise, the `editor` binary + * if present; otherwise the best editor will be selected. + * + * @return string Command-line editing program. + * + * @task config + */ + public function getEditor() { + if ($this->preferred) { + return $this->preferred; + } + + $editor = getenv('EDITOR'); + if ($editor) { + return $editor; + } + + if ($this->fallback) { + return $this->fallback; + } + + $candidates = array('editor', 'nano', 'sensible-editor', 'vi'); + + foreach ($candidates as $cmd) { + if (Filesystem::binaryExists($cmd)) { + return $cmd; + } + } + + throw new Exception( + pht( + 'Unable to launch an interactive text editor. Set the %s '. + 'environment variable to an appropriate editor.', + 'EDITOR')); + } + +} diff --git a/src/console/__tests__/PhutilConsoleWrapTestCase.php b/src/console/__tests__/PhutilConsoleWrapTestCase.php new file mode 100644 --- /dev/null +++ b/src/console/__tests__/PhutilConsoleWrapTestCase.php @@ -0,0 +1,48 @@ +assertEqual( + Filesystem::readFile($dir.$file.'.expect'), + phutil_console_wrap(Filesystem::readFile($dir.$file)), + $file); + } + } + } + + public function testConsoleWrap() { + $this->assertEqual( + phutil_console_format( + "** %s ** abc abc abc abc abc abc abc abc abc abc ". + "abc abc abc abc abc abc abc\nabc abc abc abc abc abc abc abc abc ". + "abc abc!", + pht('ERROR')), + phutil_console_wrap( + phutil_console_format( + '** %s ** abc abc abc abc abc abc abc abc abc abc '. + 'abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc '. + 'abc abc!', + pht('ERROR'))), + pht('ANSI escape sequences should not contribute toward wrap width.')); + } + + public function testWrapIndent() { + $turtles = <<assertEqual( + $turtles, + phutil_console_wrap( + rtrim(str_repeat('turtle ', 20)), + $indent = 20)); + } + +} diff --git a/src/console/__tests__/wrap/long.txt b/src/console/__tests__/wrap/long.txt new file mode 100644 --- /dev/null +++ b/src/console/__tests__/wrap/long.txt @@ -0,0 +1 @@ +Say MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM every day. diff --git a/src/console/__tests__/wrap/long.txt.expect b/src/console/__tests__/wrap/long.txt.expect new file mode 100644 --- /dev/null +++ b/src/console/__tests__/wrap/long.txt.expect @@ -0,0 +1,3 @@ +Say +MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +every day. diff --git a/src/console/__tests__/wrap/newlines.txt b/src/console/__tests__/wrap/newlines.txt new file mode 100644 --- /dev/null +++ b/src/console/__tests__/wrap/newlines.txt @@ -0,0 +1,10 @@ +Curabitur gravida lectus odio, nec dictum sapien. +Donec condimentum purus at est aliquam lobortis. +Sed facilisis justo a purus interdum at venenatis eros laoreet. +Quisque ac odio vitae erat congue elementum. +Etiam semper venenatis massa vitae faucibus. +Praesent eget eros tortor. +Vestibulum in pharetra massa. +Integer risus justo, malesuada auctor feugiat venenatis, viverra iaculis est. +Praesent a tortor et dui tempus egestas. +Sed lacinia diam id velit tincidunt sagittis. diff --git a/src/console/__tests__/wrap/newlines.txt.expect b/src/console/__tests__/wrap/newlines.txt.expect new file mode 100644 --- /dev/null +++ b/src/console/__tests__/wrap/newlines.txt.expect @@ -0,0 +1,10 @@ +Curabitur gravida lectus odio, nec dictum sapien. +Donec condimentum purus at est aliquam lobortis. +Sed facilisis justo a purus interdum at venenatis eros laoreet. +Quisque ac odio vitae erat congue elementum. +Etiam semper venenatis massa vitae faucibus. +Praesent eget eros tortor. +Vestibulum in pharetra massa. +Integer risus justo, malesuada auctor feugiat venenatis, viverra iaculis est. +Praesent a tortor et dui tempus egestas. +Sed lacinia diam id velit tincidunt sagittis. diff --git a/src/console/__tests__/wrap/plain.txt b/src/console/__tests__/wrap/plain.txt new file mode 100644 --- /dev/null +++ b/src/console/__tests__/wrap/plain.txt @@ -0,0 +1 @@ +Morbi auctor commodo libero, vel interdum leo commodo nec. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum dictum pretium lorem ac commodo. Vivamus ullamcorper neque et velit interdum ornare. Fusce adipiscing metus non sem porttitor scelerisque. Aliquam mattis sem non tortor semper eget fermentum libero faucibus. Nam vulputate mauris at nunc bibendum mollis. Aliquam mattis rutrum turpis a fringilla. Mauris quis nulla eget nunc mollis pharetra id sit amet arcu. Nam ut urna in ligula facilisis scelerisque in nec massa. Morbi posuere, turpis in bibendum fringilla, augue felis gravida est, vitae convallis quam nunc at tellus. diff --git a/src/console/__tests__/wrap/plain.txt.expect b/src/console/__tests__/wrap/plain.txt.expect new file mode 100644 --- /dev/null +++ b/src/console/__tests__/wrap/plain.txt.expect @@ -0,0 +1,9 @@ +Morbi auctor commodo libero, vel interdum leo commodo nec. Cum sociis natoque +penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum +dictum pretium lorem ac commodo. Vivamus ullamcorper neque et velit interdum +ornare. Fusce adipiscing metus non sem porttitor scelerisque. Aliquam mattis +sem non tortor semper eget fermentum libero faucibus. Nam vulputate mauris at +nunc bibendum mollis. Aliquam mattis rutrum turpis a fringilla. Mauris quis +nulla eget nunc mollis pharetra id sit amet arcu. Nam ut urna in ligula +facilisis scelerisque in nec massa. Morbi posuere, turpis in bibendum +fringilla, augue felis gravida est, vitae convallis quam nunc at tellus. diff --git a/src/console/__tests__/wrap/trailing-space-prompt.txt b/src/console/__tests__/wrap/trailing-space-prompt.txt new file mode 100644 --- /dev/null +++ b/src/console/__tests__/wrap/trailing-space-prompt.txt @@ -0,0 +1 @@ +Do you want to do stuff? [y/N] diff --git a/src/console/__tests__/wrap/trailing-space-prompt.txt.expect b/src/console/__tests__/wrap/trailing-space-prompt.txt.expect new file mode 100644 --- /dev/null +++ b/src/console/__tests__/wrap/trailing-space-prompt.txt.expect @@ -0,0 +1 @@ +Do you want to do stuff? [y/N] diff --git a/src/console/__tests__/wrap/utf8.txt b/src/console/__tests__/wrap/utf8.txt new file mode 100644 --- /dev/null +++ b/src/console/__tests__/wrap/utf8.txt @@ -0,0 +1 @@ +☃☃☃☃☃☃ ☃☃☃☃☃☃ ☃☃☃☃☃☃ ☃☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ diff --git a/src/console/__tests__/wrap/utf8.txt.expect b/src/console/__tests__/wrap/utf8.txt.expect new file mode 100644 --- /dev/null +++ b/src/console/__tests__/wrap/utf8.txt.expect @@ -0,0 +1,2 @@ +☃☃☃☃☃☃ ☃☃☃☃☃☃ ☃☃☃☃☃☃ ☃☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ +☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ ☃☃☃☃☃ diff --git a/src/console/format.php b/src/console/format.php new file mode 100644 --- /dev/null +++ b/src/console/format.php @@ -0,0 +1,209 @@ += $min && $selection <= $max) { + return $selection; + } + } + } while (true); +} + +function phutil_console_prompt($prompt, $history = '') { + echo "\n\n"; + $prompt = phutil_console_wrap($prompt.' ', 4); + + try { + phutil_console_require_tty(); + } catch (PhutilConsoleStdinNotInteractiveException $ex) { + // Throw after echoing the prompt so the user has some idea what happened. + echo $prompt; + throw $ex; + } + + // `escapeshellarg` makes double quotes in the command below disappear on + // Windows, which breaks prompts when using history. See T6348 + $use_history = !phutil_is_windows(); + if ($history == '') { + $use_history = false; + } else { + // Test if bash is available by seeing if it can run `true`. + list($err) = exec_manual('bash -c %s', 'true'); + if ($err) { + $use_history = false; + } + } + + if (!$use_history) { + echo $prompt; + $response = fgets(STDIN); + } else { + // There's around 0% chance that readline() is available directly in PHP, + // so we're using bash/read/history instead. + $command = csprintf( + 'bash -c %s', + csprintf( + 'history -r %s 2>/dev/null; '. + 'read -e -p %s; '. + 'echo "$REPLY"; '. + 'history -s "$REPLY" 2>/dev/null; '. + 'history -w %s 2>/dev/null', + $history, + $prompt, + $history)); + + // execx() doesn't work with input, phutil_passthru() doesn't return output. + $response = shell_exec($command); + } + + return rtrim($response, "\r\n"); +} + + +/** + * Soft wrap text for display on a console, respecting UTF8 character boundaries + * and ANSI color escape sequences. + * + * @param string Text to wrap. + * @param int Optional indent level. + * @param bool True to also indent the first line. + * @return string Wrapped text. + */ +function phutil_console_wrap($text, $indent = 0, $with_prefix = true) { + $lines = array(); + + $width = (78 - $indent); + $esc = chr(27); + + $break_pos = null; + $len_after_break = 0; + $line_len = 0; + + $line = array(); + $lines = array(); + + $vector = phutil_utf8v($text); + $vector_len = count($vector); + for ($ii = 0; $ii < $vector_len; $ii++) { + $chr = $vector[$ii]; + + // If this is an ANSI escape sequence for a color code, just consume it + // without counting it toward the character limit. This prevents lines + // with bold/color on them from wrapping too early. + if ($chr == $esc) { + for ($ii; $ii < $vector_len; $ii++) { + $line[] = $vector[$ii]; + if ($vector[$ii] == 'm') { + break; + } + } + continue; + } + + $line[] = $chr; + + ++$line_len; + ++$len_after_break; + + if ($line_len > $width) { + if ($break_pos !== null) { + $slice = array_slice($line, 0, $break_pos); + while (count($slice) && end($slice) == ' ') { + array_pop($slice); + } + $slice[] = "\n"; + $lines[] = $slice; + $line = array_slice($line, $break_pos); + + $line_len = $len_after_break; + $len_after_break = 0; + $break_pos = null; + } + } + + if ($chr == ' ') { + $break_pos = count($line); + $len_after_break = 0; + } + + if ($chr == "\n") { + $lines[] = $line; + $line = array(); + + $len_after_break = 0; + $line_len = 0; + $break_pos = null; + } + } + + if ($line) { + if ($line) { + $lines[] = $line; + } + } + + $pre = null; + if ($indent) { + $pre = str_repeat(' ', $indent); + } + + foreach ($lines as $idx => $line) { + if ($idx == 0 && !$with_prefix) { + $prefix = null; + } else { + $prefix = $pre; + } + + $lines[$idx] = $prefix.implode('', $line); + } + + return implode('', $lines); +} + + +function phutil_console_require_tty() { + if (function_exists('posix_isatty') && !posix_isatty(STDIN)) { + throw new PhutilConsoleStdinNotInteractiveException(); + } +} + + +/** + * Determine the width of the terminal, if possible. Returns `null` on failure. + * + * @return int|null Terminal width in characters, or null on failure. + */ +function phutil_console_get_terminal_width() { + return PhutilConsoleMetrics::getDefaultConsole() + ->getTerminalWidth(); +} diff --git a/src/console/view/PhutilConsoleBlock.php b/src/console/view/PhutilConsoleBlock.php new file mode 100644 --- /dev/null +++ b/src/console/view/PhutilConsoleBlock.php @@ -0,0 +1,48 @@ +items[] = array( + 'type' => 'paragraph', + 'item' => $item, + ); + return $this; + } + + public function addList(PhutilConsoleList $list) { + $this->items[] = array( + 'type' => 'list', + 'item' => $list, + ); + return $this; + } + + protected function drawView() { + $output = array(); + + foreach ($this->items as $spec) { + $type = $spec['type']; + $item = $spec['item']; + + switch ($type) { + case 'paragraph': + $item = array( + tsprintf('%s', $item)->applyWrap(), + "\n", + ); + break; + case 'list': + $item = $item; + break; + } + + $output[] = $item; + } + + return $this->drawLines($output); + } + +} diff --git a/src/console/view/PhutilConsoleError.php b/src/console/view/PhutilConsoleError.php new file mode 100644 --- /dev/null +++ b/src/console/view/PhutilConsoleError.php @@ -0,0 +1,10 @@ +items[] = $item; + return $this; + } + + public function addItems(array $items) { + foreach ($items as $item) { + $this->addItem($item); + } + return $this; + } + + public function getItems() { + return $this->items; + } + + public function setBullet($bullet) { + $this->bullet = $bullet; + return $this; + } + + public function getBullet() { + return $this->bullet; + } + + public function setWrap($wrap) { + $this->wrap = $wrap; + return $this; + } + + protected function drawView() { + $indent_depth = 6; + $indent_string = str_repeat(' ', $indent_depth); + + if ($this->bullet !== null) { + $bullet = $this->bullet.' '; + $indent_depth = $indent_depth + phutil_utf8_console_strlen($bullet); + } else { + $bullet = ''; + } + + $output = array(); + foreach ($this->getItems() as $item) { + if ($this->wrap) { + $item = tsprintf('%s', $item) + ->applyIndent($indent_depth, false); + } + + $output[] = $indent_string.$bullet.$item; + } + + return $this->drawLines($output); + } + +} diff --git a/src/console/view/PhutilConsoleLogLine.php b/src/console/view/PhutilConsoleLogLine.php new file mode 100644 --- /dev/null +++ b/src/console/view/PhutilConsoleLogLine.php @@ -0,0 +1,24 @@ +kind = $kind; + $this->message = $message; + } + + protected function drawView() { + $color = $this->getLogLineColor(); + + return tsprintf( + "** %s ** %s\n", + $this->kind, + $this->message); + } + +} diff --git a/src/console/view/PhutilConsoleSkip.php b/src/console/view/PhutilConsoleSkip.php new file mode 100644 --- /dev/null +++ b/src/console/view/PhutilConsoleSkip.php @@ -0,0 +1,10 @@ +addColumn('id', array('title' => 'ID', 'align' => 'right')) + * ->addColumn('name', array('title' => 'Username', 'align' => 'center')) + * ->addColumn('email', array('title' => 'Email Address')) + * + * ->addRow(array( + * 'id' => 12345, + * 'name' => 'alicoln', + * 'email' => 'abraham@lincoln.com', + * )) + * ->addRow(array( + * 'id' => 99999999, + * 'name' => 'jbloggs', + * 'email' => 'joe@bloggs.com', + * )) + * + * ->setBorders(true) + * ->draw(); + */ +final class PhutilConsoleTable extends PhutilConsoleView { + + private $columns = array(); + private $data = array(); + private $widths = array(); + private $borders = false; + private $padding = 1; + private $showHeader = true; + + const ALIGN_LEFT = 'left'; + const ALIGN_CENTER = 'center'; + const ALIGN_RIGHT = 'right'; + + +/* -( Configuration )------------------------------------------------------ */ + + + public function setBorders($borders) { + $this->borders = $borders; + return $this; + } + + public function setPadding($padding) { + $this->padding = $padding; + return $this; + } + + public function setShowHeader($show_header) { + $this->showHeader = $show_header; + return $this; + } + + +/* -( Data )--------------------------------------------------------------- */ + + public function addColumn($key, array $column) { + PhutilTypeSpec::checkMap($column, array( + 'title' => 'string', + 'align' => 'optional string', + )); + $this->columns[$key] = $column; + return $this; + } + + public function addColumns(array $columns) { + foreach ($columns as $key => $column) { + $this->addColumn($key, $column); + } + return $this; + } + + public function addRow(array $data) { + $this->data[] = $data; + + foreach ($data as $key => $value) { + $this->widths[$key] = max( + idx($this->widths, $key, 0), + phutil_utf8_console_strlen($value)); + } + + return $this; + } + + +/* -( Drawing )------------------------------------------------------------ */ + + protected function drawView() { + return $this->drawLines( + array_merge( + $this->getHeader(), + $this->getBody(), + $this->getFooter())); + } + + private function getHeader() { + $output = array(); + + if ($this->borders) { + $output[] = $this->formatSeparator('='); + } + + if (!$this->showHeader) { + return $output; + } + + $columns = array(); + foreach ($this->columns as $key => $column) { + $title = tsprintf('**%s**', $column['title']); + + if ($this->shouldAddSpacing($key, $column)) { + $title = $this->alignString( + $title, + $this->getWidth($key), + idx($column, 'align', self::ALIGN_LEFT)); + } + + $columns[] = $title; + } + + $output[] = $this->formatRow($columns); + + if ($this->borders) { + $output[] = $this->formatSeparator('='); + } + + return $output; + } + + private function getBody() { + $output = array(); + + foreach ($this->data as $data) { + $columns = array(); + + foreach ($this->columns as $key => $column) { + if (!$this->shouldAddSpacing($key, $column)) { + $columns[] = idx($data, $key, ''); + } else { + $columns[] = $this->alignString( + idx($data, $key, ''), + $this->getWidth($key), + idx($column, 'align', self::ALIGN_LEFT)); + } + } + + $output[] = $this->formatRow($columns); + } + + return $output; + } + + private function getFooter() { + $output = array(); + + if ($this->borders) { + $columns = array(); + + foreach ($this->getColumns() as $column) { + $columns[] = str_repeat('=', $this->getWidth($column)); + } + + $output[] = array( + '+', + $this->implode('+', $columns), + '+', + ); + } + + return $output; + } + + +/* -( Internals )---------------------------------------------------------- */ + + /** + * Returns if the specified column should have spacing added. + * + * @return bool + */ + private function shouldAddSpacing($key, $column) { + if (!$this->borders) { + if (last_key($this->columns) === $key) { + if (idx($column, 'align', self::ALIGN_LEFT) === self::ALIGN_LEFT) { + // Don't add extra spaces to this column since it's the last column, + // left aligned, and we're not showing borders. This prevents + // unnecessary empty lines from appearing when the extra spaces + // wrap around the terminal. + return false; + } + } + } + + return true; + } + + /** + * Returns the column IDs. + * + * @return list + */ + protected function getColumns() { + return array_keys($this->columns); + } + + /** + * Get the width of a specific column, including padding. + * + * @param string + * @return int + */ + protected function getWidth($key) { + $width = max( + idx($this->widths, $key), + phutil_utf8_console_strlen( + idx(idx($this->columns, $key, array()), 'title', ''))); + + return $width + 2 * $this->padding; + } + + protected function alignString($string, $width, $align) { + $num_padding = $width - + (2 * $this->padding) - phutil_utf8_console_strlen($string); + + switch ($align) { + case self::ALIGN_LEFT: + $num_left_padding = 0; + $num_right_padding = $num_padding; + break; + + case self::ALIGN_CENTER: + $num_left_padding = (int)($num_padding / 2); + $num_right_padding = $num_padding - $num_left_padding; + break; + + case self::ALIGN_RIGHT: + $num_left_padding = $num_padding; + $num_right_padding = 0; + break; + } + + $left_padding = str_repeat(' ', $num_left_padding); + $right_padding = str_repeat(' ', $num_right_padding); + + return array( + $left_padding, + $string, + $right_padding, + ); + } + + /** + * Format cells into an entire row. + * + * @param list + * @return string + */ + protected function formatRow(array $columns) { + $padding = str_repeat(' ', $this->padding); + + if ($this->borders) { + $separator = $padding.'|'.$padding; + return array( + '|'.$padding, + $this->implode($separator, $columns), + $padding.'|', + ); + } else { + return $this->implode($padding, $columns); + } + } + + protected function formatSeparator($string) { + $columns = array(); + + if ($this->borders) { + $separator = '+'; + } else { + $separator = ''; + } + + foreach ($this->getColumns() as $column) { + $columns[] = str_repeat($string, $this->getWidth($column)); + } + + return array( + $separator, + $this->implode($separator, $columns), + $separator, + ); + } + +} diff --git a/src/console/view/PhutilConsoleView.php b/src/console/view/PhutilConsoleView.php new file mode 100644 --- /dev/null +++ b/src/console/view/PhutilConsoleView.php @@ -0,0 +1,112 @@ +console = $console; + return $this; + } + + final public function getConsole() { + if ($this->console) { + return $this->console; + } + return PhutilConsole::getConsole(); + } + + + /** + * Draw a view to the console. + * + * @return this + * @task draw + */ + final public function draw() { + $string = $this->drawConsoleString(); + + $console = $this->getConsole(); + $console->writeOut('%s', $string); + + return $this; + } + + + /** + * Draw a view to a string and return it. + * + * @return string Console-printable string. + * @task draw + */ + final public function drawConsoleString() { + $view = $this->drawView(); + $parts = $this->reduceView($view); + + $out = array(); + foreach ($parts as $part) { + $out[] = PhutilTerminalString::escapeStringValue($part, true); + } + + return implode('', $out); + } + + + /** + * Reduce a view to a list of simple, unnested parts. + * + * @param wild Any drawable view. + * @return list List of unnested drawables. + * @task draw + */ + private function reduceView($view) { + if ($view instanceof PhutilConsoleView) { + $view = $view->drawView(); + return $this->reduceView($view); + } + + if (is_array($view)) { + $parts = array(); + foreach ($view as $item) { + foreach ($this->reduceView($item) as $part) { + $parts[] = $part; + } + } + return $parts; + } + + return array($view); + } + +/* -( Drawing Utilities )-------------------------------------------------- */ + + + /** + * @param list List of views, one per line. + * @return wild Each view rendered on a separate line. + */ + final protected function drawLines(array $parts) { + $result = array(); + foreach ($parts as $part) { + if ($part !== null) { + $result[] = $part; + $result[] = "\n"; + } + } + + return $result; + } + + final protected function implode($separator, array $items) { + $result = array(); + foreach ($items as $item) { + $result[] = $item; + $result[] = $separator; + } + array_pop($result); + return $result; + } + +} diff --git a/src/console/view/PhutilConsoleWarning.php b/src/console/view/PhutilConsoleWarning.php new file mode 100644 --- /dev/null +++ b/src/console/view/PhutilConsoleWarning.php @@ -0,0 +1,10 @@ +shouldExit()) { + * if (work_available()) { + * $this->willBeginWork(); + * do_work(); + * $this->sleep(0); + * } else { + * $this->willBeginIdle(); + * $this->sleep(1); + * } + * } + * + * In particular, call @{method:willBeginWork} before becoming busy, and + * @{method:willBeginIdle} when no work is available. If the daemon is launched + * into an autoscale pool, this will cause the pool to automatically scale up + * when busy and down when idle. + * + * See @{class:PhutilHighIntensityIntervalDaemon} for an example of a simple + * autoscaling daemon. + * + * Launching a daemon which does not make these callbacks into an autoscale + * pool will have no effect. + * + * @task overseer Communicating With the Overseer + * @task autoscale Autoscaling Daemon Pools + */ +abstract class PhutilDaemon extends Phobject { + + const MESSAGETYPE_STDOUT = 'stdout'; + const MESSAGETYPE_HEARTBEAT = 'heartbeat'; + const MESSAGETYPE_BUSY = 'busy'; + const MESSAGETYPE_IDLE = 'idle'; + const MESSAGETYPE_DOWN = 'down'; + const MESSAGETYPE_HIBERNATE = 'hibernate'; + + const WORKSTATE_BUSY = 'busy'; + const WORKSTATE_IDLE = 'idle'; + + private $argv; + private $traceMode; + private $traceMemory; + private $verbose; + private $notifyReceived; + private $inGracefulShutdown; + private $workState = null; + private $idleSince = null; + private $scaledownDuration; + + final public function setVerbose($verbose) { + $this->verbose = $verbose; + return $this; + } + + final public function getVerbose() { + return $this->verbose; + } + + final public function setScaledownDuration($scaledown_duration) { + $this->scaledownDuration = $scaledown_duration; + return $this; + } + + final public function getScaledownDuration() { + return $this->scaledownDuration; + } + + final public function __construct(array $argv) { + $this->argv = $argv; + + $router = PhutilSignalRouter::getRouter(); + $handler_key = 'daemon.term'; + if (!$router->getHandler($handler_key)) { + $handler = new PhutilCallbackSignalHandler( + SIGTERM, + __CLASS__.'::onTermSignal'); + $router->installHandler($handler_key, $handler); + } + + pcntl_signal(SIGINT, array($this, 'onGracefulSignal')); + pcntl_signal(SIGUSR2, array($this, 'onNotifySignal')); + + // Without discard mode, this consumes unbounded amounts of memory. Keep + // memory bounded. + PhutilServiceProfiler::getInstance()->enableDiscardMode(); + + $this->beginStdoutCapture(); + } + + final public function __destruct() { + $this->endStdoutCapture(); + } + + final public function stillWorking() { + $this->emitOverseerMessage(self::MESSAGETYPE_HEARTBEAT, null); + + if ($this->traceMemory) { + $daemon = get_class($this); + fprintf( + STDERR, + "%s %s %s\n", + '', + $daemon, + pht( + 'Memory Usage: %s KB', + new PhutilNumber(memory_get_usage() / 1024, 1))); + } + } + + final public function shouldExit() { + return $this->inGracefulShutdown; + } + + final protected function shouldHibernate($duration) { + // Don't hibernate if we don't have very long to sleep. + if ($duration < 30) { + return false; + } + + // Never hibernate if we're part of a pool and could scale down instead. + // We only hibernate the last process to drop the pool size to zero. + if ($this->getScaledownDuration()) { + return false; + } + + // Don't hibernate for too long. + $duration = min($duration, phutil_units('3 minutes in seconds')); + + $this->emitOverseerMessage( + self::MESSAGETYPE_HIBERNATE, + array( + 'duration' => $duration, + )); + + $this->log( + pht( + 'Preparing to hibernate for %s second(s).', + new PhutilNumber($duration))); + + return true; + } + + final protected function sleep($duration) { + $this->notifyReceived = false; + $this->willSleep($duration); + $this->stillWorking(); + + $scale_down = $this->getScaledownDuration(); + + $max_sleep = 60; + if ($scale_down) { + $max_sleep = min($max_sleep, $scale_down); + } + + if ($scale_down) { + if ($this->workState == self::WORKSTATE_IDLE) { + $dur = $this->getIdleDuration(); + $this->log(pht('Idle for %s seconds.', $dur)); + } + } + + while ($duration > 0 && + !$this->notifyReceived && + !$this->shouldExit()) { + + // If this is an autoscaling clone and we've been idle for too long, + // we're going to scale the pool down by exiting and not restarting. The + // DOWN message tells the overseer that we don't want to be restarted. + if ($scale_down) { + if ($this->workState == self::WORKSTATE_IDLE) { + if ($this->idleSince && ($this->idleSince + $scale_down < time())) { + $this->inGracefulShutdown = true; + $this->emitOverseerMessage(self::MESSAGETYPE_DOWN, null); + $this->log( + pht( + 'Daemon was idle for more than %s second(s), '. + 'scaling pool down.', + new PhutilNumber($scale_down))); + break; + } + } + } + + sleep(min($duration, $max_sleep)); + $duration -= $max_sleep; + $this->stillWorking(); + } + } + + protected function willSleep($duration) { + return; + } + + public static function onTermSignal($signo) { + self::didCatchSignal($signo); + } + + final protected function getArgv() { + return $this->argv; + } + + final public function execute() { + $this->willRun(); + $this->run(); + } + + abstract protected function run(); + + final public function setTraceMemory() { + $this->traceMemory = true; + return $this; + } + + final public function getTraceMemory() { + return $this->traceMemory; + } + + final public function setTraceMode() { + $this->traceMode = true; + PhutilServiceProfiler::installEchoListener(); + PhutilConsole::getConsole()->getServer()->setEnableLog(true); + $this->didSetTraceMode(); + return $this; + } + + final public function getTraceMode() { + return $this->traceMode; + } + + final public function onGracefulSignal($signo) { + self::didCatchSignal($signo); + $this->inGracefulShutdown = true; + } + + final public function onNotifySignal($signo) { + self::didCatchSignal($signo); + $this->notifyReceived = true; + $this->onNotify($signo); + } + + protected function onNotify($signo) { + // This is a hook for subclasses. + } + + protected function willRun() { + // This is a hook for subclasses. + } + + protected function didSetTraceMode() { + // This is a hook for subclasses. + } + + final protected function log($message) { + if ($this->verbose) { + $daemon = get_class($this); + fprintf(STDERR, "%s %s %s\n", '', $daemon, $message); + } + } + + private static function didCatchSignal($signo) { + $signame = phutil_get_signal_name($signo); + fprintf( + STDERR, + "%s Caught signal %s (%s).\n", + '', + $signo, + $signame); + } + + +/* -( Communicating With the Overseer )------------------------------------ */ + + + private function beginStdoutCapture() { + ob_start(array($this, 'didReceiveStdout'), 2); + } + + private function endStdoutCapture() { + ob_end_flush(); + } + + public function didReceiveStdout($data) { + if (!strlen($data)) { + return ''; + } + + return $this->encodeOverseerMessage(self::MESSAGETYPE_STDOUT, $data); + } + + private function encodeOverseerMessage($type, $data) { + $structure = array($type); + + if ($data !== null) { + $structure[] = $data; + } + + return json_encode($structure)."\n"; + } + + private function emitOverseerMessage($type, $data) { + $this->endStdoutCapture(); + echo $this->encodeOverseerMessage($type, $data); + $this->beginStdoutCapture(); + } + + public static function errorListener($event, $value, array $metadata) { + // If the caller has redirected the error log to a file, PHP won't output + // messages to stderr, so the overseer can't capture them. Install a + // listener which just echoes errors to stderr, so the overseer is always + // aware of errors. + + $console = PhutilConsole::getConsole(); + $message = idx($metadata, 'default_message'); + + if ($message) { + $console->writeErr("%s\n", $message); + } + if (idx($metadata, 'trace')) { + $trace = PhutilErrorHandler::formatStacktrace($metadata['trace']); + $console->writeErr("%s\n", $trace); + } + } + + +/* -( Autoscaling )-------------------------------------------------------- */ + + + /** + * Prepare to become busy. This may autoscale the pool up. + * + * This notifies the overseer that the daemon has become busy. If daemons + * that are part of an autoscale pool are continuously busy for a prolonged + * period of time, the overseer may scale up the pool. + * + * @return this + * @task autoscale + */ + protected function willBeginWork() { + if ($this->workState != self::WORKSTATE_BUSY) { + $this->workState = self::WORKSTATE_BUSY; + $this->idleSince = null; + $this->emitOverseerMessage(self::MESSAGETYPE_BUSY, null); + } + + return $this; + } + + + /** + * Prepare to idle. This may autoscale the pool down. + * + * This notifies the overseer that the daemon is no longer busy. If daemons + * that are part of an autoscale pool are idle for a prolonged period of + * time, they may exit to scale the pool down. + * + * @return this + * @task autoscale + */ + protected function willBeginIdle() { + if ($this->workState != self::WORKSTATE_IDLE) { + $this->workState = self::WORKSTATE_IDLE; + $this->idleSince = time(); + $this->emitOverseerMessage(self::MESSAGETYPE_IDLE, null); + } + + return $this; + } + + protected function getIdleDuration() { + if (!$this->idleSince) { + return null; + } + + $now = time(); + return ($now - $this->idleSince); + } + +} diff --git a/src/daemon/PhutilDaemonHandle.php b/src/daemon/PhutilDaemonHandle.php new file mode 100644 --- /dev/null +++ b/src/daemon/PhutilDaemonHandle.php @@ -0,0 +1,514 @@ + + } + + public static function newFromConfig(array $config) { + PhutilTypeSpec::checkMap( + $config, + array( + 'class' => 'string', + 'argv' => 'optional list', + 'load' => 'optional list', + 'log' => 'optional string|null', + 'down' => 'optional int', + )); + + $config = $config + array( + 'argv' => array(), + 'load' => array(), + 'log' => null, + 'down' => 15, + ); + + $daemon = new self(); + $daemon->properties = $config; + $daemon->daemonID = $daemon->generateDaemonID(); + + return $daemon; + } + + public function setDaemonPool(PhutilDaemonPool $daemon_pool) { + $this->pool = $daemon_pool; + return $this; + } + + public function getDaemonPool() { + return $this->pool; + } + + public function getBusyEpoch() { + return $this->busyEpoch; + } + + public function getDaemonClass() { + return $this->getProperty('class'); + } + + private function getProperty($key) { + return idx($this->properties, $key); + } + + public function setCommandLineArguments(array $arguments) { + $this->argv = $arguments; + return $this; + } + + public function getCommandLineArguments() { + return $this->argv; + } + + public function getDaemonArguments() { + return $this->getProperty('argv'); + } + + public function didLaunch() { + $this->restartAt = time(); + $this->shouldSendExitEvent = true; + + $this->dispatchEvent( + self::EVENT_DID_LAUNCH, + array( + 'argv' => $this->getCommandLineArguments(), + 'explicitArgv' => $this->getDaemonArguments(), + )); + + return $this; + } + + public function isRunning() { + return (bool)$this->future; + } + + public function isHibernating() { + return + !$this->isRunning() && + !$this->isDone() && + $this->hibernating; + } + + public function wakeFromHibernation() { + if (!$this->isHibernating()) { + return $this; + } + + $this->logMessage( + 'WAKE', + pht( + 'Process is being awakened from hibernation.')); + + $this->restartAt = time(); + $this->update(); + + return $this; + } + + public function isDone() { + return (!$this->shouldRestart && !$this->isRunning()); + } + + public function getFuture() { + return $this->future; + } + + public function update() { + if (!$this->isRunning()) { + if (!$this->shouldRestart) { + return; + } + if (!$this->restartAt || (time() < $this->restartAt)) { + return; + } + if ($this->shouldShutdown) { + return; + } + $this->startDaemonProcess(); + } + + $future = $this->future; + + $result = null; + if ($future->isReady()) { + $result = $future->resolve(); + } + + list($stdout, $stderr) = $future->read(); + $future->discardBuffers(); + + if (strlen($stdout)) { + $this->didReadStdout($stdout); + } + + $stderr = trim($stderr); + if (strlen($stderr)) { + foreach (phutil_split_lines($stderr, false) as $line) { + $this->logMessage('STDE', $line); + } + } + + if ($result !== null) { + list($err) = $result; + + if ($err) { + $this->logMessage('FAIL', pht('Process exited with error %s.', $err)); + } else { + $this->logMessage('DONE', pht('Process exited normally.')); + } + + $this->future = null; + + if ($this->shouldShutdown) { + $this->restartAt = null; + } else { + $this->scheduleRestart(); + } + } + + $this->updateHeartbeatEvent(); + $this->updateHangDetection(); + } + + private function updateHeartbeatEvent() { + if ($this->heartbeat > time()) { + return; + } + + $this->heartbeat = time() + $this->getHeartbeatEventFrequency(); + $this->dispatchEvent(self::EVENT_DID_HEARTBEAT); + } + + private function updateHangDetection() { + if (!$this->isRunning()) { + return; + } + + if (time() > $this->deadline) { + $this->logMessage('HANG', pht('Hang detected. Restarting process.')); + $this->annihilateProcessGroup(); + $this->scheduleRestart(); + } + } + + private function scheduleRestart() { + // Wait a minimum of a few sceconds before restarting, but we may wait + // longer if the daemon has initiated hibernation. + $default_restart = time() + self::getWaitBeforeRestart(); + if ($default_restart >= $this->restartAt) { + $this->restartAt = $default_restart; + } + + $this->logMessage( + 'WAIT', + pht( + 'Waiting %s second(s) to restart process.', + new PhutilNumber($this->restartAt - time()))); + } + + /** + * Generate a unique ID for this daemon. + * + * @return string A unique daemon ID. + */ + private function generateDaemonID() { + return substr(getmypid().':'.Filesystem::readRandomCharacters(12), 0, 12); + } + + public function getDaemonID() { + return $this->daemonID; + } + + public function getPID() { + return $this->pid; + } + + private function getCaptureBufferSize() { + return 65535; + } + + private function getRequiredHeartbeatFrequency() { + return 86400; + } + + public static function getWaitBeforeRestart() { + return 5; + } + + public static function getHeartbeatEventFrequency() { + return 120; + } + + private function getKillDelay() { + return 3; + } + + private function getDaemonCWD() { + $root = dirname(phutil_get_library_root('phutil')); + return $root.'/scripts/daemon/exec/'; + } + + private function newExecFuture() { + $class = $this->getDaemonClass(); + $argv = $this->getCommandLineArguments(); + $buffer_size = $this->getCaptureBufferSize(); + + // NOTE: PHP implements proc_open() by running 'sh -c'. On most systems this + // is bash, but on Ubuntu it's dash. When you proc_open() using bash, you + // get one new process (the command you ran). When you proc_open() using + // dash, you get two new processes: the command you ran and a parent + // "dash -c" (or "sh -c") process. This means that the child process's PID + // is actually the 'dash' PID, not the command's PID. To avoid this, use + // 'exec' to replace the shell process with the real process; without this, + // the child will call posix_getppid(), be given the pid of the 'sh -c' + // process, and send it SIGUSR1 to keepalive which will terminate it + // immediately. We also won't be able to do process group management because + // the shell process won't properly posix_setsid() so the pgid of the child + // won't be meaningful. + + $config = $this->properties; + unset($config['class']); + $config = phutil_json_encode($config); + + return id(new ExecFuture('exec ./exec_daemon.php %s %Ls', $class, $argv)) + ->setCWD($this->getDaemonCWD()) + ->setStdoutSizeLimit($buffer_size) + ->setStderrSizeLimit($buffer_size) + ->write($config); + } + + /** + * Dispatch an event to event listeners. + * + * @param string Event type. + * @param dict Event parameters. + * @return void + */ + private function dispatchEvent($type, array $params = array()) { + $data = array( + 'id' => $this->getDaemonID(), + 'daemonClass' => $this->getDaemonClass(), + 'childPID' => $this->getPID(), + ) + $params; + + $event = new PhutilEvent($type, $data); + + try { + PhutilEventEngine::dispatchEvent($event); + } catch (Exception $ex) { + phlog($ex); + } + } + + private function annihilateProcessGroup() { + $pid = $this->getPID(); + + $pgid = posix_getpgid($pid); + if ($pid && $pgid) { + posix_kill(-$pgid, SIGTERM); + sleep($this->getKillDelay()); + posix_kill(-$pgid, SIGKILL); + $this->pid = null; + } + } + + private function startDaemonProcess() { + $this->logMessage('INIT', pht('Starting process.')); + + $this->deadline = time() + $this->getRequiredHeartbeatFrequency(); + $this->heartbeat = time() + self::getHeartbeatEventFrequency(); + $this->stdoutBuffer = ''; + $this->hibernating = false; + + $this->future = $this->newExecFuture(); + $this->future->start(); + + $this->pid = $this->future->getPID(); + } + + private function didReadStdout($data) { + $this->stdoutBuffer .= $data; + while (true) { + $pos = strpos($this->stdoutBuffer, "\n"); + if ($pos === false) { + break; + } + $message = substr($this->stdoutBuffer, 0, $pos); + $this->stdoutBuffer = substr($this->stdoutBuffer, $pos + 1); + + try { + $structure = phutil_json_decode($message); + } catch (PhutilJSONParserException $ex) { + $structure = array(); + } + + switch (idx($structure, 0)) { + case PhutilDaemon::MESSAGETYPE_STDOUT: + $this->logMessage('STDO', idx($structure, 1)); + break; + case PhutilDaemon::MESSAGETYPE_HEARTBEAT: + $this->deadline = time() + $this->getRequiredHeartbeatFrequency(); + break; + case PhutilDaemon::MESSAGETYPE_BUSY: + if (!$this->busyEpoch) { + $this->busyEpoch = time(); + } + break; + case PhutilDaemon::MESSAGETYPE_IDLE: + $this->busyEpoch = null; + break; + case PhutilDaemon::MESSAGETYPE_DOWN: + // The daemon is exiting because it doesn't have enough work and it + // is trying to scale the pool down. We should not restart it. + $this->shouldRestart = false; + $this->shouldShutdown = true; + break; + case PhutilDaemon::MESSAGETYPE_HIBERNATE: + $config = idx($structure, 1); + $duration = (int)idx($config, 'duration', 0); + $this->restartAt = time() + $duration; + $this->hibernating = true; + $this->busyEpoch = null; + $this->logMessage( + 'ZZZZ', + pht( + 'Process is preparing to hibernate for %s second(s).', + new PhutilNumber($duration))); + break; + default: + // If we can't parse this or it isn't a message we understand, just + // emit the raw message. + $this->logMessage('STDO', pht(' %s', $message)); + break; + } + } + } + + public function didReceiveNotifySignal($signo) { + $pid = $this->getPID(); + if ($pid) { + posix_kill($pid, $signo); + } + } + + public function didReceiveReloadSignal($signo) { + $signame = phutil_get_signal_name($signo); + if ($signame) { + $sigmsg = pht( + 'Reloading in response to signal %d (%s).', + $signo, + $signame); + } else { + $sigmsg = pht( + 'Reloading in response to signal %d.', + $signo); + } + + $this->logMessage('RELO', $sigmsg, $signo); + + // This signal means "stop the current process gracefully, then launch + // a new identical process once it exits". This can be used to update + // daemons after code changes (the new processes will run the new code) + // without aborting any running tasks. + + // We SIGINT the daemon but don't set the shutdown flag, so it will + // naturally be restarted after it exits, as though it had exited after an + // unhandled exception. + + posix_kill($this->getPID(), SIGINT); + } + + public function didReceiveGracefulSignal($signo) { + $this->shouldShutdown = true; + $this->shouldRestart = false; + + $signame = phutil_get_signal_name($signo); + if ($signame) { + $sigmsg = pht( + 'Graceful shutdown in response to signal %d (%s).', + $signo, + $signame); + } else { + $sigmsg = pht( + 'Graceful shutdown in response to signal %d.', + $signo); + } + + $this->logMessage('DONE', $sigmsg, $signo); + + posix_kill($this->getPID(), SIGINT); + } + + public function didReceiveTerminateSignal($signo) { + $this->shouldShutdown = true; + $this->shouldRestart = false; + + $signame = phutil_get_signal_name($signo); + if ($signame) { + $sigmsg = pht( + 'Shutting down in response to signal %s (%s).', + $signo, + $signame); + } else { + $sigmsg = pht('Shutting down in response to signal %s.', $signo); + } + + $this->logMessage('EXIT', $sigmsg, $signo); + $this->annihilateProcessGroup(); + } + + private function logMessage($type, $message, $context = null) { + $this->getDaemonPool()->logMessage($type, $message, $context); + + $this->dispatchEvent( + self::EVENT_DID_LOG, + array( + 'type' => $type, + 'message' => $message, + 'context' => $context, + )); + } + + public function toDictionary() { + return array( + 'pid' => $this->getPID(), + 'id' => $this->getDaemonID(), + 'config' => $this->properties, + ); + } + + public function didExit() { + if ($this->shouldSendExitEvent) { + $this->dispatchEvent(self::EVENT_WILL_EXIT); + $this->shouldSendExitEvent = false; + } + + return $this; + } + +} diff --git a/src/daemon/PhutilDaemonOverseer.php b/src/daemon/PhutilDaemonOverseer.php new file mode 100644 --- /dev/null +++ b/src/daemon/PhutilDaemonOverseer.php @@ -0,0 +1,535 @@ +enableDiscardMode(); + + $args = new PhutilArgumentParser($argv); + $args->setTagline(pht('daemon overseer')); + $args->setSynopsis(<<parseStandardArguments(); + $args->parse( + array( + array( + 'name' => 'trace-memory', + 'help' => pht('Enable debug memory tracing.'), + ), + array( + 'name' => 'verbose', + 'help' => pht('Enable verbose activity logging.'), + ), + array( + 'name' => 'label', + 'short' => 'l', + 'param' => 'label', + 'help' => pht( + 'Optional process label. Makes "%s" nicer, no behavioral effects.', + 'ps'), + ), + )); + $argv = array(); + + if ($args->getArg('trace')) { + $this->traceMode = true; + $argv[] = '--trace'; + } + + if ($args->getArg('trace-memory')) { + $this->traceMode = true; + $this->traceMemory = true; + $argv[] = '--trace-memory'; + } + $verbose = $args->getArg('verbose'); + if ($verbose) { + $this->verbose = true; + $argv[] = '--verbose'; + } + + $label = $args->getArg('label'); + if ($label) { + $argv[] = '-l'; + $argv[] = $label; + } + + $this->argv = $argv; + + if (function_exists('posix_isatty') && posix_isatty(STDIN)) { + fprintf(STDERR, pht('Reading daemon configuration from stdin...')."\n"); + } + $config = @file_get_contents('php://stdin'); + $config = id(new PhutilJSONParser())->parse($config); + + $this->libraries = idx($config, 'load'); + $this->log = idx($config, 'log'); + $this->daemonize = idx($config, 'daemonize'); + $this->piddir = idx($config, 'piddir'); + + $this->config = $config; + + if (self::$instance) { + throw new Exception( + pht('You may not instantiate more than one Overseer per process.')); + } + + self::$instance = $this; + + $this->startEpoch = time(); + + // Check this before we daemonize, since if it's an issue the child will + // exit immediately. + if ($this->piddir) { + $dir = $this->piddir; + try { + Filesystem::assertWritable($dir); + } catch (Exception $ex) { + throw new Exception( + pht( + "Specified daemon PID directory ('%s') does not exist or is ". + "not writable by the daemon user!", + $dir)); + } + } + + if (!idx($config, 'daemons')) { + throw new PhutilArgumentUsageException( + pht('You must specify at least one daemon to start!')); + } + + if ($this->log) { + // NOTE: Now that we're committed to daemonizing, redirect the error + // log if we have a `--log` parameter. Do this at the last moment + // so as many setup issues as possible are surfaced. + ini_set('error_log', $this->log); + } + + if ($this->daemonize) { + // We need to get rid of these or the daemon will hang when we TERM it + // waiting for something to read the buffers. TODO: Learn how unix works. + fclose(STDOUT); + fclose(STDERR); + ob_start(); + + $pid = pcntl_fork(); + if ($pid === -1) { + throw new Exception(pht('Unable to fork!')); + } else if ($pid) { + exit(0); + } + + $sid = posix_setsid(); + if ($sid <= 0) { + throw new Exception(pht('Failed to create new process session!')); + } + } + + $this->logMessage( + 'OVER', + pht( + 'Started new daemon overseer (with PID "%s").', + getmypid())); + + $this->modules = PhutilDaemonOverseerModule::getAllModules(); + + $this->installSignalHandlers(); + } + + public function addLibrary($library) { + $this->libraries[] = $library; + return $this; + } + + public function run() { + $this->createDaemonPools(); + + while (true) { + if ($this->shouldReloadDaemons()) { + $this->didReceiveSignal(SIGHUP); + } + + $futures = array(); + + $running_pools = false; + foreach ($this->getDaemonPools() as $pool) { + $pool->updatePool(); + + if (!$this->shouldShutdown()) { + if ($pool->isHibernating()) { + if ($this->shouldWakePool($pool)) { + $pool->wakeFromHibernation(); + } + } + } + + foreach ($pool->getFutures() as $future) { + $futures[] = $future; + } + + if ($pool->getDaemons()) { + $running_pools = true; + } + } + + $this->updatePidfile(); + $this->updateMemory(); + + $this->waitForDaemonFutures($futures); + + if (!$futures && !$running_pools) { + if ($this->shouldShutdown()) { + break; + } + } + } + + exit($this->err); + } + + + private function waitForDaemonFutures(array $futures) { + assert_instances_of($futures, 'ExecFuture'); + + if ($futures) { + // TODO: This only wakes if any daemons actually exit. It would be a bit + // cleaner to wait on any I/O with Channels. + $iter = id(new FutureIterator($futures)) + ->setUpdateInterval(1); + foreach ($iter as $future) { + break; + } + } else { + if (!$this->shouldShutdown()) { + sleep(1); + } + } + } + + private function createDaemonPools() { + $configs = $this->config['daemons']; + + $forced_options = array( + 'load' => $this->libraries, + 'log' => $this->log, + ); + + foreach ($configs as $config) { + $config = $forced_options + $config; + + $pool = PhutilDaemonPool::newFromConfig($config) + ->setOverseer($this) + ->setCommandLineArguments($this->argv); + + $this->pools[] = $pool; + } + } + + private function getDaemonPools() { + return $this->pools; + } + + + /** + * Identify running daemons by examining the process table. This isn't + * completely reliable, but can be used as a fallback if the pid files fail + * or we end up with stray daemons by other means. + * + * Example output (array keys are process IDs): + * + * array( + * 12345 => array( + * 'type' => 'overseer', + * 'command' => 'php launch_daemon.php --daemonize ...', + * 'pid' => 12345, + * ), + * 12346 => array( + * 'type' => 'daemon', + * 'command' => 'php exec_daemon.php ...', + * 'pid' => 12346, + * ), + * ); + * + * @return dict Map of PIDs to process information, identifying running + * daemon processes. + */ + public static function findRunningDaemons() { + $results = array(); + + list($err, $processes) = exec_manual('ps -o pid,command -a -x -w -w -w'); + if ($err) { + return $results; + } + + $processes = array_filter(explode("\n", trim($processes))); + foreach ($processes as $process) { + list($pid, $command) = preg_split('/\s+/', trim($process), 2); + + $pattern = '/((launch|exec)_daemon.php|phd-daemon)/'; + $matches = null; + if (!preg_match($pattern, $command, $matches)) { + continue; + } + + switch ($matches[1]) { + case 'exec_daemon.php': + $type = 'daemon'; + break; + case 'launch_daemon.php': + case 'phd-daemon': + default: + $type = 'overseer'; + break; + } + + $results[(int)$pid] = array( + 'type' => $type, + 'command' => $command, + 'pid' => (int)$pid, + ); + } + + return $results; + } + + private function updatePidfile() { + if (!$this->piddir) { + return; + } + + $pidfile = $this->toDictionary(); + + if ($pidfile !== $this->lastPidfile) { + $this->lastPidfile = $pidfile; + $pidfile_path = $this->piddir.'/daemon.'.getmypid(); + try { + Filesystem::writeFile( + $pidfile_path, + phutil_json_encode($pidfile)); + } catch (Exception $ex) { + // This write can fail if the disk is full. We already tested the + // directory for writability on startup, so just ignore this and + // move on rather than crashing. If the disk is full this error may + // not make it to a log file, but at least we tried. + $this->logMessage( + 'PIDF', + pht( + 'Unable to update PID file: %s.', + $ex->getMessage())); + } + } + } + + public function toDictionary() { + $daemons = array(); + foreach ($this->getDaemonPools() as $pool) { + foreach ($pool->getDaemons() as $daemon) { + if (!$daemon->isRunning()) { + continue; + } + + $daemons[] = $daemon->toDictionary(); + } + } + + return array( + 'pid' => getmypid(), + 'start' => $this->startEpoch, + 'config' => $this->config, + 'daemons' => $daemons, + ); + } + + private function updateMemory() { + if (!$this->traceMemory) { + return; + } + + $this->logMessage( + 'RAMS', + pht( + 'Overseer Memory Usage: %s KB', + new PhutilNumber(memory_get_usage() / 1024, 1))); + } + + public function logMessage($type, $message, $context = null) { + $always_log = false; + switch ($type) { + case 'OVER': + case 'SGNL': + case 'PIDF': + $always_log = true; + break; + } + + if ($always_log || $this->traceMode || $this->verbose) { + error_log(date('Y-m-d g:i:s A').' ['.$type.'] '.$message); + } + } + + +/* -( Signal Handling )---------------------------------------------------- */ + + + /** + * @task signals + */ + private function installSignalHandlers() { + $signals = array( + SIGUSR2, + SIGHUP, + SIGINT, + SIGTERM, + ); + + foreach ($signals as $signal) { + pcntl_signal($signal, array($this, 'didReceiveSignal')); + } + } + + + /** + * @task signals + */ + public function didReceiveSignal($signo) { + $this->logMessage( + 'SGNL', + pht( + 'Overseer ("%d") received signal %d ("%s").', + getmypid(), + $signo, + phutil_get_signal_name($signo))); + + switch ($signo) { + case SIGUSR2: + $signal_type = self::SIGNAL_NOTIFY; + break; + case SIGHUP: + $signal_type = self::SIGNAL_RELOAD; + break; + case SIGINT: + // If we receive SIGINT more than once, interpret it like SIGTERM. + if ($this->inGracefulShutdown) { + return $this->didReceiveSignal(SIGTERM); + } + + $this->inGracefulShutdown = true; + $signal_type = self::SIGNAL_GRACEFUL; + break; + case SIGTERM: + // If we receive SIGTERM more than once, terminate abruptly. + $this->err = 128 + $signo; + if ($this->inAbruptShutdown) { + exit($this->err); + } + + $this->inAbruptShutdown = true; + $signal_type = self::SIGNAL_TERMINATE; + break; + default: + throw new Exception( + pht( + 'Signal handler called with unknown signal type ("%d")!', + $signo)); + } + + foreach ($this->getDaemonPools() as $pool) { + $pool->didReceiveSignal($signal_type, $signo); + } + } + + +/* -( Daemon Modules )----------------------------------------------------- */ + + + private function getModules() { + return $this->modules; + } + + private function shouldReloadDaemons() { + $modules = $this->getModules(); + + $should_reload = false; + foreach ($modules as $module) { + try { + // NOTE: Even if one module tells us to reload, we call the method on + // each module anyway to make calls a little more predictable. + + if ($module->shouldReloadDaemons()) { + $this->logMessage( + 'RELO', + pht( + 'Reloading daemons (triggered by overseer module "%s").', + get_class($module))); + $should_reload = true; + } + } catch (Exception $ex) { + phlog($ex); + } + } + + return $should_reload; + } + + private function shouldWakePool(PhutilDaemonPool $pool) { + $modules = $this->getModules(); + + $should_wake = false; + foreach ($modules as $module) { + try { + if ($module->shouldWakePool($pool)) { + $this->logMessage( + 'WAKE', + pht( + 'Waking pool "%s" (triggered by overseer module "%s").', + $pool->getPoolLabel(), + get_class($module))); + $should_wake = true; + } + } catch (Exception $ex) { + phlog($ex); + } + } + + return $should_wake; + } + + private function shouldShutdown() { + return $this->inGracefulShutdown || $this->inAbruptShutdown; + } + +} diff --git a/src/daemon/PhutilDaemonOverseerModule.php b/src/daemon/PhutilDaemonOverseerModule.php new file mode 100644 --- /dev/null +++ b/src/daemon/PhutilDaemonOverseerModule.php @@ -0,0 +1,71 @@ +setAncestorClass(__CLASS__) + ->execute(); + } + + + /** + * Throttle checks from executing too often. + * + * If you throttle a check like this, it will only execute once every 2.5 + * seconds: + * + * if ($this->shouldThrottle('some.check', 2.5)) { + * return; + * } + * + * @param string Throttle key. + * @param float Duration in seconds. + * @return bool True to throttle the check. + */ + protected function shouldThrottle($name, $duration) { + $throttle = idx($this->throttles, $name, 0); + $now = microtime(true); + + // If not enough time has elapsed, throttle the check. + $elapsed = ($now - $throttle); + if ($elapsed < $duration) { + return true; + } + + // Otherwise, mark the current time as the last time we ran the check, + // then let it continue. + $this->throttles[$name] = $now; + + return false; + } + +} diff --git a/src/daemon/PhutilDaemonPool.php b/src/daemon/PhutilDaemonPool.php new file mode 100644 --- /dev/null +++ b/src/daemon/PhutilDaemonPool.php @@ -0,0 +1,360 @@ + + } + + public static function newFromConfig(array $config) { + PhutilTypeSpec::checkMap( + $config, + array( + 'class' => 'string', + 'label' => 'string', + 'argv' => 'optional list', + 'load' => 'optional list', + 'log' => 'optional string|null', + 'pool' => 'optional int', + 'up' => 'optional int', + 'down' => 'optional int', + 'reserve' => 'optional int|float', + )); + + $config = $config + array( + 'argv' => array(), + 'load' => array(), + 'log' => null, + 'pool' => 1, + 'up' => 2, + 'down' => 15, + 'reserve' => 0, + ); + + $pool = new self(); + $pool->properties = $config; + + return $pool; + } + + public function setOverseer(PhutilDaemonOverseer $overseer) { + $this->overseer = $overseer; + return $this; + } + + public function getOverseer() { + return $this->overseer; + } + + public function setCommandLineArguments(array $arguments) { + $this->commandLineArguments = $arguments; + return $this; + } + + public function getCommandLineArguments() { + return $this->commandLineArguments; + } + + private function shouldShutdown() { + return $this->inShutdown; + } + + private function newDaemon() { + $config = $this->properties; + + if (count($this->daemons)) { + $down_duration = $this->getPoolScaledownDuration(); + } else { + // TODO: For now, never scale pools down to 0. + $down_duration = 0; + } + + $forced_config = array( + 'down' => $down_duration, + ); + + $config = $forced_config + $config; + + $config = array_select_keys( + $config, + array( + 'class', + 'log', + 'load', + 'argv', + 'down', + )); + + $daemon = PhutilDaemonHandle::newFromConfig($config) + ->setDaemonPool($this) + ->setCommandLineArguments($this->getCommandLineArguments()); + + $daemon_id = $daemon->getDaemonID(); + $this->daemons[$daemon_id] = $daemon; + + $daemon->didLaunch(); + + return $daemon; + } + + public function getDaemons() { + return $this->daemons; + } + + public function getFutures() { + $futures = array(); + foreach ($this->getDaemons() as $daemon) { + $future = $daemon->getFuture(); + if ($future) { + $futures[] = $future; + } + } + + return $futures; + } + + public function didReceiveSignal($signal, $signo) { + switch ($signal) { + case PhutilDaemonOverseer::SIGNAL_GRACEFUL: + case PhutilDaemonOverseer::SIGNAL_TERMINATE: + $this->inShutdown = true; + break; + } + + foreach ($this->getDaemons() as $daemon) { + switch ($signal) { + case PhutilDaemonOverseer::SIGNAL_NOTIFY: + $daemon->didReceiveNotifySignal($signo); + break; + case PhutilDaemonOverseer::SIGNAL_RELOAD: + $daemon->didReceiveReloadSignal($signo); + break; + case PhutilDaemonOverseer::SIGNAL_GRACEFUL: + $daemon->didReceiveGracefulSignal($signo); + break; + case PhutilDaemonOverseer::SIGNAL_TERMINATE: + $daemon->didReceiveTerminateSignal($signo); + break; + default: + throw new Exception( + pht( + 'Unknown signal "%s" ("%d").', + $signal, + $signo)); + } + } + } + + public function getPoolLabel() { + return $this->getPoolProperty('label'); + } + + public function getPoolMaximumSize() { + return $this->getPoolProperty('pool'); + } + + public function getPoolScaleupDuration() { + return $this->getPoolProperty('up'); + } + + public function getPoolScaledownDuration() { + return $this->getPoolProperty('down'); + } + + public function getPoolMemoryReserve() { + return $this->getPoolProperty('reserve'); + } + + public function getPoolDaemonClass() { + return $this->getPoolProperty('class'); + } + + private function getPoolProperty($key) { + return idx($this->properties, $key); + } + + public function updatePool() { + $daemons = $this->getDaemons(); + + foreach ($daemons as $key => $daemon) { + $daemon->update(); + + if ($daemon->isDone()) { + $daemon->didExit(); + + unset($this->daemons[$key]); + + if ($this->shouldShutdown()) { + $this->logMessage( + 'DOWN', + pht( + 'Pool "%s" is exiting, with %s daemon(s) remaining.', + $this->getPoolLabel(), + new PhutilNumber(count($this->daemons)))); + } else { + $this->logMessage( + 'POOL', + pht( + 'Autoscale pool "%s" scaled down to %s daemon(s).', + $this->getPoolLabel(), + new PhutilNumber(count($this->daemons)))); + } + } + } + + $this->updateAutoscale(); + } + + public function isHibernating() { + foreach ($this->getDaemons() as $daemon) { + if (!$daemon->isHibernating()) { + return false; + } + } + + return true; + } + + public function wakeFromHibernation() { + if (!$this->isHibernating()) { + return $this; + } + + $this->logMessage( + 'WAKE', + pht( + 'Autoscale pool "%s" is being awakened from hibernation.', + $this->getPoolLabel())); + + $did_wake_daemons = false; + foreach ($this->getDaemons() as $daemon) { + if ($daemon->isHibernating()) { + $daemon->wakeFromHibernation(); + $did_wake_daemons = true; + } + } + + if (!$did_wake_daemons) { + // TODO: Pools currently can't scale down to 0 daemons, but we should + // scale up immediately here once they can. + } + + $this->updatePool(); + + return $this; + } + + private function updateAutoscale() { + if ($this->shouldShutdown()) { + return; + } + + // Don't try to autoscale more than once per second. This mostly stops the + // logs from getting flooded in verbose mode. + $now = time(); + if ($this->lastAutoscaleUpdate >= $now) { + return; + } + $this->lastAutoscaleUpdate = $now; + + $daemons = $this->getDaemons(); + + // If this pool is already at the maximum size, we can't launch any new + // daemons. + $max_size = $this->getPoolMaximumSize(); + if (count($daemons) >= $max_size) { + $this->logMessage( + 'POOL', + pht( + 'Autoscale pool "%s" already at maximum size (%s of %s).', + $this->getPoolLabel(), + new PhutilNumber(count($daemons)), + new PhutilNumber($max_size))); + return; + } + + $scaleup_duration = $this->getPoolScaleupDuration(); + + foreach ($daemons as $daemon) { + $busy_epoch = $daemon->getBusyEpoch(); + // If any daemons haven't started work yet, don't scale the pool up. + if (!$busy_epoch) { + $this->logMessage( + 'POOL', + pht( + 'Autoscale pool "%s" has an idle daemon, declining to scale.', + $this->getPoolLabel())); + return; + } + + // If any daemons started work very recently, wait a little while + // to scale the pool up. + $busy_for = ($now - $busy_epoch); + if ($busy_for < $scaleup_duration) { + $this->logMessage( + 'POOL', + pht( + 'Autoscale pool "%s" has not been busy long enough to scale up '. + '(busy for %s of %s seconds).', + $this->getPoolLabel(), + new PhutilNumber($busy_for), + new PhutilNumber($scaleup_duration))); + return; + } + } + + // If we have a configured memory reserve for this pool, it tells us that + // we should not scale up unless there's at least that much memory left + // on the system (for example, a reserve of 0.25 means that 25% of system + // memory must be free to autoscale). + + // Note that the first daemon is exempt: we'll always launch at least one + // daemon, regardless of any memory reservation. + if (count($daemons)) { + $reserve = $this->getPoolMemoryReserve(); + if ($reserve) { + // On some systems this may be slightly more expensive than other + // checks, so we only do it once we're prepared to scale up. + $memory = PhutilSystem::getSystemMemoryInformation(); + $free_ratio = ($memory['free'] / $memory['total']); + + // If we don't have enough free memory, don't scale. + if ($free_ratio <= $reserve) { + $this->logMessage( + 'POOL', + pht( + 'Autoscale pool "%s" does not have enough free memory to '. + 'scale up (%s free of %s reserved).', + $this->getPoolLabel(), + new PhutilNumber($free_ratio, 3), + new PhutilNumber($reserve, 3))); + return; + } + } + } + + $this->logMessage( + 'AUTO', + pht( + 'Scaling pool "%s" up to %s daemon(s).', + $this->getPoolLabel(), + new PhutilNumber(count($daemons) + 1))); + + $this->newDaemon(); + } + + public function logMessage($type, $message, $context = null) { + return $this->getOverseer()->logMessage($type, $message, $context); + } + +} diff --git a/src/daemon/torture/PhutilExcessiveServiceCallsDaemon.php b/src/daemon/torture/PhutilExcessiveServiceCallsDaemon.php new file mode 100644 --- /dev/null +++ b/src/daemon/torture/PhutilExcessiveServiceCallsDaemon.php @@ -0,0 +1,15 @@ +stillWorking(); + } + } + +} diff --git a/src/daemon/torture/PhutilFatalDaemon.php b/src/daemon/torture/PhutilFatalDaemon.php new file mode 100644 --- /dev/null +++ b/src/daemon/torture/PhutilFatalDaemon.php @@ -0,0 +1,12 @@ +shouldExit()) { + $m = (int)date('i'); + if ($m % 2) { + $this->willBeginWork(); + $this->log(pht('Busy.')); + } else { + $this->willBeginIdle(); + $this->log(pht('Idle.')); + } + $this->sleep(1); + } + } + +} diff --git a/src/daemon/torture/PhutilNiceDaemon.php b/src/daemon/torture/PhutilNiceDaemon.php new file mode 100644 --- /dev/null +++ b/src/daemon/torture/PhutilNiceDaemon.php @@ -0,0 +1,16 @@ +shouldExit()) { + $this->log(date('r')); + $this->stillWorking(); + sleep(1); + } + } + +} diff --git a/src/daemon/torture/PhutilProcessGroupDaemon.php b/src/daemon/torture/PhutilProcessGroupDaemon.php new file mode 100644 --- /dev/null +++ b/src/daemon/torture/PhutilProcessGroupDaemon.php @@ -0,0 +1,15 @@ +resolvex(); + +@{class:ExecFuture} is a @{class:Future}, and can be used with constructs like +@{class:FutureIterator} to achieve and manage parallelism. See +@{article:Using Futures} for general information on how to use futures in +libphutil. + +In addition to futures-based parallelism, you can set a timeout on an +@{class:ExecFuture}, which will kill the command if it takes longer than the +specified number of seconds to execute: + + $future->setTimeout(30); + +If the command runs longer than the timeout, the process will be killed and the +future will resolve with a failure code (`ExecFuture::TIMED_OUT_EXIT_CODE`). + +You can also write to the stdin of a process by using the +@{method:ExecFuture::write} method. + + $future = new ExecFuture('bc'); + $future->write('2+2'); + list($stdout) = $future->resolvex(); + +See @{class:ExecFuture} for complete capability documentation. diff --git a/src/docs/article/core_quick_reference.diviner b/src/docs/article/core_quick_reference.diviner new file mode 100644 --- /dev/null +++ b/src/docs/article/core_quick_reference.diviner @@ -0,0 +1,45 @@ +@title Core Utilities Quick Reference +@group util + +Summary of libphutil core utilities. + += Overview = + +This document provides a brief overview of the libphutil core utilities. + += Language Capabilities = + +Functions @{function:id}, @{function:head} and @{function:newv} address +language grammar and implementation limitations. + +You can efficiently merge a vector of arrays with @{function:array_mergev}. + +Functions @{function:head}, @{function:last}, @{function:head_key} and +@{function:last_key} let you access the first or last elements of an array +without raising warnings. + +You can combine an array with itself safely with @{function:array_fuse}. + += Default Value Selection = + +Functions @{function:idx}, @{function:nonempty} and @{function:coalesce} help +you to select default values when keys or parameters are missing or empty. + += Array and Object Manipulation = + +Functions @{function:ipull}, @{function:igroup}, @{function:isort} and +@{function:ifilter} (**i** stands for **index**) simplify common data +manipulations applied to lists of arrays. + +Functions @{function:mpull}, @{function:mgroup}, @{function:msort} and +@{function:mfilter} (**m** stands for **method**) provide the same capabilities +for lists of objects. + +@{function:array_select_keys} allows you to choose or reorder keys from a +dictionary. + += Lunar Phases = + +@{class:PhutilLunarPhase} calculates lunar phases, allowing you to harden an +application against threats from werewolves, werebears, and other +werecreatures. diff --git a/src/docs/article/developing_xhpast.diviner b/src/docs/article/developing_xhpast.diviner new file mode 100644 --- /dev/null +++ b/src/docs/article/developing_xhpast.diviner @@ -0,0 +1,17 @@ +@title Developing XHPAST +@group xhpast + +Instructions for developing XHPAST. + += XHPAST Development Builds = + +To develop XHPAST, you need to install flex and bison. These install out of +most package systems, with the caveat that you need flex 2.3.35 (which is NEWER +than flex 2.3.4) and some package systems don't have it yet. If this is the +case for you, you can grab the source here: + + http://flex.sourceforge.net/ + +When building, run `make scanner parser all` instead of `make` to build the +entire toolchain. By default the scanner and parser are not rebuild, to avoid +requiring normal users to install flex and bison. diff --git a/src/docs/article/overview.diviner b/src/docs/article/overview.diviner new file mode 100644 --- /dev/null +++ b/src/docs/article/overview.diviner @@ -0,0 +1,57 @@ +@title libphutil Overview +@group overview + +This document provides a high-level introduction to libphutil. + += Overview = + +**libphutil** (pronounced as "lib-futile", like the English word //futile//) is +a collection of PHP utility classes and functions. Most code in the library is +general-purpose, and makes it easier to build applications in PHP. + +libphutil is principally the shared library for +[[ http://www.phabricator.org | Phabricator ]] and its CLI **Arcanist**, but is +suitable for inclusion in other projects. In particular, some of the classes +provided in this library vastly improve the state of common operations in PHP, +like executing system commands. + +libphutil is developed and maintained by +[[ http://www.phacility.com/ | Phacility ]]. Some of the code in this library +was originally developed at Facebook, and parts of it appear in the core +libraries for . + += Loading libphutil = + +To include libphutil in another project, include the +`src/__phutil_library_init__.php` file: + + require_once 'path/to/libphutil/src/__phutil_library_init__.php'; + +This loads global functions and registers an autoload function with +`spl_autoload_register()`, so you can also use classes. + += Major Components = + +Some of the major components of libphutil are: + + - **Core Utilities**: a collection of useful functions like @{function:ipull} + which simplify common data manipulation; + - **Filesystem**: classes like @{class:Filesystem} which provide a strict API + for filesystem access and throw exceptions on failure, making it easier to + write robust code which interacts with files; + - **Command Execution**: libphutil provides a powerful system command + primitive in @{class:ExecFuture} which makes it far easier to write + command-line scripts which execute system commands + (see @{article:Command Execution}); + - **@{function:xsprintf}**: allows you to define `sprintf()`-style functions + which use custom conversions; and + - **Library System**: an introspectable, inventoried system for organizing + PHP code and managing dependencies, supported by static analysis. + += Extending and Contributing = + +Information on extending and contributing to libphutil is available in the +Phabricator documentation: + + - To get started as a contributor, see @{article@phabcontrib:Contributor + Introduction}. diff --git a/src/docs/article/using_futures.diviner b/src/docs/article/using_futures.diviner new file mode 100644 --- /dev/null +++ b/src/docs/article/using_futures.diviner @@ -0,0 +1,90 @@ +@title Using Futures +@group future + +Overview of how futures work in libphutil. + + += Overview = + +Futures (also called "Promises") are objects which represent the result of some +pending computation (like executing a command or making a request to another +server), but don't actually hold that result until the computation finishes. +They are used to simplify parallel programming, since you can pass the future +around as a representation for the real result while the real result is being +computed in the background. When the object is asked to return the actual +result, it blocks until the result is available. + +libphutil provides a number of future-based APIs, as they strike a good balance +between ease of use and power for many of the domains where PHP is a reasonable +language choice. + +Each type of future is used to do a different type of computation (for instance, +@{class:ExecFuture} executes system commands while @{class:HTTPFuture} executes +HTTP requests), but all of them behave in a basically similar way and can be +manipulated with the same top-level constructs. + + += Basics = + +You create a future by instantiating the relevant class and ask it to return the +result by calling `resolve()`: + + $gzip_future = new ExecFuture('gzip %s', $some_file); + $gzip_future->start(); + + // The future is now executing in the background, and you can continue + // doing computation in this process by putting code here. + + list($err, $stdout, $stderr) = $gzip_future->resolve(); + +When you call `resolve()`, the future blocks until the result is ready. You +can test if a future's result is ready by calling `isReady()`: + + $is_ready = $gzip_future->isReady(); + +Being "ready" indicates that the future's computation has completed and it will +not need to block when you call `resolve()`. + +Note that when you instantiate a future, it does not immediately initiate +computation. You must call `start()`, `isReady()` or `resolve()` to +activate it. If you simply call `resolve()` it will start, block until it is +complete, and then return the result, acting in a completely synchronous way. + +See @{article:Command Execution} for more detailed documentation on how to +execute system commands with libphutil. + + += Managing Multiple Futures = + +Commonly, you may have many similar tasks you wish to parallelize: instead of +compressing one file, you want to compress several files. You can use the +@{class:FutureIterator} class to manage multiple futures. + + $futures = array(); + foreach ($files as $file) { + $futures[$file] = new ExecFuture("gzip %s", $file); + } + foreach (new FutureIterator($futures) as $file => $future) { + list($err, $stdout, $stderr) = $future->resolve(); + if (!$err) { + echo "Compressed {$file}...\n"; + } else { + echo "Failed to compress {$file}!\n"; + } + } + +@{class:FutureIterator} takes a list of futures and runs them in parallel, +**returning them in the order they resolve, NOT the original list order**. This +allows your program to begin any follow-up computation as quickly as possible: +if the slowest future in the list happens to be the first one, you can finish +processing all the other futures while waiting for it. + +You can also limit how many futures you want to run at once. For instance, to +process no more than 4 files simultaneously: + + foreach (id(new FutureIterator($futures))->limit(4) as $file => $future) { + // ... + } + +Consult the @{class:FutureIterator} documentation for detailed information on +class capabilities. diff --git a/src/docs/book/libphutil.book b/src/docs/book/libphutil.book new file mode 100644 --- /dev/null +++ b/src/docs/book/libphutil.book @@ -0,0 +1,87 @@ +{ + "name": "libphutil", + "title": "libphutil Technical Documentation", + "short": "libphutil Tech Docs", + "preface": "Technical documentation for developers using libphutil.", + "root": "../../../", + "uri.source": + "https://secure.phabricator.com/diffusion/PHU/browse/master/%f$%l", + "rules": { + "(\\.diviner$)": "DivinerArticleAtomizer", + "(\\.php$)": "DivinerPHPAtomizer" + }, + "exclude": [ + "(^externals/)", + "(^resources/)", + "(^scripts/)", + "(^support/)" + ], + "groups": { + "overview": { + "name": "libphutil Overview" + }, + "aphront": { + "name": "Aphront", + "include": "(^src/aphront/)" + }, + "auth": { + "name": "Authentication", + "include": "(^src/auth/)" + }, + "conduit": { + "name": "Conduit", + "include": "(^src/conduit/)" + }, + "console": { + "name": "Console", + "include": "(^src/console/)" + }, + "daemon": { + "name": "Daemons", + "include": "(^src/daemon/)" + }, + "error": { + "name": "Errors", + "include": "(^src/error/)" + }, + "filesystem": { + "name": "Filesystem", + "include": "(^src/filesystem/)" + }, + "future": { + "name": "Futures", + "include": "(^src/future/)" + }, + "internationalization": { + "name": "Internationalization", + "include": "(^src/internationalization/)" + }, + "lexer": { + "name": "Lexers", + "include": "(^src/lexer/)" + }, + "library": { + "name": "libphutil Library System", + "include": "(^src/moduleutils/)" + }, + "parser": { + "name": "Parsers", + "include": "(^src/parser/)" + }, + "phage": { + "name": "Phage", + "include": "(^src/phage/)" + }, + "remarkup": { + "name": "Remarkup", + "include": "(^src/markup/)" + }, + "utf8": { + "name": "Handling Unicode and UTF-8" + }, + "util": { + "name": "Core Utilities", + "include": "(^src/utils/)" + } + } +} diff --git a/src/error/PhutilAggregateException.php b/src/error/PhutilAggregateException.php new file mode 100644 --- /dev/null +++ b/src/error/PhutilAggregateException.php @@ -0,0 +1,55 @@ +doSomething(); + * $success = true; + * break; + * } catch (Exception $ex) { + * $exceptions[get_class($engine)] = $ex; + * } + * } + * + * if (!$success) { + * throw new PhutilAggregateException("All engines failed:", $exceptions); + * } + * + * @concrete-extensible + */ +class PhutilAggregateException extends Exception { + + private $exceptions = array(); + + public function __construct($message, array $other_exceptions) { + // We don't call assert_instances_of($other_exceptions, 'Exception') to not + // throw another exception in this exception. + + $this->exceptions = $other_exceptions; + + $full_message = array(); + $full_message[] = $message; + foreach ($other_exceptions as $key => $exception) { + $ex_message = + (is_string($key) ? $key.': ' : ''). + get_class($exception).': '. + $exception->getMessage(); + $ex_message = ' - '.str_replace("\n", "\n ", $ex_message); + + $full_message[] = $ex_message; + } + + parent::__construct(implode("\n", $full_message), count($other_exceptions)); + } + + public function getExceptions() { + return $this->exceptions; + } + +} diff --git a/src/error/PhutilErrorHandler.php b/src/error/PhutilErrorHandler.php new file mode 100644 --- /dev/null +++ b/src/error/PhutilErrorHandler.php @@ -0,0 +1,596 @@ +getPrevious(); + } + if (method_exists($ex, 'getPreviousException')) { + return $ex->getPreviousException(); + } + return null; + } + + + /** + * Find the most deeply nested exception from a possibly-nested exception. + * + * @param Exception|Throwable A possibly-nested exception. + * @return Exception|Throwable Deepest exception in the nest. + * @task exutil + */ + public static function getRootException($ex) { + $root = $ex; + while (self::getPreviousException($root)) { + $root = self::getPreviousException($root); + } + return $root; + } + + +/* -( Trapping Errors )---------------------------------------------------- */ + + + /** + * Adds an error trap. Normally you should not invoke this directly; + * @{class:PhutilErrorTrap} registers itself on construction. + * + * @param PhutilErrorTrap Trap to add. + * @return void + * @task trap + */ + public static function addErrorTrap(PhutilErrorTrap $trap) { + $key = $trap->getTrapKey(); + self::$traps[$key] = $trap; + } + + + /** + * Removes an error trap. Normally you should not invoke this directly; + * @{class:PhutilErrorTrap} deregisters itself on destruction. + * + * @param PhutilErrorTrap Trap to remove. + * @return void + * @task trap + */ + public static function removeErrorTrap(PhutilErrorTrap $trap) { + $key = $trap->getTrapKey(); + unset(self::$traps[$key]); + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * Determine if PhutilErrorHandler has been initialized. + * + * @return bool True if initialized. + * @task internal + */ + public static function hasInitialized() { + return self::$initialized; + } + + + /** + * Handles PHP errors and dispatches them forward. This is a callback for + * ##set_error_handler()##. You should not call this function directly; use + * @{function:phlog} to print debugging messages or ##trigger_error()## to + * trigger PHP errors. + * + * This handler converts E_RECOVERABLE_ERROR messages from violated typehints + * into @{class:InvalidArgumentException}s. + * + * This handler converts other E_RECOVERABLE_ERRORs into + * @{class:RuntimeException}s. + * + * This handler converts E_NOTICE messages from uses of undefined variables + * into @{class:RuntimeException}s. + * + * @param int Error code. + * @param string Error message. + * @param string File where the error occurred. + * @param int Line on which the error occurred. + * @param wild Error context information. + * @return void + * @task internal + */ + public static function handleError($num, $str, $file, $line, $ctx) { + + foreach (self::$traps as $trap) { + $trap->addError($num, $str, $file, $line, $ctx); + } + + if ((error_reporting() & $num) == 0) { + // Respect the use of "@" to silence warnings: if this error was + // emitted from a context where "@" was in effect, the + // value returned by error_reporting() will be 0. This is the + // recommended way to check for this, see set_error_handler() docs + // on php.net. + return false; + } + + // Convert typehint failures into exceptions. + if (preg_match('/^Argument (\d+) passed to (\S+) must be/', $str)) { + throw new InvalidArgumentException($str); + } + + // Convert other E_RECOVERABLE_ERRORs into generic runtime exceptions. + if ($num == E_RECOVERABLE_ERROR) { + throw new RuntimeException($str); + } + + // Convert uses of undefined variables into exceptions. + if (preg_match('/^Undefined variable: /', $str)) { + throw new RuntimeException($str); + } + + // Convert uses of undefined properties into exceptions. + if (preg_match('/^Undefined property: /', $str)) { + throw new RuntimeException($str); + } + + // Convert undefined constants into exceptions. Usually this means there + // is a missing `$` and the program is horribly broken. + if (preg_match('/^Use of undefined constant /', $str)) { + throw new RuntimeException($str); + } + + $trace = debug_backtrace(); + array_shift($trace); + self::dispatchErrorMessage( + self::ERROR, + $str, + array( + 'file' => $file, + 'line' => $line, + 'context' => $ctx, + 'error_code' => $num, + 'trace' => $trace, + )); + } + + /** + * Handles PHP exceptions and dispatches them forward. This is a callback for + * ##set_exception_handler()##. You should not call this function directly; + * to print exceptions, pass the exception object to @{function:phlog}. + * + * @param Exception|Throwable Uncaught exception object. + * @return void + * @task internal + */ + public static function handleException($ex) { + self::dispatchErrorMessage( + self::EXCEPTION, + $ex, + array( + 'file' => $ex->getFile(), + 'line' => $ex->getLine(), + 'trace' => self::getExceptionTrace($ex), + 'catch_trace' => debug_backtrace(), + )); + + // Normally, PHP exits with code 255 after an uncaught exception is thrown. + // However, if we install an exception handler (as we have here), it exits + // with code 0 instead. Script execution terminates after this function + // exits in either case, so exit explicitly with the correct exit code. + exit(255); + } + + + /** + * Output a stacktrace to the PHP error log. + * + * @param trace A stacktrace, e.g. from debug_backtrace(); + * @return void + * @task internal + */ + public static function outputStacktrace($trace) { + $lines = explode("\n", self::formatStacktrace($trace)); + foreach ($lines as $line) { + error_log($line); + } + } + + + /** + * Format a stacktrace for output. + * + * @param trace A stacktrace, e.g. from debug_backtrace(); + * @return string Human-readable trace. + * @task internal + */ + public static function formatStacktrace($trace) { + $result = array(); + + $libinfo = self::getLibraryVersions(); + if ($libinfo) { + foreach ($libinfo as $key => $dict) { + $info = array(); + foreach ($dict as $dkey => $dval) { + $info[] = $dkey.'='.$dval; + } + $libinfo[$key] = $key.'('.implode(', ', $info).')'; + } + $result[] = implode(', ', $libinfo); + } + + foreach ($trace as $key => $entry) { + $line = ' #'.$key.' '; + if (!empty($entry['xid'])) { + if ($entry['xid'] != 1) { + $line .= '<#'.$entry['xid'].'> '; + } + } + if (isset($entry['class'])) { + $line .= $entry['class'].'::'; + } + $line .= idx($entry, 'function', ''); + + if (isset($entry['args'])) { + $args = array(); + foreach ($entry['args'] as $arg) { + + // NOTE: Print out object types, not values. Values sometimes contain + // sensitive information and are usually not particularly helpful + // for debugging. + + $type = (gettype($arg) == 'object') + ? get_class($arg) + : gettype($arg); + $args[] = $type; + } + $line .= '('.implode(', ', $args).')'; + } + + if (isset($entry['file'])) { + $file = self::adjustFilePath($entry['file']); + $line .= ' called at ['.$file.':'.$entry['line'].']'; + } + + $result[] = $line; + } + return implode("\n", $result); + } + + + /** + * All different types of error messages come here before they are + * dispatched to the listener; this method also prints them to the PHP error + * log. + * + * @param const Event type constant. + * @param wild Event value. + * @param dict Event metadata. + * @return void + * @task internal + */ + public static function dispatchErrorMessage($event, $value, $metadata) { + $timestamp = strftime('%Y-%m-%d %H:%M:%S'); + + switch ($event) { + case self::ERROR: + $default_message = sprintf( + '[%s] ERROR %d: %s at [%s:%d]', + $timestamp, + $metadata['error_code'], + $value, + $metadata['file'], + $metadata['line']); + + $metadata['default_message'] = $default_message; + error_log($default_message); + self::outputStacktrace($metadata['trace']); + break; + case self::EXCEPTION: + $messages = array(); + $current = $value; + do { + $messages[] = '('.get_class($current).') '.$current->getMessage(); + } while ($current = self::getPreviousException($current)); + $messages = implode(' {>} ', $messages); + + if (strlen($messages) > 4096) { + $messages = substr($messages, 0, 4096).'...'; + } + + $default_message = sprintf( + '[%s] EXCEPTION: %s at [%s:%d]', + $timestamp, + $messages, + self::adjustFilePath(self::getRootException($value)->getFile()), + self::getRootException($value)->getLine()); + + $metadata['default_message'] = $default_message; + error_log($default_message); + self::outputStacktrace($metadata['trace']); + break; + case self::PHLOG: + $default_message = sprintf( + '[%s] PHLOG: %s at [%s:%d]', + $timestamp, + PhutilReadableSerializer::printShort($value), + $metadata['file'], + $metadata['line']); + + $metadata['default_message'] = $default_message; + error_log($default_message); + break; + case self::DEPRECATED: + $default_message = sprintf( + '[%s] DEPRECATED: %s is deprecated; %s', + $timestamp, + $value, + $metadata['why']); + + $metadata['default_message'] = $default_message; + error_log($default_message); + break; + default: + error_log(pht('Unknown event %s', $event)); + break; + } + + if (self::$errorListener) { + static $handling_error; + if ($handling_error) { + error_log( + 'Error handler was reentered, some errors were not passed to the '. + 'listener.'); + return; + } + $handling_error = true; + call_user_func(self::$errorListener, $event, $value, $metadata); + $handling_error = false; + } + } + + public static function adjustFilePath($path) { + // Compute known library locations so we can emit relative paths if the + // file resides inside a known library. This is a little cleaner to read, + // and limits the number of false positives we get about full path + // disclosure via HackerOne. + + $bootloader = PhutilBootloader::getInstance(); + $libraries = $bootloader->getAllLibraries(); + $roots = array(); + foreach ($libraries as $library) { + $root = $bootloader->getLibraryRoot($library); + // For these libraries, the effective root is one level up. + switch ($library) { + case 'phutil': + case 'arcanist': + case 'phabricator': + $root = dirname($root); + break; + } + + if (!strncmp($root, $path, strlen($root))) { + return '<'.$library.'>'.substr($path, strlen($root)); + } + } + + return $path; + } + + public static function getLibraryVersions() { + $libinfo = array(); + + $bootloader = PhutilBootloader::getInstance(); + foreach ($bootloader->getAllLibraries() as $library) { + $root = phutil_get_library_root($library); + $try_paths = array( + $root, + dirname($root), + ); + $libinfo[$library] = array(); + + $get_refs = array('master'); + foreach ($try_paths as $try_path) { + // Try to read what the HEAD of the repository is pointed at. This is + // normally the name of a branch ("ref"). + $try_file = $try_path.'/.git/HEAD'; + if (@file_exists($try_file)) { + $head = @file_get_contents($try_file); + $matches = null; + if (preg_match('(^ref: refs/heads/(.*)$)', trim($head), $matches)) { + $libinfo[$library]['head'] = trim($matches[1]); + $get_refs[] = trim($matches[1]); + } else { + $libinfo[$library]['head'] = trim($head); + } + break; + } + } + + // Try to read which commit relevant branch heads are at. + foreach (array_unique($get_refs) as $ref) { + foreach ($try_paths as $try_path) { + $try_file = $try_path.'/.git/refs/heads/'.$ref; + if (@file_exists($try_file)) { + $hash = @file_get_contents($try_file); + if ($hash) { + $libinfo[$library]['ref.'.$ref] = substr(trim($hash), 0, 12); + break; + } + } + } + } + + // Look for extension files. + $custom = @scandir($root.'/extensions/'); + if ($custom) { + $count = 0; + foreach ($custom as $custom_path) { + if (preg_match('/\.php$/', $custom_path)) { + $count++; + } + } + if ($count) { + $libinfo[$library]['custom'] = $count; + } + } + } + + ksort($libinfo); + + return $libinfo; + } + + /** + * Get a full trace across all proxied and aggregated exceptions. + * + * This attempts to build a set of stack frames which completely represent + * all of the places an exception came from, even if it came from multiple + * origins and has been aggregated or proxied. + * + * @param Exception|Throwable Exception to retrieve a trace for. + * @return list List of stack frames. + */ + public static function getExceptionTrace($ex) { + $id = 1; + + // Keep track of discovered exceptions which we need to build traces for. + $stack = array( + array($id, $ex), + ); + + $frames = array(); + while ($info = array_shift($stack)) { + list($xid, $ex) = $info; + + // We're going from top-level exception down in bredth-first order, but + // want to build a trace in approximately standard order (deepest part of + // the call stack to most shallow) so we need to reverse each list of + // frames and then reverse everything at the end. + + $ex_frames = array_reverse($ex->getTrace()); + $ex_frames = array_values($ex_frames); + $last_key = (count($ex_frames) - 1); + foreach ($ex_frames as $frame_key => $frame) { + $frame['xid'] = $xid; + + // If this is a child/previous exception and we're on the deepest frame + // and missing file/line data, fill it in from the exception itself. + if ($xid > 1 && ($frame_key == $last_key)) { + if (empty($frame['file'])) { + $frame['file'] = $ex->getFile(); + $frame['line'] = $ex->getLine(); + } + } + + // Since the exceptions are likely to share the most shallow frames, + // try to add those to the trace only once. + if (isset($frame['file']) && isset($frame['line'])) { + $signature = $frame['file'].':'.$frame['line']; + if (empty($frames[$signature])) { + $frames[$signature] = $frame; + } + } else { + $frames[] = $frame; + } + } + + // If this is a proxy exception, add the proxied exception. + $prev = self::getPreviousException($ex); + if ($prev) { + $stack[] = array(++$id, $prev); + } + + // If this is an aggregate exception, add the child exceptions. + if ($ex instanceof PhutilAggregateException) { + foreach ($ex->getExceptions() as $child) { + $stack[] = array(++$id, $child); + } + } + } + + return array_values(array_reverse($frames)); + } + +} diff --git a/src/error/PhutilErrorTrap.php b/src/error/PhutilErrorTrap.php new file mode 100644 --- /dev/null +++ b/src/error/PhutilErrorTrap.php @@ -0,0 +1,83 @@ +getErrorsAsString(); + * $trap->destroy(); + * + * if (!$res) { + * throw new Exception('proc_open() failed: '.$err); + * } + * + * IMPORTANT: You must explicitly destroy traps because they register + * themselves with @{class:PhutilErrorHandler}, and thus will not be destroyed + * when `unset()`. + * + * Some notes on traps: + * + * - Traps catch all errors, including those silenced by `@`. + * - Traps do not prevent errors from reaching other standard handlers. You + * can use `@` to keep errors out of the logs while still trapping them. + * - Traps capture all errors until they are explicitly destroyed. This means + * that you should not create long-lived traps, or they may consume + * unbounded amounts of memory to hold the error log. + */ +final class PhutilErrorTrap extends Phobject { + + private $destroyed; + private $errors = array(); + + public function addError($num, $str, $file, $line, $ctx) { + $this->errors[] = array( + 'num' => $num, + 'str' => $str, + 'file' => $file, + 'line' => $line, + 'ctx' => $ctx, + ); + return $this; + } + + public function getErrorsAsString() { + $out = array(); + foreach ($this->errors as $error) { + $out[] = $error['str']; + } + return implode("\n", $out); + } + + public function destroy() { + if (!$this->destroyed) { + PhutilErrorHandler::removeErrorTrap($this); + $this->errors = array(); + $this->destroyed = true; + } + } + + public function getTrapKey() { + return spl_object_hash($this); + } + + public function __construct() { + PhutilErrorHandler::addErrorTrap($this); + } + + public function __toString() { + return $this->getErrorsAsString(); + } + +} diff --git a/src/error/PhutilMethodNotImplementedException.php b/src/error/PhutilMethodNotImplementedException.php new file mode 100644 --- /dev/null +++ b/src/error/PhutilMethodNotImplementedException.php @@ -0,0 +1,34 @@ +openEnvelope(); + * + * Any time you're passing sensitive data into a stack, you should obscure it + * with an envelope to prevent it leaking if something goes wrong. + * + * The key for the envelope is stored elsewhere, in + * @{class:PhutilOpaqueEnvelopeKey}. This prevents it from appearing in + * any sort of logs related to the envelope, even if the logger is very + * aggressive. + * + * @task envelope Using Opaque Envelopes + * @task internal Internals + */ +final class PhutilOpaqueEnvelope extends Phobject { + + private $value; + + +/* -( Using Opaque Envelopes )--------------------------------------------- */ + + + /** + * @task envelope + */ + public function __construct($string) { + $this->value = $this->mask($string, PhutilOpaqueEnvelopeKey::getKey()); + } + + + /** + * @task envelope + */ + public function openEnvelope() { + return $this->mask($this->value, PhutilOpaqueEnvelopeKey::getKey()); + } + + + /** + * @task envelope + */ + public function __toString() { + return pht(''); + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * @task internal + */ + private function mask($string, $noise) { + $result = ''; + for ($ii = 0; $ii < strlen($string); $ii++) { + $s = $string[$ii]; + $n = $noise[$ii % strlen($noise)]; + + $result .= chr(ord($s) ^ ord($n)); + } + return $result; + } + +} diff --git a/src/error/PhutilOpaqueEnvelopeKey.php b/src/error/PhutilOpaqueEnvelopeKey.php new file mode 100644 --- /dev/null +++ b/src/error/PhutilOpaqueEnvelopeKey.php @@ -0,0 +1,45 @@ + + } + + + /** + * @task internal + */ + public static function getKey() { + if (self::$key === null) { + // NOTE: We're using a weak random source because cryptographic levels + // of security aren't terribly important here and it allows us to use + // envelopes on systems which don't have a strong random source. Notably, + // this lets us make it to the readability check for `/dev/urandom` in + // Phabricator on systems where we can't read it. + self::$key = ''; + for ($ii = 0; $ii < 8; $ii++) { + self::$key .= md5(mt_rand(), $raw_output = true); + } + } + return self::$key; + } + +} diff --git a/src/error/PhutilProxyException.php b/src/error/PhutilProxyException.php new file mode 100644 --- /dev/null +++ b/src/error/PhutilProxyException.php @@ -0,0 +1,32 @@ +previousException = $previous; + + if (version_compare(PHP_VERSION, '5.3.0', '>=')) { + parent::__construct($message, $code, $previous); + } else { + parent::__construct($message, $code); + } + } + + public function getPreviousException() { + // NOTE: This can not be named "getPrevious()" because that method is final + // after PHP 5.3. Similarly, the property can not be named "previous" + // because HPHP declares a property with the same name and "protected" + // visibility. + return $this->previousException; + } + +} diff --git a/src/error/__tests__/PhutilErrorHandlerTestCase.php b/src/error/__tests__/PhutilErrorHandlerTestCase.php new file mode 100644 --- /dev/null +++ b/src/error/__tests__/PhutilErrorHandlerTestCase.php @@ -0,0 +1,39 @@ +assertEqual($a, $b->getPrevious()); + $this->assertEqual($a, PhutilErrorHandler::getRootException($b)); + $this->assertEqual($a, PhutilErrorHandler::getPreviousException($b)); + + $this->assertEqual($a, PhutilErrorHandler::getRootException($c)); + $this->assertEqual($b, PhutilErrorHandler::getPreviousException($c)); + } + + public function testSilenceHandler() { + // Errors should normally be logged. + $this->assertTrue(strlen($this->emitError()) > 0); + + // The "@" operator should silence errors. + $this->assertTrue(@strlen($this->emitError()) === 0); + } + + private function emitError() { + $temporary_log = new TempFile(); + + $old_log = ini_get('error_log'); + ini_set('error_log', (string)$temporary_log); + + trigger_error(pht('(A synthetic error emitted during a unit test.)')); + + ini_set('error_log', $old_log); + return Filesystem::readFile($temporary_log); + } + + +} diff --git a/src/error/__tests__/PhutilOpaqueEnvelopeTestCase.php b/src/error/__tests__/PhutilOpaqueEnvelopeTestCase.php new file mode 100644 --- /dev/null +++ b/src/error/__tests__/PhutilOpaqueEnvelopeTestCase.php @@ -0,0 +1,47 @@ +assertFalse(strpos(var_export($envelope, true), $secret)); + + $this->assertFalse(strpos(print_r($envelope, true), $secret)); + + ob_start(); + var_dump($envelope); + $dump = ob_get_clean(); + + $this->assertFalse(strpos($dump, $secret)); + + try { + $this->throwTrace($envelope); + } catch (Exception $ex) { + $trace = $ex->getTrace(); + $this->assertFalse(strpos(print_r($trace, true), $secret)); + } + + $backtrace = $this->getBacktrace($envelope); + $this->assertFalse(strpos(print_r($backtrace, true), $secret)); + + $this->assertEqual($secret, $envelope->openEnvelope()); + } + + private function throwTrace($v) { + throw new Exception('!'); + } + + private function getBacktrace($v) { + return debug_backtrace(); + } + +} diff --git a/src/error/phlog.php b/src/error/phlog.php new file mode 100644 --- /dev/null +++ b/src/error/phlog.php @@ -0,0 +1,68 @@ + $trace[0]['file'], + 'line' => $trace[0]['line'], + 'trace' => $trace, + ); + + foreach (func_get_args() as $event) { + $data = $metadata; + if ($event instanceof Exception) { + $type = PhutilErrorHandler::EXCEPTION; + // If this is an exception, proxy it and generate a composite trace which + // shows both where the phlog() was called and where the exception was + // originally thrown from. + $proxy = new PhutilProxyException('', $event); + $trace = PhutilErrorHandler::getExceptionTrace($proxy); + $data['trace'] = $trace; + } else { + $type = PhutilErrorHandler::PHLOG; + } + + PhutilErrorHandler::dispatchErrorMessage($type, $event, $data); + } + + return $value; +} + +/** + * Example @{class:PhutilErrorHandler} error listener callback. When you call + * `PhutilErrorHandler::setErrorListener()`, you must pass a callback function + * with the same signature as this one. + * + * NOTE: @{class:PhutilErrorHandler} handles writing messages to the error + * log, so you only need to provide a listener if you have some other console + * (like Phabricator's DarkConsole) which you //also// want to send errors to. + * + * NOTE: You will receive errors which were silenced with the `@` operator. If + * you don't want to display these, test for `@` being in effect by checking if + * `error_reporting() === 0` before displaying the error. + * + * @param const A PhutilErrorHandler constant, like PhutilErrorHandler::ERROR, + * which indicates the event type (e.g. error, exception, + * user message). + * @param wild The event value, like the Exception object for an exception + * event, an error string for an error event, or some user object + * for user messages. + * @param dict A dictionary of metadata about the event. The keys 'file', + * 'line' and 'trace' are always available. Other keys may be + * present, depending on the event type. + * @return void + */ +function phutil_error_listener_example($event, $value, array $metadata) { + throw new Exception(pht('This is just an example function!')); +} diff --git a/src/events/PhutilEvent.php b/src/events/PhutilEvent.php new file mode 100644 --- /dev/null +++ b/src/events/PhutilEvent.php @@ -0,0 +1,39 @@ +type = $type; + $this->data = $data; + } + + public function getType() { + return $this->type; + } + + public function getValue($key, $default = null) { + return idx($this->data, $key, $default); + } + + public function setValue($key, $value) { + $this->data[$key] = $value; + return $this; + } + + public function stop() { + $this->stop = true; + return $this; + } + + public function isStopped() { + return $this->stop; + } + +} diff --git a/src/events/PhutilEventEngine.php b/src/events/PhutilEventEngine.php new file mode 100644 --- /dev/null +++ b/src/events/PhutilEventEngine.php @@ -0,0 +1,75 @@ + + } + + public static function getInstance() { + if (!self::$instance) { + self::$instance = new PhutilEventEngine(); + } + return self::$instance; + } + + public function addListener(PhutilEventListener $listener, $type) { + $this->listeners[$type][] = $listener; + return $this; + } + + /** + * Get all the objects currently listening to any event. + */ + public function getAllListeners() { + $listeners = array_mergev($this->listeners); + $listeners = mpull($listeners, null, 'getListenerID'); + return $listeners; + } + + public static function dispatchEvent(PhutilEvent $event) { + $instance = self::getInstance(); + + $listeners = idx($instance->listeners, $event->getType(), array()); + $global_listeners = idx( + $instance->listeners, + PhutilEventType::TYPE_ALL, + array()); + + // Merge and deduplicate listeners (we want to send the event to each + // listener only once, even if it satisfies multiple criteria for the + // event). + $listeners = array_merge($listeners, $global_listeners); + $listeners = mpull($listeners, null, 'getListenerID'); + + $profiler = PhutilServiceProfiler::getInstance(); + $profiler_id = $profiler->beginServiceCall( + array( + 'type' => 'event', + 'kind' => $event->getType(), + 'count' => count($listeners), + )); + + $caught = null; + try { + foreach ($listeners as $listener) { + if ($event->isStopped()) { + // Do this first so if someone tries to dispatch a stopped event it + // doesn't go anywhere. Silly but less surprising. + break; + } + $listener->handleEvent($event); + } + } catch (Exception $ex) { + $profiler->endServiceCall($profiler_id, array()); + throw $ex; + } + + $profiler->endServiceCall($profiler_id, array()); + } + +} diff --git a/src/events/PhutilEventListener.php b/src/events/PhutilEventListener.php new file mode 100644 --- /dev/null +++ b/src/events/PhutilEventListener.php @@ -0,0 +1,37 @@ + + } + + abstract public function register(); + abstract public function handleEvent(PhutilEvent $event); + + final public function listen($type) { + $engine = PhutilEventEngine::getInstance(); + $engine->addListener($this, $type); + } + + + /** + * Return a scalar ID unique to this listener. This is used to deduplicate + * listeners which match events on multiple rules, so they are invoked only + * once. + * + * @return int A scalar unique to this object instance. + */ + final public function getListenerID() { + if (!$this->listenerID) { + $this->listenerID = self::$nextListenerID; + self::$nextListenerID++; + } + return $this->listenerID; + } + + +} diff --git a/src/events/constant/PhutilEventConstants.php b/src/events/constant/PhutilEventConstants.php new file mode 100644 --- /dev/null +++ b/src/events/constant/PhutilEventConstants.php @@ -0,0 +1,3 @@ +callee = $callee; + $this->function = $function; + + parent::__construct( + pht( + 'Call %s before calling %s!', + $this->function.'()', + $this->callee.'()')); + } + + public function getCallee() { + return $this->callee; + } + + public function getFunction() { + return $this->function; + } +} diff --git a/src/exception/__tests__/PhutilInvalidStateExceptionTestCase.php b/src/exception/__tests__/PhutilInvalidStateExceptionTestCase.php new file mode 100644 --- /dev/null +++ b/src/exception/__tests__/PhutilInvalidStateExceptionTestCase.php @@ -0,0 +1,17 @@ +assertEqual( + __FUNCTION__, + $ex->getCallee()); + $this->assertEqual( + 'someMethod', + $ex->getFunction()); + } + } +} diff --git a/src/filesystem/FileFinder.php b/src/filesystem/FileFinder.php new file mode 100644 --- /dev/null +++ b/src/filesystem/FileFinder.php @@ -0,0 +1,365 @@ +withType('f') + * ->withSuffix('php') + * ->find(); + * + * @task create Creating a File Query + * @task config Configuring File Queries + * @task exec Executing the File Query + * @task internal Internal + */ +final class FileFinder extends Phobject { + + private $root; + private $exclude = array(); + private $paths = array(); + private $name = array(); + private $suffix = array(); + private $nameGlobs = array(); + private $type; + private $generateChecksums = false; + private $followSymlinks; + private $forceMode; + + /** + * Create a new FileFinder. + * + * @param string Root directory to find files beneath. + * @return this + * @task create + */ + public function __construct($root) { + $this->root = rtrim($root, '/'); + } + + /** + * @task config + */ + public function excludePath($path) { + $this->exclude[] = $path; + return $this; + } + + /** + * @task config + */ + public function withName($name) { + $this->name[] = $name; + return $this; + } + + /** + * @task config + */ + public function withSuffix($suffix) { + $this->suffix[] = $suffix; + return $this; + } + + /** + * @task config + */ + public function withPath($path) { + $this->paths[] = $path; + return $this; + } + + /** + * @task config + */ + public function withType($type) { + $this->type = $type; + return $this; + } + + /** + * @task config + */ + public function withFollowSymlinks($follow) { + $this->followSymlinks = $follow; + return $this; + } + + /** + * @task config + */ + public function setGenerateChecksums($generate) { + $this->generateChecksums = $generate; + return $this; + } + + public function getGenerateChecksums() { + return $this->generateChecksums; + } + + public function withNameGlob($pattern) { + $this->nameGlobs[] = $pattern; + return $this; + } + + /** + * @task config + * @param string Either "php", "shell", or the empty string. + */ + public function setForceMode($mode) { + $this->forceMode = $mode; + return $this; + } + + /** + * @task internal + */ + public function validateFile($file) { + + if ($this->name) { + $matches = false; + foreach ($this->name as $curr_name) { + if (basename($file) === $curr_name) { + $matches = true; + break; + } + } + + if (!$matches) { + return false; + } + } + + if ($this->nameGlobs) { + $name = basename($file); + + $matches = false; + foreach ($this->nameGlobs as $glob) { + $glob = addcslashes($glob, '\\'); + if (fnmatch($glob, $name)) { + $matches = true; + break; + } + } + + if (!$matches) { + return false; + } + } + + if ($this->suffix) { + $matches = false; + foreach ($this->suffix as $suffix) { + $suffix = addcslashes($suffix, '\\?*'); + $suffix = '*.'.$suffix; + if (fnmatch($suffix, $file)) { + $matches = true; + break; + } + } + + if (!$matches) { + return false; + } + } + + if ($this->paths) { + $matches = false; + foreach ($this->paths as $path) { + if (fnmatch($path, $this->root.'/'.$file)) { + $matches = true; + break; + } + } + + if (!$matches) { + return false; + } + } + + $fullpath = $this->root.'/'.ltrim($file, '/'); + if (($this->type == 'f' && is_dir($fullpath)) + || ($this->type == 'd' && !is_dir($fullpath))) { + return false; + } + + return true; + } + + /** + * @task internal + */ + private function getFiles($dir) { + $found = Filesystem::listDirectory($this->root.'/'.$dir, true); + $files = array(); + if (strlen($dir) > 0) { + $dir = rtrim($dir, '/').'/'; + } + foreach ($found as $filename) { + // Only exclude files whose names match relative to the root. + if ($dir == '') { + $matches = true; + foreach ($this->exclude as $exclude_path) { + if (fnmatch(ltrim($exclude_path, './'), $dir.$filename)) { + $matches = false; + break; + } + } + if (!$matches) { + continue; + } + } + + if ($this->validateFile($dir.$filename)) { + $files[] = $dir.$filename; + } + + if (is_dir($this->root.'/'.$dir.$filename)) { + foreach ($this->getFiles($dir.$filename) as $file) { + $files[] = $file; + } + } + } + return $files; + } + + /** + * @task exec + */ + public function find() { + + $files = array(); + + if (!is_dir($this->root) || !is_readable($this->root)) { + throw new Exception( + pht( + "Invalid %s root directory specified ('%s'). Root directory ". + "must be a directory, be readable, and be specified with an ". + "absolute path.", + __CLASS__, + $this->root)); + } + + if ($this->forceMode == 'shell') { + $php_mode = false; + } else if ($this->forceMode == 'php') { + $php_mode = true; + } else { + $php_mode = (phutil_is_windows() || !Filesystem::binaryExists('find')); + } + + if ($php_mode) { + $files = $this->getFiles(''); + } else { + $args = array(); + $command = array(); + + $command[] = 'find'; + if ($this->followSymlinks) { + $command[] = '-L'; + } + $command[] = '.'; + + if ($this->exclude) { + $command[] = $this->generateList('path', $this->exclude).' -prune'; + $command[] = '-o'; + } + + if ($this->type) { + $command[] = '-type %s'; + $args[] = $this->type; + } + + if ($this->name) { + $command[] = $this->generateList('name', $this->name, 'name'); + } + + if ($this->suffix) { + $command[] = $this->generateList('name', $this->suffix, 'suffix'); + } + + if ($this->paths) { + $command[] = $this->generateList('path', $this->paths); + } + + if ($this->nameGlobs) { + $command[] = $this->generateList('name', $this->nameGlobs); + } + + $command[] = '-print0'; + + array_unshift($args, implode(' ', $command)); + list($stdout) = newv('ExecFuture', $args) + ->setCWD($this->root) + ->resolvex(); + + $stdout = trim($stdout); + if (!strlen($stdout)) { + return array(); + } + + $files = explode("\0", $stdout); + + // On OSX/BSD, find prepends a './' to each file. + foreach ($files as $key => $file) { + // When matching directories, we can get "." back in the result set, + // but this isn't an interesting result. + if ($file == '.') { + unset($files[$key]); + continue; + } + + if (substr($files[$key], 0, 2) == './') { + $files[$key] = substr($files[$key], 2); + } + } + } + + if (!$this->generateChecksums) { + return $files; + } else { + $map = array(); + foreach ($files as $line) { + $fullpath = $this->root.'/'.ltrim($line, '/'); + if (is_dir($fullpath)) { + $map[$line] = null; + } else { + $map[$line] = md5_file($fullpath); + } + } + return $map; + } + } + + /** + * @task internal + */ + private function generateList( + $flag, + array $items, + $mode = 'glob') { + + foreach ($items as $key => $item) { + // If the mode is not "glob" mode, we're going to escape glob characters + // in the pattern. Otherwise, we escape only backslashes. + if ($mode === 'glob') { + $item = addcslashes($item, '\\'); + } else { + $item = addcslashes($item, '\\*?'); + } + + if ($mode === 'suffix') { + $item = '*.'.$item; + } + + $item = (string)csprintf('%s %s', '-'.$flag, $item); + + $items[$key] = $item; + } + + $items = implode(' -o ', $items); + return '"(" '.$items.' ")"'; + } +} diff --git a/src/filesystem/FileList.php b/src/filesystem/FileList.php new file mode 100644 --- /dev/null +++ b/src/filesystem/FileList.php @@ -0,0 +1,92 @@ +contains($file)) { + * do_something_to_this($file); + * } + * } + * + * This sort of construction will allow the user to type "src" in order + * to indicate 'all relevant files underneath "src/"'. + * + * @task create Creating a File List + * @task test Testing File Lists + */ +final class FileList extends Phobject { + + private $files = array(); + private $dirs = array(); + + /** + * Build a new FileList from an array of paths, e.g. from $argv. + * + * @param list List of relative or absolute file paths. + * @return this + * @task create + */ + public function __construct($paths) { + foreach ($paths as $path) { + $path = Filesystem::resolvePath($path); + if (is_dir($path)) { + $path = rtrim($path, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; + $this->dirs[$path] = true; + } + $this->files[] = $path; + } + } + + + /** + * Determine if a path is one of the paths in the list. Note that an empty + * file list is considered to contain every file. + * + * @param string Relative or absolute system file path. + * @param bool If true, consider the path to be contained in the list if + * the list contains a parent directory. If false, require + * that the path be part of the list explicitly. + * @return bool If true, the file is in the list. + * @task test + */ + public function contains($path, $allow_parent_directory = true) { + + if ($this->isEmpty()) { + return true; + } + + $path = Filesystem::resolvePath($path); + if (is_dir($path)) { + $path .= DIRECTORY_SEPARATOR; + } + + foreach ($this->files as $file) { + if ($file == $path) { + return true; + } + if ($allow_parent_directory) { + $len = strlen($file); + if (isset($this->dirs[$file]) && !strncmp($file, $path, $len)) { + return true; + } + } + } + return false; + } + + + /** + * Check if the file list is empty -- that is, it contains no files. + * + * @return bool If true, the list is empty. + * @task test + */ + public function isEmpty() { + return !$this->files; + } + +} diff --git a/src/filesystem/Filesystem.php b/src/filesystem/Filesystem.php new file mode 100644 --- /dev/null +++ b/src/filesystem/Filesystem.php @@ -0,0 +1,1156 @@ +> 3]; + } + + return $result; + } + + + /** + * Identify the MIME type of a file. This returns only the MIME type (like + * text/plain), not the encoding (like charset=utf-8). + * + * @param string Path to the file to examine. + * @param string Optional default mime type to return if the file's mime + * type can not be identified. + * @return string File mime type. + * + * @task file + * + * @phutil-external-symbol function mime_content_type + * @phutil-external-symbol function finfo_open + * @phutil-external-symbol function finfo_file + */ + public static function getMimeType( + $path, + $default = 'application/octet-stream') { + + $path = self::resolvePath($path); + + self::assertExists($path); + self::assertIsFile($path); + self::assertReadable($path); + + $mime_type = null; + + // Fileinfo is the best approach since it doesn't rely on `file`, but + // it isn't builtin for older versions of PHP. + + if (function_exists('finfo_open')) { + $finfo = finfo_open(FILEINFO_MIME); + if ($finfo) { + $result = finfo_file($finfo, $path); + if ($result !== false) { + $mime_type = $result; + } + } + } + + // If we failed Fileinfo, try `file`. This works well but not all systems + // have the binary. + + if ($mime_type === null) { + list($err, $stdout) = exec_manual( + 'file --brief --mime %s', + $path); + if (!$err) { + $mime_type = trim($stdout); + } + } + + // If we didn't get anywhere, try the deprecated mime_content_type() + // function. + + if ($mime_type === null) { + if (function_exists('mime_content_type')) { + $result = mime_content_type($path); + if ($result !== false) { + $mime_type = $result; + } + } + } + + // If we come back with an encoding, strip it off. + if (strpos($mime_type, ';') !== false) { + list($type, $encoding) = explode(';', $mime_type, 2); + $mime_type = $type; + } + + if ($mime_type === null) { + $mime_type = $default; + } + + return $mime_type; + } + + +/* -( Directories )-------------------------------------------------------- */ + + + /** + * Create a directory in a manner similar to mkdir(), but throw detailed + * exceptions on failure. + * + * @param string Path to directory. The parent directory must exist and + * be writable. + * @param int Permission umask. Note that umask is in octal, so you + * should specify it as, e.g., `0777', not `777'. + * @param boolean Recursively create directories. Default to false. + * @return string Path to the created directory. + * + * @task directory + */ + public static function createDirectory( + $path, + $umask = 0755, + $recursive = false) { + + $path = self::resolvePath($path); + + if (is_dir($path)) { + if ($umask) { + self::changePermissions($path, $umask); + } + return $path; + } + + $dir = dirname($path); + if ($recursive && !file_exists($dir)) { + // Note: We could do this with the recursive third parameter of mkdir(), + // but then we loose the helpful FilesystemExceptions we normally get. + self::createDirectory($dir, $umask, true); + } + + self::assertIsDirectory($dir); + self::assertExists($dir); + self::assertWritable($dir); + self::assertNotExists($path); + + if (!mkdir($path, $umask)) { + throw new FilesystemException( + $path, + pht("Failed to create directory '%s'.", $path)); + } + + // Need to change permissions explicitly because mkdir does something + // slightly different. mkdir(2) man page: + // 'The parameter mode specifies the permissions to use. It is modified by + // the process's umask in the usual way: the permissions of the created + // directory are (mode & ~umask & 0777)."' + if ($umask) { + self::changePermissions($path, $umask); + } + + return $path; + } + + + /** + * Create a temporary directory and return the path to it. You are + * responsible for removing it (e.g., with Filesystem::remove()) + * when you are done with it. + * + * @param string Optional directory prefix. + * @param int Permissions to create the directory with. By default, + * these permissions are very restrictive (0700). + * @param string Optional root directory. If not provided, the system + * temporary directory (often "/tmp") will be used. + * @return string Path to newly created temporary directory. + * + * @task directory + */ + public static function createTemporaryDirectory( + $prefix = '', + $umask = 0700, + $root_directory = null) { + $prefix = preg_replace('/[^A-Z0-9._-]+/i', '', $prefix); + + if ($root_directory !== null) { + $tmp = $root_directory; + self::assertExists($tmp); + self::assertIsDirectory($tmp); + self::assertWritable($tmp); + } else { + $tmp = sys_get_temp_dir(); + if (!$tmp) { + throw new FilesystemException( + $tmp, + pht('Unable to determine system temporary directory.')); + } + } + + $base = $tmp.DIRECTORY_SEPARATOR.$prefix; + + $tries = 3; + do { + $dir = $base.substr(base_convert(md5(mt_rand()), 16, 36), 0, 16); + try { + self::createDirectory($dir, $umask); + break; + } catch (FilesystemException $ex) { + // Ignore. + } + } while (--$tries); + + if (!$tries) { + $df = disk_free_space($tmp); + if ($df !== false && $df < 1024 * 1024) { + throw new FilesystemException( + $dir, + pht('Failed to create a temporary directory: the disk is full.')); + } + + throw new FilesystemException( + $dir, + pht("Failed to create a temporary directory in '%s'.", $tmp)); + } + + return $dir; + } + + + /** + * List files in a directory. + * + * @param string Path, absolute or relative to PWD. + * @param bool If false, exclude files beginning with a ".". + * + * @return array List of files and directories in the specified + * directory, excluding `.' and `..'. + * + * @task directory + */ + public static function listDirectory($path, $include_hidden = true) { + $path = self::resolvePath($path); + + self::assertExists($path); + self::assertIsDirectory($path); + self::assertReadable($path); + + $list = @scandir($path); + if ($list === false) { + throw new FilesystemException( + $path, + pht("Unable to list contents of directory '%s'.", $path)); + } + + foreach ($list as $k => $v) { + if ($v == '.' || $v == '..' || (!$include_hidden && $v[0] == '.')) { + unset($list[$k]); + } + } + + return array_values($list); + } + + + /** + * Return all directories between a path and the specified root directory + * (defaulting to "/"). Iterating over them walks from the path to the root. + * + * @param string Path, absolute or relative to PWD. + * @param string The root directory. + * @return list List of parent paths, including the provided path. + * @task directory + */ + public static function walkToRoot($path, $root = null) { + $path = self::resolvePath($path); + + if (is_link($path)) { + $path = realpath($path); + } + + // NOTE: On Windows, paths start like "C:\", so "/" does not contain + // every other path. We could possibly special case "/" to have the same + // meaning on Windows that it does on Linux, but just special case the + // common case for now. See PHI817. + if ($root !== null) { + $root = self::resolvePath($root); + + if (is_link($root)) { + $root = realpath($root); + } + + // NOTE: We don't use `isDescendant()` here because we don't want to + // reject paths which don't exist on disk. + $root_list = new FileList(array($root)); + if (!$root_list->contains($path)) { + return array(); + } + } else { + if (phutil_is_windows()) { + $root = null; + } else { + $root = '/'; + } + } + + $walk = array(); + $parts = explode(DIRECTORY_SEPARATOR, $path); + foreach ($parts as $k => $part) { + if (!strlen($part)) { + unset($parts[$k]); + } + } + + while (true) { + if (phutil_is_windows()) { + $next = implode(DIRECTORY_SEPARATOR, $parts); + } else { + $next = DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $parts); + } + + $walk[] = $next; + if ($next == $root) { + break; + } + + if (!$parts) { + break; + } + + array_pop($parts); + } + + return $walk; + } + + +/* -( Paths )-------------------------------------------------------------- */ + + + /** + * Checks if a path is specified as an absolute path. + * + * @param string + * @return bool + */ + public static function isAbsolutePath($path) { + if (phutil_is_windows()) { + return (bool)preg_match('/^[A-Za-z]+:/', $path); + } else { + return !strncmp($path, DIRECTORY_SEPARATOR, 1); + } + } + + /** + * Canonicalize a path by resolving it relative to some directory (by + * default PWD), following parent symlinks and removing artifacts. If the + * path is itself a symlink it is left unresolved. + * + * @param string Path, absolute or relative to PWD. + * @return string Canonical, absolute path. + * + * @task path + */ + public static function resolvePath($path, $relative_to = null) { + $is_absolute = self::isAbsolutePath($path); + + if (!$is_absolute) { + if (!$relative_to) { + $relative_to = getcwd(); + } + $path = $relative_to.DIRECTORY_SEPARATOR.$path; + } + + if (is_link($path)) { + $parent_realpath = realpath(dirname($path)); + if ($parent_realpath !== false) { + return $parent_realpath.DIRECTORY_SEPARATOR.basename($path); + } + } + + $realpath = realpath($path); + if ($realpath !== false) { + return $realpath; + } + + + // This won't work if the file doesn't exist or is on an unreadable mount + // or something crazy like that. Try to resolve a parent so we at least + // cover the nonexistent file case. + $parts = explode(DIRECTORY_SEPARATOR, trim($path, DIRECTORY_SEPARATOR)); + while (end($parts) !== false) { + array_pop($parts); + if (phutil_is_windows()) { + $attempt = implode(DIRECTORY_SEPARATOR, $parts); + } else { + $attempt = DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $parts); + } + $realpath = realpath($attempt); + if ($realpath !== false) { + $path = $realpath.substr($path, strlen($attempt)); + break; + } + } + + return $path; + } + + /** + * Test whether a path is descendant from some root path after resolving all + * symlinks and removing artifacts. Both paths must exists for the relation + * to obtain. A path is always a descendant of itself as long as it exists. + * + * @param string Child path, absolute or relative to PWD. + * @param string Root path, absolute or relative to PWD. + * @return bool True if resolved child path is in fact a descendant of + * resolved root path and both exist. + * @task path + */ + public static function isDescendant($path, $root) { + try { + self::assertExists($path); + self::assertExists($root); + } catch (FilesystemException $e) { + return false; + } + $fs = new FileList(array($root)); + return $fs->contains($path); + } + + /** + * Convert a canonical path to its most human-readable format. It is + * guaranteed that you can use resolvePath() to restore a path to its + * canonical format. + * + * @param string Path, absolute or relative to PWD. + * @param string Optionally, working directory to make files readable + * relative to. + * @return string Human-readable path. + * + * @task path + */ + public static function readablePath($path, $pwd = null) { + if ($pwd === null) { + $pwd = getcwd(); + } + + foreach (array($pwd, self::resolvePath($pwd)) as $parent) { + $parent = rtrim($parent, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; + $len = strlen($parent); + if (!strncmp($parent, $path, $len)) { + $path = substr($path, $len); + return $path; + } + } + + return $path; + } + + /** + * Determine whether or not a path exists in the filesystem. This differs from + * file_exists() in that it returns true for symlinks. This method does not + * attempt to resolve paths before testing them. + * + * @param string Test for the existence of this path. + * @return bool True if the path exists in the filesystem. + * @task path + */ + public static function pathExists($path) { + return file_exists($path) || is_link($path); + } + + + /** + * Determine if an executable binary (like `git` or `svn`) exists within + * the configured `$PATH`. + * + * @param string Binary name, like `'git'` or `'svn'`. + * @return bool True if the binary exists and is executable. + * @task exec + */ + public static function binaryExists($binary) { + return self::resolveBinary($binary) !== null; + } + + + /** + * Locates the full path that an executable binary (like `git` or `svn`) is at + * the configured `$PATH`. + * + * @param string Binary name, like `'git'` or `'svn'`. + * @return string The full binary path if it is present, or null. + * @task exec + */ + public static function resolveBinary($binary) { + if (phutil_is_windows()) { + list($err, $stdout) = exec_manual('where %s', $binary); + $stdout = phutil_split_lines($stdout); + + // If `where %s` could not find anything, check for relative binary + if ($err) { + $path = self::resolvePath($binary); + if (self::pathExists($path)) { + return $path; + } + return null; + } + $stdout = head($stdout); + } else { + list($err, $stdout) = exec_manual('which %s', $binary); + } + + return $err === 0 ? trim($stdout) : null; + } + + + /** + * Determine if two paths are equivalent by resolving symlinks. This is + * different from resolving both paths and comparing them because + * resolvePath() only resolves symlinks in parent directories, not the + * path itself. + * + * @param string First path to test for equivalence. + * @param string Second path to test for equivalence. + * @return bool True if both paths are equivalent, i.e. reference the same + * entity in the filesystem. + * @task path + */ + public static function pathsAreEquivalent($u, $v) { + $u = self::resolvePath($u); + $v = self::resolvePath($v); + + $real_u = realpath($u); + $real_v = realpath($v); + + if ($real_u) { + $u = $real_u; + } + if ($real_v) { + $v = $real_v; + } + return ($u == $v); + } + + +/* -( Assert )------------------------------------------------------------- */ + + + /** + * Assert that something (e.g., a file, directory, or symlink) exists at a + * specified location. + * + * @param string Assert that this path exists. + * @return void + * + * @task assert + */ + public static function assertExists($path) { + if (!self::pathExists($path)) { + throw new FilesystemException( + $path, + pht("File system entity '%s' does not exist.", $path)); + } + } + + + /** + * Assert that nothing exists at a specified location. + * + * @param string Assert that this path does not exist. + * @return void + * + * @task assert + */ + public static function assertNotExists($path) { + if (file_exists($path) || is_link($path)) { + throw new FilesystemException( + $path, + pht("Path '%s' already exists!", $path)); + } + } + + + /** + * Assert that a path represents a file, strictly (i.e., not a directory). + * + * @param string Assert that this path is a file. + * @return void + * + * @task assert + */ + public static function assertIsFile($path) { + if (!is_file($path)) { + throw new FilesystemException( + $path, + pht("Requested path '%s' is not a file.", $path)); + } + } + + + /** + * Assert that a path represents a directory, strictly (i.e., not a file). + * + * @param string Assert that this path is a directory. + * @return void + * + * @task assert + */ + public static function assertIsDirectory($path) { + if (!is_dir($path)) { + throw new FilesystemException( + $path, + pht("Requested path '%s' is not a directory.", $path)); + } + } + + + /** + * Assert that a file or directory exists and is writable. + * + * @param string Assert that this path is writable. + * @return void + * + * @task assert + */ + public static function assertWritable($path) { + if (!is_writable($path)) { + throw new FilesystemException( + $path, + pht("Requested path '%s' is not writable.", $path)); + } + } + + + /** + * Assert that a file or directory exists and is readable. + * + * @param string Assert that this path is readable. + * @return void + * + * @task assert + */ + public static function assertReadable($path) { + if (!is_readable($path)) { + throw new FilesystemException( + $path, + pht("Path '%s' is not readable.", $path)); + } + } + +} diff --git a/src/filesystem/FilesystemException.php b/src/filesystem/FilesystemException.php new file mode 100644 --- /dev/null +++ b/src/filesystem/FilesystemException.php @@ -0,0 +1,34 @@ +path = $path; + parent::__construct($message); + } + + + /** + * Retrieve the path associated with the exception. Generally, this is + * something like a path that couldn't be read or written, or a path that + * was expected to exist but didn't. + * + * @return string Path associated with the exception. + */ + public function getPath() { + return $this->path; + } + +} diff --git a/src/filesystem/PhutilDeferredLog.php b/src/filesystem/PhutilDeferredLog.php new file mode 100644 --- /dev/null +++ b/src/filesystem/PhutilDeferredLog.php @@ -0,0 +1,246 @@ +setData( + * array( + * 'T' => date('c'), + * 'u' => $username, + * )); + * + * The log will be appended when the object's destructor is called, or when you + * invoke @{method:write}. Note that programs can exit without invoking object + * destructors (e.g., in the case of an unhandled exception, memory exhaustion, + * or SIGKILL) so writes are not guaranteed. You can call @{method:write} to + * force an explicit write to disk before the destructor is called. + * + * Log variables will be written with bytes 0x00-0x1F, 0x7F-0xFF, and backslash + * escaped using C-style escaping. Since this range includes tab, you can use + * tabs as field separators to ensure the file format is easily parsable. In + * PHP, you can decode this encoding with `stripcslashes`. + * + * If a variable is included in the log format but a value is never provided + * with @{method:setData}, it will be written as "-". + * + * @task log Logging + * @task write Writing the Log + * @task internal Internals + */ +final class PhutilDeferredLog extends Phobject { + + private $file; + private $format; + private $data; + private $didWrite; + private $failQuietly; + + +/* -( Logging )------------------------------------------------------------ */ + + + /** + * Create a new log entry, which will be written later. The format string + * should use "%x"-style placeholders to represent data which will be added + * later: + * + * $log = new PhutilDeferredLog('/some/file.log', '[%T] %u'); + * + * @param string|null The file the entry should be written to, or null to + * create a log object which does not write anywhere. + * @param string The log entry format. + * @task log + */ + public function __construct($file, $format) { + $this->file = $file; + $this->format = $format; + $this->data = array(); + $this->didWrite = false; + } + + + /** + * Add data to the log. Provide a map of variables to replace in the format + * string. For example, if you use a format string like: + * + * "[%T]\t%u" + * + * ...you might add data like this: + * + * $log->setData( + * array( + * 'T' => date('c'), + * 'u' => $username, + * )); + * + * When the log is written, the "%T" and "%u" variables will be replaced with + * the values you provide. + * + * @param dict Map of variables to values. + * @return this + * @task log + */ + public function setData(array $map) { + $this->data = $map + $this->data; + return $this; + } + + + /** + * Get existing log data. + * + * @param string Log data key. + * @param wild Default to return if data does not exist. + * @return wild Data, or default if data does not exist. + * @task log + */ + public function getData($key, $default = null) { + return idx($this->data, $key, $default); + } + + + /** + * Set the path where the log will be written. You can pass `null` to prevent + * the log from writing. + * + * NOTE: You can not change the file after the log writes. + * + * @param string|null File where the entry should be written to, or null to + * prevent writes. + * @return this + * @task log + */ + public function setFile($file) { + if ($this->didWrite) { + throw new Exception( + pht('You can not change the logfile after a write has occurred!')); + } + $this->file = $file; + return $this; + } + + public function getFile() { + return $this->file; + } + + + /** + * Set quiet (logged) failure, instead of the default loud (exception) + * failure. Throwing exceptions from destructors which exit at the end of a + * request can result in difficult-to-debug behavior. + */ + public function setFailQuietly($fail_quietly) { + $this->failQuietly = $fail_quietly; + return $this; + } + + +/* -( Writing the Log )---------------------------------------------------- */ + + + /** + * When the log object is destroyed, it writes if it hasn't written yet. + * @task write + */ + public function __destruct() { + $this->write(); + } + + + /** + * Write the log explicitly, if it hasn't been written yet. Normally you do + * not need to call this method; it will be called when the log object is + * destroyed. However, you can explicitly force the write earlier by calling + * this method. + * + * A log object will never write more than once, so it is safe to call this + * method even if the object's destructor later runs. + * + * @return this + * @task write + */ + public function write() { + if ($this->didWrite) { + return $this; + } + + // Even if we aren't going to write, format the line to catch any errors + // and invoke possible __toString() calls. + $line = $this->format(); + + try { + if ($this->file !== null) { + $dir = dirname($this->file); + if (!Filesystem::pathExists($dir)) { + Filesystem::createDirectory($dir, 0755, true); + } + + $ok = @file_put_contents( + $this->file, + $line, + FILE_APPEND | LOCK_EX); + + if ($ok === false) { + throw new Exception( + pht( + 'Unable to write to logfile "%s"!', + $this->file)); + } + } + } catch (Exception $ex) { + if ($this->failQuietly) { + phlog($ex); + } else { + throw $ex; + } + } + + $this->didWrite = true; + return $this; + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * Format the log string, replacing "%x" variables with values. + * + * @return string Finalized, log string for writing to disk. + * @task internals + */ + private function format() { + + // Always convert '%%' to literal '%'. + $map = array('%' => '%') + $this->data; + + $result = ''; + $saw_percent = false; + foreach (phutil_utf8v($this->format) as $c) { + if ($saw_percent) { + $saw_percent = false; + if (array_key_exists($c, $map)) { + $result .= addcslashes($map[$c], "\0..\37\\\177..\377"); + } else { + $result .= '-'; + } + } else if ($c == '%') { + $saw_percent = true; + } else { + $result .= $c; + } + } + + return rtrim($result)."\n"; + } + +} diff --git a/src/filesystem/PhutilDirectoryFixture.php b/src/filesystem/PhutilDirectoryFixture.php new file mode 100644 --- /dev/null +++ b/src/filesystem/PhutilDirectoryFixture.php @@ -0,0 +1,50 @@ +getPath(), + Filesystem::resolvePath($archive)); + return $obj; + } + + public static function newEmptyFixture() { + $obj = new PhutilDirectoryFixture(); + $obj->path = Filesystem::createTemporaryDirectory(); + return $obj; + } + + private function __construct() { + // + } + + public function __destruct() { + Filesystem::remove($this->path); + } + + public function getPath($to_file = null) { + return $this->path.'/'.ltrim($to_file, '/'); + } + + public function saveToArchive($path) { + $tmp = new TempFile(); + + execx( + 'tar -C %s -czvvf %s .', + $this->getPath(), + $tmp); + + $ok = rename($tmp, Filesystem::resolvePath($path)); + if (!$ok) { + throw new FilesystemException($path, pht('Failed to overwrite file.')); + } + + return $this; + } + +} diff --git a/src/filesystem/PhutilFileLock.php b/src/filesystem/PhutilFileLock.php new file mode 100644 --- /dev/null +++ b/src/filesystem/PhutilFileLock.php @@ -0,0 +1,119 @@ +lock(); + * + * do_contentious_things(); + * + * $lock->unlock(); + * + * For more information on locks, see @{class:PhutilLock}. + * + * @task construct Constructing Locks + * @task impl Implementation + */ +final class PhutilFileLock extends PhutilLock { + + private $lockfile; + private $handle; + + +/* -( Constructing Locks )------------------------------------------------- */ + + + /** + * Create a new lock on a lockfile. The file need not exist yet. + * + * @param string The lockfile to use. + * @return PhutilFileLock New lock object. + * + * @task construct + */ + public static function newForPath($lockfile) { + $lockfile = Filesystem::resolvePath($lockfile); + + $name = 'file:'.$lockfile; + $lock = self::getLock($name); + if (!$lock) { + $lock = new PhutilFileLock($name); + $lock->lockfile = $lockfile; + self::registerLock($lock); + } + + return $lock; + } + +/* -( Locking )------------------------------------------------------------ */ + + + /** + * Acquire the lock. If lock acquisition fails because the lock is held by + * another process, throws @{class:PhutilLockException}. Other exceptions + * indicate that lock acquisition has failed for reasons unrelated to locking. + * + * If the lock is already held, this method throws. You can test the lock + * status with @{method:isLocked}. + * + * @param float Seconds to block waiting for the lock. + * @return void + * + * @task lock + */ + protected function doLock($wait) { + $path = $this->lockfile; + + $handle = @fopen($path, 'a+'); + if (!$handle) { + throw new FilesystemException( + $path, + pht("Unable to open lock '%s' for writing!", $path)); + } + + $start_time = microtime(true); + do { + $would_block = null; + $ok = flock($handle, LOCK_EX | LOCK_NB, $would_block); + if ($ok) { + break; + } else { + usleep(10000); + } + } while ($wait && $wait > (microtime(true) - $start_time)); + + if (!$ok) { + fclose($handle); + throw new PhutilLockException($this->getName()); + } + + $this->handle = $handle; + } + + + /** + * Release the lock. Throws an exception on failure, e.g. if the lock is not + * currently held. + * + * @return void + * + * @task lock + */ + protected function doUnlock() { + $ok = flock($this->handle, LOCK_UN | LOCK_NB); + if (!$ok) { + throw new Exception(pht('Unable to unlock file!')); + } + + $ok = fclose($this->handle); + if (!$ok) { + throw new Exception(pht('Unable to close file!')); + } + + $this->handle = null; + } + +} diff --git a/src/filesystem/PhutilFileTree.php b/src/filesystem/PhutilFileTree.php new file mode 100644 --- /dev/null +++ b/src/filesystem/PhutilFileTree.php @@ -0,0 +1,112 @@ +splitPath($path); + $parts = array_reverse($parts); + $this->insertPath($parts, $data); + return $this; + } + + public function destroy() { + $this->parentNode = null; + foreach ($this->children as $child) { + $child->destroy(); + } + $this->children = array(); + return $this; + } + + /** + * Get the next node, iterating in depth-first order. + */ + public function getNextNode() { + if ($this->children) { + return head($this->children); + } + $cursor = $this; + while ($cursor) { + if ($cursor->getNextSibling()) { + return $cursor->getNextSibling(); + } + $cursor = $cursor->parentNode; + } + return null; + } + + public function getName() { + return $this->name; + } + + public function getFullPath() { + return $this->fullPath; + } + + public function getDepth() { + return $this->depth; + } + + public function getData() { + return $this->data; + } + + protected function insertPath(array $parts, $data) { + $part = array_pop($parts); + if ($part === null) { + if ($this->data) { + $full_path = $this->getFullPath(); + throw new Exception( + pht("Duplicate insertion for path '%s'.", $full_path)); + } + $this->data = $data; + return; + } + + if (empty($this->children[$part])) { + $node = new PhutilFileTree(); + $node->parentNode = $this; + $node->depth = $this->depth + 1; + $node->name = $part; + $node->fullPath = $this->parentNode ? ($this->fullPath.'/'.$part) : $part; + $this->children[$part] = $node; + } + + $this->children[$part]->insertPath($parts, $data); + } + + protected function splitPath($path) { + $path = trim($path, '/'); + $parts = preg_split('@/+@', $path); + return $parts; + } + + protected function getNextSibling() { + if (!$this->parentNode) { + return null; + } + + $found = false; + foreach ($this->parentNode->children as $node) { + if ($found) { + return $node; + } + if ($this->name === $node->name) { + $found = true; + } + } + + return null; + } + +} diff --git a/src/filesystem/PhutilLock.php b/src/filesystem/PhutilLock.php new file mode 100644 --- /dev/null +++ b/src/filesystem/PhutilLock.php @@ -0,0 +1,235 @@ +lock(); + * do_contentious_things(); + * $lock->unlock(); + * + * If the lock can't be acquired because it is already held, + * @{class:PhutilLockException} is thrown. Other exceptions indicate + * permanent failure unrelated to locking. + * + * When extending this class, you should call @{method:getLock} to look up + * an existing lock object, and @{method:registerLock} when objects are + * constructed to register for automatic unlock on shutdown. + * + * @task impl Lock Implementation + * @task registry Lock Registry + * @task construct Constructing Locks + * @task status Determining Lock Status + * @task lock Locking + * @task internal Internals + */ +abstract class PhutilLock extends Phobject { + + private static $registeredShutdownFunction = false; + private static $locks = array(); + + private $locked = false; + private $profilerID; + private $name; + +/* -( Constructing Locks )------------------------------------------------- */ + + + /** + * Build a new lock, given a lock name. The name should be globally unique + * across all locks. + * + * @param string Globally unique lock name. + * @task construct + */ + protected function __construct($name) { + $this->name = $name; + } + + +/* -( Lock Implementation )------------------------------------------------ */ + + + /** + * Acquires the lock, or throws @{class:PhutilLockException} if it fails. + * + * @param float Seconds to block waiting for the lock. + * @return void + * @task impl + */ + abstract protected function doLock($wait); + + + /** + * Releases the lock. + * + * @return void + * @task impl + */ + abstract protected function doUnlock(); + + +/* -( Lock Registry )------------------------------------------------------ */ + + + /** + * Returns a globally unique name for this lock. + * + * @return string Globally unique lock name, across all locks. + * @task registry + */ + final public function getName() { + return $this->name; + } + + + /** + * Get a named lock, if it has been registered. + * + * @param string Lock name. + * @task registry + */ + protected static function getLock($name) { + return idx(self::$locks, $name); + } + + + /** + * Register a lock for cleanup when the process exits. + * + * @param PhutilLock Lock to register. + * @task registry + */ + protected static function registerLock(PhutilLock $lock) { + if (!self::$registeredShutdownFunction) { + register_shutdown_function(array(__CLASS__, 'unlockAll')); + self::$registeredShutdownFunction = true; + } + + $name = $lock->getName(); + if (self::getLock($name)) { + throw new Exception( + pht("Lock '%s' is already registered!", $name)); + } + + self::$locks[$name] = $lock; + } + + +/* -( Determining Lock Status )-------------------------------------------- */ + + + /** + * Determine if the lock is currently held. + * + * @return bool True if the lock is held. + * + * @task status + */ + final public function isLocked() { + return $this->locked; + } + + +/* -( Locking )------------------------------------------------------------ */ + + + /** + * Acquire the lock. If lock acquisition fails because the lock is held by + * another process, throws @{class:PhutilLockException}. Other exceptions + * indicate that lock acquisition has failed for reasons unrelated to locking. + * + * If the lock is already held by this process, this method throws. You can + * test the lock status with @{method:isLocked}. + * + * @param float Seconds to block waiting for the lock. By default, do not + * block. + * @return this + * + * @task lock + */ + final public function lock($wait = 0) { + if ($this->locked) { + $name = $this->getName(); + throw new Exception( + pht("Lock '%s' has already been locked by this process.", $name)); + } + + $profiler = PhutilServiceProfiler::getInstance(); + $profiler_id = $profiler->beginServiceCall( + array( + 'type' => 'lock', + 'name' => $this->getName(), + )); + + try { + $this->doLock((float)$wait); + } catch (Exception $ex) { + $profiler->endServiceCall( + $profiler_id, + array( + 'lock' => false, + )); + throw $ex; + } + + $this->profilerID = $profiler_id; + $this->locked = true; + + return $this; + } + + + /** + * Release the lock. Throws an exception on failure, e.g. if the lock is not + * currently held. + * + * @return this + * + * @task lock + */ + final public function unlock() { + if (!$this->locked) { + $name = $this->getName(); + throw new Exception( + pht("Lock '%s is not locked by this process!", $name)); + } + + $this->doUnlock(); + + $profiler = PhutilServiceProfiler::getInstance(); + $profiler->endServiceCall( + $this->profilerID, + array( + 'lock' => true, + )); + + $this->profilerID = null; + $this->locked = false; + + return $this; + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * On shutdown, we release all the locks. You should not call this method + * directly. Use @{method:unlock} to release individual locks. + * + * @return void + * + * @task internal + */ + public static function unlockAll() { + foreach (self::$locks as $key => $lock) { + if ($lock->locked) { + $lock->unlock(); + } + } + } + +} diff --git a/src/filesystem/PhutilLockException.php b/src/filesystem/PhutilLockException.php new file mode 100644 --- /dev/null +++ b/src/filesystem/PhutilLockException.php @@ -0,0 +1,3 @@ +dir = Filesystem::createTemporaryDirectory( + '', + 0700, + $root_directory); + if ($filename === null) { + $this->file = tempnam($this->dir, getmypid().'-'); + } else { + $this->file = $this->dir.'/'.$filename; + } + + // If we fatal (e.g., call a method on NULL), destructors are not called. + // Make sure our destructor is invoked. + register_shutdown_function(array($this, '__destruct')); + + Filesystem::writeFile($this, ''); + } + + +/* -( Configuration )------------------------------------------------------ */ + + + /** + * Normally, the file is deleted when this object passes out of scope. You + * can set it to be preserved instead. + * + * @param bool True to preserve the file after object destruction. + * @return this + * @task config + */ + public function setPreserveFile($preserve) { + $this->preserve = $preserve; + return $this; + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * Get the path to the temporary file. Normally you can just use the object + * in a string context. + * + * @return string Absolute path to the temporary file. + * @task internal + */ + public function __toString() { + return $this->file; + } + + + /** + * When the object is destroyed, it destroys the temporary file. You can + * change this behavior with @{method:setPreserveFile}. + * + * @task internal + */ + public function __destruct() { + if ($this->destroyed) { + return; + } + + if ($this->preserve) { + return; + } + + Filesystem::remove($this->dir); + + // NOTE: tempnam() doesn't guarantee it will return a file inside the + // directory you passed to the function, so we make sure to nuke the file + // explicitly. + + Filesystem::remove($this->file); + + $this->file = null; + $this->dir = null; + $this->destroyed = true; + } + +} diff --git a/src/filesystem/__tests__/FileFinderTestCase.php b/src/filesystem/__tests__/FileFinderTestCase.php new file mode 100644 --- /dev/null +++ b/src/filesystem/__tests__/FileFinderTestCase.php @@ -0,0 +1,232 @@ +excludePath('./exclude') + ->excludePath('subdir.txt'); + } + + public function testFinderWithChecksums() { + $this->assertFinder( + pht('Basic Checksums'), + $this->newFinder() + ->setGenerateChecksums(true) + ->withType('f') + ->withPath('*') + ->withSuffix('txt'), + array( + '.hidden.txt' => + 'b6cfc9ce9afe12b258ee1c19c235aa27', + 'file.txt' => + '725130ba6441eadb4e5d807898e0beae', + 'include_dir.txt/anotherfile.txt' => + '91e5c1ad76ff229c6456ac92e74e1d9f', + 'include_dir.txt/subdir.txt/alsoinclude.txt' => + '91e5c1ad76ff229c6456ac92e74e1d9f', + 'test.txt' => + 'aea46212fa8b8d0e0e6aa34a15c9e2f5', + )); + } + + public function testFinderWithoutChecksums() { + $this->assertFinder( + pht('Basic No Checksums'), + $this->newFinder() + ->withType('f') + ->withPath('*') + ->withSuffix('txt'), + array( + '.hidden.txt', + 'file.txt', + 'include_dir.txt/anotherfile.txt', + 'include_dir.txt/subdir.txt/alsoinclude.txt', + 'test.txt', + )); + } + + public function testFinderWithFilesAndDirectories() { + $this->assertFinder( + pht('With Files And Directories'), + $this->newFinder() + ->setGenerateChecksums(true) + ->withPath('*') + ->withSuffix('txt'), + array( + '.hidden.txt' => + 'b6cfc9ce9afe12b258ee1c19c235aa27', + 'file.txt' => + '725130ba6441eadb4e5d807898e0beae', + 'include_dir.txt' => null, + 'include_dir.txt/anotherfile.txt' => + '91e5c1ad76ff229c6456ac92e74e1d9f', + 'include_dir.txt/subdir.txt' => null, + 'include_dir.txt/subdir.txt/alsoinclude.txt' => + '91e5c1ad76ff229c6456ac92e74e1d9f', + 'test.txt' => + 'aea46212fa8b8d0e0e6aa34a15c9e2f5', + )); + } + + public function testFinderWithDirectories() { + $this->assertFinder( + pht('Just Directories'), + $this->newFinder() + ->withType('d'), + array( + 'include_dir.txt', + 'include_dir.txt/subdir.txt', + )); + } + + public function testFinderWithPath() { + $this->assertFinder( + pht('With Path'), + $this->newFinder() + ->setGenerateChecksums(true) + ->withType('f') + ->withPath('*/include_dir.txt/subdir.txt/alsoinclude.txt') + ->withSuffix('txt'), + array( + 'include_dir.txt/subdir.txt/alsoinclude.txt' => + '91e5c1ad76ff229c6456ac92e74e1d9f', + )); + } + + public function testFinderWithNames() { + $this->assertFinder( + pht('With Names'), + $this->newFinder() + ->withType('f') + ->withPath('*') + ->withName('test'), + array( + 'include_dir.txt/subdir.txt/test', + 'include_dir.txt/test', + 'test', + )); + } + + public function testFinderWithNameAndSuffix() { + $this->assertFinder( + pht('With Name and Suffix'), + $this->newFinder() + ->withType('f') + ->withName('alsoinclude.txt') + ->withSuffix('txt'), + array( + 'include_dir.txt/subdir.txt/alsoinclude.txt', + )); + } + + public function testFinderWithGlobMagic() { + // Fill a temporary directory with all this magic garbage so we don't have + // to check a bunch of files with backslashes in their names into version + // control. + $tmp_dir = Filesystem::createTemporaryDirectory(); + + $crazy_magic = array( + 'backslash\\.\\*', + 'star-*.*', + 'star-*.txt', + 'star.t*t', + 'star.tesseract', + ); + + foreach ($crazy_magic as $sketchy_path) { + Filesystem::writeFile($tmp_dir.'/'.$sketchy_path, '.'); + } + + $this->assertFinder( + pht('Glob Magic, Literal .t*t'), + $this->newFinder($tmp_dir) + ->withType('f') + ->withSuffix('t*t'), + array( + 'star.t*t', + )); + + $this->assertFinder( + pht('Glob Magic, .tesseract'), + $this->newFinder($tmp_dir) + ->withType('f') + ->withSuffix('tesseract'), + array( + 'star.tesseract', + )); + + $this->assertFinder( + pht('Glob Magic, Name'), + $this->newFinder($tmp_dir) + ->withType('f') + ->withName('star-*'), + array()); + + $this->assertFinder( + pht('Glob Magic, Name + Suffix'), + $this->newFinder($tmp_dir) + ->withType('f') + ->withName('star-*.*'), + array( + 'star-*.*', + )); + + $this->assertFinder( + pht('Glob Magic, Backslash Suffix'), + $this->newFinder($tmp_dir) + ->withType('f') + ->withSuffix('\\*'), + array( + 'backslash\\.\\*', + )); + + $this->assertFinder( + pht('Glob Magic, With Globs'), + $this->newFinder($tmp_dir) + ->withType('f') + ->withNameGlob('star-*'), + array( + 'star-*.*', + 'star-*.txt', + )); + + $this->assertFinder( + pht('Glob Magic, With Globs + Suffix'), + $this->newFinder($tmp_dir) + ->withType('f') + ->withNameGlob('star-*') + ->withSuffix('txt'), + array( + 'star-*.txt', + )); + } + + private function assertFinder($label, FileFinder $finder, $expect) { + $modes = array( + 'php', + 'shell', + ); + foreach ($modes as $mode) { + $actual = id(clone $finder) + ->setForceMode($mode) + ->find(); + + if ($finder->getGenerateChecksums()) { + ksort($actual); + } else { + sort($actual); + } + + $this->assertEqual( + $expect, + $actual, + pht('Test Case "%s" in Mode "%s"', $label, $mode)); + } + } + +} diff --git a/src/filesystem/__tests__/FilesystemTestCase.php b/src/filesystem/__tests__/FilesystemTestCase.php new file mode 100644 --- /dev/null +++ b/src/filesystem/__tests__/FilesystemTestCase.php @@ -0,0 +1,178 @@ +assertEqual( + true, + Filesystem::binaryExists($exists)); + + // We don't expect to find this binary on any system. + + $this->assertEqual( + false, + Filesystem::binaryExists('halting-problem-decider')); + } + + public function testResolveBinary() { + // Test to make sure resolveBinary() returns the full path to the `which` + // and `where` binaries. + + if (phutil_is_windows()) { + $binary = 'where'; + } else { + $binary = 'which'; + } + + $path = Filesystem::resolveBinary($binary); + $this->assertFalse(null === $path); + $this->assertTrue(file_exists($path)); + $this->assertFalse(is_dir($path)); + + $this->assertEqual(null, + Filesystem::resolveBinary('halting-problem-decider')); + } + + public function testWriteUniqueFile() { + $tmp = new TempFile(); + $dir = dirname($tmp); + + // Writing an empty file should work. + $f = Filesystem::writeUniqueFile($dir, ''); + $this->assertEqual('', Filesystem::readFile($f)); + + // File name should be unique. + $g = Filesystem::writeUniqueFile($dir, 'quack'); + $this->assertTrue($f != $g); + } + + public function testReadRandomBytes() { + $number_of_bytes = 1024; + $data = Filesystem::readRandomBytes($number_of_bytes); + $this->assertTrue(strlen($data) == $number_of_bytes); + + $data1 = Filesystem::readRandomBytes(128); + $data2 = Filesystem::readRandomBytes(128); + $this->assertFalse($data1 == $data2); + + $caught = null; + try { + Filesystem::readRandomBytes(0); + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof Exception); + } + + public function testWalkToRoot() { + $test_cases = array( + array( + dirname(__FILE__).'/data/include_dir.txt/subdir.txt/test', + dirname(__FILE__), + array( + dirname(__FILE__).'/data/include_dir.txt/subdir.txt/test', + dirname(__FILE__).'/data/include_dir.txt/subdir.txt', + dirname(__FILE__).'/data/include_dir.txt', + dirname(__FILE__).'/data', + dirname(__FILE__), + ), + ), + array( + dirname(__FILE__).'/data/include_dir.txt/subdir.txt', + dirname(__FILE__), + array( + dirname(__FILE__).'/data/include_dir.txt/subdir.txt', + dirname(__FILE__).'/data/include_dir.txt', + dirname(__FILE__).'/data', + dirname(__FILE__), + ), + ), + + 'root and path are identical' => array( + dirname(__FILE__), + dirname(__FILE__), + array( + dirname(__FILE__), + ), + ), + + 'root is not an ancestor of path' => array( + dirname(__FILE__), + dirname(__FILE__).'/data/include_dir.txt/subdir.txt', + array(), + ), + + 'fictional paths work' => array( + '/x/y/z', + '/', + array( + '/x/y/z', + '/x/y', + '/x', + '/', + ), + ), + + ); + + foreach ($test_cases as $test_case) { + list($path, $root, $expected) = $test_case; + + $this->assertEqual( + $expected, + Filesystem::walkToRoot($path, $root)); + } + } + + public function testisDescendant() { + $test_cases = array( + array( + __FILE__, + dirname(__FILE__), + true, + ), + array( + dirname(__FILE__), + dirname(dirname(__FILE__)), + true, + ), + array( + dirname(__FILE__), + phutil_get_library_root_for_path(__FILE__), + true, + ), + array( + dirname(dirname(__FILE__)), + dirname(__FILE__), + false, + ), + array( + dirname(__FILE__).'/quack', + dirname(__FILE__), + false, + ), + ); + + foreach ($test_cases as $test_case) { + list($path, $root, $expected) = $test_case; + + $this->assertEqual( + $expected, + Filesystem::isDescendant($path, $root), + sprintf( + 'Filesystem::isDescendant(%s, %s)', + phutil_var_export($path), + phutil_var_export($root))); + } + } + +} diff --git a/src/filesystem/__tests__/PhutilDeferredLogTestCase.php b/src/filesystem/__tests__/PhutilDeferredLogTestCase.php new file mode 100644 --- /dev/null +++ b/src/filesystem/__tests__/PhutilDeferredLogTestCase.php @@ -0,0 +1,169 @@ +checkLog( + "derp\n", + 'derp', + array()); + + $this->checkLog( + "[20 Aug 1984] alincoln\n", + '[%T] %u', + array( + 'T' => '20 Aug 1984', + 'u' => 'alincoln', + )); + + $this->checkLog( + "%%%%%\n", + '%%%%%%%%%%', + array( + '%' => '%', + )); + + $this->checkLog( + "\\000\\001\\002\n", + '%a%b%c', + array( + 'a' => chr(0), + 'b' => chr(1), + 'c' => chr(2), + )); + + $this->checkLog( + "Download: 100%\n", + 'Download: %C', + array( + 'C' => '100%', + )); + + $this->checkLog( + "- bee -\n", + '%a %b %c', + array( + 'b' => 'bee', + )); + + $this->checkLog( + "\\\\\n", + '%b', + array( + 'b' => '\\', + )); + + $this->checkLog( + "a\t\\t\n", + "%a\t%b", + array( + 'a' => 'a', + 'b' => "\t", + )); + + $this->checkLog( + "\1ab\n", + "\1a%a", + array( + 'a' => 'b', + )); + + $this->checkLog( + "a % xb\n", + '%a %% x%b', + array( + 'a' => 'a', + 'b' => 'b', + )); + } + + public function testLogWriteFailure() { + $caught = null; + try { + if (phutil_is_hiphop_runtime()) { + // In HipHop exceptions thrown in destructors are not normally + // catchable, so call __destruct() explicitly. + $log = new PhutilDeferredLog('/derp/derp/derp/derp/derp', 'derp'); + $log->__destruct(); + } else { + new PhutilDeferredLog('/derp/derp/derp/derp/derp', 'derp'); + } + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof Exception); + } + + public function testManyWriters() { + $root = phutil_get_library_root('phutil').'/../'; + $bin = $root.'scripts/test/deferred_log.php'; + + $n_writers = 3; + $n_lines = 8; + + $tmp = new TempFile(); + + $futures = array(); + for ($ii = 0; $ii < $n_writers; $ii++) { + $futures[] = new ExecFuture('%s %d %s', $bin, $n_lines, (string)$tmp); + } + + id(new FutureIterator($futures)) + ->resolveAll(); + + $this->assertEqual( + str_repeat("abcdefghijklmnopqrstuvwxyz\n", $n_writers * $n_lines), + Filesystem::readFile($tmp)); + } + + public function testNoWrite() { + $tmp = new TempFile(); + + $log = new PhutilDeferredLog($tmp, 'xyz'); + $log->setFile(null); + unset($log); + + $this->assertEqual('', Filesystem::readFile($tmp), pht('No Write')); + } + + public function testDoubleWrite() { + $tmp = new TempFile(); + + $log = new PhutilDeferredLog($tmp, 'xyz'); + $log->write(); + $log->write(); + unset($log); + + $this->assertEqual( + "xyz\n", + Filesystem::readFile($tmp), pht('Double Write')); + } + + public function testSetAfterWrite() { + $tmp1 = new TempFile(); + $tmp2 = new TempFile(); + + $log = new PhutilDeferredLog($tmp1, 'xyz'); + $log->write(); + + $caught = null; + try { + $log->setFile($tmp2); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception, pht('Set After Write')); + } + + private function checkLog($expect, $format, $data) { + $tmp = new TempFile(); + + $log = new PhutilDeferredLog($tmp, $format); + $log->setData($data); + unset($log); + + $this->assertEqual($expect, Filesystem::readFile($tmp), $format); + } + +} diff --git a/src/filesystem/__tests__/PhutilFileLockTestCase.php b/src/filesystem/__tests__/PhutilFileLockTestCase.php new file mode 100644 --- /dev/null +++ b/src/filesystem/__tests__/PhutilFileLockTestCase.php @@ -0,0 +1,184 @@ +assertTrue($this->lockTest($file)); + + $this->assertTrue($this->lockTest($file)); + } + + public function testLockHolding() { + // When a process is holding a lock, other processes should be unable + // to acquire it. + + $file = new TempFile(); + $hold = $this->holdLock($file); + + $this->assertFalse($this->lockTest($file)); + + $hold->resolveKill(); + + $this->assertTrue($this->lockTest($file)); + } + + public function testInProcessLocking() { + // Other processes should be unable to lock a file if we hold the lock. + + $file = new TempFile(); + + $lock = PhutilFileLock::newForPath($file); + $lock->lock(); + + $this->assertFalse($this->lockTest($file)); + + $lock->unlock(); + + $this->assertTrue($this->lockTest($file)); + } + + public function testInProcessHolding() { + // We should be unable to lock a file if another process is holding the + // lock. + + $file = new TempFile(); + $lock = PhutilFileLock::newForPath($file); + + $hold = $this->holdLock($file); + $caught = null; + try { + $lock->lock(); + } catch (PhutilLockException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof PhutilLockException); + + $hold->resolveKill(); + + $this->assertTrue($this->lockTest($file)); + + $lock->lock(); + $lock->unlock(); + } + + public function testRelock() { + // Trying to lock a file twice should throw an exception. + + $file = new TempFile(); + $lock = PhutilFileLock::newForPath($file); + $lock->lock(); + + $caught = null; + try { + $lock->lock(); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testExcessiveUnlock() { + // Trying to unlock a file twice should throw an exception. + + $file = new TempFile(); + $lock = PhutilFileLock::newForPath($file); + $lock->lock(); + + $lock->unlock(); + + $caught = null; + try { + $lock->unlock(); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testUnlockAll() { + // unlockAll() should release all locks. + + $file = new TempFile(); + $lock = PhutilFileLock::newForPath($file); + + $lock->lock(); + + $this->assertFalse($this->lockTest($file)); + + PhutilFileLock::unlockAll(); + + $this->assertTrue($this->lockTest($file)); + + // Calling this again shouldn't do anything bad. + PhutilFileLock::unlockAll(); + + $this->assertTrue($this->lockTest($file)); + + $lock->lock(); + $lock->unlock(); + } + + public function testIsLocked() { + // isLocked() should report lock status accurately. + + $file = new TempFile(); + $lock = PhutilFileLock::newForPath($file); + + $this->assertFalse($lock->isLocked()); + + $lock->lock(); + + $this->assertTrue($lock->isLocked()); + + $lock->unlock(); + + $this->assertFalse($lock->isLocked()); + } + + private function lockTest($file) { + list($err) = $this->buildLockFuture('--test', $file)->resolve(); + return ($err == 0); + } + + private function holdLock($file) { + $future = $this->buildLockFuture('--hold', $file); + + // We can't return until we're sure the subprocess has had time to acquire + // the lock. Since actually testing for the lock would be kind of silly + // and guarantee that we loop forever if the locking primitive broke, + // watch stdout for a *claim* that it has acquired the lock instead. + + // Make sure we don't loop forever, no matter how bad things get. + $future->setTimeout(30); + + $buf = ''; + while (!$future->isReady()) { + list($stdout) = $future->read(); + $buf .= $stdout; + if (strpos($buf, 'LOCK ACQUIRED') !== false) { + return $future; + } + } + + throw new Exception(pht('Unable to hold lock in external process!')); + } + + private function buildLockFuture($flags, $file) { + $root = dirname(phutil_get_library_root('phutil')); + $bin = $root.'/scripts/utils/lock.php'; + + // NOTE: Use `exec` so this passes on Ubuntu, where the default `dash` shell + // will eat any kills we send during the tests. + $future = new ExecFuture('exec php %s %C %s', $bin, $flags, $file); + $future->start(); + return $future; + } + +} diff --git a/src/filesystem/__tests__/data/.hidden.txt b/src/filesystem/__tests__/data/.hidden.txt new file mode 100644 --- /dev/null +++ b/src/filesystem/__tests__/data/.hidden.txt @@ -0,0 +1 @@ +Hidden included file diff --git a/src/filesystem/__tests__/data/exclude/file.txt b/src/filesystem/__tests__/data/exclude/file.txt new file mode 100644 --- /dev/null +++ b/src/filesystem/__tests__/data/exclude/file.txt @@ -0,0 +1 @@ +This file is excluded. diff --git a/src/filesystem/__tests__/data/exclude/test b/src/filesystem/__tests__/data/exclude/test new file mode 100644 --- /dev/null +++ b/src/filesystem/__tests__/data/exclude/test @@ -0,0 +1 @@ +Test file. diff --git a/src/filesystem/__tests__/data/file.txt b/src/filesystem/__tests__/data/file.txt new file mode 100644 --- /dev/null +++ b/src/filesystem/__tests__/data/file.txt @@ -0,0 +1 @@ +Included file. diff --git a/src/filesystem/__tests__/data/include_dir.txt/anotherfile.txt b/src/filesystem/__tests__/data/include_dir.txt/anotherfile.txt new file mode 100644 --- /dev/null +++ b/src/filesystem/__tests__/data/include_dir.txt/anotherfile.txt @@ -0,0 +1 @@ +Also included. diff --git a/src/filesystem/__tests__/data/include_dir.txt/subdir.txt/alsoinclude.txt b/src/filesystem/__tests__/data/include_dir.txt/subdir.txt/alsoinclude.txt new file mode 100644 --- /dev/null +++ b/src/filesystem/__tests__/data/include_dir.txt/subdir.txt/alsoinclude.txt @@ -0,0 +1 @@ +Also included. diff --git a/src/filesystem/__tests__/data/include_dir.txt/subdir.txt/test b/src/filesystem/__tests__/data/include_dir.txt/subdir.txt/test new file mode 100644 --- /dev/null +++ b/src/filesystem/__tests__/data/include_dir.txt/subdir.txt/test @@ -0,0 +1 @@ +Test file. diff --git a/src/filesystem/__tests__/data/include_dir.txt/test b/src/filesystem/__tests__/data/include_dir.txt/test new file mode 100644 --- /dev/null +++ b/src/filesystem/__tests__/data/include_dir.txt/test @@ -0,0 +1 @@ +Test file. diff --git a/src/filesystem/__tests__/data/test b/src/filesystem/__tests__/data/test new file mode 100644 --- /dev/null +++ b/src/filesystem/__tests__/data/test @@ -0,0 +1 @@ +Test file. diff --git a/src/filesystem/__tests__/data/test.txt b/src/filesystem/__tests__/data/test.txt new file mode 100644 --- /dev/null +++ b/src/filesystem/__tests__/data/test.txt @@ -0,0 +1 @@ +Test file. diff --git a/src/filesystem/binary/PhutilBinaryAnalyzer.php b/src/filesystem/binary/PhutilBinaryAnalyzer.php new file mode 100644 --- /dev/null +++ b/src/filesystem/binary/PhutilBinaryAnalyzer.php @@ -0,0 +1,67 @@ +getBinaryKey(); + } + + public function getBinaryKey() { + return $this->getPhobjectClassConstant('BINARY'); + } + + public function isBinaryAvailable() { + return Filesystem::binaryExists($this->getBinaryName()); + } + + abstract protected function newBinaryVersion(); + + protected function newBinaryPath() { + return Filesystem::resolveBinary($this->getBinaryName()); + } + + final public function getBinaryVersion() { + return $this->newBinaryVersion(); + } + + final public function requireBinaryVersion() { + $version = $this->getBinaryVersion(); + $binary = $this->getBinaryName(); + if ($version === null) { + throw new Exception( + pht( + 'Unable to determine the installed version of binary "%s". This '. + 'version is required.', + $binary)); + } + return $version; + } + + final public function getBinaryPath() { + return $this->newBinaryPath(); + } + + final public static function getAllBinaries() { + return id(new PhutilClassMapQuery()) + ->setAncestorClass(__CLASS__) + ->setUniqueMethod('getBinaryKey') + ->setSortMethod('getBinaryName') + ->execute(); + } + + final public static function getForBinary($binary) { + $map = self::getAllBinaries(); + + $analyzer = idx($map, $binary); + if (!$analyzer) { + throw new Exception( + pht( + 'No analyzer is available for binary "%s".', + $binary)); + } + + return $analyzer; + } + +} diff --git a/src/filesystem/binary/PhutilDiffBinaryAnalyzer.php b/src/filesystem/binary/PhutilDiffBinaryAnalyzer.php new file mode 100644 --- /dev/null +++ b/src/filesystem/binary/PhutilDiffBinaryAnalyzer.php @@ -0,0 +1,31 @@ +setEnv( + array( + 'HGPLAIN' => 1, + )); + + list($err, $stdout) = $future->resolve(); + + if ($err) { + return null; + } + + return self::parseMercurialBinaryVersion($stdout); + } + + public static function parseMercurialBinaryVersion($stdout) { + // NOTE: At least on OSX, recent versions of Mercurial report this + // string in this format: + // + // Mercurial Distributed SCM (version 3.1.1+20140916) + + $matches = null; + $pattern = '/^Mercurial Distributed SCM \(version ([\d.]+)/m'; + if (preg_match($pattern, $stdout, $matches)) { + return $matches[1]; + } + + return null; + } + + /** + * The `locate` command is deprecated as of Mercurial 3.2, to be replaced + * with `files` command, which supports most of the same arguments. This + * determines whether the new `files` command should be used instead of + * the `locate` command. + * + * @return boolean True if the version of Mercurial is new enough to support + * the `files` command, or false if otherwise. + */ + public function isMercurialFilesCommandAvailable() { + return self::versionHasCapability( + $this->requireBinaryVersion(), + self::CAPABILITY_FILES); + } + + public function isMercurialVulnerableToInjection() { + return self::versionHasCapability( + $this->requireBinaryVersion(), + self::CAPABILITY_INJECTION); + } + + + public static function versionHasCapability( + $mercurial_version, + $capability) { + + switch ($capability) { + case self::CAPABILITY_FILES: + return version_compare($mercurial_version, '3.2', '>='); + case self::CAPABILITY_INJECTION: + return version_compare($mercurial_version, '3.2.4', '<'); + default: + throw new Exception( + pht( + 'Unknown Mercurial capability "%s".', + $capability)); + } + + } + + +} diff --git a/src/filesystem/binary/PhutilPygmentizeBinaryAnalyzer.php b/src/filesystem/binary/PhutilPygmentizeBinaryAnalyzer.php new file mode 100644 --- /dev/null +++ b/src/filesystem/binary/PhutilPygmentizeBinaryAnalyzer.php @@ -0,0 +1,31 @@ + '2.11.0', + 'definitely git 7.0' => null, + ); + + foreach ($map as $input => $expect) { + $actual = PhutilGitBinaryAnalyzer::parseGitBinaryVersion($input); + $this->assertEqual($expect, $actual, $input); + } + } + + public function getParseMercurialBinaryVersions() { + $map = array( + "Mercurial Distributed SCM (version 3.5.2+20151001)\n" + => '3.5.2', + 'This Is Mercurial 22.0' => null, + ); + + foreach ($map as $input => $expect) { + $actual = + PhutilMercurialBinaryAnalyzer::parseMercurialBinaryVersion( + $input); + $this->assertEqual($expect, $actual, $input); + } + } + + public function testParseSubversionBinaryVersions() { + $map = array( + "1.7.20\n" => '1.7.20', + ); + + foreach ($map as $input => $expect) { + $actual = + PhutilSubversionBinaryAnalyzer::parseSubversionBinaryVersion( + $input); + $this->assertEqual($expect, $actual, $input); + } + } + + public function testParseDiffBinaryVersions() { + $diff_version_281 = << '2.8.1', + 'diff version 1.2.3' => null, + ); + + foreach ($map as $input => $expect) { + $actual = PhutilDiffBinaryAnalyzer::parseDiffBinaryVersion($input); + $this->assertEqual($expect, $actual, $input); + } + } + + public function testParsePygmentizeBinaryVersions() { + $map = array( + "Pygments version 2.0.1, (c) 2006-2014 by Georg Brandl.\n" + => '2.0.1', + 'pygments 3.4' => null, + ); + + foreach ($map as $input => $expect) { + $actual = + PhutilPygmentizeBinaryAnalyzer::parsePygmentizeBinaryVersion( + $input); + $this->assertEqual($expect, $actual, $input); + } + } + + public function testMercurialFilesCommandVersions() { + $cases = array( + PhutilMercurialBinaryAnalyzer::CAPABILITY_FILES => array( + '2.6.2' => false, + '2.9' => false, + '3.1' => false, + '3.2' => true, + '3.3' => true, + '3.5.2' => true, + ), + PhutilMercurialBinaryAnalyzer::CAPABILITY_INJECTION => array( + '2.0' => true, + '3.2.3' => true, + '3.2.4' => false, + ), + ); + + foreach ($cases as $capability => $map) { + foreach ($map as $input => $expect) { + $actual = PhutilMercurialBinaryAnalyzer::versionHasCapability( + $input, + $capability); + $this->assertEqual( + $expect, + $actual, + pht('%s on %s', $capability, $input)); + } + } + + } + +} diff --git a/src/filesystem/linesofalarge/LinesOfALarge.php b/src/filesystem/linesofalarge/LinesOfALarge.php new file mode 100644 --- /dev/null +++ b/src/filesystem/linesofalarge/LinesOfALarge.php @@ -0,0 +1,224 @@ +delimiter = $character; + return $this; + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * Hook, called before @{method:rewind()}. Allows a concrete implementation + * to open resources or reset state. + * + * @return void + * @task internals + */ + abstract protected function willRewind(); + + + /** + * Called when the iterator needs more data. The subclass should return more + * data, or empty string to indicate end-of-stream. + * + * @return string Data, or empty string for end-of-stream. + * @task internals + */ + abstract protected function readMore(); + + +/* -( Iterator Interface )------------------------------------------------- */ + + + /** + * @task iterator + */ + final public function rewind() { + $this->willRewind(); + + $this->buf = ''; + $this->pos = 0; + $this->num = 0; + $this->eof = false; + $this->valid = true; + + $this->next(); + } + + + /** + * @task iterator + */ + final public function key() { + return $this->num; + } + + + /** + * @task iterator + */ + final public function current() { + return $this->line; + } + + + /** + * @task iterator + */ + final public function valid() { + return $this->valid; + } + + + /** + * @task iterator + */ + final public function next() { + // Consume the stream a chunk at a time into an internal buffer, then + // read lines out of that buffer. This gives us flexibility (stream sources + // only need to be able to read blocks of bytes) and performance (we can + // read in reasonably-sized chunks of many lines), at the cost of some + // complexity in buffer management. + + // We do this in a loop to avoid recursion when consuming more bytes, in + // case the size of a line is very large compared to the chunk size we + // read. + while (true) { + if (strlen($this->buf)) { + + // If we don't have a delimiter, return the entire buffer. + if ($this->delimiter === null) { + $this->num++; + $this->line = substr($this->buf, $this->pos); + $this->buf = ''; + $this->pos = 0; + return; + } + + // If we already have some data buffered, try to get the next line from + // the buffer. Search through the buffer for a delimiter. This should be + // the common case. + $endl = strpos($this->buf, $this->delimiter, $this->pos); + + if ($endl !== false) { + // We found a delimiter, so return the line it delimits. We leave + // the buffer as-is so we don't need to reallocate it, in case it is + // large relative to the size of a line. Instead, we move our cursor + // within the buffer forward. + $this->num++; + $this->line = substr($this->buf, $this->pos, ($endl - $this->pos)); + $this->pos = $endl + 1; + return; + } + + // We only have part of a line left in the buffer (no delimiter in the + // remaining piece), so throw away the part we've already emitted and + // continue below. + $this->buf = substr($this->buf, $this->pos); + $this->pos = 0; + } + + // We weren't able to produce the next line from the bytes we already had + // buffered, so read more bytes from the input stream. + + if ($this->eof) { + // NOTE: We keep track of EOF (an empty read) so we don't make any more + // reads afterward. Normally, we'll return from the first EOF read, + // emit the line, and then next() will be called again. Without tracking + // EOF, we'll attempt another read. A well-behaved implementation should + // still return empty string, but we can protect against any issues + // here by keeping a flag. + $more = ''; + } else { + $more = $this->readMore(); + } + + if (strlen($more)) { + // We got some bytes, so add them to the buffer and then try again. + $this->buf .= $more; + continue; + } else { + // No more bytes. If we have a buffer, return its contents. We + // potentially return part of a line here if the last line had no + // delimiter, but that currently seems reasonable as a default + // behavior. If we don't have a buffer, we're done. + $this->eof = true; + if (strlen($this->buf)) { + $this->num++; + $this->line = $this->buf; + $this->buf = null; + } else { + $this->valid = false; + } + break; + } + } + } + +} diff --git a/src/filesystem/linesofalarge/LinesOfALargeExecFuture.php b/src/filesystem/linesofalarge/LinesOfALargeExecFuture.php new file mode 100644 --- /dev/null +++ b/src/filesystem/linesofalarge/LinesOfALargeExecFuture.php @@ -0,0 +1,119 @@ +future = $future; + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * On destruction, we terminate the subprocess if it hasn't exited already. + * + * @return void + * @task internals + */ + public function __destruct() { + if (!$this->future->isReady()) { + $this->future->resolveKill(); + } + } + + + /** + * The PHP `foreach()` construct calls rewind() once, so we allow the first + * `rewind()`, without effect. Subsequent rewinds mean misuse. + * + * @return void + * @task internals + */ + protected function willRewind() { + if ($this->didRewind) { + throw new Exception( + pht( + "You can not reiterate over a %s object. The entire goal of the ". + "construct is to avoid keeping output in memory. What you are ". + "attempting to do is silly and doesn't make any sense.", + __CLASS__)); + } + $this->didRewind = true; + } + + + /** + * Read more data from the subprocess. + * + * @return string Bytes read from stdout. + * @task internals + */ + protected function readMore() { + $future = $this->future; + + while (true) { + // Read is nonblocking, so we need to sit in this loop waiting for input + // or we'll incorrectly signal EOF to the parent. + $stdout = $future->readStdout(); + $future->discardStdoutBuffer(); + + if (strlen($stdout)) { + return $stdout; + } + + // If we didn't read anything, we can exit the loop if the subprocess + // has exited. + + if ($future->isReady()) { + // Throw if the process exits with a nonzero status code. This makes + // error handling simpler, and prevents us from returning part of a line + // if the process terminates mid-output. + $future->resolvex(); + + // Read and return anything that's left. + $stdout = $future->readStdout(); + $future->discardStdoutBuffer(); + + return $stdout; + } + } + } + +} diff --git a/src/filesystem/linesofalarge/LinesOfALargeFile.php b/src/filesystem/linesofalarge/LinesOfALargeFile.php new file mode 100644 --- /dev/null +++ b/src/filesystem/linesofalarge/LinesOfALargeFile.php @@ -0,0 +1,106 @@ +fileName = Filesystem::resolvePath((string)$file_name); + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * Closes the file handle. + * + * @return void + * @task internals + */ + public function __destruct() { + $this->closeHandle(); + } + + + /** + * Close the file handle, if it is open. + * + * @return $this + * @task internals + */ + private function closeHandle() { + if ($this->handle) { + fclose($this->handle); + $this->handle = null; + } + return $this; + } + + + /** + * Closes the file handle if it is open, and reopens it. + * + * @return void + * @task internals + */ + protected function willRewind() { + $this->closeHandle(); + $this->handle = @fopen($this->fileName, 'r'); + if (!$this->handle) { + throw new FilesystemException( + $this->fileName, + pht('Failed to open file!')); + } + } + + + /** + * Read the file chunk-by-chunk. + * + * @return string Next chunk of the file. + * @task internals + */ + protected function readMore() { + // NOTE: At least on OSX in reasonably normal test cases, increasing the + // size of this read has no impact on performance. + + $more = @fread($this->handle, 2048); + if ($more === false) { + throw new FilesystemException( + $this->fileName, + pht('Failed to read file!')); + } + return $more; + } + +} diff --git a/src/filesystem/linesofalarge/__tests__/LinesOfALargeExecFutureTestCase.php b/src/filesystem/linesofalarge/__tests__/LinesOfALargeExecFutureTestCase.php new file mode 100644 --- /dev/null +++ b/src/filesystem/linesofalarge/__tests__/LinesOfALargeExecFutureTestCase.php @@ -0,0 +1,62 @@ +writeAndRead( + "cat\ndog\nbird\n", + array( + 'cat', + 'dog', + 'bird', + )); + } + + public function testExecLargeFile() { + $line = pht('The quick brown fox jumps over the lazy dog.'); + $n = 100; + + $this->writeAndRead( + str_repeat($line."\n", $n), + array_fill(0, $n, $line)); + } + + public function testExecLongLine() { + $line = str_repeat('x', 64 * 1024); + $this->writeAndRead($line, array($line)); + } + + public function testExecException() { + $caught = null; + try { + $future = new ExecFuture('does-not-exist.exe.sh'); + foreach (new LinesOfALargeExecFuture($future) as $line) { + // ignore + } + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof CommandException); + } + + private function writeAndRead($write, $read) { + $future = new ExecFuture('cat'); + $future->write($write); + + $lines = array(); + foreach (new LinesOfALargeExecFuture($future) as $line) { + $lines[] = $line; + } + + $this->assertEqual( + $read, + $lines, + pht('Write: %s', id(new PhutilUTF8StringTruncator()) + ->setMaximumGlyphs(32) + ->truncateString($write))); + } + +} diff --git a/src/filesystem/linesofalarge/__tests__/LinesOfALargeFileTestCase.php b/src/filesystem/linesofalarge/__tests__/LinesOfALargeFileTestCase.php new file mode 100644 --- /dev/null +++ b/src/filesystem/linesofalarge/__tests__/LinesOfALargeFileTestCase.php @@ -0,0 +1,132 @@ +writeAndRead( + 'abcd', + array( + 'abcd', + )); + } + + public function testTerminalDelimiterPresent() { + $this->writeAndRead( + "bat\ncat\ndog\n", + array( + 'bat', + 'cat', + 'dog', + )); + } + + public function testTerminalDelimiterAbsent() { + $this->writeAndRead( + "bat\ncat\ndog", + array( + 'bat', + 'cat', + 'dog', + )); + } + + public function testChangeDelimiter() { + $this->writeAndRead( + "bat\1cat\1dog\1", + array( + 'bat', + 'cat', + 'dog', + ), + "\1"); + } + + public function testEmptyLines() { + $this->writeAndRead( + "\n\nbat\n", + array( + '', + '', + 'bat', + )); + } + + public function testLargeFile() { + $line = pht('The quick brown fox jumps over the lazy dog.'); + $n = 100; + + $this->writeAndRead( + str_repeat($line."\n", $n), + array_fill(0, $n, $line)); + } + + public function testLongLine() { + $line = str_repeat('x', 64 * 1024); + $this->writeAndRead($line, array($line)); + } + + public function testReadFailure() { + $caught = null; + try { + $f = new LinesOfALargeFile('/does/not/exist.void'); + $f->rewind(); + } catch (FilesystemException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof $ex); + } + + public function testLineFilter() { + $write = "bat\ncat\ndog\nBat\nCat\nDog\n"; + $read = array( + 1 => 'cat', + 4 => 'Cat', + ); + + $tmp = new TempFile(); + Filesystem::writeFile($tmp, $write); + + $lines = array(); + $iterator = new PhutilCallbackFilterIterator( + new LinesOfALargeFile($tmp), + array($this, 'allowCatsOnly')); + foreach ($iterator as $n => $line) { + $lines[$n - 1] = $line; + } + + $this->assertEqual( + $read, + $lines, + pht('Write: %s', id(new PhutilUTF8StringTruncator()) + ->setMaximumGlyphs(32) + ->truncateString($write))); + } + + public function allowCatsOnly($line) { + $line = strtoupper($line); + if ($line != 'CAT') { + return null; + } + return $line; + } + + private function writeAndRead($write, $read, $delimiter = "\n") { + $tmp = new TempFile(); + Filesystem::writeFile($tmp, $write); + + $lines = array(); + $iterator = id(new LinesOfALargeFile($tmp))->setDelimiter($delimiter); + foreach ($iterator as $n => $line) { + $lines[$n - 1] = $line; + } + + $this->assertEqual( + $read, + $lines, + pht('Write: %s', id(new PhutilUTF8StringTruncator()) + ->setMaximumGlyphs(32) + ->truncateString($write))); + } + +} diff --git a/src/future/Future.php b/src/future/Future.php new file mode 100644 --- /dev/null +++ b/src/future/Future.php @@ -0,0 +1,189 @@ +getDefaultWait(); + do { + $this->checkException(); + if ($this->isReady()) { + break; + } + + $read = $this->getReadSockets(); + $write = $this->getWriteSockets(); + + if ($timeout !== null) { + $elapsed = microtime(true) - $start; + + if ($elapsed > $timeout) { + $this->checkException(); + return null; + } else { + $wait = $timeout - $elapsed; + } + } + + if ($read || $write) { + self::waitForSockets($read, $write, $wait); + } + } while (true); + + $this->checkException(); + return $this->getResult(); + } + + public function setException(Exception $ex) { + $this->exception = $ex; + return $this; + } + + public function getException() { + return $this->exception; + } + + + /** + * If an exception was set by setException(), throw it. + */ + private function checkException() { + if ($this->exception) { + throw $this->exception; + } + } + + + /** + * Retrieve a list of sockets which we can wait to become readable while + * a future is resolving. If your future has sockets which can be + * `select()`ed, return them here (or in @{method:getWriteSockets}) to make + * the resolve loop do a `select()`. If you do not return sockets in either + * case, you'll get a busy wait. + * + * @return list A list of sockets which we expect to become readable. + */ + public function getReadSockets() { + return array(); + } + + + /** + * Retrieve a list of sockets which we can wait to become writable while a + * future is resolving. See @{method:getReadSockets}. + * + * @return list A list of sockets which we expect to become writable. + */ + public function getWriteSockets() { + return array(); + } + + + /** + * Wait for activity on one of several sockets. + * + * @param list List of sockets expected to become readable. + * @param list List of sockets expected to become writable. + * @param float Timeout, in seconds. + * @return void + */ + public static function waitForSockets( + array $read_list, + array $write_list, + $timeout = 1) { + if (!self::$handlerInstalled) { + // If we're spawning child processes, we need to install a signal handler + // here to catch cases like execing '(sleep 60 &) &' where the child + // exits but a socket is kept open. But we don't actually need to do + // anything because the SIGCHLD will interrupt the stream_select(), as + // long as we have a handler registered. + if (function_exists('pcntl_signal')) { + if (!pcntl_signal(SIGCHLD, array(__CLASS__, 'handleSIGCHLD'))) { + throw new Exception(pht('Failed to install signal handler!')); + } + } + self::$handlerInstalled = true; + } + + $timeout_sec = (int)$timeout; + $timeout_usec = (int)(1000000 * ($timeout - $timeout_sec)); + + $exceptfds = array(); + $ok = @stream_select( + $read_list, + $write_list, + $exceptfds, + $timeout_sec, + $timeout_usec); + + if ($ok === false) { + // Hopefully, means we received a SIGCHLD. In the worst case, we degrade + // to a busy wait. + } + } + + public static function handleSIGCHLD($signo) { + // This function is a dummy, we just need to have some handler registered + // so that PHP will get interrupted during stream_select(). If we don't + // register a handler, stream_select() won't fail. + } + + + /** + * Retrieve the final result of the future. This method will be called after + * the future is ready (as per @{method:isReady}) but before results are + * passed back to the caller. The major use of this function is that you can + * override it in subclasses to do postprocessing or error checking, which is + * particularly useful if building application-specific futures on top of + * primitive transport futures (like @{class:CurlFuture} and + * @{class:ExecFuture}) which can make it tricky to hook this logic into the + * main pipeline. + * + * @return mixed Final resolution of this future. + */ + protected function getResult() { + return $this->result; + } + + /** + * Default amount of time to wait on stream select for this future. Normally + * 1 second is fine, but if the future has a timeout sooner than that it + * should return the amount of time left before the timeout. + */ + public function getDefaultWait() { + return 1; + } + + public function start() { + $this->isReady(); + return $this; + } + +} diff --git a/src/future/FutureIterator.php b/src/future/FutureIterator.php new file mode 100644 --- /dev/null +++ b/src/future/FutureIterator.php @@ -0,0 +1,327 @@ + new ExecFuture('wc -c a.txt'), + * 'b.txt' => new ExecFuture('wc -c b.txt'), + * 'c.txt' => new ExecFuture('wc -c c.txt'), + * ); + * + * foreach (new FutureIterator($futures) as $key => $future) { + * // IMPORTANT: keys are preserved but the order of elements is not. This + * // construct iterates over the futures in the order they resolve, so the + * // fastest future is the one you'll get first. This allows you to start + * // doing followup processing as soon as possible. + * + * list($err, $stdout) = $future->resolve(); + * do_some_processing($stdout); + * } + * + * For a general overview of futures, see @{article:Using Futures}. + * + * @task basics Basics + * @task config Configuring Iteration + * @task iterator Iterator Interface + * @task internal Internals + */ +final class FutureIterator extends Phobject implements Iterator { + + protected $wait = array(); + protected $work = array(); + protected $futures = array(); + protected $key; + + protected $limit; + + protected $timeout; + protected $isTimeout = false; + + +/* -( Basics )------------------------------------------------------------- */ + + + /** + * Create a new iterator over a list of futures. + * + * @param list List of @{class:Future}s to resolve. + * @task basics + */ + public function __construct(array $futures) { + assert_instances_of($futures, 'Future'); + $this->futures = $futures; + } + + + /** + * Block until all futures resolve. + * + * @return void + * @task basics + */ + public function resolveAll() { + foreach ($this as $future) { + $future->resolve(); + } + } + + /** + * Add another future to the set of futures. This is useful if you have a + * set of futures to run mostly in parallel, but some futures depend on + * others. + * + * @param Future @{class:Future} to add to iterator + * @task basics + */ + public function addFuture(Future $future, $key = null) { + if ($key === null) { + $this->futures[] = $future; + $this->wait[] = last_key($this->futures); + } else if (!isset($this->futures[$key])) { + $this->futures[$key] = $future; + $this->wait[] = $key; + } else { + throw new Exception(pht('Invalid key %s', $key)); + } + + // Start running the future if we don't have $this->limit futures running + // already. updateWorkingSet() won't start running the future if there's no + // limit, so we'll manually poke it here in that case. + $this->updateWorkingSet(); + if (!$this->limit) { + $future->isReady(); + } + return $this; + } + + +/* -( Configuring Iteration )---------------------------------------------- */ + + + /** + * Set a maximum amount of time you want to wait before the iterator will + * yield a result. If no future has resolved yet, the iterator will yield + * null for key and value. Among other potential uses, you can use this to + * show some busy indicator: + * + * $futures = id(new FutureIterator($futures)) + * ->setUpdateInterval(1); + * foreach ($futures as $future) { + * if ($future === null) { + * echo "Still working...\n"; + * } else { + * // ... + * } + * } + * + * This will echo "Still working..." once per second as long as futures are + * resolving. By default, FutureIterator never yields null. + * + * @param float Maximum number of seconds to block waiting on futures before + * yielding null. + * @return this + * + * @task config + */ + public function setUpdateInterval($interval) { + $this->timeout = $interval; + return $this; + } + + + /** + * Limit the number of simultaneously executing futures. + * + * $futures = id(new FutureIterator($futures)) + * ->limit(4); + * foreach ($futures as $future) { + * // Run no more than 4 futures simultaneously. + * } + * + * @param int Maximum number of simultaneous jobs allowed. + * @return this + * + * @task config + */ + public function limit($max) { + $this->limit = $max; + return $this; + } + + +/* -( Iterator Interface )------------------------------------------------- */ + + + /** + * @task iterator + */ + public function rewind() { + $this->wait = array_keys($this->futures); + $this->work = null; + $this->updateWorkingSet(); + $this->next(); + } + + /** + * @task iterator + */ + public function next() { + $this->key = null; + if (!count($this->wait)) { + return; + } + + $read_sockets = array(); + $write_sockets = array(); + + $start = microtime(true); + $timeout = $this->timeout; + $this->isTimeout = false; + + $check = $this->getWorkingSet(); + $resolve = null; + do { + $read_sockets = array(); + $write_sockets = array(); + $can_use_sockets = true; + $wait_time = 1; + foreach ($check as $wait => $key) { + $future = $this->futures[$key]; + try { + if ($future->getException()) { + $resolve = $wait; + continue; + } + if ($future->isReady()) { + if ($resolve === null) { + $resolve = $wait; + } + continue; + } + + $got_sockets = false; + $socks = $future->getReadSockets(); + if ($socks) { + $got_sockets = true; + foreach ($socks as $socket) { + $read_sockets[] = $socket; + } + } + + $socks = $future->getWriteSockets(); + if ($socks) { + $got_sockets = true; + foreach ($socks as $socket) { + $write_sockets[] = $socket; + } + } + + // If any currently active future had neither read nor write sockets, + // we can't wait for the current batch of items using sockets. + if (!$got_sockets) { + $can_use_sockets = false; + } else { + $wait_time = min($wait_time, $future->getDefaultWait()); + } + } catch (Exception $ex) { + $this->futures[$key]->setException($ex); + $resolve = $wait; + break; + } + } + if ($resolve === null) { + + // Check for a setUpdateInterval() timeout. + if ($timeout !== null) { + $elapsed = microtime(true) - $start; + if ($elapsed > $timeout) { + $this->isTimeout = true; + return; + } else { + $wait_time = $timeout - $elapsed; + } + } + + if ($can_use_sockets) { + Future::waitForSockets($read_sockets, $write_sockets, $wait_time); + } else { + usleep(1000); + } + } + } while ($resolve === null); + + $this->key = $this->wait[$resolve]; + unset($this->wait[$resolve]); + $this->updateWorkingSet(); + } + + /** + * @task iterator + */ + public function current() { + if ($this->isTimeout) { + return null; + } + return $this->futures[$this->key]; + } + + /** + * @task iterator + */ + public function key() { + if ($this->isTimeout) { + return null; + } + return $this->key; + } + + /** + * @task iterator + */ + public function valid() { + if ($this->isTimeout) { + return true; + } + return ($this->key !== null); + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * @task internal + */ + protected function getWorkingSet() { + if ($this->work === null) { + return $this->wait; + } + + return $this->work; + } + + /** + * @task internal + */ + protected function updateWorkingSet() { + if (!$this->limit) { + return; + } + + $old = $this->work; + $this->work = array_slice($this->wait, 0, $this->limit, true); + + // If we're using a limit, our futures are sleeping and need to be polled + // to begin execution, so poll any futures which weren't in our working set + // before. + foreach ($this->work as $work => $key) { + if (!isset($old[$work])) { + $this->futures[$key]->isReady(); + } + } + } + +} diff --git a/src/future/FutureProxy.php b/src/future/FutureProxy.php new file mode 100644 --- /dev/null +++ b/src/future/FutureProxy.php @@ -0,0 +1,71 @@ +setProxiedFuture($proxied); + } + } + + public function setProxiedFuture(Future $proxied) { + $this->proxied = $proxied; + return $this; + } + + protected function getProxiedFuture() { + if (!$this->proxied) { + throw new Exception(pht('The proxied future has not been provided yet.')); + } + return $this->proxied; + } + + public function isReady() { + return $this->getProxiedFuture()->isReady(); + } + + public function resolve($timeout = null) { + $this->getProxiedFuture()->resolve($timeout); + return $this->getResult(); + } + + public function setException(Exception $ex) { + $this->getProxiedFuture()->setException($ex); + return $this; + } + + public function getException() { + return $this->getProxiedFuture()->getException(); + } + + public function getReadSockets() { + return $this->getProxiedFuture()->getReadSockets(); + } + + public function getWriteSockets() { + return $this->getProxiedFuture()->getWriteSockets(); + } + + protected function getResult() { + if ($this->result === null) { + $result = $this->getProxiedFuture()->resolve(); + $result = $this->didReceiveResult($result); + $this->result = $result; + } + return $this->result; + } + + public function start() { + $this->getProxiedFuture()->start(); + return $this; + } + + abstract protected function didReceiveResult($result); + +} diff --git a/src/future/ImmediateFuture.php b/src/future/ImmediateFuture.php new file mode 100644 --- /dev/null +++ b/src/future/ImmediateFuture.php @@ -0,0 +1,17 @@ +result = $result; + } + + public function isReady() { + return true; + } + +} diff --git a/src/future/__tests__/FutureIteratorTestCase.php b/src/future/__tests__/FutureIteratorTestCase.php new file mode 100644 --- /dev/null +++ b/src/future/__tests__/FutureIteratorTestCase.php @@ -0,0 +1,23 @@ +limit(2); + + $results = array(); + foreach ($iterator as $future) { + if ($future === $future1) { + $iterator->addFuture($future2); + } + $results[] = $future->resolve(); + } + + $this->assertEqual(2, count($results)); + } + +} diff --git a/src/future/asana/PhutilAsanaFuture.php b/src/future/asana/PhutilAsanaFuture.php new file mode 100644 --- /dev/null +++ b/src/future/asana/PhutilAsanaFuture.php @@ -0,0 +1,90 @@ +accessToken = $token; + return $this; + } + + public function setRawAsanaQuery($action, array $params = array()) { + $this->action = $action; + $this->params = $params; + return $this; + } + + public function setMethod($method) { + $this->method = $method; + return $this; + } + + protected function getProxiedFuture() { + if (!$this->future) { + $params = $this->params; + + if (!$this->action) { + throw new Exception( + pht( + 'You must %s!', + 'setRawAsanaQuery()')); + } + + if (!$this->accessToken) { + throw new Exception( + pht( + 'You must %s!', + 'setAccessToken()')); + } + + $uri = new PhutilURI('https://app.asana.com/'); + $uri->setPath('/api/1.0/'.ltrim($this->action, '/')); + + $future = new HTTPSFuture($uri); + $future->setData($this->params); + $future->addHeader('Authorization', 'Bearer '.$this->accessToken); + $future->setMethod($this->method); + + $this->future = $future; + } + + return $this->future; + } + + protected function didReceiveResult($result) { + list($status, $body, $headers) = $result; + + if ($status->isError()) { + throw $status; + } + + $data = null; + try { + $data = phutil_json_decode($body); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Expected JSON response from Asana.'), + $ex); + } + + if (idx($data, 'errors')) { + $errors = print_r($data['errors'], true); + throw new Exception( + pht( + 'Received errors from Asana: %s', + $errors)); + } + + return $data['data']; + } + +} diff --git a/src/future/aws/PhutilAWSCloudFormationFuture.php b/src/future/aws/PhutilAWSCloudFormationFuture.php new file mode 100644 --- /dev/null +++ b/src/future/aws/PhutilAWSCloudFormationFuture.php @@ -0,0 +1,20 @@ +parameters = $parameters; + return $this; + } + + protected function getParameters() { + return $this->parameters; + } + + public function getServiceName() { + return 'cloudformation'; + } + +} diff --git a/src/future/aws/PhutilAWSCloudWatchFuture.php b/src/future/aws/PhutilAWSCloudWatchFuture.php new file mode 100644 --- /dev/null +++ b/src/future/aws/PhutilAWSCloudWatchFuture.php @@ -0,0 +1,19 @@ +parameters = $parameters; + return $this; + } + + protected function getParameters() { + return $this->parameters; + } + + public function getServiceName() { + return 'monitoring'; + } + +} diff --git a/src/future/aws/PhutilAWSEC2Future.php b/src/future/aws/PhutilAWSEC2Future.php new file mode 100644 --- /dev/null +++ b/src/future/aws/PhutilAWSEC2Future.php @@ -0,0 +1,20 @@ +parameters = $parameters; + return $this; + } + + protected function getParameters() { + return $this->parameters; + } + + public function getServiceName() { + return 'ec2'; + } + +} diff --git a/src/future/aws/PhutilAWSException.php b/src/future/aws/PhutilAWSException.php new file mode 100644 --- /dev/null +++ b/src/future/aws/PhutilAWSException.php @@ -0,0 +1,52 @@ +httpStatus = $http_status; + $this->requestID = idx($params, 'RequestID'); + + $this->params = $params; + + $desc = array(); + $desc[] = pht('AWS Request Failed'); + $desc[] = pht('HTTP Status Code: %d', $http_status); + + $found_error = false; + if ($this->requestID) { + $desc[] = pht('AWS Request ID: %s', $this->requestID); + $errors = idx($params, 'Errors'); + + if ($errors) { + $desc[] = pht('AWS Errors:'); + foreach ($errors as $error) { + list($code, $message) = $error; + if ($code) { + $found_error = true; + } + $desc[] = " - {$code}: {$message}\n"; + } + } + } + if (!$found_error) { + $desc[] = pht('Response Body: %s', idx($params, 'body')); + } + + $desc = implode("\n", $desc); + + parent::__construct($desc); + } + + public function getRequestID() { + return $this->requestID; + } + + public function getHTTPStatus() { + return $this->httpStatus; + } + +} diff --git a/src/future/aws/PhutilAWSFuture.php b/src/future/aws/PhutilAWSFuture.php new file mode 100644 --- /dev/null +++ b/src/future/aws/PhutilAWSFuture.php @@ -0,0 +1,171 @@ +accessKey = $access_key; + return $this; + } + + public function getAccessKey() { + return $this->accessKey; + } + + public function setSecretKey(PhutilOpaqueEnvelope $secret_key) { + $this->secretKey = $secret_key; + return $this; + } + + public function getSecretKey() { + return $this->secretKey; + } + + public function getRegion() { + return $this->region; + } + + public function setRegion($region) { + $this->region = $region; + return $this; + } + + public function setEndpoint($endpoint) { + $this->endpoint = $endpoint; + return $this; + } + + public function getEndpoint() { + return $this->endpoint; + } + + public function setHTTPMethod($method) { + $this->httpMethod = $method; + return $this; + } + + public function getHTTPMethod() { + return $this->httpMethod; + } + + public function setPath($path) { + $this->path = $path; + return $this; + } + + public function getPath() { + return $this->path; + } + + public function setData($data) { + $this->data = $data; + return $this; + } + + public function getData() { + return $this->data; + } + + protected function getParameters() { + return array(); + } + + public function addHeader($key, $value) { + $this->headers[] = array($key, $value); + return $this; + } + + protected function getProxiedFuture() { + if (!$this->future) { + $params = $this->getParameters(); + $method = $this->getHTTPMethod(); + $host = $this->getEndpoint(); + $path = $this->getPath(); + $data = $this->getData(); + + $uri = id(new PhutilURI("https://{$host}/")) + ->setPath($path) + ->setQueryParams($params); + + $future = id(new HTTPSFuture($uri, $data)) + ->setMethod($method); + + foreach ($this->headers as $header) { + list($key, $value) = $header; + $future->addHeader($key, $value); + } + + $this->signRequest($future); + + $this->future = $future; + } + + return $this->future; + } + + protected function signRequest(HTTPSFuture $future) { + $access_key = $this->getAccessKey(); + $secret_key = $this->getSecretKey(); + + $region = $this->getRegion(); + + id(new PhutilAWSv4Signature()) + ->setRegion($region) + ->setService($this->getServiceName()) + ->setAccessKey($access_key) + ->setSecretKey($secret_key) + ->setSignContent($this->shouldSignContent()) + ->signRequest($future); + } + + protected function shouldSignContent() { + return false; + } + + protected function didReceiveResult($result) { + list($status, $body, $headers) = $result; + + try { + $xml = @(new SimpleXMLElement($body)); + } catch (Exception $ex) { + $xml = null; + } + + if ($status->isError() || !$xml) { + if (!($status instanceof HTTPFutureHTTPResponseStatus)) { + throw $status; + } + + $params = array( + 'body' => $body, + ); + if ($xml) { + $params['RequestID'] = $xml->RequestID[0]; + $errors = array($xml->Error); + foreach ($errors as $error) { + $params['Errors'][] = array($error->Code, $error->Message); + } + } + + throw new PhutilAWSException($status->getStatusCode(), $params); + } + + return $xml; + } + +} diff --git a/src/future/aws/PhutilAWSS3Future.php b/src/future/aws/PhutilAWSS3Future.php new file mode 100644 --- /dev/null +++ b/src/future/aws/PhutilAWSS3Future.php @@ -0,0 +1,70 @@ +bucket = $bucket; + return $this; + } + + public function getBucket() { + return $this->bucket; + } + + public function setParametersForGetObject($key) { + $bucket = $this->getBucket(); + + $this->setHTTPMethod('GET'); + $this->setPath($bucket.'/'.$key); + + return $this; + } + + public function setParametersForPutObject($key, $value) { + $bucket = $this->getBucket(); + + $this->setHTTPMethod('PUT'); + $this->setPath($bucket.'/'.$key); + + $this->addHeader('X-Amz-ACL', 'private'); + $this->addHeader('Content-Type', 'application/octet-stream'); + + $this->setData($value); + + return $this; + } + + public function setParametersForDeleteObject($key) { + $bucket = $this->getBucket(); + + $this->setHTTPMethod('DELETE'); + $this->setPath($bucket.'/'.$key); + + return $this; + } + + protected function didReceiveResult($result) { + list($status, $body, $headers) = $result; + + if (!$status->isError()) { + return $body; + } + + if ($status->getStatusCode() === 404) { + return null; + } + + return parent::didReceiveResult($result); + } + + protected function shouldSignContent() { + return true; + } + +} diff --git a/src/future/aws/PhutilAWSv4Signature.php b/src/future/aws/PhutilAWSv4Signature.php new file mode 100644 --- /dev/null +++ b/src/future/aws/PhutilAWSv4Signature.php @@ -0,0 +1,269 @@ +accessKey = $access_key; + return $this; + } + + public function setSecretKey(PhutilOpaqueEnvelope $secret_key) { + $this->secretKey = $secret_key; + return $this; + } + + public function setDate($date) { + $this->date = $date; + return $this; + } + + public function getDate() { + if ($this->date === null) { + $this->date = gmdate('Ymd\THis\Z', time()); + } + return $this->date; + } + + public function setRegion($region) { + $this->region = $region; + return $this; + } + + public function getRegion() { + return $this->region; + } + + public function setService($service) { + $this->service = $service; + return $this; + } + + public function getService() { + return $this->service; + } + + public function setSigningKey($signing_key) { + $this->signingKey = $signing_key; + return $this; + } + + public function getSigningKey() { + if ($this->signingKey === null) { + $this->signingKey = $this->computeSigningKey(); + } + + return $this->signingKey; + } + + private function getAlgorithm() { + return 'AWS4-HMAC-SHA256'; + } + + public function setSignContent($sign_content) { + $this->signContent = $sign_content; + return $this; + } + + public function getSignContent() { + return $this->signContent; + } + + private function getHost(HTTPSFuture $future) { + $uri = new PhutilURI($future->getURI()); + return $uri->getDomain(); + } + + private function getPath(HTTPSFuture $future) { + $uri = new PhutilURI($future->getURI()); + return $uri->getPath(); + } + + public function signRequest(HTTPSFuture $future) { + $body_signature = $this->getBodySignature($future); + + if ($this->getSignContent()) { + $future->addHeader('X-Amz-Content-sha256', $body_signature); + } + + $future->addHeader('X-Amz-Date', $this->getDate()); + + $request_signature = $this->getCanonicalRequestSignature( + $future, + $body_signature); + + $string_to_sign = $this->getStringToSign($request_signature); + + $signing_key = $this->getSigningKey(); + + $signature = hash_hmac('sha256', $string_to_sign, $signing_key); + + $algorithm = $this->getAlgorithm(); + $credential = $this->getCredential(); + $signed_headers = $this->getSignedHeaderList($future); + + $authorization = + $algorithm.' '. + 'Credential='.$credential.','. + 'SignedHeaders='.$signed_headers.','. + 'Signature='.$signature; + + $future->addHeader('Authorization', $authorization); + + return $future; + } + + private function getBodySignature(HTTPSFuture $future) { + $http_body = $future->getData(); + + if (is_array($http_body)) { + $http_body = ''; + } + + return hash('sha256', $http_body); + } + + private function getCanonicalRequestSignature( + HTTPSFuture $future, + $body_signature) { + + $http_method = $future->getMethod(); + + $path = $this->getPath($future); + $path = rawurlencode($path); + $path = str_replace('%2F', '/', $path); + + $canonical_parameters = $this->getCanonicalParameterList($future); + $canonical_headers = $this->getCanonicalHeaderList($future); + $signed_headers = $this->getSignedHeaderList($future); + + $canonical_request = + $http_method."\n". + $path."\n". + $canonical_parameters."\n". + $canonical_headers."\n". + "\n". + $signed_headers."\n". + $body_signature; + + return hash('sha256', $canonical_request); + } + + private function getStringToSign($request_signature) { + $algorithm = $this->getAlgorithm(); + $date = $this->getDate(); + $scope_parts = $this->getScopeParts(); + $scope = implode('/', $scope_parts); + + $string_to_sign = + $algorithm."\n". + $date."\n". + $scope."\n". + $request_signature; + + return $string_to_sign; + } + + private function getScopeParts() { + return array( + substr($this->getDate(), 0, 8), + $this->getRegion(), + $this->getService(), + 'aws4_request', + ); + } + + private function computeSigningKey() { + $secret_key = $this->secretKey; + if (!$secret_key) { + throw new Exception( + pht( + 'You must either provide a signing key with setSigningKey(), or '. + 'provide a secret key with setSecretKey().')); + } + + // NOTE: This part of the algorithm uses the raw binary hashes, and the + // result is not human-readable. + $raw_hash = true; + + $signing_key = 'AWS4'.$secret_key->openEnvelope(); + + $scope_parts = $this->getScopeParts(); + foreach ($scope_parts as $scope_part) { + $signing_key = hash_hmac('sha256', $scope_part, $signing_key, $raw_hash); + } + + return $signing_key; + } + + private function getCanonicalHeaderList(HTTPSFuture $future) { + $headers = $this->getCanonicalHeaderMap($future); + + $canonical_headers = array(); + foreach ($headers as $header => $header_value) { + $canonical_headers[] = $header.':'.trim($header_value); + } + + return implode("\n", $canonical_headers); + } + + private function getCanonicalHeaderMap(HTTPSFuture $future) { + $headers = $future->getHeaders(); + $headers[] = array( + 'Host', + $this->getHost($future), + ); + + $header_map = array(); + foreach ($headers as $header) { + list($key, $value) = $header; + $key = phutil_utf8_strtolower($key); + $header_map[$key] = $value; + } + + ksort($header_map); + + return $header_map; + } + + private function getSignedHeaderList(HTTPSFuture $future) { + $headers = $this->getCanonicalHeaderMap($future); + return implode(';', array_keys($headers)); + } + + private function getCanonicalParameterList(HTTPSFuture $future) { + $uri = new PhutilURI($future->getURI()); + $params = $uri->getQueryParams(); + + ksort($params); + $canonical_parameters = array(); + foreach ($params as $key => $value) { + $canonical_parameters[] = rawurlencode($key).'='.rawurlencode($value); + } + $canonical_parameters = implode('&', $canonical_parameters); + + return $canonical_parameters; + } + + private function getCredential() { + $access_key = $this->accessKey; + if (!strlen($access_key)) { + throw new PhutilInvalidStateException('setAccessKey'); + } + + $parts = $this->getScopeParts(); + array_unshift($parts, $access_key); + + return implode('/', $parts); + } + +} diff --git a/src/future/aws/PhutilCloudWatchMetric.php b/src/future/aws/PhutilCloudWatchMetric.php new file mode 100644 --- /dev/null +++ b/src/future/aws/PhutilCloudWatchMetric.php @@ -0,0 +1,50 @@ +name = $name; + return $this; + } + + public function getName() { + return $this->name; + } + + public function setValue($value) { + $this->value = $value; + return $this; + } + + public function getValue() { + return $this->value; + } + + public function setUnit($unit) { + $this->unit = $unit; + return $this; + } + + public function getUnit() { + return $this->unit; + } + + public function setDimensions(array $dimensions) { + $this->dimensions = $dimensions; + return $this; + } + + public function getDimensions() { + return $this->dimensions; + } + + public function addDimension($name, $value) { + $this->dimensions[$name] = $value; + return $this; + } + +} diff --git a/src/future/aws/__tests__/PhutilAWSv4SignatureTestCase.php b/src/future/aws/__tests__/PhutilAWSv4SignatureTestCase.php new file mode 100644 --- /dev/null +++ b/src/future/aws/__tests__/PhutilAWSv4SignatureTestCase.php @@ -0,0 +1,195 @@ +setMethod($method) + ->addHeader('Range', 'bytes=0-9'); + + $signature = id(new PhutilAWSv4Signature()) + ->setAccessKey($access_key) + ->setSecretKey(new PhutilOpaqueEnvelope($secret_key)) + ->setSignContent(true) + ->setDate($date) + ->setRegion($region) + ->setService($service); + + $signature->signRequest($future); + + $expect = <<assertSignature($expect, $future); + } + + + public function testAWSv4SignaturesS3PutObject() { + $access_key = 'AKIAIOSFODNN7EXAMPLE'; + $secret_key = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'; + $date = '20130524T000000Z'; + $region = 'us-east-1'; + $service = 's3'; + $uri = 'https://examplebucket.s3.amazonaws.com/test$file.text'; + $method = 'PUT'; + $body = 'Welcome to Amazon S3.'; + + $future = id(new HTTPSFuture($uri, $body)) + ->setMethod($method) + ->addHeader('X-Amz-Storage-Class', 'REDUCED_REDUNDANCY') + ->addHeader('Date', 'Fri, 24 May 2013 00:00:00 GMT'); + + $signature = id(new PhutilAWSv4Signature()) + ->setAccessKey($access_key) + ->setSecretKey(new PhutilOpaqueEnvelope($secret_key)) + ->setSignContent(true) + ->setDate($date) + ->setRegion($region) + ->setService($service); + + $signature->signRequest($future); + + $expect = <<assertSignature($expect, $future); + } + + + public function testAWSv4SignaturesS3GetBucketLifecycle() { + $access_key = 'AKIAIOSFODNN7EXAMPLE'; + $secret_key = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'; + $date = '20130524T000000Z'; + $region = 'us-east-1'; + $service = 's3'; + $uri = 'https://examplebucket.s3.amazonaws.com/?lifecycle'; + $method = 'GET'; + + $future = id(new HTTPSFuture($uri)) + ->setMethod($method); + + $signature = id(new PhutilAWSv4Signature()) + ->setAccessKey($access_key) + ->setSecretKey(new PhutilOpaqueEnvelope($secret_key)) + ->setSignContent(true) + ->setDate($date) + ->setRegion($region) + ->setService($service); + + $signature->signRequest($future); + + $expect = <<assertSignature($expect, $future); + } + + + public function testAWSv4SignaturesS3GetBucket() { + $access_key = 'AKIAIOSFODNN7EXAMPLE'; + $secret_key = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'; + $date = '20130524T000000Z'; + $region = 'us-east-1'; + $service = 's3'; + $uri = 'https://examplebucket.s3.amazonaws.com/?max-keys=2&prefix=J'; + $method = 'GET'; + + $future = id(new HTTPSFuture($uri)) + ->setMethod($method); + + $signature = id(new PhutilAWSv4Signature()) + ->setAccessKey($access_key) + ->setSecretKey(new PhutilOpaqueEnvelope($secret_key)) + ->setSignContent(true) + ->setDate($date) + ->setRegion($region) + ->setService($service); + + $signature->signRequest($future); + + $expect = <<assertSignature($expect, $future); + } + + public function testAWSv4SignaturesVanillaQuery() { + $access_key = 'AKIDEXAMPLE'; + $secret_key = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'; + $date = '20150830T123600Z'; + $region = 'us-east-1'; + $service = 'service'; + $uri = 'https://example.amazonaws.com/?Param2=value2&Param1=value1'; + $method = 'GET'; + + $future = id(new HTTPSFuture($uri)) + ->setMethod($method); + + $signature = id(new PhutilAWSv4Signature()) + ->setAccessKey($access_key) + ->setSecretKey(new PhutilOpaqueEnvelope($secret_key)) + ->setSignContent(false) + ->setDate($date) + ->setRegion($region) + ->setService($service); + + $signature->signRequest($future); + + $expect = <<assertSignature($expect, $future); + } + + private function assertSignature($expect, HTTPSFuture $signed) { + $authorization = null; + foreach ($signed->getHeaders() as $header) { + list($key, $value) = $header; + if (phutil_utf8_strtolower($key) === 'authorization') { + $authorization = $value; + break; + } + } + + $expect = str_replace("\n\n", ' ', $expect); + $expect = str_replace("\n", '', $expect); + + $this->assertEqual($expect, $authorization); + } + + +} diff --git a/src/future/aws/management/PhutilAWSManagementWorkflow.php b/src/future/aws/management/PhutilAWSManagementWorkflow.php new file mode 100644 --- /dev/null +++ b/src/future/aws/management/PhutilAWSManagementWorkflow.php @@ -0,0 +1,83 @@ +getArgv(); + + $access_key = $argv->getArg('access-key'); + $secret_key = $argv->getArg('secret-key'); + + $has_root = (strlen($access_key) || strlen($secret_key)); + if ($has_root) { + if (!strlen($access_key) || !strlen($secret_key)) { + throw new PhutilArgumentUsageException( + pht( + 'When specifying AWS credentials with --access-key and '. + '--secret-key, you must provide both keys.')); + } + + $template->setAccessKey($access_key); + $template->setSecretKey(new PhutilOpaqueEnvelope($secret_key)); + } + + $has_any = ($has_root); + if (!$has_any) { + throw new PhutilArgumentUsageException( + pht( + 'You must specify AWS credentials. Use --access-key and '. + '--secret-key to provide root credentials.')); + } + + $region = $argv->getArg('region'); + if (!strlen($region)) { + throw new PhutilArgumentUsageException( + pht( + 'You must specify an AWS region with --region.')); + } + + $template->setRegion($region); + + $endpoint = $argv->getArg('endpoint'); + if (!strlen($endpoint)) { + throw new PhutilArgumentUsageException( + pht( + 'You must specify an AWS endpoint with --endpoint.')); + } + + $template->setEndpoint($endpoint); + + return $template; + } + + protected function getAWSArguments() { + return array( + array( + 'name' => 'access-key', + 'param' => 'key', + 'help' => pht('AWS access key.'), + ), + array( + 'name' => 'secret-key', + 'param' => 'file', + 'help' => pht('AWS secret key.'), + ), + array( + 'name' => 'region', + 'param' => 'region', + 'help' => pht('AWS region.'), + ), + array( + 'name' => 'endpoint', + 'param' => 'endpoint', + 'help' => pht('Name of the AWS region to access.'), + ), + ); + } + +} diff --git a/src/future/aws/management/PhutilAWSS3DeleteManagementWorkflow.php b/src/future/aws/management/PhutilAWSS3DeleteManagementWorkflow.php new file mode 100644 --- /dev/null +++ b/src/future/aws/management/PhutilAWSS3DeleteManagementWorkflow.php @@ -0,0 +1,45 @@ +setName('delete') + ->setExamples( + '**delete** --key __key__') + ->setSynopsis(pht('Delete an object from S3.')) + ->setArguments( + array_merge( + $this->getAWSArguments(), + $this->getAWSS3BucketArguments(), + array( + array( + 'name' => 'key', + 'param' => 'key', + 'help' => pht('Specify a key to delete.'), + ), + ))); + } + + public function execute(PhutilArgumentParser $args) { + $key = $args->getArg('key'); + if (!strlen($key)) { + throw new PhutilArgumentUsageException( + pht( + 'Specify an AWS S3 object key to access with --key.')); + } + + $future = $this->newAWSFuture(new PhutilAWSS3Future()) + ->setParametersForDeleteObject($key); + + $future->resolve(); + + echo tsprintf( + "%s\n", + pht('Deleted "%s".', $key)); + + return 0; + } + +} diff --git a/src/future/aws/management/PhutilAWSS3GetManagementWorkflow.php b/src/future/aws/management/PhutilAWSS3GetManagementWorkflow.php new file mode 100644 --- /dev/null +++ b/src/future/aws/management/PhutilAWSS3GetManagementWorkflow.php @@ -0,0 +1,57 @@ +setName('get') + ->setExamples( + '**get** --key __key__') + ->setSynopsis(pht('Download content from S3.')) + ->setArguments( + array_merge( + $this->getAWSArguments(), + $this->getAWSS3BucketArguments(), + array( + array( + 'name' => 'key', + 'param' => 'key', + 'help' => pht('Specify a key to retrieve.'), + ), + ))); + } + + public function execute(PhutilArgumentParser $args) { + $bucket = $args->getArg('bucket'); + if (!strlen($bucket)) { + throw new PhutilArgumentUsageException( + pht( + 'Specify an AWS S3 bucket to access with --bucket.')); + } + + $endpoint = $args->getArg('endpoint'); + if (!strlen($endpoint)) { + throw new PhutilArgumentUsageException( + pht( + 'Specify an AWS S3 endpoint with --endpoint.')); + } + + $key = $args->getArg('key'); + if (!strlen($key)) { + throw new PhutilArgumentUsageException( + pht( + 'Specify an AWS S3 object key to access with --key.')); + } + + $future = $this->newAWSFuture(new PhutilAWSS3Future()) + ->setBucket($bucket) + ->setEndpoint($endpoint) + ->setParametersForGetObject($key); + + echo $future->resolve(); + + return 0; + } + +} diff --git a/src/future/aws/management/PhutilAWSS3ManagementWorkflow.php b/src/future/aws/management/PhutilAWSS3ManagementWorkflow.php new file mode 100644 --- /dev/null +++ b/src/future/aws/management/PhutilAWSS3ManagementWorkflow.php @@ -0,0 +1,27 @@ + 'bucket', + 'param' => 'bucket', + 'help' => pht('Name of the S3 bucket to access.'), + ), + ); + } + + protected function newAWSFuture($future) { + $future = parent::newAWSFuture($future); + + $argv = $this->getArgv(); + $bucket = $argv->getArg('bucket'); + + $future->setBucket($bucket); + + return $future; + } + +} diff --git a/src/future/aws/management/PhutilAWSS3PutManagementWorkflow.php b/src/future/aws/management/PhutilAWSS3PutManagementWorkflow.php new file mode 100644 --- /dev/null +++ b/src/future/aws/management/PhutilAWSS3PutManagementWorkflow.php @@ -0,0 +1,52 @@ +setName('put') + ->setExamples( + '**put** --key __key__') + ->setSynopsis(pht('Upload content to S3.')) + ->setArguments( + array_merge( + $this->getAWSArguments(), + $this->getAWSS3BucketArguments(), + array( + array( + 'name' => 'key', + 'param' => 'key', + 'help' => pht('Specify a key to upload.'), + ), + ))); + } + + public function execute(PhutilArgumentParser $args) { + $key = $args->getArg('key'); + if (!strlen($key)) { + throw new PhutilArgumentUsageException( + pht( + 'Specify an AWS S3 object key to access with --key.')); + } + + $future = $this->newAWSFuture(new PhutilAWSS3Future()); + + echo tsprintf( + "%s\n", + pht('Reading data from stdin...')); + + $data = file_get_contents('php://stdin'); + + $future->setParametersForPutObject($key, $data); + + $result = $future->resolve(); + + echo tsprintf( + "%s\n", + pht('Uploaded "%s".', $key)); + + return 0; + } + +} diff --git a/src/future/exec/CommandException.php b/src/future/exec/CommandException.php new file mode 100644 --- /dev/null +++ b/src/future/exec/CommandException.php @@ -0,0 +1,78 @@ +command = $command; + $this->error = $error; + $this->stdout = $stdout; + $this->stderr = $stderr; + + $summary = array(); + $summary[] = $this->summarize($message); + + $summary[] = 'COMMAND'; + $summary[] = $this->summarize($command); + + $summary[] = null; + $summary[] = 'STDOUT'; + $summary[] = $this->summarize($stdout); + + $summary[] = null; + $summary[] = 'STDERR'; + $summary[] = $this->summarize($stderr); + + $summary = implode("\n", $summary); + + parent::__construct($summary); + } + + public function getCommand() { + return $this->command; + } + + public function getError() { + return $this->error; + } + + public function getStdout() { + return $this->stdout; + } + + public function getStderr() { + return $this->stderr; + } + + private function summarize($string) { + if (!strlen($string)) { + return '(empty)'; + } + + $limit = 1000; + + $len = strlen($string); + if ($len > $limit) { + $cut = $len - $limit; + $suffix = pht('... (%s more byte(s)) ...', new PhutilNumber($cut)); + if ($cut > strlen($suffix)) { + $string = substr($string, 0, $limit).$suffix; + } + } + + // Strip out any credentials for the purpose of building a human readable + // summary of the exception, since these are rarely-if-ever useful when + // debugging, but can expose otherwise sensitive information. + $string = phutil_censor_credentials($string); + + return $string; + } + +} diff --git a/src/future/exec/ExecFuture.php b/src/future/exec/ExecFuture.php new file mode 100644 --- /dev/null +++ b/src/future/exec/ExecFuture.php @@ -0,0 +1,965 @@ + array('pipe', 'r'), // stdin + 1 => array('pipe', 'w'), // stdout + 2 => array('pipe', 'w'), // stderr + ); + + +/* -( Creating ExecFutures )----------------------------------------------- */ + + + /** + * Create a new ExecFuture. + * + * $future = new ExecFuture('wc -l %s', $file_path); + * + * @param string `sprintf()`-style command string which will be passed + * through @{function:csprintf} with the rest of the arguments. + * @param ... Zero or more additional arguments for @{function:csprintf}. + * @return ExecFuture ExecFuture for running the specified command. + * @task create + */ + public function __construct($command) { + $argv = func_get_args(); + $this->command = call_user_func_array('csprintf', $argv); + $this->stdin = new PhutilRope(); + } + + +/* -( Command Information )------------------------------------------------ */ + + + /** + * Retrieve the raw command to be executed. + * + * @return string Raw command. + * @task info + */ + public function getCommand() { + return $this->command; + } + + + /** + * Retrieve the byte limit for the stderr buffer. + * + * @return int Maximum buffer size, in bytes. + * @task info + */ + public function getStderrSizeLimit() { + return $this->stderrSizeLimit; + } + + + /** + * Retrieve the byte limit for the stdout buffer. + * + * @return int Maximum buffer size, in bytes. + * @task info + */ + public function getStdoutSizeLimit() { + return $this->stdoutSizeLimit; + } + + + /** + * Get the process's pid. This only works after execution is initiated, e.g. + * by a call to start(). + * + * @return int Process ID of the executing process. + * @task info + */ + public function getPID() { + $status = $this->procGetStatus(); + return $status['pid']; + } + + +/* -( Configuring Execution )---------------------------------------------- */ + + + /** + * Set a maximum size for the stdout read buffer. To limit stderr, see + * @{method:setStderrSizeLimit}. The major use of these methods is to use less + * memory if you are running a command which sometimes produces huge volumes + * of output that you don't really care about. + * + * NOTE: Setting this to 0 means "no buffer", not "unlimited buffer". + * + * @param int Maximum size of the stdout read buffer. + * @return this + * @task config + */ + public function setStdoutSizeLimit($limit) { + $this->stdoutSizeLimit = $limit; + return $this; + } + + + /** + * Set a maximum size for the stderr read buffer. + * See @{method:setStdoutSizeLimit} for discussion. + * + * @param int Maximum size of the stderr read buffer. + * @return this + * @task config + */ + public function setStderrSizeLimit($limit) { + $this->stderrSizeLimit = $limit; + return $this; + } + + + /** + * Set the maximum internal read buffer size this future. The future will + * block reads once the internal stdout or stderr buffer exceeds this size. + * + * NOTE: If you @{method:resolve} a future with a read buffer limit, you may + * block forever! + * + * TODO: We should probably release the read buffer limit during + * @{method:resolve}, or otherwise detect this. For now, be careful. + * + * @param int|null Maximum buffer size, or `null` for unlimited. + * @return this + */ + public function setReadBufferSize($read_buffer_size) { + $this->readBufferSize = $read_buffer_size; + return $this; + } + + + /** + * Set whether to use non-blocking streams on Windows. + * + * @param bool Whether to use non-blocking streams. + * @return this + * @task config + */ + public function setUseWindowsFileStreams($use_streams) { + if (phutil_is_windows()) { + $this->useWindowsFileStreams = $use_streams; + } + return $this; + } + + +/* -( Interacting With Commands )------------------------------------------ */ + + + /** + * Read and return output from stdout and stderr, if any is available. This + * method keeps a read cursor on each stream, but the entire streams are + * still returned when the future resolves. You can call read() again after + * resolving the future to retrieve only the parts of the streams you did not + * previously read: + * + * $future = new ExecFuture('...'); + * // ... + * list($stdout) = $future->read(); // Returns output so far + * list($stdout) = $future->read(); // Returns new output since first call + * // ... + * list($stdout) = $future->resolvex(); // Returns ALL output + * list($stdout) = $future->read(); // Returns unread output + * + * NOTE: If you set a limit with @{method:setStdoutSizeLimit} or + * @{method:setStderrSizeLimit}, this method will not be able to read data + * past the limit. + * + * NOTE: If you call @{method:discardBuffers}, all the stdout/stderr data + * will be thrown away and the cursors will be reset. + * + * @return pair <$stdout, $stderr> pair with new output since the last call + * to this method. + * @task interact + */ + public function read() { + $stdout = $this->readStdout(); + + $result = array( + $stdout, + (string)substr($this->stderr, $this->stderrPos), + ); + + $this->stderrPos = strlen($this->stderr); + + return $result; + } + + public function readStdout() { + if ($this->start) { + $this->isReady(); // Sync + } + + $result = (string)substr($this->stdout, $this->stdoutPos); + $this->stdoutPos = strlen($this->stdout); + return $result; + } + + + /** + * Write data to stdin of the command. + * + * @param string Data to write. + * @param bool If true, keep the pipe open for writing. By default, the pipe + * will be closed as soon as possible so that commands which + * listen for EOF will execute. If you want to keep the pipe open + * past the start of command execution, do an empty write with + * `$keep_pipe = true` first. + * @return this + * @task interact + */ + public function write($data, $keep_pipe = false) { + if (strlen($data)) { + if (!$this->stdin) { + throw new Exception(pht('Writing to a closed pipe!')); + } + $this->stdin->append($data); + } + $this->closePipe = !$keep_pipe; + + return $this; + } + + + /** + * Permanently discard the stdout and stderr buffers and reset the read + * cursors. This is basically useful only if you are streaming a large amount + * of data from some process: + * + * $future = new ExecFuture('zcat huge_file.gz'); + * do { + * $done = $future->resolve(0.1); // Every 100ms, + * list($stdout) = $future->read(); // read output... + * echo $stdout; // send it somewhere... + * $future->discardBuffers(); // and then free the buffers. + * } while ($done === null); + * + * Conceivably you might also need to do this if you're writing a client using + * @{class:ExecFuture} and `netcat`, but you probably should not do that. + * + * NOTE: This completely discards the data. It won't be available when the + * future resolves. This is almost certainly only useful if you need the + * buffer memory for some reason. + * + * @return this + * @task interact + */ + public function discardBuffers() { + $this->discardStdoutBuffer(); + + $this->stderr = ''; + $this->stderrPos = 0; + + return $this; + } + + public function discardStdoutBuffer() { + $this->stdout = ''; + $this->stdoutPos = 0; + return $this; + } + + + /** + * Returns true if this future was killed by a timeout configured with + * @{method:setTimeout}. + * + * @return bool True if the future was killed for exceeding its time limit. + */ + public function getWasKilledByTimeout() { + return $this->killedByTimeout; + } + + +/* -( Configuring Execution )---------------------------------------------- */ + + + /** + * Set a hard limit on execution time. If the command runs longer, it will + * be terminated and the future will resolve with an error code. You can test + * if a future was killed by a timeout with @{method:getWasKilledByTimeout}. + * + * The subprocess will be sent a `TERM` signal, and then a `KILL` signal a + * short while later if it fails to exit. + * + * @param int Maximum number of seconds this command may execute for before + * it is signaled. + * @return this + * @task config + */ + public function setTimeout($seconds) { + $this->terminateTimeout = $seconds; + $this->killTimeout = $seconds + min($seconds, 60); + return $this; + } + + +/* -( Resolving Execution )------------------------------------------------ */ + + + /** + * Resolve a command you expect to exit with return code 0. Works like + * @{method:resolve}, but throws if $err is nonempty. Returns only + * $stdout and $stderr. See also @{function:execx}. + * + * list($stdout, $stderr) = $future->resolvex(); + * + * @param float Optional timeout after which resolution will pause and + * execution will return to the caller. + * @return pair <$stdout, $stderr> pair. + * @task resolve + */ + public function resolvex($timeout = null) { + list($err, $stdout, $stderr) = $this->resolve($timeout); + if ($err) { + $cmd = $this->command; + throw new CommandException( + pht('Command failed with error #%d!', $err), + $cmd, + $err, + $stdout, + $stderr); + } + return array($stdout, $stderr); + } + + + /** + * Resolve a command you expect to return valid JSON. Works like + * @{method:resolvex}, but also throws if stderr is nonempty, or stdout is not + * valid JSON. Returns a PHP array, decoded from the JSON command output. + * + * @param float Optional timeout after which resolution will pause and + * execution will return to the caller. + * @return array PHP array, decoded from JSON command output. + * @task resolve + */ + public function resolveJSON($timeout = null) { + list($stdout, $stderr) = $this->resolvex($timeout); + if (strlen($stderr)) { + $cmd = $this->command; + throw new CommandException( + pht( + "JSON command '%s' emitted text to stderr when none was expected: %d", + $cmd, + $stderr), + $cmd, + 0, + $stdout, + $stderr); + } + try { + return phutil_json_decode($stdout); + } catch (PhutilJSONParserException $ex) { + $cmd = $this->command; + throw new CommandException( + pht( + "JSON command '%s' did not produce a valid JSON object on stdout: %s", + $cmd, + $stdout), + $cmd, + 0, + $stdout, + $stderr); + } + } + + /** + * Resolve the process by abruptly terminating it. + * + * @return list List of results. + * @task resolve + */ + public function resolveKill() { + if (!$this->result) { + $signal = 9; + + if ($this->proc) { + proc_terminate($this->proc, $signal); + } + + $this->result = array( + 128 + $signal, + $this->stdout, + $this->stderr, + ); + $this->closeProcess(); + } + + return $this->result; + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * Provides read sockets to the future core. + * + * @return list List of read sockets. + * @task internal + */ + public function getReadSockets() { + list($stdin, $stdout, $stderr) = $this->pipes; + $sockets = array(); + if (isset($stdout) && !feof($stdout)) { + $sockets[] = $stdout; + } + if (isset($stderr) && !feof($stderr)) { + $sockets[] = $stderr; + } + return $sockets; + } + + + /** + * Provides write sockets to the future core. + * + * @return list List of write sockets. + * @task internal + */ + public function getWriteSockets() { + list($stdin, $stdout, $stderr) = $this->pipes; + $sockets = array(); + if (isset($stdin) && $this->stdin->getByteLength() && !feof($stdin)) { + $sockets[] = $stdin; + } + return $sockets; + } + + + /** + * Determine if the read buffer is empty. + * + * @return bool True if the read buffer is empty. + * @task internal + */ + public function isReadBufferEmpty() { + return !strlen($this->stdout); + } + + + /** + * Determine if the write buffer is empty. + * + * @return bool True if the write buffer is empty. + * @task internal + */ + public function isWriteBufferEmpty() { + return !$this->getWriteBufferSize(); + } + + + /** + * Determine the number of bytes in the write buffer. + * + * @return int Number of bytes in the write buffer. + * @task internal + */ + public function getWriteBufferSize() { + if (!$this->stdin) { + return 0; + } + return $this->stdin->getByteLength(); + } + + + /** + * Reads some bytes from a stream, discarding output once a certain amount + * has been accumulated. + * + * @param resource Stream to read from. + * @param int Maximum number of bytes to return from $stream. If + * additional bytes are available, they will be read and + * discarded. + * @param string Human-readable description of stream, for exception + * message. + * @param int Maximum number of bytes to read. + * @return string The data read from the stream. + * @task internal + */ + private function readAndDiscard($stream, $limit, $description, $length) { + $output = ''; + + if ($length <= 0) { + return ''; + } + + do { + $data = fread($stream, min($length, 64 * 1024)); + if (false === $data) { + throw new Exception(pht('Failed to read from %s', $description)); + } + + $read_bytes = strlen($data); + + if ($read_bytes > 0 && $limit > 0) { + if ($read_bytes > $limit) { + $data = substr($data, 0, $limit); + } + $output .= $data; + $limit -= strlen($data); + } + + if (strlen($output) >= $length) { + break; + } + } while ($read_bytes > 0); + + return $output; + } + + + /** + * Begin or continue command execution. + * + * @return bool True if future has resolved. + * @task internal + */ + public function isReady() { + // NOTE: We have soft dependencies on PhutilServiceProfiler and + // PhutilErrorTrap here. These dependencies are soft to avoid the need to + // build them into the Phage agent. Under normal circumstances, these + // classes are always available. + + if (!$this->pipes) { + + // NOTE: See note above about Phage. + if (class_exists('PhutilServiceProfiler')) { + $profiler = PhutilServiceProfiler::getInstance(); + $this->profilerCallID = $profiler->beginServiceCall( + array( + 'type' => 'exec', + 'command' => (string)$this->command, + )); + } + + if (!$this->start) { + // We might already have started the timer via initiating resolution. + $this->start = microtime(true); + } + + $unmasked_command = $this->command; + if ($unmasked_command instanceof PhutilCommandString) { + $unmasked_command = $unmasked_command->getUnmaskedString(); + } + + $pipes = array(); + + if (phutil_is_windows()) { + // See T4395. proc_open under Windows uses "cmd /C [cmd]", which will + // strip the first and last quote when there aren't exactly two quotes + // (and some other conditions as well). This results in a command that + // looks like `command" "path to my file" "something something` which is + // clearly wrong. By surrounding the command string with quotes we can + // be sure this process is harmless. + if (strpos($unmasked_command, '"') !== false) { + $unmasked_command = '"'.$unmasked_command.'"'; + } + } + + if ($this->hasEnv()) { + $env = $this->getEnv(); + } else { + $env = null; + } + + $cwd = $this->getCWD(); + + // NOTE: See note above about Phage. + if (class_exists('PhutilErrorTrap')) { + $trap = new PhutilErrorTrap(); + } else { + $trap = null; + } + + $spec = self::$descriptorSpec; + if ($this->useWindowsFileStreams) { + $this->windowsStdoutTempFile = new TempFile(); + $this->windowsStderrTempFile = new TempFile(); + + $spec = array( + 0 => self::$descriptorSpec[0], // stdin + 1 => fopen($this->windowsStdoutTempFile, 'wb'), // stdout + 2 => fopen($this->windowsStderrTempFile, 'wb'), // stderr + ); + + if (!$spec[1] || !$spec[2]) { + throw new Exception(pht( + 'Unable to create temporary files for '. + 'Windows stdout / stderr streams')); + } + } + + $proc = @proc_open( + $unmasked_command, + $spec, + $pipes, + $cwd, + $env); + + if ($this->useWindowsFileStreams) { + fclose($spec[1]); + fclose($spec[2]); + $pipes = array( + 0 => head($pipes), // stdin + 1 => fopen($this->windowsStdoutTempFile, 'rb'), // stdout + 2 => fopen($this->windowsStderrTempFile, 'rb'), // stderr + ); + + if (!$pipes[1] || !$pipes[2]) { + throw new Exception(pht( + 'Unable to open temporary files for '. + 'reading Windows stdout / stderr streams')); + } + } + + if ($trap) { + $err = $trap->getErrorsAsString(); + $trap->destroy(); + } else { + $err = error_get_last(); + } + + if (!is_resource($proc)) { + throw new Exception( + pht( + 'Failed to `%s`: %s', + 'proc_open()', + $err)); + } + + $this->pipes = $pipes; + $this->proc = $proc; + + list($stdin, $stdout, $stderr) = $pipes; + + if (!phutil_is_windows()) { + + // On Windows, we redirect process standard output and standard error + // through temporary files, and then use stream_select to determine + // if there's more data to read. + + if ((!stream_set_blocking($stdout, false)) || + (!stream_set_blocking($stderr, false)) || + (!stream_set_blocking($stdin, false))) { + $this->__destruct(); + throw new Exception(pht('Failed to set streams nonblocking.')); + } + } + + $this->tryToCloseStdin(); + + return false; + } + + if (!$this->proc) { + return true; + } + + list($stdin, $stdout, $stderr) = $this->pipes; + + while (isset($this->stdin) && $this->stdin->getByteLength()) { + $write_segment = $this->stdin->getAnyPrefix(); + + $bytes = fwrite($stdin, $write_segment); + if ($bytes === false) { + throw new Exception(pht('Unable to write to stdin!')); + } else if ($bytes) { + $this->stdin->removeBytesFromHead($bytes); + } else { + // Writes are blocked for now. + break; + } + } + + $this->tryToCloseStdin(); + + // Read status before reading pipes so that we can never miss data that + // arrives between our last read and the process exiting. + $status = $this->procGetStatus(); + + $read_buffer_size = $this->readBufferSize; + + $max_stdout_read_bytes = PHP_INT_MAX; + $max_stderr_read_bytes = PHP_INT_MAX; + if ($read_buffer_size !== null) { + $max_stdout_read_bytes = $read_buffer_size - strlen($this->stdout); + $max_stderr_read_bytes = $read_buffer_size - strlen($this->stderr); + } + + if ($max_stdout_read_bytes > 0) { + $this->stdout .= $this->readAndDiscard( + $stdout, + $this->getStdoutSizeLimit() - strlen($this->stdout), + 'stdout', + $max_stdout_read_bytes); + } + + if ($max_stderr_read_bytes > 0) { + $this->stderr .= $this->readAndDiscard( + $stderr, + $this->getStderrSizeLimit() - strlen($this->stderr), + 'stderr', + $max_stderr_read_bytes); + } + + $is_done = false; + if (!$status['running']) { + // We may still have unread bytes on stdout or stderr, particularly if + // this future is being buffered and streamed. If we do, we don't want to + // consider the subprocess to have exited until we've read everything. + // See T9724 for context. + if (feof($stdout) && feof($stderr)) { + $is_done = true; + } + } + + if ($is_done) { + if ($this->useWindowsFileStreams) { + fclose($stdout); + fclose($stderr); + } + + // If the subprocess got nuked with `kill -9`, we get a -1 exitcode. + // Upgrade this to a slightly more informative value by examining the + // terminating signal code. + $err = $status['exitcode']; + if ($err == -1) { + if ($status['signaled']) { + $err = 128 + $status['termsig']; + } + } + + $this->result = array( + $err, + $this->stdout, + $this->stderr, + ); + $this->closeProcess(); + return true; + } + + $elapsed = (microtime(true) - $this->start); + + if ($this->terminateTimeout && ($elapsed >= $this->terminateTimeout)) { + if (!$this->didTerminate) { + $this->killedByTimeout = true; + $this->sendTerminateSignal(); + return false; + } + } + + if ($this->killTimeout && ($elapsed >= $this->killTimeout)) { + $this->killedByTimeout = true; + $this->resolveKill(); + return true; + } + + } + + + /** + * @return void + * @task internal + */ + public function __destruct() { + if (!$this->proc) { + return; + } + + // NOTE: If we try to proc_close() an open process, we hang indefinitely. To + // avoid this, kill the process explicitly if it's still running. + + $status = $this->procGetStatus(); + if ($status['running']) { + $this->sendTerminateSignal(); + if (!$this->waitForExit(5)) { + $this->resolveKill(); + } + } else { + $this->closeProcess(); + } + } + + + /** + * Close and free resources if necessary. + * + * @return void + * @task internal + */ + private function closeProcess() { + foreach ($this->pipes as $pipe) { + if (isset($pipe)) { + @fclose($pipe); + } + } + $this->pipes = array(null, null, null); + if ($this->proc) { + @proc_close($this->proc); + $this->proc = null; + } + $this->stdin = null; + + if ($this->profilerCallID !== null) { + $profiler = PhutilServiceProfiler::getInstance(); + $profiler->endServiceCall( + $this->profilerCallID, + array( + 'err' => $this->result ? idx($this->result, 0) : null, + )); + $this->profilerCallID = null; + } + } + + + /** + * Execute `proc_get_status()`, but avoid pitfalls. + * + * @return dict Process status. + * @task internal + */ + private function procGetStatus() { + // After the process exits, we only get one chance to read proc_get_status() + // before it starts returning garbage. Make sure we don't throw away the + // last good read. + if ($this->procStatus) { + if (!$this->procStatus['running']) { + return $this->procStatus; + } + } + $this->procStatus = proc_get_status($this->proc); + + return $this->procStatus; + } + + /** + * Try to close stdin, if we're done using it. This keeps us from hanging if + * the process on the other end of the pipe is waiting for EOF. + * + * @return void + * @task internal + */ + private function tryToCloseStdin() { + if (!$this->closePipe) { + // We've been told to keep the pipe open by a call to write(..., true). + return; + } + + if ($this->stdin->getByteLength()) { + // We still have bytes to write. + return; + } + + list($stdin) = $this->pipes; + if (!$stdin) { + // We've already closed stdin. + return; + } + + // There's nothing stopping us from closing stdin, so close it. + + @fclose($stdin); + $this->pipes[0] = null; + } + + public function getDefaultWait() { + $wait = parent::getDefaultWait(); + + $next_timeout = $this->getNextTimeout(); + if ($next_timeout) { + if (!$this->start) { + $this->start = microtime(true); + } + $elapsed = (microtime(true) - $this->start); + $wait = max(0, min($next_timeout - $elapsed, $wait)); + } + + return $wait; + } + + private function getNextTimeout() { + if ($this->didTerminate) { + return $this->killTimeout; + } else { + return $this->terminateTimeout; + } + } + + private function sendTerminateSignal() { + $this->didTerminate = true; + proc_terminate($this->proc); + return $this; + } + + private function waitForExit($duration) { + $start = microtime(true); + + while (true) { + $status = $this->procGetStatus(); + if (!$status['running']) { + return true; + } + + $waited = (microtime(true) - $start); + if ($waited > $duration) { + return false; + } + } + } + +} diff --git a/src/future/exec/PhutilBacktraceSignalHandler.php b/src/future/exec/PhutilBacktraceSignalHandler.php new file mode 100644 --- /dev/null +++ b/src/future/exec/PhutilBacktraceSignalHandler.php @@ -0,0 +1,22 @@ +getTraceAsString()); + } + +} diff --git a/src/future/exec/PhutilCallbackSignalHandler.php b/src/future/exec/PhutilCallbackSignalHandler.php new file mode 100644 --- /dev/null +++ b/src/future/exec/PhutilCallbackSignalHandler.php @@ -0,0 +1,22 @@ +signal = $signal; + $this->callback = $callback; + } + + public function canHandleSignal(PhutilSignalRouter $router, $signo) { + return ($signo === $this->signal); + } + + public function handleSignal(PhutilSignalRouter $router, $signo) { + call_user_func($this->callback, $signo); + } + +} diff --git a/src/future/exec/PhutilConsoleMetricsSignalHandler.php b/src/future/exec/PhutilConsoleMetricsSignalHandler.php new file mode 100644 --- /dev/null +++ b/src/future/exec/PhutilConsoleMetricsSignalHandler.php @@ -0,0 +1,14 @@ +didGetWINCHSignal(); + } + +} diff --git a/src/future/exec/PhutilExecPassthru.php b/src/future/exec/PhutilExecPassthru.php new file mode 100644 --- /dev/null +++ b/src/future/exec/PhutilExecPassthru.php @@ -0,0 +1,141 @@ +execute(); + * + * You can set the current working directory for the command with + * @{method:setCWD}, and set the environment with @{method:setEnv}. + * + * @task command Executing Passthru Commands + */ +final class PhutilExecPassthru extends PhutilExecutableFuture { + + + private $command; + private $passthruResult; + + +/* -( Executing Passthru Commands )---------------------------------------- */ + + + /** + * Build a new passthru command. + * + * $exec = new PhutilExecPassthru('ls %s', $dir); + * + * @param string Command pattern. See @{function:csprintf}. + * @param ... Pattern arguments. + * + * @task command + */ + public function __construct($pattern /* , ... */) { + $args = func_get_args(); + $this->command = call_user_func_array('csprintf', $args); + } + + + /** + * Execute this command. + * + * @return int Error code returned by the subprocess. + * + * @task command + */ + public function execute() { + $command = $this->command; + + $profiler = PhutilServiceProfiler::getInstance(); + $call_id = $profiler->beginServiceCall( + array( + 'type' => 'exec', + 'subtype' => 'passthru', + 'command' => $command, + )); + + $spec = array(STDIN, STDOUT, STDERR); + $pipes = array(); + + if ($command instanceof PhutilCommandString) { + $unmasked_command = $command->getUnmaskedString(); + } else { + $unmasked_command = $command; + } + + if ($this->hasEnv()) { + $env = $this->getEnv(); + } else { + $env = null; + } + + $cwd = $this->getCWD(); + + $options = array(); + if (phutil_is_windows()) { + // Without 'bypass_shell', things like launching vim don't work properly, + // and we can't execute commands with spaces in them, and all commands + // invoked from git bash fail horridly, and everything is a mess in + // general. + $options['bypass_shell'] = true; + } + + $trap = new PhutilErrorTrap(); + $proc = @proc_open( + $unmasked_command, + $spec, + $pipes, + $cwd, + $env, + $options); + $errors = $trap->getErrorsAsString(); + $trap->destroy(); + + if (!is_resource($proc)) { + throw new Exception( + pht( + 'Failed to passthru %s: %s', + 'proc_open()', + $errors)); + } + + $err = proc_close($proc); + + $profiler->endServiceCall( + $call_id, + array( + 'err' => $err, + )); + + return $err; + } + + +/* -( Future )------------------------------------------------------------- */ + + + public function isReady() { + // This isn't really a future because it executes synchronously and has + // full control of the console. We're just implementing the interfaces to + // make it easier to share code with ExecFuture. + + if ($this->passthruResult === null) { + $this->passthruResult = $this->execute(); + } + + return true; + } + + protected function getResult() { + return $this->passthruResult; + } + +} diff --git a/src/future/exec/PhutilExecutableFuture.php b/src/future/exec/PhutilExecutableFuture.php new file mode 100644 --- /dev/null +++ b/src/future/exec/PhutilExecutableFuture.php @@ -0,0 +1,155 @@ +setEnv(array('X' => 'y')); + * + * // Env will have ONLY "X". + * $exec->setEnv(array('X' => 'y'), $wipe_process_env = true); + * + * @param map Dictionary of environmental variables. + * @param bool Optionally, pass `true` to replace the existing environment. + * @return this + * + * @task config + */ + final public function setEnv(array $env, $wipe_process_env = false) { + // Force values to strings here. The underlying PHP commands get upset if + // they are handed non-string values as environmental variables. + foreach ($env as $key => $value) { + $env[$key] = (string)$value; + } + + if (!$wipe_process_env) { + $env = $env + $this->getEnv(); + } + + $this->env = $env; + + return $this; + } + + + /** + * Set the value of a specific environmental variable for this command. + * + * @param string Environmental variable name. + * @param string|null New value, or null to remove this variable. + * @return this + * @task config + */ + final public function updateEnv($key, $value) { + $env = $this->getEnv(); + + if ($value === null) { + unset($env[$key]); + } else { + $env[$key] = (string)$value; + } + + $this->env = $env; + + return $this; + } + + + /** + * Returns `true` if this command has a configured environment. + * + * @return bool True if this command has an environment. + * @task config + */ + final public function hasEnv() { + return ($this->env !== null); + } + + + /** + * Get the configured environment. + * + * @return map Effective environment for this command. + * @task config + */ + final public function getEnv() { + if (!$this->hasEnv()) { + $default_env = $_ENV; + + // If `variables_order` does not include "E", the $_ENV superglobal + // does not build and there's no apparent reasonable way for us to + // rebuild it (we could perhaps parse the output of `export`). + + // For now, explicitly populate variables which we rely on and which + // we know may exist. After T12071, we should be able to rely on + // $_ENV and no longer need to do this. + + $known_keys = array( + 'PHABRICATOR_ENV', + 'PHABRICATOR_INSTANCE', + ); + + foreach ($known_keys as $known_key) { + $value = getenv($known_key); + if (strlen($value)) { + $default_env[$known_key] = $value; + } + } + + $this->setEnv($default_env, $wipe_process_env = true); + } + + return $this->env; + } + + + /** + * Set the current working directory for the subprocess (that is, set where + * the subprocess will execute). If not set, the default value is the parent's + * current working directory. + * + * @param string Directory to execute the subprocess in. + * @return this + * @task config + */ + final public function setCWD($cwd) { + $cwd = (string)$cwd; + + if (!is_dir($cwd)) { + throw new Exception( + pht( + 'Preparing to run a command in directory "%s", but that '. + 'directory does not exist.', + $cwd)); + } + + $this->cwd = $cwd; + + return $this; + } + + + /** + * Get the command's current working directory. + * + * @return string Working directory. + * @task config + */ + final public function getCWD() { + return $this->cwd; + } + +} diff --git a/src/future/exec/PhutilSignalHandler.php b/src/future/exec/PhutilSignalHandler.php new file mode 100644 --- /dev/null +++ b/src/future/exec/PhutilSignalHandler.php @@ -0,0 +1,8 @@ + + } + + public static function initialize() { + if (!self::$router) { + $router = new self(); + + // If pcntl_signal() does not exist (particularly, on Windows), just + // don't install signal handlers. + if (function_exists('pcntl_signal')) { + pcntl_signal(SIGHUP, array($router, 'routeSignal')); + pcntl_signal(SIGTERM, array($router, 'routeSignal')); + pcntl_signal(SIGWINCH, array($router, 'routeSignal')); + } + + self::$router = $router; + } + + return self::getRouter(); + } + + public static function getRouter() { + if (!self::$router) { + throw new Exception(pht('Signal router has not been initialized!')); + } + + return self::$router; + } + + public function installHandler($key, PhutilSignalHandler $handler) { + if (isset($this->handlers[$key])) { + throw new Exception( + pht( + 'Signal handler with key "%s" is already installed.', + $key)); + } + + $this->handlers[$key] = $handler; + + return $this; + } + + public function getHandler($key) { + return idx($this->handlers, $key); + } + + public function routeSignal($signo) { + $exceptions = array(); + + $handlers = $this->handlers; + foreach ($handlers as $key => $handler) { + try { + if ($handler->canHandleSignal($this, $signo)) { + $handler->handleSignal($this, $signo); + } + } catch (Exception $ex) { + $exceptions[] = $ex; + } + } + + if ($exceptions) { + throw new PhutilAggregateException( + pht( + 'Signal handlers raised exceptions while handling "%s".', + phutil_get_signal_name($signo)), + $exceptions); + } + + switch ($signo) { + case SIGTERM: + // Normally, PHP doesn't invoke destructors when exiting in response to + // a signal. This forces it to do so, so we have a fighting chance of + // releasing any locks, leases or resources on our way out. + exit(128 + $signo); + } + } + +} diff --git a/src/future/exec/__tests__/ExecFutureTestCase.php b/src/future/exec/__tests__/ExecFutureTestCase.php new file mode 100644 --- /dev/null +++ b/src/future/exec/__tests__/ExecFutureTestCase.php @@ -0,0 +1,155 @@ +write('')->resolvex(); + + $this->assertEqual('', $stdout); + } + + public function testKeepPipe() { + // NOTE: This is mostly testing the semantics of $keep_pipe in write(). + + list($stdout) = id(new ExecFuture('cat')) + ->write('', true) + ->start() + ->write('x', true) + ->write('y', true) + ->write('z', false) + ->resolvex(); + + $this->assertEqual('xyz', $stdout); + } + + public function testLargeBuffer() { + // NOTE: This is mostly a coverage test to hit branches where we're still + // flushing a buffer. + + $data = str_repeat('x', 1024 * 1024 * 4); + list($stdout) = id(new ExecFuture('cat'))->write($data)->resolvex(); + + $this->assertEqual($data, $stdout); + } + + public function testBufferLimit() { + $data = str_repeat('x', 1024 * 1024); + list($stdout) = id(new ExecFuture('cat')) + ->setStdoutSizeLimit(1024) + ->write($data) + ->resolvex(); + + $this->assertEqual(substr($data, 0, 1024), $stdout); + } + + public function testResolveTimeoutTestShouldRunLessThan1Sec() { + // NOTE: This tests interactions between the resolve() timeout and the + // ExecFuture timeout, which are similar but not identical. + + $future = id(new ExecFuture('sleep 32000'))->start(); + $future->setTimeout(32000); + + // We expect this to return in 0.01s. + $result = $future->resolve(0.01); + $this->assertEqual($result, null); + + // We expect this to now force the time out / kill immediately. If we don't + // do this, we'll hang when exiting until our subprocess exits (32000 + // seconds!) + $future->setTimeout(0.01); + $future->resolve(); + } + + public function testTerminateWithoutStart() { + // We never start this future, but it should be fine to kill a future from + // any state. + $future = new ExecFuture('sleep 1'); + $future->resolveKill(); + + $this->assertTrue(true); + } + + public function testTimeoutTestShouldRunLessThan1Sec() { + // NOTE: This is partly testing that we choose appropriate select wait + // times; this test should run for significantly less than 1 second. + + $future = new ExecFuture('sleep 32000'); + list($err) = $future->setTimeout(0.01)->resolve(); + + $this->assertTrue($err > 0); + $this->assertTrue($future->getWasKilledByTimeout()); + } + + public function testMultipleTimeoutsTestShouldRunLessThan1Sec() { + $futures = array(); + for ($ii = 0; $ii < 4; $ii++) { + $futures[] = id(new ExecFuture('sleep 32000'))->setTimeout(0.01); + } + + foreach (new FutureIterator($futures) as $future) { + list($err) = $future->resolve(); + + $this->assertTrue($err > 0); + $this->assertTrue($future->getWasKilledByTimeout()); + } + } + + public function testMultipleResolves() { + // It should be safe to call resolve(), resolvex(), resolveKill(), etc., + // as many times as you want on the same process. + + $future = new ExecFuture('echo quack'); + $future->resolve(); + $future->resolvex(); + list($err) = $future->resolveKill(); + + $this->assertEqual(0, $err); + } + + public function testReadBuffering() { + $str_len_8 = 'abcdefgh'; + $str_len_4 = 'abcd'; + + // This is a write/read with no read buffer. + $future = new ExecFuture('cat'); + $future->write($str_len_8); + + do { + $future->isReady(); + list($read) = $future->read(); + if (strlen($read)) { + break; + } + } while (true); + + // We expect to get the entire string back in the read. + $this->assertEqual($str_len_8, $read); + $future->resolve(); + + + // This is a write/read with a read buffer. + $future = new ExecFuture('cat'); + $future->write($str_len_8); + + // Set the read buffer size. + $future->setReadBufferSize(4); + do { + $future->isReady(); + list($read) = $future->read(); + if (strlen($read)) { + break; + } + } while (true); + + // We expect to get the entire string back in the read. + $this->assertEqual($str_len_4, $read); + + // Remove the limit so we can resolve the future. + $future->setReadBufferSize(null); + $future->resolve(); + } + +} diff --git a/src/future/exec/__tests__/ExecPassthruTestCase.php b/src/future/exec/__tests__/ExecPassthruTestCase.php new file mode 100644 --- /dev/null +++ b/src/future/exec/__tests__/ExecPassthruTestCase.php @@ -0,0 +1,16 @@ +execute(); + $this->assertEqual(0, $err); + } + +} diff --git a/src/future/exec/execx.php b/src/future/exec/execx.php new file mode 100644 --- /dev/null +++ b/src/future/exec/execx.php @@ -0,0 +1,107 @@ +resolvex(); +} + + +/** + * Execute a command and capture stdout, stderr, and the return value. + * + * list ($err, $stdout, $stderr) = exec_manual('ls %s', $file); + * + * When invoking this function, you must manually handle the error condition. + * Error flows can often be simplified by using @{function:execx} instead, + * which throws an exception when it encounters an error. + * + * @param string sprintf()-style command pattern to execute. + * @param ... Arguments to sprintf pattern. + * @return array List of return code, stdout, and stderr. + */ +function exec_manual($cmd /* , ... */) { + $args = func_get_args(); + $ef = newv('ExecFuture', $args); + return $ef->resolve(); +} + + +/** + * Wrapper for @{class:PhutilExecPassthru}. + * + * @param string sprintf()-style command pattern to execute. + * @param ... Arguments to sprintf pattern. + * @return int Return code. + */ +function phutil_passthru($cmd /* , ... */) { + $args = func_get_args(); + return newv('PhutilExecPassthru', $args)->execute(); +} + + +/** + * Return a human-readable signal name (like "SIGINT" or "SIGKILL") for a given + * signal number. + * + * @param int Signal number. + * @return string Human-readable signal name. + */ +function phutil_get_signal_name($signo) { + // These aren't always defined; try our best to look up the signal name. + $constant_names = array( + 'SIGHUP', + 'SIGINT', + 'SIGQUIT', + 'SIGILL', + 'SIGTRAP', + 'SIGABRT', + 'SIGIOT', + 'SIGBUS', + 'SIGFPE', + 'SIGUSR1', + 'SIGSEGV', + 'SIGUSR2', + 'SIGPIPE', + 'SIGALRM', + 'SIGTERM', + 'SIGSTKFLT', + 'SIGCLD', + 'SIGCHLD', + 'SIGCONT', + 'SIGTSTP', + 'SIGTTIN', + 'SIGTTOU', + 'SIGURG', + 'SIGXCPU', + 'SIGXFSZ', + 'SIGVTALRM', + 'SIGPROF', + 'SIGWINCH', + 'SIGPOLL', + 'SIGIO', + 'SIGPWR', + 'SIGSYS', + 'SIGBABY', + ); + + $signal_names = array(); + foreach ($constant_names as $constant) { + if (defined($constant)) { + $signal_names[constant($constant)] = $constant; + } + } + + return idx($signal_names, $signo); +} diff --git a/src/future/github/PhutilGitHubFuture.php b/src/future/github/PhutilGitHubFuture.php new file mode 100644 --- /dev/null +++ b/src/future/github/PhutilGitHubFuture.php @@ -0,0 +1,130 @@ +accessToken = $token; + return $this; + } + + public function setRawGitHubQuery($action, array $params = array()) { + $this->action = $action; + $this->params = $params; + return $this; + } + + public function setMethod($method) { + $this->method = $method; + return $this; + } + + public function addHeader($key, $value) { + $this->headers[] = array($key, $value); + return $this; + } + + protected function getProxiedFuture() { + if (!$this->future) { + $params = $this->params; + + if (!$this->action) { + throw new Exception( + pht( + 'You must %s!', + 'setRawGitHubQuery()')); + } + + if (!$this->accessToken) { + throw new Exception( + pht( + 'You must %s!', + 'setAccessToken()')); + } + + $uri = new PhutilURI('https://api.github.com/'); + $uri->setPath('/'.ltrim($this->action, '/')); + + $future = new HTTPSFuture($uri); + $future->setData($this->params); + $future->addHeader('Authorization', 'token '.$this->accessToken); + // NOTE: GitHub requires a 'User-Agent' header. + $future->addHeader('User-Agent', __CLASS__); + $future->setMethod($this->method); + + foreach ($this->headers as $header) { + list($key, $value) = $header; + $future->addHeader($key, $value); + } + + $this->future = $future; + } + + return $this->future; + } + + protected function didReceiveResult($result) { + list($status, $body, $headers) = $result; + + if ($status->isError()) { + if ($this->isRateLimitResponse($status, $headers)) { + // Do nothing, this is a rate limit. + } else if ($this->isNotModifiedResponse($status)) { + // Do nothing, this is a "Not Modified" response. + } else { + // This is an error condition we do not expect. + throw $status; + } + } + + try { + if (strlen($body)) { + $data = phutil_json_decode($body); + } else { + // This can happen for 304 responses. + $data = array(); + } + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Expected JSON response from GitHub.'), + $ex); + } + + return id(new PhutilGitHubResponse()) + ->setStatus($status) + ->setHeaders($headers) + ->setBody($data); + } + + private function isNotModifiedResponse($status) { + return ($status->getStatusCode() == 304); + } + + private function isRateLimitResponse($status, array $headers) { + if ($status->getStatusCode() != 403) { + return false; + } + + foreach ($headers as $header) { + list($key, $value) = $header; + if (phutil_utf8_strtolower($key) === 'x-ratelimit-remaining') { + if (!(int)$value) { + return true; + } + } + } + + return false; + } + +} diff --git a/src/future/github/PhutilGitHubResponse.php b/src/future/github/PhutilGitHubResponse.php new file mode 100644 --- /dev/null +++ b/src/future/github/PhutilGitHubResponse.php @@ -0,0 +1,49 @@ +status = $status; + return $this; + } + + public function getStatus() { + return $this->status; + } + + public function setBody(array $body) { + $this->body = $body; + return $this; + } + + public function getBody() { + return $this->body; + } + + public function setHeaders(array $headers) { + $this->headers = $headers; + return $this; + } + + public function getHeaders() { + return $this->headers; + } + + public function getHeaderValue($key, $default = null) { + $key = phutil_utf8_strtolower($key); + + foreach ($this->headers as $header) { + list($hkey, $value) = $header; + if (phutil_utf8_strtolower($hkey) === $key) { + return $value; + } + } + + return $default; + } + +} diff --git a/src/future/http/BaseHTTPFuture.php b/src/future/http/BaseHTTPFuture.php new file mode 100644 --- /dev/null +++ b/src/future/http/BaseHTTPFuture.php @@ -0,0 +1,427 @@ +resolve(); + * + * This is an abstract base class which defines the API that HTTP futures + * conform to. Concrete implementations are available in @{class:HTTPFuture} + * and @{class:HTTPSFuture}. All futures return a tuple + * when resolved; status is an object of class @{class:HTTPFutureResponseStatus} + * and may represent any of a wide variety of errors in the transport layer, + * a support library, or the actual HTTP exchange. + * + * @task create Creating a New Request + * @task config Configuring the Request + * @task resolve Resolving the Request + * @task internal Internals + */ +abstract class BaseHTTPFuture extends Future { + + private $method = 'GET'; + private $timeout = 300.0; + private $headers = array(); + private $uri; + private $data; + private $expect; + + +/* -( Creating a New Request )--------------------------------------------- */ + + + /** + * Build a new future which will make an HTTP request to a given URI, with + * some optional data payload. Since this class is abstract you can't actually + * instantiate it; instead, build a new @{class:HTTPFuture} or + * @{class:HTTPSFuture}. + * + * @param string Fully-qualified URI to send a request to. + * @param mixed String or array to include in the request. Strings will be + * transmitted raw; arrays will be encoded and sent as + * 'application/x-www-form-urlencoded'. + * @task create + */ + final public function __construct($uri, $data = array()) { + $this->setURI((string)$uri); + $this->setData($data); + } + + +/* -( Configuring the Request )-------------------------------------------- */ + + + /** + * Set a timeout for the service call. If the request hasn't resolved yet, + * the future will resolve with a status that indicates the request timed + * out. You can determine if a status is a timeout status by calling + * isTimeout() on the status object. + * + * @param float Maximum timeout, in seconds. + * @return this + * @task config + */ + public function setTimeout($timeout) { + $this->timeout = $timeout; + return $this; + } + + + /** + * Get the currently configured timeout. + * + * @return float Maximum number of seconds the request will execute for. + * @task config + */ + public function getTimeout() { + return $this->timeout; + } + + + /** + * Select the HTTP method (e.g., "GET", "POST", "PUT") to use for the request. + * By default, requests use "GET". + * + * @param string HTTP method name. + * @return this + * @task config + */ + final public function setMethod($method) { + static $supported_methods = array( + 'GET' => true, + 'POST' => true, + 'PUT' => true, + 'DELETE' => true, + ); + + if (empty($supported_methods[$method])) { + throw new Exception( + pht( + "The HTTP method '%s' is not supported. Supported HTTP methods ". + "are: %s.", + $method, + implode(', ', array_keys($supported_methods)))); + } + + $this->method = $method; + return $this; + } + + + /** + * Get the HTTP method the request will use. + * + * @return string HTTP method name, like "GET". + * @task config + */ + final public function getMethod() { + return $this->method; + } + + + /** + * Set the URI to send the request to. Note that this is also a constructor + * parameter. + * + * @param string URI to send the request to. + * @return this + * @task config + */ + public function setURI($uri) { + $this->uri = (string)$uri; + return $this; + } + + + /** + * Get the fully-qualified URI the request will be made to. + * + * @return string URI the request will be sent to. + * @task config + */ + public function getURI() { + return $this->uri; + } + + + /** + * Provide data to send along with the request. Note that this is also a + * constructor parameter; it may be more convenient to provide it there. Data + * must be a string (in which case it will be sent raw) or an array (in which + * case it will be encoded and sent as 'application/x-www-form-urlencoded'). + * + * @param mixed Data to send with the request. + * @return this + * @task config + */ + public function setData($data) { + if (!is_string($data) && !is_array($data)) { + throw new Exception(pht('Data parameter must be an array or string.')); + } + $this->data = $data; + return $this; + } + + + /** + * Get the data which will be sent with the request. + * + * @return mixed Data which will be sent. + * @task config + */ + public function getData() { + return $this->data; + } + + + /** + * Add an HTTP header to the request. The same header name can be specified + * more than once, which will cause multiple headers to be sent. + * + * @param string Header name, like "Accept-Language". + * @param string Header value, like "en-us". + * @return this + * @task config + */ + public function addHeader($name, $value) { + $this->headers[] = array($name, $value); + return $this; + } + + + /** + * Get headers which will be sent with the request. Optionally, you can + * provide a filter, which will return only headers with that name. For + * example: + * + * $all_headers = $future->getHeaders(); + * $just_user_agent = $future->getHeaders('User-Agent'); + * + * In either case, an array with all (or all matching) headers is returned. + * + * @param string|null Optional filter, which selects only headers with that + * name if provided. + * @return array List of all (or all matching) headers. + * @task config + */ + public function getHeaders($filter = null) { + $filter = strtolower($filter); + + $result = array(); + foreach ($this->headers as $header) { + list($name, $value) = $header; + if (!$filter || ($filter == strtolower($name))) { + $result[] = $header; + } + } + + return $result; + } + + /** + * Set the status codes that are expected in the response. + * If set, isError on the status object will return true for status codes + * that are not in the input array. Otherwise, isError will be true for any + * HTTP status code outside the 2xx range (notwithstanding other errors such + * as connection or transport issues). + * + * @param array|null List of expected HTTP status codes. + * + * @return this + * @task config + */ + public function setExpectStatus($status_codes) { + $this->expect = $status_codes; + return $this; + } + + /** + * Return list of expected status codes, or null if not set. + * + * @return array|null List of expected status codes. + */ + public function getExpectStatus() { + return $this->expect; + } + + + /** + * Add a HTTP basic authentication header to the request. + * + * @param string Username to authenticate with. + * @param PhutilOpaqueEnvelope Password to authenticate with. + * @return this + * @task config + */ + public function setHTTPBasicAuthCredentials( + $username, + PhutilOpaqueEnvelope $password) { + + $password_plaintext = $password->openEnvelope(); + $credentials = base64_encode($username.':'.$password_plaintext); + + return $this->addHeader('Authorization', 'Basic '.$credentials); + } + + public function getHTTPRequestByteLength() { + // NOTE: This isn't very accurate, but it's only used by the "--trace" + // call profiler to help pick out huge requests. + $data = $this->getData(); + + if (is_scalar($data)) { + return strlen($data); + } + + return strlen(http_build_query($data, '', '&')); + } + + +/* -( Resolving the Request )---------------------------------------------- */ + + + /** + * Exception-oriented @{method:resolve}. Throws if the status indicates an + * error occurred. + * + * @return tuple HTTP request result tuple. + * @task resolve + */ + final public function resolvex() { + $result = $this->resolve(); + + list($status, $body, $headers) = $result; + if ($status->isError()) { + throw $status; + } + + return array($body, $headers); + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * Parse a raw HTTP response into a tuple. + * + * @param string Raw HTTP response. + * @return tuple Valid resolution tuple. + * @task internal + */ + protected function parseRawHTTPResponse($raw_response) { + $rex_base = "@^(?P.*?)\r?\n\r?\n(?P.*)$@s"; + $rex_head = "@^HTTP/\S+ (?P\d+) ?(?P.*?)". + "(?:\r?\n(?P.*))?$@s"; + + // We need to parse one or more header blocks in case we got any + // "HTTP/1.X 100 Continue" nonsense back as part of the response. This + // happens with HTTPS requests, at the least. + $response = $raw_response; + while (true) { + $matches = null; + if (!preg_match($rex_base, $response, $matches)) { + return $this->buildMalformedResult($raw_response); + } + + $head = $matches['head']; + $body = $matches['body']; + + if (!preg_match($rex_head, $head, $matches)) { + return $this->buildMalformedResult($raw_response); + } + + $response_code = (int)$matches['code']; + $response_status = strtolower($matches['status']); + if ($response_code == 100) { + // This is HTTP/1.X 100 Continue, so this whole chunk is moot. + $response = $body; + } else if (($response_code == 200) && + ($response_status == 'connection established')) { + // When tunneling through an HTTPS proxy, we get an initial header + // block like "HTTP/1.X 200 Connection established", then newlines, + // then the normal response. Drop this chunk. + $response = $body; + } else { + $headers = $this->parseHeaders(idx($matches, 'headers')); + break; + } + } + + $status = new HTTPFutureHTTPResponseStatus( + $response_code, + $body, + $headers, + $this->expect); + + return array($status, $body, $headers); + } + + /** + * Parse an HTTP header block. + * + * @param string Raw HTTP headers. + * @return list List of HTTP header tuples. + * @task internal + */ + protected function parseHeaders($head_raw) { + $rex_header = '@^(?P.*?):\s*(?P.*)$@'; + + $headers = array(); + + if (!$head_raw) { + return $headers; + } + + $headers_raw = preg_split("/\r?\n/", $head_raw); + foreach ($headers_raw as $header) { + $m = null; + if (preg_match($rex_header, $header, $m)) { + $headers[] = array($m['name'], $m['value']); + } else { + $headers[] = array($header, null); + } + } + + return $headers; + } + + + /** + * Find value of the first header with given name. + * + * @param list List of headers from `resolve()`. + * @param string Case insensitive header name. + * @return string Value of the header or null if not found. + * @task resolve + */ + public static function getHeader(array $headers, $search) { + assert_instances_of($headers, 'array'); + foreach ($headers as $header) { + list($name, $value) = $header; + if (strcasecmp($name, $search) == 0) { + return $value; + } + } + return null; + } + + + /** + * Build a result tuple indicating a parse error resulting from a malformed + * HTTP response. + * + * @return tuple Valid resolution tuple. + * @task internal + */ + protected function buildMalformedResult($raw_response) { + $body = null; + $headers = array(); + + $status = new HTTPFutureParseResponseStatus( + HTTPFutureParseResponseStatus::ERROR_MALFORMED_RESPONSE, + $raw_response); + return array($status, $body, $headers); + } + +} diff --git a/src/future/http/HTTPFuture.php b/src/future/http/HTTPFuture.php new file mode 100644 --- /dev/null +++ b/src/future/http/HTTPFuture.php @@ -0,0 +1,302 @@ +resolvex(); + * + * Or + * + * $future = new HTTPFuture('http://www.example.com/'); + * list($http_response_status_object, + * $response_body, + * $headers) = $future->resolve(); + * + * Prefer @{method:resolvex} to @{method:resolve} as the former throws + * @{class:HTTPFutureHTTPResponseStatus} on failures, which includes an + * informative exception message. + */ +final class HTTPFuture extends BaseHTTPFuture { + + private $host; + private $port = 80; + private $fullRequestPath; + + private $socket; + private $writeBuffer; + private $response; + + private $stateConnected = false; + private $stateWriteComplete = false; + private $stateReady = false; + private $stateStartTime; + + private $profilerCallID; + + public function setURI($uri) { + $parts = parse_url($uri); + if (!$parts) { + throw new Exception(pht("Could not parse URI '%s'.", $uri)); + } + + if (empty($parts['scheme']) || $parts['scheme'] !== 'http') { + throw new Exception( + pht( + "URI '%s' must be fully qualified with '%s' scheme.", + $uri, + 'http://')); + } + + if (!isset($parts['host'])) { + throw new Exception( + pht("URI '%s' must be fully qualified and include host name.", $uri)); + } + + $this->host = $parts['host']; + + if (!empty($parts['port'])) { + $this->port = $parts['port']; + } + + if (isset($parts['user']) || isset($parts['pass'])) { + throw new Exception( + pht('HTTP Basic Auth is not supported by %s.', __CLASS__)); + } + + if (isset($parts['path'])) { + $this->fullRequestPath = $parts['path']; + } else { + $this->fullRequestPath = '/'; + } + + if (isset($parts['query'])) { + $this->fullRequestPath .= '?'.$parts['query']; + } + + return parent::setURI($uri); + } + + public function __destruct() { + if ($this->socket) { + @fclose($this->socket); + $this->socket = null; + } + } + + public function getReadSockets() { + if ($this->socket) { + return array($this->socket); + } + return array(); + } + + public function getWriteSockets() { + if (strlen($this->writeBuffer)) { + return array($this->socket); + } + return array(); + } + + public function isWriteComplete() { + return $this->stateWriteComplete; + } + + private function getDefaultUserAgent() { + return __CLASS__.'/1.0'; + } + + public function isReady() { + if ($this->stateReady) { + return true; + } + + if (!$this->socket) { + $this->stateStartTime = microtime(true); + $this->socket = $this->buildSocket(); + if (!$this->socket) { + return $this->stateReady; + } + + $profiler = PhutilServiceProfiler::getInstance(); + $this->profilerCallID = $profiler->beginServiceCall( + array( + 'type' => 'http', + 'uri' => $this->getURI(), + )); + } + + if (!$this->stateConnected) { + $read = array(); + $write = array($this->socket); + $except = array(); + $select = stream_select($read, $write, $except, $tv_sec = 0); + if ($write) { + $this->stateConnected = true; + } + } + + if ($this->stateConnected) { + if (strlen($this->writeBuffer)) { + $bytes = @fwrite($this->socket, $this->writeBuffer); + if ($bytes === false) { + throw new Exception(pht('Failed to write to buffer.')); + } else if ($bytes) { + $this->writeBuffer = substr($this->writeBuffer, $bytes); + } + } + + if (!strlen($this->writeBuffer)) { + $this->stateWriteComplete = true; + } + + while (($data = fread($this->socket, 32768)) || strlen($data)) { + $this->response .= $data; + } + + if ($data === false) { + throw new Exception(pht('Failed to read socket.')); + } + } + + return $this->checkSocket(); + } + + private function buildSocket() { + $errno = null; + $errstr = null; + $socket = @stream_socket_client( + 'tcp://'.$this->host.':'.$this->port, + $errno, + $errstr, + $ignored_connection_timeout = 1.0, + STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT); + + if (!$socket) { + $this->stateReady = true; + $this->result = $this->buildErrorResult( + HTTPFutureTransportResponseStatus::ERROR_CONNECTION_FAILED); + return null; + } + + $ok = stream_set_blocking($socket, 0); + if (!$ok) { + throw new Exception(pht('Failed to set stream nonblocking.')); + } + + $this->writeBuffer = $this->buildHTTPRequest(); + + return $socket; + } + + private function checkSocket() { + $timeout = false; + $now = microtime(true); + if (($now - $this->stateStartTime) > $this->getTimeout()) { + $timeout = true; + } + + if (!feof($this->socket) && !$timeout) { + return false; + } + + $this->stateReady = true; + + if ($timeout) { + $this->result = $this->buildErrorResult( + HTTPFutureTransportResponseStatus::ERROR_TIMEOUT); + } else if (!$this->stateConnected) { + $this->result = $this->buildErrorResult( + HTTPFutureTransportResponseStatus::ERROR_CONNECTION_REFUSED); + } else if (!$this->stateWriteComplete) { + $this->result = $this->buildErrorResult( + HTTPFutureTransportResponseStatus::ERROR_CONNECTION_FAILED); + } else { + $this->result = $this->parseRawHTTPResponse($this->response); + } + + $profiler = PhutilServiceProfiler::getInstance(); + $profiler->endServiceCall($this->profilerCallID, array()); + + return true; + } + + private function buildErrorResult($error) { + return array( + $status = new HTTPFutureTransportResponseStatus($error, $this->getURI()), + $body = null, + $headers = array(), + ); + } + + private function buildHTTPRequest() { + $data = $this->getData(); + $method = $this->getMethod(); + $uri = $this->fullRequestPath; + + $add_headers = array(); + + if ($this->getMethod() == 'GET') { + if (is_array($data)) { + $data = http_build_query($data, '', '&'); + if (strpos($uri, '?') !== false) { + $uri .= '&'.$data; + } else { + $uri .= '?'.$data; + } + $data = ''; + } + } else { + if (is_array($data)) { + $data = http_build_query($data, '', '&')."\r\n"; + $add_headers[] = array( + 'Content-Type', + 'application/x-www-form-urlencoded', + ); + } + } + + $length = strlen($data); + + $add_headers[] = array( + 'Content-Length', + $length, + ); + + if (!$this->getHeaders('User-Agent')) { + $add_headers[] = array( + 'User-Agent', + $this->getDefaultUserAgent(), + ); + } + + if (!$this->getHeaders('Host')) { + $add_headers[] = array( + 'Host', + $this->host, + ); + } + + $headers = array_merge($this->getHeaders(), $add_headers); + foreach ($headers as $key => $header) { + list($name, $value) = $header; + if (strlen($value)) { + $value = ': '.$value; + } + $headers[$key] = $name.$value."\r\n"; + } + + return + "{$method} {$uri} HTTP/1.0\r\n". + implode('', $headers). + "\r\n". + $data; + } + +} diff --git a/src/future/http/HTTPSFuture.php b/src/future/http/HTTPSFuture.php new file mode 100644 --- /dev/null +++ b/src/future/http/HTTPSFuture.php @@ -0,0 +1,689 @@ +cabundle = $temp; + return $this; + } + + /** + * Set the SSL certificate to use for this session, given a path. + * + * @param string The path to a valid SSL certificate for this session + * @return this + */ + public function setCABundleFromPath($path) { + $this->cabundle = $path; + return $this; + } + + /** + * Get the path to the SSL certificate for this session. + * + * @return string|null + */ + public function getCABundle() { + return $this->cabundle; + } + + /** + * Set whether Location headers in the response will be respected. + * The default is true. + * + * @param boolean true to follow any Location header present in the response, + * false to return the request directly + * @return this + */ + public function setFollowLocation($follow) { + $this->followLocation = $follow; + return $this; + } + + /** + * Get whether Location headers in the response will be respected. + * + * @return boolean + */ + public function getFollowLocation() { + return $this->followLocation; + } + + /** + * Set the fallback CA certificate if one is not specified + * for the session, given a path. + * + * @param string The path to a valid SSL certificate + * @return void + */ + public static function setGlobalCABundleFromPath($path) { + self::$globalCABundle = $path; + } + /** + * Set the fallback CA certificate if one is not specified + * for the session, given a string. + * + * @param string The certificate + * @return void + */ + public static function setGlobalCABundleFromString($certificate) { + $temp = new TempFile(); + Filesystem::writeFile($temp, $certificate); + self::$globalCABundle = $temp; + } + + /** + * Get the fallback global CA certificate + * + * @return string + */ + public static function getGlobalCABundle() { + return self::$globalCABundle; + } + + /** + * Load contents of remote URI. Behaves pretty much like + * `@file_get_contents($uri)` but doesn't require `allow_url_fopen`. + * + * @param string + * @param float + * @return string|false + */ + public static function loadContent($uri, $timeout = null) { + $future = new HTTPSFuture($uri); + if ($timeout !== null) { + $future->setTimeout($timeout); + } + try { + list($body) = $future->resolvex(); + return $body; + } catch (HTTPFutureResponseStatus $ex) { + return false; + } + } + + /** + * Attach a file to the request. + * + * @param string HTTP parameter name. + * @param string File content. + * @param string File name. + * @param string File mime type. + * @return this + */ + public function attachFileData($key, $data, $name, $mime_type) { + if (isset($this->files[$key])) { + throw new Exception( + pht( + '%s currently supports only one file attachment for each '. + 'parameter name. You are trying to attach two different files with '. + 'the same parameter, "%s".', + __CLASS__, + $key)); + } + + $this->files[$key] = array( + 'data' => $data, + 'name' => $name, + 'mime' => $mime_type, + ); + + return $this; + } + + public function isReady() { + if (isset($this->result)) { + return true; + } + + $uri = $this->getURI(); + $domain = id(new PhutilURI($uri))->getDomain(); + + if (!$this->handle) { + $uri_object = new PhutilURI($uri); + $proxy = PhutilHTTPEngineExtension::buildHTTPProxyURI($uri_object); + + $profiler = PhutilServiceProfiler::getInstance(); + $this->profilerCallID = $profiler->beginServiceCall( + array( + 'type' => 'http', + 'uri' => $uri, + 'proxy' => (string)$proxy, + )); + + if (!self::$multi) { + self::$multi = curl_multi_init(); + if (!self::$multi) { + throw new Exception(pht('%s failed!', 'curl_multi_init()')); + } + } + + if (!empty(self::$pool[$domain])) { + $curl = array_pop(self::$pool[$domain]); + } else { + $curl = curl_init(); + if (!$curl) { + throw new Exception(pht('%s failed!', 'curl_init()')); + } + } + + $this->handle = $curl; + curl_multi_add_handle(self::$multi, $curl); + + curl_setopt($curl, CURLOPT_URL, $uri); + + if (defined('CURLOPT_PROTOCOLS')) { + // cURL supports a lot of protocols, and by default it will honor + // redirects across protocols (for instance, from HTTP to POP3). Beyond + // being very silly, this also has security implications: + // + // http://blog.volema.com/curl-rce.html + // + // Disable all protocols other than HTTP and HTTPS. + + $allowed_protocols = CURLPROTO_HTTPS | CURLPROTO_HTTP; + curl_setopt($curl, CURLOPT_PROTOCOLS, $allowed_protocols); + curl_setopt($curl, CURLOPT_REDIR_PROTOCOLS, $allowed_protocols); + } + + if (strlen($this->rawBody)) { + if ($this->getData()) { + throw new Exception( + pht( + 'You can not execute an HTTP future with both a raw request '. + 'body and structured request data.')); + } + + // We aren't actually going to use this file handle, since we are + // just pushing data through the callback, but cURL gets upset if + // we don't hand it a real file handle. + $tmp = new TempFile(); + $this->fileHandle = fopen($tmp, 'r'); + + // NOTE: We must set CURLOPT_PUT here to make cURL use CURLOPT_INFILE. + // We'll possibly overwrite the method later on, unless this is really + // a PUT request. + curl_setopt($curl, CURLOPT_PUT, true); + curl_setopt($curl, CURLOPT_INFILE, $this->fileHandle); + curl_setopt($curl, CURLOPT_INFILESIZE, strlen($this->rawBody)); + curl_setopt($curl, CURLOPT_READFUNCTION, + array($this, 'willWriteBody')); + } else { + $data = $this->formatRequestDataForCURL(); + curl_setopt($curl, CURLOPT_POSTFIELDS, $data); + } + + $headers = $this->getHeaders(); + + $saw_expect = false; + for ($ii = 0; $ii < count($headers); $ii++) { + list($name, $value) = $headers[$ii]; + $headers[$ii] = $name.': '.$value; + if (!strncasecmp($name, 'Expect', strlen('Expect'))) { + $saw_expect = true; + } + } + if (!$saw_expect) { + // cURL sends an "Expect" header by default for certain requests. While + // there is some reasoning behind this, it causes a practical problem + // in that lighttpd servers reject these requests with a 417. Both sides + // are locked in an eternal struggle (lighttpd has introduced a + // 'server.reject-expect-100-with-417' option to deal with this case). + // + // The ostensibly correct way to suppress this behavior on the cURL side + // is to add an empty "Expect:" header. If we haven't seen some other + // explicit "Expect:" header, do so. + // + // See here, for example, although this issue is fairly widespread: + // http://curl.haxx.se/mail/archive-2009-07/0008.html + $headers[] = 'Expect:'; + } + curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); + + // Set the requested HTTP method, e.g. GET / POST / PUT. + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $this->getMethod()); + + // Make sure we get the headers and data back. + curl_setopt($curl, CURLOPT_HEADER, true); + curl_setopt($curl, CURLOPT_WRITEFUNCTION, + array($this, 'didReceiveDataCallback')); + + if ($this->followLocation) { + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($curl, CURLOPT_MAXREDIRS, 20); + } + + if (defined('CURLOPT_TIMEOUT_MS')) { + // If CURLOPT_TIMEOUT_MS is available, use the higher-precision timeout. + $timeout = max(1, ceil(1000 * $this->getTimeout())); + curl_setopt($curl, CURLOPT_TIMEOUT_MS, $timeout); + } else { + // Otherwise, fall back to the lower-precision timeout. + $timeout = max(1, ceil($this->getTimeout())); + curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); + } + + // We're going to try to set CAINFO below. This doesn't work at all on + // OSX around Yosemite (see T5913). On these systems, we'll use the + // system CA and then try to tell the user that their settings were + // ignored and how to fix things if we encounter a CA-related error. + // Assume we have custom CA settings to start with; we'll clear this + // flag if we read the default CA info below. + + // Try some decent fallbacks here: + // - First, check if a bundle is set explicitly for this request, via + // `setCABundle()` or similar. + // - Then, check if a global bundle is set explicitly for all requests, + // via `setGlobalCABundle()` or similar. + // - Then, if a local custom.pem exists, use that, because it probably + // means that the user wants to override everything (also because the + // user might not have access to change the box's php.ini to add + // curl.cainfo). + // - Otherwise, try using curl.cainfo. If it's set explicitly, it's + // probably reasonable to try using it before we fall back to what + // libphutil ships with. + // - Lastly, try the default that libphutil ships with. If it doesn't + // work, give up and yell at the user. + + if (!$this->getCABundle()) { + $caroot = dirname(phutil_get_library_root('phutil')).'/resources/ssl/'; + $ini_val = ini_get('curl.cainfo'); + if (self::getGlobalCABundle()) { + $this->setCABundleFromPath(self::getGlobalCABundle()); + } else if (Filesystem::pathExists($caroot.'custom.pem')) { + $this->setCABundleFromPath($caroot.'custom.pem'); + } else if ($ini_val) { + // TODO: We can probably do a pathExists() here, even. + $this->setCABundleFromPath($ini_val); + } else { + $this->setCABundleFromPath($caroot.'default.pem'); + } + } + + if ($this->canSetCAInfo()) { + curl_setopt($curl, CURLOPT_CAINFO, $this->getCABundle()); + } + + $verify_peer = 1; + $verify_host = 2; + + $extensions = PhutilHTTPEngineExtension::getAllExtensions(); + foreach ($extensions as $extension) { + if ($extension->shouldTrustAnySSLAuthorityForURI($uri_object)) { + $verify_peer = 0; + } + if ($extension->shouldTrustAnySSLHostnameForURI($uri_object)) { + $verify_host = 0; + } + } + + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $verify_peer); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, $verify_host); + curl_setopt($curl, CURLOPT_SSLVERSION, 0); + + if ($proxy) { + curl_setopt($curl, CURLOPT_PROXY, (string)$proxy); + } + } else { + $curl = $this->handle; + + if (!self::$results) { + // NOTE: In curl_multi_select(), PHP calls curl_multi_fdset() but does + // not check the return value of &maxfd for -1 until recent versions + // of PHP (5.4.8 and newer). cURL may return -1 as maxfd in some unusual + // situations; if it does, PHP enters select() with nfds=0, which blocks + // until the timeout is reached. + // + // We could try to guess whether this will happen or not by examining + // the version identifier, but we can also just sleep for only a short + // period of time. + curl_multi_select(self::$multi, 0.01); + } + } + + do { + $active = null; + $result = curl_multi_exec(self::$multi, $active); + } while ($result == CURLM_CALL_MULTI_PERFORM); + + while ($info = curl_multi_info_read(self::$multi)) { + if ($info['msg'] == CURLMSG_DONE) { + self::$results[(int)$info['handle']] = $info; + } + } + + if (!array_key_exists((int)$curl, self::$results)) { + return false; + } + + // The request is complete, so release any temporary files we wrote + // earlier. + $this->temporaryFiles = array(); + + $info = self::$results[(int)$curl]; + $result = $this->responseBuffer; + $err_code = $info['result']; + + if ($err_code) { + if (($err_code == CURLE_SSL_CACERT) && !$this->canSetCAInfo()) { + $status = new HTTPFutureCertificateResponseStatus( + HTTPFutureCertificateResponseStatus::ERROR_IMMUTABLE_CERTIFICATES, + $uri); + } else { + $status = new HTTPFutureCURLResponseStatus($err_code, $uri); + } + + $body = null; + $headers = array(); + $this->result = array($status, $body, $headers); + } else { + // cURL returns headers of all redirects, we strip all but the final one. + $redirects = curl_getinfo($curl, CURLINFO_REDIRECT_COUNT); + $result = preg_replace('/^(.*\r\n\r\n){'.$redirects.'}/sU', '', $result); + $this->result = $this->parseRawHTTPResponse($result); + } + + curl_multi_remove_handle(self::$multi, $curl); + unset(self::$results[(int)$curl]); + + // NOTE: We want to use keepalive if possible. Return the handle to a + // pool for the domain; don't close it. + if ($this->shouldReuseHandles()) { + self::$pool[$domain][] = $curl; + } + + $profiler = PhutilServiceProfiler::getInstance(); + $profiler->endServiceCall($this->profilerCallID, array()); + + return true; + } + + + /** + * Callback invoked by cURL as it reads HTTP data from the response. We save + * the data to a buffer. + */ + public function didReceiveDataCallback($handle, $data) { + $this->responseBuffer .= $data; + return strlen($data); + } + + + /** + * Read data from the response buffer. + * + * NOTE: Like @{class:ExecFuture}, this method advances a read cursor but + * does not discard the data. The data will still be buffered, and it will + * all be returned when the future resolves. To discard the data after + * reading it, call @{method:discardBuffers}. + * + * @return string Response data, if available. + */ + public function read() { + $result = substr($this->responseBuffer, $this->responseBufferPos); + $this->responseBufferPos = strlen($this->responseBuffer); + return $result; + } + + + /** + * Discard any buffered data. Normally, you call this after reading the + * data with @{method:read}. + * + * @return this + */ + public function discardBuffers() { + $this->responseBuffer = ''; + $this->responseBufferPos = 0; + return $this; + } + + + /** + * Produces a value safe to pass to `CURLOPT_POSTFIELDS`. + * + * @return wild Some value, suitable for use in `CURLOPT_POSTFIELDS`. + */ + private function formatRequestDataForCURL() { + // We're generating a value to hand to cURL as CURLOPT_POSTFIELDS. The way + // cURL handles this value has some tricky caveats. + + // First, we can return either an array or a query string. If we return + // an array, we get a "multipart/form-data" request. If we return a + // query string, we get an "application/x-www-form-urlencoded" request. + + // Second, if we return an array we can't duplicate keys. The user might + // want to send the same parameter multiple times. + + // Third, if we return an array and any of the values start with "@", + // cURL includes arbitrary files off disk and sends them to an untrusted + // remote server. For example, an array like: + // + // array('name' => '@/usr/local/secret') + // + // ...will attempt to read that file off disk and transmit its contents with + // the request. This behavior is pretty surprising, and it can easily + // become a relatively severe security vulnerability which allows an + // attacker to read any file the HTTP process has access to. Since this + // feature is very dangerous and not particularly useful, we prevent its + // use. Broadly, this means we must reject some requests because they + // contain an "@" in an inconvenient place. + + // Generally, to avoid the "@" case and because most servers usually + // expect "application/x-www-form-urlencoded" data, we try to return a + // string unless there are files attached to this request. + + $data = $this->getData(); + $files = $this->files; + + $any_data = ($data || (is_string($data) && strlen($data))); + $any_files = (bool)$this->files; + + if (!$any_data && !$any_files) { + // No files or data, so just bail. + return null; + } + + if (!$any_files) { + // If we don't have any files, just encode the data as a query string, + // make sure it's not including any files, and we're good to go. + if (is_array($data)) { + $data = http_build_query($data, '', '&'); + } + + $this->checkForDangerousCURLMagic($data, $is_query_string = true); + + return $data; + } + + // If we've made it this far, we have some files, so we need to return + // an array. First, convert the other data into an array if it isn't one + // already. + + if (is_string($data)) { + // NOTE: We explicitly don't want fancy array parsing here, so just + // do a basic parse and then convert it into a dictionary ourselves. + $parser = new PhutilQueryStringParser(); + $pairs = $parser->parseQueryStringToPairList($data); + + $map = array(); + foreach ($pairs as $pair) { + list($key, $value) = $pair; + if (array_key_exists($key, $map)) { + throw new Exception( + pht( + 'Request specifies two values for key "%s", but parameter '. + 'names must be unique if you are posting file data due to '. + 'limitations with cURL.', + $key)); + } + $map[$key] = $value; + } + + $data = $map; + } + + foreach ($data as $key => $value) { + $this->checkForDangerousCURLMagic($value, $is_query_string = false); + } + + foreach ($this->files as $name => $info) { + if (array_key_exists($name, $data)) { + throw new Exception( + pht( + 'Request specifies a file with key "%s", but that key is also '. + 'defined by normal request data. Due to limitations with cURL, '. + 'requests that post file data must use unique keys.', + $name)); + } + + $tmp = new TempFile($info['name']); + Filesystem::writeFile($tmp, $info['data']); + $this->temporaryFiles[] = $tmp; + + // In 5.5.0 and later, we can use CURLFile. Prior to that, we have to + // use this "@" stuff. + + if (class_exists('CURLFile', false)) { + $file_value = new CURLFile((string)$tmp, $info['mime'], $info['name']); + } else { + $file_value = '@'.(string)$tmp; + } + + $data[$name] = $file_value; + } + + return $data; + } + + + /** + * Detect strings which will cause cURL to do horrible, insecure things. + * + * @param string Possibly dangerous string. + * @param bool True if this string is being used as part of a query string. + * @return void + */ + private function checkForDangerousCURLMagic($string, $is_query_string) { + if (empty($string[0]) || ($string[0] != '@')) { + // This isn't an "@..." string, so it's fine. + return; + } + + if ($is_query_string) { + if (version_compare(phpversion(), '5.2.0', '<')) { + throw new Exception( + pht( + 'Attempting to make an HTTP request, but query string data begins '. + 'with "%s". Prior to PHP 5.2.0 this reads files off disk, which '. + 'creates a wide attack window for security vulnerabilities. '. + 'Upgrade PHP or avoid making cURL requests which begin with "%s".', + '@', + '@')); + } + + // This is safe if we're on PHP 5.2.0 or newer. + return; + } + + throw new Exception( + pht( + 'Attempting to make an HTTP request which includes file data, but the '. + 'value of a query parameter begins with "%s". PHP interprets these '. + 'values to mean that it should read arbitrary files off disk and '. + 'transmit them to remote servers. Declining to make this request.', + '@')); + } + + + /** + * Determine whether CURLOPT_CAINFO is usable on this system. + */ + private function canSetCAInfo() { + // We cannot set CAInfo on OSX after Yosemite. + + $osx_version = PhutilExecutionEnvironment::getOSXVersion(); + if ($osx_version) { + if (version_compare($osx_version, 14, '>=')) { + return false; + } + } + + return true; + } + + + /** + * Write a raw HTTP body into the request. + * + * You must write the entire body before starting the request. + * + * @param string Raw body. + * @return this + */ + public function write($raw_body) { + $this->rawBody = $raw_body; + return $this; + } + + + /** + * Callback to pass data to cURL. + */ + public function willWriteBody($handle, $infile, $len) { + $bytes = substr($this->rawBody, $this->rawBodyPos, $len); + $this->rawBodyPos += $len; + return $bytes; + } + + private function shouldReuseHandles() { + $curl_version = curl_version(); + $version = idx($curl_version, 'version'); + + // NOTE: cURL 7.43.0 has a bug where the POST body length is not recomputed + // properly when a handle is reused. For this version of cURL, disable + // handle reuse and accept a small performance penalty. See T8654. + if ($version == '7.43.0') { + return false; + } + + return true; + } + + +} diff --git a/src/future/http/PhutilHTTPEngineExtension.php b/src/future/http/PhutilHTTPEngineExtension.php new file mode 100644 --- /dev/null +++ b/src/future/http/PhutilHTTPEngineExtension.php @@ -0,0 +1,141 @@ +getPhobjectClassConstant('EXTENSIONKEY'); + } + + final public static function getAllExtensions() { + return id(new PhutilClassMapQuery()) + ->setAncestorClass(__CLASS__) + ->setUniqueMethod('getExtensionKey') + ->execute(); + } + + final public static function getExtension($key) { + $extensions = self::getAllExtensions(); + return idx($extensions, $key); + } + + final public static function requireExtension($key) { + $extension = self::getExtension($key); + + if (!$extension) { + throw new Exception( + pht( + 'No HTTP engine extension exists with extension key "%s".', + $key)); + } + + return $extension; + } + + final public static function buildHTTPProxyURI(PhutilURI $uri) { + $proxy = null; + $via = null; + + $extensions = self::getAllExtensions(); + foreach ($extensions as $extension) { + $extension_proxy = $extension->getHTTPProxyURI($uri); + + if ($extension_proxy === null) { + continue; + } + + if (!($extension_proxy instanceof PhutilURI)) { + throw new Exception( + pht( + 'HTTP extension "%s" (of class "%s") returned an invalid '. + 'result from "%s": expected null, or an object of class "%s".', + $extension->getExtensionName(), + get_class($extension), + 'getHTTPProxyURI()', + 'PhutilURI')); + } + + if ($proxy) { + throw new Exception( + pht( + 'Two different HTTP extensions ("%s" of class "%s" and "%s" of '. + 'class "%s") both provided a proxy URI for URI "%s". No more '. + 'than one extension may provide a proxy for any URI.', + $extension->getExtensionName(), + get_class($extension), + $via->getExtensionName(), + get_class($via), + (string)$uri)); + } + + $proxy = $extension_proxy; + $via = $extension; + } + + return $proxy; + } + +} diff --git a/src/future/http/status/HTTPFutureCURLResponseStatus.php b/src/future/http/status/HTTPFutureCURLResponseStatus.php new file mode 100644 --- /dev/null +++ b/src/future/http/status/HTTPFutureCURLResponseStatus.php @@ -0,0 +1,86 @@ +getStatusCode() == CURLE_OPERATION_TIMEOUTED); + } + + protected function getErrorCodeDescription($code) { + $constants = get_defined_constants(); + + $constant_name = null; + foreach ($constants as $constant => $value) { + if ($value == $code && preg_match('/^CURLE_/', $constant)) { + $constant_name = '<'.$constant.'> '; + break; + } + } + + $map = array( + CURLE_COULDNT_RESOLVE_HOST => pht( + 'There was an error resolving the server hostname. Check that you are '. + 'connected to the internet and that DNS is correctly configured. (Did '. + 'you add the domain to `%s` on some other machine, but not this one?)', + '/etc/hosts'), + + CURLE_SSL_CACERT => pht( + 'There was an error verifying the SSL Certificate Authority while '. + 'negotiating the SSL connection. This usually indicates that you are '. + 'using a self-signed certificate but have not added your CA to the '. + 'CA bundle. See instructions in "%s".', + 'libphutil/resources/ssl/README'), + + // Apparently there's no error constant for this? In cURL it's + // CURLE_SSL_CACERT_BADFILE but there's no corresponding constant in + // PHP. + 77 => pht( + 'The SSL CA Bundles that we tried to use could not be read or are '. + 'not formatted correctly.'), + + CURLE_SSL_CONNECT_ERROR => pht( + 'There was an error negotiating the SSL connection. This usually '. + 'indicates that the remote host has a bad SSL certificate, or your '. + 'local host has some sort of SSL misconfiguration which prevents it '. + 'from accepting the CA. If you are using a self-signed certificate, '. + 'see instructions in "%s".', + 'libphutil/resources/ssl/README'), + + CURLE_OPERATION_TIMEOUTED => pht( + 'The request took too long to complete.'), + + CURLE_SSL_PEER_CERTIFICATE => pht( + 'There was an error verifying the SSL connection. This usually '. + 'indicates that the remote host has an SSL certificate for a '. + 'different domain name than you are connecting with. Make sure the '. + 'certificate you have installed is signed for the correct domain.'), + ); + + $default_message = pht( + 'The cURL library raised an error while making a request. You may be '. + 'able to find more information about this error (error code: %d) '. + 'on the cURL site: %s', + $code, + 'http://curl.haxx.se/libcurl/c/libcurl-errors.html#'. + preg_replace('/[^A-Z]/', '', $constant_name)); + + $detailed_message = idx($map, $code, $default_message); + + return $constant_name.$detailed_message; + } + +} diff --git a/src/future/http/status/HTTPFutureCertificateResponseStatus.php b/src/future/http/status/HTTPFutureCertificateResponseStatus.php new file mode 100644 --- /dev/null +++ b/src/future/http/status/HTTPFutureCertificateResponseStatus.php @@ -0,0 +1,33 @@ + 512) { + $excerpt = substr($body, 0, 512).'...'; + } else { + $excerpt = $body; + } + + $content_type = BaseHTTPFuture::getHeader($headers, 'Content-Type'); + $match = null; + if (preg_match('/;\s*charset=([^;]+)/', $content_type, $match)) { + $encoding = trim($match[1], "\"'"); + try { + $excerpt = phutil_utf8_convert($excerpt, 'UTF-8', $encoding); + } catch (Exception $ex) {} + } + + $this->excerpt = phutil_utf8ize($excerpt); + $this->expect = $expect; + + parent::__construct($status_code); + } + + protected function getErrorCodeType($code) { + return 'HTTP'; + } + + public function isError() { + if ($this->expect === null) { + return ($this->getStatusCode() < 200) || ($this->getStatusCode() > 299); + } + + return !in_array($this->getStatusCode(), $this->expect, true); + } + + public function isRedirect() { + $code = $this->getStatusCode(); + return ($code >= 300 && $code < 400); + } + + public function isTimeout() { + return false; + } + + protected function getErrorCodeDescription($code) { + static $map = array( + 404 => 'Not Found', + 500 => 'Internal Server Error', + ); + + return idx($map, $code)."\n".$this->excerpt."\n"; + } + +} diff --git a/src/future/http/status/HTTPFutureParseResponseStatus.php b/src/future/http/status/HTTPFutureParseResponseStatus.php new file mode 100644 --- /dev/null +++ b/src/future/http/status/HTTPFutureParseResponseStatus.php @@ -0,0 +1,32 @@ +rawResponse = $raw_response; + parent::__construct($code); + } + + protected function getErrorCodeType($code) { + return 'Parse'; + } + + public function isError() { + return true; + } + + public function isTimeout() { + return false; + } + + protected function getErrorCodeDescription($code) { + return pht( + 'The remote host returned something other than an HTTP response: %s', + $this->rawResponse); + } + +} diff --git a/src/future/http/status/HTTPFutureResponseStatus.php b/src/future/http/status/HTTPFutureResponseStatus.php new file mode 100644 --- /dev/null +++ b/src/future/http/status/HTTPFutureResponseStatus.php @@ -0,0 +1,43 @@ +statusCode = $status_code; + $this->uri = (string)$uri; + + $type = $this->getErrorCodeType($status_code); + $description = $this->getErrorCodeDescription($status_code); + + $uri_info = ''; + if ($this->uri) { + $uri_info = ' ('.$this->uri.')'; + } + + $message = rtrim("[{$type}/{$status_code}]{$uri_info} {$description}"); + + parent::__construct($message); + } + + final public function getStatusCode() { + return $this->statusCode; + } + + final public function getURI() { + return $this->uri; + } + + abstract public function isError(); + abstract public function isTimeout(); + + public function isRedirect() { + return false; + } + + abstract protected function getErrorCodeType($code); + abstract protected function getErrorCodeDescription($code); + +} diff --git a/src/future/http/status/HTTPFutureTransportResponseStatus.php b/src/future/http/status/HTTPFutureTransportResponseStatus.php new file mode 100644 --- /dev/null +++ b/src/future/http/status/HTTPFutureTransportResponseStatus.php @@ -0,0 +1,44 @@ +getStatusCode() == self::ERROR_TIMEOUT); + } + + protected function getErrorCodeDescription($code) { + $map = array( + self::ERROR_TIMEOUT => pht( + 'The request took too long to complete.'), + self::ERROR_CONNECTION_ABORTED => pht( + 'The remote host closed the connection before the request completed.'), + self::ERROR_CONNECTION_REFUSED => pht( + 'The remote host refused the connection. This usually means the '. + 'host is not running an HTTP server, or the network is blocking '. + 'connections from this machine. Verify you can connect to the '. + 'remote host from this host.'), + self::ERROR_CONNECTION_FAILED => pht( + 'Connection could not be initiated. This usually indicates a DNS '. + 'problem: verify the domain name is correct, that you can '. + 'perform a DNS lookup for it from this machine. (Did you add the '. + 'domain to `%s` on some other machine, but not this one?) '. + 'This might also indicate that you specified the wrong port.', + '/etc/hosts'), + ); + return idx($map, $code); + } + +} diff --git a/src/future/oauth/PhutilOAuth1Future.php b/src/future/oauth/PhutilOAuth1Future.php new file mode 100644 --- /dev/null +++ b/src/future/oauth/PhutilOAuth1Future.php @@ -0,0 +1,291 @@ +callbackURI = $callback_uri; + return $this; + } + + public function setTimestamp($timestamp) { + $this->timestamp = $timestamp; + return $this; + } + + public function setNonce($nonce) { + $this->nonce = $nonce; + return $this; + } + + public function setTokenSecret($token_secret) { + $this->tokenSecret = $token_secret; + return $this; + } + + public function setToken($token) { + $this->token = $token; + return $this; + } + + public function setPrivateKey(PhutilOpaqueEnvelope $private_key) { + $this->privateKey = $private_key; + return $this; + } + + public function setSignatureMethod($signature_method) { + $this->signatureMethod = $signature_method; + return $this; + } + + public function setConsumerKey($consumer_key) { + $this->consumerKey = $consumer_key; + return $this; + } + + public function setConsumerSecret(PhutilOpaqueEnvelope $consumer_secret) { + $this->consumerSecret = $consumer_secret; + return $this; + } + + public function setMethod($method) { + $this->method = $method; + return $this; + } + + public function __construct($uri, $data = array()) { + $this->uri = new PhutilURI((string)$uri); + $this->data = $data; + $this->setProxiedFuture(new HTTPSFuture($uri, $data)); + } + + public function getSignature() { + $params = array(); + + // NOTE: The JIRA API uses JSON-encoded request bodies which are not + // signed, and OAuth1 provides no real way to sign a nonparameterized + // request body. Possibly we should split this apart into flags which + // control which data is signed, but for now this rule seems to cover + // all the use cases. + + if (is_array($this->data)) { + $params = $this->data; + } + + $params = $params + + $this->uri->getQueryParams() + + $this->getOAuth1Headers(); + + return $this->sign($params); + } + + public function addHeader($name, $value) { + // If we haven't built the future yet, hold on to the header until after + // we do, since there might be more changes coming which will affect the + // signature process. + + if (!$this->hasConstructedFuture) { + $this->headers[] = array($name, $value); + } else { + $this->getProxiedFuture()->addHeader($name, $value); + } + return $this; + } + + protected function getProxiedFuture() { + $future = parent::getProxiedFuture(); + + if (!$this->hasConstructedFuture) { + $future->setMethod($this->method); + + $oauth_headers = $this->getOAuth1Headers(); + $oauth_headers['oauth_signature'] = $this->getSignature(); + + $full_oauth_header = array(); + foreach ($oauth_headers as $header => $value) { + $full_oauth_header[] = $header.'="'.urlencode($value).'"'; + } + $full_oauth_header = 'OAuth '.implode(', ', $full_oauth_header); + + $future->addHeader('Authorization', $full_oauth_header); + + foreach ($this->headers as $header) { + $future->addHeader($header[0], $header[1]); + } + $this->headers = array(); + + $this->hasConstructedFuture = true; + } + + return $future; + } + + protected function didReceiveResult($result) { + return $result; + } + + private function getOAuth1Headers() { + if (!$this->nonce) { + $this->nonce = Filesystem::readRandomCharacters(32); + } + if (!$this->timestamp) { + $this->timestamp = time(); + } + + $oauth_headers = array( + 'oauth_consumer_key' => $this->consumerKey, + 'oauth_signature_method' => $this->signatureMethod, + 'oauth_timestamp' => $this->timestamp, + 'oauth_nonce' => $this->nonce, + 'oauth_version' => '1.0', + ); + + if ($this->callbackURI) { + $oauth_headers['oauth_callback'] = (string)$this->callbackURI; + } + + if ($this->token) { + $oauth_headers['oauth_token'] = $this->token; + } + + return $oauth_headers; + } + + private function sign(array $params) { + ksort($params); + + $pstr = array(); + foreach ($params as $key => $value) { + $pstr[] = rawurlencode($key).'='.rawurlencode($value); + } + $pstr = implode('&', $pstr); + + $sign_uri = clone $this->uri; + $sign_uri->setFragment(''); + $sign_uri->setQueryParams(array()); + + $sign_uri->setProtocol(phutil_utf8_strtolower($sign_uri->getProtocol())); + $protocol = $sign_uri->getProtocol(); + switch ($protocol) { + case 'http': + if ($sign_uri->getPort() == 80) { + $sign_uri->setPort(null); + } + break; + case 'https': + if ($sign_uri->getPort() == 443) { + $sign_uri->setPort(null); + } + break; + } + + $method = rawurlencode(phutil_utf8_strtoupper($this->method)); + $sign_uri = rawurlencode((string)$sign_uri); + $pstr = rawurlencode($pstr); + + $sign_input = "{$method}&{$sign_uri}&{$pstr}"; + return $this->signString($sign_input); + } + + private function signString($string) { + $consumer_secret = null; + if ($this->consumerSecret) { + $consumer_secret = $this->consumerSecret->openEnvelope(); + } + + $key = urlencode($consumer_secret).'&'.urlencode($this->tokenSecret); + + switch ($this->signatureMethod) { + case 'HMAC-SHA1': + if (!$this->consumerSecret) { + throw new Exception( + pht( + "Signature method '%s' requires %s!", + 'HMAC-SHA1', + 'setConsumerSecret()')); + } + + $hash = hash_hmac('sha1', $string, $key, true); + return base64_encode($hash); + case 'RSA-SHA1': + if (!$this->privateKey) { + throw new Exception( + pht( + "Signature method '%s' requires %s!", + 'RSA-SHA1', + 'setPrivateKey()')); + } + + $cert = @openssl_pkey_get_private($this->privateKey->openEnvelope()); + if (!$cert) { + throw new Exception(pht('%s failed!', 'openssl_pkey_get_private()')); + } + + $pkey = @openssl_get_privatekey($cert); + if (!$pkey) { + throw new Exception(pht('%s failed!', 'openssl_get_privatekey()')); + } + + $signature = null; + $ok = openssl_sign($string, $signature, $pkey, OPENSSL_ALGO_SHA1); + if (!$ok) { + throw new Exception(pht('%s failed!', 'openssl_sign()')); + } + + openssl_free_key($pkey); + + return base64_encode($signature); + case 'PLAINTEXT': + if (!$this->consumerSecret) { + throw new Exception( + pht( + "Signature method '%s' requires %s!", + 'PLAINTEXT', + 'setConsumerSecret()')); + } + return $key; + default: + throw new Exception(pht("Unknown signature method '%s'!", $string)); + } + } + + public function resolvex() { + $result = $this->getProxiedFuture()->resolvex(); + return $this->didReceiveResult($result); + } + + public function resolveJSON() { + $result = $this->getProxiedFuture()->resolvex(); + $result = $this->didReceiveResult($result); + list($body) = $result; + + try { + return phutil_json_decode($body); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException(pht('Expected JSON.'), $ex); + } + } + + +} diff --git a/src/future/oauth/__tests__/PhutilOAuth1FutureTestCase.php b/src/future/oauth/__tests__/PhutilOAuth1FutureTestCase.php new file mode 100644 --- /dev/null +++ b/src/future/oauth/__tests__/PhutilOAuth1FutureTestCase.php @@ -0,0 +1,159 @@ +setTimestamp(1191242090) + ->setNonce('hsu94j3884jdopsl') + ->setConsumerKey('dpf43f3p2l4k3l03') + ->setConsumerSecret(new PhutilOpaqueEnvelope('kd94hf93k423kf44')) + ->setSignatureMethod('PLAINTEXT'); + + $this->assertEqual('kd94hf93k423kf44&', $future->getSignature()); + + + $uri = 'http://photos.example.net/photos'; + $data = array( + 'file' => 'vacation.jpg', + 'size' => 'original', + ); + + $future = id(new PhutilOAuth1Future($uri, $data)) + ->setMethod('GET') + ->setTimestamp(1191242096) + ->setNonce('kllo9940pd9333jh') + ->setConsumerKey('dpf43f3p2l4k3l03') + ->setConsumerSecret(new PhutilOpaqueEnvelope('kd94hf93k423kf44')) + ->setSignatureMethod('HMAC-SHA1') + ->setToken('nnch734d00sl2jdk') + ->setTokenSecret('pfkkdhi9sl3r4s00'); + + $this->assertEqual('tR3+Ty81lMeYAr/Fid0kMTYa/WM=', $future->getSignature()); + } + + public function testOAuth1SigningWithTwitterExamples() { + + // NOTE: This example is from Twitter. + // https://dev.twitter.com/docs/auth/creating-signature + + $uri = 'https://api.twitter.com/1/statuses/update.json?'. + 'include_entities=true'; + $data = array( + 'status' => 'Hello Ladies + Gentlemen, a signed OAuth request!', + ); + + $future = id(new PhutilOAuth1Future($uri, $data)) + ->setMethod('POST') + ->setConsumerKey('xvz1evFS4wEEPTGEFPHBog') + ->setConsumerSecret( + new PhutilOpaqueEnvelope('kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw')) + ->setNonce('kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg') + ->setSignatureMethod('HMAC-SHA1') + ->setTimestamp(1318622958) + ->setToken('370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb') + ->setTokenSecret('LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE'); + + $this->assertEqual('tnnArxj06cWHq44gCs1OSKk/jLY=', $future->getSignature()); + } + + public function testOAuth1SigningWithJIRAExamples() { + + // NOTE: This is an emprically example against JIRA v6.0.6, in that the + // code seems to work when actually authing. It primarily serves as a check + // of the RSA-SHA1 signature method. + +$public_key = <<setConsumerKey('quackquack') + ->setPrivateKey(new PhutilOpaqueEnvelope($private_key)) + ->setTimestamp('1375984131') + ->setNonce('iamaduck') + ->setSignatureMethod('RSA-SHA1'); + + // The actual signature is 684 bytes and begins "QwigfVxpOm0AKoWJkFRwbyseso + // VJobhiXpyY0J79Kzki+vwlT4Xz2Tr4vlwDLsra5gJbfdeme4qJ2rE..." + $this->assertEqual( + '5e63e65237e2b8078426996d5ef1a706', + md5($future->getSignature())); + } + +} diff --git a/src/future/paypal/PhutilPayPalAPIFuture.php b/src/future/paypal/PhutilPayPalAPIFuture.php new file mode 100644 --- /dev/null +++ b/src/future/paypal/PhutilPayPalAPIFuture.php @@ -0,0 +1,88 @@ +host = $host; + return $this; + } + + public function getHost() { + return $this->host; + } + + public function setAPIUsername($api_username) { + $this->apiUsername = $api_username; + return $this; + } + + public function setAPIPassword($api_password) { + $this->apiPassword = $api_password; + return $this; + } + + public function setAPISignature($api_signature) { + $this->apiSignature = $api_signature; + return $this; + } + + public function setRawPayPalQuery($action, array $params = array()) { + $this->params = array('METHOD' => $action) + $params + $this->params; + return $this; + } + + protected function getProxiedFuture() { + if (!$this->future) { + $params = $this->params; + + if (!$this->params) { + throw new Exception(pht('You must %s!', 'setRawPayPalQuery()')); + } + + if (!$this->apiUsername) { + throw new Exception(pht('You must set PayPal API credentials!')); + } + + $params['VERSION'] = '98.0'; + $params['USER'] = $this->apiUsername; + $params['PWD'] = $this->apiPassword; + $params['SIGNATURE'] = $this->apiSignature; + + $this->future = id(new HTTPSFuture($this->getHost(), $params)) + ->setMethod('POST'); + } + + return $this->future; + } + + protected function didReceiveResult($result) { + list($status, $body, $headers) = $result; + + if ($status->isError()) { + throw $status; + } + + $dict = array(); + parse_str($body, $dict); + + if (idx($dict, 'ACK') !== 'Success') { + throw new Exception( + pht('PayPal API call failed: %s', print_r($dict, true))); + } + + return $dict; + } + +} diff --git a/src/future/postmark/PhutilPostmarkFuture.php b/src/future/postmark/PhutilPostmarkFuture.php new file mode 100644 --- /dev/null +++ b/src/future/postmark/PhutilPostmarkFuture.php @@ -0,0 +1,85 @@ +accessToken = $token; + return $this; + } + + public function setClientID($client_id) { + $this->clientID = $client_id; + return $this; + } + + public function setMethod($method, array $parameters) { + $this->method = $method; + $this->parameters = $parameters; + return $this; + } + + protected function getProxiedFuture() { + if (!$this->future) { + if ($this->accessToken === null) { + throw new PhutilInvalidStateException('setAccessToken'); + } + + if ($this->method === null || $this->parameters === null) { + throw new PhutilInvalidStateException('setMethod'); + } + + $uri = id(new PhutilURI('https://api.postmarkapp.com/')) + ->setPath('/'.$this->method); + + $request_body = phutil_json_encode($this->parameters); + + $future = id(new HTTPSFuture($uri)) + ->setData($request_body) + ->setMethod('POST') + ->addHeader('X-Postmark-Server-Token', $this->accessToken) + ->addHeader('Accept', 'application/json') + ->addHeader('Content-Type', 'application/json'); + + $this->future = $future; + } + + return $this->future; + } + + protected function didReceiveResult($result) { + list($status, $body, $headers) = $result; + + if ($status->isError()) { + throw $status; + } + + try { + $data = phutil_json_decode($body); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Expected JSON response from Postmark.'), + $ex); + } + + if (idx($data, 'ErrorCode')) { + $error = $data['ErrorCode']; + throw new Exception( + pht( + 'Received error from Postmark: (%s) %s', + $error, + idx($data, 'Message'))); + } + + return $data; + } + +} diff --git a/src/future/query/QueryFuture.php b/src/future/query/QueryFuture.php new file mode 100644 --- /dev/null +++ b/src/future/query/QueryFuture.php @@ -0,0 +1,129 @@ +resolve(); + * } catch (AphrontQueryException $ex) { + * } + * } + * + * `$result` contains a list of dicts for select queries or number of modified + * rows for modification queries. + */ +final class QueryFuture extends Future { + + private static $futures = array(); + + private $conn; + private $query; + private $id; + private $async; + private $profilerCallID; + + public function __construct( + AphrontDatabaseConnection $conn, + $pattern/* , ... */) { + + $this->conn = $conn; + + $args = func_get_args(); + $args = array_slice($args, 2); + $this->query = vqsprintf($conn, $pattern, $args); + + self::$futures[] = $this; + $this->id = last_key(self::$futures); + } + + public function isReady() { + if ($this->result !== null || $this->exception) { + return true; + } + + if (!$this->conn->supportsAsyncQueries()) { + if ($this->conn->supportsParallelQueries()) { + $queries = array(); + $conns = array(); + foreach (self::$futures as $id => $future) { + $queries[$id] = $future->query; + $conns[$id] = $future->conn; + } + $results = $this->conn->executeParallelQueries($queries, $conns); + $this->processResults($results); + return true; + } + + $conns = array(); + $conn_queries = array(); + foreach (self::$futures as $id => $future) { + $hash = spl_object_hash($future->conn); + $conns[$hash] = $future->conn; + $conn_queries[$hash][$id] = $future->query; + } + foreach ($conn_queries as $hash => $queries) { + $this->processResults($conns[$hash]->executeRawQueries($queries)); + } + return true; + } + + if (!$this->async) { + $profiler = PhutilServiceProfiler::getInstance(); + $this->profilerCallID = $profiler->beginServiceCall( + array( + 'type' => 'query', + 'query' => $this->query, + 'async' => true, + )); + + $this->async = $this->conn->asyncQuery($this->query); + return false; + } + + $conns = array(); + $asyncs = array(); + foreach (self::$futures as $id => $future) { + if ($future->async) { + $conns[$id] = $future->conn; + $asyncs[$id] = $future->async; + } + } + + $this->processResults($this->conn->resolveAsyncQueries($conns, $asyncs)); + + if ($this->result !== null || $this->exception) { + return true; + } + return false; + } + + private function processResults(array $results) { + foreach ($results as $id => $result) { + $future = self::$futures[$id]; + if ($result instanceof Exception) { + $future->exception = $result; + } else { + $future->result = $result; + } + unset(self::$futures[$id]); + if ($future->profilerCallID) { + $profiler = PhutilServiceProfiler::getInstance(); + $profiler->endServiceCall($future->profilerCallID, array()); + } + } + } +} diff --git a/src/future/slack/PhutilSlackFuture.php b/src/future/slack/PhutilSlackFuture.php new file mode 100644 --- /dev/null +++ b/src/future/slack/PhutilSlackFuture.php @@ -0,0 +1,87 @@ +accessToken = $token; + return $this; + } + + public function setClientID($client_id) { + $this->clientID = $client_id; + return $this; + } + + public function setRawSlackQuery($action, array $params = array()) { + $this->action = $action; + $this->params = $params; + return $this; + } + + public function setMethod($method) { + $this->method = $method; + return $this; + } + + protected function getProxiedFuture() { + if (!$this->future) { + $params = $this->params; + + if (!$this->action) { + throw new Exception(pht('You must %s!', 'setRawSlackQuery()')); + } + + if (!$this->accessToken) { + throw new Exception(pht('You must %s!', 'setAccessToken()')); + } + + $uri = new PhutilURI('https://slack.com/'); + $uri->setPath('/api/'.$this->action); + $uri->setQueryParam('token', $this->accessToken); + + $future = new HTTPSFuture($uri); + $future->setData($this->params); + $future->setMethod($this->method); + + $this->future = $future; + } + + return $this->future; + } + + protected function didReceiveResult($result) { + list($status, $body, $headers) = $result; + + if ($status->isError()) { + throw $status; + } + + $data = null; + try { + $data = phutil_json_decode($body); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Expected JSON response from Slack.'), + $ex); + } + + if (idx($data, 'error')) { + $error = $data['error']; + throw new Exception(pht('Received error from Slack: %s', $error)); + } + + return $data; + } + +} diff --git a/src/future/twitch/PhutilTwitchFuture.php b/src/future/twitch/PhutilTwitchFuture.php new file mode 100644 --- /dev/null +++ b/src/future/twitch/PhutilTwitchFuture.php @@ -0,0 +1,93 @@ +accessToken = $token; + return $this; + } + + public function setClientID($client_id) { + $this->clientID = $client_id; + return $this; + } + + public function setRawTwitchQuery($action, array $params = array()) { + $this->action = $action; + $this->params = $params; + return $this; + } + + public function setMethod($method) { + $this->method = $method; + return $this; + } + + protected function getProxiedFuture() { + if (!$this->future) { + $params = $this->params; + + if (!$this->action) { + throw new Exception(pht('You must %s!', 'setRawTwitchQuery()')); + } + + if (!$this->accessToken) { + throw new Exception(pht('You must %s!', 'setAccessToken()')); + } + + $uri = new PhutilURI('https://api.twitch.tv/'); + $uri->setPath('/kraken/'.ltrim($this->action, '/')); + $uri->setQueryParam('oauth_token', $this->accessToken); + + $future = new HTTPSFuture($uri); + $future->setData($this->params); + $future->setMethod($this->method); + + // NOTE: This is how the Twitch API is versioned. + $future->addHeader('Accept', 'application/vnd.twitchtv.2+json'); + + // NOTE: This is required to avoid rate limiting. + $future->addHeader('Client-ID', $this->clientID); + + $this->future = $future; + } + + return $this->future; + } + + protected function didReceiveResult($result) { + list($status, $body, $headers) = $result; + + if ($status->isError()) { + throw $status; + } + + $data = null; + try { + $data = phutil_json_decode($body); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Expected JSON response from Twitch.'), + $ex); + } + + if (idx($data, 'error')) { + $error = $data['error']; + throw new Exception(pht('Received error from Twitch: %s', $error)); + } + + return $data; + } + +} diff --git a/src/future/wordpress/PhutilWordPressFuture.php b/src/future/wordpress/PhutilWordPressFuture.php new file mode 100644 --- /dev/null +++ b/src/future/wordpress/PhutilWordPressFuture.php @@ -0,0 +1,89 @@ +accessToken = $token; + return $this; + } + + public function setClientID($client_id) { + $this->clientID = $client_id; + return $this; + } + + public function setRawWordPressQuery($action, array $params = array()) { + $this->action = $action; + $this->params = $params; + return $this; + } + + public function setMethod($method) { + $this->method = $method; + return $this; + } + + protected function getProxiedFuture() { + if (!$this->future) { + $params = $this->params; + + if (!$this->action) { + throw new Exception(pht('You must %s!', 'setRawWordPressQuery()')); + } + + if (!$this->accessToken) { + throw new Exception(pht('You must %s!', 'setAccessToken()')); + } + + $uri = new PhutilURI('https://public-api.wordpress.com/'); + $uri->setPath('/rest/v1/'.ltrim($this->action, '/')); + + $future = new HTTPSFuture($uri); + $future->setData($this->params); + $future->setMethod($this->method); + + // NOTE: This is how WordPress.com REST API authenticates + $future->addHeader('Authorization', 'Bearer '.$this->accessToken); + + $this->future = $future; + } + + return $this->future; + } + + protected function didReceiveResult($result) { + list($status, $body, $headers) = $result; + + if ($status->isError()) { + throw $status; + } + + try { + $data = phutil_json_decode($body); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('Expected JSON response from WordPress.com.'), + $ex); + } + + if (idx($data, 'error')) { + $error = $data['error']; + throw new Exception( + pht('Received error from WordPress.com: %s', $error)); + } + + return $data; + } + +} diff --git a/src/grammar/PhutilContextFreeGrammar.php b/src/grammar/PhutilContextFreeGrammar.php new file mode 100644 --- /dev/null +++ b/src/grammar/PhutilContextFreeGrammar.php @@ -0,0 +1,93 @@ +generate(); + } + return implode($implode, $paragraph); + } + + public function generate() { + $count = 0; + $rules = $this->getRules(); + return $this->applyRules('[start]', $count, $rules); + } + + final protected function applyRules($input, &$count, array $rules) { + if (++$count > $this->limit) { + throw new Exception(pht('Token replacement count exceeded limit!')); + } + + $matches = null; + preg_match_all('/(\\[[^\\]]+\\])/', $input, $matches, PREG_OFFSET_CAPTURE); + + foreach (array_reverse($matches[1]) as $token_spec) { + list($token, $offset) = $token_spec; + $token_name = substr($token, 1, -1); + $options = array(); + + if (($name_end = strpos($token_name, ','))) { + $options_parser = new PhutilSimpleOptions(); + $options = $options_parser->parse($token_name); + $token_name = substr($token_name, 0, $name_end); + } + + if (empty($rules[$token_name])) { + throw new Exception(pht("Invalid token '%s' in grammar.", $token_name)); + } + + $key = array_rand($rules[$token_name]); + $replacement = $this->applyRules($rules[$token_name][$key], + $count, $rules); + + if (isset($options['indent'])) { + if (is_numeric($options['indent'])) { + $replacement = self::strPadLines($replacement, $options['indent']); + } else { + $replacement = self::strPadLines($replacement); + } + } + if (isset($options['trim'])) { + switch ($options['trim']) { + case 'left': + $replacement = ltrim($replacement); + break; + case 'right': + $replacement = rtrim($replacement); + break; + default: + case 'both': + $replacement = trim($replacement); + break; + } + } + if (isset($options['block'])) { + $replacement = "\n".$replacement."\n"; + } + + $input = substr_replace($input, $replacement, $offset, strlen($token)); + } + + return $input; + } + + private static function strPadLines($text, $num_spaces = 2) { + $text_lines = phutil_split_lines($text); + foreach ($text_lines as $linenr => $line) { + $text_lines[$linenr] = str_repeat(' ', $num_spaces).$line; + } + + return implode('', $text_lines); + } + +} diff --git a/src/grammar/PhutilLipsumContextFreeGrammar.php b/src/grammar/PhutilLipsumContextFreeGrammar.php new file mode 100644 --- /dev/null +++ b/src/grammar/PhutilLipsumContextFreeGrammar.php @@ -0,0 +1,107 @@ + array( + '[words].', + '[words].', + '[words].', + '[words]: [word], [word], [word] [word].', + '[words]; [lowerwords].', + '[words]!', + '[words], "[words]."', + '[words] ("[upperword] [upperword] [upperword]") [lowerwords].', + '[words]?', + ), + 'words' => array( + '[upperword] [lowerwords]', + ), + 'upperword' => array( + 'Lorem', + 'Ipsum', + 'Dolor', + 'Sit', + 'Amet', + ), + 'lowerwords' => array( + '[word]', + '[word] [word]', + '[word] [word] [word]', + '[word] [word] [word] [word]', + '[word] [word] [word] [word] [word]', + '[word] [word] [word] [word] [word]', + '[word] [word] [word] [word] [word] [word]', + '[word] [word] [word] [word] [word] [word]', + ), + 'word' => array( + 'ad', + 'adipisicing', + 'aliqua', + 'aliquip', + 'amet', + 'anim', + 'aute', + 'cillum', + 'commodo', + 'consectetur', + 'consequat', + 'culpa', + 'cupidatat', + 'deserunt', + 'do', + 'dolor', + 'dolore', + 'duis', + 'ea', + 'eiusmod', + 'elit', + 'enim', + 'esse', + 'est', + 'et', + 'eu', + 'ex', + 'excepteur', + 'exercitation', + 'fugiat', + 'id', + 'in', + 'incididunt', + 'ipsum', + 'irure', + 'labore', + 'laboris', + 'laborum', + 'lorem', + 'magna', + 'minim', + 'mollit', + 'nisi', + 'non', + 'nostrud', + 'nulla', + 'occaecat', + 'officia', + 'pariatur', + 'proident', + 'qui', + 'quis', + 'reprehenderit', + 'sed', + 'sint', + 'sit', + 'sunt', + 'tempor', + 'ullamco', + 'ut', + 'velit', + 'veniam', + 'voluptate', + ), + ); + } + +} diff --git a/src/grammar/PhutilRealNameContextFreeGrammar.php b/src/grammar/PhutilRealNameContextFreeGrammar.php new file mode 100644 --- /dev/null +++ b/src/grammar/PhutilRealNameContextFreeGrammar.php @@ -0,0 +1,155 @@ + array( + '[first] [last]', + '[first] [last]', + '[first] [last]', + '[first] [last]', + '[first] [last]', + '[first] [last]', + '[first] [last]', + '[first] [last]', + '[first] [last]-[last]', + '[first] [middle] [last]', + '[first] "[nick]" [last]', + '[first] [particle] [particle] [particle]', + ), + 'first' => array( + 'Mohamed', + 'Youssef', + 'Ahmed', + 'Mahmoud', + 'Mustafa', + 'Fatma', + 'Aya', + 'Noam', + 'Adam', + 'Lucas', + 'Noah', + 'Jakub', + 'Victor', + 'Harry', + 'Rasmus', + 'Nathan', + 'Emil', + 'Charlie', + 'Leon', + 'Dylan', + 'Alexander', + 'Emma', + 'Marie', + 'Lea', + 'Amelia', + 'Hanna', + 'Emily', + 'Sofia', + 'Julia', + 'Santiago', + 'Sebastian', + 'Olivia', + 'Madison', + 'Isabella', + 'Esther', + 'Anya', + 'Camila', + 'Jack', + 'Oliver', + ), + 'nick' => array( + 'Buzz', + 'Juggernaut', + 'Haze', + 'Hawk', + 'Iceman', + 'Killer', + 'Apex', + 'Ocelot', + ), + 'middle' => array( + 'Rose', + 'Grace', + 'Jane', + 'Louise', + 'Jade', + 'James', + 'John', + 'William', + 'Thomas', + 'Alexander', + ), + 'last' => array( + '[termlast]', + '[termlast]', + '[termlast]', + '[termlast]', + '[termlast]', + '[termlast]', + '[termlast]', + '[termlast]', + 'O\'[termlast]', + 'Mc[termlast]', + ), + 'termlast' => array( + 'Smith', + 'Johnson', + 'Williams', + 'Jones', + 'Brown', + 'Davis', + 'Miller', + 'Wilson', + 'Moore', + 'Taylor', + 'Anderson', + 'Thomas', + 'Jackson', + 'White', + 'Harris', + 'Martin', + 'Thompson', + 'Garcia', + 'Marinez', + 'Robinson', + 'Clark', + 'Rodrigues', + 'Lewis', + 'Lee', + 'Walker', + 'Hall', + 'Allen', + 'Young', + 'Hernandex', + 'King', + 'Wang', + 'Li', + 'Zhang', + 'Liu', + 'Chen', + 'Yang', + 'Huang', + 'Zhao', + 'Wu', + 'Zhou', + 'Xu', + 'Sun', + 'Ma', + ), + 'particle' => array( + 'Wu', + 'Xu', + 'Ma', + 'Li', + 'Liu', + 'Shao', + 'Lin', + 'Khan', + ), + ); + } + +} diff --git a/src/grammar/code/PhutilCLikeCodeSnippetContextFreeGrammar.php b/src/grammar/code/PhutilCLikeCodeSnippetContextFreeGrammar.php new file mode 100644 --- /dev/null +++ b/src/grammar/code/PhutilCLikeCodeSnippetContextFreeGrammar.php @@ -0,0 +1,254 @@ +getStmtTerminationGrammarSet(), + $this->getVarNameGrammarSet(), + $this->getNullExprGrammarSet(), + $this->getNumberGrammarSet(), + $this->getExprGrammarSet(), + $this->getCondGrammarSet(), + $this->getLoopGrammarSet(), + $this->getStmtGrammarSet(), + $this->getAssignmentGrammarSet(), + $this->getArithExprGrammarSet(), + $this->getBoolExprGrammarSet(), + $this->getBoolValGrammarSet(), + $this->getTernaryExprGrammarSet(), + + $this->getFuncNameGrammarSet(), + $this->getFuncCallGrammarSet(), + $this->getFuncCallParamGrammarSet(), + $this->getFuncDeclGrammarSet(), + $this->getFuncParamGrammarSet(), + $this->getFuncBodyGrammarSet(), + $this->getFuncReturnGrammarSet(), + ); + } + + protected function getStartGrammarSet() { + $start_grammar = parent::getStartGrammarSet(); + + $start_grammar['start'][] = '[funcdecl]'; + + return $start_grammar; + } + + protected function getStmtTerminationGrammarSet() { + return $this->buildGrammarSet('term', array(';')); + } + + protected function getFuncCallGrammarSet() { + return $this->buildGrammarSet('funccall', + array( + '[funcname]([funccallparam])', + )); + } + + protected function getFuncCallParamGrammarSet() { + return $this->buildGrammarSet('funccallparam', + array( + '', + '[expr]', + '[expr], [expr]', + )); + } + + protected function getFuncDeclGrammarSet() { + return $this->buildGrammarSet('funcdecl', + array( + 'function [funcname]([funcparam]) '. + '{[funcbody, indent, block, trim=right]}', + )); + } + + protected function getFuncParamGrammarSet() { + return $this->buildGrammarSet('funcparam', + array( + '', + '[varname]', + '[varname], [varname]', + '[varname], [varname], [varname]', + )); + } + + protected function getFuncBodyGrammarSet() { + return $this->buildGrammarSet('funcbody', + array( + "[stmt]\n[stmt]\n[funcreturn]", + "[stmt]\n[stmt]\n[stmt]\n[funcreturn]", + "[stmt]\n[stmt]\n[stmt]\n[stmt]\n[funcreturn]", + )); + } + + protected function getFuncReturnGrammarSet() { + return $this->buildGrammarSet('funcreturn', + array( + 'return [expr][term]', + '', + )); + } + + // Not really C, but put it here because of the curly braces and mostly shared + // among Java and PHP + protected function getClassDeclGrammarSet() { + return $this->buildGrammarSet('classdecl', + array( + '[classinheritancemod] class [classname] {[classbody, indent, block]}', + 'class [classname] {[classbody, indent, block]}', + )); + } + + protected function getClassNameGrammarSet() { + return $this->buildGrammarSet('classname', + array( + 'MuffinHouse', + 'MuffinReader', + 'MuffinAwesomizer', + 'SuperException', + 'Librarian', + 'Book', + 'Ball', + 'BallOfCode', + 'AliceAndBobsSharedSecret', + 'FileInputStream', + 'FileOutputStream', + 'BufferedReader', + 'BufferedWriter', + 'Cardigan', + 'HouseOfCards', + 'UmbrellaClass', + 'GenericThing', + )); + } + + protected function getClassBodyGrammarSet() { + return $this->buildGrammarSet('classbody', + array( + '[methoddecl]', + "[methoddecl]\n\n[methoddecl]", + "[propdecl]\n[propdecl]\n\n[methoddecl]\n\n[methoddecl]", + "[propdecl]\n[propdecl]\n[propdecl]\n\n[methoddecl]\n\n[methoddecl]". + "\n\n[methoddecl]", + )); + } + + protected function getVisibilityGrammarSet() { + return $this->buildGrammarSet('visibility', + array( + 'private', + 'protected', + 'public', + )); + } + + protected function getClassInheritanceModGrammarSet() { + return $this->buildGrammarSet('classinheritancemod', + array( + 'final', + 'abstract', + )); + } + + // Keeping this separate so we won't give abstract methods a function body + protected function getMethodInheritanceModGrammarSet() { + return $this->buildGrammarSet('methodinheritancemod', + array( + 'final', + )); + } + + protected function getMethodDeclGrammarSet() { + return $this->buildGrammarSet('methoddecl', + array( + '[visibility] [methodfuncdecl]', + '[visibility] [methodfuncdecl]', + '[methodinheritancemod] [visibility] [methodfuncdecl]', + '[abstractmethoddecl]', + )); + } + + protected function getMethodFuncDeclGrammarSet() { + return $this->buildGrammarSet('methodfuncdecl', + array( + 'function [funcname]([funcparam]) '. + '{[methodbody, indent, block, trim=right]}', + )); + } + + protected function getMethodBodyGrammarSet() { + return $this->buildGrammarSet('methodbody', + array( + "[methodstmt]\n[methodbody]", + "[methodstmt]\n[funcreturn]", + )); + } + + protected function getMethodStmtGrammarSet() { + $stmts = $this->getStmtGrammarSet(); + + return $this->buildGrammarSet('methodstmt', + array_merge( + $stmts['stmt'], + array( + '[methodcall][term]', + ))); + } + + protected function getMethodCallGrammarSet() { + // Java/JavaScript + return $this->buildGrammarSet('methodcall', + array( + 'this.[funccall]', + '[varname].[funccall]', + '[classname].[funccall]', + )); + } + + protected function getAbstractMethodDeclGrammarSet() { + return $this->buildGrammarSet('abstractmethoddecl', + array( + 'abstract function [funcname]([funcparam])[term]', + )); + } + + protected function getPropDeclGrammarSet() { + return $this->buildGrammarSet('propdecl', + array( + '[visibility] [varname][term]', + )); + } + + protected function getClassRuleSets() { + return array( + $this->getClassInheritanceModGrammarSet(), + $this->getMethodInheritanceModGrammarSet(), + $this->getClassDeclGrammarSet(), + $this->getClassNameGrammarSet(), + $this->getClassBodyGrammarSet(), + $this->getMethodDeclGrammarSet(), + $this->getMethodFuncDeclGrammarSet(), + $this->getMethodBodyGrammarSet(), + $this->getMethodStmtGrammarSet(), + $this->getMethodCallGrammarSet(), + $this->getAbstractMethodDeclGrammarSet(), + $this->getPropDeclGrammarSet(), + $this->getVisibilityGrammarSet(), + ); + } + + public function generateClass() { + $rules = array_merge($this->getRules(), $this->getClassRuleSets()); + $rules['start'] = array('[classdecl]'); + $count = 0; + return $this->applyRules('[start]', $count, $rules); + } + +} diff --git a/src/grammar/code/PhutilCodeSnippetContextFreeGrammar.php b/src/grammar/code/PhutilCodeSnippetContextFreeGrammar.php new file mode 100644 --- /dev/null +++ b/src/grammar/code/PhutilCodeSnippetContextFreeGrammar.php @@ -0,0 +1,205 @@ +getStartGrammarSet(), + $this->getStmtGrammarSet(), + array_mergev($this->buildRuleSet())); + } + + abstract protected function buildRuleSet(); + + protected function buildGrammarSet($name, array $set) { + return array( + $name => $set, + ); + } + + protected function getStartGrammarSet() { + return $this->buildGrammarSet('start', + array( + "[stmt]\n[stmt]", + "[stmt]\n[stmt]\n[stmt]", + "[stmt]\n[stmt]\n[stmt]\n[stmt]", + )); + } + + protected function getStmtGrammarSet() { + return $this->buildGrammarSet('stmt', + array( + '[assignment][term]', + '[assignment][term]', + '[assignment][term]', + '[assignment][term]', + '[funccall][term]', + '[funccall][term]', + '[funccall][term]', + '[funccall][term]', + '[cond]', + '[loop]', + )); + } + + protected function getFuncNameGrammarSet() { + return $this->buildGrammarSet('funcname', + array( + 'do_something', + 'nonempty', + 'noOp', + 'call_user_func', + 'getenv', + 'render', + 'super', + 'derpify', + 'awesomize', + 'equals', + 'run', + 'flee', + 'fight', + 'notify', + 'listen', + 'calculate', + 'aim', + 'open', + )); + } + + protected function getVarNameGrammarSet() { + return $this->buildGrammarSet('varname', + array( + 'is_something', + 'object', + 'name', + 'token', + 'label', + 'piece_of_the_pie', + 'type', + 'state', + 'param', + 'action', + 'key', + 'timeout', + 'result', + )); + } + + protected function getNullExprGrammarSet() { + return $this->buildGrammarSet('null', array('null')); + } + + protected function getNumberGrammarSet() { + return $this->buildGrammarSet('number', + array( + mt_rand(-1, 100), + mt_rand(-100, 1000), + mt_rand(-1000, 5000), + mt_rand(0, 1).'.'.mt_rand(1, 1000), + mt_rand(0, 50).'.'.mt_rand(1, 1000), + )); + } + + protected function getExprGrammarSet() { + return $this->buildGrammarSet('expr', + array( + '[null]', + '[number]', + '[number]', + '[varname]', + '[varname]', + '[boolval]', + '[boolval]', + '[boolexpr]', + '[boolexpr]', + '[funccall]', + '[arithexpr]', + '[arithexpr]', + // Some random strings + '"'.Filesystem::readRandomCharacters(4).'"', + '"'.Filesystem::readRandomCharacters(5).'"', + )); + } + + protected function getBoolExprGrammarSet() { + return $this->buildGrammarSet('boolexpr', + array( + '[varname]', + '![varname]', + '[varname] == [boolval]', + '[varname] != [boolval]', + '[ternary]', + )); + } + + protected function getBoolValGrammarSet() { + return $this->buildGrammarSet('boolval', + array( + 'true', + 'false', + )); + } + + protected function getArithExprGrammarSet() { + return $this->buildGrammarSet('arithexpr', + array( + '[varname]++', + '++[varname]', + '[varname] + [number]', + '[varname]--', + '--[varname]', + '[varname] - [number]', + )); + } + + protected function getAssignmentGrammarSet() { + return $this->buildGrammarSet('assignment', + array( + '[varname] = [expr]', + '[varname] = [arithexpr]', + '[varname] += [expr]', + )); + } + + protected function getCondGrammarSet() { + return $this->buildGrammarSet('cond', + array( + 'if ([boolexpr]) {[stmt, indent, block]}', + 'if ([boolexpr]) {[stmt, indent, block]} else {[stmt, indent, block]}', + )); + } + + protected function getLoopGrammarSet() { + return $this->buildGrammarSet('loop', + array( + 'while ([boolexpr]) {[stmt, indent, block]}', + 'do {[stmt, indent, block]} while ([boolexpr])[term]', + 'for ([assignment]; [boolexpr]; [expr]) {[stmt, indent, block]}', + )); + } + + protected function getTernaryExprGrammarSet() { + return $this->buildGrammarSet('ternary', + array( + '[boolexpr] ? [expr] : [expr]', + )); + } + + protected function getStmtTerminationGrammarSet() { + return $this->buildGrammarSet('term', array('')); + } + +} diff --git a/src/grammar/code/PhutilJavaCodeSnippetContextFreeGrammar.php b/src/grammar/code/PhutilJavaCodeSnippetContextFreeGrammar.php new file mode 100644 --- /dev/null +++ b/src/grammar/code/PhutilJavaCodeSnippetContextFreeGrammar.php @@ -0,0 +1,184 @@ +getClassRuleSets()); + + $rulesset[] = $this->getTypeNameGrammarSet(); + $rulesset[] = $this->getNamespaceDeclGrammarSet(); + $rulesset[] = $this->getNamespaceNameGrammarSet(); + $rulesset[] = $this->getImportGrammarSet(); + $rulesset[] = $this->getMethodReturnTypeGrammarSet(); + $rulesset[] = $this->getMethodNameGrammarSet(); + $rulesset[] = $this->getVarDeclGrammarSet(); + $rulesset[] = $this->getClassDerivGrammarSet(); + + return $rulesset; + } + + protected function getStartGrammarSet() { + return $this->buildGrammarSet('start', + array( + '[import, block][nmspdecl, block][classdecl, block]', + )); + } + + protected function getClassDeclGrammarSet() { + return $this->buildGrammarSet('classdecl', + array( + '[classinheritancemod] [visibility] class [classname][classderiv] '. + '{[classbody, indent, block]}', + '[visibility] class [classname][classderiv] '. + '{[classbody, indent, block]}', + )); + } + + protected function getClassDerivGrammarSet() { + return $this->buildGrammarSet('classderiv', + array( + ' extends [classname]', + '', + '', + )); + } + + protected function getTypeNameGrammarSet() { + return $this->buildGrammarSet('type', + array( + 'int', + 'boolean', + 'char', + 'short', + 'long', + 'float', + 'double', + '[classname]', + '[type][]', + )); + } + + protected function getMethodReturnTypeGrammarSet() { + return $this->buildGrammarSet('methodreturn', + array( + '[type]', + 'void', + )); + } + + protected function getNamespaceDeclGrammarSet() { + return $this->buildGrammarSet('nmspdecl', + array( + 'package [nmspname][term]', + )); + } + + protected function getNamespaceNameGrammarSet() { + return $this->buildGrammarSet('nmspname', + array( + 'java.lang', + 'java.io', + 'com.example.proj.std', + 'derp.example.www', + )); + } + + protected function getImportGrammarSet() { + return $this->buildGrammarSet('import', + array( + 'import [nmspname][term]', + 'import [nmspname].*[term]', + 'import [nmspname].[classname][term]', + )); + } + + protected function getExprGrammarSet() { + $expr = parent::getExprGrammarSet(); + + $expr['expr'][] = 'new [classname]([funccallparam])'; + + $expr['expr'][] = '[methodcall]'; + $expr['expr'][] = '[methodcall]'; + $expr['expr'][] = '[methodcall]'; + $expr['expr'][] = '[methodcall]'; + + // Add some 'char's + for ($ii = 0; $ii < 2; $ii++) { + $expr['expr'][] = "'".Filesystem::readRandomCharacters(1)."'"; + } + + return $expr; + } + + protected function getStmtGrammarSet() { + $stmt = parent::getStmtGrammarSet(); + + $stmt['stmt'][] = '[vardecl]'; + $stmt['stmt'][] = '[vardecl]'; + // `try` to `throw` a `Ball`! + $stmt['stmt'][] = 'throw [classname][term]'; + + return $stmt; + } + + protected function getPropDeclGrammarSet() { + return $this->buildGrammarSet('propdecl', + array( + '[visibility] [type] [varname][term]', + )); + } + + protected function getVarDeclGrammarSet() { + return $this->buildGrammarSet('vardecl', + array( + '[type] [varname][term]', + '[type] [assignment][term]', + )); + } + + protected function getFuncNameGrammarSet() { + return $this->buildGrammarSet('funcname', + array( + '[methodname]', + '[classname].[methodname]', + // This is just silly (too much recursion) + // '[classname].[funcname]', + // Don't do this for now, it just clutters up output (thanks to rec.) + // '[nmspname].[classname].[methodname]', + )); + } + + // Renamed from `funcname` + protected function getMethodNameGrammarSet() { + $funcnames = head(parent::getFuncNameGrammarSet()); + return $this->buildGrammarSet('methodname', $funcnames); + } + + protected function getMethodFuncDeclGrammarSet() { + return $this->buildGrammarSet('methodfuncdecl', + array( + '[methodreturn] [methodname]([funcparam]) '. + '{[methodbody, indent, block, trim=right]}', + )); + } + + protected function getFuncParamGrammarSet() { + return $this->buildGrammarSet('funcparam', + array( + '', + '[type] [varname]', + '[type] [varname], [type] [varname]', + '[type] [varname], [type] [varname], [type] [varname]', + )); + } + + protected function getAbstractMethodDeclGrammarSet() { + return $this->buildGrammarSet('abstractmethoddecl', + array( + 'abstract [methodreturn] [methodname]([funcparam])[term]', + )); + } + +} diff --git a/src/grammar/code/PhutilPHPCodeSnippetContextFreeGrammar.php b/src/grammar/code/PhutilPHPCodeSnippetContextFreeGrammar.php new file mode 100644 --- /dev/null +++ b/src/grammar/code/PhutilPHPCodeSnippetContextFreeGrammar.php @@ -0,0 +1,57 @@ +getClassRuleSets()); + } + + protected function getStartGrammarSet() { + $start_grammar = parent::getStartGrammarSet(); + + $start_grammar['start'][] = '[classdecl]'; + $start_grammar['start'][] = '[classdecl]'; + + return $start_grammar; + } + + protected function getExprGrammarSet() { + $expr = parent::getExprGrammarSet(); + + $expr['expr'][] = 'new [classname]([funccallparam])'; + + $expr['expr'][] = '[classname]::[funccall]'; + + return $expr; + } + + protected function getVarNameGrammarSet() { + $varnames = parent::getVarNameGrammarSet(); + + foreach ($varnames as $vn_key => $vn_val) { + foreach ($vn_val as $vv_key => $vv_value) { + $varnames[$vn_key][$vv_key] = '$'.$vv_value; + } + } + + return $varnames; + } + + protected function getFuncNameGrammarSet() { + return $this->buildGrammarSet('funcname', + array_mergev(get_defined_functions())); + } + + protected function getMethodCallGrammarSet() { + return $this->buildGrammarSet('methodcall', + array( + '$this->[funccall]', + 'self::[funccall]', + 'static::[funccall]', + '[varname]->[funccall]', + '[classname]::[funccall]', + )); + } + +} diff --git a/src/internationalization/PhutilLocale.php b/src/internationalization/PhutilLocale.php new file mode 100644 --- /dev/null +++ b/src/internationalization/PhutilLocale.php @@ -0,0 +1,247 @@ +" order. + * + * @param const `PhutilPerson` gender constant. + * @param list List of variants. + * @return string Variant for use. + */ + public function selectGenderVariant($variant, array $translations) { + if ($variant == PhutilPerson::GENDER_FEMININE) { + return end($translations); + } else { + return reset($translations); + } + } + + + /** + * Select a plural variant for this locale. By default, locales use a simple + * rule with two plural variants, listed in "" order. + * + * @param int Plurality of the value. + * @param list List of variants. + * @return string Variant for use. + */ + public function selectPluralVariant($variant, array $translations) { + if ($variant == 1) { + return reset($translations); + } else { + return end($translations); + } + } + + + /** + * Flags a locale as silly, like "English (Pirate)". + * + * These locales are fun but disastrously inappropriate for serious + * businesses. + * + * @return bool True if this locale is silly. + */ + public function isSillyLocale() { + return false; + } + + + /** + * Flags a locale as a testing locale, like "English (US, ALL CAPS)". These + * locales are useful for translation development, but not for normal users. + * + * @return bool True if this is a locale for testing or development. + */ + public function isTestLocale() { + return false; + } + + + /** + * Indicates that the translator should post-process translations in this + * locale by calling @{method:didTranslateString}. + * + * Doing this incurs a performance penalty, and is not useful for most + * languages. However, it can be used to implement test translations like + * "English (US, ALL CAPS)". + * + * @return bool True to postprocess strings. + */ + public function shouldPostProcessTranslations() { + return false; + } + + + /** + * Callback for post-processing translations. + * + * By default, this callback is not invoked. To activate it, return `true` + * from @{method:shouldPostProcessTranslations}. Activating this callback + * incurs a performance penalty. + * + * @param string The raw input pattern. + * @param string The selected translation pattern. + * @param list The raw input arguments. + * @param string The translated string. + * @return string Post-processed translation string. + */ + public function didTranslateString( + $raw_pattern, + $translated_pattern, + array $args, + $result_text) { + return $result_text; + } + + + /** + * Load all available locales. + * + * @return map Map from codes to locale objects. + */ + public static function loadAllLocales() { + static $locales; + + if ($locales === null) { + $objects = id(new PhutilClassMapQuery()) + ->setAncestorClass(__CLASS__) + ->execute(); + + $locale_map = array(); + foreach ($objects as $object) { + $locale_code = $object->getLocaleCode(); + if (empty($locale_map[$locale_code])) { + $locale_map[$locale_code] = $object; + } else { + throw new Exception( + pht( + 'Two subclasses of "%s" ("%s" and "%s") define '. + 'locales with the same locale code ("%s"). Each locale must '. + 'have a unique locale code.', + __CLASS__, + get_class($object), + get_class($locale_map[$locale_code]), + $locale_code)); + } + } + + foreach ($locale_map as $locale_code => $locale) { + $fallback_code = $locale->getFallbackLocaleCode(); + if ($fallback_code !== null) { + if (empty($locale_map[$fallback_code])) { + throw new Exception( + pht( + 'The locale "%s" has an invalid fallback locale code ("%s"). '. + 'No locale class exists which defines this locale.', + get_class($locale), + $fallback_code)); + } + } + } + + foreach ($locale_map as $locale_code => $locale) { + $seen = array($locale_code => get_class($locale)); + self::checkLocaleFallback($locale_map, $locale, $seen); + } + + $locales = $locale_map; + } + return $locales; + } + + + /** + * Load a specific locale using a locale code. + * + * @param string Locale code. + * @return PhutilLocale Locale object. + */ + public static function loadLocale($locale_code) { + $all_locales = self::loadAllLocales(); + $locale = idx($all_locales, $locale_code); + + if (!$locale) { + throw new Exception( + pht( + 'There is no locale with the locale code "%s".', + $locale_code)); + } + + return $locale; + } + + + /** + * Recursively check locale fallbacks for cycles. + * + * @param map Map of locales. + * @param PhutilLocale Current locale. + * @param map Map of visited locales. + * @return void + */ + private static function checkLocaleFallback( + array $map, + PhutilLocale $locale, + array $seen) { + + $fallback_code = $locale->getFallbackLocaleCode(); + if ($fallback_code === null) { + return; + } + + if (isset($seen[$fallback_code])) { + $seen[] = get_class($locale); + $seen[] = pht('...'); + throw new Exception( + pht( + 'Locale "%s" is part of a cycle of locales which fall back on '. + 'one another in a loop (%s). Locales which fall back on other '. + 'locales must not loop.', + get_class($locale), + implode(' -> ', $seen))); + } + + $seen[$fallback_code] = get_class($locale); + self::checkLocaleFallback($map, $map[$fallback_code], $seen); + } + +} diff --git a/src/internationalization/PhutilNumber.php b/src/internationalization/PhutilNumber.php new file mode 100644 --- /dev/null +++ b/src/internationalization/PhutilNumber.php @@ -0,0 +1,26 @@ +value = $value; + $this->decimals = $decimals; + } + + public function getNumber() { + return $this->value; + } + + public function setDecimals($decimals) { + $this->decimals = $decimals; + return $this; + } + + public function getDecimals() { + return $this->decimals; + } + +} diff --git a/src/internationalization/PhutilPerson.php b/src/internationalization/PhutilPerson.php new file mode 100644 --- /dev/null +++ b/src/internationalization/PhutilPerson.php @@ -0,0 +1,11 @@ + Map of raw strings to translations. + */ + abstract protected function getTranslations(); + + + /** + * Return a filtered map of all strings in this translation. + * + * Filters out empty/placeholder translations. + * + * @return map Map of raw strings to translations. + */ + final public function getFilteredTranslations() { + $translations = $this->getTranslations(); + + foreach ($translations as $key => $translation) { + if ($translation === null) { + unset($translations[$key]); + } + } + + return $translations; + } + + + /** + * Load all available translation objects. + * + * @return list List of available translation sources. + */ + public static function loadAllTranslations() { + return id(new PhutilClassMapQuery()) + ->setAncestorClass(__CLASS__) + ->execute(); + } + + + /** + * Load the complete translation map for a locale. + * + * This will compile primary and fallback translations into a single + * translation map. + * + * @param string Locale code, like "en_US". + * @return map Map of all avialable translations. + */ + public static function getTranslationMapForLocale($locale_code) { + $locale = PhutilLocale::loadLocale($locale_code); + + $translations = self::loadAllTranslations(); + + $results = array(); + foreach ($translations as $translation) { + if ($translation->getLocaleCode() == $locale_code) { + $results += $translation->getFilteredTranslations(); + } + } + + $fallback_code = $locale->getFallbackLocaleCode(); + if ($fallback_code !== null) { + $results += self::getTranslationMapForLocale($fallback_code); + } + + return $results; + } + +} diff --git a/src/internationalization/PhutilTranslator.php b/src/internationalization/PhutilTranslator.php new file mode 100644 --- /dev/null +++ b/src/internationalization/PhutilTranslator.php @@ -0,0 +1,269 @@ +locale = $locale; + $this->localeCode = $locale->getLocaleCode(); + $this->shouldPostProcess = $locale->shouldPostProcessTranslations(); + return $this; + } + + public function setWillTranslateCallback($callback) { + $this->willTranslateCallback = $callback; + return $this; + } + + public function getWillTranslateCallback() { + return $this->willTranslateCallback; + } + + /** + * Add translations which will be later used by @{method:translate}. + * The parameter is an array of strings (for simple translations) or arrays + * (for translations with variants). The number of items in the array is + * language specific. It is `array($singular, $plural)` for English. + * + * array( + * 'color' => 'colour', + * '%d beer(s)' => array('%d beer', '%d beers'), + * ); + * + * The arrays can be nested for strings with more variant parts: + * + * array( + * '%d char(s) on %d row(s)' => array( + * array('%d char on %d row', '%d char on %d rows'), + * array('%d chars on %d row', '%d chars on %d rows'), + * ), + * ); + * + * The translation should have the same placeholders as originals. Swapping + * parameter order is possible: + * + * array( + * '%s owns %s.' => '%2$s is owned by %1$s.', + * ); + * + * @param array Identifier in key, translation in value. + * @return PhutilTranslator Provides fluent interface. + */ + public function setTranslations(array $translations) { + $this->translations = $translations; + return $this; + } + + public function translate($text /* , ... */) { + $args = func_get_args(); + + if ($this->willTranslateCallback) { + call_user_func_array($this->willTranslateCallback, $args); + } + + if (isset($this->translations[$text])) { + $translation = $this->translations[$text]; + } else { + $translation = $text; + } + + while (is_array($translation)) { + $arg = next($args); + $translation = $this->chooseVariant($translation, $arg); + if ($translation === null) { + $pos = key($args); + + if (is_object($arg)) { + $kind = get_class($arg); + } else { + $kind = gettype($arg); + } + + return sprintf( + '[Invalid Translation!] The "%s" language data offers variant '. + 'translations for the plurality or gender of argument %s, but '. + 'the value for that argument is not an integer, PhutilNumber, or '. + 'PhutilPerson (it is a value of type "%s"). Raw input: <%s>.', + $this->localeCode, + $pos, + $kind, + $text); + } + } + array_shift($args); + + foreach ($args as $k => $arg) { + if ($arg instanceof PhutilNumber) { + $args[$k] = $this->formatNumber($arg->getNumber(), $arg->getDecimals()); + } + } + + // Check if any arguments are PhutilSafeHTML. If they are, we will apply + // any escaping necessary and output HTML. + $is_html = false; + foreach ($args as $arg) { + if ($arg instanceof PhutilSafeHTML || + $arg instanceof PhutilSafeHTMLProducerInterface) { + $is_html = true; + break; + } + } + + if ($is_html) { + foreach ($args as $k => $arg) { + $args[$k] = (string)phutil_escape_html($arg); + } + } + + $result = vsprintf($translation, $args); + if ($result === false) { + // If vsprintf() fails (often because the translated string references + // too many parameters), show the bad template with a note instead of + // returning an empty string. This makes it easier to figure out what + // went wrong and fix it. + $result = pht('[Invalid Translation!] %s', $translation); + } + + if ($this->shouldPostProcess) { + $result = $this->locale->didTranslateString( + $text, + $translation, + $args, + $result); + } + + if ($is_html) { + $result = phutil_safe_html($result); + } + + return $result; + } + + private function chooseVariant(array $translations, $variant) { + if (count($translations) == 1) { + // If we only have one variant, we can select it directly. + return reset($translations); + } + + if ($variant instanceof PhutilNumber) { + $is_gender = false; + $variant = $variant->getNumber(); + } else if ($variant instanceof PhutilPerson) { + $is_gender = true; + $variant = $variant->getGender(); + } else if (is_int($variant)) { + $is_gender = false; + } else { + return null; + } + + if ($is_gender) { + return $this->locale->selectGenderVariant($variant, $translations); + } else { + + // NOTE: This is a microoptimization which slightly improves performance + // for common languages with simple plural rules. Languages do not need + // to be added here even if they use the simple rules. The benefit of + // inclusion here is small, on the order of 5%. + static $simple_plural = array( + 'en_US' => true, + 'en_GB' => true, + 'en_ES' => true, + 'ko_KR' => true, + ); + + if (isset($simple_plural[$this->localeCode])) { + if ($variant == 1) { + return reset($translations); + } else { + return end($translations); + } + } else { + return $this->locale->selectPluralVariant($variant, $translations); + } + } + + } + + /** + * Translate date formatted by `$date->format()`. + * + * @param string Format accepted by `DateTime::format()`. + * @param DateTime + * @return string Formatted and translated date. + */ + public function translateDate($format, DateTime $date) { + static $format_cache = array(); + if (!isset($format_cache[$format])) { + $translatable = 'DlSFMaA'; + preg_match_all( + '/['.$translatable.']|(\\\\.|[^'.$translatable.'])+/', + $format, + $format_cache[$format], + PREG_SET_ORDER); + } + + $parts = array(); + foreach ($format_cache[$format] as $match) { + $part = $date->format($match[0]); + if (!isset($match[1])) { + $part = $this->translate($part); + } + $parts[] = $part; + } + return implode('', $parts); + } + + /** + * Format number with grouped thousands and optional decimal part. Requires + * translations of '.' (decimal point) and ',' (thousands separator). Both + * these translations must be 1 byte long with PHP < 5.4.0. + * + * @param float + * @param int + * @return string + */ + public function formatNumber($number, $decimals = 0) { + return number_format( + $number, + $decimals, + $this->translate('.'), + $this->translate(',')); + } + + public function validateTranslation($original, $translation) { + $pattern = '/<(\S[^>]*>?)?|&(\S[^;]*;?)?/i'; + $original_matches = null; + $translation_matches = null; + + preg_match_all($pattern, $original, $original_matches); + preg_match_all($pattern, $translation, $translation_matches); + + sort($original_matches[0]); + sort($translation_matches[0]); + + if ($original_matches[0] !== $translation_matches[0]) { + return false; + } + return true; + } + +} diff --git a/src/internationalization/__tests__/PhutilLocaleTestCase.php b/src/internationalization/__tests__/PhutilLocaleTestCase.php new file mode 100644 --- /dev/null +++ b/src/internationalization/__tests__/PhutilLocaleTestCase.php @@ -0,0 +1,10 @@ +assertTrue(true); + } + +} diff --git a/src/internationalization/__tests__/PhutilPersonTest.php b/src/internationalization/__tests__/PhutilPersonTest.php new file mode 100644 --- /dev/null +++ b/src/internationalization/__tests__/PhutilPersonTest.php @@ -0,0 +1,20 @@ +gender; + } + + public function setGender($value) { + $this->gender = $value; + return $this; + } + + public function __toString() { + return pht('Test (%s)', $this->gender); + } + +} diff --git a/src/internationalization/__tests__/PhutilPhtTestCase.php b/src/internationalization/__tests__/PhutilPhtTestCase.php new file mode 100644 --- /dev/null +++ b/src/internationalization/__tests__/PhutilPhtTestCase.php @@ -0,0 +1,101 @@ +assertEqual('beer', pht('beer')); + $this->assertEqual('1 beer(s)', pht('%d beer(s)', 1)); + + $english_locale = PhutilLocale::loadLocale('en_US'); + PhutilTranslator::getInstance()->setLocale($english_locale); + PhutilTranslator::getInstance()->setTranslations( + array( + '%d beer(s)' => array('%d beer', '%d beers'), + )); + + $this->assertEqual('1 beer', pht('%d beer(s)', 1)); + + $czech_locale = PhutilLocale::loadLocale('cs_CZ'); + PhutilTranslator::getInstance()->setLocale($czech_locale); + PhutilTranslator::getInstance()->setTranslations( + array( + '%d beer(s)' => array('%d pivo', '%d piva', '%d piv'), + )); + + $this->assertEqual('5 piv', pht('%d beer(s)', 5)); + } + + public function getDateTranslations() { + // The only purpose of this function is to provide a static list of + // translations which can come from PhutilTranslator::translateDate() to + // allow translation extractor getting them. + return array( + 'D' => array( + pht('Sun'), + pht('Mon'), + pht('Tue'), + pht('Wed'), + pht('Thu'), + pht('Fri'), + pht('Sat'), + ), + 'l' => array( + pht('Sunday'), + pht('Monday'), + pht('Tuesday'), + pht('Wednesday'), + pht('Thursday'), + pht('Friday'), + pht('Saturday'), + ), + 'S' => array( + pht('st'), + pht('nd'), + pht('rd'), + pht('th'), + ), + 'F' => array( + pht('January'), + pht('February'), + pht('March'), + pht('April'), + pht('May'), + pht('June'), + pht('July'), + pht('August'), + pht('September'), + pht('October'), + pht('November'), + pht('December'), + ), + 'M' => array( + pht('Jan'), + pht('Feb'), + pht('Mar'), + pht('Apr'), + pht('May'), + pht('Jun'), + pht('Jul'), + pht('Aug'), + pht('Sep'), + pht('Oct'), + pht('Nov'), + pht('Dec'), + ), + 'a' => array( + pht('am'), + pht('pm'), + ), + 'A' => array( + pht('AM'), + pht('PM'), + ), + ); + } + +} diff --git a/src/internationalization/__tests__/PhutilTranslationTestCase.php b/src/internationalization/__tests__/PhutilTranslationTestCase.php new file mode 100644 --- /dev/null +++ b/src/internationalization/__tests__/PhutilTranslationTestCase.php @@ -0,0 +1,10 @@ +assertTrue(true); + } + +} diff --git a/src/internationalization/__tests__/PhutilTranslatorTestCase.php b/src/internationalization/__tests__/PhutilTranslatorTestCase.php new file mode 100644 --- /dev/null +++ b/src/internationalization/__tests__/PhutilTranslatorTestCase.php @@ -0,0 +1,261 @@ +newTranslator('en_US'); + $translator->setTranslations( + array( + '%d line(s)' => array('%d line', '%d lines'), + '%d char(s) on %d row(s)' => array( + array('%d char on %d row', '%d char on %d rows'), + array('%d chars on %d row', '%d chars on %d rows'), + ), + )); + + $this->assertEqual('line', $translator->translate('line')); + $this->assertEqual('param', $translator->translate('%s', 'param')); + + $this->assertEqual('0 lines', $translator->translate('%d line(s)', 0)); + $this->assertEqual('1 line', $translator->translate('%d line(s)', 1)); + $this->assertEqual('2 lines', $translator->translate('%d line(s)', 2)); + + $this->assertEqual( + '1 char on 1 row', + $translator->translate('%d char(s) on %d row(s)', 1, 1)); + $this->assertEqual( + '5 chars on 2 rows', + $translator->translate('%d char(s) on %d row(s)', 5, 2)); + + $this->assertEqual('1 beer(s)', $translator->translate('%d beer(s)', 1)); + } + + public function testSingleVariant() { + $translator = $this->newTranslator('en_US'); + + // In this translation, we have no alternatives for the first conversion. + $translator->setTranslations( + array( + 'Run the command %s %d time(s).' => array( + array( + 'Run the command %s once.', + 'Run the command %s %d times.', + ), + ), + )); + + $this->assertEqual( + 'Run the command ls 123 times.', + (string)$translator->translate( + 'Run the command %s %d time(s).', + hsprintf('%s', 'ls'), + 123)); + } + + public function testCzech() { + $translator = $this->newTranslator('cs_CZ'); + $translator->setTranslations( + array( + '%d beer(s)' => array('%d pivo', '%d piva', '%d piv'), + )); + + $this->assertEqual('0 piv', $translator->translate('%d beer(s)', 0)); + $this->assertEqual('1 pivo', $translator->translate('%d beer(s)', 1)); + $this->assertEqual('2 piva', $translator->translate('%d beer(s)', 2)); + $this->assertEqual('5 piv', $translator->translate('%d beer(s)', 5)); + + $this->assertEqual('1 line(s)', $translator->translate('%d line(s)', 1)); + } + + public function testPerson() { + $translator = $this->newTranslator('cs_CZ'); + $translator->setTranslations( + array( + '%s wrote.' => array('%s napsal.', '%s napsala.'), + )); + + $person = new PhutilPersonTest(); + $this->assertEqual( + 'Test () napsal.', + $translator->translate('%s wrote.', $person)); + + $person->setGender(PhutilPerson::GENDER_MASCULINE); + $this->assertEqual( + 'Test (m) napsal.', + $translator->translate('%s wrote.', $person)); + + $person->setGender(PhutilPerson::GENDER_FEMININE); + $this->assertEqual( + 'Test (f) napsala.', + $translator->translate('%s wrote.', $person)); + } + + public function testTranslateDate() { + $date = new DateTime('2012-06-21'); + $translator = $this->newTranslator('en_US'); + + $this->assertEqual('June', $translator->translateDate('F', $date)); + $this->assertEqual('June 21', $translator->translateDate('F d', $date)); + $this->assertEqual('F', $translator->translateDate('\F', $date)); + + $translator->setTranslations( + array( + 'June' => 'correct', + '21' => 'wrong', + 'F' => 'wrong', + )); + $this->assertEqual('correct', $translator->translateDate('F', $date)); + $this->assertEqual('correct 21', $translator->translateDate('F d', $date)); + $this->assertEqual('F', $translator->translateDate('\F', $date)); + } + + public function testSetInstance() { + $english_translator = $this->newTranslator('en_US'); + + PhutilTranslator::setInstance($english_translator); + $original = PhutilTranslator::getInstance(); + $this->assertEqual('color', pht('color')); + + $british_locale = PhutilLocale::loadLocale('en_GB'); + + $british = new PhutilTranslator(); + $british->setLocale($british_locale); + $british->setTranslations( + array( + 'color' => 'colour', + )); + PhutilTranslator::setInstance($british); + $this->assertEqual('colour', pht('color')); + + PhutilTranslator::setInstance($original); + $this->assertEqual('color', pht('color')); + } + + public function testFormatNumber() { + $translator = $this->newTranslator('en_US'); + + $this->assertEqual('1,234', $translator->formatNumber(1234)); + $this->assertEqual('1,234.5', $translator->formatNumber(1234.5, 1)); + $this->assertEqual('1,234.5678', $translator->formatNumber(1234.5678, 4)); + + $translator->setTranslations( + array( + ',' => ' ', + '.' => ',', + )); + $this->assertEqual('1 234', $translator->formatNumber(1234)); + $this->assertEqual('1 234,5', $translator->formatNumber(1234.5, 1)); + $this->assertEqual('1 234,5678', $translator->formatNumber(1234.5678, 4)); + } + + public function testNumberTranslations() { + $translator = $this->newTranslator('en_US'); + + $translator->setTranslations( + array( + '%s line(s)' => array('%s line', '%s lines'), + )); + + $this->assertEqual( + '1 line', + $translator->translate('%s line(s)', new PhutilNumber(1))); + + $this->assertEqual( + '1,000 lines', + $translator->translate('%s line(s)', new PhutilNumber(1000))); + + $this->assertEqual( + '8.5 lines', + $translator->translate( + '%s line(s)', + id(new PhutilNumber(8.5))->setDecimals(1))); + } + + public function testValidateTranslation() { + $tests = array( + 'a < 2' => array( + 'a < 2' => true, + 'b < 3' => true, + '2 > a' => false, + 'a<2' => false, + ), + 'We win' => array( + 'We win' => true, + 'We win' => true, // false positive + 'We win' => false, + 'We win' => false, + ), + 'We win & triumph' => array( + 'We triumph & win' => true, + 'We win and triumph' => false, + ), + 'beer' => array( + 'pivo' => true, + 'b<>r' => false, + 'b&&r' => false, + ), + ); + + $translator = $this->newTranslator('en_US'); + + foreach ($tests as $original => $translations) { + foreach ($translations as $translation => $expect) { + $valid = ($expect ? 'valid' : 'invalid'); + $this->assertEqual( + $expect, + $translator->validateTranslation($original, $translation), + pht( + "'%s' should be %s with '%s'.", + $original, + $valid, + $translation)); + } + } + } + + public function testHTMLTranslations() { + $string = '%s awoke suddenly at %s.'; + $when = '<4 AM>'; + + $translator = $this->newTranslator('en_US'); + + // When no components are HTML, everything is treated as a string. + $who = 'Abraham'; + $translation = $translator->translate( + $string, + $who, + $when); + $this->assertEqual( + 'string', + gettype($translation)); + $this->assertEqual( + 'Abraham awoke suddenly at <4 AM>.', + $translation); + + // When at least one component is HTML, everything is treated as HTML. + $who = phutil_tag('span', array(), 'Abraham'); + $translation = $translator->translate( + $string, + $who, + $when); + $this->assertTrue($translation instanceof PhutilSafeHTML); + $this->assertEqual( + 'Abraham awoke suddenly at <4 AM>.', + $translation->getHTMLContent()); + + $translation = $translator->translate( + $string, + $who, + new PhutilNumber(1383930802)); + $this->assertEqual( + 'Abraham awoke suddenly at 1,383,930,802.', + $translation->getHTMLContent()); + } + + private function newTranslator($locale_code) { + $locale = PhutilLocale::loadLocale($locale_code); + return id(new PhutilTranslator()) + ->setLocale($locale); + } + +} diff --git a/src/internationalization/locales/PhutilAllCapsEnglishLocale.php b/src/internationalization/locales/PhutilAllCapsEnglishLocale.php new file mode 100644 --- /dev/null +++ b/src/internationalization/locales/PhutilAllCapsEnglishLocale.php @@ -0,0 +1,38 @@ += 2 && $variant <= 4) { + return $paucal; + } + + return $plural; + } + +} diff --git a/src/internationalization/locales/PhutilEmojiLocale.php b/src/internationalization/locales/PhutilEmojiLocale.php new file mode 100644 --- /dev/null +++ b/src/internationalization/locales/PhutilEmojiLocale.php @@ -0,0 +1,33 @@ +setTranslations()` and language rules set + * by `PhutilTranslator::getInstance()->setLocale()`. + * + * @param string Translation identifier with `sprintf()` placeholders. + * @param mixed Value to select the variant from (e.g. singular or plural). + * @param ... Next values referenced from $text. + * @return string Translated string with substituted values. + */ +function pht($text, $variant = null /* , ... */) { + $args = func_get_args(); + $translator = PhutilTranslator::getInstance(); + return call_user_func_array(array($translator, 'translate'), $args); +} + +/** + * Count all elements in an array, or something in an object. + * + * @param array|Countable A countable object. + * @return PhutilNumber Returns the number of elements in the input + * parameter. + */ +function phutil_count($countable) { + if (!(is_array($countable) || $countable instanceof Countable)) { + throw new InvalidArgumentException(pht('Argument should be countable.')); + } + + return new PhutilNumber(count($countable)); +} + +/** + * Provide a gendered argument to the translation engine. + * + * This function does nothing and only serves as a marker for the static + * extractor so it knows particular arguments may vary on gender. + * + * @param PhutilPerson Something implementing @{interface:PhutilPerson}. + * @return PhutilPerson The argument, unmodified. + */ +function phutil_person(PhutilPerson $person) { + return $person; +} diff --git a/src/internationalization/translation/LibphutilUSEnglishTranslation.php b/src/internationalization/translation/LibphutilUSEnglishTranslation.php new file mode 100644 --- /dev/null +++ b/src/internationalization/translation/LibphutilUSEnglishTranslation.php @@ -0,0 +1,34 @@ + array( + 'Daemon was idle for more than one second, scaling pool down.', + 'Daemon was idle for more than %s seconds, scaling pool down.', + ), + + 'Analyzing %s file(s) with %s subprocess(es)...' => array( + array( + 'Analyzing one file with a single subprocess...', + 'Analyzing %s file with %s subprocesses...', + ), + array( + 'Analyzing %s files with a single subprocess...', + 'Analyzing %s files with %s subprocesses...', + ), + ), + + '... (%s more byte(s)) ...' => array( + '... (%s more byte) ...', + '... (%s more bytes) ...', + ), + ); + } + +} diff --git a/src/ip/PhutilCIDRBlock.php b/src/ip/PhutilCIDRBlock.php new file mode 100644 --- /dev/null +++ b/src/ip/PhutilCIDRBlock.php @@ -0,0 +1,84 @@ + + } + + public static function newBlock($in) { + if ($in instanceof PhutilCIDRBlock) { + return clone $in; + } + + return self::newFromString($in); + } + + private static function newFromString($str) { + if (!preg_match('(^[\d.:a-fA-F]+/[\d]+\z)', $str)) { + throw new Exception( + pht( + 'CIDR block "%s" is not formatted correctly. Expected an IP block '. + 'in CIDR notation, like "%s" or "%s".', + $str, + '172.30.0.0/16', + '23:45:67:89::/24')); + } + + list($ip, $mask) = explode('/', $str); + + $ip = PhutilIPAddress::newAddress($ip); + + if (preg_match('/^0\d/', $mask)) { + throw new Exception( + pht( + 'CIDR block "%s" is not formatted correctly. The IP block mask '. + '("%s") must not have leading zeroes.', + $str, + $mask)); + } + + $max_bits = $ip->getBitCount(); + + $bits = (int)$mask; + if ($bits < 0 || $bits > $max_bits) { + throw new Exception( + pht( + 'CIDR block "%s" is not formatted correctly. The IP block mask '. + '("%s") must mask between 0 and %s bits, inclusive.', + $str, + $mask, + new PhutilNumber($max_bits))); + } + + $obj = new PhutilCIDRBlock(); + $obj->ip = $ip; + $obj->bits = $bits; + + return $obj; + } + + public function containsAddress($address) { + $address = PhutilIPAddress::newAddress($address); + + $block_bits = $this->ip->toBits(); + $address_bits = $address->toBits(); + + // If the two addresses have different bit widths (IPv4 vs IPv6), this + // CIDR block does not match the address. + if ($this->ip->getBitCount() != $address->getBitCount()) { + return false; + } + + return (strncmp($block_bits, $address_bits, $this->bits) === 0); + } + +} diff --git a/src/ip/PhutilCIDRList.php b/src/ip/PhutilCIDRList.php new file mode 100644 --- /dev/null +++ b/src/ip/PhutilCIDRList.php @@ -0,0 +1,40 @@ +containsAddrsss('172.30.0.1'); + */ +final class PhutilCIDRList extends Phobject { + + private $blocks; + + private function __construct() { + // + } + + public static function newList(array $blocks) { + foreach ($blocks as $key => $block) { + $blocks[$key] = PhutilCIDRBlock::newBlock($block); + } + + $obj = new PhutilCIDRList(); + $obj->blocks = $blocks; + return $obj; + } + + public function containsAddress($address) { + foreach ($this->blocks as $block) { + if ($block->containsAddress($address)) { + return true; + } + } + + return false; + } + +} diff --git a/src/ip/PhutilIPAddress.php b/src/ip/PhutilIPAddress.php new file mode 100644 --- /dev/null +++ b/src/ip/PhutilIPAddress.php @@ -0,0 +1,43 @@ + + } + + abstract public function toBits(); + abstract public function getBitCount(); + abstract public function getAddress(); + + public static function newAddress($in) { + if ($in instanceof PhutilIPAddress) { + return clone $in; + } + + try { + return PhutilIPv4Address::newFromString($in); + } catch (Exception $ex) { + // Continue, trying the address as IPv6 instead. + } + + try { + return PhutilIPv6Address::newFromString($in); + } catch (Exception $ex) { + // Continue, throwing a more tailored exception below. + } + + throw new Exception( + pht( + 'IP address "%s" is not properly formatted. Expected an IPv4 address '. + 'like "%s", or an IPv6 address like "%s".', + $in, + '23.45.67.89', + '2345:6789:0123:abcd::')); + } + +} diff --git a/src/ip/PhutilIPv4Address.php b/src/ip/PhutilIPv4Address.php new file mode 100644 --- /dev/null +++ b/src/ip/PhutilIPv4Address.php @@ -0,0 +1,86 @@ + + } + + public function getAddress() { + return $this->ip; + } + + public function getBitCount() { + return 32; + } + + protected static function newFromString($str) { + $matches = null; + $ok = preg_match('(^(\d+)\.(\d+)\.(\d+).(\d+)\z)', $str, $matches); + if (!$ok) { + throw new Exception( + pht( + 'IP address "%s" is not properly formatted. Expected an IPv4 '. + 'address like "%s".', + $str, + '23.45.67.89')); + } + + $parts = array_slice($matches, 1); + foreach ($parts as $part) { + if (preg_match('/^0\d/', $part)) { + throw new Exception( + pht( + 'IP address "%s" is not properly formatted. Address segments '. + 'should have no leading zeroes, but segment "%s" has a leading '. + 'zero.', + $str, + $part)); + } + + $value = (int)$part; + if ($value < 0 || $value > 255) { + throw new Exception( + pht( + 'IP address "%s" is not properly formatted. Address segments '. + 'should be between 0 and 255, inclusive, but segment "%s" has '. + 'a value outside of this range.', + $str, + $part)); + } + } + + $obj = new self(); + $obj->ip = $str; + + return $obj; + } + + public function toBits() { + if ($this->bits === null) { + $bits = ''; + foreach (explode('.', $this->ip) as $part) { + $value = (int)$part; + for ($ii = 7; $ii >= 0; $ii--) { + $mask = (1 << $ii); + if (($value & $mask) === $mask) { + $bits .= '1'; + } else { + $bits .= '0'; + } + } + } + + $this->bits = $bits; + } + + return $this->bits; + } + +} diff --git a/src/ip/PhutilIPv6Address.php b/src/ip/PhutilIPv6Address.php new file mode 100644 --- /dev/null +++ b/src/ip/PhutilIPv6Address.php @@ -0,0 +1,212 @@ + + } + + public function getBitCount() { + return 128; + } + + protected static function newFromString($str) { + $parts = explode(':', $str); + if (count($parts) > 8) { + throw new Exception( + pht( + 'IP address "%s" is not properly formatted: is has too many '. + 'parts. Expected a maximum of 7 colons, like "%s".', + $str, + '1:2:3:4:a:b:c:d')); + } + + if (count($parts) < 3) { + throw new Exception( + pht( + 'IP address "%s" is not properly formated: it has too few '. + 'parts. Expected a minimum of 2 colons, like "%s".', + $str, + '::1')); + } + + // Look for leading or trailing empty parts. These are valid if the string + // begins or ends like "::", "::1", or "1::", but not valid otherwise. + $has_omission = false; + if ($str === '::') { + $parts = array(null); + $has_omission = true; + } else if ($parts[0] === '') { + if ($parts[1] === '') { + unset($parts[1]); + $parts[0] = null; + $parts = array_values($parts); + $has_omission = true; + } else { + throw new Exception( + pht( + 'IP address "%s" is not properly formatted: an address with '. + 'omitted leading sements must begin with "::".', + $str)); + } + } else if (last($parts) === '') { + if ($parts[count($parts) - 2] === '') { + array_pop($parts); + $parts[count($parts) - 1] = null; + $parts = array_values($parts); + $has_omission = true; + } else { + throw new Exception( + pht( + 'IP address "%s" is not properly formatted: an address with '. + 'omitted trailing segments must end with "::".', + $str)); + } + } + + foreach ($parts as $idx => $part) { + if ($part !== '') { + continue; + } + + if ($has_omission) { + throw new Exception( + pht( + 'IP address "%s" is not properly formatted: an address may '. + 'only contain a maximum of one subsequence omitted with "::".', + $str)); + } + + $has_omission = true; + $parts[$idx] = null; + } + + if (!$has_omission) { + if (count($parts) !== 8) { + throw new Exception( + pht( + 'IP address "%s" is not properly formatted: an address must '. + 'contain exactly 8 segments, or omit a subsequence of segments '. + 'with "::".', + $str)); + } + } + + $values = array(); + foreach ($parts as $idx => $part) { + // This is a "::" segment, so fill in any missing values with 0. + if ($part === null) { + for ($ii = count($parts); $ii <= 8; $ii++) { + $values[] = 0; + } + continue; + } + + if (!preg_match('/^[0-9a-fA-F]{1,4}\z/', $part)) { + throw new Exception( + pht( + 'IP address "%s" is not properly formatted: the segments of '. + 'an address must be hexadecimal values between "0000" and "ffff", '. + 'inclusive. Segment "%s" is not.', + $str, + $part)); + } + + $values[] = (int)hexdec($part); + } + + $obj = new self(); + $obj->values = $values; + + return $obj; + } + + public function getAddress() { + if ($this->displayAddress === null) { + // Find the longest consecutive sequence of "0" values. We want to + // collapse this into "::". + $longest_run = 0; + $longest_index = 0; + $current_run = null; + $current_index = null; + foreach ($this->values as $idx => $value) { + if ($value !== 0) { + $current_run = null; + continue; + } + + if ($current_run === null) { + $current_run = 1; + $current_index = $idx; + } else { + $current_run++; + } + + if ($current_run > $longest_run) { + $longest_run = $current_run; + $longest_index = $current_index; + } + } + + // Render the segments of the IPv6 address, omitting the longest run + // of consecutive "0" segments. + $pieces = array(); + for ($idx = 0; $idx < count($this->values); $idx++) { + $value = $this->values[$idx]; + + if ($idx === $longest_index) { + if ($longest_run > 1) { + $pieces[] = null; + $idx += ($longest_run - 1); + continue; + } + } + + $pieces[] = dechex($value); + } + + // If the omitted segment is at the beginning or end of the address, add + // an extra piece so we get the leading or trailing "::" when we implode + // the pieces. + if (head($pieces) === null) { + array_unshift($pieces, null); + } + + if (last($pieces) === null) { + $pieces[] = null; + } + + $this->displayAddress = implode(':', $pieces); + } + + return $this->displayAddress; + } + + public function toBits() { + if ($this->bits === null) { + $bits = ''; + foreach ($this->values as $value) { + for ($ii = 15; $ii >= 0; $ii--) { + $mask = (1 << $ii); + if (($value & $mask) === $mask) { + $bits .= '1'; + } else { + $bits .= '0'; + } + } + } + + $this->bits = $bits; + } + + return $this->bits; + } + +} diff --git a/src/ip/__tests__/PhutilIPAddressTestCase.php b/src/ip/__tests__/PhutilIPAddressTestCase.php new file mode 100644 --- /dev/null +++ b/src/ip/__tests__/PhutilIPAddressTestCase.php @@ -0,0 +1,339 @@ + true, + + // No nonsense. + '1.2.3' => false, + 'duck' => false, + '' => false, + '1 2 3 4' => false, + '.' => false, + '1.2.3.4.' => false, + '1..3.4' => false, + + // No leading zeroes. + '0.0.0.0' => true, + '0.0.0.01' => false, + + // No segments > 255. + '255.255.255.255' => true, + '255.255.255.256' => false, + ); + + foreach ($cases as $input => $expect) { + $caught = null; + try { + PhutilIPAddress::newAddress($input); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertEqual( + $expect, + !($caught instanceof Exception), + 'PhutilIPv4Address['.$input.']'); + } + } + + public function testValidIPv6Addresses() { + $cases = array( + '::' => true, + '::1' => true, + '1::' => true, + '1::1' => true, + '1:2:3:4:5:6:7:8' => true, + '1:2:3::5:6:7:8' => true, + '1:2:3::6:7:8' => true, + + // No nonsense. + 'quack:duck' => false, + '11111:22222::' => false, + + + // Too long. + '1:2:3:4:5:6:7:8:9' => false, + + // Too short. + '1:2:3' => false, + + // Too many omitted segments. + '1:2:3:::7:8:9' => false, + '1::3::7:8:9' => false, + ); + + foreach ($cases as $input => $expect) { + $caught = null; + try { + PhutilIPAddress::newAddress($input); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertEqual( + $expect, + !($caught instanceof Exception), + 'PhutilIPv6Address['.$input.']'); + } + } + + public function testIPv4AddressToBits() { + $cases = array( + '0.0.0.0' => '00000000000000000000000000000000', + '255.255.255.255' => '11111111111111111111111111111111', + '255.0.0.0' => '11111111000000000000000000000000', + '0.0.0.1' => '00000000000000000000000000000001', + '0.0.0.2' => '00000000000000000000000000000010', + '0.0.0.3' => '00000000000000000000000000000011', + ); + + foreach ($cases as $input => $expect) { + $actual = PhutilIPAddress::newAddress($input)->toBits(); + $this->assertEqual( + $expect, + $actual, + 'PhutilIPv4Address['.$input.']->toBits()'); + } + } + + public function testIPv6AddressToBits() { + $cases = array( + '::' => + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000000', + '::1' => + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000001', + '1::' => + '0000000000000001 0000000000000000'. + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000000', + '::ffff:c000:0280' => + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000000'. + '0000000000000000 1111111111111111'. + PhutilIPAddress::newAddress('192.0.2.128')->toBits(), + '21DA:00D3:0000:2F3B:02AA:00FF:FE28:9C5A' => + '0010000111011010 0000000011010011'. + '0000000000000000 0010111100111011'. + '0000001010101010 0000000011111111'. + '1111111000101000 1001110001011010', + '2001:db8::1' => + '0010000000000001 0000110110111000'. + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000000'. + '0000000000000000 0000000000000001', + + ); + + foreach ($cases as $input => $expect) { + // Remove any spaces, these are just to make the tests above easier to + // read. + $expect = str_replace(' ', '', $expect); + + $actual = PhutilIPAddress::newAddress($input)->toBits(); + $this->assertEqual( + $expect, + $actual, + 'PhutilIPv6Address['.$input.']->toBits()'); + } + } + + public function testIPv6AddressToAddress() { + $cases = array( + '::' => '::', + '::1' => '::1', + '::01' => '::1', + '0::0001' => '::1', + '0000::0001' => '::1', + '0000:0000::001' => '::1', + + '1::' => '1::', + '01::' => '1::', + '01::0' => '1::', + '0001::0000' => '1::', + + '1:0::0:2' => '1::2', + '1::0:2' => '1::2', + '1:0::2' => '1::2', + + 'CAFE::' => 'cafe::', + '0000:aBe:0:0:1::' => '0:abe:0:0:1::', + + '1:0:0:0:2:0:0:0' => '1::2:0:0:0', + '1:0:0:2:0:0:0:0' => '1:0:0:2::', + ); + + foreach ($cases as $input => $expect) { + $actual = PhutilIPAddress::newAddress($input)->getAddress(); + $this->assertEqual( + $expect, + $actual, + 'PhutilIPv6Address['.$input.']->getAddress()'); + } + } + + public function testValidIPv4CIDRBlocks() { + $cases = array( + // Valid block. + '1.0.0.0/16' => true, + + // No nonsense. + 'duck' => false, + '1/2/3' => false, + '23/0.0.0.0' => false, + '0.0.0.0/0.0.0.0' => false, + + // No leading zeroes. + '1.0.0.0/4' => true, + '1.0.0.0/04' => false, + + // No out-of-range masks. + '1.0.0.0/32' => true, + '1.0.0.0/33' => false, + ); + + foreach ($cases as $input => $expect) { + $caught = null; + try { + PhutilCIDRBlock::newBlock($input); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertEqual( + $expect, + !($caught instanceof Exception), + 'PhutilCIDRBlock['.$input.']'); + } + } + + public function testValidIPv6CIDRBlocks() { + $cases = array( + // Valid block. + '::/16' => true, + '::/128' => true, + + // No nonsense. + '::/1/2' => false, + '::/::' => false, + '::' => false, + + // No leading zeroes. + '::/01' => false, + + // No out-of-range masks. + '::/129' => false, + ); + + foreach ($cases as $input => $expect) { + $caught = null; + try { + PhutilCIDRBlock::newBlock($input); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertEqual( + $expect, + !($caught instanceof Exception), + 'PhutilCIDRBlock['.$input.']'); + } + } + + public function testIPv4CIDRBlockContains() { + $cases = array( + '0.0.0.0/0' => array( + '0.0.0.0' => true, + '1.1.1.1' => true, + '2.3.4.5' => true, + '::' => false, + '::1' => false, + '::ffff:0:0' => false, + ), + '0.0.0.2/32' => array( + '0.0.0.1' => false, + '0.0.0.2' => true, + '0.0.0.3' => false, + '::' => false, + ), + '172.30.0.0/16' => array( + '172.29.255.255' => false, + '172.30.0.0' => true, + '172.30.255.255' => true, + '172.31.0.0' => false, + '::' => false, + ), + ); + + foreach ($cases as $input_block => $tests) { + $block = PhutilCIDRBlock::newBlock($input_block); + foreach ($tests as $input => $expect) { + $this->assertEqual( + $expect, + $block->containsAddress($input), + 'PhutilCIDRBlock['.$input_block.']->containsAddress('.$input.')'); + } + } + } + + public function testIPv6CIDRBlockContains() { + $cases = array( + '::/0' => array( + '1::' => true, + '2::' => true, + '127.0.0.1' => false, + ), + '::ffff:0:0/96' => array( + '::ffff:0:0' => true, + '::ffff:ffff:ffff' => true, + '::fffe:0:0' => false, + '127.0.0.1' => false, + ), + ); + + foreach ($cases as $input_block => $tests) { + $block = PhutilCIDRBlock::newBlock($input_block); + foreach ($tests as $input => $expect) { + $this->assertEqual( + $expect, + $block->containsAddress($input), + 'PhutilCIDRBlock['.$input_block.']->containsAddress('.$input.')'); + } + } + } + + public function testCIDRList() { + $list = array( + '172.30.0.0/16', + '127.0.0.3/32', + ); + + $cases = array( + '0.0.0.0' => false, + '172.30.0.5' => true, + '127.0.0.2' => false, + '127.0.0.3' => true, + ); + + $list = PhutilCIDRList::newList($list); + + foreach ($cases as $input => $expect) { + $this->assertEqual( + $expect, + $list->containsAddress($input), + 'PhutilCIDRList->containsAddress('.$input.')'); + } + } + + +} diff --git a/src/lexer/PhutilJSONFragmentLexer.php b/src/lexer/PhutilJSONFragmentLexer.php new file mode 100644 --- /dev/null +++ b/src/lexer/PhutilJSONFragmentLexer.php @@ -0,0 +1,27 @@ + array( + array('"', 's', 'double-quoted-string'), + array('\s+', null), + array('[\\[\\]{},:]', 'o'), + array('(?:true|false|null)', 'k'), + array('-?\d+(\.\d+([eE][-+]?\d+)?)?', 'mf'), + array('.', null), + ), + 'double-quoted-string' => array( + array('[^"\\\\]+', 's'), + array('"', 's', '!pop'), + array('\\\\u[0-9a-fA-F]{4}', 'k'), + array('\\\\.', 'k'), + ), + ); + } + +} diff --git a/src/lexer/PhutilJavaFragmentLexer.php b/src/lexer/PhutilJavaFragmentLexer.php new file mode 100644 --- /dev/null +++ b/src/lexer/PhutilJavaFragmentLexer.php @@ -0,0 +1,120 @@ + array_merge( + $nonsemantic_rules, + array( + array('('.implode('|', $keywords).')\\b', 'k'), + array('@[^\\W\\d][\\w.]*', 'nd'), + array('('.implode('|', $declarations).')\\b', 'k'), + array('('.implode('|', $types).')\\b', 't'), + array('(package|import\\s+static|import)\\b', 'kn', 'import'), + array('('.implode('|', $constants).')\\b', 'kc'), + array('(class|interface)\\b', 'kd', 'class'), + array('"(\\\\\\\\|\\\\"|[^"\\\\]+)*"', 's'), + array("'(\\\\.|[^\\\\]|\\\\u[0-9a-f-A-F]{4})'", 's'), + array('([^\\W\\d]|\\$)[\\w$]*:', 'nl'), + array('([^\\W\\d]|\\$)[\\w$]*', 'n'), + array( + '(([0-9][0-9_]*\\.([0-9][0-9_]*)?|'. + '\\.[0-9][0-9_]*)([eE][+-]?[0-9][0-9_]*)?[fFdD]?|'. + '[0-9][eE][+-]?[0-9][0-9_]*[fFdD]?|'. + '[0-9]([eE][+-]?[0-9][0-9_]*)?[fFdD]|'. + '0[xX]([0-9a-fA-F][0-9a-fA-F_]*\\.?|'. + '([0-9a-fA-F][0-9a-fA-F_]*)?\\.[0-9a-fA-F][0-9a-fA-F_]*)'. + '[pP][+-]?[0-9][0-9_]*[fFdD]?)', + 'mf', + ), + array('0[xX][0-9a-fA-F][0-9a-fA-F_]*[lL]?', 'mh'), + array('0[bB][01][01_]*[lL]?', 'mb'), + array('0[0-7_]+[lL]?', 'mo'), + array('(0|[1-9][0-9_]*[lL]?)', 'mi'), + array('([~^*!%&\\[\\](){}<>|+=:;,./?-])', 'o'), + array('(\S+|\s+)', null), + )), + 'class' => array_merge( + $nonsemantic_rules, + array( + array('([^\W\d]|\$)[\w$]*', 'nc', '!pop'), + array('', null, '!pop'), + )), + 'import' => array_merge( + $nonsemantic_rules, + array( + array('[\w.]+\*?', 'nn', '!pop'), + array('', null, '!pop'), + )), + ); + } + +} diff --git a/src/lexer/PhutilLexer.php b/src/lexer/PhutilLexer.php new file mode 100644 --- /dev/null +++ b/src/lexer/PhutilLexer.php @@ -0,0 +1,362 @@ + array(...), + * 'state1' => array(...), + * 'state2' => array(...), + * ) + * + * Lexers start at the state named 'start'. Each state should have a list of + * rules which can match in that state. A list of rules looks like this: + * + * array( + * array('\s+', 'space'), + * array('\d+', 'digit'), + * array('\w+', 'word'), + * ) + * + * The lexer operates by processing each rule in the current state in order. + * When one matches, it produces a token. For example, the lexer above would + * lex this text: + * + * 3 asdf + * + * ...to produce these tokens (assuming the rules are for the 'start' state): + * + * array('digit', '3', null), + * array('space', ' ', null), + * array('word', 'asdf', null), + * + * A rule can also cause a state transition: + * + * array('zebra', 'animal', 'saw_zebra'), + * + * This would match the text "zebra", emit a token of type "animal", and change + * the parser state to "saw_zebra", causing the lexer to start using the rules + * from that state. + * + * To pop the lexer's state, you can use the special state '!pop'. + * + * Finally, you can provide additional options in the fourth parameter. + * Supported options are `case-insensitive` and `context`. + * + * Possible values for `context` are `push` (push the token value onto the + * context stack), `pop` (pop the context stack and use it to provide context + * for the token), and `discard` (pop the context stack and throw away the + * value). + * + * For example, to lex text like this: + * + * Class::CONSTANT + * + * You can use a rule set like this: + * + * 'start' => array( + * array('\w+(?=::)', 'class', 'saw_class', array('context' => 'push')), + * ), + * 'saw_class' => array( + * array('::', 'operator'), + * array('\w+', 'constant, '!pop', array('context' => 'pop')), + * ), + * + * This would parse the above text into this token stream: + * + * array('class', 'Class', null), + * array('operator', '::', null), + * array('constant', 'CONSTANT', 'Class'), + * + * For a concrete implementation, see @{class:PhutilPHPFragmentLexer}. + * + * @task lexerimpl Lexer Implementation + * @task rule Lexer Rules + * @task tokens Lexer Tokens + */ +abstract class PhutilLexer extends Phobject { + + private $processedRules; + private $lastState; + + +/* -( Lexer Rules )-------------------------------------------------------- */ + + + /** + * Return a set of rules for this lexer. See description in + * @{class:PhutilLexer}. + * + * @return dict Lexer rules. + * @task lexerimpl + */ + abstract protected function getRawRules(); + + +/* -( Lexer Rules )-------------------------------------------------------- */ + + + /** + * Process, normalize, and validate the raw lexer rules. + * + * @task rule + */ + protected function getRules() { + $class = get_class($this); + + $raw_rules = $this->getRawRules(); + + if (!is_array($raw_rules)) { + $type = gettype($raw_rules); + throw new UnexpectedValueException( + pht( + 'Expected %s to return array, got %s.', + $class.'->getRawRules()', + $type)); + } + + if (empty($raw_rules['start'])) { + throw new UnexpectedValueException( + pht( + "Expected %s rules to define rules for state '%s'.", + $class, + 'start')); + } + + $processed_rules = array(); + foreach ($raw_rules as $state => $rules) { + + if (!is_array($rules)) { + $type = gettype($rules); + throw new UnexpectedValueException( + pht( + "Expected list of rules for state '%s' in %s, got %s.", + $state, + $class, + $type)); + } + + foreach ($rules as $key => $rule) { + $n = count($rule); + if ($n < 2 || $n > 4) { + throw new UnexpectedValueException( + pht( + "Expected rule '%s' in state '%s' in %s to have 2-4 elements ". + "(regex, token, [next state], [options]), got %d.", + $key, + $state, + $class, + $n)); + } + $rule = array_values($rule); + if (count($rule) == 2) { + $rule[] = null; + } + if (count($rule) == 3) { + $rule[] = array(); + } + + foreach ($rule[3] as $option => $value) { + switch ($option) { + case 'context': + if ($value !== 'push' && + $value !== 'pop' && + $value !== 'discard' && + $value !== null) { + throw new UnexpectedValueException( + pht( + "Rule '%s' in state '%s' in %s has unknown ". + "context rule '%s', expected '%s', '%s' or '%s'.", + $key, + $state, + $class, + $value, + 'push', + 'pop', + 'discard')); + } + break; + default: + throw new UnexpectedValueException( + pht( + "Rule '%s' in state '%s' in %s has unknown option '%s'.", + $key, + $state, + $class, + $option)); + } + } + + $flags = 'sS'; + + // NOTE: The "\G" assertion is an offset-aware version of "^". + $rule[0] = '(\\G'.$rule[0].')'.$flags; + + if (@preg_match($rule[0], '') === false) { + $error = error_get_last(); + throw new UnexpectedValueException( + pht( + "Rule '%s' in state '%s' in %s defines an ". + "invalid regular expression ('%s'): %s", + $key, + $state, + $class, + $rule[0], + idx($error, 'message'))); + } + + $next_state = $rule[2]; + if ($next_state !== null && $next_state !== '!pop') { + if (empty($raw_rules[$next_state])) { + throw new UnexpectedValueException( + pht( + "Rule '%s' in state '%s' in %s transitions to ". + "state '%s', but there are no rules for that state.", + $key, + $state, + $class, + $next_state)); + } + } + + $processed_rules[$state][] = $rule; + } + } + + return $processed_rules; + } + + +/* -( Lexer Tokens )------------------------------------------------------- */ + + + /** + * Lex an input string into tokens. + * + * @param string Input string. + * @param string Initial lexer state. + * @return list List of lexer tokens. + * @task tokens + */ + public function getTokens($input, $initial_state = 'start') { + if (empty($this->processedRules)) { + $this->processedRules = $this->getRules(); + } + $rules = $this->processedRules; + + $this->lastState = null; + + $position = 0; + $length = strlen($input); + + $tokens = array(); + $states = array(); + $states[] = 'start'; + if ($initial_state != 'start') { + $states[] = $initial_state; + } + $context = array(); + while ($position < $length) { + $state_rules = idx($rules, end($states), array()); + foreach ($state_rules as $rule) { + + $matches = null; + if (!preg_match($rule[0], $input, $matches, 0, $position)) { + continue; + } + + list($regexp, $token_type, $next_state, $options) = $rule; + + $match_length = strlen($matches[0]); + if (!$match_length) { + if ($next_state === null) { + throw new UnexpectedValueException( + pht( + "Rule '%s' matched a zero-length token and causes no ". + "state transition.", + $regexp)); + } + } else { + $position += $match_length; + $token = array($token_type, $matches[0]); + + $copt = idx($options, 'context'); + if ($copt == 'push') { + $context[] = $matches[0]; + $token[] = null; + } else if ($copt == 'pop') { + if (empty($context)) { + throw new UnexpectedValueException( + pht("Rule '%s' popped empty context!", $regexp)); + } + $token[] = array_pop($context); + } else if ($copt == 'discard') { + if (empty($context)) { + throw new UnexpectedValueException( + pht("Rule '%s' discarded empty context!", $regexp)); + } + array_pop($context); + $token[] = null; + } else { + $token[] = null; + } + + $tokens[] = $token; + } + + if ($next_state !== null) { + if ($next_state == '!pop') { + array_pop($states); + if (empty($states)) { + throw new UnexpectedValueException( + pht("Rule '%s' popped off the last state.", $regexp)); + } + } else { + $states[] = $next_state; + } + } + + continue 2; + } + + throw new UnexpectedValueException( + pht('No lexer rule matched input at char %d.', $position)); + } + + $this->lastState = $states; + + return $tokens; + } + + + /** + * Merge adjacent tokens of the same type. For example, if a comment is + * tokenized as <"//", "comment">, this method will merge the two tokens into + * a single combined token. + */ + public function mergeTokens(array $tokens) { + $last = null; + $result = array(); + foreach ($tokens as $token) { + if ($last === null) { + $last = $token; + continue; + } + if (($token[0] == $last[0]) && ($token[2] == $last[2])) { + $last[1] .= $token[1]; + } else { + $result[] = $last; + $last = $token; + } + } + if ($last !== null) { + $result[] = $last; + } + return $result; + } + + public function getLexerState() { + return $this->lastState; + } + +} diff --git a/src/lexer/PhutilPHPFragmentLexer.php b/src/lexer/PhutilPHPFragmentLexer.php new file mode 100644 --- /dev/null +++ b/src/lexer/PhutilPHPFragmentLexer.php @@ -0,0 +1,281 @@ + array( + array('<\\?(?i:php)?', 'cp', 'php'), + array('[^<]+', null), + array('<', null), + ), + + 'php' => array_merge(array( + array('\\?>', 'cp', '!pop'), + array( + '<<<([\'"]?)('.$identifier_pattern.')\\1\\n.*?\\n\\2\\;?\\n', + 's', + ), + ), $nonsemantic_rules, array( + array('(?i:__halt_compiler)\\b', 'cp', 'halt_compiler'), + array('(->|::)', 'o', 'attr'), + array('[~!%^&*+=|:.<>/?@-]+', 'o'), + array('[\\[\\]{}();,]', 'o'), + + // After 'new', try to match an unadorned symbol. + array('(?i:new|instanceof)\\b', 'k', 'possible_classname'), + array('(?i:function)\\b', 'k', 'function_definition'), + + // After 'extends' or 'implements', match a list of classes/interfaces. + array('(?i:extends|implements)\\b', 'k', 'class_list'), + + array('(?i:catch)\\b', 'k', 'catch'), + + array('(?i:'.implode('|', $keywords).')\\b', 'k'), + array('(?i:'.implode('|', $constants).')\\b', 'kc'), + + array('\\$+'.$identifier_pattern, 'nv'), + + // Match "f(" as a function and "C::" as a class. These won't work + // if you put a comment between the symbol and the operator, but + // that's a bizarre usage. + array($identifier_ns_pattern.'(?=\s*[\\(])', 'nf'), + array( + $identifier_ns_pattern.'(?=\s*::)', + 'nc', + 'context_attr', + array( + 'context' => 'push', + ), + ), + + array($identifier_ns_pattern, 'no'), + array('(\\d+\\.\\d*|\\d*\\.\\d+)([eE][+-]?[0-9]+)?', 'mf'), + array('\\d+[eE][+-]?[0-9]+', 'mf'), + array('0[0-7]+', 'mo'), + array('0[xX][a-fA-F0-9]+', 'mh'), + array('0[bB][0-1]+', 'm'), + array('\d+', 'mi'), + array("'", 's1', 'string1'), + array('`', 'sb', 'stringb'), + array('"', 's2', 'string2'), + array('.', null), + )), + + // We've just matched a class name, with a "::" lookahead. The name of + // the class is on the top of the context stack. We want to try to match + // the attribute or method (e.g., "X::C" or "X::f()"). + 'context_attr' => array_merge($nonsemantic_rules, array( + array('::', 'o'), + array( + $identifier_pattern.'(?=\s*[\\(])', + 'nf', + '!pop', + array( + 'context' => 'pop', + ), + ), + array( + $identifier_pattern, + 'na', + '!pop', + array( + 'context' => 'pop', + ), + ), + array( + '', + null, + '!pop', + array( + 'context' => 'discard', + ), + ), + )), + + // After '->' or '::', a symbol is an attribute name. Note that we end + // up in 'context_attr' instead of here in some cases. + 'attr' => array_merge($nonsemantic_rules, array( + array($identifier_pattern, 'na', '!pop'), + array('', null, '!pop'), + )), + + // After 'new', a symbol is a class name. + 'possible_classname' => array_merge($nonsemantic_rules, array( + array($identifier_ns_pattern, 'nc', '!pop'), + array('', null, '!pop'), + )), + + 'string1' => array( + array('[^\'\\\\]+', 's1'), + array("'", 's1', '!pop'), + array('\\\\.', 'k'), + array('\\\\$', 'k'), + ), + + 'stringb' => array( + array('[^`\\\\]+', 'sb'), + array('`', 'sb', '!pop'), + array('\\\\.', 'k'), + array('\\\\$', 'k'), + ), + + 'string2' => array( + array('[^"\\\\]+', 's2'), + array('"', 's2', '!pop'), + array('\\\\.', 'k'), + array('\\\\$', 'k'), + ), + + // In a function definition (after "function"), we don't link the name + // as a "nf" (name.function) since it is its own definition. + 'function_definition' => array_merge($nonsemantic_rules, array( + array('&', 'o'), + array('\\(', 'o', '!pop'), + array($identifier_pattern, 'no', '!pop'), + array('', null, '!pop'), + )), + + // For "//" and "#" comments, we need to break out if we see "?" followed + // by ">". + 'line_comment' => array( + array('[^?\\n]+', 'c'), + array('\\n', null, '!pop'), + array('(?=\\?>)', null, '!pop'), + array('\\?', 'c'), + ), + + // We've seen __halt_compiler. Grab the '();' afterward and then eat + // the rest of the file as raw data. + 'halt_compiler' => array_merge($nonsemantic_rules, array( + array('[()]', 'o'), + + array(';', 'o', 'compiler_halted'), + array('\\?>', 'o', 'compiler_halted'), + + // Just halt on anything else. + array('', null, 'compiler_halted'), + )), + + // __halt_compiler has taken effect. + 'compiler_halted' => array( + array('.+', null), + ), + + 'class_list' => array_merge($nonsemantic_rules, array( + array(',', 'o'), + array('(?i:implements)', 'k'), + array($identifier_ns_pattern, 'nc'), + array('', null, '!pop'), + )), + + 'catch' => array_merge($nonsemantic_rules, array( + array('\\(', 'o'), + array($identifier_ns_pattern, 'nc'), + array('', null, '!pop'), + )), + ); + } + +} diff --git a/src/lexer/PhutilPythonFragmentLexer.php b/src/lexer/PhutilPythonFragmentLexer.php new file mode 100644 --- /dev/null +++ b/src/lexer/PhutilPythonFragmentLexer.php @@ -0,0 +1,314 @@ + array_merge(array( + array('\\n', null), + // TODO: Docstrings should match only at the start of a line + array('""".*?"""', 'sd'), + array('\'\'\'.*?\'\'\'', 'sd'), + ), $nonsemantic_rules, array( + array('[]{}:(),;[]', 'p'), + array('\\\\\\n', null), + array('\\\\', null), + array('(?:in|is|and|or|not)\\b', 'ow'), + array('(?:!=|==|<<|>>|[-~+/*%=<>&^|.])', 'o'), + array('(?:'.implode('|', $keywords).')\\b', 'k'), + array('def(?=\\s)', 'k', 'funcname'), + array('class(?=\\s)', 'k', 'classname'), + array('from(?=\\s)', 'kn', 'fromimport'), + array('import(?=\\s)', 'kn', 'import'), + array('(? array_merge($nonsemantic_rules, array( + array('[a-zA-Z_]\w*', 'nf', '!pop'), + array('', null, '!pop'), + )), + + 'classname' => array_merge($nonsemantic_rules, array( + array('[a-zA-Z_]\w*', 'nc', '!pop'), + array('', null, '!pop'), + )), + + 'fromimport' => array_merge($nonsemantic_rules, array( + array('import\b', 'kn', '!pop'), + // if None occurs here, it's "raise x from None", since None can + // never be a module name + array('None\b', 'bp', '!pop'), + // sadly, in "raise x from y" y will be highlighted as namespace too + array('[a-zA-Z_.][\w.]*', 'nn'), + array('', null, '!pop'), + )), + + 'import' => array_merge($nonsemantic_rules, array( + array('as\b', 'kn'), + array(',', 'o'), + array('[a-zA-Z_.][\w.]*', 'nn'), + array('', null, '!pop'), + )), + + 'dqs_raw' => $dqs, + 'sqs_raw' => $sqs, + 'dqs' => array_merge($stringescape, $dqs), + 'sqs' => array_merge($stringescape, $sqs), + 'tdqs_raw' => $tdqs, + 'tsqs_raw' => $tsqs, + 'tdqs' => array_merge($stringescape, $tdqs), + 'tsqs' => array_merge($stringescape, $tsqs), + ); + } + +} diff --git a/src/lexer/PhutilShellLexer.php b/src/lexer/PhutilShellLexer.php new file mode 100644 --- /dev/null +++ b/src/lexer/PhutilShellLexer.php @@ -0,0 +1,86 @@ +getTokens($string); + if (count($this->getLexerState()) > 1) { + throw new UnexpectedValueException( + pht('Unterminated string in argument list!')); + } + + foreach ($tokens as $key => $token) { + switch ($token[0]) { + case "'": + case '"': + unset($tokens[$key]); + break; + case 'esc': + $tokens[$key][0] = 'arg'; + $tokens[$key][1] = substr($token[1], 1); + break; + default: + break; + } + } + + $tokens = $this->mergeTokens(array_values($tokens)); + + $argv = array(); + foreach ($tokens as $token) { + if ($token[0] == 'arg') { + $argv[] = $token[1]; + } + } + + return $argv; + } + + protected function getRawRules() { + return array( + 'start' => array( + array('\s+', ' '), + array("'", "'", 'string1'), + array('"', '"', 'string2'), + array('\\\\.', 'esc'), + array('[^\\s\'"\\\\]+', 'arg'), + ), + 'string1' => array( + // NOTE: In a single-quoted string, backslash is not an escape. + array('[^\']+', 'arg'), + array("'", "'", '!pop'), + ), + 'string2' => array( + // NOTE: In a double-quoted string, backslash IS an escape, but only + // for some characters: ", $, `, \ and newline. + array('[^"\\\\]+', 'arg'), + array('"', '"', '!pop'), + array('\\\\["$`\\\\\\n]', 'esc'), + array('\\\\.', 'arg'), + ), + ); + } + +} diff --git a/src/lexer/PhutilSimpleOptionsLexer.php b/src/lexer/PhutilSimpleOptionsLexer.php new file mode 100644 --- /dev/null +++ b/src/lexer/PhutilSimpleOptionsLexer.php @@ -0,0 +1,90 @@ +getTokens($input); + + foreach ($tokens as $key => $token) { + list($type, $value) = $token; + switch ($type) { + case 'esc': + $tokens[$key][0] = 'word'; + $tokens[$key][1] = substr($value, 1); + break; + } + } + + $tokens = $this->mergeTokens($tokens); + + // Find spaces in between two words and turn them into words. This allows + // us to parse unescaped spaces in values correctly. + for ($ii = 0; $ii < count($tokens); $ii++) { + list($type, $value) = $tokens[$ii]; + if ($type != ' ') { + continue; + } + $last = idx($tokens, $ii - 1); + if (!$last) { + continue; + } + $next = idx($tokens, $ii + 1); + if (!$next) { + continue; + } + if ($last[0] == 'word' && $next[0] == 'word') { + $tokens[$ii][0] = 'word'; + } + } + + // NOTE: Strip these only after merging tokens, so "a b" merges into two + // words, "a" and "b", not a single "ab" word. + foreach ($tokens as $key => $token) { + list($type, $value) = $token; + switch ($type) { + case "'": + case '"': + case ' ': + unset($tokens[$key]); + break; + } + } + + return array_values($tokens); + } + + protected function getRawRules() { + return array( + 'start' => array( + array('\s+', ' '), + array("'", "'", 'string1'), + array('"', '"', 'string2'), + array(',', ','), + array('=', '='), + array('[^\\s\'"=,]+', 'word'), + ), + 'string1' => array( + array('[^\'\\\\]+', 'word'), + array("'", "'", '!pop'), + array('\\\\.', 'esc'), + array('\\\\$', '!pop'), + ), + 'string2' => array( + array('[^"\\\\]+', 'word'), + array('"', '"', '!pop'), + array('\\\\.', 'esc'), + array('\\\\$', '!pop'), + ), + ); + } + +} diff --git a/src/lexer/PhutilTypeLexer.php b/src/lexer/PhutilTypeLexer.php new file mode 100644 --- /dev/null +++ b/src/lexer/PhutilTypeLexer.php @@ -0,0 +1,32 @@ + array( + array('\s+', ' '), + array('\\|', '|'), + array('<', '<'), + array('>', '>'), + array(',', ','), + array('\\?', '?'), + array('optional', 'opt'), + array('map', 'map'), + array('list', 'list'), + array('int|float|bool|string|null|callable|wild|regex', 'k'), + array('\\\\?[a-zA-Z_\x7f-\xff]+(\\\\[a-zA-Z_\x7f-\xff]+)*', 'k'), + array('\\(', '(', 'comment'), + ), + 'comment' => array( + array('\\)', ')', '!pop'), + array('[^\\)]+', 'cm'), + ), + ); + } + +} diff --git a/src/lexer/__tests__/PhutilPHPFragmentLexerTestCase.php b/src/lexer/__tests__/PhutilPHPFragmentLexerTestCase.php new file mode 100644 --- /dev/null +++ b/src/lexer/__tests__/PhutilPHPFragmentLexerTestCase.php @@ -0,0 +1,317 @@ +runLexer($file, $data); + } + } + + private function runLexer($file, $data) { + $lexer = new PhutilPHPFragmentLexer(); + + $initial_state = 'start'; + switch ($file) { + case 'pop-from-php.txt': + $initial_state = 'php'; + break; + case 'trailing-backslash-1.txt': + case 'trailing-backslash-2.txt': + case 'trailing-backslash-b.txt': + // It's important these test cases not have trailing newlines. + $data = rtrim($data); + break; + } + + $caught = null; + $tokens = null; + try { + $tokens = $lexer->getTokens($data, $initial_state); + } catch (Exception $ex) { + $caught = $ex; + } + + switch ($file) { + case 'basics.txt': + $this->assertEqual(null, $caught); + $this->assertEqual( + array( + array('cp', 'assertEqual(null, $caught); + $this->assertEqual( + array( + array('cp', 'assertEqual(null, $caught); + $tokens = $lexer->mergeTokens($tokens); + $this->assertEqual( + array( + array('cp', '', null), + array(null, "\n\nd\n", null), + ), + $tokens, + $file); + break; + case 'extendsimplements.txt': + $this->assertEqual(null, $caught); + $this->assertEqual( + array( + array('cp', 'assertEqual(null, $caught); + $this->assertEqual( + array( + array('cp', 'assertEqual(null, $caught); + $this->assertEqual( + array( + array('cp', 'assertEqual(null, $caught); + $this->assertEqual( + array( + array('cp', 'assertEqual(null, $caught); + $this->assertEqual( + array( + array('cp', 'assertEqual(null, $caught); + $this->assertEqual( + array( + array('cp', '?>', null), + array(null, "\n", null), + ), + $tokens, + $file); + break; + case 'trailing-backslash-1.txt': + case 'trailing-backslash-2.txt': + case 'trailing-backslash-b.txt': + $this->assertEqual(null, $caught); + break; + default: + throw new Exception(pht("No assertion block for test '%s'!", $file)); + } + } + + +} diff --git a/src/lexer/__tests__/PhutilShellLexerTestCase.php b/src/lexer/__tests__/PhutilShellLexerTestCase.php new file mode 100644 --- /dev/null +++ b/src/lexer/__tests__/PhutilShellLexerTestCase.php @@ -0,0 +1,208 @@ +runLexer($file, $data); + } + } + + private function runLexer($file, $data) { + $lexer = new PhutilShellLexer(); + + $initial_state = 'start'; + + $caught = null; + $tokens = null; + try { + $tokens = $lexer->getTokens($data, $initial_state); + } catch (Exception $ex) { + $caught = $ex; + } + + $argv = null; + try { + $argv = $lexer->splitArguments($data); + } catch (Exception $ex) { + // Ignore; not diagnostically useful. + } + + switch ($file) { + case 'basic.txt': + $this->assertEqual(null, $caught); + $this->assertEqual( + array( + array('arg', 'arg1', null), + array(' ', ' ', null), + array('arg', 'arg2', null), + array(' ', ' ', null), + array('arg', 'arg3', null), + ), + $tokens, + $file); + $this->assertEqual( + array( + 'arg1', + 'arg2', + 'arg3', + ), + $argv, + $file); + break; + case 'escape.txt': + $this->assertEqual(null, $caught); + $this->assertEqual( + array( + array("'", "'", null), + array('arg', '\\', null), + array("'", "'", null), + array(' ', ' ', null), + array('"', '"', null), + array('esc', '\\"', null), + array('"', '"', null), + ), + $tokens, + $file); + $this->assertEqual( + array( + '\\', + '"', + ), + $argv, + $file); + break; + case 'slashes.txt': + $this->assertEqual(null, $caught); + $this->assertEqual( + array( + array('arg', 'a', null), + array('esc', '\\ ', null), + array('arg', 'b', null), + array(' ', ' ', null), + array("'", "'", null), + array('arg', 'a\\b', null), + array("'", "'", null), + array(' ', ' ', null), + array('"', '"', null), + array('arg', 'a', null), + array('arg', '\\b', null), + array('"', '"', null), + array(' ', ' ', null), + array('"', '"', null), + array('esc', '\\$', null), + array('esc', '\\`', null), + array('esc', '\\\\', null), + array('esc', '\\"', null), + array('esc', '\\'."\n", null), + array('arg', 'xyz', null), + array('"', '"', null), + ), + $tokens, + $file); + $this->assertEqual( + array( + 'a b', + 'a\\b', + 'a\\b', + '$`\\"'."\n".'xyz', + ), + $argv, + $file); + break; + case 'spaces.txt': + $this->assertEqual( + array( + array('arg', 'arg1', null), + array(' ', ' ', null), + array('arg', 'arg2', null), + array(' ', ' ', null), + array('arg', 'arg3', null), + ), + $tokens, + $file); + $this->assertEqual( + array( + 'arg1', + 'arg2', + 'arg3', + ), + $argv, + $file); + break; + case 'strings.txt': + $this->assertEqual(null, $caught); + $this->assertEqual( + array( + array('arg', 'a', null), + array(' ', ' ', null), + array("'", "'", null), + array('arg', 'b', null), + array("'", "'", null), + array(' ', ' ', null), + array('"', '"', null), + array('arg', 'c', null), + array('"', '"', null), + array(' ', ' ', null), + array("'", "'", null), + array('arg', 'd', null), + array("'", "'", null), + array("'", "'", null), + array('arg', 'e', null), + array("'", "'", null), + array(' ', ' ', null), + array('"', '"', null), + array('arg', 'f', null), + array('"', '"', null), + array('"', '"', null), + array('arg', 'g', null), + array('"', '"', null), + array(' ', ' ', null), + array('"', '"', null), + array('arg', 'h', null), + array('"', '"', null), + array('"', '"', null), + array('arg', "'", null), + array('"', '"', null), + array('"', '"', null), + array('arg', 'i', null), + array('"', '"', null), + ), + $tokens, + $file); + $this->assertEqual( + array( + 'a', + 'b', + 'c', + 'de', + 'fg', + 'h\'i', + ), + $argv, + $file); + break; + case 'unterminated.txt': + $this->assertEqual(null, $caught); + $this->assertEqual( + array( + 'start', + 'string1', + ), + $lexer->getLexerState(), + $file); + $this->assertEqual( + null, + $argv, + $file); + break; + default: + throw new Exception(pht("No assertion block for test '%s'!", $file)); + } + } + + +} diff --git a/src/lexer/__tests__/PhutilSimpleOptionsLexerTestCase.php b/src/lexer/__tests__/PhutilSimpleOptionsLexerTestCase.php new file mode 100644 --- /dev/null +++ b/src/lexer/__tests__/PhutilSimpleOptionsLexerTestCase.php @@ -0,0 +1,61 @@ +assertEqual( + array( + array('word', 'legs', null), + array('=', '=', null), + array('word', '4', null), + ), + $this->getTokens('legs=4')); + + $this->assertEqual( + array( + array('word', 'legs', null), + array('=', '=', null), + array('word', '4', null), + array(',', ',', null), + array(' ', ' ', null), + array('word', 'LEGS', null), + array('=', '=', null), + array('word', '4', null), + ), + $this->getTokens('legs=4, LEGS=4')); + } + + public function testSimpleOptionsLexerNiceTokens() { + $this->assertEqual( + array( + array('word', 'legs', null), + ), + $this->getNiceTokens(' legs ')); + + $this->assertEqual( + array( + array('word', 'a', null), + array('word', ' ', null), + array('word', 'b', null), + ), + $this->getNiceTokens(' a b ')); + + $this->assertEqual( + array( + array('word', 'a', null), + array('word', 'b', null), + ), + $this->getNiceTokens('"a""b"')); + } + + private function getTokens($input) { + $lexer = new PhutilSimpleOptionsLexer(); + return $lexer->getTokens($input); + } + + private function getNiceTokens($input) { + $lexer = new PhutilSimpleOptionsLexer(); + return $lexer->getNiceTokens($input); + } + +} diff --git a/src/lexer/__tests__/php/basics.txt b/src/lexer/__tests__/php/basics.txt new file mode 100644 --- /dev/null +++ b/src/lexer/__tests__/php/basics.txt @@ -0,0 +1 @@ + + +d diff --git a/src/lexer/__tests__/php/extendsimplements.txt b/src/lexer/__tests__/php/extendsimplements.txt new file mode 100644 --- /dev/null +++ b/src/lexer/__tests__/php/extendsimplements.txt @@ -0,0 +1,3 @@ + diff --git a/src/lexer/__tests__/php/symbols.txt b/src/lexer/__tests__/php/symbols.txt new file mode 100644 --- /dev/null +++ b/src/lexer/__tests__/php/symbols.txt @@ -0,0 +1,8 @@ +content = (string)$content; + } + + public function __toString() { + return $this->content; + } + + public function getHTMLContent() { + return $this->content; + } + + public function appendHTML($html /* , ... */) { + foreach (func_get_args() as $html) { + $this->content .= phutil_escape_html($html); + } + return $this; + } + + public static function applyFunction($function, $string /* , ... */) { + $args = func_get_args(); + array_shift($args); + $args = array_map('phutil_escape_html', $args); + return new PhutilSafeHTML(call_user_func_array($function, $args)); + } + +// Requires http://pecl.php.net/operator. + + public function __concat($html) { + $clone = clone $this; + return $clone->appendHTML($html); + } + + public function __assign_concat($html) { + return $this->appendHTML($html); + } + +} diff --git a/src/markup/PhutilSafeHTMLProducerInterface.php b/src/markup/PhutilSafeHTMLProducerInterface.php new file mode 100644 --- /dev/null +++ b/src/markup/PhutilSafeHTMLProducerInterface.php @@ -0,0 +1,12 @@ +assertEqual( + (string)phutil_tag('br'), + (string)phutil_tag('br', array())); + + $this->assertEqual( + (string)phutil_tag('br', array()), + (string)phutil_tag('br', array(), null)); + } + + public function testTagEmpty() { + $this->assertEqual( + '
', + (string)phutil_tag('br', array(), null)); + + $this->assertEqual( + '
', + (string)phutil_tag('div', array(), null)); + + $this->assertEqual( + '
', + (string)phutil_tag('div', array(), '')); + } + + public function testTagBasics() { + $this->assertEqual( + '
', + (string)phutil_tag('br')); + + $this->assertEqual( + '
y
', + (string)phutil_tag('div', array(), 'y')); + } + + public function testTagAttributes() { + $this->assertEqual( + '
y
', + (string)phutil_tag('div', array('u' => 'v'), 'y')); + + $this->assertEqual( + '
', + (string)phutil_tag('br', array('u' => 'v'))); + } + + public function testTagEscapes() { + $this->assertEqual( + '
', + (string)phutil_tag('br', array('u' => '<'))); + + $this->assertEqual( + '

', + (string)phutil_tag('div', array(), phutil_tag('br'))); + } + + public function testTagNullAttribute() { + $this->assertEqual( + '
', + (string)phutil_tag('br', array('y' => null))); + } + + public function testTagJavascriptProtocolRejection() { + $hrefs = array( + 'javascript:alert(1)' => true, + 'JAVASCRIPT:alert(2)' => true, + + // NOTE: When interpreted as a URI, this is dropped because of leading + // whitespace. + ' javascript:alert(3)' => array(true, false), + '/' => false, + '/path/to/stuff/' => false, + '' => false, + 'http://example.com/' => false, + '#' => false, + 'javascript://anything' => true, + + // Chrome 33 and IE11, at a minimum, treat this as Javascript. + "javascript\n:alert(4)" => true, + + // Opera currently accepts a variety of unicode spaces. This test case + // has a smattering of them. + "\xE2\x80\x89javascript:" => true, + "javascript\xE2\x80\x89:" => true, + "\xE2\x80\x84javascript:" => true, + "javascript\xE2\x80\x84:" => true, + + // Because we're aggressive, all of unicode should trigger detection + // by default. + "\xE2\x98\x83javascript:" => true, + "javascript\xE2\x98\x83:" => true, + "\xE2\x98\x83javascript\xE2\x98\x83:" => true, + + // We're aggressive about this, so we'll intentionally raise false + // positives in these cases. + 'javascript~:alert(5)' => true, + '!!!javascript!!!!:alert(6)' => true, + + // However, we should raise true negatives in these slightly more + // reasonable cases. + 'javascript/:docs.html' => false, + 'javascripts:x.png' => false, + 'COOLjavascript:page' => false, + '/javascript:alert(1)' => false, + ); + + foreach (array(true, false) as $use_uri) { + foreach ($hrefs as $href => $expect) { + if (is_array($expect)) { + $expect = ($use_uri ? $expect[1] : $expect[0]); + } + + if ($use_uri) { + $href_value = new PhutilURI($href); + } else { + $href_value = $href; + } + + $caught = null; + try { + phutil_tag('a', array('href' => $href_value), 'click for candy'); + } catch (Exception $ex) { + $caught = $ex; + } + + $desc = pht( + 'Unexpected result for "%s". ', + $href, + $use_uri ? pht('Yes') : pht('No'), + $expect ? pht('Yes') : pht('No')); + + $this->assertEqual( + $expect, + $caught instanceof Exception, + $desc); + } + } + } + + public function testURIEscape() { + $this->assertEqual( + '%2B/%20%3F%23%26%3A%21xyz%25', + phutil_escape_uri('+/ ?#&:!xyz%')); + } + + public function testURIPathComponentEscape() { + $this->assertEqual( + 'a%252Fb', + phutil_escape_uri_path_component('a/b')); + + $str = ''; + for ($ii = 0; $ii <= 255; $ii++) { + $str .= chr($ii); + } + + $this->assertEqual( + $str, + phutil_unescape_uri_path_component( + rawurldecode( // Simulates webserver. + phutil_escape_uri_path_component($str)))); + } + + public function testHsprintf() { + $this->assertEqual( + '
<3
', + (string)hsprintf('
%s
', '<3')); + } + + public function testAppendHTML() { + $html = phutil_tag('hr'); + $html->appendHTML(phutil_tag('br'), ''); + $this->assertEqual('

<evil>', $html->getHTMLContent()); + } + + public function testArrayEscaping() { + $this->assertEqual( + '
<div>
', + phutil_escape_html( + array( + hsprintf('
'), + array( + array( + '<', + array( + 'd', + array( + array( + hsprintf('i'), + ), + 'v', + ), + ), + array( + array( + '>', + ), + ), + ), + ), + hsprintf('
'), + ))); + + $this->assertEqual( + '


', + phutil_tag( + 'div', + array(), + array( + array( + array( + phutil_tag('br'), + array( + phutil_tag('hr'), + ), + phutil_tag('wbr'), + ), + ), + ))->getHTMLContent()); + } + +} diff --git a/src/markup/__tests__/PhutilSafeHTMLTestCase.php b/src/markup/__tests__/PhutilSafeHTMLTestCase.php new file mode 100644 --- /dev/null +++ b/src/markup/__tests__/PhutilSafeHTMLTestCase.php @@ -0,0 +1,19 @@ +assertSkipped(pht('Operator extension not available.')); + } + + $a = phutil_tag('a'); + $ab = $a.phutil_tag('b'); + $this->assertEqual('', $ab->getHTMLContent()); + $this->assertEqual('', $a->getHTMLContent()); + + $a .= phutil_tag('a'); + $this->assertEqual('', $a->getHTMLContent()); + } + +} diff --git a/src/markup/engine/PhutilRemarkupEngine.php b/src/markup/engine/PhutilRemarkupEngine.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/PhutilRemarkupEngine.php @@ -0,0 +1,302 @@ +config[$key] = $value; + return $this; + } + + public function getConfig($key, $default = null) { + return idx($this->config, $key, $default); + } + + public function setMode($mode) { + $this->mode = $mode; + return $this; + } + + public function isTextMode() { + return $this->mode & self::MODE_TEXT; + } + + public function isHTMLMailMode() { + return $this->mode & self::MODE_HTML_MAIL; + } + + public function setBlockRules(array $rules) { + assert_instances_of($rules, 'PhutilRemarkupBlockRule'); + + $rules = msortv($rules, 'getPriorityVector'); + + $this->blockRules = $rules; + foreach ($this->blockRules as $rule) { + $rule->setEngine($this); + } + + $post_rules = array(); + foreach ($this->blockRules as $block_rule) { + foreach ($block_rule->getMarkupRules() as $rule) { + $key = $rule->getPostprocessKey(); + if ($key !== null) { + $post_rules[$key] = $rule; + } + } + } + + $this->postprocessRules = $post_rules; + + return $this; + } + + public function getTextMetadata($key, $default = null) { + if (isset($this->metadata[$key])) { + return $this->metadata[$key]; + } + return idx($this->metadata, $key, $default); + } + + public function setTextMetadata($key, $value) { + $this->metadata[$key] = $value; + return $this; + } + + public function storeText($text) { + if ($this->isTextMode()) { + $text = phutil_safe_html($text); + } + return $this->storage->store($text); + } + + public function overwriteStoredText($token, $new_text) { + if ($this->isTextMode()) { + $new_text = phutil_safe_html($new_text); + } + $this->storage->overwrite($token, $new_text); + return $this; + } + + public function markupText($text) { + return $this->postprocessText($this->preprocessText($text)); + } + + public function pushState($state) { + if (empty($this->states[$state])) { + $this->states[$state] = 0; + } + $this->states[$state]++; + return $this; + } + + public function popState($state) { + if (empty($this->states[$state])) { + throw new Exception(pht("State '%s' pushed more than popped!", $state)); + } + $this->states[$state]--; + if (!$this->states[$state]) { + unset($this->states[$state]); + } + return $this; + } + + public function getState($state) { + return !empty($this->states[$state]); + } + + public function preprocessText($text) { + $this->metadata = array(); + $this->storage = new PhutilRemarkupBlockStorage(); + + $blocks = $this->splitTextIntoBlocks($text); + + $output = array(); + foreach ($blocks as $block) { + $output[] = $this->markupBlock($block); + } + $output = $this->flattenOutput($output); + + $map = $this->storage->getMap(); + $this->storage = null; + $metadata = $this->metadata; + + + return array( + 'output' => $output, + 'storage' => $map, + 'metadata' => $metadata, + ); + } + + private function splitTextIntoBlocks($text, $depth = 0) { + // Apply basic block and paragraph normalization to the text. NOTE: We don't + // strip trailing whitespace because it is semantic in some contexts, + // notably inlined diffs that the author intends to show as a code block. + $text = phutil_split_lines($text, true); + $block_rules = $this->blockRules; + $blocks = array(); + $cursor = 0; + $prev_block = array(); + + while (isset($text[$cursor])) { + $starting_cursor = $cursor; + foreach ($block_rules as $block_rule) { + $num_lines = $block_rule->getMatchingLineCount($text, $cursor); + + if ($num_lines) { + if ($blocks) { + $prev_block = last($blocks); + } + + $curr_block = array( + 'start' => $cursor, + 'num_lines' => $num_lines, + 'rule' => $block_rule, + 'is_empty' => self::isEmptyBlock($text, $cursor, $num_lines), + 'children' => array(), + ); + + if ($prev_block + && self::shouldMergeBlocks($text, $prev_block, $curr_block)) { + $blocks[last_key($blocks)]['num_lines'] += $curr_block['num_lines']; + $blocks[last_key($blocks)]['is_empty'] = + $blocks[last_key($blocks)]['is_empty'] && $curr_block['is_empty']; + } else { + $blocks[] = $curr_block; + } + + $cursor += $num_lines; + break; + } + } + + if ($starting_cursor === $cursor) { + throw new Exception(pht('Block in text did not match any block rule.')); + } + } + + foreach ($blocks as $key => $block) { + $lines = array_slice($text, $block['start'], $block['num_lines']); + $blocks[$key]['text'] = implode('', $lines); + } + + // Stop splitting child blocks apart if we get too deep. This arrests + // any blocks which have looping child rules, and stops the stack from + // exploding if someone writes a hilarious comment with 5,000 levels of + // quoted text. + + if ($depth < self::MAX_CHILD_DEPTH) { + foreach ($blocks as $key => $block) { + $rule = $block['rule']; + if (!$rule->supportsChildBlocks()) { + continue; + } + + list($parent_text, $child_text) = $rule->extractChildText( + $block['text']); + $blocks[$key]['text'] = $parent_text; + $blocks[$key]['children'] = $this->splitTextIntoBlocks( + $child_text, + $depth + 1); + } + } + + return $blocks; + } + + private function markupBlock(array $block) { + $children = array(); + foreach ($block['children'] as $child) { + $children[] = $this->markupBlock($child); + } + + if ($children) { + $children = $this->flattenOutput($children); + } else { + $children = null; + } + + return $block['rule']->markupText($block['text'], $children); + } + + private function flattenOutput(array $output) { + if ($this->isTextMode()) { + $output = implode("\n\n", $output)."\n"; + } else { + $output = phutil_implode_html("\n\n", $output); + } + + return $output; + } + + private static function shouldMergeBlocks($text, $prev_block, $curr_block) { + $block_rules = ipull(array($prev_block, $curr_block), 'rule'); + + $default_rule = 'PhutilRemarkupDefaultBlockRule'; + try { + assert_instances_of($block_rules, $default_rule); + + // If the last block was empty keep merging + if ($prev_block['is_empty']) { + return true; + } + + // If this line is blank keep merging + if ($curr_block['is_empty']) { + return true; + } + + // If the current line and the last line have content, keep merging + if (strlen(trim($text[$curr_block['start'] - 1]))) { + if (strlen(trim($text[$curr_block['start']]))) { + return true; + } + } + } catch (Exception $e) {} + + return false; + } + + private static function isEmptyBlock($text, $start, $num_lines) { + for ($cursor = $start; $cursor < $start + $num_lines; $cursor++) { + if (strlen(trim($text[$cursor]))) { + return false; + } + } + return true; + } + + public function postprocessText(array $dict) { + $this->metadata = idx($dict, 'metadata', array()); + + $this->storage = new PhutilRemarkupBlockStorage(); + $this->storage->setMap(idx($dict, 'storage', array())); + + foreach ($this->blockRules as $block_rule) { + $block_rule->postprocess(); + } + + foreach ($this->postprocessRules as $rule) { + $rule->didMarkupText(); + } + + return $this->restoreText(idx($dict, 'output')); + } + + public function restoreText($text) { + return $this->storage->restore($text, $this->isTextMode()); + } +} diff --git a/src/markup/engine/__tests__/PhutilRemarkupEngineTestCase.php b/src/markup/engine/__tests__/PhutilRemarkupEngineTestCase.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/PhutilRemarkupEngineTestCase.php @@ -0,0 +1,121 @@ +markupText($root.$file); + } + } + + private function markupText($markup_file) { + $contents = Filesystem::readFile($markup_file); + $file = basename($markup_file); + + $parts = explode("\n~~~~~~~~~~\n", $contents); + $this->assertEqual(3, count($parts), $markup_file); + + list($input_remarkup, $expected_output, $expected_text) = $parts; + + $engine = $this->buildNewTestEngine(); + + switch ($file) { + case 'raw-escape.txt': + + // NOTE: Here, we want to test PhutilRemarkupEscapeRemarkupRule and + // PhutilRemarkupBlockStorage, which are triggered by "\1". In the + // test, "~" is used as a placeholder for "\1" since it's hard to type + // "\1". + + $input_remarkup = str_replace('~', "\1", $input_remarkup); + $expected_output = str_replace('~', "\1", $expected_output); + $expected_text = str_replace('~', "\1", $expected_text); + break; + case 'toc.txt': + $engine->setConfig('header.generate-toc', true); + break; + case 'link-same-window.txt': + $engine->setConfig('uri.same-window', true); + break; + case 'link-square.txt': + $engine->setConfig('uri.base', 'http://www.example.com/'); + $engine->setConfig('uri.here', 'http://www.example.com/page/'); + break; + } + + $actual_output = (string)$engine->markupText($input_remarkup); + + switch ($file) { + case 'toc.txt': + $table_of_contents = + PhutilRemarkupHeaderBlockRule::renderTableOfContents($engine); + $actual_output = $table_of_contents."\n\n".$actual_output; + break; + } + + $this->assertEqual( + $expected_output, + $actual_output, + pht("Failed to markup HTML in file '%s'.", $file)); + + $engine->setMode(PhutilRemarkupEngine::MODE_TEXT); + $actual_output = (string)$engine->markupText($input_remarkup); + + $this->assertEqual( + $expected_text, + $actual_output, + pht("Failed to markup text in file '%s'.", $file)); + } + + private function buildNewTestEngine() { + $engine = new PhutilRemarkupEngine(); + + $engine->setConfig( + 'uri.allowed-protocols', + array( + 'http' => true, + 'mailto' => true, + 'tel' => true, + )); + + $rules = array(); + $rules[] = new PhutilRemarkupEscapeRemarkupRule(); + $rules[] = new PhutilRemarkupMonospaceRule(); + $rules[] = new PhutilRemarkupDocumentLinkRule(); + $rules[] = new PhutilRemarkupHyperlinkRule(); + $rules[] = new PhutilRemarkupBoldRule(); + $rules[] = new PhutilRemarkupItalicRule(); + $rules[] = new PhutilRemarkupDelRule(); + $rules[] = new PhutilRemarkupUnderlineRule(); + $rules[] = new PhutilRemarkupHighlightRule(); + + $blocks = array(); + $blocks[] = new PhutilRemarkupQuotesBlockRule(); + $blocks[] = new PhutilRemarkupReplyBlockRule(); + $blocks[] = new PhutilRemarkupHeaderBlockRule(); + $blocks[] = new PhutilRemarkupHorizontalRuleBlockRule(); + $blocks[] = new PhutilRemarkupCodeBlockRule(); + $blocks[] = new PhutilRemarkupLiteralBlockRule(); + $blocks[] = new PhutilRemarkupNoteBlockRule(); + $blocks[] = new PhutilRemarkupTableBlockRule(); + $blocks[] = new PhutilRemarkupSimpleTableBlockRule(); + $blocks[] = new PhutilRemarkupDefaultBlockRule(); + $blocks[] = new PhutilRemarkupListBlockRule(); + $blocks[] = new PhutilRemarkupInterpreterBlockRule(); + + foreach ($blocks as $block) { + if (!($block instanceof PhutilRemarkupCodeBlockRule)) { + $block->setMarkupRules($rules); + } + } + + $engine->setBlockRules($blocks); + + return $engine; + } + +} diff --git a/src/markup/engine/__tests__/remarkup/across-newlines.txt b/src/markup/engine/__tests__/remarkup/across-newlines.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/across-newlines.txt @@ -0,0 +1,7 @@ +**duck +quack** +~~~~~~~~~~ +

duck +quack

+~~~~~~~~~~ +**duck quack** diff --git a/src/markup/engine/__tests__/remarkup/backticks-whitespace.txt b/src/markup/engine/__tests__/remarkup/backticks-whitespace.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/backticks-whitespace.txt @@ -0,0 +1,17 @@ +```x``` + +``` +y +``` +~~~~~~~~~~ +
x
+ + + +
y
+~~~~~~~~~~ + x + + + + y diff --git a/src/markup/engine/__tests__/remarkup/block-then-list.txt b/src/markup/engine/__tests__/remarkup/block-then-list.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/block-then-list.txt @@ -0,0 +1,12 @@ + lang=txt + code block + + - still a code block +~~~~~~~~~~ +
code block
+
+- still a code block
+~~~~~~~~~~ + code block + + - still a code block diff --git a/src/markup/engine/__tests__/remarkup/code-block-whitespace.txt b/src/markup/engine/__tests__/remarkup/code-block-whitespace.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/code-block-whitespace.txt @@ -0,0 +1,9 @@ + lang=txt + x + y +~~~~~~~~~~ +
  x
+y
+~~~~~~~~~~ + x + y diff --git a/src/markup/engine/__tests__/remarkup/del.txt b/src/markup/engine/__tests__/remarkup/del.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/del.txt @@ -0,0 +1,11 @@ +omg~~ wtf~~~~~ bbq~~~ lol~~ +~~deleted text~~ +~~This is a great idea~~~ die forever please +~~~~~~ +~~~~~~~~~~ +

omg~~ wtf~~~~~ bbq~~~ lol~~ +deleted text +This is a great idea~ die forever please +~~~~~~

+~~~~~~~~~~ +omg~~ wtf~~~~~ bbq~~~ lol~~ ~~deleted text~~ ~~This is a great idea~~~ die forever please ~~~~~~ diff --git a/src/markup/engine/__tests__/remarkup/diff.txt b/src/markup/engine/__tests__/remarkup/diff.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/diff.txt @@ -0,0 +1,36 @@ +here is a diff + + lang=diff + @@ derp derp @@ + x + y + + - x + - y + + z + +derp derp +~~~~~~~~~~ +

here is a diff

+ +
@@ derp derp @@
+x
+y
+
+- x
+- y
++ z
+ +

derp derp

+~~~~~~~~~~ +here is a diff + + @@ derp derp @@ + x + y + + - x + - y + + z + +derp derp diff --git a/src/markup/engine/__tests__/remarkup/disallowed-link.txt b/src/markup/engine/__tests__/remarkup/disallowed-link.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/disallowed-link.txt @@ -0,0 +1,5 @@ +javascript://www.example.com/ +~~~~~~~~~~ +

javascript://www.example.com/

+~~~~~~~~~~ +javascript://www.example.com/ diff --git a/src/markup/engine/__tests__/remarkup/entities.txt b/src/markup/engine/__tests__/remarkup/entities.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/entities.txt @@ -0,0 +1,5 @@ +< > & " +~~~~~~~~~~ +

< > & "

+~~~~~~~~~~ +< > & " diff --git a/src/markup/engine/__tests__/remarkup/header-skip.txt b/src/markup/engine/__tests__/remarkup/header-skip.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/header-skip.txt @@ -0,0 +1,11 @@ +#2 is my favorite. + +#project +~~~~~~~~~~ +

#2 is my favorite.

+ +

#project

+~~~~~~~~~~ +#2 is my favorite. + +#project diff --git a/src/markup/engine/__tests__/remarkup/headers.txt b/src/markup/engine/__tests__/remarkup/headers.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/headers.txt @@ -0,0 +1,57 @@ +@nolint (UTF8) + +=a= + +blah blah blah + + += b = + +Markdown-Style Large Header +==== + +Markdown-Style Small Header +---- + +=== Remarkup-Style Smaller Header + + += ☃☃☃ UTF8 Header ☃☃☃ = +~~~~~~~~~~ +

@nolint (UTF8)

+ +

a

+ +

blah blah blah

+ +

b

+ +

Markdown-Style Large Header

+ +

Markdown-Style Small Header

+ +

Remarkup-Style Smaller Header

+ +

☃☃☃ UTF8 Header ☃☃☃

+~~~~~~~~~~ +@nolint (UTF8) + +a += + +blah blah blah + +b += + +Markdown-Style Large Header +=========================== + +Markdown-Style Small Header +--------------------------- + +Remarkup-Style Smaller Header +----------------------------- + +☃☃☃ UTF8 Header ☃☃☃ +=================== diff --git a/src/markup/engine/__tests__/remarkup/highlight.txt b/src/markup/engine/__tests__/remarkup/highlight.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/highlight.txt @@ -0,0 +1,9 @@ +how about we !!highlight!! some !!TEXT!!! +wow this must be **!!very important!!** +omg!!!!! +~~~~~~~~~~ +

how about we highlight some TEXT! +wow this must be very important +omg!!!!!

+~~~~~~~~~~ +how about we !!highlight!! some !!TEXT!!! wow this must be **!!very important!!** omg!!!!! diff --git a/src/markup/engine/__tests__/remarkup/horizonal-rule.txt b/src/markup/engine/__tests__/remarkup/horizonal-rule.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/horizonal-rule.txt @@ -0,0 +1,41 @@ +___ + +_____ + +*** + +* * * * * * * + +--- + +- - - - - - - + + --- +~~~~~~~~~~ +
+ +
+ +
+ +
+ +
+ +
+ +
+~~~~~~~~~~ +___ + +_____ + +*** + +* * * * * * * + +--- + +- - - - - - - + + --- diff --git a/src/markup/engine/__tests__/remarkup/important.txt b/src/markup/engine/__tests__/remarkup/important.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/important.txt @@ -0,0 +1,15 @@ +IMPORTANT: interesting **stuff** + +(IMPORTANT) interesting **stuff** +~~~~~~~~~~ +
IMPORTANT: interesting stuff
+ + + +
interesting stuff
+~~~~~~~~~~ +IMPORTANT: interesting **stuff** + + + +(IMPORTANT) interesting **stuff** diff --git a/src/markup/engine/__tests__/remarkup/interpreter-test.txt b/src/markup/engine/__tests__/remarkup/interpreter-test.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/interpreter-test.txt @@ -0,0 +1,58 @@ +phutil_test_block_interpreter (foo=bar) {{{ +content +}}} + +phutil_test_block_interpreter {{{ content +content }}} + +phutil_test_block_interpreter {{{ content }}} + +phutil_test_block_interpreter(x=y){{{content}}} + +phutil_fake_test_block_interpreter {{{ content }}} +~~~~~~~~~~ +Content: (content) +Argv: (foo=bar) + + + +Content: ( content +content ) +Argv: () + + + +Content: ( content ) +Argv: () + + + +Content: (content) +Argv: (x=y) + + + +
No interpreter found: phutil_fake_test_block_interpreter
+~~~~~~~~~~ +Content: (content) +Argv: (foo=bar) + + + +Content: ( content +content ) +Argv: () + + + +Content: ( content ) +Argv: () + + + +Content: (content) +Argv: (x=y) + + + +(No interpreter found: phutil_fake_test_block_interpreter) diff --git a/src/markup/engine/__tests__/remarkup/just-backticks.txt b/src/markup/engine/__tests__/remarkup/just-backticks.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/just-backticks.txt @@ -0,0 +1,5 @@ +``` +~~~~~~~~~~ +
+~~~~~~~~~~ + diff --git a/src/markup/engine/__tests__/remarkup/leading-newline.txt b/src/markup/engine/__tests__/remarkup/leading-newline.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/leading-newline.txt @@ -0,0 +1,6 @@ + +a +~~~~~~~~~~ +

a

+~~~~~~~~~~ +a diff --git a/src/markup/engine/__tests__/remarkup/link-alternate.txt b/src/markup/engine/__tests__/remarkup/link-alternate.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/link-alternate.txt @@ -0,0 +1,12 @@ +[Example](http://www.example.com/) + +x[0][1](**ptr); + +~~~~~~~~~~ +

Example

+ +

x[0][1](**ptr);

+~~~~~~~~~~ +Example + +x[0][1](**ptr); diff --git a/src/markup/engine/__tests__/remarkup/link-brackets.txt b/src/markup/engine/__tests__/remarkup/link-brackets.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/link-brackets.txt @@ -0,0 +1,5 @@ + +~~~~~~~~~~ +

http://www.zany.com/omg/weird_url,,,

+~~~~~~~~~~ +http://www.zany.com/omg/weird_url,,, diff --git a/src/markup/engine/__tests__/remarkup/link-edge-cases.txt b/src/markup/engine/__tests__/remarkup/link-edge-cases.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/link-edge-cases.txt @@ -0,0 +1,35 @@ +http://www.example.com/ + +(http://www.example.com/) + + + +http://www.example.com/wiki/example_(disambiguation) + +(example http://www.example.com/) + +Quick! http://www.example.com/! +~~~~~~~~~~ +

http://www.example.com/

+ +

(http://www.example.com/)

+ +

http://www.example.com/

+ +

http://www.example.com/wiki/example_(disambiguation)

+ +

(example http://www.example.com/)

+ +

Quick! http://www.example.com/!

+~~~~~~~~~~ +http://www.example.com/ + +(http://www.example.com/) + +http://www.example.com/ + +http://www.example.com/wiki/example_(disambiguation) + +(example http://www.example.com/) + +Quick! http://www.example.com/! diff --git a/src/markup/engine/__tests__/remarkup/link-mailto.txt b/src/markup/engine/__tests__/remarkup/link-mailto.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/link-mailto.txt @@ -0,0 +1,18 @@ +[[ mailto:alincoln@example.com | mail me ]] + +[ mail me ]( mailto:alincoln@example.com ) + +[[mailto:alincoln@example.com]] + +~~~~~~~~~~ +

mail me

+ +

mail me

+ +

alincoln@example.com

+~~~~~~~~~~ +mail me + +mail me + +alincoln@example.com diff --git a/src/markup/engine/__tests__/remarkup/link-mixed.txt b/src/markup/engine/__tests__/remarkup/link-mixed.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/link-mixed.txt @@ -0,0 +1,18 @@ +[[http://www.example.com/ | Example]](http://www.alternate.org/) + +(http://www.alternate.org/)[[http://www.example.com/ | Example]] + + + +~~~~~~~~~~ +

Example(http://www.alternate.org/)

+ +

(http://www.alternate.org/)Example

+ +

<http://www.example.com/ Example>

+~~~~~~~~~~ +Example (http://www.alternate.org/) + +(http://www.alternate.org/)Example + +> diff --git a/src/markup/engine/__tests__/remarkup/link-noreferrer.txt b/src/markup/engine/__tests__/remarkup/link-noreferrer.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/link-noreferrer.txt @@ -0,0 +1,16 @@ +[[ /\evil.com ]] + +[[ / +/evil.com ]] + +~~~~~~~~~~ +

/\evil.com

+ +

/ +/evil.com

+~~~~~~~~~~ +/\evil.com + +/ +/evil.com diff --git a/src/markup/engine/__tests__/remarkup/link-same-window.txt b/src/markup/engine/__tests__/remarkup/link-same-window.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/link-same-window.txt @@ -0,0 +1,11 @@ +[[http://www.example.com/]] + +http://www.example.com/ +~~~~~~~~~~ +

http://www.example.com/

+ +

http://www.example.com/

+~~~~~~~~~~ +http://www.example.com/ + +http://www.example.com/ diff --git a/src/markup/engine/__tests__/remarkup/link-square.txt b/src/markup/engine/__tests__/remarkup/link-square.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/link-square.txt @@ -0,0 +1,29 @@ +[[http://www.example.com/]] + +[[http://www.example.com/ | example.com]] + +[[/x/]] + +[[#anchor]] + +[[#anchor | Anchors ]] +~~~~~~~~~~ +

http://www.example.com/

+ +

example.com

+ +

http://www.example.com/x/

+ +

http://www.example.com/page/#anchor

+ +

Anchors

+~~~~~~~~~~ +http://www.example.com/ + +example.com + +http://www.example.com/x/ + +http://www.example.com/page/#anchor + +Anchors diff --git a/src/markup/engine/__tests__/remarkup/link-tel.txt b/src/markup/engine/__tests__/remarkup/link-tel.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/link-tel.txt @@ -0,0 +1,18 @@ +[[ tel:18005555555 | call me ]] + +[ call me ]( tel:18005555555 ) + +[[tel:18005555555]] + +~~~~~~~~~~ +

call me

+ +

call me

+ +

18005555555

+~~~~~~~~~~ +call me <18005555555> + +call me <18005555555> + +18005555555 diff --git a/src/markup/engine/__tests__/remarkup/link-with-angle-brackets.txt b/src/markup/engine/__tests__/remarkup/link-with-angle-brackets.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/link-with-angle-brackets.txt @@ -0,0 +1,5 @@ +http://.example.com/ +~~~~~~~~~~ +

http://<www>.example.com/

+~~~~~~~~~~ +http://.example.com/ diff --git a/src/markup/engine/__tests__/remarkup/link-with-angle-link-anchor.txt b/src/markup/engine/__tests__/remarkup/link-with-angle-link-anchor.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/link-with-angle-link-anchor.txt @@ -0,0 +1,5 @@ + +~~~~~~~~~~ +

<http://x.y#http://x.y#>

+~~~~~~~~~~ + diff --git a/src/markup/engine/__tests__/remarkup/link-with-link-anchor.txt b/src/markup/engine/__tests__/remarkup/link-with-link-anchor.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/link-with-link-anchor.txt @@ -0,0 +1,5 @@ +http://x.y#http://x.y# +~~~~~~~~~~ +

http://x.y#http://x.y#

+~~~~~~~~~~ +http://x.y#http://x.y# diff --git a/src/markup/engine/__tests__/remarkup/link-with-punctuation.txt b/src/markup/engine/__tests__/remarkup/link-with-punctuation.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/link-with-punctuation.txt @@ -0,0 +1,9 @@ +http://www.example.com/, +http://www.example.com/.. +http://www.example.com/!!! +~~~~~~~~~~ +

http://www.example.com/, +http://www.example.com/.. +http://www.example.com/!!!

+~~~~~~~~~~ +http://www.example.com/, http://www.example.com/.. http://www.example.com/!!! diff --git a/src/markup/engine/__tests__/remarkup/link-with-tilde.txt b/src/markup/engine/__tests__/remarkup/link-with-tilde.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/link-with-tilde.txt @@ -0,0 +1,5 @@ +http://www.example.com/~ +~~~~~~~~~~ +

http://www.example.com/~

+~~~~~~~~~~ +http://www.example.com/~ diff --git a/src/markup/engine/__tests__/remarkup/link.txt b/src/markup/engine/__tests__/remarkup/link.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/link.txt @@ -0,0 +1,5 @@ +http://www.example.com/ +~~~~~~~~~~ +

http://www.example.com/

+~~~~~~~~~~ +http://www.example.com/ diff --git a/src/markup/engine/__tests__/remarkup/list-alternate-style.txt b/src/markup/engine/__tests__/remarkup/list-alternate-style.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/list-alternate-style.txt @@ -0,0 +1,15 @@ +- a +-- b +--- c +~~~~~~~~~~ +
    +
  • a
      +
    • b
        +
      • c
      • +
    • +
  • +
+~~~~~~~~~~ +- a + - b + - c diff --git a/src/markup/engine/__tests__/remarkup/list-blow-stack.txt b/src/markup/engine/__tests__/remarkup/list-blow-stack.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/list-blow-stack.txt @@ -0,0 +1,138 @@ +- a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + + +derp +~~~~~~~~~~ +
    +
  • a
      +
    • a
        +
      • a
          +
        • a
            +
          • a
              +
            • a
                +
              • a
                  +
                • a
                    +
                  • a
                      +
                    • a
                        +
                      • a
                          +
                        • a
                            +
                          • a
                              +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                            • a
                            • +
                          • +
                        • +
                      • +
                    • +
                  • +
                • +
              • +
            • +
          • +
        • +
      • +
    • +
  • +
+ +

derp

+~~~~~~~~~~ +- a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + - a + +derp diff --git a/src/markup/engine/__tests__/remarkup/list-checkboxes.txt b/src/markup/engine/__tests__/remarkup/list-checkboxes.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/list-checkboxes.txt @@ -0,0 +1,41 @@ +- [] a +- [ ] b +- [X] c +- d + +[ ] A +[X] B + [ ] C + [ ] D + +[1] footnote + +~~~~~~~~~~ +
    +
  • a
  • +
  • b
  • +
  • c
  • +
  • d
  • +
+ +
    +
  • A
  • +
  • B
      +
    • C
    • +
    • D
    • +
  • +
+ +

[1] footnote

+~~~~~~~~~~ +[ ] a +[ ] b +[X] c +- d + +[ ] A +[X] B + [ ] C + [ ] D + +[1] footnote diff --git a/src/markup/engine/__tests__/remarkup/list-crazystairs.txt b/src/markup/engine/__tests__/remarkup/list-crazystairs.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/list-crazystairs.txt @@ -0,0 +1,15 @@ +## Fruit +- Apple +- Banana +~~~~~~~~~~ +
    +
    1. +
    2. Fruit
    3. +
  • +
  • Apple
  • +
  • Banana
  • +
+~~~~~~~~~~ + 1. Fruit +- Apple +- Banana diff --git a/src/markup/engine/__tests__/remarkup/list-first-style-wins.txt b/src/markup/engine/__tests__/remarkup/list-first-style-wins.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/list-first-style-wins.txt @@ -0,0 +1,19 @@ +# item +- item +- item + +derp +~~~~~~~~~~ +
    +
  1. item
  2. +
  3. item
  4. +
  5. item
  6. +
+ +

derp

+~~~~~~~~~~ +1. item +2. item +3. item + +derp diff --git a/src/markup/engine/__tests__/remarkup/list-hash.txt b/src/markup/engine/__tests__/remarkup/list-hash.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/list-hash.txt @@ -0,0 +1,19 @@ +# item +# item +# item + +derp +~~~~~~~~~~ +
    +
  1. item
  2. +
  3. item
  4. +
  5. item
  6. +
+ +

derp

+~~~~~~~~~~ +1. item +2. item +3. item + +derp diff --git a/src/markup/engine/__tests__/remarkup/list-header-last.txt b/src/markup/engine/__tests__/remarkup/list-header-last.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/list-header-last.txt @@ -0,0 +1,7 @@ +# At the end of a block, this should be a list. +~~~~~~~~~~ +
    +
  1. At the end of a block, this should be a list.
  2. +
+~~~~~~~~~~ +1. At the end of a block, this should be a list. diff --git a/src/markup/engine/__tests__/remarkup/list-header.txt b/src/markup/engine/__tests__/remarkup/list-header.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/list-header.txt @@ -0,0 +1,12 @@ +## Small Header + +This should be a small header. +~~~~~~~~~~ +

Small Header

+ +

This should be a small header.

+~~~~~~~~~~ +Small Header +------------ + +This should be a small header. diff --git a/src/markup/engine/__tests__/remarkup/list-mixed-styles.txt b/src/markup/engine/__tests__/remarkup/list-mixed-styles.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/list-mixed-styles.txt @@ -0,0 +1,15 @@ + - a + -- b + --- c +~~~~~~~~~~ +
    +
  • a
      +
    • b
        +
      • c
      • +
    • +
  • +
+~~~~~~~~~~ +- a + - b + - c diff --git a/src/markup/engine/__tests__/remarkup/list-multi.txt b/src/markup/engine/__tests__/remarkup/list-multi.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/list-multi.txt @@ -0,0 +1,14 @@ +- a + -- b + -- c +~~~~~~~~~~ +
    +
  • a
      +
    • b
    • +
    • c
    • +
  • +
+~~~~~~~~~~ +- a + - b + - c diff --git a/src/markup/engine/__tests__/remarkup/list-multiline.txt b/src/markup/engine/__tests__/remarkup/list-multiline.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/list-multiline.txt @@ -0,0 +1,16 @@ +- a + a +- b +b +~~~~~~~~~~ +
    +
  • a a
  • +
  • b
  • +
+ +

b

+~~~~~~~~~~ +- a a +- b + +b diff --git a/src/markup/engine/__tests__/remarkup/list-nest.txt b/src/markup/engine/__tests__/remarkup/list-nest.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/list-nest.txt @@ -0,0 +1,30 @@ +- item + - sub +- item + # sub + # sub +- item + +derp +~~~~~~~~~~ +
    +
  • item
      +
    • sub
    • +
  • +
  • item
      +
    1. sub
    2. +
    3. sub
    4. +
  • +
  • item
  • +
+ +

derp

+~~~~~~~~~~ +- item + - sub +- item + 1. sub + 2. sub +- item + +derp diff --git a/src/markup/engine/__tests__/remarkup/list-paragraphs.txt b/src/markup/engine/__tests__/remarkup/list-paragraphs.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/list-paragraphs.txt @@ -0,0 +1,27 @@ +- This is a list item + with several paragraphs. + + This is the second paragraph + of the first list item. +- This is the second item + in the list. + - This is a sublist. +- This is the third item in the list. + +~~~~~~~~~~ +
    +
  • This is a list item with several paragraphs. +

    +This is the second paragraph of the first list item.
  • +
  • This is the second item in the list.
      +
    • This is a sublist.
    • +
  • +
  • This is the third item in the list.
  • +
+~~~~~~~~~~ +- This is a list item with several paragraphs. + + This is the second paragraph of the first list item. +- This is the second item in the list. + - This is a sublist. +- This is the third item in the list. diff --git a/src/markup/engine/__tests__/remarkup/list-staircase.txt b/src/markup/engine/__tests__/remarkup/list-staircase.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/list-staircase.txt @@ -0,0 +1,23 @@ + - top + - mid +# bot + +derp +~~~~~~~~~~ +
    +
    • +
      • +
      • top
      • +
    • +
    • mid
    • +
  1. +
  2. bot
  3. +
+ +

derp

+~~~~~~~~~~ + - top + - mid +1. bot + +derp diff --git a/src/markup/engine/__tests__/remarkup/list-star.txt b/src/markup/engine/__tests__/remarkup/list-star.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/list-star.txt @@ -0,0 +1,19 @@ +* item +* item +* item + +derp +~~~~~~~~~~ +
    +
  • item
  • +
  • item
  • +
  • item
  • +
+ +

derp

+~~~~~~~~~~ +- item +- item +- item + +derp diff --git a/src/markup/engine/__tests__/remarkup/list-then-a-list.txt b/src/markup/engine/__tests__/remarkup/list-then-a-list.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/list-then-a-list.txt @@ -0,0 +1,15 @@ +1) one + +- a +~~~~~~~~~~ +
    +
  1. one
  2. +
+ +
    +
  • a
  • +
+~~~~~~~~~~ +1. one + +- a diff --git a/src/markup/engine/__tests__/remarkup/list-vs-codeblock.txt b/src/markup/engine/__tests__/remarkup/list-vs-codeblock.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/list-vs-codeblock.txt @@ -0,0 +1,17 @@ +This should be a list: + + - apple + - banana + +~~~~~~~~~~ +

This should be a list:

+ +
    +
  • apple
  • +
  • banana
  • +
+~~~~~~~~~~ +This should be a list: + +- apple +- banana diff --git a/src/markup/engine/__tests__/remarkup/list.txt b/src/markup/engine/__tests__/remarkup/list.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/list.txt @@ -0,0 +1,13 @@ + - < > & " + +text block +~~~~~~~~~~ +
    +
  • < > & "
  • +
+ +

text block

+~~~~~~~~~~ +- < > & " + +text block diff --git a/src/markup/engine/__tests__/remarkup/monospaced-in-monospaced.txt b/src/markup/engine/__tests__/remarkup/monospaced-in-monospaced.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/monospaced-in-monospaced.txt @@ -0,0 +1,18 @@ +query ##SELECT * FROM `table`## + +`SELECT * FROM ##table##` + +`**x**` + +~~~~~~~~~~ +

query SELECT * FROM `table`

+ +

SELECT * FROM ##table##

+ +

**x**

+~~~~~~~~~~ +query ##SELECT * FROM `table`## + +`SELECT * FROM ##table##` + +`**x**` diff --git a/src/markup/engine/__tests__/remarkup/monospaced-plural.txt b/src/markup/engine/__tests__/remarkup/monospaced-plural.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/monospaced-plural.txt @@ -0,0 +1,11 @@ +`Zebra`s + +I can`t and I won`t. +~~~~~~~~~~ +

Zebras

+ +

I can`t and I won`t.

+~~~~~~~~~~ +`Zebra`s + +I can`t and I won`t. diff --git a/src/markup/engine/__tests__/remarkup/monospaced.txt b/src/markup/engine/__tests__/remarkup/monospaced.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/monospaced.txt @@ -0,0 +1,5 @@ +cmd ##ls --color > /dev/null## +~~~~~~~~~~ +

cmd ls --color > /dev/null

+~~~~~~~~~~ +cmd ##ls --color > /dev/null## diff --git a/src/markup/engine/__tests__/remarkup/newline-then-block.txt b/src/markup/engine/__tests__/remarkup/newline-then-block.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/newline-then-block.txt @@ -0,0 +1,30 @@ +This is a paragraph. + + + lang=txt + First line of code block. + Second line of code block. + + + + + + + +
Cell 1Cell 2
+~~~~~~~~~~ +

This is a paragraph.

+ +
First line of code block.
+Second line of code block.
+ +
+ +
Cell 1Cell 2
+~~~~~~~~~~ +This is a paragraph. + + First line of code block. + Second line of code block. + +| Cell 1 | Cell 2 | diff --git a/src/markup/engine/__tests__/remarkup/note-multiline.txt b/src/markup/engine/__tests__/remarkup/note-multiline.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/note-multiline.txt @@ -0,0 +1,14 @@ +NOTE: a +a + +b +~~~~~~~~~~ +
NOTE: a +a
+ +

b

+~~~~~~~~~~ +NOTE: a +a + +b diff --git a/src/markup/engine/__tests__/remarkup/note.txt b/src/markup/engine/__tests__/remarkup/note.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/note.txt @@ -0,0 +1,15 @@ +NOTE: interesting **stuff** + +(NOTE) interesting **stuff** +~~~~~~~~~~ +
NOTE: interesting stuff
+ + + +
interesting stuff
+~~~~~~~~~~ +NOTE: interesting **stuff** + + + +(NOTE) interesting **stuff** diff --git a/src/markup/engine/__tests__/remarkup/ordered-list-with-numbers.txt b/src/markup/engine/__tests__/remarkup/ordered-list-with-numbers.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/ordered-list-with-numbers.txt @@ -0,0 +1,64 @@ +# aasdx +# asdf + +1. asa + # asdf +234) asdf + +234) asd + +1. asd +234) asd + +10. ten +11. eleven +12. twelve + +1/ This explicitly should not be formatted as a list. +~~~~~~~~~~ +
    +
  1. aasdx
  2. +
  3. asdf
  4. +
+ +
    +
  1. asa
      +
    1. asdf
    2. +
  2. +
  3. asdf
  4. +
+ +
    +
  1. asd
  2. +
+ +
    +
  1. asd
  2. +
  3. asd
  4. +
+ +
    +
  1. ten
  2. +
  3. eleven
  4. +
  5. twelve
  6. +
+ +

1/ This explicitly should not be formatted as a list.

+~~~~~~~~~~ +1. aasdx +2. asdf + +1. asa + 1. asdf +2. asdf + +234. asd + +1. asd +2. asd + +10. ten +11. eleven +12. twelve + +1/ This explicitly should not be formatted as a list. diff --git a/src/markup/engine/__tests__/remarkup/percent-block-adjacent.txt b/src/markup/engine/__tests__/remarkup/percent-block-adjacent.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/percent-block-adjacent.txt @@ -0,0 +1,29 @@ +%%%a%%% +%%%b%%% + +%%%a +b%%% + +%%%a%%% + +%%%b%%% +~~~~~~~~~~ +

a +
b

+ +

a +
b

+ +

a

+ +

b

+~~~~~~~~~~ +a +b + +a +b + +a + +b diff --git a/src/markup/engine/__tests__/remarkup/percent-block-multiline.txt b/src/markup/engine/__tests__/remarkup/percent-block-multiline.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/percent-block-multiline.txt @@ -0,0 +1,21 @@ +**foo** +%%%- first +- second +- third%%% +[[http://hello | world]] +~~~~~~~~~~ +

foo

+ +

- first +
- second +
- third

+ +

world

+~~~~~~~~~~ +**foo** + +- first +- second +- third + +world diff --git a/src/markup/engine/__tests__/remarkup/percent-block-oneline.txt b/src/markup/engine/__tests__/remarkup/percent-block-oneline.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/percent-block-oneline.txt @@ -0,0 +1,11 @@ +%%%[[http://hello | world]] **bold**%%% + + %%%[[http://hello | world]] **bold**%%% +~~~~~~~~~~ +

[[http://hello | world]] **bold**

+ +

[[http://hello | world]] **bold**

+~~~~~~~~~~ +[[http://hello | world]] **bold** + +[[http://hello | world]] **bold** diff --git a/src/markup/engine/__tests__/remarkup/percent-block-solo.txt b/src/markup/engine/__tests__/remarkup/percent-block-solo.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/percent-block-solo.txt @@ -0,0 +1,8 @@ +%%% +**x**%%% +~~~~~~~~~~ +

+
**x**

+~~~~~~~~~~ + +**x** diff --git a/src/markup/engine/__tests__/remarkup/quoted-angry.txt b/src/markup/engine/__tests__/remarkup/quoted-angry.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/quoted-angry.txt @@ -0,0 +1,5 @@ +>>> REQUESTING CHANGES BECAUSE I'M ANGRY! +~~~~~~~~~~ +

REQUESTING CHANGES BECAUSE I'M ANGRY!

+~~~~~~~~~~ +>>> REQUESTING CHANGES BECAUSE I'M ANGRY! diff --git a/src/markup/engine/__tests__/remarkup/quoted-code-block.txt b/src/markup/engine/__tests__/remarkup/quoted-code-block.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/quoted-code-block.txt @@ -0,0 +1,16 @@ +> This should be a code block: +> +> ```lang=php +> $foo = 'bar'; +> ``` +~~~~~~~~~~ +

This should be a code block:

+ +
<?php
+$foo = 'bar';
+~~~~~~~~~~ +> This should be a code block: +> +> $foo = 'bar'; diff --git a/src/markup/engine/__tests__/remarkup/quotes.txt b/src/markup/engine/__tests__/remarkup/quotes.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/quotes.txt @@ -0,0 +1,9 @@ +> Dear Sir, +> I am utterly disgusted with the quality +> of your inflight food service. +~~~~~~~~~~ +

Dear Sir, + I am utterly disgusted with the quality + of your inflight food service.

+~~~~~~~~~~ +> Dear Sir, I am utterly disgusted with the quality of your inflight food service. diff --git a/src/markup/engine/__tests__/remarkup/raw-escape.txt b/src/markup/engine/__tests__/remarkup/raw-escape.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/raw-escape.txt @@ -0,0 +1,17 @@ +~1~ + +~2Z + +~a +~~~~~~~~~~ +

~1~

+ +

~2Z

+ +

~a

+~~~~~~~~~~ +~1~ + +~2Z + +~a diff --git a/src/markup/engine/__tests__/remarkup/reply-basic.txt b/src/markup/engine/__tests__/remarkup/reply-basic.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/reply-basic.txt @@ -0,0 +1,12 @@ +>>! In comment #123, alincoln wrote: +> Four score and twenty years ago... +~~~~~~~~~~ +
+
In comment #123, alincoln wrote:
+

Four score and twenty years ago...

+
+~~~~~~~~~~ +In comment #123, alincoln wrote: + +> Four score and twenty years ago... + diff --git a/src/markup/engine/__tests__/remarkup/reply-nested.txt b/src/markup/engine/__tests__/remarkup/reply-nested.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/reply-nested.txt @@ -0,0 +1,50 @@ +>>! Previously, fruit: +> +> - Apple +> - Banana +> - Cherry +> +>>>! More previously, vegetables: +>> +>> - Potato +>> - Potato +>> - Potato +> +> The end. + +~~~~~~~~~~ +
+
Previously, fruit:
+
    +
  • Apple
  • +
  • Banana
  • +
  • Cherry
  • +
+ +
+
More previously, vegetables:
+
    +
  • Potato
  • +
  • Potato
  • +
  • Potato
  • +
+
+ +

The end.

+
+~~~~~~~~~~ +Previously, fruit: + +> - Apple +> - Banana +> - Cherry +> +> More previously, vegetables: +> +> > - Potato +> > - Potato +> > - Potato +> +> +> The end. + diff --git a/src/markup/engine/__tests__/remarkup/simple-table-with-empty-row.txt b/src/markup/engine/__tests__/remarkup/simple-table-with-empty-row.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/simple-table-with-empty-row.txt @@ -0,0 +1,13 @@ +| Alpaca | +| | +| Zebra | +~~~~~~~~~~ +
+ + + +
Alpaca
Zebra
+~~~~~~~~~~ +| Alpaca | +| | +| Zebra | diff --git a/src/markup/engine/__tests__/remarkup/simple-table-with-leading-space.txt b/src/markup/engine/__tests__/remarkup/simple-table-with-leading-space.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/simple-table-with-leading-space.txt @@ -0,0 +1,7 @@ + |a|b| +~~~~~~~~~~ +
+ +
ab
+~~~~~~~~~~ +| a | b | diff --git a/src/markup/engine/__tests__/remarkup/simple-table-with-link.txt b/src/markup/engine/__tests__/remarkup/simple-table-with-link.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/simple-table-with-link.txt @@ -0,0 +1,7 @@ +| [[ http://example.com | name ]] | [x] | +~~~~~~~~~~ +
+ +
name[x]
+~~~~~~~~~~ +| name | [x] | diff --git a/src/markup/engine/__tests__/remarkup/simple-table.txt b/src/markup/engine/__tests__/remarkup/simple-table.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/simple-table.txt @@ -0,0 +1,24 @@ +| analyze_resources | original | mobile only | www only | both | +| | -------- | ----------- | -------- | ---- | +| //real// | 31 s | 24 s | 31 s | 31 s +| -------- +| //user// | 49 s | 25 s | 31 s | 49 s +| -------- +| //sys// | 24 s | 12 s | 13 s | 24 s +| ------- +~~~~~~~~~~ +
+ + + + +
analyze_resourcesoriginalmobile onlywww onlyboth
real31 s24 s31 s31 s
user49 s25 s31 s49 s
sys24 s12 s13 s24 s
+~~~~~~~~~~ +| analyze_resources | original | mobile only | www only | both | +| | -------- | ----------- | -------- | ---- | +| //real// | 31 s | 24 s | 31 s | 31 s | +| ----------------- | | | | | +| //user// | 49 s | 25 s | 31 s | 49 s | +| ----------------- | | | | | +| //sys// | 24 s | 12 s | 13 s | 24 s | +| ----------------- | | | | | diff --git a/src/markup/engine/__tests__/remarkup/simple.txt b/src/markup/engine/__tests__/remarkup/simple.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/simple.txt @@ -0,0 +1,5 @@ +hello +~~~~~~~~~~ +

hello

+~~~~~~~~~~ +hello diff --git a/src/markup/engine/__tests__/remarkup/table-with-leading-space.txt b/src/markup/engine/__tests__/remarkup/table-with-leading-space.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/table-with-leading-space.txt @@ -0,0 +1,7 @@ +
cell
+~~~~~~~~~~ +
+ +
cell
+~~~~~~~~~~ +| cell | diff --git a/src/markup/engine/__tests__/remarkup/table-with-long-header.txt b/src/markup/engine/__tests__/remarkup/table-with-long-header.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/table-with-long-header.txt @@ -0,0 +1,8 @@ +|x| +||-- +~~~~~~~~~~ +
+ +
x
+~~~~~~~~~~ +| x | diff --git a/src/markup/engine/__tests__/remarkup/table.txt b/src/markup/engine/__tests__/remarkup/table.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/table.txt @@ -0,0 +1,16 @@ + + + + +
TableStorage
`differential_diff`InnoDB
`edge`?
+~~~~~~~~~~ +
+ + + +
TableStorage
differential_diffInnoDB
edge?
+~~~~~~~~~~ +| Table | Storage | +| ------------------- | ------- | +| `differential_diff` | InnoDB | +| `edge` | ? | diff --git a/src/markup/engine/__tests__/remarkup/tick-block-multi.txt b/src/markup/engine/__tests__/remarkup/tick-block-multi.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/tick-block-multi.txt @@ -0,0 +1,18 @@ +```code + +more code + +more code``` + +~~~~~~~~~~ +
code
+
+more code
+
+more code
+~~~~~~~~~~ + code + + more code + + more code diff --git a/src/markup/engine/__tests__/remarkup/tick-block.txt b/src/markup/engine/__tests__/remarkup/tick-block.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/tick-block.txt @@ -0,0 +1,5 @@ +```code``` +~~~~~~~~~~ +
code
+~~~~~~~~~~ + code diff --git a/src/markup/engine/__tests__/remarkup/toc.txt b/src/markup/engine/__tests__/remarkup/toc.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/toc.txt @@ -0,0 +1,29 @@ += [[ http://www.example.com/ | link_name ]] = + +== **bold** == + += http://www.example.com = + +~~~~~~~~~~ + + +

link_name

+ +

bold

+ +

http://www.example.com

+~~~~~~~~~~ +[[ http://www.example.com/ | link_name ]] +========================================= + +**bold** +-------- + +http://www.example.com +====================== diff --git a/src/markup/engine/__tests__/remarkup/trailing-whitespace-codeblock.txt b/src/markup/engine/__tests__/remarkup/trailing-whitespace-codeblock.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/trailing-whitespace-codeblock.txt @@ -0,0 +1,39 @@ + lang=txt + code block + code block + + + + + code block + + + + + code block +~~~~~~~~~~ +
code block
+code block
+
+
+
+
+code block
+
+
+          
+
+code block
+~~~~~~~~~~ + code block + code block + + + + + code block + + + + + code block diff --git a/src/markup/engine/__tests__/remarkup/underline.txt b/src/markup/engine/__tests__/remarkup/underline.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/underline.txt @@ -0,0 +1,13 @@ +omg__ wtf_____ bbq___ lol__ +__underlined text__ +__This is a great idea___ die forever please +__ +/__notunderlined__/ and also /__notunderlined__.c +~~~~~~~~~~ +

omg__ wtf_____ bbq___ lol__ +underlined text +This is a great idea_ die forever please +__ +/__notunderlined__/ and also /__notunderlined__.c

+~~~~~~~~~~ +omg__ wtf_____ bbq___ lol__ __underlined text__ __This is a great idea___ die forever please __ /__notunderlined__/ and also /__notunderlined__.c diff --git a/src/markup/engine/__tests__/remarkup/warning.txt b/src/markup/engine/__tests__/remarkup/warning.txt new file mode 100644 --- /dev/null +++ b/src/markup/engine/__tests__/remarkup/warning.txt @@ -0,0 +1,15 @@ +WARNING: interesting **stuff** + +(WARNING) interesting **stuff** +~~~~~~~~~~ +
WARNING: interesting stuff
+ + + +
interesting stuff
+~~~~~~~~~~ +WARNING: interesting **stuff** + + + +(WARNING) interesting **stuff** diff --git a/src/markup/engine/remarkup/PhutilRemarkupBlockStorage.php b/src/markup/engine/remarkup/PhutilRemarkupBlockStorage.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/PhutilRemarkupBlockStorage.php @@ -0,0 +1,77 @@ +\11Z
+ * + * Then: + * + * ... + * + * If we didn't do this, the italics rule could match the "//" in "http://", + * or any other number of processing mistakes could occur, some of which create + * security risks. + * + * This class generates keys, and stores the map of keys to replacement text. + */ +final class PhutilRemarkupBlockStorage extends Phobject { + + const MAGIC_BYTE = "\1"; + + private $map = array(); + private $index; + + public function store($text) { + $key = self::MAGIC_BYTE.(++$this->index).'Z'; + $this->map[$key] = $text; + return $key; + } + + public function restore($corpus, $text_mode = false) { + if ($this->map) { + if ($text_mode) { + $corpus = str_replace( + array_reverse(array_keys($this->map)), + array_reverse($this->map), + $corpus); + } else { + $corpus = phutil_safe_html(str_replace( + array_reverse(array_keys($this->map)), + array_map('phutil_escape_html', array_reverse($this->map)), + phutil_escape_html($corpus))); + } + } + return $corpus; + } + + public function overwrite($key, $new_text) { + $this->map[$key] = $new_text; + return $this; + } + + public function getMap() { + return $this->map; + } + + public function setMap(array $map) { + $this->map = $map; + return $this; + } + +} diff --git a/src/markup/engine/remarkup/blockrule/PhutilRemarkupBlockInterpreter.php b/src/markup/engine/remarkup/blockrule/PhutilRemarkupBlockInterpreter.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/blockrule/PhutilRemarkupBlockInterpreter.php @@ -0,0 +1,36 @@ +engine = $engine; + return $this; + } + + final public function getEngine() { + return $this->engine; + } + + /** + * @return string + */ + abstract public function getInterpreterName(); + + abstract public function markupContent($content, array $argv); + + protected function markupError($string) { + if ($this->getEngine()->isTextMode()) { + return '('.$string.')'; + } else { + return phutil_tag( + 'div', + array( + 'class' => 'remarkup-interpreter-error', + ), + $string); + } + } + +} diff --git a/src/markup/engine/remarkup/blockrule/PhutilRemarkupBlockRule.php b/src/markup/engine/remarkup/blockrule/PhutilRemarkupBlockRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/blockrule/PhutilRemarkupBlockRule.php @@ -0,0 +1,170 @@ +addInt($this->getPriority()) + ->addString(get_class($this)); + } + + abstract public function markupText($text, $children); + + /** + * This will get an array of unparsed lines and return the number of lines + * from the first array value that it can parse. + * + * @param array $lines + * @param int $cursor + * + * @return int + */ + abstract public function getMatchingLineCount(array $lines, $cursor); + + protected function didMarkupText() { + return; + } + + final public function setEngine(PhutilRemarkupEngine $engine) { + $this->engine = $engine; + $this->updateRules(); + return $this; + } + + final protected function getEngine() { + return $this->engine; + } + + public function setMarkupRules(array $rules) { + assert_instances_of($rules, 'PhutilRemarkupRule'); + $this->rules = $rules; + $this->updateRules(); + return $this; + } + + private function updateRules() { + $engine = $this->getEngine(); + if ($engine) { + $this->rules = msort($this->rules, 'getPriority'); + foreach ($this->rules as $rule) { + $rule->setEngine($engine); + } + } + return $this; + } + + final public function getMarkupRules() { + return $this->rules; + } + + final public function postprocess() { + $this->didMarkupText(); + } + + final protected function applyRules($text) { + foreach ($this->getMarkupRules() as $rule) { + $text = $rule->apply($text); + } + return $text; + } + + public function supportsChildBlocks() { + return false; + } + + public function extractChildText($text) { + throw new PhutilMethodNotImplementedException(); + } + + protected function renderRemarkupTable(array $out_rows) { + assert_instances_of($out_rows, 'array'); + + if ($this->getEngine()->isTextMode()) { + $lengths = array(); + foreach ($out_rows as $r => $row) { + foreach ($row['content'] as $c => $cell) { + $text = $this->getEngine()->restoreText($cell['content']); + $lengths[$c][$r] = phutil_utf8_strlen($text); + } + } + $max_lengths = array_map('max', $lengths); + + $out = array(); + foreach ($out_rows as $r => $row) { + $headings = false; + foreach ($row['content'] as $c => $cell) { + $length = $max_lengths[$c] - $lengths[$c][$r]; + $out[] = '| '.$cell['content'].str_repeat(' ', $length).' '; + if ($cell['type'] == 'th') { + $headings = true; + } + } + $out[] = "|\n"; + + if ($headings) { + foreach ($row['content'] as $c => $cell) { + $char = ($cell['type'] == 'th' ? '-' : ' '); + $out[] = '| '.str_repeat($char, $max_lengths[$c]).' '; + } + $out[] = "|\n"; + } + } + + return rtrim(implode('', $out), "\n"); + } + + if ($this->getEngine()->isHTMLMailMode()) { + $table_attributes = array( + 'style' => 'border-collapse: separate; + border-spacing: 1px; + background: #d3d3d3; + margin: 12px 0;', + ); + $cell_attributes = array( + 'style' => 'background: #ffffff; + padding: 3px 6px;', + ); + } else { + $table_attributes = array( + 'class' => 'remarkup-table', + ); + $cell_attributes = array(); + } + + $out = array(); + $out[] = "\n"; + foreach ($out_rows as $row) { + $cells = array(); + foreach ($row['content'] as $cell) { + $cells[] = phutil_tag( + $cell['type'], + $cell_attributes, + $cell['content']); + } + $out[] = phutil_tag($row['type'], array(), $cells); + $out[] = "\n"; + } + + $table = phutil_tag('table', $table_attributes, $out); + return phutil_tag_div('remarkup-table-wrap', $table); + } + +} diff --git a/src/markup/engine/remarkup/blockrule/PhutilRemarkupCodeBlockRule.php b/src/markup/engine/remarkup/blockrule/PhutilRemarkupCodeBlockRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/blockrule/PhutilRemarkupCodeBlockRule.php @@ -0,0 +1,252 @@ + false, + 'lang' => null, + 'name' => null, + 'lines' => null, + ); + + $parser = new PhutilSimpleOptions(); + $custom = $parser->parse(head($lines)); + if ($custom) { + $valid = true; + foreach ($custom as $key => $value) { + if (!array_key_exists($key, $options)) { + $valid = false; + break; + } + } + if ($valid) { + array_shift($lines); + $options = $custom + $options; + } + } + + // Normalize the text back to a 0-level indent. + $min_indent = 80; + foreach ($lines as $line) { + for ($ii = 0; $ii < strlen($line); $ii++) { + if ($line[$ii] != ' ') { + $min_indent = min($ii, $min_indent); + break; + } + } + } + + $text = implode("\n", $lines); + if ($min_indent) { + $indent_string = str_repeat(' ', $min_indent); + $text = preg_replace('/^'.$indent_string.'/m', '', $text); + } + + if ($this->getEngine()->isTextMode()) { + $out = array(); + + $header = array(); + if ($options['counterexample']) { + $header[] = 'counterexample'; + } + if ($options['name'] != '') { + $header[] = 'name='.$options['name']; + } + if ($header) { + $out[] = implode(', ', $header); + } + + $text = preg_replace('/^/m', ' ', $text); + $out[] = $text; + + return implode("\n", $out); + } + + if (empty($options['lang'])) { + // If the user hasn't specified "lang=..." explicitly, try to guess the + // language. If we fail, fall back to configured defaults. + $lang = PhutilLanguageGuesser::guessLanguage($text); + if (!$lang) { + $lang = nonempty( + $this->getEngine()->getConfig('phutil.codeblock.language-default'), + 'text'); + } + $options['lang'] = $lang; + } + + $code_body = $this->highlightSource($text, $options); + + $name_header = null; + $block_style = null; + if ($this->getEngine()->isHTMLMailMode()) { + $map = $this->getEngine()->getConfig('phutil.codeblock.style-map'); + + if ($map) { + $raw_body = id(new PhutilPygmentizeParser()) + ->setMap($map) + ->parse((string)$code_body); + $code_body = phutil_safe_html($raw_body); + } + + $style_rules = array( + 'padding: 6px 12px;', + 'font-size: 13px;', + 'font-weight: bold;', + 'display: inline-block;', + 'border-top-left-radius: 3px;', + 'border-top-right-radius: 3px;', + 'color: rgba(0,0,0,.75);', + ); + + if ($options['counterexample']) { + $style_rules[] = 'background: #f7e6e6'; + } else { + $style_rules[] = 'background: rgba(71, 87, 120, 0.08);'; + } + + $header_attributes = array( + 'style' => implode(' ', $style_rules), + ); + + $block_style = 'margin: 12px 0;'; + } else { + $header_attributes = array( + 'class' => 'remarkup-code-header', + ); + } + + if ($options['name']) { + $name_header = phutil_tag( + 'div', + $header_attributes, + $options['name']); + } + + $class = 'remarkup-code-block'; + if ($options['counterexample']) { + $class = 'remarkup-code-block code-block-counterexample'; + } + + $attributes = array( + 'class' => $class, + 'style' => $block_style, + 'data-code-lang' => $options['lang'], + 'data-sigil' => 'remarkup-code-block', + ); + + return phutil_tag( + 'div', + $attributes, + array($name_header, $code_body)); + } + + private function highlightSource($text, array $options) { + if ($options['counterexample']) { + $aux_class = ' remarkup-counterexample'; + } else { + $aux_class = null; + } + + $aux_style = null; + + if ($this->getEngine()->isHTMLMailMode()) { + $aux_style = array( + 'font: 11px/15px "Menlo", "Consolas", "Monaco", monospace;', + 'padding: 12px;', + 'margin: 0;', + ); + + if ($options['counterexample']) { + $aux_style[] = 'background: #f7e6e6;'; + } else { + $aux_style[] = 'background: rgba(71, 87, 120, 0.08);'; + } + + $aux_style = implode(' ', $aux_style); + } + + if ($options['lines']) { + // Put a minimum size on this because the scrollbar is otherwise + // unusable. + $height = max(6, (int)$options['lines']); + $aux_style = $aux_style + .' ' + .'max-height: ' + .(2 * $height) + .'em; overflow: auto;'; + } + + $engine = $this->getEngine()->getConfig('syntax-highlighter.engine'); + if (!$engine) { + $engine = 'PhutilDefaultSyntaxHighlighterEngine'; + } + $engine = newv($engine, array()); + $engine->setConfig( + 'pygments.enabled', + $this->getEngine()->getConfig('pygments.enabled')); + return phutil_tag( + 'pre', + array( + 'class' => 'remarkup-code'.$aux_class, + 'style' => $aux_style, + ), + PhutilSafeHTML::applyFunction( + 'rtrim', + $engine->highlightSource($options['lang'], $text))); + } + +} diff --git a/src/markup/engine/remarkup/blockrule/PhutilRemarkupDefaultBlockRule.php b/src/markup/engine/remarkup/blockrule/PhutilRemarkupDefaultBlockRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/blockrule/PhutilRemarkupDefaultBlockRule.php @@ -0,0 +1,44 @@ +getEngine(); + + $text = trim($text); + $text = $this->applyRules($text); + + if ($engine->isTextMode()) { + if (!$this->getEngine()->getConfig('preserve-linebreaks')) { + $text = preg_replace('/ *\n */', ' ', $text); + } + return $text; + } + + if ($engine->getConfig('preserve-linebreaks')) { + $text = phutil_escape_html_newlines($text); + } + + if (!strlen($text)) { + return null; + } + + $default_attributes = $engine->getConfig('default.p.attributes'); + if ($default_attributes) { + $attributes = $default_attributes; + } else { + $attributes = array(); + } + + return phutil_tag('p', $attributes, $text); + } + +} diff --git a/src/markup/engine/remarkup/blockrule/PhutilRemarkupHeaderBlockRule.php b/src/markup/engine/remarkup/blockrule/PhutilRemarkupHeaderBlockRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/blockrule/PhutilRemarkupHeaderBlockRule.php @@ -0,0 +1,162 @@ + 1) { + $level = ($lines[1][0] == '=') ? 1 : 2; + $text = trim($lines[0]); + } else { + $level = 0; + for ($ii = 0; $ii < min(5, strlen($text)); $ii++) { + if ($text[$ii] == '=' || $text[$ii] == '#') { + ++$level; + } else { + break; + } + } + $text = trim($text, ' =#'); + } + + $engine = $this->getEngine(); + + if ($engine->isTextMode()) { + $char = ($level == 1) ? '=' : '-'; + return $text."\n".str_repeat($char, phutil_utf8_strlen($text)); + } + + $use_anchors = $engine->getConfig('header.generate-toc'); + + $anchor = null; + if ($use_anchors) { + $anchor = $this->generateAnchor($level, $text); + } + + $text = phutil_tag( + 'h'.($level + 1), + array( + 'class' => 'remarkup-header', + ), + array($anchor, $this->applyRules($text))); + + return $text; + } + + private function generateAnchor($level, $text) { + $anchor = strtolower($text); + $anchor = preg_replace('/[^a-z0-9]/', '-', $anchor); + $anchor = preg_replace('/--+/', '-', $anchor); + $anchor = trim($anchor, '-'); + $anchor = substr($anchor, 0, 24); + $anchor = trim($anchor, '-'); + $base = $anchor; + + $key = self::KEY_HEADER_TOC; + $engine = $this->getEngine(); + $anchors = $engine->getTextMetadata($key, array()); + + $suffix = 1; + while (!strlen($anchor) || isset($anchors[$anchor])) { + $anchor = $base.'-'.$suffix; + $anchor = trim($anchor, '-'); + $suffix++; + } + + // When a document contains a link inside a header, like this: + // + // = [[ http://wwww.example.com/ | example ]] = + // + // ...we want to generate a TOC entry with just "example", but link the + // header itself. We push the 'toc' state so all the link rules generate + // just names. + $engine->pushState('toc'); + $text = $this->applyRules($text); + $text = $engine->restoreText($text); + + $anchors[$anchor] = array($level, $text); + $engine->popState('toc'); + + $engine->setTextMetadata($key, $anchors); + + return phutil_tag( + 'a', + array( + 'name' => $anchor, + ), + ''); + } + + public static function renderTableOfContents(PhutilRemarkupEngine $engine) { + + $key = self::KEY_HEADER_TOC; + $anchors = $engine->getTextMetadata($key, array()); + + if (count($anchors) < 2) { + // Don't generate a TOC if there are no headers, or if there's only + // one header (since such a TOC would be silly). + return null; + } + + $depth = 0; + $toc = array(); + foreach ($anchors as $anchor => $info) { + list($level, $name) = $info; + + while ($depth < $level) { + $toc[] = hsprintf('
    '); + $depth++; + } + while ($depth > $level) { + $toc[] = hsprintf('
'); + $depth--; + } + + $toc[] = phutil_tag( + 'li', + array(), + phutil_tag( + 'a', + array( + 'href' => '#'.$anchor, + ), + $name)); + } + while ($depth > 0) { + $toc[] = hsprintf(''); + $depth--; + } + + return phutil_implode_html("\n", $toc); + } + +} diff --git a/src/markup/engine/remarkup/blockrule/PhutilRemarkupHorizontalRuleBlockRule.php b/src/markup/engine/remarkup/blockrule/PhutilRemarkupHorizontalRuleBlockRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/blockrule/PhutilRemarkupHorizontalRuleBlockRule.php @@ -0,0 +1,37 @@ +getEngine()->isTextMode()) { + return rtrim($text); + } + + return phutil_tag('hr', array('class' => 'remarkup-hr')); + } + +} diff --git a/src/markup/engine/remarkup/blockrule/PhutilRemarkupInlineBlockRule.php b/src/markup/engine/remarkup/blockrule/PhutilRemarkupInlineBlockRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/blockrule/PhutilRemarkupInlineBlockRule.php @@ -0,0 +1,13 @@ +applyRules($text); + } + +} diff --git a/src/markup/engine/remarkup/blockrule/PhutilRemarkupInterpreterBlockRule.php b/src/markup/engine/remarkup/blockrule/PhutilRemarkupInterpreterBlockRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/blockrule/PhutilRemarkupInterpreterBlockRule.php @@ -0,0 +1,89 @@ +parse($matches[2]); + } + + $interpreters = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhutilRemarkupBlockInterpreter') + ->execute(); + + foreach ($interpreters as $interpreter) { + $interpreter->setEngine($this->getEngine()); + } + + $lines[$first_key] = preg_replace( + self::START_BLOCK_PATTERN, + '', + $lines[$first_key]); + $lines[$last_key] = preg_replace( + self::END_BLOCK_PATTERN, + '', + $lines[$last_key]); + + if (trim($lines[$first_key]) === '') { + unset($lines[$first_key]); + } + if (trim($lines[$last_key]) === '') { + unset($lines[$last_key]); + } + + $content = implode("\n", $lines); + + $interpreters = mpull($interpreters, null, 'getInterpreterName'); + + if (isset($interpreters[$matches[1]])) { + return $interpreters[$matches[1]]->markupContent($content, $argv); + } + + $message = pht('No interpreter found: %s', $matches[1]); + + if ($this->getEngine()->isTextMode()) { + return '('.$message.')'; + } + + return phutil_tag( + 'div', + array( + 'class' => 'remarkup-interpreter-error', + ), + $message); + } + +} diff --git a/src/markup/engine/remarkup/blockrule/PhutilRemarkupListBlockRule.php b/src/markup/engine/remarkup/blockrule/PhutilRemarkupListBlockRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/blockrule/PhutilRemarkupListBlockRule.php @@ -0,0 +1,567 @@ + $line) { + $matches = null; + if (preg_match($regex, $line)) { + $regex = self::CONT_BLOCK_PATTERN; + if (preg_match('/^(\s+)/', $line, $matches)) { + $space = strlen($matches[1]); + } else { + $space = 0; + } + $min_space = min($min_space, $space); + } + } + + $regex = self::START_BLOCK_PATTERN; + if ($min_space) { + foreach ($lines as $key => $line) { + if (preg_match($regex, $line)) { + $regex = self::CONT_BLOCK_PATTERN; + $lines[$key] = substr($line, $min_space); + } + } + } + + + // The input text may have linewraps in it, like this: + // + // - derp derp derp derp + // derp derp derp derp + // - blarp blarp blarp blarp + // + // Group text lines together into list items, stored in $items. So the + // result in the above case will be: + // + // array( + // array( + // "- derp derp derp derp", + // " derp derp derp derp", + // ), + // array( + // "- blarp blarp blarp blarp", + // ), + // ); + + $item = array(); + $starts_at = null; + $regex = self::START_BLOCK_PATTERN; + foreach ($lines as $line) { + $match = null; + if (preg_match($regex, $line, $match)) { + if (!$starts_at && !empty($match[1])) { + $starts_at = $match[1]; + } + $regex = self::CONT_BLOCK_PATTERN; + if ($item) { + $items[] = $item; + $item = array(); + } + } + $item[] = $line; + } + if ($item) { + $items[] = $item; + } + if (!$starts_at) { + $starts_at = 1; + } + + + // Process each item to normalize the text, remove line wrapping, and + // determine its depth (indentation level) and style (ordered vs unordered). + // + // We preserve consecutive linebreaks and interpret them as paragraph + // breaks. + // + // Given the above example, the processed array will look like: + // + // array( + // array( + // 'text' => 'derp derp derp derp derp derp derp derp', + // 'depth' => 0, + // 'style' => '-', + // ), + // array( + // 'text' => 'blarp blarp blarp blarp', + // 'depth' => 0, + // 'style' => '-', + // ), + // ); + + $has_marks = false; + foreach ($items as $key => $item) { + // Trim space around newlines, to strip trailing whitespace and formatting + // indentation. + $item = preg_replace('/ *(\n+) */', '\1', implode("\n", $item)); + + // Replace single newlines with a space. Preserve multiple newlines as + // paragraph breaks. + $item = preg_replace('/(? $text, + 'depth' => $depth, + 'style' => $style, + 'mark' => $mark, + ); + } + $items = array_values($items); + + + // Users can create a sub-list by indenting any deeper amount than the + // previous list, so these are both valid: + // + // - a + // - b + // + // - a + // - b + // + // In the former case, we'll have depths (0, 2). In the latter case, depths + // (0, 4). We don't actually care about how many spaces there are, only + // how many list indentation levels (that is, we want to map both of + // those cases to (0, 1), indicating "outermost list" and "first sublist"). + // + // This is made more complicated because lists at two different indentation + // levels might be at the same list level: + // + // - a + // - b + // - c + // - d + // + // Here, 'b' and 'd' are at the same list level (2) but different indent + // levels (2, 4). + // + // Users can also create "staircases" like this: + // + // - a + // - b + // # c + // + // While this is silly, we'd like to render it as faithfully as possible. + // + // In order to do this, we convert the list of nodes into a tree, + // normalizing indentation levels and inserting dummy nodes as necessary to + // make the tree well-formed. See additional notes at buildTree(). + // + // In the case above, the result is a tree like this: + // + // - + // - + // - a + // - b + // # c + + $l = 0; + $r = count($items); + $tree = $this->buildTree($items, $l, $r, $cur_level = 0); + + + // We may need to open a list on a node, but they do not have + // list style information yet. We need to propagate list style information + // backward through the tree. In the above example, the tree now looks + // like this: + // + // - + // - + // - a + // - b + // # c + + $this->adjustTreeStyleInformation($tree); + + // Finally, we have enough information to render the tree. + + $out = $this->renderTree($tree, 0, $has_marks, $starts_at); + + if ($this->getEngine()->isTextMode()) { + $out = implode('', $out); + $out = rtrim($out, "\n"); + $out = preg_replace('/ +$/m', '', $out); + return $out; + } + + return phutil_implode_html('', $out); + } + + /** + * See additional notes in @{method:markupText}. + */ + private function buildTree(array $items, $l, $r, $cur_level) { + if ($l == $r) { + return array(); + } + + if ($cur_level > self::MAXIMUM_LIST_NESTING_DEPTH) { + // This algorithm is recursive and we don't need you blowing the stack + // with your oh-so-clever 50,000-item-deep list. Cap indentation levels + // at a reasonable number and just shove everything deeper up to this + // level. + $nodes = array(); + for ($ii = $l; $ii < $r; $ii++) { + $nodes[] = array( + 'level' => $cur_level, + 'items' => array(), + ) + $items[$ii]; + } + return $nodes; + } + + $min = $l; + for ($ii = $r - 1; $ii >= $l; $ii--) { + if ($items[$ii]['depth'] <= $items[$min]['depth']) { + $min = $ii; + } + } + + $min_depth = $items[$min]['depth']; + + $nodes = array(); + if ($min != $l) { + $nodes[] = array( + 'text' => null, + 'level' => $cur_level, + 'style' => null, + 'mark' => null, + 'items' => $this->buildTree($items, $l, $min, $cur_level + 1), + ); + } + + $last = $min; + for ($ii = $last + 1; $ii < $r; $ii++) { + if ($items[$ii]['depth'] == $min_depth) { + $nodes[] = array( + 'level' => $cur_level, + 'items' => $this->buildTree($items, $last + 1, $ii, $cur_level + 1), + ) + $items[$last]; + $last = $ii; + } + } + $nodes[] = array( + 'level' => $cur_level, + 'items' => $this->buildTree($items, $last + 1, $r, $cur_level + 1), + ) + $items[$last]; + + return $nodes; + } + + + /** + * See additional notes in @{method:markupText}. + */ + private function adjustTreeStyleInformation(array &$tree) { + // The effect here is just to walk backward through the nodes at this level + // and apply the first style in the list to any empty nodes we inserted + // before it. As we go, also recurse down the tree. + + $style = '-'; + for ($ii = count($tree) - 1; $ii >= 0; $ii--) { + if ($tree[$ii]['style'] !== null) { + // This is the earliest node we've seen with style, so set the + // style to its style. + $style = $tree[$ii]['style']; + } else { + // This node has no style, so apply the current style. + $tree[$ii]['style'] = $style; + } + if ($tree[$ii]['items']) { + $this->adjustTreeStyleInformation($tree[$ii]['items']); + } + } + } + + + /** + * See additional notes in @{method:markupText}. + */ + private function renderTree( + array $tree, + $level, + $has_marks, + $starts_at = 1) { + + $style = idx(head($tree), 'style'); + + $out = array(); + + if (!$this->getEngine()->isTextMode()) { + switch ($style) { + case '#': + $tag = 'ol'; + break; + case '-': + $tag = 'ul'; + break; + } + + $start_attr = null; + if (ctype_digit($starts_at) && $starts_at > 1) { + $start_attr = hsprintf(' start="%d"', $starts_at); + } + + if ($has_marks) { + $out[] = hsprintf( + '<%s class="remarkup-list remarkup-list-with-checkmarks"%s>', + $tag, + $start_attr); + } else { + $out[] = hsprintf( + '<%s class="remarkup-list"%s>', + $tag, + $start_attr); + } + + $out[] = "\n"; + } + + $number = $starts_at; + foreach ($tree as $item) { + if ($this->getEngine()->isTextMode()) { + if ($item['text'] === null) { + // Don't render anything. + } else { + $indent = str_repeat(' ', 2 * $level); + $out[] = $indent; + if ($item['mark'] !== null) { + if ($item['mark']) { + $out[] = '[X] '; + } else { + $out[] = '[ ] '; + } + } else { + switch ($style) { + case '#': + $out[] = $number.'. '; + $number++; + break; + case '-': + $out[] = '- '; + break; + } + } + + $parts = preg_split('/\n{2,}/', $item['text']); + foreach ($parts as $key => $part) { + if ($key != 0) { + $out[] = "\n\n ".$indent; + } + $out[] = $this->applyRules($part); + } + $out[] = "\n"; + } + } else { + if ($item['text'] === null) { + $out[] = hsprintf('
  • '); + } else { + if ($item['mark'] !== null) { + if ($item['mark'] == true) { + $out[] = hsprintf( + '
  • '); + } else { + $out[] = hsprintf( + '
  • '); + } + $out[] = phutil_tag( + 'input', + array( + 'type' => 'checkbox', + 'checked' => ($item['mark'] ? 'checked' : null), + 'disabled' => 'disabled', + )); + $out[] = ' '; + } else { + $out[] = hsprintf('
  • '); + } + + $parts = preg_split('/\n{2,}/', $item['text']); + foreach ($parts as $key => $part) { + if ($key != 0) { + $out[] = array( + "\n", + phutil_tag('br'), + phutil_tag('br'), + "\n", + ); + } + $out[] = $this->applyRules($part); + } + } + } + + if ($item['items']) { + $subitems = $this->renderTree($item['items'], $level + 1, $has_marks); + foreach ($subitems as $i) { + $out[] = $i; + } + } + if (!$this->getEngine()->isTextMode()) { + $out[] = hsprintf("
  • \n"); + } + } + + if (!$this->getEngine()->isTextMode()) { + switch ($style) { + case '#': + $out[] = hsprintf(''); + break; + case '-': + $out[] = hsprintf(''); + break; + } + } + + return $out; + } + +} diff --git a/src/markup/engine/remarkup/blockrule/PhutilRemarkupLiteralBlockRule.php b/src/markup/engine/remarkup/blockrule/PhutilRemarkupLiteralBlockRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/blockrule/PhutilRemarkupLiteralBlockRule.php @@ -0,0 +1,93 @@ + $line) { + $line = preg_replace('/^\s*%%%/', '', $line); + $line = preg_replace('/%%%(\s*)\z/', '\1', $line); + $text[$key] = $line; + } + + if ($this->getEngine()->isTextMode()) { + return implode('', $text); + } + + return phutil_tag( + 'p', + array( + 'class' => 'remarkup-literal', + ), + phutil_implode_html(phutil_tag('br', array()), $text)); + } + +} diff --git a/src/markup/engine/remarkup/blockrule/PhutilRemarkupNoteBlockRule.php b/src/markup/engine/remarkup/blockrule/PhutilRemarkupNoteBlockRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/blockrule/PhutilRemarkupNoteBlockRule.php @@ -0,0 +1,121 @@ +getRegEx(), $lines[$cursor])) { + $num_lines++; + $cursor++; + + while (isset($lines[$cursor])) { + if (trim($lines[$cursor])) { + $num_lines++; + $cursor++; + continue; + } + break; + } + } + + return $num_lines; + } + + public function markupText($text, $children) { + $matches = array(); + preg_match($this->getRegEx(), $text, $matches); + + if (idx($matches, 'showword')) { + $word = $matches['showword']; + $show = true; + } else { + $word = $matches['hideword']; + $show = false; + } + + $class_suffix = phutil_utf8_strtolower($word); + + // This is the "(IMPORTANT)" or "NOTE:" part. + $word_part = rtrim(substr($text, 0, strlen($matches[0]))); + + // This is the actual text. + $text_part = substr($text, strlen($matches[0])); + $text_part = $this->applyRules(rtrim($text_part)); + + $text_mode = $this->getEngine()->isTextMode(); + $html_mail_mode = $this->getEngine()->isHTMLMailMode(); + if ($text_mode) { + return $word_part.' '.$text_part; + } + + if ($show) { + $content = array( + phutil_tag( + 'span', + array( + 'class' => 'remarkup-note-word', + ), + $word_part), + ' ', + $text_part, + ); + } else { + $content = $text_part; + } + + if ($html_mail_mode) { + if ($class_suffix == 'important') { + $attributes = array( + 'style' => 'margin: 16px 0; + padding: 12px; + border-left: 3px solid #c0392b; + background: #f4dddb;', + ); + } else if ($class_suffix == 'note') { + $attributes = array( + 'style' => 'margin: 16px 0; + padding: 12px; + border-left: 3px solid #2980b9; + background: #daeaf3;', + ); + } else if ($class_suffix == 'warning') { + $attributes = array( + 'style' => 'margin: 16px 0; + padding: 12px; + border-left: 3px solid #f1c40f; + background: #fdf5d4;', + ); + } + } else { + $attributes = array( + 'class' => 'remarkup-'.$class_suffix, + ); + } + + return phutil_tag( + 'div', + $attributes, + $content); + } + + private function getRegEx() { + $words = array( + 'NOTE', + 'IMPORTANT', + 'WARNING', + ); + + foreach ($words as $k => $word) { + $words[$k] = preg_quote($word, '/'); + } + $words = implode('|', $words); + + return + '/^(?:'. + '(?:\((?P'.$words.')\))'. + '|'. + '(?:(?P'.$words.'):))\s*'. + '/'; + } +} diff --git a/src/markup/engine/remarkup/blockrule/PhutilRemarkupQuotesBlockRule.php b/src/markup/engine/remarkup/blockrule/PhutilRemarkupQuotesBlockRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/blockrule/PhutilRemarkupQuotesBlockRule.php @@ -0,0 +1,65 @@ +/', $lines[$pos])) { + do { + ++$pos; + } while (isset($lines[$pos]) && preg_match('/^>/', $lines[$pos])); + } + + return ($pos - $cursor); + } + + public function supportsChildBlocks() { + return true; + } + + public function extractChildText($text) { + $text = phutil_split_lines($text, true); + foreach ($text as $key => $line) { + $text[$key] = substr($line, 1); + } + + return array('', implode('', $text)); + } + + public function markupText($text, $children) { + if ($this->getEngine()->isTextMode()) { + $lines = rtrim($children, "\n"); + $lines = phutil_split_lines($lines); + foreach ($lines as $key => $line) { + if (isset($line[0]) && ($line[0] == '>')) { + $line = '>'.$line; + } else { + $line = '> '.$line; + } + $lines[$key] = $line; + } + return implode('', $lines); + } + + $attributes = array(); + if ($this->getEngine()->isHTMLMailMode()) { + $style = array( + 'border-left: 3px solid #a7b5bf;', + 'color: #464c5c;', + 'font-style: italic;', + 'margin: 4px 0 12px 0;', + 'padding: 4px 12px;', + 'background-color: #f8f9fc;', + ); + + $attributes['style'] = implode(' ', $style); + } + + return phutil_tag( + 'blockquote', + $attributes, + $children); + } + +} diff --git a/src/markup/engine/remarkup/blockrule/PhutilRemarkupReplyBlockRule.php b/src/markup/engine/remarkup/blockrule/PhutilRemarkupReplyBlockRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/blockrule/PhutilRemarkupReplyBlockRule.php @@ -0,0 +1,117 @@ +>!/', $lines[$pos])) { + do { + ++$pos; + } while (isset($lines[$pos]) && preg_match('/^>/', $lines[$pos])); + } + + return ($pos - $cursor); + } + + public function supportsChildBlocks() { + return true; + } + + public function extractChildText($text) { + $text = phutil_split_lines($text, true); + + $head = array(); + $body = array(); + + $head = substr(reset($text), 3); + + $body = array_slice($text, 1); + + // Remove the carets. + foreach ($body as $key => $line) { + $body[$key] = substr($line, 1); + } + + // Strip leading empty lines. + foreach ($body as $key => $line) { + if (strlen(trim($line))) { + break; + } + unset($body[$key]); + } + + return array(trim($head), implode('', $body)); + } + + public function markupText($text, $children) { + $text = $this->applyRules($text); + + if ($this->getEngine()->isTextMode()) { + $children = phutil_split_lines($children, true); + foreach ($children as $key => $child) { + if (strlen(trim($child))) { + $children[$key] = '> '.$child; + } else { + $children[$key] = '>'.$child; + } + } + $children = implode('', $children); + + return $text."\n\n".$children; + } + + if ($this->getEngine()->isHTMLMailMode()) { + $block_attributes = array( + 'style' => 'border-left: 3px solid #8C98B8; + color: #6B748C; + font-style: italic; + margin: 4px 0 12px 0; + padding: 8px 12px; + background-color: #F8F9FC;', + ); + $head_attributes = array( + 'style' => 'font-style: normal; + padding-bottom: 4px;', + ); + $reply_attributes = array( + 'style' => 'margin: 0; + padding: 0; + border: 0; + color: rgb(107, 116, 140);', + ); + } else { + $block_attributes = array( + 'class' => 'remarkup-reply-block', + ); + $head_attributes = array( + 'class' => 'remarkup-reply-head', + ); + $reply_attributes = array( + 'class' => 'remarkup-reply-body', + ); + } + + return phutil_tag( + 'blockquote', + $block_attributes, + array( + "\n", + phutil_tag( + 'div', + $head_attributes, + $text), + "\n", + phutil_tag( + 'div', + $reply_attributes, + $children), + "\n", + )); + } + +} diff --git a/src/markup/engine/remarkup/blockrule/PhutilRemarkupSimpleTableBlockRule.php b/src/markup/engine/remarkup/blockrule/PhutilRemarkupSimpleTableBlockRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/blockrule/PhutilRemarkupSimpleTableBlockRule.php @@ -0,0 +1,96 @@ + cells + // instead of cells. + + // If it has other types of cells, it's always a content row. + + // If it has only empty cells, it's an empty row. + + if (strlen($cell)) { + if (preg_match('/^--+\z/', $cell)) { + $any_header = true; + } else { + $any_content = true; + } + } + + $cells[] = array('type' => 'td', 'content' => $this->applyRules($cell)); + } + + $is_header = ($any_header && !$any_content); + + if (!$is_header) { + $rows[] = array('type' => 'tr', 'content' => $cells); + } else if ($rows) { + // Mark previous row with headings. + foreach ($cells as $i => $cell) { + if ($cell['content']) { + $last_key = last_key($rows); + if (!isset($rows[$last_key]['content'][$i])) { + // If this row has more cells than the previous row, there may + // not be a cell above this one to turn into a . + continue; + } + + $rows[$last_key]['content'][$i]['type'] = 'th'; + } + } + } + } + + if (!$rows) { + return $this->applyRules($text); + } + + return $this->renderRemarkupTable($rows); + } + +} diff --git a/src/markup/engine/remarkup/blockrule/PhutilRemarkupTableBlockRule.php b/src/markup/engine/remarkup/blockrule/PhutilRemarkupTableBlockRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/blockrule/PhutilRemarkupTableBlockRule.php @@ -0,0 +1,107 @@ +/i', $lines[$cursor])) { + $num_lines++; + $cursor++; + + while (isset($lines[$cursor])) { + $num_lines++; + if (preg_match('@$@i', $lines[$cursor])) { + break; + } + $cursor++; + } + } + + return $num_lines; + } + + public function markupText($text, $children) { + $matches = array(); + + if (!preg_match('@^\s*(.*)
    $@si', $text, $matches)) { + return $this->fail( + $text, + pht('Bad table (expected %s)', '...
    ')); + } + + $body = $matches[1]; + + $row_fragment = '(?:\s*(.*)\s*)'; + $cell_fragment = '(?:\s*<(td|th)>(.*)\s*)'; + + // Test that the body contains only valid rows. + if (!preg_match('@^'.$row_fragment.'+$@Usi', $body)) { + return $this->fail( + $body, + pht('Bad table syntax (expected rows %s)', '...')); + } + + // Capture the rows. + $row_regex = '@'.$row_fragment.'@Usi'; + if (!preg_match_all($row_regex, $body, $matches, PREG_SET_ORDER)) { + throw new Exception( + pht('Bug in Remarkup tables, parsing fails for input: %s', $text)); + } + + $out_rows = array(); + + $rows = $matches; + foreach ($rows as $row) { + $content = $row[1]; + + // Test that the row contains only valid cells. + if (!preg_match('@^'.$cell_fragment.'+$@Usi', $content)) { + return $this->fail( + $content, + pht('Bad table syntax (expected cells %s)', '...')); + } + + // Capture the cells. + $cell_regex = '@'.$cell_fragment.'@Usi'; + if (!preg_match_all($cell_regex, $content, $matches, PREG_SET_ORDER)) { + throw new Exception( + pht('Bug in Remarkup tables, parsing fails for input: %s', $text)); + } + + $out_cells = array(); + foreach ($matches as $cell) { + $cell_type = $cell[1]; + $cell_content = $cell[2]; + + $out_cells[] = array( + 'type' => $cell_type, + 'content' => $this->applyRules($cell_content), + ); + } + + $out_rows[] = array( + 'type' => 'tr', + 'content' => $out_cells, + ); + } + + return $this->renderRemarkupTable($out_rows); + } + + private function fail($near, $message) { + $message = sprintf( + '%s near: %s', + $message, + id(new PhutilUTF8StringTruncator()) + ->setMaximumGlyphs(32000) + ->truncateString($near)); + + if ($this->getEngine()->isTextMode()) { + return '('.$message.')'; + } + + return hsprintf('
    %s
    ', $message); + } + +} diff --git a/src/markup/engine/remarkup/blockrule/PhutilRemarkupTestInterpreterRule.php b/src/markup/engine/remarkup/blockrule/PhutilRemarkupTestInterpreterRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/blockrule/PhutilRemarkupTestInterpreterRule.php @@ -0,0 +1,17 @@ +getEngine()->isTextMode()) { + return $text; + } + + return $this->replaceHTML( + '@\\*\\*(.+?)\\*\\*@s', + array($this, 'applyCallback'), + $text); + } + + protected function applyCallback(array $matches) { + return hsprintf('%s', $matches[1]); + } + +} diff --git a/src/markup/engine/remarkup/markuprule/PhutilRemarkupDelRule.php b/src/markup/engine/remarkup/markuprule/PhutilRemarkupDelRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/markuprule/PhutilRemarkupDelRule.php @@ -0,0 +1,24 @@ +getEngine()->isTextMode()) { + return $text; + } + + return $this->replaceHTML( + '@(?%s', $matches[1]); + } + +} diff --git a/src/markup/engine/remarkup/markuprule/PhutilRemarkupDocumentLinkRule.php b/src/markup/engine/remarkup/markuprule/PhutilRemarkupDocumentLinkRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/markuprule/PhutilRemarkupDocumentLinkRule.php @@ -0,0 +1,175 @@ +getEngine(); + + $is_anchor = false; + if (strncmp($link, '/', 1) == 0) { + $base = $engine->getConfig('uri.base'); + $base = rtrim($base, '/'); + $link = $base.$link; + } else if (strncmp($link, '#', 1) == 0) { + $here = $engine->getConfig('uri.here'); + $link = $here.$link; + + $is_anchor = true; + } + + if ($engine->isTextMode()) { + // If present, strip off "mailto:" or "tel:". + $link = preg_replace('/^(?:mailto|tel):/', '', $link); + + if (!strlen($name)) { + return $link; + } + + return $name.' <'.$link.'>'; + } + + if (!strlen($name)) { + $name = $link; + $name = preg_replace('/^(?:mailto|tel):/', '', $name); + } + + if ($engine->getState('toc')) { + return $name; + } + + $same_window = $engine->getConfig('uri.same-window', false); + if ($same_window) { + $target = null; + } else { + $target = '_blank'; + } + + // For anchors on the same page, always stay here. + if ($is_anchor) { + $target = null; + } + + return phutil_tag( + 'a', + array( + 'href' => $link, + 'class' => 'remarkup-link', + 'target' => $target, + 'rel' => 'noreferrer', + ), + $name); + } + + public function markupAlternateLink(array $matches) { + $uri = trim($matches[2]); + + // NOTE: We apply some special rules to avoid false positives here. The + // major concern is that we do not want to convert `x[0][1](y)` in a + // discussion about C source code into a link. To this end, we: + // + // - Don't match at word boundaries; + // - require the URI to contain a "/" character or "@" character; and + // - reject URIs which being with a quote character. + + if ($uri[0] == '"' || $uri[0] == "'" || $uri[0] == '`') { + return $matches[0]; + } + + if (!strlen($uri[0])) { + return $matches[0]; + } + + if (strpos($uri, '/') === false && + strpos($uri, '@') === false && + strncmp($uri, 'tel:', 4)) { + return $matches[0]; + } + + return $this->markupDocumentLink( + array( + $matches[0], + $matches[2], + $matches[1], + )); + } + + public function markupDocumentLink(array $matches) { + $uri = trim($matches[1]); + $name = trim(idx($matches, 2)); + + // If whatever is being linked to begins with "/" or "#", or has "://", + // or is "mailto:" or "tel:", treat it as a URI instead of a wiki page. + $is_uri = preg_match('@(^/)|(://)|(^#)|(^(?:mailto|tel):)@', $uri); + + if ($is_uri && strncmp('/', $uri, 1) && strncmp('#', $uri, 1)) { + $protocols = $this->getEngine()->getConfig( + 'uri.allowed-protocols', + array()); + + try { + $protocol = id(new PhutilURI($uri))->getProtocol(); + if (!idx($protocols, $protocol)) { + // Don't treat this as a URI if it's not an allowed protocol. + $is_uri = false; + } + } catch (Exception $ex) { + // We can end up here if we try to parse an ambiguous URI, see + // T12796. + $is_uri = false; + } + } + + // As a special case, skip "[[ / ]]" so that Phriction picks it up as a + // link to the Phriction root. It is more useful to be able to use this + // syntax to link to the root document than the home page of the install. + if ($uri == '/') { + $is_uri = false; + } + + if (!$is_uri) { + return $matches[0]; + } + + return $this->getEngine()->storeText($this->renderHyperlink($uri, $name)); + } + +} diff --git a/src/markup/engine/remarkup/markuprule/PhutilRemarkupEscapeRemarkupRule.php b/src/markup/engine/remarkup/markuprule/PhutilRemarkupEscapeRemarkupRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/markuprule/PhutilRemarkupEscapeRemarkupRule.php @@ -0,0 +1,19 @@ +getEngine()->storeText("\1"); + + return str_replace("\1", $replace, $text); + } + +} diff --git a/src/markup/engine/remarkup/markuprule/PhutilRemarkupHighlightRule.php b/src/markup/engine/remarkup/markuprule/PhutilRemarkupHighlightRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/markuprule/PhutilRemarkupHighlightRule.php @@ -0,0 +1,37 @@ +getEngine()->isTextMode()) { + return $text; + } + + return $this->replaceHTML( + '@!!(.+?)(!{2,})@', + array($this, 'applyCallback'), + $text); + } + + protected function applyCallback(array $matches) { + // Remove the two exclamation points that represent syntax. + $excitement = substr($matches[2], 2); + + // If the internal content consists of ONLY exclamation points, leave it + // untouched so "!!!!!" is five exclamation points instead of one + // highlighted exclamation point. + if (preg_match('/^!+\z/', $matches[1])) { + return $matches[0]; + } + + // $excitement now has two fewer !'s than we started with. + return hsprintf('%s%s', + $matches[1], $excitement); + + } + +} diff --git a/src/markup/engine/remarkup/markuprule/PhutilRemarkupHyperlinkRule.php b/src/markup/engine/remarkup/markuprule/PhutilRemarkupHyperlinkRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/markuprule/PhutilRemarkupHyperlinkRule.php @@ -0,0 +1,122 @@ +" around them get linked exactly, without + // the "<>". Angle brackets are basically special and mean "this is a URL + // with weird characters". This is assumed to be reasonable because they + // don't appear in normal text or normal URLs. + $text = preg_replace_callback( + '@<(\w{3,}://[^\s'.PhutilRemarkupBlockStorage::MAGIC_BYTE.']+?)>@', + array($this, 'markupHyperlink'), + $text); + + // Anything else we match "ungreedily", which means we'll look for + // stuff that's probably puncutation or otherwise not part of the URL and + // not link it. This lets someone write "QuicK! Go to + // http://www.example.com/!". We also apply some paren balancing rules. + + // NOTE: We're explicitly avoiding capturing stored blocks, so text like + // `http://www.example.com/[[x | y]]` doesn't get aggressively captured. + $text = preg_replace_callback( + '@(\w{3,}://[^\s'.PhutilRemarkupBlockStorage::MAGIC_BYTE.']+)@', + array($this, 'markupHyperlinkUngreedy'), + $text); + + return $text; + } + + protected function markupHyperlink(array $matches) { + try { + $uri = new PhutilURI($matches[1]); + } catch (Exception $ex) { + return $matches[0]; + } + + $protocol = $uri->getProtocol(); + + $protocols = $this->getEngine()->getConfig( + 'uri.allowed-protocols', + array()); + + if (!idx($protocols, $protocol)) { + // If this URI doesn't use a whitelisted protocol, don't link it. This + // is primarily intended to prevent javascript:// silliness. + return $this->getEngine()->storeText($matches[1]); + } + + return $this->storeRenderedHyperlink($matches[1]); + } + + protected function storeRenderedHyperlink($link) { + return $this->getEngine()->storeText($this->renderHyperlink($link)); + } + + protected function renderHyperlink($link) { + $engine = $this->getEngine(); + + if ($engine->isTextMode()) { + return $link; + } + + if ($engine->getState('toc')) { + return $link; + } + + $same_window = $engine->getConfig('uri.same-window', false); + if ($same_window) { + $target = null; + } else { + $target = '_blank'; + } + + return phutil_tag( + 'a', + array( + 'href' => $link, + 'class' => 'remarkup-link', + 'target' => $target, + 'rel' => 'noreferrer', + ), + $link); + } + + protected function markupHyperlinkUngreedy($matches) { + $match = $matches[1]; + $tail = null; + $trailing = null; + if (preg_match('/[;,.:!?]+$/', $match, $trailing)) { + $tail = $trailing[0]; + $match = substr($match, 0, -strlen($tail)); + } + + // If there's a closing paren at the end but no balancing open paren in + // the URL, don't link the close paren. This is an attempt to gracefully + // handle the two common paren cases, Wikipedia links and English language + // parentheticals, e.g.: + // + // http://en.wikipedia.org/wiki/Noun_(disambiguation) + // (see also http://www.example.com) + // + // We could apply a craftier heuristic here which tries to actually balance + // the parens, but this is probably sufficient. + if (preg_match('/\\)$/', $match) && !preg_match('/\\(/', $match)) { + $tail = ')'.$tail; + $match = substr($match, 0, -1); + } + + try { + $uri = new PhutilURI($match); + } catch (Exception $ex) { + return $matches[0]; + } + + return hsprintf('%s%s', $this->markupHyperlink(array(null, $match)), $tail); + } + +} diff --git a/src/markup/engine/remarkup/markuprule/PhutilRemarkupItalicRule.php b/src/markup/engine/remarkup/markuprule/PhutilRemarkupItalicRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/markuprule/PhutilRemarkupItalicRule.php @@ -0,0 +1,24 @@ +getEngine()->isTextMode()) { + return $text; + } + + return $this->replaceHTML( + '@(?%s', $matches[1]); + } + +} diff --git a/src/markup/engine/remarkup/markuprule/PhutilRemarkupLinebreaksRule.php b/src/markup/engine/remarkup/markuprule/PhutilRemarkupLinebreaksRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/markuprule/PhutilRemarkupLinebreaksRule.php @@ -0,0 +1,13 @@ +getEngine()->isTextMode()) { + return $text; + } + + return phutil_escape_html_newlines($text); + } + +} diff --git a/src/markup/engine/remarkup/markuprule/PhutilRemarkupMonospaceRule.php b/src/markup/engine/remarkup/markuprule/PhutilRemarkupMonospaceRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/markuprule/PhutilRemarkupMonospaceRule.php @@ -0,0 +1,49 @@ +getEngine()->isTextMode()) { + $result = $matches[0]; + + } else + if ($this->getEngine()->isHTMLMailMode()) { + $match = isset($matches[2]) ? $matches[2] : $matches[1]; + $result = phutil_tag( + 'tt', + array( + 'style' => 'background: #ebebeb; font-size: 13px;', + ), + $match); + + } else { + $match = isset($matches[2]) ? $matches[2] : $matches[1]; + $result = phutil_tag( + 'tt', + array( + 'class' => 'remarkup-monospaced', + ), + $match); + } + + return $this->getEngine()->storeText($result); + } + +} diff --git a/src/markup/engine/remarkup/markuprule/PhutilRemarkupRule.php b/src/markup/engine/remarkup/markuprule/PhutilRemarkupRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/markuprule/PhutilRemarkupRule.php @@ -0,0 +1,109 @@ +engine = $engine; + return $this; + } + + public function getEngine() { + return $this->engine; + } + + public function getPriority() { + return 500.0; + } + + abstract public function apply($text); + + public function getPostprocessKey() { + return spl_object_hash($this); + } + + public function didMarkupText() { + return; + } + + protected function replaceHTML($pattern, $callback, $text) { + $this->replaceCallback = $callback; + return phutil_safe_html(preg_replace_callback( + $pattern, + array($this, 'replaceHTMLCallback'), + phutil_escape_html($text))); + } + + private function replaceHTMLCallback(array $match) { + return phutil_escape_html(call_user_func( + $this->replaceCallback, + array_map('phutil_safe_html', $match))); + } + + + /** + * Safely generate a tag. + * + * In Remarkup contexts, it's not safe to use arbitrary text in tag + * attributes: even though it will be escaped, it may contain replacement + * tokens which are then replaced with markup. + * + * This method acts as @{function:phutil_tag}, but checks attributes before + * using them. + * + * @param string Tag name. + * @param dict Tag attributes. + * @param wild Tag content. + * @return PhutilSafeHTML Tag object. + */ + protected function newTag($name, array $attrs, $content = null) { + foreach ($attrs as $key => $attr) { + if ($attr !== null) { + $attrs[$key] = $this->assertFlatText($attr); + } + } + + return phutil_tag($name, $attrs, $content); + } + + /** + * Assert that a text token is flat (it contains no replacement tokens). + * + * Because tokens can be replaced with markup, it is dangerous to use + * arbitrary input text in tag attributes. Normally, rule precedence should + * prevent this. Asserting that text is flat before using it as an attribute + * provides an extra layer of security. + * + * Normally, you can call @{method:newTag} rather than calling this method + * directly. @{method:newTag} will check attributes for you. + * + * @param wild Ostensibly flat text. + * @return string Flat text. + */ + protected function assertFlatText($text) { + $text = (string)hsprintf('%s', phutil_safe_html($text)); + $rich = (strpos($text, PhutilRemarkupBlockStorage::MAGIC_BYTE) !== false); + if ($rich) { + throw new Exception( + pht( + 'Remarkup rule precedence is dangerous: rendering text with tokens '. + 'as flat text!')); + } + + return $text; + } + + /** + * Check whether text is flat (contains no replacement tokens) or not. + * + * @param wild Ostensibly flat text. + * @return bool True if the text is flat. + */ + protected function isFlatText($text) { + $text = (string)hsprintf('%s', phutil_safe_html($text)); + return (strpos($text, PhutilRemarkupBlockStorage::MAGIC_BYTE) === false); + } + +} diff --git a/src/markup/engine/remarkup/markuprule/PhutilRemarkupUnderlineRule.php b/src/markup/engine/remarkup/markuprule/PhutilRemarkupUnderlineRule.php new file mode 100644 --- /dev/null +++ b/src/markup/engine/remarkup/markuprule/PhutilRemarkupUnderlineRule.php @@ -0,0 +1,24 @@ +getEngine()->isTextMode()) { + return $text; + } + + return $this->replaceHTML( + '@(?%s', $matches[1]); + } + +} diff --git a/src/markup/render.php b/src/markup/render.php new file mode 100644 --- /dev/null +++ b/src/markup/render.php @@ -0,0 +1,251 @@ +` tags, if the `rel` attribute is not specified, it + * is interpreted as `rel="noreferrer"`. + * - When rendering `` tags, the `href` attribute may not begin with + * `javascript:`. + * + * These special cases can not be disabled. + * + * IMPORTANT: The `$tag` attribute and the keys of the `$attributes` array are + * trusted blindly, and not escaped. You should not pass user data in these + * parameters. + * + * @param string The name of the tag, like `a` or `div`. + * @param map A map of tag attributes. + * @param wild Content to put in the tag. + * @return PhutilSafeHTML Tag object. + */ +function phutil_tag($tag, array $attributes = array(), $content = null) { + // If the `href` attribute is present, make sure it is not a "javascript:" + // URI. We never permit these. + if (!empty($attributes['href'])) { + // This might be a URI object, so cast it to a string. + $href = (string)$attributes['href']; + + if (isset($href[0])) { + // Block 'javascript:' hrefs at the tag level: no well-designed + // application should ever use them, and they are a potent attack vector. + + // This function is deep in the core and performance sensitive, so we're + // doing a cheap version of this test first to avoid calling preg_match() + // on URIs which begin with '/' or `#`. These cover essentially all URIs + // in Phabricator. + if (($href[0] !== '/') && ($href[0] !== '#')) { + // Chrome 33 and IE 11 both interpret "javascript\n:" as a Javascript + // URI, and all browsers interpret " javascript:" as a Javascript URI, + // so be aggressive about looking for "javascript:" in the initial + // section of the string. + + $normalized_href = preg_replace('([^a-z0-9/:]+)i', '', $href); + if (preg_match('/^javascript:/i', $normalized_href)) { + throw new Exception( + pht( + "Attempting to render a tag with an '%s' attribute that begins ". + "with '%s'. This is either a serious security concern or a ". + "serious architecture concern. Seek urgent remedy.", + 'href', + 'javascript:')); + } + } + } + } + + // For tags which can't self-close, treat null as the empty string -- for + // example, always render `
    `, never `
    `. + static $self_closing_tags = array( + 'area' => true, + 'base' => true, + 'br' => true, + 'col' => true, + 'command' => true, + 'embed' => true, + 'frame' => true, + 'hr' => true, + 'img' => true, + 'input' => true, + 'keygen' => true, + 'link' => true, + 'meta' => true, + 'param' => true, + 'source' => true, + 'track' => true, + 'wbr' => true, + ); + + $attr_string = ''; + foreach ($attributes as $k => $v) { + if ($v === null) { + continue; + } + $v = phutil_escape_html($v); + $attr_string .= ' '.$k.'="'.$v.'"'; + } + + if ($content === null) { + if (isset($self_closing_tags[$tag])) { + return new PhutilSafeHTML('<'.$tag.$attr_string.' />'); + } else { + $content = ''; + } + } else { + $content = phutil_escape_html($content); + } + + return new PhutilSafeHTML('<'.$tag.$attr_string.'>'.$content.''); +} + +function phutil_tag_div($class, $content = null) { + return phutil_tag('div', array('class' => $class), $content); +} + +function phutil_escape_html($string) { + if ($string instanceof PhutilSafeHTML) { + return $string; + } else if ($string instanceof PhutilSafeHTMLProducerInterface) { + $result = $string->producePhutilSafeHTML(); + if ($result instanceof PhutilSafeHTML) { + return phutil_escape_html($result); + } else if (is_array($result)) { + return phutil_escape_html($result); + } else if ($result instanceof PhutilSafeHTMLProducerInterface) { + return phutil_escape_html($result); + } else { + try { + assert_stringlike($result); + return phutil_escape_html((string)$result); + } catch (Exception $ex) { + throw new Exception( + pht( + "Object (of class '%s') implements %s but did not return anything ". + "renderable from %s.", + get_class($string), + 'PhutilSafeHTMLProducerInterface', + 'producePhutilSafeHTML()')); + } + } + } else if (is_array($string)) { + $result = ''; + foreach ($string as $item) { + $result .= phutil_escape_html($item); + } + return $result; + } + + return htmlspecialchars($string, ENT_QUOTES, 'UTF-8'); +} + +function phutil_escape_html_newlines($string) { + return PhutilSafeHTML::applyFunction('nl2br', $string); +} + +/** + * Mark string as safe for use in HTML. + */ +function phutil_safe_html($string) { + if ($string == '') { + return $string; + } else if ($string instanceof PhutilSafeHTML) { + return $string; + } else { + return new PhutilSafeHTML($string); + } +} + +/** + * HTML safe version of `implode()`. + */ +function phutil_implode_html($glue, array $pieces) { + $glue = phutil_escape_html($glue); + + foreach ($pieces as $k => $piece) { + $pieces[$k] = phutil_escape_html($piece); + } + + return phutil_safe_html(implode($glue, $pieces)); +} + +/** + * Format a HTML code. This function behaves like `sprintf()`, except that all + * the normal conversions (like %s) will be properly escaped. + */ +function hsprintf($html /* , ... */) { + $args = func_get_args(); + array_shift($args); + return new PhutilSafeHTML( + vsprintf($html, array_map('phutil_escape_html', $args))); +} + + +/** + * Escape text for inclusion in a URI or a query parameter. Note that this + * method does NOT escape '/', because "%2F" is invalid in paths and Apache + * will automatically 404 the page if it's present. This will produce correct + * (the URIs will work) and desirable (the URIs will be readable) behavior in + * these cases: + * + * '/path/?param='.phutil_escape_uri($string); # OK: Query Parameter + * '/path/to/'.phutil_escape_uri($string); # OK: URI Suffix + * + * It will potentially produce the WRONG behavior in this special case: + * + * COUNTEREXAMPLE + * '/path/to/'.phutil_escape_uri($string).'/thing/'; # BAD: URI Infix + * + * In this case, any '/' characters in the string will not be escaped, so you + * will not be able to distinguish between the string and the suffix (unless + * you have more information, like you know the format of the suffix). For infix + * URI components, use @{function:phutil_escape_uri_path_component} instead. + * + * @param string Some string. + * @return string URI encoded string, except for '/'. + */ +function phutil_escape_uri($string) { + return str_replace('%2F', '/', rawurlencode($string)); +} + + +/** + * Escape text for inclusion as an infix URI substring. See discussion at + * @{function:phutil_escape_uri}. This function covers an unusual special case; + * @{function:phutil_escape_uri} is usually the correct function to use. + * + * This function will escape a string into a format which is safe to put into + * a URI path and which does not contain '/' so it can be correctly parsed when + * embedded as a URI infix component. + * + * However, you MUST decode the string with + * @{function:phutil_unescape_uri_path_component} before it can be used in the + * application. + * + * @param string Some string. + * @return string URI encoded string that is safe for infix composition. + */ +function phutil_escape_uri_path_component($string) { + return rawurlencode(rawurlencode($string)); +} + + +/** + * Unescape text that was escaped by + * @{function:phutil_escape_uri_path_component}. See + * @{function:phutil_escape_uri} for discussion. + * + * Note that this function is NOT the inverse of + * @{function:phutil_escape_uri_path_component}! It undoes additional escaping + * which is added to survive the implied unescaping performed by the webserver + * when interpreting the request. + * + * @param string Some string emitted + * from @{function:phutil_escape_uri_path_component} and + * then accessed via a web server. + * @return string Original string. + */ +function phutil_unescape_uri_path_component($string) { + return rawurldecode($string); +} diff --git a/src/markup/syntax/engine/PhutilDefaultSyntaxHighlighterEngine.php b/src/markup/syntax/engine/PhutilDefaultSyntaxHighlighterEngine.php new file mode 100644 --- /dev/null +++ b/src/markup/syntax/engine/PhutilDefaultSyntaxHighlighterEngine.php @@ -0,0 +1,115 @@ +config[$key] = $value; + return $this; + } + + public function getLanguageFromFilename($filename) { + static $default_map = array( + // All files which have file extensions that we haven't already matched + // map to their extensions. + '@\\.([^./]+)$@' => 1, + ); + + $maps = array(); + if (!empty($this->config['filename.map'])) { + $maps[] = $this->config['filename.map']; + } + $maps[] = $default_map; + + foreach ($maps as $map) { + foreach ($map as $regexp => $lang) { + $matches = null; + if (preg_match($regexp, $filename, $matches)) { + if (is_numeric($lang)) { + return idx($matches, $lang); + } else { + return $lang; + } + } + } + } + + return null; + } + + public function getHighlightFuture($language, $source) { + if ($language === null) { + $language = PhutilLanguageGuesser::guessLanguage($source); + } + + $have_pygments = !empty($this->config['pygments.enabled']); + + if ($language == 'php' && PhutilXHPASTBinary::isAvailable()) { + return id(new PhutilXHPASTSyntaxHighlighter()) + ->getHighlightFuture($source); + } + + if ($language == 'console') { + return id(new PhutilConsoleSyntaxHighlighter()) + ->getHighlightFuture($source); + } + + if ($language == 'diviner' || $language == 'remarkup') { + return id(new PhutilDivinerSyntaxHighlighter()) + ->getHighlightFuture($source); + } + + if ($language == 'rainbow') { + return id(new PhutilRainbowSyntaxHighlighter()) + ->getHighlightFuture($source); + } + + if ($language == 'php') { + return id(new PhutilLexerSyntaxHighlighter()) + ->setConfig('lexer', new PhutilPHPFragmentLexer()) + ->setConfig('language', 'php') + ->getHighlightFuture($source); + } + + if ($language == 'py') { + return id(new PhutilLexerSyntaxHighlighter()) + ->setConfig('lexer', new PhutilPythonFragmentLexer()) + ->setConfig('language', 'py') + ->getHighlightFuture($source); + } + + if ($language == 'java') { + return id(new PhutilLexerSyntaxHighlighter()) + ->setConfig('lexer', new PhutilJavaFragmentLexer()) + ->setConfig('language', 'java') + ->getHighlightFuture($source); + } + + if ($language == 'json') { + return id(new PhutilLexerSyntaxHighlighter()) + ->setConfig('lexer', new PhutilJSONFragmentLexer()) + ->getHighlightFuture($source); + } + + if ($language == 'invisible') { + return id(new PhutilInvisibleSyntaxHighlighter()) + ->getHighlightFuture($source); + } + + // Don't invoke Pygments for plain text, since it's expensive and has + // no effect. + if ($language !== 'text' && $language !== 'txt') { + if ($have_pygments) { + return id(new PhutilPygmentsSyntaxHighlighter()) + ->setConfig('language', $language) + ->getHighlightFuture($source); + } + } + + return id(new PhutilDefaultSyntaxHighlighter()) + ->getHighlightFuture($source); + } + +} diff --git a/src/markup/syntax/engine/PhutilSyntaxHighlighterEngine.php b/src/markup/syntax/engine/PhutilSyntaxHighlighterEngine.php new file mode 100644 --- /dev/null +++ b/src/markup/syntax/engine/PhutilSyntaxHighlighterEngine.php @@ -0,0 +1,19 @@ +getHighlightFuture($language, $source)->resolve(); + } catch (PhutilSyntaxHighlighterException $ex) { + return id(new PhutilDefaultSyntaxHighlighter()) + ->getHighlightFuture($source) + ->resolve(); + } + } + +} diff --git a/src/markup/syntax/engine/__tests__/PhutilDefaultSyntaxHighlighterEngineTestCase.php b/src/markup/syntax/engine/__tests__/PhutilDefaultSyntaxHighlighterEngineTestCase.php new file mode 100644 --- /dev/null +++ b/src/markup/syntax/engine/__tests__/PhutilDefaultSyntaxHighlighterEngineTestCase.php @@ -0,0 +1,28 @@ + 'php', + '/x.php' => 'php', + 'x.y.php' => 'php', + '/x.y/z.php' => 'php', + '/x.php/' => null, + ); + + $engine = new PhutilDefaultSyntaxHighlighterEngine(); + foreach ($names as $path => $language) { + $detect = $engine->getLanguageFromFilename($path); + $this->assertEqual( + $language, + $detect, + pht('Language detect for %s', $path)); + } + } + +} diff --git a/src/markup/syntax/highlighter/PhutilConsoleSyntaxHighlighter.php b/src/markup/syntax/highlighter/PhutilConsoleSyntaxHighlighter.php new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/PhutilConsoleSyntaxHighlighter.php @@ -0,0 +1,51 @@ +config[$key] = $value; + return $this; + } + + public function getHighlightFuture($source) { + $in_command = false; + $lines = explode("\n", $source); + foreach ($lines as $key => $line) { + $matches = null; + + // Parse commands like this: + // + // some/path/ $ ./bin/example # Do things + // + // ...into path, command, and comment components. + + $pattern = + '@'. + ($in_command ? '()(.*?)' : '^(\S+[\\\\/] )?([$] .*?)'). + '(#.*|\\\\)?$@'; + + if (preg_match($pattern, $line, $matches)) { + $lines[$key] = hsprintf( + '%s%s%s', + $matches[1], + $matches[2], + (!empty($matches[3]) + ? hsprintf('%s', $matches[3]) + : '')); + $in_command = (idx($matches, 3) == '\\'); + } else { + $lines[$key] = hsprintf('%s', $line); + } + } + $lines = phutil_implode_html("\n", $lines); + + return new ImmediateFuture($lines); + } + +} diff --git a/src/markup/syntax/highlighter/PhutilDefaultSyntaxHighlighter.php b/src/markup/syntax/highlighter/PhutilDefaultSyntaxHighlighter.php new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/PhutilDefaultSyntaxHighlighter.php @@ -0,0 +1,14 @@ +config[$key] = $value; + return $this; + } + + public function getHighlightFuture($source) { + $source = phutil_escape_html($source); + + // This highlighter isn't perfect but tries to do an okay job at getting + // some of the basics at least. There's lots of room for improvement. + + $blocks = explode("\n\n", $source); + foreach ($blocks as $key => $block) { + if (preg_match('/^[^ ](?! )/m', $block)) { + $blocks[$key] = $this->highlightBlock($block); + } + } + $source = implode("\n\n", $blocks); + + $source = phutil_safe_html($source); + return new ImmediateFuture($source); + } + + private function highlightBlock($source) { + // Highlight "@{class:...}" links to other documentation pages. + $source = $this->highlightPattern('/@{([\w@]+?):([^}]+?)}/', $source, 'nc'); + + // Highlight "@title", "@group", etc. + $source = $this->highlightPattern('/^@(\w+)/m', $source, 'k'); + + // Highlight bold, italic and monospace. + $source = $this->highlightPattern('@\\*\\*(.+?)\\*\\*@s', $source, 's'); + $source = $this->highlightPattern('@(?highlightPattern( + '@##([\s\S]+?)##|\B`(.+?)`\B@', + $source, + 's'); + + // Highlight stuff that looks like headers. + $source = $this->highlightPattern('/^=(.*)$/m', $source, 'nv'); + + return $source; + } + + private function highlightPattern($regexp, $source, $class) { + $this->replaceClass = $class; + $source = preg_replace_callback( + $regexp, + array($this, 'replacePattern'), + $source); + + return $source; + } + + public function replacePattern($matches) { + + // NOTE: The goal here is to make sure a never crosses a newline. + + $content = $matches[0]; + $content = explode("\n", $content); + foreach ($content as $key => $line) { + $content[$key] = + ''. + $line. + ''; + } + return implode("\n", $content); + } + +} diff --git a/src/markup/syntax/highlighter/PhutilInvisibleSyntaxHighlighter.php b/src/markup/syntax/highlighter/PhutilInvisibleSyntaxHighlighter.php new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/PhutilInvisibleSyntaxHighlighter.php @@ -0,0 +1,43 @@ +config[$key] = $value; + return $this; + } + + public function getHighlightFuture($source) { + $keys = array_map('chr', range(0x0, 0x1F)); + $vals = array_map( + array($this, 'decimalToHtmlEntityDecoded'), range(0x2400, 0x241F)); + + $invisible = array_combine($keys, $vals); + + $result = array(); + foreach (str_split($source) as $character) { + if (isset($invisible[$character])) { + $result[] = phutil_tag( + 'span', + array('class' => 'invisible'), + $invisible[$character]); + + if ($character === "\n") { + $result[] = $character; + } + } else { + $result[] = $character; + } + } + + $result = phutil_implode_html('', $result); + return new ImmediateFuture($result); + } + + private function decimalToHtmlEntityDecoded($dec) { + return html_entity_decode("&#{$dec};"); + } + +} diff --git a/src/markup/syntax/highlighter/PhutilLexerSyntaxHighlighter.php b/src/markup/syntax/highlighter/PhutilLexerSyntaxHighlighter.php new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/PhutilLexerSyntaxHighlighter.php @@ -0,0 +1,72 @@ +config[$key] = $value; + return $this; + } + + public function getHighlightFuture($source) { + $strip = false; + $state = 'start'; + $lang = idx($this->config, 'language'); + + if ($lang == 'php') { + if (strpos($source, 'config, 'lexer'); + $tokens = $lexer->getTokens($source, $state); + $tokens = $lexer->mergeTokens($tokens); + + $result = array(); + foreach ($tokens as $token) { + list($type, $value, $context) = $token; + + $data_name = null; + switch ($type) { + case 'nc': + case 'nf': + case 'na': + $data_name = $value; + break; + } + + if (strpos($value, "\n") !== false) { + $value = explode("\n", $value); + } else { + $value = array($value); + } + foreach ($value as $part) { + if (strlen($part)) { + if ($type) { + $result[] = phutil_tag( + 'span', + array( + 'class' => $type, + 'data-symbol-context' => $context, + 'data-symbol-name' => $data_name, + ), + $part); + } else { + $result[] = $part; + } + } + $result[] = "\n"; + } + + // Throw away the last "\n". + array_pop($result); + } + + $result = phutil_implode_html('', $result); + + return new ImmediateFuture($result); + } + +} diff --git a/src/markup/syntax/highlighter/PhutilPygmentsSyntaxHighlighter.php b/src/markup/syntax/highlighter/PhutilPygmentsSyntaxHighlighter.php new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/PhutilPygmentsSyntaxHighlighter.php @@ -0,0 +1,216 @@ +config[$key] = $value; + return $this; + } + + public function getHighlightFuture($source) { + $language = idx($this->config, 'language'); + + if (preg_match('/\r(?!\n)/', $source)) { + // TODO: Pygments converts "\r" newlines into "\n" newlines, so we can't + // use it on files with "\r" newlines. If we have "\r" not followed by + // "\n" in the file, skip highlighting. + $language = null; + } + + if ($language) { + $language = $this->getPygmentsLexerNameFromLanguageName($language); + $future = new ExecFuture( + 'pygmentize -O encoding=utf-8 -O stripnl=False -f html -l %s', + $language); + $scrub = false; + if ($language == 'php' && strpos($source, 'write($source); + return new PhutilDefaultSyntaxHighlighterEnginePygmentsFuture( + $future, + $source, + $scrub); + } + + return id(new PhutilDefaultSyntaxHighlighter()) + ->getHighlightFuture($source); + } + + private function getPygmentsLexerNameFromLanguageName($language) { + static $map = array( + 'adb' => 'ada', + 'ads' => 'ada', + 'ahkl' => 'ahk', + 'as' => 'as3', + 'asax' => 'aspx-vb', + 'ascx' => 'aspx-vb', + 'ashx' => 'aspx-vb', + 'ASM' => 'nasm', + 'asm' => 'nasm', + 'asmx' => 'aspx-vb', + 'aspx' => 'aspx-vb', + 'autodelegate' => 'myghty', + 'autohandler' => 'mason', + 'aux' => 'tex', + 'axd' => 'aspx-vb', + 'b' => 'brainfuck', + 'bas' => 'vb.net', + 'bf' => 'brainfuck', + 'bmx' => 'blitzmax', + 'c++' => 'cpp', + 'c++-objdump' => 'cpp-objdump', + 'cc' => 'cpp', + 'cfc' => 'cfm', + 'cfg' => 'ini', + 'cfml' => 'cfm', + 'cl' => 'common-lisp', + 'clj' => 'clojure', + 'cmd' => 'bat', + 'coffee' => 'coffee-script', + 'cs' => 'csharp', + 'csh' => 'tcsh', + 'cw' => 'redcode', + 'cxx' => 'cpp', + 'cxx-objdump' => 'cpp-objdump', + 'darcspatch' => 'dpatch', + 'def' => 'modula2', + 'dhandler' => 'mason', + 'di' => 'd', + 'duby' => 'rb', + 'dyl' => 'dylan', + 'ebuild' => 'bash', + 'eclass' => 'bash', + 'el' => 'common-lisp', + 'eps' => 'postscript', + 'erl' => 'erlang', + 'erl-sh' => 'erl', + 'f' => 'fortran', + 'f90' => 'fortran', + 'feature' => 'Cucumber', + 'fhtml' => 'velocity', + 'flx' => 'felix', + 'flxh' => 'felix', + 'frag' => 'glsl', + 'g' => 'antlr-ruby', + 'G' => 'antlr-ruby', + 'gdc' => 'gooddata-cl', + 'gemspec' => 'rb', + 'geo' => 'glsl', + 'GNUmakefile' => 'make', + 'h' => 'c', + 'h++' => 'cpp', + 'hh' => 'cpp', + 'hpp' => 'cpp', + 'hql' => 'sql', + 'hrl' => 'erlang', + 'hs' => 'haskell', + 'htaccess' => 'apacheconf', + 'htm' => 'html', + 'html' => 'html+evoque', + 'hxx' => 'cpp', + 'hy' => 'hybris', + 'hyb' => 'hybris', + 'ik' => 'ioke', + 'inc' => 'pov', + 'j' => 'objective-j', + 'jbst' => 'duel', + 'kid' => 'genshi', + 'ksh' => 'bash', + 'less' => 'css', + 'lgt' => 'logtalk', + 'lisp' => 'common-lisp', + 'll' => 'llvm', + 'm' => 'objective-c', + 'mak' => 'make', + 'Makefile' => 'make', + 'makefile' => 'make', + 'man' => 'groff', + 'mao' => 'mako', + 'mc' => 'mason', + 'md' => 'minid', + 'mhtml' => 'mason', + 'mi' => 'mason', + 'ml' => 'ocaml', + 'mli' => 'ocaml', + 'mll' => 'ocaml', + 'mly' => 'ocaml', + 'mm' => 'objective-c', + 'mo' => 'modelica', + 'mod' => 'modula2', + 'moo' => 'moocode', + 'mu' => 'mupad', + 'myt' => 'myghty', + 'ns2' => 'newspeak', + 'pas' => 'delphi', + 'patch' => 'diff', + 'phtml' => 'html+php', + 'pl' => 'prolog', + 'plot' => 'gnuplot', + 'plt' => 'gnuplot', + 'pm' => 'perl', + 'po' => 'pot', + 'pp' => 'puppet', + 'pro' => 'prolog', + 'proto' => 'protobuf', + 'ps' => 'postscript', + 'pxd' => 'cython', + 'pxi' => 'cython', + 'py' => 'python', + 'pyw' => 'python', + 'pyx' => 'cython', + 'R' => 'splus', + 'r' => 'rebol', + 'r3' => 'rebol', + 'rake' => 'rb', + 'Rakefile' => 'rb', + 'rbw' => 'rb', + 'rbx' => 'rb', + 'rest' => 'rst', + 'rl' => 'ragel-em', + 'robot' => 'robotframework', + 'Rout' => 'rconsole', + 'rss' => 'xml', + 's' => 'gas', + 'S' => 'splus', + 'sc' => 'python', + 'scm' => 'scheme', + 'SConscript' => 'python', + 'SConstruct' => 'python', + 'scss' => 'css', + 'sh' => 'bash', + 'sh-session' => 'console', + 'spt' => 'cheetah', + 'sqlite3-console' => 'sqlite3', + 'st' => 'smalltalk', + 'sv' => 'v', + 'tac' => 'python', + 'tmpl' => 'cheetah', + 'toc' => 'tex', + 'tpl' => 'smarty', + 'txt' => 'text', + 'vapi' => 'vala', + 'vb' => 'vb.net', + 'vert' => 'glsl', + 'vhd' => 'vhdl', + 'vimrc' => 'vim', + 'vm' => 'velocity', + 'weechatlog' => 'irc', + 'wlua' => 'lua', + 'wsdl' => 'xml', + 'xhtml' => 'html', + 'xml' => 'xml+evoque', + 'xqy' => 'xquery', + 'xsd' => 'xml', + 'xsl' => 'xslt', + 'xslt' => 'xml', + 'yml' => 'yaml', + ); + + return idx($map, $language, $language); + } + +} diff --git a/src/markup/syntax/highlighter/PhutilRainbowSyntaxHighlighter.php b/src/markup/syntax/highlighter/PhutilRainbowSyntaxHighlighter.php new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/PhutilRainbowSyntaxHighlighter.php @@ -0,0 +1,46 @@ +config[$key] = $value; + return $this; + } + + public function getHighlightFuture($source) { + + $color = 0; + $colors = array( + 'rbw_r', + 'rbw_o', + 'rbw_y', + 'rbw_g', + 'rbw_b', + 'rbw_i', + 'rbw_v', + ); + + $result = array(); + foreach (phutil_utf8v($source) as $character) { + if ($character == ' ' || $character == "\n") { + $result[] = $character; + continue; + } + $result[] = phutil_tag( + 'span', + array('class' => $colors[$color]), + $character); + $color = ($color + 1) % count($colors); + } + + $result = phutil_implode_html('', $result); + return new ImmediateFuture($result); + } + +} diff --git a/src/markup/syntax/highlighter/PhutilSyntaxHighlighter.php b/src/markup/syntax/highlighter/PhutilSyntaxHighlighter.php new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/PhutilSyntaxHighlighter.php @@ -0,0 +1,6 @@ +setConfig('language', 'json') + ->setConfig('lexer', new PhutilJSONFragmentLexer()); + + $path = dirname(__FILE__).'/data/jsonfragment/'; + foreach (Filesystem::listDirectory($path, $include_hidden = false) as $f) { + if (preg_match('/.test$/', $f)) { + $expect = preg_replace('/.test$/', '.expect', $f); + $source = Filesystem::readFile($path.'/'.$f); + + $this->assertEqual( + Filesystem::readFile($path.'/'.$expect), + (string)$highlighter->getHighlightFuture($source)->resolve(), + $f); + } + } + } + +} diff --git a/src/markup/syntax/highlighter/__tests__/PhutilPHPFragmentLexerHighlighterTestCase.php b/src/markup/syntax/highlighter/__tests__/PhutilPHPFragmentLexerHighlighterTestCase.php new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/PhutilPHPFragmentLexerHighlighterTestCase.php @@ -0,0 +1,25 @@ +setConfig('language', 'php'); + $highlighter->setConfig('lexer', new PhutilPHPFragmentLexer()); + + + $path = dirname(__FILE__).'/phpfragment/'; + foreach (Filesystem::listDirectory($path, $include_hidden = false) as $f) { + if (preg_match('/.test$/', $f)) { + $expect = preg_replace('/.test$/', '.expect', $f); + $source = Filesystem::readFile($path.'/'.$f); + + $this->assertEqual( + Filesystem::readFile($path.'/'.$expect), + (string)$highlighter->getHighlightFuture($source)->resolve(), + $f); + } + } + } + +} diff --git a/src/markup/syntax/highlighter/__tests__/PhutilXHPASTSyntaxHighlighterTestCase.php b/src/markup/syntax/highlighter/__tests__/PhutilXHPASTSyntaxHighlighterTestCase.php new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/PhutilXHPASTSyntaxHighlighterTestCase.php @@ -0,0 +1,39 @@ +getHighlightFuture($source); + return $future->resolve(); + } + + private function read($file) { + $path = dirname(__FILE__).'/xhpast/'.$file; + return Filesystem::readFile($path); + } + + public function testBuiltinClassnames() { + $this->assertEqual( + $this->read('builtin-classname.expect'), + (string)$this->highlight($this->read('builtin-classname.source')), + pht('Builtin classnames should not be marked as linkable symbols.')); + $this->assertEqual( + rtrim($this->read('trailing-comment.expect')), + (string)$this->highlight($this->read('trailing-comment.source')), + pht('Trailing comments should not be dropped.')); + $this->assertEqual( + $this->read('multiline-token.expect'), + (string)$this->highlight($this->read('multiline-token.source')), + pht('Multi-line tokens should be split across lines.')); + $this->assertEqual( + $this->read('leading-whitespace.expect'), + (string)$this->highlight($this->read('leading-whitespace.source')), + pht('Snippets with leading whitespace should be preserved.')); + $this->assertEqual( + $this->read('no-leading-whitespace.expect'), + (string)$this->highlight($this->read('no-leading-whitespace.source')), + pht('Snippets with no leading whitespace should be preserved.')); + } + +} diff --git a/src/markup/syntax/highlighter/__tests__/data/jsonfragment/basics.expect b/src/markup/syntax/highlighter/__tests__/data/jsonfragment/basics.expect new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/data/jsonfragment/basics.expect @@ -0,0 +1,12 @@ +{ + "key": 3.5, + "true": true, + "false": false, + "null": null, + "list": [1, 2, 3], + "object": { + "k1": "v1" + }, + "numbers": [0e1, 1e-1, -1e-1, -1e+1], + "\"\u1234'abc[]{}..." +} diff --git a/src/markup/syntax/highlighter/__tests__/data/jsonfragment/basics.test b/src/markup/syntax/highlighter/__tests__/data/jsonfragment/basics.test new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/data/jsonfragment/basics.test @@ -0,0 +1,12 @@ +{ + "key": 3.5, + "true": true, + "false": false, + "null": null, + "list": [1, 2, 3], + "object": { + "k1": "v1" + }, + "numbers": [0e1, 1e-1, -1e-1, -1e+1], + "\"\u1234'abc[]{}..." +} diff --git a/src/markup/syntax/highlighter/__tests__/phpfragment/abuse.expect b/src/markup/syntax/highlighter/__tests__/phpfragment/abuse.expect new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/phpfragment/abuse.expect @@ -0,0 +1,16 @@ +<? + +// comment? comment! ?> + +data + +<?php + +__halt_compiler /* ! */ ( // ) +) /* ;;;; */ + +; + +data data +<?php +data diff --git a/src/markup/syntax/highlighter/__tests__/phpfragment/abuse.test b/src/markup/syntax/highlighter/__tests__/phpfragment/abuse.test new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/phpfragment/abuse.test @@ -0,0 +1,16 @@ + + +data + +public function f() { + ExampleClass::EXAMPLE_CONSTANT; + ExampleClass::exampleMethod(); + example_function(); +} diff --git a/src/markup/syntax/highlighter/__tests__/phpfragment/basics.test b/src/markup/syntax/highlighter/__tests__/phpfragment/basics.test new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/phpfragment/basics.test @@ -0,0 +1,5 @@ +public function f() { + ExampleClass::EXAMPLE_CONSTANT; + ExampleClass::exampleMethod(); + example_function(); +} diff --git a/src/markup/syntax/highlighter/__tests__/phpfragment/leading-whitespace.expect b/src/markup/syntax/highlighter/__tests__/phpfragment/leading-whitespace.expect new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/phpfragment/leading-whitespace.expect @@ -0,0 +1,3 @@ + foreach ($x as $y) { + z(); + } diff --git a/src/markup/syntax/highlighter/__tests__/phpfragment/leading-whitespace.test b/src/markup/syntax/highlighter/__tests__/phpfragment/leading-whitespace.test new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/phpfragment/leading-whitespace.test @@ -0,0 +1,3 @@ + foreach ($x as $y) { + z(); + } diff --git a/src/markup/syntax/highlighter/__tests__/phpfragment/no-leading-whitespace.expect b/src/markup/syntax/highlighter/__tests__/phpfragment/no-leading-whitespace.expect new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/phpfragment/no-leading-whitespace.expect @@ -0,0 +1,3 @@ +foreach ($x as $y) { + z(); +} diff --git a/src/markup/syntax/highlighter/__tests__/phpfragment/no-leading-whitespace.test b/src/markup/syntax/highlighter/__tests__/phpfragment/no-leading-whitespace.test new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/phpfragment/no-leading-whitespace.test @@ -0,0 +1,3 @@ +foreach ($x as $y) { + z(); +} diff --git a/src/markup/syntax/highlighter/__tests__/xhpast/builtin-classname.expect b/src/markup/syntax/highlighter/__tests__/xhpast/builtin-classname.expect new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/xhpast/builtin-classname.expect @@ -0,0 +1,10 @@ +<?php + +class C { + public function f() { + D::X; + self::X; + parent::X; + static::X; + } +} diff --git a/src/markup/syntax/highlighter/__tests__/xhpast/builtin-classname.source b/src/markup/syntax/highlighter/__tests__/xhpast/builtin-classname.source new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/xhpast/builtin-classname.source @@ -0,0 +1,10 @@ +foreach ($x as $y) { + z(); + } diff --git a/src/markup/syntax/highlighter/__tests__/xhpast/leading-whitespace.source b/src/markup/syntax/highlighter/__tests__/xhpast/leading-whitespace.source new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/xhpast/leading-whitespace.source @@ -0,0 +1,3 @@ + foreach ($x as $y) { + z(); + } diff --git a/src/markup/syntax/highlighter/__tests__/xhpast/multiline-token.expect b/src/markup/syntax/highlighter/__tests__/xhpast/multiline-token.expect new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/xhpast/multiline-token.expect @@ -0,0 +1,5 @@ +<?php + +/* this comment +extends across +multiple lines */ diff --git a/src/markup/syntax/highlighter/__tests__/xhpast/multiline-token.source b/src/markup/syntax/highlighter/__tests__/xhpast/multiline-token.source new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/xhpast/multiline-token.source @@ -0,0 +1,5 @@ +foreach ($x as $y) { + z(); +} diff --git a/src/markup/syntax/highlighter/__tests__/xhpast/no-leading-whitespace.source b/src/markup/syntax/highlighter/__tests__/xhpast/no-leading-whitespace.source new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/xhpast/no-leading-whitespace.source @@ -0,0 +1,3 @@ +foreach ($x as $y) { + z(); +} diff --git a/src/markup/syntax/highlighter/__tests__/xhpast/trailing-comment.expect b/src/markup/syntax/highlighter/__tests__/xhpast/trailing-comment.expect new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/xhpast/trailing-comment.expect @@ -0,0 +1,3 @@ +<?php +// xyz + diff --git a/src/markup/syntax/highlighter/__tests__/xhpast/trailing-comment.source b/src/markup/syntax/highlighter/__tests__/xhpast/trailing-comment.source new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/__tests__/xhpast/trailing-comment.source @@ -0,0 +1,2 @@ +source = $source; + $this->scrub = $scrub; + } + + protected function didReceiveResult($result) { + list($err, $stdout, $stderr) = $result; + + if (!$err && strlen($stdout)) { + // Strip off fluff Pygments adds. + $stdout = preg_replace( + '@^
    (.*)
    \s*$@s', + '\1', + $stdout); + if ($this->scrub) { + $stdout = preg_replace('/^.*\n/', '', $stdout); + } + return phutil_safe_html($stdout); + } + + throw new PhutilSyntaxHighlighterException($stderr, $err); + } + +} diff --git a/src/markup/syntax/highlighter/xhpast/PhutilXHPASTSyntaxHighlighterFuture.php b/src/markup/syntax/highlighter/xhpast/PhutilXHPASTSyntaxHighlighterFuture.php new file mode 100644 --- /dev/null +++ b/src/markup/syntax/highlighter/xhpast/PhutilXHPASTSyntaxHighlighterFuture.php @@ -0,0 +1,262 @@ +source = $source; + $this->scrub = $scrub; + } + + protected function didReceiveResult($result) { + try { + return $this->applyXHPHighlight($result); + } catch (Exception $ex) { + // XHP can't highlight source that isn't syntactically valid. Fall back + // to the fragment lexer. + $source = ($this->scrub + ? preg_replace('/^.*\n/', '', $this->source) + : $this->source); + return id(new PhutilLexerSyntaxHighlighter()) + ->setConfig('lexer', new PhutilPHPFragmentLexer()) + ->setConfig('language', 'php') + ->getHighlightFuture($source) + ->resolve(); + } + } + + private function applyXHPHighlight($result) { + + // We perform two passes here: one using the AST to find symbols we care + // about -- particularly, class names and function names. These are used + // in the crossreference stuff to link into Diffusion. After we've done our + // AST pass, we do a followup pass on the token stream to catch all the + // simple stuff like strings and comments. + + $tree = XHPASTTree::newFromDataAndResolvedExecFuture( + $this->source, + $result); + + $root = $tree->getRootNode(); + + $tokens = $root->getTokens(); + $interesting_symbols = $this->findInterestingSymbols($root); + + + if ($this->scrub) { + // If we're scrubbing, we prepended "= 2) { + if ($tokens[0]->getTypeName() === 'T_OPEN_TAG') { + if ($tokens[1]->getTypeName() === 'T_WHITESPACE') { + $ok = true; + } + } + } + + if (!$ok) { + throw new Exception( + pht( + 'Expected T_OPEN_TAG, T_WHITESPACE tokens at head of results '. + 'for highlighting parse of PHP snippet.')); + } + + // Remove the "getValue(); + if ((strlen($value) < 1) || ($value[0] != "\n")) { + throw new Exception( + pht( + 'Expected "\\n" at beginning of T_WHITESPACE token at head of '. + 'tokens for highlighting parse of PHP snippet.')); + } + + $value = substr($value, 1); + $tokens[1]->overwriteValue($value); + } + + $out = array(); + foreach ($tokens as $key => $token) { + $value = $token->getValue(); + $class = null; + $multi = false; + $attrs = array(); + if (isset($interesting_symbols[$key])) { + $sym = $interesting_symbols[$key]; + $class = $sym[0]; + $attrs['data-symbol-context'] = idx($sym, 'context'); + $attrs['data-symbol-name'] = idx($sym, 'symbol'); + } else { + switch ($token->getTypeName()) { + case 'T_WHITESPACE': + break; + case 'T_DOC_COMMENT': + $class = 'dc'; + $multi = true; + break; + case 'T_COMMENT': + $class = 'c'; + $multi = true; + break; + case 'T_CONSTANT_ENCAPSED_STRING': + case 'T_ENCAPSED_AND_WHITESPACE': + case 'T_INLINE_HTML': + $class = 's'; + $multi = true; + break; + case 'T_VARIABLE': + $class = 'nv'; + break; + case 'T_OPEN_TAG': + case 'T_OPEN_TAG_WITH_ECHO': + case 'T_CLOSE_TAG': + $class = 'o'; + break; + case 'T_LNUMBER': + case 'T_DNUMBER': + $class = 'm'; + break; + case 'T_STRING': + static $magic = array( + 'true' => true, + 'false' => true, + 'null' => true, + ); + if (isset($magic[strtolower($value)])) { + $class = 'k'; + break; + } + $class = 'nx'; + break; + default: + $class = 'k'; + break; + } + } + + if ($class) { + $attrs['class'] = $class; + if ($multi) { + // If the token may have multiple lines in it, make sure each + // crosses no more than one line so the lines can be put + // in a table, etc., later. + $value = phutil_split_lines($value, $retain_endings = true); + } else { + $value = array($value); + } + foreach ($value as $val) { + $out[] = phutil_tag('span', $attrs, $val); + } + } else { + $out[] = $value; + } + } + + return phutil_implode_html('', $out); + } + + private function findInterestingSymbols(XHPASTNode $root) { + // Class name symbols appear in: + // class X extends X implements X, X { ... } + // new X(); + // $x instanceof X + // catch (X $x) + // function f(X $x) + // X::f(); + // X::$m; + // X::CONST; + + // These are PHP builtin tokens which can appear in a classname context. + // Don't link them since they don't go anywhere useful. + static $builtin_class_tokens = array( + 'self' => true, + 'parent' => true, + 'static' => true, + ); + + // Fortunately XHPAST puts all of these in a special node type so it's + // easy to find them. + $result_map = array(); + $class_names = $root->selectDescendantsOfType('n_CLASS_NAME'); + foreach ($class_names as $class_name) { + foreach ($class_name->getTokens() as $key => $token) { + if (isset($builtin_class_tokens[$token->getValue()])) { + // This is something like "self::method()". + continue; + } + $result_map[$key] = array( + 'nc', // "Name, Class" + 'symbol' => $class_name->getConcreteString(), + ); + } + } + + // Function name symbols appear in: + // f() + + $function_calls = $root->selectDescendantsOfType('n_FUNCTION_CALL'); + foreach ($function_calls as $call) { + $call = $call->getChildByIndex(0); + if ($call->getTypeName() == 'n_SYMBOL_NAME') { + // This is a normal function call, not some $f() shenanigans. + foreach ($call->getTokens() as $key => $token) { + $result_map[$key] = array( + 'nf', // "Name, Function" + 'symbol' => $call->getConcreteString(), + ); + } + } + } + + // Upon encountering $x->y, link y without context, since $x is unknown. + + $prop_access = $root->selectDescendantsOfType('n_OBJECT_PROPERTY_ACCESS'); + foreach ($prop_access as $access) { + $right = $access->getChildByIndex(1); + if ($right->getTypeName() == 'n_INDEX_ACCESS') { + // otherwise $x->y[0] doesn't get highlighted + $right = $right->getChildByIndex(0); + } + if ($right->getTypeName() == 'n_STRING') { + foreach ($right->getTokens() as $key => $token) { + $result_map[$key] = array( + 'na', // "Name, Attribute" + 'symbol' => $right->getConcreteString(), + ); + } + } + } + + // Upon encountering x::y, try to link y with context x. + + $static_access = $root->selectDescendantsOfType('n_CLASS_STATIC_ACCESS'); + foreach ($static_access as $access) { + $class = $access->getChildByIndex(0); + $right = $access->getChildByIndex(1); + if ($class->getTypeName() == 'n_CLASS_NAME' && + ($right->getTypeName() == 'n_STRING' || + $right->getTypeName() == 'n_VARIABLE')) { + $classname = head($class->getTokens())->getValue(); + $result = array( + 'na', + 'symbol' => ltrim($right->getConcreteString(), '$'), + ); + if (!isset($builtin_class_tokens[$classname])) { + $result['context'] = $classname; + } + foreach ($right->getTokens() as $key => $token) { + $result_map[$key] = $result; + } + } + } + + return $result_map; + } + +} diff --git a/src/moduleutils/PhutilBootloader.php b/src/moduleutils/PhutilBootloader.php new file mode 100644 --- /dev/null +++ b/src/moduleutils/PhutilBootloader.php @@ -0,0 +1,338 @@ +classTree; + } + + public function registerInMemoryLibrary($name, $map) { + $this->registeredLibraries[$name] = "memory:$name"; + $this->inMemoryMaps[$name] = $map; + + $this->getLibraryMap($name); + } + + public function registerLibrary($name, $path) { + if (basename($path) != '__phutil_library_init__.php') { + throw new PhutilBootloaderException( + 'Only directories with a __phutil_library_init__.php file may be '. + 'registered as libphutil libraries.'); + } + + $path = dirname($path); + + // Detect attempts to load the same library multiple times from different + // locations. This might mean you're doing something silly like trying to + // include two different versions of something, or it might mean you're + // doing something subtle like running a different version of 'arc' on a + // working copy of Arcanist. + if (isset($this->registeredLibraries[$name])) { + $old_path = $this->registeredLibraries[$name]; + if ($old_path != $path) { + throw new PhutilLibraryConflictException($name, $old_path, $path); + } + } + + $this->registeredLibraries[$name] = $path; + + // For libphutil v2 libraries, load all functions when we load the library. + + if (!class_exists('PhutilSymbolLoader', false)) { + $root = $this->getLibraryRoot('arcanist'); + $this->executeInclude($root.'/symbols/PhutilSymbolLoader.php'); + } + + $loader = new PhutilSymbolLoader(); + $loader + ->setLibrary($name) + ->setType('function'); + + try { + $loader->selectAndLoadSymbols(); + } catch (PhutilBootloaderException $ex) { + // Ignore this, it happens if a global function's file is removed or + // similar. Worst case is that we fatal when calling the function, which + // is no worse than fataling here. + } catch (PhutilMissingSymbolException $ex) { + // Ignore this, it happens if a global function is removed. Everything + // else loaded so proceed forward: worst case is a fatal when we + // hit a function call to a function which no longer exists, which is + // no worse than fataling here. + } + + if (empty($_SERVER['PHUTIL_DISABLE_RUNTIME_EXTENSIONS'])) { + $extdir = $path.DIRECTORY_SEPARATOR.'extensions'; + if (Filesystem::pathExists($extdir)) { + $extensions = id(new FileFinder($extdir)) + ->withSuffix('php') + ->withType('f') + ->withFollowSymlinks(true) + ->setForceMode('php') + ->find(); + + foreach ($extensions as $extension) { + $this->loadExtension( + $name, + $path, + $extdir.DIRECTORY_SEPARATOR.$extension); + } + } + } + + return $this; + } + + public function registerLibraryMap(array $map) { + $this->libraryMaps[$this->currentLibrary] = $map; + return $this; + } + + public function getLibraryMap($name) { + if (isset($this->extendedMaps[$name])) { + return $this->extendedMaps[$name]; + } + + if (empty($this->libraryMaps[$name])) { + $root = $this->getLibraryRoot($name); + $this->currentLibrary = $name; + + if (isset($this->inMemoryMaps[$name])) { + $this->libraryMaps[$name] = $this->inMemoryMaps[$name]; + } else { + $okay = include $root.'/__phutil_library_map__.php'; + if (!$okay) { + throw new PhutilBootloaderException( + "Include of '{$root}/__phutil_library_map__.php' failed!"); + } + } + + $map = $this->libraryMaps[$name]; + + $version = isset($map['__library_version__']) + ? $map['__library_version__'] + : 1; + + switch ($version) { + case 1: + throw new Exception( + 'libphutil v1 libraries are no longer supported.'); + case 2: + // NOTE: In version 2 of the library format, all parents (both + // classes and interfaces) are stored in the 'xmap'. The value is + // either a string for a single parent (the common case) or an array + // for multiple parents. + foreach ($map['xmap'] as $child => $parents) { + foreach ((array)$parents as $parent) { + $this->classTree[$parent][] = $child; + } + } + break; + default: + throw new Exception("Unsupported library version '{$version}'!"); + } + } + + $map = $this->libraryMaps[$name]; + + // If there's an extension map for this library, merge the maps. + if (isset($this->extensionMaps[$name])) { + $emap = $this->extensionMaps[$name]; + foreach (array('function', 'class', 'xmap') as $dict_key) { + if (!isset($emap[$dict_key])) { + continue; + } + $map[$dict_key] += $emap[$dict_key]; + } + } + + $this->extendedMaps[$name] = $map; + + return $map; + } + + public function getLibraryMapWithoutExtensions($name) { + // This just does all the checks to make sure the library is valid, then + // we throw away the result. + $this->getLibraryMap($name); + + return $this->libraryMaps[$name]; + } + + public function getLibraryRoot($name) { + if (empty($this->registeredLibraries[$name])) { + throw new PhutilBootloaderException( + "The phutil library '{$name}' has not been loaded!"); + } + return $this->registeredLibraries[$name]; + } + + public function getAllLibraries() { + return array_keys($this->registeredLibraries); + } + + public function loadLibrary($path) { + $root = null; + if (!empty($_SERVER['PHUTIL_LIBRARY_ROOT'])) { + if ($path[0] != '/') { + $root = $_SERVER['PHUTIL_LIBRARY_ROOT']; + } + } + + $this->executeInclude($root.$path.'/__phutil_library_init__.php'); + } + + public function loadLibrarySource($library, $source) { + $path = $this->getLibraryRoot($library).'/'.$source; + $this->executeInclude($path); + } + + private function executeInclude($path) { + // Include the source using `include_once`, but convert any warnings or + // recoverable errors into exceptions. + + // Some messages, including "Declaration of X should be compatible with Y", + // do not cause `include_once` to return an error code. Use + // error_get_last() to make sure we're catching everything in every PHP + // version. + + // (Also, the severity of some messages changed between versions of PHP.) + + // Note that we may enter this method after some earlier, unrelated error. + // In this case, error_get_last() will return information for that error. + // In PHP7 and later we could use error_clear_last() to clear that error, + // but the function does not exist in earlier versions of PHP. Instead, + // check if the value has changed. + + // Some parser-like errors, including "class must implement all abstract + // methods", cause PHP to fatal immediately with an E_ERROR. In these + // cases, include_once() does not throw and never returns. We leave + // reporting enabled for these errors since we don't have a way to do + // anything more graceful. + + // Likewise, some errors, including "cannot redeclare Class::method()" + // cause PHP to fatal immediately with E_COMPILE_ERROR. Treat these like + // the similar errors which raise E_ERROR. + + // See also T12190. + + $old_last = error_get_last(); + + try { + $old = error_reporting(E_ERROR | E_COMPILE_ERROR); + $okay = include_once $path; + error_reporting($old); + } catch (Exception $ex) { + throw $ex; + } catch (ParseError $throwable) { + // NOTE: As of PHP7, syntax errors may raise a ParseError (which is a + // Throwable, not an Exception) with a useless message (like "syntax + // error, unexpected ':'") and a trace which ends a level above this. + + // Treating this object normally results in an unusable message which + // does not identify where the syntax error occurred. Converting it to + // a string and taking the first line gives us something reasonable, + // however. + $message = (string)$throwable; + $message = preg_split("/\n/", $message); + $message = reset($message); + + throw new Exception($message); + } + + if (!$okay) { + throw new Exception("Source file \"{$path}\" failed to load."); + } + + $new_last = error_get_last(); + if ($new_last !== null) { + if ($new_last !== $old_last) { + $message = $new_last['message']; + throw new Exception( + "Error while loading file \"{$path}\": {$message}"); + } + } + } + + private function loadExtension($library, $root, $path) { + $old_functions = get_defined_functions(); + $old_functions = array_fill_keys($old_functions['user'], true); + $old_classes = array_fill_keys(get_declared_classes(), true); + $old_interfaces = array_fill_keys(get_declared_interfaces(), true); + + $this->executeInclude($path); + + $new_functions = get_defined_functions(); + $new_functions = array_fill_keys($new_functions['user'], true); + $new_classes = array_fill_keys(get_declared_classes(), true); + $new_interfaces = array_fill_keys(get_declared_interfaces(), true); + + $add_functions = array_diff_key($new_functions, $old_functions); + $add_classes = array_diff_key($new_classes, $old_classes); + $add_interfaces = array_diff_key($new_interfaces, $old_interfaces); + + // NOTE: We can't trust the path we loaded to be the location of these + // symbols, because it might have loaded other paths. + + foreach ($add_functions as $func => $ignored) { + $rfunc = new ReflectionFunction($func); + $fpath = Filesystem::resolvePath($rfunc->getFileName(), $root); + $this->extensionMaps[$library]['function'][$func] = $fpath; + } + + foreach ($add_classes + $add_interfaces as $class => $ignored) { + $rclass = new ReflectionClass($class); + $cpath = Filesystem::resolvePath($rclass->getFileName(), $root); + $this->extensionMaps[$library]['class'][$class] = $cpath; + + $xmap = $rclass->getInterfaceNames(); + $parent = $rclass->getParentClass(); + if ($parent) { + $xmap[] = $parent->getName(); + } + + if ($xmap) { + foreach ($xmap as $parent_class) { + $this->classTree[$parent_class][] = $class; + } + + if (count($xmap) == 1) { + $xmap = head($xmap); + } + + $this->extensionMaps[$library]['xmap'][$class] = $xmap; + } + } + + // Clear the extended library cache (should one exist) so we know that + // we need to rebuild it. + unset($this->extendedMaps[$library]); + } + +} diff --git a/src/moduleutils/PhutilBootloaderException.php b/src/moduleutils/PhutilBootloaderException.php new file mode 100644 --- /dev/null +++ b/src/moduleutils/PhutilBootloaderException.php @@ -0,0 +1,3 @@ +library = $library; + $this->oldPath = $old_path; + $this->newPath = $new_path; + + parent::__construct(pht( + "Library conflict! The library '%s' has already been loaded (from '%s') ". + "but is now being loaded again from a new location ('%s'). You can not ". + "load multiple copies of the same library into a program.", + $library, + $old_path, + $new_path)); + } + + /** + * Retrieve the name of the library in conflict. + * + * @return string The name of the library which conflicts with an existing + * library. + * @task info + */ + public function getLibrary() { + return $this->library; + } + + /** + * Get the path to the library which has already been loaded earlier in the + * program's execution. + * + * @return string The path of the already-loaded library. + * @task info + */ + public function getOldPath() { + return $this->oldPath; + } + + /** + * Get the path to the library which is causing this conflict. + * + * @return string The path of the attempting-to-load library. + * @task info + */ + public function getNewPath() { + return $this->newPath; + } + +} diff --git a/src/moduleutils/PhutilLibraryMapBuilder.php b/src/moduleutils/PhutilLibraryMapBuilder.php new file mode 100644 --- /dev/null +++ b/src/moduleutils/PhutilLibraryMapBuilder.php @@ -0,0 +1,511 @@ +root = $root; + } + + /** + * Control status output. Use `--quiet` to set this. + * + * @param bool If true, don't show status output. + * @return this + * + * @task map + */ + public function setQuiet($quiet) { + $this->quiet = $quiet; + return $this; + } + + /** + * Control subprocess parallelism limit. Use `--limit` to set this. + * + * @param int Maximum number of subprocesses to run in parallel. + * @return this + * + * @task map + */ + public function setSubprocessLimit($limit) { + $this->subprocessLimit = $limit; + return $this; + } + + /** + * Get the map of symbols in this library, analyzing the library to build it + * if necessary. + * + * @return map Information about symbols in this library. + * + * @task map + */ + public function buildMap() { + if ($this->librarySymbolMap === null) { + $this->analyzeLibrary(); + } + return $this->librarySymbolMap; + } + + + /** + * Get the map of files in this library, analyzing the library to build it + * if necessary. + * + * Returns a map of file paths to information about symbols used and defined + * in the file. + * + * @return map Information about files in this library. + * + * @task map + */ + public function buildFileSymbolMap() { + if ($this->fileSymbolMap === null) { + $this->analyzeLibrary(); + } + return $this->fileSymbolMap; + } + + /** + * Build and update the library map. + * + * @return void + * + * @task map + */ + public function buildAndWriteMap() { + $library_map = $this->buildMap(); + + $this->log(pht('Writing map...')); + $this->writeLibraryMap($library_map); + } + + /** + * Write a status message to the user, if not running in quiet mode. + * + * @param string Message to write. + * @return this + * + * @task map + */ + private function log($message) { + if (!$this->quiet) { + @fwrite(STDERR, "%s\n", $message); + } + return $this; + } + + +/* -( Path Management )---------------------------------------------------- */ + + /** + * Get the path to some file in the library. + * + * @param string A library-relative path. If omitted, returns the library + * root path. + * @return string An absolute path. + * + * @task path + */ + private function getPath($path = '') { + return $this->root.'/'.$path; + } + + /** + * Get the path to the symbol cache file. + * + * @return string Absolute path to symbol cache. + * + * @task path + */ + private function getPathForSymbolCache() { + return $this->getPath('.phutil_module_cache'); + } + + /** + * Get the path to the map file. + * + * @return string Absolute path to the library map. + * + * @task path + */ + private function getPathForLibraryMap() { + return $this->getPath('__phutil_library_map__.php'); + } + + /** + * Get the path to the library init file. + * + * @return string Absolute path to the library init file + * + * @task path + */ + private function getPathForLibraryInit() { + return $this->getPath('__phutil_library_init__.php'); + } + + +/* -( Symbol Analysis and Caching )---------------------------------------- */ + + /** + * Load the library symbol cache, if it exists and is readable and valid. + * + * @return dict Map of content hashes to cache of output from + * `phutil_symbols.php`. + * + * @task symbol + */ + private function loadSymbolCache() { + $cache_file = $this->getPathForSymbolCache(); + + try { + $cache = Filesystem::readFile($cache_file); + } catch (Exception $ex) { + $cache = null; + } + + $symbol_cache = array(); + if ($cache) { + try { + $symbol_cache = phutil_json_decode($cache); + } catch (PhutilJSONParserException $ex) { + $symbol_cache = array(); + } + } + + $version = idx($symbol_cache, self::SYMBOL_CACHE_VERSION_KEY); + if ($version != self::SYMBOL_CACHE_VERSION) { + // Throw away caches from a different version of the library. + $symbol_cache = array(); + } + unset($symbol_cache[self::SYMBOL_CACHE_VERSION_KEY]); + + return $symbol_cache; + } + + /** + * Write a symbol map to disk cache. + * + * @param dict Symbol map of relative paths to symbols. + * @param dict Source map (like @{method:loadSourceFileMap}). + * @return void + * + * @task symbol + */ + private function writeSymbolCache(array $symbol_map, array $source_map) { + $cache_file = $this->getPathForSymbolCache(); + + $cache = array( + self::SYMBOL_CACHE_VERSION_KEY => self::SYMBOL_CACHE_VERSION, + ); + + foreach ($symbol_map as $file => $symbols) { + $cache[$source_map[$file]] = $symbols; + } + + $json = json_encode($cache); + try { + Filesystem::writeFile($cache_file, $json); + } catch (FilesystemException $ex) { + $this->log(pht('Unable to save the cache!')); + } + } + + /** + * Drop the symbol cache, forcing a clean rebuild. + * + * @return this + * + * @task symbol + */ + public function dropSymbolCache() { + $this->log(pht('Dropping symbol cache...')); + Filesystem::remove($this->getPathForSymbolCache()); + } + + /** + * Build a future which returns a `phutil_symbols.php` analysis of a source + * file. + * + * @param string Relative path to the source file to analyze. + * @return Future Analysis future. + * + * @task symbol + */ + private function buildSymbolAnalysisFuture($file) { + $absolute_file = $this->getPath($file); + $bin = dirname(__FILE__).'/../../scripts/phutil_symbols.php'; + + return new ExecFuture('php %s --ugly -- %s', $bin, $absolute_file); + } + + +/* -( Source Management )-------------------------------------------------- */ + + /** + * Build a map of all source files in a library to hashes of their content. + * Returns an array like this: + * + * array( + * 'src/parser/ExampleParser.php' => '60b725f10c9c85c70d97880dfe8191b3', + * // ... + * ); + * + * @return dict Map of library-relative paths to content hashes. + * @task source + */ + private function loadSourceFileMap() { + $root = $this->getPath(); + + $init = $this->getPathForLibraryInit(); + if (!Filesystem::pathExists($init)) { + throw new Exception( + pht( + "Provided path '%s' is not a %s library.", + $root, + 'phutil')); + } + + $files = id(new FileFinder($root)) + ->withType('f') + ->withSuffix('php') + ->excludePath('*/.*') + ->setGenerateChecksums(true) + ->find(); + + $map = array(); + foreach ($files as $file => $hash) { + $file = Filesystem::readablePath($file, $root); + $file = ltrim($file, '/'); + + if (dirname($file) == '.') { + // We don't permit normal source files at the root level, so just ignore + // them; they're special library files. + continue; + } + + if (dirname($file) == 'extensions') { + // Ignore files in the extensions/ directory. + continue; + } + + // We include also filename in the hash to handle cases when the file is + // moved without modifying its content. + $map[$file] = md5($hash.$file); + } + + return $map; + } + + /** + * Convert the symbol analysis of all the source files in the library into + * a library map. + * + * @param dict Symbol analysis of all source files. + * @return dict Library map. + * @task source + */ + private function buildLibraryMap(array $symbol_map) { + $library_map = array( + 'class' => array(), + 'function' => array(), + 'xmap' => array(), + ); + + // Detect duplicate symbols within the library. + foreach ($symbol_map as $file => $info) { + foreach ($info['have'] as $type => $symbols) { + foreach ($symbols as $symbol => $declaration) { + $lib_type = ($type == 'interface') ? 'class' : $type; + if (!empty($library_map[$lib_type][$symbol])) { + $prior = $library_map[$lib_type][$symbol]; + throw new Exception( + pht( + "Definition of %s '%s' in file '%s' duplicates prior ". + "definition in file '%s'. You can not declare the ". + "same symbol twice.", + $type, + $symbol, + $file, + $prior)); + } + $library_map[$lib_type][$symbol] = $file; + } + } + $library_map['xmap'] += $info['xmap']; + } + + // Simplify the common case (one parent) to make the file a little easier + // to deal with. + foreach ($library_map['xmap'] as $class => $extends) { + if (count($extends) == 1) { + $library_map['xmap'][$class] = reset($extends); + } + } + + // Sort the map so it is relatively stable across changes. + foreach ($library_map as $key => $symbols) { + ksort($symbols); + $library_map[$key] = $symbols; + } + ksort($library_map); + + return $library_map; + } + + /** + * Write a finalized library map. + * + * @param dict Library map structure to write. + * @return void + * + * @task source + */ + private function writeLibraryMap(array $library_map) { + $map_file = $this->getPathForLibraryMap(); + $version = self::LIBRARY_MAP_VERSION; + + $library_map = array( + self::LIBRARY_MAP_VERSION_KEY => $version, + ) + $library_map; + + $library_map = phutil_var_export($library_map); + $at = '@'; + + $source_file = <<log(pht('Finding source files...')); + $source_map = $this->loadSourceFileMap(); + $this->log( + pht('Found %s files.', new PhutilNumber(count($source_map)))); + + // Load the symbol cache with existing parsed symbols. This allows us + // to remap libraries quickly by analyzing only changed files. + $this->log(pht('Loading symbol cache...')); + $symbol_cache = $this->loadSymbolCache(); + + // If the XHPAST binary is not up-to-date, build it now. Otherwise, + // `phutil_symbols.php` will attempt to build the binary and will fail + // miserably because it will be trying to build the same file multiple + // times in parallel. + if (!PhutilXHPASTBinary::isAvailable()) { + PhutilXHPASTBinary::build(); + } + + // Build out the symbol analysis for all the files in the library. For + // each file, check if it's in cache. If we miss in the cache, do a fresh + // analysis. + $symbol_map = array(); + $futures = array(); + foreach ($source_map as $file => $hash) { + if (!empty($symbol_cache[$hash])) { + $symbol_map[$file] = $symbol_cache[$hash]; + continue; + } + $futures[$file] = $this->buildSymbolAnalysisFuture($file); + } + $this->log( + pht('Found %s files in cache.', new PhutilNumber(count($symbol_map)))); + + // Run the analyzer on any files which need analysis. + if ($futures) { + $limit = $this->subprocessLimit; + + $this->log( + pht( + 'Analyzing %s file(s) with %s subprocess(es)...', + phutil_count($futures), + new PhutilNumber($limit))); + + $progress = new PhutilConsoleProgressBar(); + if ($this->quiet) { + $progress->setQuiet(true); + } + $progress->setTotal(count($futures)); + + $futures = id(new FutureIterator($futures)) + ->limit($limit); + foreach ($futures as $file => $future) { + $result = $future->resolveJSON(); + if (empty($result['error'])) { + $symbol_map[$file] = $result; + } else { + $progress->done(false); + throw new XHPASTSyntaxErrorException( + $result['line'], + $file.': '.$result['error']); + } + $progress->update(1); + } + $progress->done(); + } + + $this->fileSymbolMap = $symbol_map; + + // We're done building the cache, so write it out immediately. Note that + // we've only retained entries for files we found, so this implicitly cleans + // out old cache entries. + $this->writeSymbolCache($symbol_map, $source_map); + + // Our map is up to date, so either show it on stdout or write it to disk. + $this->log(pht('Building library map...')); + + $this->librarySymbolMap = $this->buildLibraryMap($symbol_map); + } + + +} diff --git a/src/moduleutils/__tests__/PhutilModuleUtilsTestCase.php b/src/moduleutils/__tests__/PhutilModuleUtilsTestCase.php new file mode 100644 --- /dev/null +++ b/src/moduleutils/__tests__/PhutilModuleUtilsTestCase.php @@ -0,0 +1,9 @@ +assertEqual('phutil', phutil_get_current_library_name()); + } + +} diff --git a/src/moduleutils/core.php b/src/moduleutils/core.php new file mode 100644 --- /dev/null +++ b/src/moduleutils/core.php @@ -0,0 +1,13 @@ +registerLibrary($library, $path); +} + +function phutil_register_library_map(array $map) { + PhutilBootloader::getInstance()->registerLibraryMap($map); +} + +function phutil_load_library($path) { + PhutilBootloader::getInstance()->loadLibrary($path); +} diff --git a/src/moduleutils/moduleutils.php b/src/moduleutils/moduleutils.php new file mode 100644 --- /dev/null +++ b/src/moduleutils/moduleutils.php @@ -0,0 +1,49 @@ +getLibraryRoot($library); +} + +function phutil_get_library_root_for_path($path) { + foreach (Filesystem::walkToRoot($path) as $dir) { + if (Filesystem::pathExists($dir.'/__phutil_library_init__.php')) { + return $dir; + } + } + return null; +} + +function phutil_get_library_name_for_root($path) { + $path = rtrim(Filesystem::resolvePath($path), '/'); + + $bootloader = PhutilBootloader::getInstance(); + $libraries = $bootloader->getAllLibraries(); + foreach ($libraries as $library) { + $root = $bootloader->getLibraryRoot($library); + if (rtrim(Filesystem::resolvePath($root), '/') == $path) { + return $library; + } + } + + return null; +} + +function phutil_get_current_library_name() { + $caller = head(debug_backtrace(false)); + + $root = phutil_get_library_root_for_path($caller['file']); + return phutil_get_library_name_for_root($root); +} + +/** + * Warns about use of deprecated behavior. + */ +function phutil_deprecated($what, $why) { + PhutilErrorHandler::dispatchErrorMessage( + PhutilErrorHandler::DEPRECATED, + $what, + array( + 'why' => $why, + )); +} diff --git a/src/object/Phobject.php b/src/object/Phobject.php new file mode 100644 --- /dev/null +++ b/src/object/Phobject.php @@ -0,0 +1,104 @@ +throwOnAttemptedIteration(); + } + + public function key() { + $this->throwOnAttemptedIteration(); + } + + public function next() { + $this->throwOnAttemptedIteration(); + } + + public function rewind() { + $this->throwOnAttemptedIteration(); + } + + public function valid() { + $this->throwOnAttemptedIteration(); + } + + private function throwOnAttemptedIteration() { + throw new DomainException( + pht( + 'Attempting to iterate an object (of class %s) which is not iterable.', + get_class($this))); + } + + + /** + * Read the value of a class constant. + * + * This is the same as just typing `self::CONSTANTNAME`, but throws a more + * useful message if the constant is not defined and allows the constant to + * be limited to a maximum length. + * + * @param string Name of the constant. + * @param int|null Maximum number of bytes permitted in the value. + * @return string Value of the constant. + */ + public function getPhobjectClassConstant($key, $byte_limit = null) { + $class = new ReflectionClass($this); + + $const = $class->getConstant($key); + if ($const === false) { + throw new Exception( + pht( + '"%s" class "%s" must define a "%s" constant.', + __CLASS__, + get_class($this), + $key)); + } + + if ($byte_limit !== null) { + if (!is_string($const) || (strlen($const) > $byte_limit)) { + throw new Exception( + pht( + '"%s" class "%s" has an invalid "%s" property. Field constants '. + 'must be strings and no more than %s bytes in length.', + __CLASS__, + get_class($this), + $key, + new PhutilNumber($byte_limit))); + } + } + + return $const; + } + +} diff --git a/src/object/__tests__/PhobjectTestCase.php b/src/object/__tests__/PhobjectTestCase.php new file mode 100644 --- /dev/null +++ b/src/object/__tests__/PhobjectTestCase.php @@ -0,0 +1,40 @@ +duck; + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof DomainException); + + $caught = null; + try { + $object->duck = 'quack'; + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof DomainException); + } + + public function testThrowOnIteration() { + $object = new PhutilTestPhobject(); + + $caught = null; + try { + foreach ($object as $item) { + // ... + } + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof DomainException); + } + +} diff --git a/src/object/__tests__/PhutilTestPhobject.php b/src/object/__tests__/PhutilTestPhobject.php new file mode 100644 --- /dev/null +++ b/src/object/__tests__/PhutilTestPhobject.php @@ -0,0 +1,3 @@ +setBugtraqPattern('http://bugs.com/%BUGID%') + * ->setBugtraqCaptureExpression('/[Ii]ssues?:?(\s*,?\s*#\d+)+/') + * ->setBugtraqSelectExpression('/(\d+)/') + * ->processCorpus($message); + * + * This will produce: + * + * Issues: http://bugs.com/123, http://bugs.com/345 + * + */ +final class PhutilBugtraqParser extends Phobject { + + private $bugtraqPattern; + private $bugtraqCaptureExpression; + private $bugtraqSelectExpression; + + public function setBugtraqPattern($pattern) { + $this->bugtraqPattern = $pattern; + return $this; + } + + public function setBugtraqCaptureExpression($regex) { + PhutilTypeSpec::newFromString('regex')->check($regex); + + $this->bugtraqCaptureExpression = $regex; + return $this; + } + + public function setBugtraqSelectExpression($regex) { + PhutilTypeSpec::newFromString('regex')->check($regex); + + $this->bugtraqSelectExpression = $regex; + return $this; + } + + public function processCorpus($corpus) { + $regexp = $this->bugtraqCaptureExpression; + $matches = null; + $flags = PREG_SET_ORDER | PREG_OFFSET_CAPTURE; + + // First, find all the matching text ranges. We do this up front because + // when we do the replacement pass at the end, the whole thing needs to go + // in reverse order. + + preg_match_all($regexp, $corpus, $matches, $flags); + $captures = array(); + foreach ($matches as $match) { + list($captured_text, $captured_offset) = $match[0]; + $captures[] = array( + 'text' => $captured_text, + 'at' => $captured_offset, + ); + } + + // Find the actual bug IDs. If there's a selection expression, we use that + // to pick bug IDs out of a larger context. For example, the syntax may be: + // + // Issues: 123, 124 + // + // In this case, "123" and "124" are the issue IDs, and could be selected + // with an expression like: + // + // /(\d+)/ + // + // If there's no selection expression, we use the entire match. + + $bug_ids = array(); + $select_regexp = $this->bugtraqSelectExpression; + foreach ($captures as $capture) { + $captured_text = $capture['text']; + $captured_offset = $capture['at']; + + if (strlen($select_regexp)) { + $selections = null; + preg_match_all( + $select_regexp, + $captured_text, + $selections, + PREG_OFFSET_CAPTURE); + + foreach ($selections[1] as $selection) { + $bug_ids[] = array( + 'text' => $selection[0], + 'at' => $captured_offset + $selection[1], + ); + } + } else { + $bug_ids[] = array( + 'text' => $captured_text, + 'at' => $captured_offset, + ); + } + } + + // Now that we have all the bug IDs to replace, replace them (in reverse + // order, so the offsets don't get messed up). + $bug_ids = array_reverse($bug_ids); + foreach ($bug_ids as $bug) { + $new_text = str_replace( + '%BUGID%', + $bug['text'], + $this->bugtraqPattern); + + $corpus = substr_replace( + $corpus, + $new_text, + $bug['at'], + strlen($bug['text'])); + } + + return $corpus; + } + +} diff --git a/src/parser/PhutilDocblockParser.php b/src/parser/PhutilDocblockParser.php new file mode 100644 --- /dev/null +++ b/src/parser/PhutilDocblockParser.php @@ -0,0 +1,163 @@ + line number. + $map = array(); + $lines = explode("\n", $text); + $num = 1; + foreach ($lines as $line) { + $len = strlen($line) + 1; + for ($jj = 0; $jj < $len; $jj++) { + $map[] = $num; + } + ++$num; + } + + foreach ($matches[0] as $match) { + list($data, $offset) = $match; + $blocks[] = array($data, $map[$offset]); + } + + return $blocks; + } + + public function parse($docblock) { + // Strip off comments. + $docblock = trim($docblock); + $docblock = preg_replace('@^/\*\*@', '', $docblock); + $docblock = preg_replace('@\*/$@', '', $docblock); + $docblock = preg_replace('@^\s*\*@m', '', $docblock); + + // Normalize multi-line @specials. + $lines = explode("\n", $docblock); + $last = false; + foreach ($lines as $k => $line) { + + // NOTE: We allow "@specials" to be preceded by up to two whitespace + // characters; more than that and we assume the block is a code block. + // Broadly, there's ambiguity between a special like: + // + // <... lots of indentation ...> @author alincoln + // + // ...and a code block like: + // + // <... lots of indentation ...> @def square(x, y): + // + // Because standard practice is to indent the entire block one level, + // we allow that and one additional space before assuming something is + // a code block. + + if (preg_match('/^\s{0,2}@\w/i', $line)) { + $last = $k; + $lines[$last] = trim($line); + } else if (preg_match('/^\s*$/', $line)) { + $last = false; + } else if ($last !== false) { + $lines[$last] = $lines[$last].' '.trim($line); + unset($lines[$k]); + } + } + + $docblock = implode("\n", $lines); + + $special = array(); + + // Parse @specials. + $matches = null; + $have_specials = preg_match_all( + '/^@([\w-]+)[ \t]*([^\n]*)/m', + $docblock, + $matches, + PREG_SET_ORDER); + + if ($have_specials) { + $docblock = preg_replace( + '/^@([\w-]+)[ \t]*([^\n]*)?\n*/m', + '', + $docblock); + foreach ($matches as $match) { + list($_, $type, $data) = $match; + $data = trim($data); + + // For flags like "@stable" which don't have any string data, set the + // value to true. + if (!strlen($data)) { + $data = true; + } + + if (!isset($special[$type])) { + $special[$type] = $data; + } else { + if (!is_array($special[$type])) { + $special[$type] = (array)$special[$type]; + } + $special[$type][] = $data; + } + } + } + + // Convert `array(true, true, true)` to `true`. + foreach ($special as $type => $data) { + if (is_array($data)) { + $all_trues = true; + + foreach ($data as $value) { + if ($value !== true) { + $all_trues = false; + break; + } + } + + if ($all_trues) { + $special[$type] = true; + } + } + } + + $docblock = str_replace("\t", ' ', $docblock); + + // Smush the whole docblock to the left edge. + $min_indent = 80; + $indent = 0; + foreach (array_filter(explode("\n", $docblock)) as $line) { + for ($ii = 0; $ii < strlen($line); $ii++) { + if ($line[$ii] != ' ') { + break; + } + $indent++; + } + $min_indent = min($indent, $min_indent); + } + + $docblock = preg_replace( + '/^'.str_repeat(' ', $min_indent).'/m', + '', + $docblock); + $docblock = rtrim($docblock); + // Trim any empty lines off the front, but leave the indent level if there + // is one. + $docblock = preg_replace('/^\s*\n/', '', $docblock); + + return array($docblock, $special); + } + +} diff --git a/src/parser/PhutilEditorConfig.php b/src/parser/PhutilEditorConfig.php new file mode 100644 --- /dev/null +++ b/src/parser/PhutilEditorConfig.php @@ -0,0 +1,195 @@ + array( + 'latin1', + 'utf-8', + 'utf-8-bom', + 'utf-16be', + 'utf-16le', + ), + self::END_OF_LINE => array('lf', 'cr', 'crlf'), + self::INDENT_SIZE => 'int|string', + self::INDENT_STYLE => array('space', 'tab'), + self::FINAL_NEWLINE => 'bool', + self::LINE_LENGTH => 'int', + self::TAB_WIDTH => 'int', + self::TRAILING_WHITESPACE => 'bool', + ); + + private $root; + + /** + * Constructor. + * + * @param string The root directory. + */ + public function __construct($root) { + $this->root = $root; + } + + /** + * Get the specified EditorConfig property for the specified path. + * + * @param string + * @param string + * @return wild + */ + public function getProperty($path, $key) { + if (!idx(self::$knownProperties, $key)) { + throw new InvalidArgumentException(pht('Invalid EditorConfig property.')); + } + + $props = $this->getProperties($path); + + switch ($key) { + case self::INDENT_SIZE: + if (idx($props, self::INDENT_SIZE) === null && + idx($props, self::INDENT_STYLE) === 'tab') { + return 'tab'; + } else if (idx($props, self::INDENT_SIZE) === 'tab' && + idx($props, self::TAB_WIDTH) === null) { + return idx($props, self::TAB_WIDTH); + } + break; + + case self::TAB_WIDTH: + if (idx($props, self::TAB_WIDTH) === null && + idx($props, self::INDENT_SIZE) !== null && + idx($props, self::INDENT_SIZE) !== 'tab') { + return idx($props, self::INDENT_SIZE); + } + break; + } + + return idx($props, $key); + } + + /** + * Get the EditorConfig properties for the specified path. + * + * Returns a map containing all of the EditorConfig properties which apply + * to the specified path. The following rules are applied when processing + * EditorConfig files: + * + * - If a glob does not contain `/`, it can match a path in any subdirectory. + * - If the first character of a glob is `/`, it will only match files in the + * same directory as the `.editorconfig` file. + * - Properties and values are case-insensitive. + * - Unknown properties will be silently ignored. + * - Values are not validated against the specification (this may change in + * the future). + * - Invalid glob patterns will be silently ignored. + * + * @param string + * @return map + */ + public function getProperties($path) { + $configs = $this->getEditorConfigs($path); + $matches = array(); + + foreach ($configs as $config) { + list($path_prefix, $editorconfig) = $config; + + foreach ($editorconfig as $glob => $properties) { + if (!$glob) { + continue; + } + + if (strpos($glob, '/') === false) { + $glob = '**/'.$glob; + } else if (strncmp($glob, '/', 0)) { + $glob = substr($glob, 1); + } + + $glob = $path_prefix.'/'.$glob; + try { + if (!phutil_fnmatch($glob, $path)) { + continue; + } + } catch (Exception $ex) { + // Invalid glob pattern... ignore it. + continue; + } + + foreach ($properties as $property => $value) { + $property = strtolower($property); + + if (!idx(self::$knownProperties, $property)) { + // Unknown property... ignore it. + continue; + } + + if (is_string($value)) { + $value = strtolower($value); + } + if ($value === '') { + $value = null; + } + $matches[$property] = $value; + } + } + } + + return $matches; + } + + /** + * Returns the EditorConfig files which affect the specified path. + * + * Find and parse all `.editorconfig` files between the specified path and + * the root directory. The results are returned in the same order that they + * should be matched. + * + * return list> + */ + private function getEditorConfigs($path) { + $configs = array(); + $found_root = false; + $root = $this->root; + + do { + $path = dirname($path); + $file = $path.'/.editorconfig'; + + if (!Filesystem::pathExists($file)) { + continue; + } + + $contents = Filesystem::readFile($file); + $config = phutil_ini_decode($contents); + + if (idx($config, 'root') === true) { + $found_root = true; + } + unset($config['root']); + array_unshift($configs, array($path, $config)); + + if ($found_root) { + break; + } + } while ($path != $root && Filesystem::isDescendant($path, $root)); + + return $configs; + } + +} diff --git a/src/parser/PhutilEmailAddress.php b/src/parser/PhutilEmailAddress.php new file mode 100644 --- /dev/null +++ b/src/parser/PhutilEmailAddress.php @@ -0,0 +1,114 @@ +$/', $email_address, $matches)) { + $display_name = trim($matches[1], '\'" '); + if (strpos($matches[2], '@') !== false) { + list($local_part, $domain_name) = explode('@', $matches[2], 2); + } else { + $local_part = $matches[2]; + $domain_name = null; + } + } else if (preg_match('/^(.*)@(.*)$/', $email_address, $matches)) { + $display_name = null; + $local_part = $matches[1]; + $domain_name = $matches[2]; + } else { + $display_name = null; + $local_part = $email_address; + $domain_name = null; + } + + $this->displayName = $display_name; + $this->localPart = $local_part; + $this->domainName = $domain_name; + } + + public function __toString() { + $address = $this->getAddress(); + if (strlen($this->displayName)) { + $display_name = $this->encodeDisplayName($this->displayName); + return $display_name.' <'.$address.'>'; + } else { + return $address; + } + } + + public function setDisplayName($display_name) { + $this->displayName = $display_name; + return $this; + } + + public function getDisplayName() { + return $this->displayName; + } + + public function setLocalPart($local_part) { + $this->localPart = $local_part; + return $this; + } + + public function getLocalPart() { + return $this->localPart; + } + + public function setDomainName($domain_name) { + $this->domainName = $domain_name; + return $this; + } + + public function getDomainName() { + return $this->domainName; + } + + public function setAddress($address) { + $parts = explode('@', $address, 2); + + $this->localPart = $parts[0]; + if (isset($parts[1])) { + $this->domainName = $parts[1]; + } + + return $this; + } + + public function getAddress() { + $address = $this->localPart; + if (strlen($this->domainName)) { + $address .= '@'.$this->domainName; + } + return $address; + } + + private function encodeDisplayName($name) { + // NOTE: This is a reasonable effort based on a cursory reading of + // RFC2822, but may be significantly misguided. + + // Newlines are not permitted, even when escaped. Discard them. + $name = preg_replace("/\s*[\r\n]+\s*/", ' ', $name); + + // Escape double quotes and backslashes. + $name = addcslashes($name, '\\"'); + + // Quote the string. + $name = '"'.$name.'"'; + + return $name; + } + +} diff --git a/src/parser/PhutilGitURI.php b/src/parser/PhutilGitURI.php new file mode 100644 --- /dev/null +++ b/src/parser/PhutilGitURI.php @@ -0,0 +1,92 @@ +parseURI($uri); + if ($parts) { + $this->user = $parts[1]; + $this->domain = $parts[2]; + $this->path = $parts[3]; + } + } + + private static function parseURI($uri) { + // See T4913. Fail the parse if there is leading whitespace; stricter + // systems will not accept these URIs. + if (ltrim($uri) !== $uri) { + return null; + } + + $user = '(?:([^@]+)@)?'; + $domain = '([^:]+)'; + $path = ':(.*)'; + + $regexp = '/^'.$user.$domain.$path.'$/'; + $matches = null; + $ok = preg_match($regexp, $uri, $matches); + if ($ok) { + return array_pad($matches, 4, ''); + } + + return null; + } + + public function __toString() { + $user = null; + if ($this->user) { + $user = $this->user.'@'; + } + + $domain = $this->domain; + $path = $this->path; + + return $user.$domain.':'.$path; + } + + public function setDomain($domain) { + $this->domain = $domain; + return $this; + } + + public function getDomain() { + return $this->domain; + } + + public function setPath($path) { + $this->path = $path; + return $this; + } + + public function getPath() { + return $this->path; + } + + public function setUser($user) { + $this->user = $user; + return $this; + } + + public function getUser() { + return $this->user; + } + +} diff --git a/src/parser/PhutilJSON.php b/src/parser/PhutilJSON.php new file mode 100644 --- /dev/null +++ b/src/parser/PhutilJSON.php @@ -0,0 +1,155 @@ +encodeFormattedObject($object, 0)."\n"; + } + + + /** + * Encode a list in JSON and pretty-print it, discarding keys. + * + * @param list List to encode in JSON. + * @return string Pretty-printed list representation. + */ + public function encodeAsList(array $list) { + return $this->encodeFormattedArray($list, 0)."\n"; + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * Pretty-print a JSON object. + * + * @param dict Object to format. + * @param int Current depth, for indentation. + * @return string Pretty-printed value. + * @task internal + */ + private function encodeFormattedObject($object, $depth) { + if (empty($object)) { + return '{}'; + } + + $pre = $this->getIndent($depth); + $key_pre = $this->getIndent($depth + 1); + $keys = array(); + $vals = array(); + $max = 0; + foreach ($object as $key => $val) { + $ekey = $this->encodeFormattedValue((string)$key, 0); + $max = max($max, strlen($ekey)); + $keys[] = $ekey; + $vals[] = $this->encodeFormattedValue($val, $depth + 1); + } + $key_lines = array(); + foreach ($keys as $k => $key) { + $key_lines[] = $key_pre.$key.': '.$vals[$k]; + } + $key_lines = implode(",\n", $key_lines); + + $out = "{\n"; + $out .= $key_lines; + $out .= "\n"; + $out .= $pre.'}'; + + return $out; + } + + + /** + * Pretty-print a JSON list. + * + * @param list List to format. + * @param int Current depth, for indentation. + * @return string Pretty-printed value. + * @task internal + */ + private function encodeFormattedArray($array, $depth) { + if (empty($array)) { + return '[]'; + } + + $pre = $this->getIndent($depth); + $val_pre = $this->getIndent($depth + 1); + + $vals = array(); + foreach ($array as $val) { + $vals[] = $val_pre.$this->encodeFormattedValue($val, $depth + 1); + } + $val_lines = implode(",\n", $vals); + + $out = "[\n"; + $out .= $val_lines; + $out .= "\n"; + $out .= $pre.']'; + + return $out; + } + + + /** + * Pretty-print a JSON value. + * + * @param dict Value to format. + * @param int Current depth, for indentation. + * @return string Pretty-printed value. + * @task internal + */ + private function encodeFormattedValue($value, $depth) { + if (is_array($value)) { + if (empty($value) || array_keys($value) === range(0, count($value) - 1)) { + return $this->encodeFormattedArray($value, $depth); + } else { + return $this->encodeFormattedObject($value, $depth); + } + } else { + if (defined('JSON_UNESCAPED_SLASHES')) { + // If we have a new enough version of PHP, disable escaping of slashes + // when pretty-printing values. Escaping slashes can defuse an attack + // where the attacker embeds "" inside a JSON string, but that + // isn't relevant when rendering JSON for human viewers. + return json_encode($value, JSON_UNESCAPED_SLASHES); + } else { + return json_encode($value); + } + } + } + + + /** + * Render a string corresponding to the current indent depth. + * + * @param int Current depth. + * @return string Indentation. + * @task internal + */ + private function getIndent($depth) { + if (!$depth) { + return ''; + } else { + return str_repeat(' ', $depth); + } + } + +} diff --git a/src/parser/PhutilJSONParser.php b/src/parser/PhutilJSONParser.php new file mode 100644 --- /dev/null +++ b/src/parser/PhutilJSONParser.php @@ -0,0 +1,62 @@ +allowDuplicateKeys = $allow_duplicate_keys; + return $this; + } + + public function parse($json) { + $jsonlint_root = phutil_get_library_root('phutil').'/../externals/jsonlint'; + require_once $jsonlint_root.'/src/Seld/JsonLint/JsonParser.php'; + require_once $jsonlint_root.'/src/Seld/JsonLint/Lexer.php'; + require_once $jsonlint_root.'/src/Seld/JsonLint/ParsingException.php'; + require_once $jsonlint_root.'/src/Seld/JsonLint/Undefined.php'; + + $parser = new JsonLintJsonParser(); + try { + $output = $parser->parse($json, $this->getFlags()); + } catch (JsonLintParsingException $ex) { + $details = $ex->getDetails(); + $message = preg_replace("/^Parse error .*\\^\n/s", '', $ex->getMessage()); + + throw new PhutilJSONParserException( + $message, + idx(idx($details, 'loc', array()), 'last_line'), + idx(idx($details, 'loc', array()), 'last_column'), + idx($details, 'token'), + idx($details, 'expected')); + } + + if (!is_array($output)) { + throw new PhutilJSONParserException( + pht( + '%s is not a valid JSON object.', + PhutilReadableSerializer::printShort($json))); + } + + return $output; + } + + private function getFlags() { + $flags = JsonLintJsonParser::PARSE_TO_ASSOC; + + if ($this->allowDuplicateKeys) { + $flags |= JsonLintJsonParser::ALLOW_DUPLICATE_KEYS; + } else { + $flags |= JsonLintJsonParser::DETECT_KEY_CONFLICTS; + } + + return $flags; + } + +} diff --git a/src/parser/PhutilLanguageGuesser.php b/src/parser/PhutilLanguageGuesser.php new file mode 100644 --- /dev/null +++ b/src/parser/PhutilLanguageGuesser.php @@ -0,0 +1,47 @@ + 1, + // Capture "#!/usr/bin/php" sorts of things. + '@^#!.*bin/(\S+)@' => 1, + // Capture initial " 1, + // Capture emacs "mode" header. + '@^.*-[*]-.*mode\s*:\s*(\S+).*-[*]-.*$@m' => 1, + // Look for things that seem to be diffs. + '/^---.*$\n^[+]{3}.*$\n^@@/m' => 'diff', + '/^diff --git/' => 'diff', + // Look for plausible console output. + '@^(?:\S+[\\\\/] )?[$] @' => 'console', + ); + + foreach ($patterns as $pattern => $language) { + $matches = null; + if (preg_match($pattern, $source, $matches)) { + if (is_numeric($language)) { + return $matches[$language]; + } else { + return $language; + } + } + } + + return null; + } + +} diff --git a/src/parser/PhutilParserGenerator.php b/src/parser/PhutilParserGenerator.php new file mode 100644 --- /dev/null +++ b/src/parser/PhutilParserGenerator.php @@ -0,0 +1,910 @@ +setTerminals(array('a', 'b')) + * ->setStartRule('S') + * ->setRules( + * array( + * 'S' => 'A b', + * 'A' => array( + * 'A a', + * 'a', + * ))) + * ->processGrammar(); + * + * To actually parse token streams, use @{method:parseTokens}. + * + * $tokens = get_tokens(); // Usually from PhutilLexer + * $callback = 'some_callback'; + * $tree = $parser->parseTokens($tokens, $callback); + * + * The callback is invoked when a grammar rule matches. It should have this + * signature: + * + * function parser_callback($rule, $production, array $tokens) { + * // ... + * } + * + * The `$rule` is the matching rule; the `$production` is the matching + * production, and `$tokens` is the matching tokens (for terminal rules) or the + * return value of previous parse callbacks (for nonterminal rules). + * + * You should either return a result of evaluation, or some sort of abstract + * representation of the parse tree (this is more likely to be useful for more + * complex grammars). + * + * NOTE: This class generates LR(1) parsers, which perform less-than-optimally + * on large grammars. Worse, it is written in PHP. It is suitable only for + * very simple grammars with few states. + * + * NOTE: These parsers silently resolve reduce/reduce conflicts by choosing the + * first reduction, and silently resolve shift/reduce conflicts by shifting. + * These are the same rules used by Yacc, but are implicit. + * + * @task rules Grammar Rules + * @task rvalidation Rule Validation + * @task first Computing First() + * @task tables Computing Action and Goto Tables + * @task inspect Inspecting Generator State + */ +final class PhutilParserGenerator extends Phobject { + + private $terminals; + private $rules; + private $startRule = 'start'; + private $states = array(); + private $sets = array(); + private $successor = array(); + private $setHashes = array(); + private $actionTable; + private $gotoTable; + + private $rulesValidated = false; + private $eofSymbol; + private $initSymbol; + private $epsilonSymbol; + private $endSymbol; + + private $firstTable; + + public function processGrammar() { + $this->validateRules(); + $this->buildFirstTable(); + + $init = $this->getInitSymbol(); + $eof = $this->getEOFSymbol(); + $end = $this->getEndSymbol(); + + $this->rules[$init] = array( + array($this->startRule, $end), + ); + list($is_new, $state) = $this->addState( + array( + array($this->getInitSymbol(), 0, 0, $eof), + )); + $this->buildSuccessors($state); + + $this->buildTables(); + + return $this; + } + + +/* -( Grammar Rules )------------------------------------------------------ */ + + + public function setTerminals(array $terminals) { + $this->terminals = array_fill_keys($terminals, true); + return $this; + } + + public function setRules(array $rules) { + $this->rules = $rules; + return $this; + } + + public function setStartRule($rule_name) { + $this->startRule = $rule_name; + return $this; + } + + public function getStartRule() { + return $this->startRule; + } + + public function getEOFSymbol() { + if ($this->eofSymbol === null) { + throw new PhutilInvalidStateException('processGrammar'); + } + return $this->eofSymbol; + } + + public function getInitSymbol() { + if ($this->initSymbol === null) { + throw new PhutilInvalidStateException('processGrammar'); + } + return $this->initSymbol; + } + + public function getEpsilonSymbol() { + if ($this->epsilonSymbol === null) { + throw new PhutilInvalidStateException('processGrammar'); + } + return $this->epsilonSymbol; + } + + public function getEndSymbol() { + if ($this->endSymbol === null) { + throw new PhutilInvalidStateException('processGrammar'); + } + return $this->endSymbol; + } + + public function isTerminal($symbol) { + return isset($this->terminals[$symbol]); + } + + public function isRule($symbol) { + return isset($this->rules[$symbol]); + } + + +/* -( Rule Validation )---------------------------------------------------- */ + + + /** + * Perform a battery of tests on the provided rules to detect problems which + * would prevent us from generating a parser. + * + * @return void + * @task rvalidation + */ + private function validateRules() { + // Rules must be specified in the right format. + $this->parseRules(); + + // Rules must contain only known symbols. + $this->validateRuleSymbols(); + + // The start rule must exist and be valid. + $this->validateStartRule(); + + // Now, we select printable names for special symbols (EOF, epsilon, etc) + // that don't conflict with any symbols in the grammar. + $this->chooseSpecialSymbols(); + + // Make sure every terminal can be reached by some rule. + $this->validateAllTerminalsReachable(); + + // Make sure every rule can be reached. + $this->validateAllRulesReachable(); + + // Make sure every rule has some valid reduction. + $this->validateAllRulesReducible(); + + $this->rulesValidated = true; + } + + + /** + * @task rvalidation + */ + private function parseRules() { + foreach ($this->rules as $rule_name => $rule_variants) { + if (!is_array($rule_variants)) { + $rule_variants = array($rule_variants); + $this->rules[$rule_name] = $rule_variants; + } + foreach ($rule_variants as $vkey => $variant) { + if ($variant === null) { + $variant = array(null); + } else if (!is_array($variant)) { + $variant = preg_split('/\s+/', $variant); + } else { + foreach ($variant as $symbol) { + if (($symbol === null) && count($variant) > 1) { + throw new PhutilInvalidRuleParserGeneratorException( + pht( + "Rule '%s' contains a production '%s' which is ". + "nonempty but has a null in it. A rule with other ". + "may not contain null.", + $rule_name, + $vkey)); + } + } + } + $this->rules[$rule_name][$vkey] = array_values($variant); + } + } + } + + + /** + * @task rvalidation + */ + private function validateRuleSymbols() { + foreach ($this->rules as $rule => $productions) { + foreach ($productions as $production_name => $production) { + foreach ($production as $symbol) { + if ($symbol === null) { + continue; + } + if ($this->isTerminal($symbol)) { + continue; + } + if ($this->isRule($symbol)) { + continue; + } + $production_string = implode(' ', $production); + throw new PhutilUnknownSymbolParserGeneratorException( + pht( + "Symbol '%s' in production '%s' ('%s') of rule '%s' does not ". + "name a rule or terminal. Did you misspell a symbol, fail to ". + "specify a terminal, or forget a rule?", + $symbol, + $production_name, + $production_string, + $rule)); + } + } + } + } + + + /** + * @task rvalidation + */ + private function validateStartRule() { + $start_rule = $this->getStartRule(); + if (!$this->isRule($start_rule)) { + throw new PhutilUnknownSymbolParserGeneratorException( + pht( + "Start rule '%s' does not appear in the rules for the grammar. Use ". + "%s to choose a different start rule, or add a rule named '%s'.", + $start_rule, + 'setStartRule()', + $start_rule)); + } + } + + + /** + * @task rvalidation + */ + private function chooseSpecialSymbols() { + $special = array( + 'eofSymbol' => '(end-of-file)', + 'epsilonSymbol' => '(epsilon)', + 'initSymbol' => '(init)', + 'endSymbol' => '(end)', + ); + + foreach ($special as $key => $value) { + while ($this->isRule($value) || $this->isTerminal($value)) { + $value .= "'"; + } + $special[$key] = $value; + } + + $this->eofSymbol = $special['eofSymbol']; + $this->epsilonSymbol = $special['epsilonSymbol']; + $this->initSymbol = $special['initSymbol']; + $this->endSymbol = $special['endSymbol']; + + foreach ($this->rules as $rule => $productions) { + foreach ($productions as $production_name => $production) { + foreach ($production as $key => $symbol) { + if ($symbol === null) { + $this->rules[$rule][$production_name][$key] = $this->epsilonSymbol; + } + } + $this->rules[$rule][$production_name][] = $this->endSymbol; + } + } + + $this->terminals[$this->getEOFSymbol()] = true; + } + + + /** + * @task rvalidation + */ + private function validateAllTerminalsReachable() { + $seen = array(); + foreach ($this->rules as $rule => $productions) { + foreach ($productions as $production) { + foreach ($production as $symbol) { + $seen[$symbol] = true; + } + } + } + + $missing = array_diff_key($this->terminals, $seen); + unset($missing[$this->getEOFSymbol()]); + if ($missing) { + $missing_terminals = array_keys($missing); + $missing_terminals = implode(', ', $missing_terminals); + throw new PhutilUnreachableTerminalParserGeneratorException( + pht( + 'Some terminals do not appear in any rule: %s', + $missing_terminals)); + } + } + + + /** + * @task rvalidation + */ + private function validateAllRulesReachable() { + $stack = array(); + $reachable = $this->computeReachableRules($this->getStartRule(), $stack); + + $missing = array_diff_key($this->rules, $reachable); + unset($missing[$this->getStartRule()]); + + if ($missing) { + $missing_rules = array_keys($missing); + $missing_rules = implode(', ', $missing_rules); + throw new PhutilUnreachableRuleParserGeneratorException( + pht( + 'Some rules can never be reached from any production: %s', + $missing_rules)); + } + } + + + /** + * @task rvalidation + */ + private function computeReachableRules($rule, array &$stack) { + if (isset($stack[$rule])) { + return $stack[$rule]; + } + + $stack[$rule] = array(); + + foreach ($this->rules[$rule] as $production) { + foreach ($production as $symbol) { + if ($this->isRule($symbol)) { + $stack[$rule][$symbol] = true; + $stack[$rule] += $this->computeReachableRules($symbol, $stack); + } + } + } + + return $stack[$rule]; + } + + + /** + * @task rvalidation + */ + private function validateAllRulesReducible() { + $reducible = array(); + foreach ($this->rules as $rule => $productions) { + if (!$this->isRuleReducible($rule, $reducible)) { + throw new PhutilIrreducibleRuleParserGeneratorException( + pht( + "Rule '%s' can never be reduced: it recurses indefinitely ". + "and reaches no production of terminals.", + $rule)); + } + } + } + + + /** + * @task rvalidation + */ + private function isRuleReducible($rule, array &$reducible) { + if (isset($reducible[$rule])) { + return $reducible[$rule]; + } + + // Set this ahead of time so we don't end up in an infinite loop if + // rules recurse. We'll overwrite it if we find a reduction. + $reducible[$rule] = false; + $reducible[$rule] = $this->computeRuleReducible($rule, $reducible); + return $reducible[$rule]; + } + + + /** + * @task rvalidation + */ + private function computeRuleReducible($rule, array &$reducible) { + $epsilon = $this->getEpsilonSymbol(); + $end = $this->getEndSymbol(); + + $productions = $this->rules[$rule]; + + // In the first pass, try to find a trivially reducible production, e.g. one + // with epsilon or only terminals. Also, remove recursive productions (those + // which directly involve the rule itself) because we know we won't be able + // to reduce them. If we're lucky, this will allow us to determine that the + // rule is reducible without recursion. For example, we can immediately + // reduce these productions: + // + // R -> a + // R -> b c d + // R -> (epsilon) + // + // We can never reduce these productions: + // + // R -> R + // R -> a R b + // + // We might be able to reduce these productions, but they aren't as cheap + // or easy to figure out, since we need to first determine if other rules + // can be reduced: + // + // R -> X Y + // R -> X a + // + // If we find a reduction, we return immediately. + + foreach ($productions as $key => $production) { + $has_only_terminals = true; + foreach ($production as $symbol) { + if ($symbol == $end) { + break; + } else if ($symbol == $epsilon) { + // The rule contains an epsilon production, which can always reduce + // it. + return true; + } else if ($symbol == $rule) { + // The rule contains itself; this production is never reducible. We + // must find another reducible production. + unset($productions[$key]); + continue 2; + } else if ($this->isTerminal($symbol)) { + // This is a terminal; keep looking. We'll be able to reduce the + // production if it contains only terminals. + continue; + } else { + // This is a rule, so we can't trivially reduce it. We'll keep it + // for the next round if we can't find any trivial reductions. + $has_only_terminals = false; + break; + } + } + + if ($has_only_terminals) { + return true; + } + } + + // If we have no productions left, this rule can't be reduced. + if (empty($productions)) { + return false; + } + + // We have remaining productions which include other rules. Look for a + // nontrivial reduction. For example: + // + // R -> X Y + // X -> x + // Y -> y + // + // In this case, X and Y are both reducible, so "X Y" is reducible and thus + // R is reducible. + foreach ($productions as $production) { + $can_reduce = true; + foreach ($production as $symbol) { + // NOTE: We don't need to check for epsilon here, because we would + // already have determined the rule was reducible if we had an epsilon + // production. + if ($symbol == $end) { + break; + } else if ($this->isTerminal($symbol)) { + continue; + } else if (!$this->isRuleReducible($symbol, $reducible)) { + $can_reduce = false; + break; + } + } + + if ($can_reduce) { + // The production contained only terminals and reducible rules, so it + // is reducible. We're good and don't need to examine remaining + // productions. + return true; + } + } + + // We didn't find any reducible productions. + return false; + } + + +/* -( Computing First() )-------------------------------------------------- */ + + + private function buildFirstTable() { + $this->firstTable = array(); + foreach ($this->rules as $rule => $productions) { + $this->buildRuleFirst($rule); + } + } + + private function buildRuleFirst($rule) { + if (isset($this->firstTable[$rule])) { + return $this->firstTable[$rule]; + } + + $this->firstTable[$rule] = array(); + $productions = $this->rules[$rule]; + foreach ($productions as $key => $production) { + $this->firstTable[$rule] += $this->getFirstForProduction($production); + } + + return $this->firstTable[$rule]; + } + + private function getFirstForProduction(array $production) { + $set = array(); + + $end = $this->getEndSymbol(); + $epsilon = $this->getEpsilonSymbol(); + $eof = $this->getEOFSymbol(); + + $accept_epsilon = true; + foreach ($production as $symbol) { + if ($symbol === $end) { + break; + } else if ($symbol === $epsilon) { + break; + } else if ($this->isTerminal($symbol)) { + $set[$symbol] = true; + $accept_epsilon = false; + break; + } else { + $symbol_set = $this->buildRuleFirst($symbol); + + $has_epsilon = isset($symbol_set[$epsilon]); + unset($symbol_set[$epsilon]); + $set += $symbol_set; + if (!$has_epsilon) { + $accept_epsilon = false; + break; + } + } + } + + if ($accept_epsilon) { + $set[$epsilon] = true; + } + + return $set; + } + + +/* -( Computing States )--------------------------------------------------- */ + + + private function addState(array $set) { + $seen = array(); + foreach ($set as $item) { + $seen[$item[0]][$item[1]][$item[2]][$item[3]] = true; + } + + $end = $this->getEndSymbol(); + $epsilon = $this->getEpsilonSymbol(); + + for ($ii = 0; $ii < count($set); $ii++) { + $item = $set[$ii]; + + $production = $this->rules[$item[0]][$item[1]]; + $next = $production[$item[2]]; + if ($this->isTerminal($next)) { + continue; + } else if ($next === $epsilon) { + continue; + } else if ($next === $end) { + continue; + } + + $v = array_slice($production, $item[2] + 1, -1); + $v[] = $item[3]; + $v[] = $end; + + $firsts = $this->getFirstForProduction($v); + + foreach ($firsts as $nfirst => $ignored) { + if (!$this->isTerminal($nfirst)) { + unset($firsts[$nfirst]); + } + } + + foreach ($this->rules[$next] as $pkey => $nproduction) { + foreach ($firsts as $nfirst => $ignored) { + if (isset($seen[$next][$pkey][0][$nfirst])) { + continue; + } + $set[] = array($next, $pkey, 0, $nfirst); + $seen[$next][$pkey][0][$nfirst] = true; + } + } + } + + $hash = $this->hashSet($set); + if (isset($this->setHashes[$hash])) { + return array(false, $this->setHashes[$hash]); + } + + $this->states[] = $set; + $state = last_key($this->states); + $this->setHashes[$hash] = $state; + + return array(true, $state); + } + + private function buildSuccessors($start_state) { + $end = $this->getEndSymbol(); + + $nexts = array(); + foreach ($this->states[$start_state] as $item) { + $next = $this->rules[$item[0]][$item[1]][$item[2]]; + if ($next === $end) { + continue; + } + $nexts[$next][] = array( + $item[0], + $item[1], + $item[2] + 1, + $item[3], + ); + } + + foreach ($nexts as $next => $items) { + list($is_new, $state) = $this->addState($items); + $this->successor[$start_state][$next] = $state; + if ($is_new) { + $this->buildSuccessors($state); + } + } + } + + private function hashSet(array $set) { + foreach ($set as $k => $item) { + $set[$k] = implode("\0", $item); + } + sort($set); + $set = implode("\1", $set); + + return md5($set); + } + + + private function buildTables() { + $action = array(); + $goto = array(); + + $end = $this->getEndSymbol(); + $eof = $this->getEOFSymbol(); + $init = $this->getInitSymbol(); + + foreach ($this->states as $state => $items) { + $shift = array(); + $reduce = array(); + $accept = false; + foreach ($items as $item) { + $next = $this->rules[$item[0]][$item[1]][$item[2]]; + if ($next == $end) { + if ($item[0] !== $init) { + $reduce[$item[3]][] = $item; + } else if ($item[0] === $init && $item[3] === $eof) { + $accept = $item; + } + } else if ($this->isTerminal($next)) { + $shift[$next] = $item; + } else { + $goto[$state][$next] = $this->successor[$state][$next]; + } + } + + foreach ($reduce as $next => $reductions) { + if (count($reductions) > 1) { + $ways = array(); + foreach ($reductions as $reduction) { + $ways[] = "{$reduction[0]}/{$reduction[1]}"; + } + $ways = implode('; ', $ways); + + // TODO: As below, we should have more explicit handling of + // reduce/reduce conflicts. For now, just pick the first one. + + if (false) { + throw new Exception( + pht( + "Reduce/reduce conflict: from state '%s', when a ". + "'%s' is encountered, it may be reduced in multiple ". + "ways: %s", + $state, + $next, + $ways)); + } + } + $reduce[$next] = head($reductions); + } + + $srconflicts = array_intersect_key($shift, $reduce); + foreach ($srconflicts as $next => $ignored) { + + // TODO: We should probably have better or more explicit handling of + // shift/reduce conflicts. For now, we just shift. + + if (false) { + $what = $reduce[$next][0]; + throw new Exception( + pht( + "Shift/reduce conflict: from state '%s', when a '%s' ". + "is encountered, shifting conflicts with reducing '%s'.", + $state, + $next, + $what)); + } else { + // Resolve the shift/reduce by shifting. + $reduce = array(); + } + } + + if ($accept && isset($shift[$eof])) { + throw new Exception(pht('Accept/shift conflict!')); + } + + if ($accept && isset($reduce[$eof])) { + throw new Exception(pht('Accept/reduce conflict!')); + } + + foreach ($reduce as $next => $item) { + $action[$state][$next] = array( + 'R', + array( + $item[0], + $item[1], + count($this->rules[$item[0]][$item[1]]) - 1, + ), + ); + } + + foreach ($shift as $next => $item) { + $action[$state][$next] = array( + 'S', + $this->successor[$state][$next], + ); + } + + if ($accept) { + $action[$state][$eof] = array('A'); + } + } + + $this->actionTable = $action; + $this->gotoTable = $goto; + } + + public function generateParserFunction($name) { + $out = array(); + $out[] = 'function '.$name.'(array $tokens, $callback) {'; + $out[] = ' return '.__CLASS__.'::parseTokensWithTables('; + $out[] = ' '.$this->formatAndIndent($this->actionTable, 4).','; + $out[] = ' '.$this->formatAndIndent($this->gotoTable, 4).','; + $out[] = ' '.$this->formatAndIndent($this->getEOFSymbol(), 4).','; + $out[] = ' $tokens,'; + $out[] = ' $callback);'; + $out[] = '}'; + return implode("\n", $out); + } + + private function formatAndIndent($var, $depth) { + $var = phutil_var_export($var); + $var = str_replace("\n", "\n".str_repeat(' ', $depth), $var); + + return $var; + } + + public function parseTokens(array $tokens, $callback) { + return self::parseTokensWithTables( + $this->actionTable, + $this->gotoTable, + $this->getEOFSymbol(), + $tokens, + $callback); + } + + public static function parseTokensWithTables( + $action_table, + $goto_table, + $eof_symbol, + array $tokens, + $callback) { + + $state_stack = array(0); + $token_stack = array(); + + $tokens = array_reverse($tokens); + while (true) { + $state = end($state_stack); + + if (empty($tokens)) { + $next = $eof_symbol; + } else { + $next_token = end($tokens); + $next = $next_token[0]; + } + + if (!isset($action_table[$state][$next])) { + $expected = implode(', ', array_keys($action_table[$state])); + throw new Exception( + pht( + "Unexpected '%s' in state %s! Expected: %s", + $next, + $state, + $expected)); + } + + $action = $action_table[$state][$next]; + + switch ($action[0]) { + case 'S': + $state_stack[] = $action[1]; + $token_stack[] = array_pop($tokens); + break; + case 'R': + $r_rule = $action[1][0]; + $r_prod = $action[1][1]; + $r_size = $action[1][2]; + + $token_v = array(); + while ($r_size--) { + $token_v[] = array_pop($token_stack); + array_pop($state_stack); + } + $token_v = array_reverse($token_v); + $token_stack[] = call_user_func_array( + $callback, + array($r_rule, $r_prod, $token_v)); + $goto = $goto_table[end($state_stack)][$r_rule]; + $state_stack[] = $goto; + break; + case 'A': + break 2; + } + } + + return head($token_stack); + } + + +/* -( Inspecting Generator State )----------------------------------------- */ + + + /** + * @task inspect + */ + public function inspectRules() { + if (!$this->rulesValidated) { + throw new PhutilInvalidStateException('processGrammar'); + } + return $this->rules; + } + + + /** + * @task inspect + */ + public function inspectFirstTable() { + if ($this->firstTable === null) { + throw new PhutilInvalidStateException('processGrammar'); + } + return $this->firstTable; + } + + +} diff --git a/src/parser/PhutilPygmentizeParser.php b/src/parser/PhutilPygmentizeParser.php new file mode 100644 --- /dev/null +++ b/src/parser/PhutilPygmentizeParser.php @@ -0,0 +1,83 @@ +map = $map; + return $this; + } + + public function getMap() { + return $this->map; + } + + public function parse($block) { + $class_look = 'class="'; + $class_len = strlen($class_look); + + $class_start = null; + + $map = $this->map; + + $len = strlen($block); + $out = ''; + $mode = 'text'; + for ($ii = 0; $ii < $len; $ii++) { + $c = $block[$ii]; + switch ($mode) { + case 'text': + // We're in general text between tags, and just passing characers + // through unmodified. + if ($c == '<') { + $mode = 'tag'; + } + $out .= $c; + break; + case 'tag': + // We're inside a tag, and looking for `class="` so we can rewrite + // it. + if ($c == '>') { + $mode = 'text'; + } + if ($c == 'c') { + if (!substr_compare($block, $class_look, $ii, $class_len)) { + $mode = 'class'; + $ii += $class_len; + $class_start = $ii; + } + } + + if ($mode != 'class') { + $out .= $c; + } + break; + case 'class': + // We're inside a `class="..."` tag, and looking for the ending quote + // so we can replace it. + if ($c == '"') { + $class = substr($block, $class_start, $ii - $class_start); + + // If this class is present in the map, rewrite it into an inline + // style attribute. + if (isset($map[$class])) { + $out .= 'style="'.phutil_escape_html($map[$class]).'"'; + } else { + $out .= 'class="'.$class.'"'; + } + + $mode = 'tag'; + } + break; + } + } + + return $out; + } + +} diff --git a/src/parser/PhutilQueryStringParser.php b/src/parser/PhutilQueryStringParser.php new file mode 100644 --- /dev/null +++ b/src/parser/PhutilQueryStringParser.php @@ -0,0 +1,139 @@ + 'z', + * ); + * + * ...with the `.` replaced with an underscore, `_`. Other characters converted + * in this way include space and unmatched opening brackets. + * + * Broadly, this is part of the terrible legacy of `register_globals`. Since + * we'd like to be able to parse all valid query strings without destroying any + * data, this class implements a less-encumbered parser. + */ +final class PhutilQueryStringParser extends Phobject { + + + /** + * Parses a query string into a dictionary, applying PHP rules for handling + * array nomenclature (like `a[]=1`) in parameter names. + * + * For a more basic parse, see @{method:parseQueryStringToPairList}. + * + * @param string Query string. + * @return map Parsed dictionary. + */ + public function parseQueryString($query_string) { + $result = array(); + + $list = $this->parseQueryStringToPairList($query_string); + foreach ($list as $parts) { + list($key, $value) = $parts; + if (!strlen($key)) { + continue; + } + $this->parseQueryKeyToArr($key, $value, $result); + } + + return $result; + } + + + /** + * Parses a query string into a basic list of pairs, without handling any + * array information in the keys. For example: + * + * a[]=1&a[]=2 + * + * ...will parse into: + * + * array( + * array('a[]', '1'), + * array('a[]', '2'), + * ); + * + * Use @{method:parseQueryString} to produce a more sophisticated parse which + * applies array rules and returns a dictionary. + * + * @param string Query string. + * @return list> List of parsed parameters. + */ + public function parseQueryStringToPairList($query_string) { + $list = array(); + + if (!strlen($query_string)) { + return $list; + } + + $pairs = explode('&', $query_string); + foreach ($pairs as $pair) { + if (!strlen($pair)) { + continue; + } + $parts = explode('=', $pair, 2); + if (count($parts) < 2) { + $parts[] = ''; + } + $list[] = array( + urldecode($parts[0]), + urldecode($parts[1]), + ); + } + + return $list; + } + + + /** + * Treats the key as a flat query that potentially has square brackets. If + * there are square brackets we parse them into an array. + * + * Example input: + * $key = "email[0]"; + * $val = "my@example.com"; + * + * Example output: + * array("email" => array(0 => "my@example.com")); + * + * @param string $key + * @param string $val + * @param array $input_arr + */ + private function parseQueryKeyToArr($key, $val, array &$input_arr) { + if (preg_match('/^[^\[\]]+(?:\[[^\[\]]*\])+$/', $key)) { + $key_pieces = preg_split('/\]?\[/', rtrim($key, ']')); + if ($key_pieces) { + $cursor = &$input_arr; + foreach ($key_pieces as $piece) { + if (strlen($piece)) { + if (empty($cursor[$piece]) || !is_array($cursor[$piece])) { + $cursor[$piece] = array(); + } + } else { + $cursor[] = array(); + $piece = last_key($cursor); + } + $cursor = &$cursor[$piece]; + } + + $cursor = $val; + unset($cursor); + } + } else { + $input_arr[$key] = $val; + } + } +} diff --git a/src/parser/PhutilSimpleOptions.php b/src/parser/PhutilSimpleOptions.php new file mode 100644 --- /dev/null +++ b/src/parser/PhutilSimpleOptions.php @@ -0,0 +1,195 @@ + '4', + * 'eyes' => '2', + * ); + * + * @param string Input option list. + * @return dict Parsed dictionary. + * @task parse + */ + public function parse($input) { + $result = array(); + + $lexer = new PhutilSimpleOptionsLexer(); + $tokens = $lexer->getNiceTokens($input); + + $state = 'key'; + $pairs = array(); + foreach ($tokens as $token) { + list($type, $value) = $token; + switch ($state) { + case 'key': + if ($type != 'word') { + return array(); + } + if (!strlen($value)) { + return array(); + } + $key = $this->normalizeKey($value); + $state = '='; + break; + case '=': + if ($type == '=') { + $state = 'value'; + break; + } + if ($type == ',') { + $pairs[] = array($key, true); + $state = 'key'; + break; + } + return array(); + case 'value': + if ($type == ',') { + $pairs[] = array($key, null); + $state = 'key'; + break; + } + if ($type != 'word') { + return array(); + } + $pairs[] = array($key, $value); + $state = ','; + break; + case ',': + if ($type == 'word') { + $pair = array_pop($pairs); + $pair[1] .= $value; + $pairs[] = $pair; + break; + } + if ($type != ',') { + return array(); + } + $state = 'key'; + break; + } + } + + if ($state == '=') { + $pairs[] = array($key, true); + } + if ($state == 'value') { + $pairs[] = array($key, null); + } + + $result = array(); + foreach ($pairs as $pair) { + list($key, $value) = $pair; + if ($value === null) { + unset($result[$key]); + } else { + $result[$key] = $value; + } + } + + return $result; + } + + +/* -( Unparsing Simple Options )------------------------------------------- */ + + + /** + * Convert a dictionary into a simple option list. For example: + * + * array( + * 'legs' => '4', + * 'eyes' => '2', + * ); + * + * ...becomes: + * + * legs=4, eyes=2 + * + * @param dict Input dictionary. + * @param string Additional characters to escape. + * @return string Unparsed option list. + */ + public function unparse(array $options, $escape = '') { + $result = array(); + foreach ($options as $name => $value) { + $name = $this->normalizeKey($name); + if (!strlen($value)) { + continue; + } + if ($value === true) { + $result[] = $this->quoteString($name, $escape); + } else { + $qn = $this->quoteString($name, $escape); + $qv = $this->quoteString($value, $escape); + $result[] = $qn.'='.$qv; + } + } + return implode(', ', $result); + } + + +/* -( Parser Configuration )----------------------------------------------- */ + + + /** + * Configure case sensitivity of the parser. By default, the parser is + * case insensitive, so "legs=4" has the same meaning as "LEGS=4". If you + * set it to be case sensitive, the keys have different meanings. + * + * @param bool True to make the parser case sensitive, false (default) to + * make it case-insensitive. + * @return this + * @task config + */ + public function setCaseSensitive($case_sensitive) { + $this->caseSensitive = $case_sensitive; + return $this; + } + + +/* -( Internals )---------------------------------------------------------- */ + + + private function normalizeKey($key) { + if (!strlen($key)) { + throw new Exception(pht('Empty key is invalid!')); + } + if (!$this->caseSensitive) { + $key = strtolower($key); + } + return $key; + } + + private function quoteString($string, $escape) { + if (preg_match('/[^a-zA-Z0-9]/', $string)) { + $string = '"'.addcslashes($string, '\\\'"'.$escape).'"'; + } + return $string; + } + +} diff --git a/src/parser/PhutilTypeSpec.php b/src/parser/PhutilTypeSpec.php new file mode 100644 --- /dev/null +++ b/src/parser/PhutilTypeSpec.php @@ -0,0 +1,1921 @@ + + * map + * type|type + * + * A type may be marked as optional by suffixing it with "?" or prefixing it + * with the word "optional": + * + * int? + * optional int + * + * A type may have a human-readable comment in parentheses, at the end: + * + * int (must be even) + * + * For example, these are valid type specifications: + * + * int|string + * map + * list> + * optional int + * string (uppercase) + * + */ +final class PhutilTypeSpec extends Phobject { + + private $type; + private $subtypes = array(); + private $optional; + private $comment; + + private function __construct() {} + + public function getType() { + return $this->type; + } + + public function check($value, $name = null) { + switch ($this->type) { + case 'int': + if (!is_int($value)) { + throw new PhutilTypeCheckException($this, $value, $name); + } + break; + case 'float': + if (!is_float($value)) { + throw new PhutilTypeCheckException($this, $value, $name); + } + break; + case 'bool': + if (!is_bool($value)) { + throw new PhutilTypeCheckException($this, $value, $name); + } + break; + case 'string': + if (!is_string($value)) { + throw new PhutilTypeCheckException($this, $value, $name); + } + break; + case 'regex': + $trap = new PhutilErrorTrap(); + $ok = @preg_match($value, ''); + $err = $trap->getErrorsAsString(); + $trap->destroy(); + + if ($ok === false) { + throw new PhutilTypeCheckException($this, $value, $name, $err); + } + break; + case 'null': + if (!is_null($value)) { + throw new PhutilTypeCheckException($this, $value, $name); + } + break; + case 'list': + if (!is_array($value)) { + throw new PhutilTypeCheckException($this, $value, $name); + } + if ($value && (array_keys($value) !== range(0, count($value) - 1))) { + throw new PhutilTypeCheckException($this, $value, $name); + } + try { + foreach ($value as $v) { + $this->subtypes[0]->check($v); + } + } catch (PhutilTypeCheckException $ex) { + throw new PhutilTypeCheckException($this, $value, $name); + } + break; + case 'map': + if (!is_array($value)) { + throw new PhutilTypeCheckException($this, $value, $name); + } + try { + foreach ($value as $k => $v) { + $this->subtypes[0]->check($k); + $this->subtypes[1]->check($v); + } + } catch (PhutilTypeCheckException $ex) { + throw new PhutilTypeCheckException($this, $value, $name); + } + break; + case 'or': + foreach ($this->subtypes as $subtype) { + try { + $subtype->check($value); + return; + } catch (PhutilTypeCheckException $ex) { + // Ignore. + } + } + throw new PhutilTypeCheckException($this, $value, $name); + case 'wild': + return; + default: + if (class_exists($this->type, false)) { + if ($value instanceof $this->type) { + return; + } + } else if (interface_exists($this->type, false)) { + if ($value instanceof $this->type) { + return; + } + } + + throw new PhutilTypeCheckException($this, $value, $name); + } + } + + public static function checkMap(array $values, array $types) { + $extra = array_diff_key($values, $types); + if ($extra) { + throw new PhutilTypeExtraParametersException($extra); + } + + $missing = array(); + foreach ($types as $key => $type) { + $types[$key] = self::newFromString($type); + if (!array_key_exists($key, $values)) { + if (!$types[$key]->optional) { + $missing[] = $key; + } + } + } + + if ($missing) { + throw new PhutilTypeMissingParametersException($missing); + } + + foreach ($types as $key => $type) { + if (array_key_exists($key, $values)) { + $type->check($values[$key], $key); + } + } + } + + public static function getCommonParentClass($class_a, $class_b) { + // Make sure both classes are really classes. + try { + if (!class_exists($class_a) || !class_exists($class_b)) { + return null; + } + } catch (PhutilMissingSymbolException $ex) { + return null; + } + + $ancestors_a = array(); + do { + $ancestors_a[] = $class_a; + } while ($class_a = get_parent_class($class_a)); + + $ancestors_b = array(); + do { + $ancestors_b[] = $class_b; + } while ($class_b = get_parent_class($class_b)); + + return head(array_intersect($ancestors_a, $ancestors_b)); + } + + public static function getTypeOf($value) { + if (is_int($value)) { + return 'int'; + } else if (is_float($value)) { + return 'float'; + } else if (is_bool($value)) { + return 'bool'; + } else if (is_string($value)) { + return 'string'; + } else if (is_null($value)) { + return 'null'; + } else if (is_object($value)) { + return get_class($value); + } else if (is_array($value)) { + $vtype = self::getTypeOfVector($value); + if ($value && (array_keys($value) === range(0, count($value) - 1))) { + return 'list<'.$vtype.'>'; + } else { + $ktype = self::getTypeOfVector(array_keys($value)); + return "map<{$ktype}, {$vtype}>"; + } + } else { + return 'wild'; + } + } + + private static function getTypeOfVector(array $vector) { + if (!$vector) { + return 'wild'; + } + + $type = null; + foreach ($vector as $value) { + $vtype = self::getTypeOf($value); + if ($type === null) { + $type = $vtype; + } else if ($type === $vtype) { + continue; + } else { + $parent = self::getCommonParentClass($type, $vtype); + if ($parent) { + $type = $parent; + } else { + return 'wild'; + } + } + } + + return $type; + } + + public function toString() { + $sub = array(); + foreach ($this->subtypes as $subtype) { + $sub[] = $subtype->toString(); + } + + switch ($this->type) { + case 'map': + $string = 'map<'.$sub[0].', '.$sub[1].'>'; + break; + case 'list': + $string = 'list<'.$sub[0].'>'; + break; + case 'or': + $string = implode('|', $sub); + break; + default: + $string = $this->type; + break; + } + + if ($this->optional) { + $string = 'optional '.$string; + } + + if ($this->comment) { + $string .= ' ('.$this->comment.')'; + } + + return $string; + } + + public static function newFromString($string) { + $lexer = self::getLexer(); + $tokens = $lexer->getTokens($string); + + // Strip whitespace tokens. + foreach ($tokens as $key => $token) { + $type = $token[0]; + if ($type == ' ') { + unset($tokens[$key]); + } + } + + $tokens = array_values($tokens); + $callback = array(__CLASS__, 'didReduceTokens'); + return self::parseTokens($tokens, $callback); + } + + public static function didReduceTokens($rule, $production, array $tokens) { + switch ($rule) { + case 'start': + case 'some_type': + case 'not_or_type': + return $tokens[0]; + case 'type': + if ($production == 'yes') { + $tokens[0]->optional = true; + } + return $tokens[0]; + case 'basic_type': + $obj = new PhutilTypeSpec(); + $obj->type = $tokens[0][1]; + return $obj; + case 'or_type': + $l = $tokens[0]; + $r = $tokens[2]; + + if ($l->type == 'or') { + if ($r->type == 'or') { + foreach ($r->subtypes as $subtype) { + $l->subtypes[] = $subtype; + } + } else { + $l->subtypes[] = $r; + } + return $l; + } else if ($r->type == 'or') { + $r->subtypes[] = $l; + return $r; + } else { + $obj = new PhutilTypeSpec(); + $obj->type = 'or'; + $obj->subtypes[] = $l; + $obj->subtypes[] = $r; + return $obj; + } + break; + case 'map_type': + $obj = new PhutilTypeSpec(); + $obj->type = 'map'; + $obj->subtypes[] = $tokens[2]; + $obj->subtypes[] = $tokens[4]; + return $obj; + case 'list_type': + $obj = new PhutilTypeSpec(); + $obj->type = 'list'; + $obj->subtypes[] = $tokens[2]; + return $obj; + case 'maybe_optional': + if ($production == 'yes') { + $tokens[1]->optional = true; + return $tokens[1]; + } else { + return $tokens[0]; + } + break; + case 'maybe_comment': + if ($production == 'yes') { + $tokens[0]->comment = $tokens[1]; + } + return $tokens[0]; + case 'comment': + return $tokens[1]; + case 'comment_text': + $result = ''; + foreach ($tokens as $token) { + if (is_array($token)) { + $result .= $token[1]; + } else { + $result .= $token; + } + } + return $result; + default: + throw new Exception(pht("Unhandled parser rule '%s'!", $rule)); + } + } + + private static function getLexer() { + static $lexer; + if (!$lexer) { + $lexer = new PhutilTypeLexer(); + } + return $lexer; + } + + private static function parseTokens(array $tokens, $callback) { + // NOTE: This is automatically generated by the script + // `support/parser/generate-type-parser.php`. + + return PhutilParserGenerator::parseTokensWithTables( + array( + 0 => array( + 'opt' => array( + 0 => 'S', + 1 => 3, + ), + 'k' => array( + 0 => 'S', + 1 => 20, + ), + 'map' => array( + 0 => 'S', + 1 => 21, + ), + 'list' => array( + 0 => 'S', + 1 => 71, + ), + ), + 1 => array( + '(end-of-file)' => array( + 0 => 'A', + ), + ), + 2 => array( + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'start', + 1 => 0, + 2 => 1, + ), + ), + ), + 3 => array( + 'k' => array( + 0 => 'S', + 1 => 20, + ), + 'map' => array( + 0 => 'S', + 1 => 21, + ), + 'list' => array( + 0 => 'S', + 1 => 71, + ), + ), + 4 => array( + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'maybe_optional', + 1 => 'yes', + 2 => 2, + ), + ), + ), + 5 => array( + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'maybe_comment', + 1 => 'no', + 2 => 1, + ), + ), + '(' => array( + 0 => 'S', + 1 => 7, + ), + ), + 6 => array( + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'maybe_comment', + 1 => 'yes', + 2 => 2, + ), + ), + ), + 7 => array( + 'cm' => array( + 0 => 'S', + 1 => 11, + ), + ), + 8 => array( + ')' => array( + 0 => 'S', + 1 => 9, + ), + 'cm' => array( + 0 => 'S', + 1 => 10, + ), + ), + 9 => array( + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'comment', + 1 => 0, + 2 => 3, + ), + ), + ), + 10 => array( + ')' => array( + 0 => 'R', + 1 => array( + 0 => 'comment_text', + 1 => 0, + 2 => 2, + ), + ), + 'cm' => array( + 0 => 'R', + 1 => array( + 0 => 'comment_text', + 1 => 0, + 2 => 2, + ), + ), + ), + 11 => array( + ')' => array( + 0 => 'R', + 1 => array( + 0 => 'comment_text', + 1 => 1, + 2 => 1, + ), + ), + 'cm' => array( + 0 => 'R', + 1 => array( + 0 => 'comment_text', + 1 => 1, + 2 => 1, + ), + ), + ), + 12 => array( + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'type', + 1 => 'no', + 2 => 1, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'type', + 1 => 'no', + 2 => 1, + ), + ), + '?' => array( + 0 => 'S', + 1 => 13, + ), + ), + 13 => array( + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'type', + 1 => 'yes', + 2 => 2, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'type', + 1 => 'yes', + 2 => 2, + ), + ), + ), + 14 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 0, + 2 => 1, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 0, + 2 => 1, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 0, + 2 => 1, + ), + ), + '|' => array( + 0 => 'S', + 1 => 15, + ), + ), + 15 => array( + 'k' => array( + 0 => 'S', + 1 => 20, + ), + 'map' => array( + 0 => 'S', + 1 => 21, + ), + 'list' => array( + 0 => 'S', + 1 => 71, + ), + ), + 16 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + ), + 17 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + ), + 18 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + ), + 19 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + ), + 20 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + ), + 21 => array( + '<' => array( + 0 => 'S', + 1 => 22, + ), + ), + 22 => array( + 'k' => array( + 0 => 'S', + 1 => 57, + ), + 'map' => array( + 0 => 'S', + 1 => 58, + ), + 'list' => array( + 0 => 'S', + 1 => 67, + ), + ), + 23 => array( + ',' => array( + 0 => 'S', + 1 => 24, + ), + ), + 24 => array( + 'k' => array( + 0 => 'S', + 1 => 35, + ), + 'map' => array( + 0 => 'S', + 1 => 36, + ), + 'list' => array( + 0 => 'S', + 1 => 45, + ), + ), + 25 => array( + '>' => array( + 0 => 'S', + 1 => 26, + ), + ), + 26 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + ), + 27 => array( + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'type', + 1 => 'no', + 2 => 1, + ), + ), + '?' => array( + 0 => 'S', + 1 => 28, + ), + ), + 28 => array( + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'type', + 1 => 'yes', + 2 => 2, + ), + ), + ), + 29 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 0, + 2 => 1, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 0, + 2 => 1, + ), + ), + '|' => array( + 0 => 'S', + 1 => 30, + ), + ), + 30 => array( + 'k' => array( + 0 => 'S', + 1 => 35, + ), + 'map' => array( + 0 => 'S', + 1 => 36, + ), + 'list' => array( + 0 => 'S', + 1 => 45, + ), + ), + 31 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + ), + 32 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + ), + 33 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + ), + 34 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + ), + 35 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + ), + 36 => array( + '<' => array( + 0 => 'S', + 1 => 37, + ), + ), + 37 => array( + 'k' => array( + 0 => 'S', + 1 => 57, + ), + 'map' => array( + 0 => 'S', + 1 => 58, + ), + 'list' => array( + 0 => 'S', + 1 => 67, + ), + ), + 38 => array( + ',' => array( + 0 => 'S', + 1 => 39, + ), + ), + 39 => array( + 'k' => array( + 0 => 'S', + 1 => 35, + ), + 'map' => array( + 0 => 'S', + 1 => 36, + ), + 'list' => array( + 0 => 'S', + 1 => 45, + ), + ), + 40 => array( + '>' => array( + 0 => 'S', + 1 => 41, + ), + ), + 41 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + ), + 42 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 1, + 2 => 1, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 1, + 2 => 1, + ), + ), + '|' => array( + 0 => 'S', + 1 => 43, + ), + ), + 43 => array( + 'k' => array( + 0 => 'S', + 1 => 35, + ), + 'map' => array( + 0 => 'S', + 1 => 36, + ), + 'list' => array( + 0 => 'S', + 1 => 45, + ), + ), + 44 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + ), + 45 => array( + '<' => array( + 0 => 'S', + 1 => 46, + ), + ), + 46 => array( + 'k' => array( + 0 => 'S', + 1 => 35, + ), + 'map' => array( + 0 => 'S', + 1 => 36, + ), + 'list' => array( + 0 => 'S', + 1 => 45, + ), + ), + 47 => array( + '>' => array( + 0 => 'S', + 1 => 48, + ), + ), + 48 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + '>' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + ), + 49 => array( + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'type', + 1 => 'no', + 2 => 1, + ), + ), + '?' => array( + 0 => 'S', + 1 => 50, + ), + ), + 50 => array( + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'type', + 1 => 'yes', + 2 => 2, + ), + ), + ), + 51 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 0, + 2 => 1, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 0, + 2 => 1, + ), + ), + '|' => array( + 0 => 'S', + 1 => 52, + ), + ), + 52 => array( + 'k' => array( + 0 => 'S', + 1 => 57, + ), + 'map' => array( + 0 => 'S', + 1 => 58, + ), + 'list' => array( + 0 => 'S', + 1 => 67, + ), + ), + 53 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 0, + 2 => 3, + ), + ), + ), + 54 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 0, + 2 => 1, + ), + ), + ), + 55 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 1, + 2 => 1, + ), + ), + ), + 56 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'not_or_type', + 1 => 2, + 2 => 1, + ), + ), + ), + 57 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'basic_type', + 1 => 0, + 2 => 1, + ), + ), + ), + 58 => array( + '<' => array( + 0 => 'S', + 1 => 59, + ), + ), + 59 => array( + 'k' => array( + 0 => 'S', + 1 => 57, + ), + 'map' => array( + 0 => 'S', + 1 => 58, + ), + 'list' => array( + 0 => 'S', + 1 => 67, + ), + ), + 60 => array( + ',' => array( + 0 => 'S', + 1 => 61, + ), + ), + 61 => array( + 'k' => array( + 0 => 'S', + 1 => 35, + ), + 'map' => array( + 0 => 'S', + 1 => 36, + ), + 'list' => array( + 0 => 'S', + 1 => 45, + ), + ), + 62 => array( + '>' => array( + 0 => 'S', + 1 => 63, + ), + ), + 63 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'map_type', + 1 => 0, + 2 => 6, + ), + ), + ), + 64 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 1, + 2 => 1, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 1, + 2 => 1, + ), + ), + '|' => array( + 0 => 'S', + 1 => 65, + ), + ), + 65 => array( + 'k' => array( + 0 => 'S', + 1 => 57, + ), + 'map' => array( + 0 => 'S', + 1 => 58, + ), + 'list' => array( + 0 => 'S', + 1 => 67, + ), + ), + 66 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + ), + 67 => array( + '<' => array( + 0 => 'S', + 1 => 68, + ), + ), + 68 => array( + 'k' => array( + 0 => 'S', + 1 => 35, + ), + 'map' => array( + 0 => 'S', + 1 => 36, + ), + 'list' => array( + 0 => 'S', + 1 => 45, + ), + ), + 69 => array( + '>' => array( + 0 => 'S', + 1 => 70, + ), + ), + 70 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + ',' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + ), + 71 => array( + '<' => array( + 0 => 'S', + 1 => 72, + ), + ), + 72 => array( + 'k' => array( + 0 => 'S', + 1 => 35, + ), + 'map' => array( + 0 => 'S', + 1 => 36, + ), + 'list' => array( + 0 => 'S', + 1 => 45, + ), + ), + 73 => array( + '>' => array( + 0 => 'S', + 1 => 74, + ), + ), + 74 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'list_type', + 1 => 0, + 2 => 4, + ), + ), + ), + 75 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 1, + 2 => 1, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 1, + 2 => 1, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'some_type', + 1 => 1, + 2 => 1, + ), + ), + '|' => array( + 0 => 'S', + 1 => 76, + ), + ), + 76 => array( + 'k' => array( + 0 => 'S', + 1 => 20, + ), + 'map' => array( + 0 => 'S', + 1 => 21, + ), + 'list' => array( + 0 => 'S', + 1 => 71, + ), + ), + 77 => array( + '?' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + '(' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + '|' => array( + 0 => 'R', + 1 => array( + 0 => 'or_type', + 1 => 1, + 2 => 3, + ), + ), + ), + 78 => array( + '(end-of-file)' => array( + 0 => 'R', + 1 => array( + 0 => 'maybe_optional', + 1 => 'no', + 2 => 1, + ), + ), + ), + ), + array( + 0 => array( + 'start' => 1, + 'maybe_optional' => 2, + 'maybe_comment' => 78, + 'type' => 5, + 'some_type' => 12, + 'or_type' => 14, + 'not_or_type' => 75, + 'basic_type' => 17, + 'map_type' => 18, + 'list_type' => 19, + ), + 3 => array( + 'maybe_comment' => 4, + 'type' => 5, + 'some_type' => 12, + 'or_type' => 14, + 'not_or_type' => 75, + 'basic_type' => 17, + 'map_type' => 18, + 'list_type' => 19, + ), + 5 => array( + 'comment' => 6, + ), + 7 => array( + 'comment_text' => 8, + ), + 15 => array( + 'not_or_type' => 16, + 'basic_type' => 17, + 'map_type' => 18, + 'list_type' => 19, + ), + 22 => array( + 'type' => 23, + 'some_type' => 49, + 'or_type' => 51, + 'not_or_type' => 64, + 'basic_type' => 54, + 'map_type' => 55, + 'list_type' => 56, + ), + 24 => array( + 'type' => 25, + 'some_type' => 27, + 'or_type' => 29, + 'not_or_type' => 42, + 'basic_type' => 32, + 'map_type' => 33, + 'list_type' => 34, + ), + 30 => array( + 'not_or_type' => 31, + 'basic_type' => 32, + 'map_type' => 33, + 'list_type' => 34, + ), + 37 => array( + 'type' => 38, + 'some_type' => 49, + 'or_type' => 51, + 'not_or_type' => 64, + 'basic_type' => 54, + 'map_type' => 55, + 'list_type' => 56, + ), + 39 => array( + 'type' => 40, + 'some_type' => 27, + 'or_type' => 29, + 'not_or_type' => 42, + 'basic_type' => 32, + 'map_type' => 33, + 'list_type' => 34, + ), + 43 => array( + 'not_or_type' => 44, + 'basic_type' => 32, + 'map_type' => 33, + 'list_type' => 34, + ), + 46 => array( + 'type' => 47, + 'some_type' => 27, + 'or_type' => 29, + 'not_or_type' => 42, + 'basic_type' => 32, + 'map_type' => 33, + 'list_type' => 34, + ), + 52 => array( + 'not_or_type' => 53, + 'basic_type' => 54, + 'map_type' => 55, + 'list_type' => 56, + ), + 59 => array( + 'type' => 60, + 'some_type' => 49, + 'or_type' => 51, + 'not_or_type' => 64, + 'basic_type' => 54, + 'map_type' => 55, + 'list_type' => 56, + ), + 61 => array( + 'type' => 62, + 'some_type' => 27, + 'or_type' => 29, + 'not_or_type' => 42, + 'basic_type' => 32, + 'map_type' => 33, + 'list_type' => 34, + ), + 65 => array( + 'not_or_type' => 66, + 'basic_type' => 54, + 'map_type' => 55, + 'list_type' => 56, + ), + 68 => array( + 'type' => 69, + 'some_type' => 27, + 'or_type' => 29, + 'not_or_type' => 42, + 'basic_type' => 32, + 'map_type' => 33, + 'list_type' => 34, + ), + 72 => array( + 'type' => 73, + 'some_type' => 27, + 'or_type' => 29, + 'not_or_type' => 42, + 'basic_type' => 32, + 'map_type' => 33, + 'list_type' => 34, + ), + 76 => array( + 'not_or_type' => 77, + 'basic_type' => 17, + 'map_type' => 18, + 'list_type' => 19, + ), + ), + '(end-of-file)', + $tokens, + $callback); + } + +} diff --git a/src/parser/PhutilURI.php b/src/parser/PhutilURI.php new file mode 100644 --- /dev/null +++ b/src/parser/PhutilURI.php @@ -0,0 +1,387 @@ +protocol = $uri->protocol; + $this->user = $uri->user; + $this->pass = $uri->pass; + $this->domain = $uri->domain; + $this->port = $uri->port; + $this->path = $uri->path; + $this->query = $uri->query; + $this->fragment = $uri->fragment; + $this->type = $uri->type; + return; + } + + $uri = (string)$uri; + + $type = self::TYPE_URI; + + // Reject ambiguous URIs outright. Different versions of different clients + // parse these in different ways. See T12526 for discussion. + if (preg_match('(^[^/:]*://[^/]*[#?].*:)', $uri)) { + throw new Exception( + pht( + 'Rejecting ambiguous URI "%s". This URI is not formatted or '. + 'encoded properly.', + $uri)); + } + + $matches = null; + if (preg_match('(^([^/:]*://[^/]*)(\\?.*)\z)', $uri, $matches)) { + // If the URI is something like `idea://open?file=/path/to/file`, the + // `parse_url()` function will parse `open?file=` as the host. This is + // not the expected result. Break the URI into two pieces, stick a slash + // in between them, parse that, then remove the path. See T6106. + + $parts = parse_url($matches[1].'/'.$matches[2]); + unset($parts['path']); + } else if ($this->isGitURIPattern($uri)) { + // Handle Git/SCP URIs in the form "user@domain:relative/path". + + $user = '(?:(?P[^/@]+)@)?'; + $host = '(?P[^/:]+)'; + $path = ':(?P.*)'; + + $ok = preg_match('(^'.$user.$host.$path.'\z)', $uri, $matches); + if (!$ok) { + throw new Exception( + pht( + 'Failed to parse URI "%s" as a Git URI.', + $uri)); + } + + $parts = $matches; + $parts['scheme'] = 'ssh'; + + $type = self::TYPE_GIT; + } else { + $parts = parse_url($uri); + } + + // The parse_url() call will accept URIs with leading whitespace, but many + // other tools (like git) will not. See T4913 for a specific example. If + // the input string has leading whitespace, fail the parse. + if ($parts) { + if (ltrim($uri) != $uri) { + $parts = false; + } + } + + // NOTE: `parse_url()` is very liberal about host names; fail the parse if + // the host looks like garbage. In particular, we do not allow hosts which + // begin with "." or "-". See T12961 for a specific attack which relied on + // hosts beginning with "-". + if ($parts) { + $host = idx($parts, 'host', ''); + if (strlen($host)) { + if (!preg_match('/^[a-zA-Z0-9]+[a-zA-Z0-9\\.\\-]*\z/', $host)) { + $parts = false; + } + } + } + + if (!$parts) { + $parts = array(); + } + + // stringyness is to preserve API compatibility and + // allow the tests to continue passing + $this->protocol = idx($parts, 'scheme', ''); + $this->user = rawurldecode(idx($parts, 'user', '')); + $this->pass = rawurldecode(idx($parts, 'pass', '')); + $this->domain = idx($parts, 'host', ''); + $this->port = (string)idx($parts, 'port', ''); + $this->path = idx($parts, 'path', ''); + $query = idx($parts, 'query'); + if ($query) { + $this->query = id(new PhutilQueryStringParser())->parseQueryString( + $query); + } + $this->fragment = idx($parts, 'fragment', ''); + + $this->type = $type; + } + + public function __toString() { + $prefix = null; + + if ($this->isGitURI()) { + $port = null; + } else { + $port = $this->port; + } + + $domain = $this->domain; + + $user = $this->user; + $pass = $this->pass; + if (strlen($user) && strlen($pass)) { + $auth = rawurlencode($user).':'.rawurlencode($pass).'@'; + } else if (strlen($user)) { + $auth = rawurlencode($user).'@'; + } else { + $auth = null; + } + + $protocol = $this->protocol; + if ($this->isGitURI()) { + $protocol = null; + } else { + if (strlen($auth)) { + $protocol = nonempty($this->protocol, 'http'); + } + } + + if (strlen($protocol) || strlen($auth) || strlen($domain)) { + if ($this->isGitURI()) { + $prefix = "{$auth}{$domain}"; + } else { + $prefix = "{$protocol}://{$auth}{$domain}"; + } + + if (strlen($port)) { + $prefix .= ':'.$port; + } + } + + if ($this->query) { + $query = '?'.http_build_query($this->query, '', '&'); + } else { + $query = null; + } + + if (strlen($this->getFragment())) { + $fragment = '#'.$this->getFragment(); + } else { + $fragment = null; + } + + $path = $this->getPath(); + if ($this->isGitURI()) { + if (strlen($path)) { + $path = ':'.$path; + } + } + + return $prefix.$path.$query.$fragment; + } + + public function setQueryParam($key, $value) { + if ($value === null) { + unset($this->query[$key]); + } else { + $this->query[$key] = $value; + } + return $this; + } + + public function setQueryParams(array $params) { + $this->query = $params; + return $this; + } + + public function getQueryParams() { + return $this->query; + } + + public function setProtocol($protocol) { + $this->protocol = $protocol; + return $this; + } + + public function getProtocol() { + return $this->protocol; + } + + public function setDomain($domain) { + $this->domain = $domain; + return $this; + } + + public function getDomain() { + return $this->domain; + } + + public function setPort($port) { + $this->port = $port; + return $this; + } + public function getPort() { + return $this->port; + } + + public function getPortWithProtocolDefault() { + static $default_ports = array( + 'http' => '80', + 'https' => '443', + 'ssh' => '22', + ); + + return nonempty( + $this->getPort(), + idx($default_ports, $this->getProtocol()), + ''); + } + + public function setPath($path) { + if ($this->isGitURI()) { + // Git URIs use relative paths which do not need to begin with "/". + } else { + if ($this->domain && strlen($path) && $path[0] !== '/') { + $path = '/'.$path; + } + } + + $this->path = $path; + return $this; + } + + public function appendPath($path) { + $first = strlen($path) ? $path[0] : null; + $last = strlen($this->path) ? $this->path[strlen($this->path) - 1] : null; + + if (!$this->path) { + return $this->setPath($path); + } else if ($first === '/' && $last === '/') { + $path = substr($path, 1); + } else if ($first !== '/' && $last !== '/') { + $path = '/'.$path; + } + + $this->path .= $path; + return $this; + } + + public function getPath() { + return $this->path; + } + + public function setFragment($fragment) { + $this->fragment = $fragment; + return $this; + } + + public function getFragment() { + return $this->fragment; + } + + public function setUser($user) { + $this->user = $user; + return $this; + } + + public function getUser() { + return $this->user; + } + + public function setPass($pass) { + $this->pass = $pass; + return $this; + } + + public function getPass() { + return $this->pass; + } + + public function alter($key, $value) { + $altered = clone $this; + $altered->setQueryParam($key, $value); + return $altered; + } + + public function isGitURI() { + return ($this->type == self::TYPE_GIT); + } + + public function setType($type) { + + if ($type == self::TYPE_URI) { + $path = $this->getPath(); + if (strlen($path) && ($path[0] !== '/')) { + // Try to catch this here because we are not allowed to throw from + // inside __toString() so we don't have a reasonable opportunity to + // react properly if we catch it later. + throw new Exception( + pht( + 'Unable to convert URI "%s" into a standard URI because the '. + 'path is relative. Standard URIs can not represent relative '. + 'paths.', + $this)); + } + } + + $this->type = $type; + return $this; + } + + public function getType() { + return $this->type; + } + + private function isGitURIPattern($uri) { + $matches = null; + + $ok = preg_match('(^(?P[^/]+):(?P(?!//).*)\z)', $uri, $matches); + if (!$ok) { + return false; + } + + $head = $matches['head']; + $last = $matches['last']; + + // If any part of this has spaces in it, it's not a Git URI. We fail here + // so we fall back and don't fail more abruptly later. + if (preg_match('(\s)', $head.$last)) { + return false; + } + + // If the second part only contains digits, assume we're looking at + // casually specified "domain.com:123" URI, not a Git URI pointed at an + // entirely numeric relative path. + if (preg_match('(^\d+\z)', $last)) { + return false; + } + + // If the first part has a "." or an "@" in it, interpret it as a domain + // or a "user@host" string. + if (preg_match('([.@])', $head)) { + return true; + } + + // Otherwise, interpret the URI conservatively as a "javascript:"-style + // URI. This means that "localhost:path" is parsed as a normal URI instead + // of a Git URI, but we can't tell which the user intends and it's safer + // to treat it as a normal URI. + return false; + } + +} diff --git a/src/parser/__tests__/PhutilBugtraqParserTestCase.php b/src/parser/__tests__/PhutilBugtraqParserTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/PhutilBugtraqParserTestCase.php @@ -0,0 +1,61 @@ +setBugtraqPattern('http://bugs.com/%BUGID%') + ->setBugtraqCaptureExpression('/[Ii]ssues?:?(\s*,?\s*\d+)+/') + ->setBugtraqSelectExpression('/(\d+)/') + ->processCorpus('Issues: 123, 345'); + $this->assertEqual( + 'Issues: http://bugs.com/123, http://bugs.com/345', + $actual); + + $actual = id(new PhutilBugtraqParser()) + ->setBugtraqPattern('<%BUGID%>') + ->setBugtraqCaptureExpression('/([A-Z]{2,}-\d+)/') + ->processCorpus('AB-1 BC-2 CD-3'); + $this->assertEqual( + ' ', + $actual); + + $actual = id(new PhutilBugtraqParser()) + ->setBugtraqPattern('<%BUGID%>') + ->setBugtraqCaptureExpression('/\d+/') + ->processCorpus('This text has no bugs in it.'); + $this->assertEqual( + 'This text has no bugs in it.', + $actual); + + $actual = id(new PhutilBugtraqParser()) + ->setBugtraqPattern('<%BUGID%>') + ->setBugtraqCaptureExpression('/.*/') + ->setBugtraqSelectExpression('/(\d+)/') + ->processCorpus('This text captures but does not select.'); + $this->assertEqual( + 'This text captures but does not select.', + $actual); + + $caught = null; + try { + id(new PhutilBugtraqParser()) + ->setBugtraqCaptureExpression('!'); + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof PhutilTypeCheckException); + + + $caught = null; + try { + id(new PhutilBugtraqParser()) + ->setBugtraqSelectExpression('!'); + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof PhutilTypeCheckException); + } + + +} diff --git a/src/parser/__tests__/PhutilDocblockParserTestCase.php b/src/parser/__tests__/PhutilDocblockParserTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/PhutilDocblockParserTestCase.php @@ -0,0 +1,127 @@ +parseDocblock($root.$file); + } + } + + private function parseDocblock($doc_file) { + $contents = Filesystem::readFile($doc_file); + $file = basename($doc_file); + + $parser = new PhutilDocblockParser(); + list($docblock, $specials) = $parser->parse($contents); + + switch ($file) { + case 'embedded-specials.docblock': + $this->assertEqual(array(), $specials); + $this->assertEqual( + "So long as a @special does not appear at the beginning of a line,\n". + "it is parsed as normal text.", + $docblock); + break; + case 'indented-block.docblock': + $this->assertEqual(array(), $specials); + $this->assertEqual( + 'Cozy lummox gives smart squid who asks for job pen.', + $docblock); + break; + case 'indented-text.docblock': + $this->assertEqual(array(), $specials); + $this->assertEqual( + 'Cozy lummox gives smart squid who asks for job pen.', + $docblock); + break; + case 'multiline-special.docblock': + $this->assertEqual( + array( + 'special' => 'x y z', + ), + $specials); + $this->assertEqual( + '', + $docblock); + break; + case 'multi-specials.docblock': + $this->assertEqual( + array( + 'special' => array('north', 'south'), + 'stable' => true, + ), + $specials); + $this->assertEqual( + '', + $docblock); + break; + case 'specials.docblock': + $this->assertEqual( + array( + 'type' => 'type', + 'task' => 'task', + 'special' => array('dot', 'dot', 'dash'), + ), + $specials); + $this->assertEqual( + '', + $docblock); + break; + case 'linebreak-breaks-specials.docblock': + $this->assertEqual( + array( + 'title' => 'title', + ), + $specials); + $this->assertEqual( + 'This is normal text, not part of the @title.', + $docblock); + break; + case 'specials-with-hyphen.docblock': + $this->assertEqual( + array( + 'repeat-hyphen' => array('a', 'b'), + 'multiline-hyphen' => 'mmm nnn', + 'normal-hyphen' => 'x', + ), + $specials); + break; + case 'indented-specials.docblock': + $this->assertEqual( + array( + 'title' => 'sendmail', + 'special' => 'only a little bit indented', + ), + $specials); + break; + case 'flag-specials.docblock': + $this->assertEqual( + "stuff above\n\nstuff in the middle\n\nstuff below", + $docblock); + $this->assertEqual( + array( + 'flag' => true, + 'stuff' => true, + 'zebra' => true, + 'apple' => true, + ), + $specials); + break; + case 'mixed-types.docblock': + $this->assertEqual( + array( + 'special' => array('squirrels', true), + ), + $specials); + break; + default: + throw new Exception(pht("No test case to handle file '%s'!", $file)); + } + } + +} diff --git a/src/parser/__tests__/PhutilEditorConfigTestCase.php b/src/parser/__tests__/PhutilEditorConfigTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/PhutilEditorConfigTestCase.php @@ -0,0 +1,106 @@ +getTestFile()); + + $tests = array( + 'default' => array( + array( + 'indent_style' => 'space', + 'indent_size' => 2, + 'charset' => 'utf-8', + 'trim_trailing_whitespace' => true, + 'insert_final_newline' => true, + ), + array(), + ), + 'file' => array( + array( + 'indent_style' => 'space', + 'indent_size' => 3, + 'charset' => 'utf-8', + 'trim_trailing_whitespace' => true, + 'insert_final_newline' => true, + ), + array(), + ), + 'file.txt' => array( + array( + 'indent_style' => 'space', + 'indent_size' => 3, + 'charset' => 'latin1', + 'trim_trailing_whitespace' => true, + 'insert_final_newline' => true, + ), + array(), + ), + 'externals/README' => array( + array( + 'indent_style' => null, + 'indent_size' => null, + 'charset' => 'utf-8', + 'trim_trailing_whitespace' => false, + 'insert_final_newline' => false, + ), + array(), + ), + 'subdir/file' => array( + array( + 'indent_style' => 'tab', + 'indent_size' => 3, + 'charset' => 'utf-8-bom', + 'trim_trailing_whitespace' => true, + 'insert_final_newline' => true, + ), + array(), + ), + 'empty/file' => array( + array(), + array( + 'indent_style' => null, + 'indent_size' => null, + 'charset' => null, + 'trim_trailing_whitespace' => null, + 'insert_final_newline' => null, + ), + ), + ); + + foreach ($tests as $path => $expected) { + list($properties, $property) = $expected; + $property = array_merge($properties, $property); + + $this->assertEqual( + $properties, + $parser->getProperties($this->getTestFile($path))); + + foreach ($property as $key => $value) { + $this->assertEqual( + $value, + $parser->getProperty($this->getTestFile($path), $key)); + } + } + + $invalid_properties = array( + 'invalid', + ); + + foreach ($invalid_properties as $invalid_property) { + $caught = null; + try { + $parser->getProperty('', $invalid_property); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof InvalidArgumentException); + } + } + + private function getTestFile($path = null) { + return dirname(__FILE__).'/editorconfig/'.$path; + } + +} diff --git a/src/parser/__tests__/PhutilEmailAddressTestCase.php b/src/parser/__tests__/PhutilEmailAddressTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/PhutilEmailAddressTestCase.php @@ -0,0 +1,130 @@ +'); + $this->assertEqual( + 'Abraham Lincoln', + $email->getDisplayName()); + $this->assertEqual( + 'alincoln', + $email->getLocalPart()); + $this->assertEqual( + 'logcabin.com', + $email->getDomainName()); + $this->assertEqual( + 'alincoln@logcabin.com', + $email->getAddress()); + + $email = new PhutilEmailAddress('alincoln@logcabin.com'); + $this->assertEqual( + null, + $email->getDisplayName()); + $this->assertEqual( + 'alincoln', + $email->getLocalPart()); + $this->assertEqual( + 'logcabin.com', + $email->getDomainName()); + $this->assertEqual( + 'alincoln@logcabin.com', + $email->getAddress()); + + $email = new PhutilEmailAddress('"Abraham" '); + $this->assertEqual( + 'Abraham', + $email->getDisplayName()); + $this->assertEqual( + 'alincoln', + $email->getLocalPart()); + $this->assertEqual( + 'logcabin.com', + $email->getDomainName()); + $this->assertEqual( + 'alincoln@logcabin.com', + $email->getAddress()); + + $email = new PhutilEmailAddress(' alincoln@logcabin.com '); + $this->assertEqual( + null, + $email->getDisplayName()); + $this->assertEqual( + 'alincoln', + $email->getLocalPart()); + $this->assertEqual( + 'logcabin.com', + $email->getDomainName()); + $this->assertEqual( + 'alincoln@logcabin.com', + $email->getAddress()); + + $email = new PhutilEmailAddress('alincoln'); + $this->assertEqual( + null, + $email->getDisplayName()); + $this->assertEqual( + 'alincoln', + $email->getLocalPart()); + $this->assertEqual( + null, + $email->getDomainName()); + $this->assertEqual( + 'alincoln', + $email->getAddress()); + + $email = new PhutilEmailAddress('alincoln '); + $this->assertEqual( + 'alincoln', + $email->getDisplayName()); + $this->assertEqual( + 'alincoln at logcabin dot com', + $email->getLocalPart()); + $this->assertEqual( + null, + $email->getDomainName()); + $this->assertEqual( + 'alincoln at logcabin dot com', + $email->getAddress()); + } + + public function testEmailEncoding() { + $cases = array( + array( + 'Tangerine Q. Hawthorne', + 'thawthorne@blackspire.bunker', + '"Tangerine Q. Hawthorne" ', + ), + array( + 'Hector "\\" Backslash', + 'hector@backslash', + '"Hector \\"\\\\\\" Backslash" ', + ), + array( + 'My Middle Name "" Is My Email', + 'name@domain', + '"My Middle Name \\"\\" Is My Email" ', + ), + array( + "My Legal Name\nContains A Newline", + 'newline@example', + '"My Legal Name Contains A Newline" ', + ), + ); + + foreach ($cases as $case) { + list($name, $address, $expect) = $case; + $actual = (string)id(new PhutilEmailAddress()) + ->setDisplayName($name) + ->setAddress($address); + $this->assertEqual( + $expect, + $actual, + pht('Email: %s + %s -> %s', $name, $address, $expect)); + } + } + +} diff --git a/src/parser/__tests__/PhutilGitURITestCase.php b/src/parser/__tests__/PhutilGitURITestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/PhutilGitURITestCase.php @@ -0,0 +1,28 @@ +assertEqual('git', $uri->getUser()); + $this->assertEqual('host.com', $uri->getDomain()); + $this->assertEqual('path/to/something', $uri->getPath()); + $this->assertEqual('git@host.com:path/to/something', (string)$uri); + + $uri = new PhutilGitURI('host.com:path/to/something'); + $this->assertEqual('', $uri->getUser()); + $this->assertEqual('host.com', $uri->getDomain()); + $this->assertEqual('path/to/something', $uri->getPath()); + $this->assertEqual('host.com:path/to/something', (string)$uri); + } + + public function testStrictGitURIParsingOfLeadingWhitespace() { + $uri = new PhutilURI(' user@example.com'); + $this->assertEqual('', $uri->getDomain()); + } + + +} diff --git a/src/parser/__tests__/PhutilJSONParserTestCase.php b/src/parser/__tests__/PhutilJSONParserTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/PhutilJSONParserTestCase.php @@ -0,0 +1,139 @@ + array(), + '[]' => array(), + '{"foo": "bar"}' => array('foo' => 'bar'), + '[1, "foo", true, null]' => array(1, 'foo', true, null), + '{"foo": {"bar": "baz"}}' => array('foo' => array('bar' => 'baz')), + '{"foo": "bar", "bar": ["baz"]}' + => array('foo' => 'bar', 'bar' => array('baz')), + '{"foo": "bar", "bar": {"baz": "foo"}}' + => array('foo' => 'bar', 'bar' => array('baz' => 'foo')), + '{"": ""}' => array('' => ''), + '{"test":"\u00c9v\u00e9nement"}' + => array('test' => "\xC3\x89v\xC3\xA9nement"), + '["\u00c9v\u00e9nement"]' => array("\xC3\x89v\xC3\xA9nement"), + '{"test":"http:\/\/foo\\\\zomg"}' + => array('test' => 'http://foo\\zomg'), + '["http:\/\/foo\\\\zomg"]' => array('http://foo\\zomg'), + Filesystem::readFile(dirname(__FILE__).'/json/base64.json') => array( + 'action' => 'candidate.create', + 'actionId' => '80653a26cc46357ff79ff83b47e27c3cb7a668bd', + 'params' => array( + 'attachments' => array( + Filesystem::readFile(dirname(__FILE__).'/json/base64.data'), + ), + ), + ), + ); + + foreach ($tests as $input => $expect) { + $this->assertEqual( + $expect, + $parser->parse($input), + pht('Parsing JSON: %s', $input)); + } + } + + public function testInvalidJSON() { + $parser = new PhutilJSONParser(); + + $tests = array( + '{' => array( + 'line' => 1, + 'char' => 1, + 'token' => 'EOF', + ), + '[' => array( + 'line' => 1, + 'char' => 1, + 'token' => 'EOF', + ), + '{"foo":' => array( + 'line' => 1, + 'char' => 7, + 'token' => 'EOF', + ), + '{"foo":"bar",}' => array( + 'line' => 1, + 'char' => 13, + 'token' => '}', + ), + '{{}' => array( + 'line' => 1, + 'char' => 1, + 'token' => '{', + ), + '{}}' => array( + 'line' => 1, + 'char' => 2, + 'token' => '}', + ), + "{\"foo\":\"bar\",\n\"bar\":\"baz\",}" => array( + 'line' => 2, + 'char' => 12, + 'token' => '}', + ), + "{'foo': 'bar'}" => array( + 'line' => 1, + 'char' => 1, + 'token' => 'INVALID', + ), + "{\"foo\": \"bar\nbaz\"}" => array( + 'line' => 1, + 'char' => 7, + 'token' => 'INVALID', + ), + '{"foo": "bar\z"}' => array( + 'line' => 1, + 'char' => 7, + 'token' => 'INVALID', + ), + ); + + foreach ($tests as $input => $expected) { + $caught = null; + try { + $parser->parse($input); + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof PhutilJSONParserException); + $this->assertEqual($expected['line'], $caught->getSourceLine()); + $this->assertEqual($expected['char'], $caught->getSourceChar()); + $this->assertEqual($expected['token'], $caught->getSourceToken()); + } + } + + public function testDuplicateKeys() { + $parser = new PhutilJSONParser(); + + $tests = array( + '{"foo": "bar", "foo": "baz"}' => array('foo' => 'baz'), + ); + + foreach ($tests as $input => $expect) { + $parser->setAllowDuplicateKeys(true); + $this->assertEqual( + $expect, + $parser->parse($input), + pht('Parsing JSON: %s', $input)); + + $parser->setAllowDuplicateKeys(false); + $caught = null; + try { + $parser->parse($input); + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof PhutilJSONParserException); + } + } + +} diff --git a/src/parser/__tests__/PhutilJSONTestCase.php b/src/parser/__tests__/PhutilJSONTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/PhutilJSONTestCase.php @@ -0,0 +1,21 @@ +assertEqual( + $expect, + $serializer->encodeFormatted(array('x' => array())), + pht('Empty arrays should serialize as `%s`, not `%s`.', '[]', '{}')); + } + +} diff --git a/src/parser/__tests__/PhutilLanguageGuesserTestCase.php b/src/parser/__tests__/PhutilLanguageGuesserTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/PhutilLanguageGuesserTestCase.php @@ -0,0 +1,23 @@ +assertEqual( + $expect, + PhutilLanguageGuesser::guessLanguage($source), + pht("Guessed language for '%s'.", $test)); + } + } + +} diff --git a/src/parser/__tests__/PhutilParserGeneratorTestCase.php b/src/parser/__tests__/PhutilParserGeneratorTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/PhutilParserGeneratorTestCase.php @@ -0,0 +1,330 @@ +setTerminals(array('a')) + ->setStartRule('S') + ->setRules( + array( + 'S' => 'a b', + )); + + $caught = null; + try { + // Expect "b is not a rule or terminal". + $generator->processGrammar(); + } catch (PhutilUnknownSymbolParserGeneratorException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testBadStartRule() { + $generator = id(new PhutilParserGenerator()) + ->setTerminals(array('a')) + ->setStartRule('Q') + ->setRules( + array( + 'S' => 'a', + )); + + $caught = null; + try { + // Expect "no start rule Q". + $generator->processGrammar(); + } catch (PhutilUnknownSymbolParserGeneratorException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testMessySymbols() { + // This is testing that internal defaults are correctly changed when they + // would conflict with the provided grammar. This is a messy test which + // relies on a lot of implementation details. + + $generator = id(new PhutilParserGenerator()) + ->setTerminals(array('(init)', 'x', 'y', 'start', '(end)')) + ->setStartRule('(epsilon)') + ->setRules( + array( + '(epsilon)' => array( + array('s p a c e s'), + ), + 's p a c e s' => '(init) x start (end-of-file) y', + '(end-of-file)' => array( + '(end)', + null, + ), + )) + ->processGrammar(); + + $rules = $generator->inspectRules(); + + $init = $generator->getInitSymbol(); + $eof = $generator->getEOFSymbol(); + $epsilon = $generator->getEpsilonSymbol(); + $end = $generator->getEndSymbol(); + + $this->assertFalse($init == '(init)'); + $this->assertFalse($eof == '(end-of-file)'); + $this->assertFalse($epsilon == '(epsilon)'); + $this->assertFalse($end == '(end)'); + + $keys = array_keys($rules); + $expect = array('(end-of-file)', '(epsilon)', 's p a c e s', $init); + sort($keys); + sort($expect); + $this->assertEqual($keys, $expect); + + $this->assertEqual( + array( + array('s p a c e s', $end), + ), + $rules['(epsilon)']); + + $this->assertEqual( + array( + array('(end)', $end), + array($epsilon, $end), + ), + $rules['(end-of-file)']); + } + + public function testUnreachableTerminal() { + $generator = id(new PhutilParserGenerator()) + ->setTerminals(array('x', 'y')) + ->setStartRule('S') + ->setRules( + array( + 'S' => 'x', + )); + + $caught = null; + try { + $generator->processGrammar(); + } catch (PhutilUnreachableTerminalParserGeneratorException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testUnreachableRule() { + $generator = id(new PhutilParserGenerator()) + ->setTerminals(array('x')) + ->setStartRule('S') + ->setRules( + array( + 'S' => 'x', + 'A' => 'B', + 'B' => 'x', + )); + + $caught = null; + try { + $generator->processGrammar(); + } catch (PhutilUnreachableRuleParserGeneratorException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testIrreducibleGrammars() { + $tests = array( + 'trivially irreducible' => array( + true, + array( + 'S' => array('E', 'x'), + 'E' => 'E', + ), + ), + 'nontrivially irreducible' => array( + true, + array( + 'S' => array('X', 'x'), + 'X' => 'Y', + 'Y' => 'Z', + 'Z' => 'X', + ), + ), + 'left-recursive reducible' => array( + false, + array( + 'S' => 'E', + 'E' => array('E x', 'x'), + ), + ), + 'right-recursive reducible' => array( + false, + array( + 'S' => 'E', + 'E' => array('x', 'x E'), + ), + ), + ); + + foreach ($tests as $test) { + list($expect, $rules) = $test; + + $generator = id(new PhutilParserGenerator()) + ->setTerminals(array('x')) + ->setStartRule('S') + ->setRules($rules); + + $caught = null; + try { + $generator->processGrammar(); + } catch (PhutilIrreducibleRuleParserGeneratorException $ex) { + $caught = $ex; + } + + $this->assertEqual($expect, ($caught instanceof Exception)); + } + } + + public function testFirst() { + $generator = $this->buildABCGenerator()->processGrammar(); + + $first = $generator->inspectFirstTable(); + ksort($first); + + foreach ($first as $key => $table) { + ksort($table); + $first[$key] = $table; + } + + $this->assertEqual( + array( + 'A' => array( + '(epsilon)' => true, + 'a' => true, + 'b' => true, + ), + 'B' => array( + 'c' => true, + ), + 'C' => array( + '(epsilon)' => true, + 'b' => true, + ), + 'S' => array( + 'a' => true, + 'b' => true, + 'c' => true, + ), + ), + $first); + } + + public function testStates() { + $generator = id(new PhutilParserGenerator()) + ->setTerminals(array('a', 'b')) + ->setStartRule('S') + ->setRules( + array( + 'S' => 'X X', + 'X' => array( + 'a X', + 'b', + ), + )) + ->processGrammar(); + + $this->assertTrue(true); + } + + public function testETParser() { + $generator = $this->buildETGenerator()->processGrammar(); + + $result = $generator->parseTokens( + array( + array('n', 3), + array('+', '+'), + array('n', 5), + ), + array($this, 'didReduceET')); + + $this->assertEqual(8, $result); + } + + public function didReduceET($rule, $production, array $tokens) { + switch ($rule) { + case 'S': + return $tokens[0]; + case 'E': + switch ($production) { + case 0: + return $tokens[0] + $tokens[2]; + case 1: + return $tokens[0]; + } + break; + case 'T': + switch ($production) { + case 0: + return $tokens[1]; + case 1: + return $tokens[0][1]; + } + break; + } + + throw new Exception(pht('Unexpected rule in ET grammar.')); + } + + private function buildABCGenerator() { + $terminals = array( + 'a', + 'b', + 'c', + ); + + $rules = array( + 'S' => 'A B', + 'A' => array('C a', null), + 'B' => array('B a A C', 'c'), + 'C' => array('b', null), + ); + + $generator = id(new PhutilParserGenerator()) + ->setTerminals($terminals) + ->setStartRule('S') + ->setRules($rules); + + return $generator; + } + + private function buildETGenerator() { + // This grammar and the corresponding tests are based on: + // http://dragonbook.stanford.edu/lecture-notes/Stanford-CS143/08-Bottom-Up-Parsing.pdf + // http://dragonbook.stanford.edu/lecture-notes/Stanford-CS143/09-SLR-Parsing.pdf + + $terminals = array( + '(', + 'n', + ')', + '+', + ); + + $rules = array( + 'S' => 'E', + 'E' => array('E + T', 'T'), + 'T' => array('( E )', 'n'), + ); + + $generator = id(new PhutilParserGenerator()) + ->setTerminals($terminals) + ->setStartRule('S') + ->setRules($rules); + + return $generator; + } + + +} diff --git a/src/parser/__tests__/PhutilPygmentizeParserTestCase.php b/src/parser/__tests__/PhutilPygmentizeParserTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/PhutilPygmentizeParserTestCase.php @@ -0,0 +1,43 @@ +tryParser( + '', + '', + array(), + pht('Empty')); + + $this->tryParser( + '1', + '1', + array( + 'mi' => 'color: #ff0000', + ), + pht('Simple')); + + $this->tryParser( + '1', + '1', + array(), + pht('Missing Class')); + + $this->tryParser( + 'X', + 'X', + array( + 'nc' => 'color: #ff0000', + ), + pht('Extra Attribute')); + } + + private function tryParser($input, $expect, array $map, $label) { + $actual = id(new PhutilPygmentizeParser()) + ->setMap($map) + ->parse($input); + + $this->assertEqual($expect, $actual, pht('Pygmentize Parser: %s', $label)); + } + +} diff --git a/src/parser/__tests__/PhutilQueryStringParserTestCase.php b/src/parser/__tests__/PhutilQueryStringParserTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/PhutilQueryStringParserTestCase.php @@ -0,0 +1,140 @@ + array(), + 'foo=bar&foobar=barfoo' => array( + 'foo' => 'bar', + 'foobar' => 'barfoo', + ), + 'a]b[]=1&a]=2&a[[]=3&a[b]b=4&[][a]=5' => array( + 'a]b[]' => '1', + 'a]' => '2', + 'a[[]' => '3', + 'a[b]b' => '4', + '[][a]' => '5', + ), + 'foo[][]=bar&bar[1][3]=foo' => array( + 'foo' => array( + 0 => array( + 0 => 'bar', + ), + ), + 'bar' => array( + 1 => array( + 3 => 'foo', + ), + ), + ), + 'foo[][]=bar&a]b[]=1' => array( + 'foo' => array( + 0 => array( + 0 => 'bar', + ), + ), + 'a]b[]' => '1', + ), + 'a&&b' => array( + 'a' => '', + 'b' => '', + ), + 'a[b][]=foo&a[b][]=bar' => array( + 'a' => array( + 'b' => array( + 0 => 'foo', + 1 => 'bar', + ), + ), + ), + 'a=1&a=2' => array( + 'a' => '2', + ), + 'a=1&a[]=2' => array( + 'a' => array( + 0 => '2', + ), + ), + 'a=1&a[b]=2&a[]=3' => array( + 'a' => array( + 'b' => '2', + 0 => '3', + ), + ), + 'a%20b=%20' => array( + 'a b' => ' ', + ), + 'a.b=c' => array( + 'a.b' => 'c', + ), + 'a=b=c' => array( + 'a' => 'b=c', + ), + ); + + $parser = new PhutilQueryStringParser(); + + foreach ($map as $query_string => $expected) { + $this->assertEqual( + $expected, + $parser->parseQueryString($query_string)); + } + } + + public function testQueryStringListParsing() { + $map = array( + '' => array(), + '&' => array(), + '=' => array( + array('', ''), + ), + '=&' => array( + array('', ''), + ), + 'a=b' => array( + array('a', 'b'), + ), + 'a[]=b' => array( + array('a[]', 'b'), + ), + 'a=' => array( + array('a', ''), + ), + '. [=1' => array( + array('. [', '1'), + ), + 'a=b&c=d' => array( + array('a', 'b'), + array('c', 'd'), + ), + 'a=b&a=c' => array( + array('a', 'b'), + array('a', 'c'), + ), + '&a=b&' => array( + array('a', 'b'), + ), + '=a' => array( + array('', 'a'), + ), + '&&&' => array( + ), + 'a%20b=c%20d' => array( + array('a b', 'c d'), + ), + ); + + $parser = new PhutilQueryStringParser(); + + foreach ($map as $query_string => $expected) { + $this->assertEqual( + $expected, + $parser->parseQueryStringToPairList($query_string)); + } + } + +} diff --git a/src/parser/__tests__/PhutilSimpleOptionsTestCase.php b/src/parser/__tests__/PhutilSimpleOptionsTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/PhutilSimpleOptionsTestCase.php @@ -0,0 +1,143 @@ + array(), + + // Basic parsing. + 'legs=4' => array('legs' => '4'), + 'legs=4,eyes=2' => array('legs' => '4', 'eyes' => '2'), + + // Repeated keys mean last specification wins. + 'legs=4,legs=3' => array('legs' => '3'), + + // Keys with no value should map to true. + 'flag' => array('flag' => true), + 'legs=4,flag' => array('legs' => '4', 'flag' => true), + + // Leading and trailing spaces should be ignored. + ' flag ' => array('flag' => true), + ' legs = 4 , eyes = 2' => array('legs' => '4', 'eyes' => '2'), + + // Unescaped spaces inside values are OK. + 'legs=a b c d' => array('legs' => 'a b c d'), + + // Case should be ignored. + 'LEGS=4' => array('legs' => '4'), + 'legs=4, LEGS=4' => array('legs' => '4'), + + // Empty values should be absent. + 'legs=' => array(), + 'legs=4,legs=,eyes=2' => array('eyes' => '2'), + + // Quoted values should allow parsing comma, equals, etc. + 'punctuation=",="' => array('punctuation' => ',='), + + // Quoted keys can also have that stuff. + '"backslash\\\\quote\\""=1' => array('backslash\\quote"' => '1'), + ' "," = "," , "=" = "=" ' => array(',' => ',', '=' => '='), + + // Strings like this should not parse as simpleoptions. + 'SELECT id, name, size FROM table' => array(), + '"a""b"' => array(), + '=a' => array(), + ',a' => array(), + 'a==' => array(), + 'a=b=' => array(), + ); + + foreach ($map as $string => $expect) { + $parser = new PhutilSimpleOptions(); + $this->assertEqual( + $expect, + $parser->parse($string), + pht("Correct parse of '%s'", $string)); + } + } + + public function testSimpleOptionsCaseParse() { + $map = array( + 'legs=4, LEGS=8, LeGs' => array( + 'legs' => '4', + 'LEGS' => '8', + 'LeGs' => true, + ), + ); + + foreach ($map as $string => $expect) { + $parser = new PhutilSimpleOptions(); + $parser->setCaseSensitive(true); + $this->assertEqual( + $expect, + $parser->parse($string), + pht("Correct case-sensitive parse of '%s'", $string)); + } + } + + public function testSimpleOptionsUnterminatedStrings() { + $list = array( + '"', + "'", + 'a="', + "a='", + 'a="\\', + "a='\\", + ); + + foreach ($list as $input) { + $parser = new PhutilSimpleOptions(); + $this->assertEqual( + array(), + $parser->parse($input), + pht('Correct failing parse of invalid input: %s', $input)); + } + } + + public function testSimpleOptionsUnparse() { + $map = array( + '' => array(), + 'legs=4' => array('legs' => '4'), + 'legs=4, eyes=2' => array('legs' => '4', 'eyes' => '2'), + 'eyes=2, legs=4' => array('eyes' => '2', 'legs' => '4'), + 'legs=4, head' => array('legs' => '4', 'head' => true), + 'eyes=2' => array('legs' => '', 'eyes' => '2'), + '"thousands separator"=","' => array('thousands separator' => ','), + ); + + foreach ($map as $expect => $dict) { + $parser = new PhutilSimpleOptions(); + $this->assertEqual( + $expect, + $parser->unparse($dict), + pht('Correct unparse of %s', print_r($dict, true))); + } + + $bogus = array( + array('' => ''), + array('' => 'x'), + ); + + foreach ($bogus as $bad_input) { + $caught = null; + try { + $parser = new PhutilSimpleOptions(); + $parser->unparse($bad_input); + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue( + $caught instanceof Exception, + pht('Correct throw on unparse of bad input.')); + } + + $parser = new PhutilSimpleOptions(); + $this->assertEqual( + 'a="\\}"', + $parser->unparse(array('a' => '}'), '}'), + pht('Unparse with extra escape.')); + } + +} diff --git a/src/parser/__tests__/PhutilTypeSpecTestCase.php b/src/parser/__tests__/PhutilTypeSpecTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/PhutilTypeSpecTestCase.php @@ -0,0 +1,320 @@ +', + 'int | null', + 'list < string >', + 'int (must be even)', + 'optional int', + 'int?', + 'int|null?', + 'optional int? (minimum 300)', + 'list', + 'list>>> (easy)', + '\\SomeClass', + '\\Namespace\\SomeClass', + '\\NamespaceA\\NamespaceB\\NamespaceC', + 'NamespaceA\\NamespaceB\\NamespaceC', + ); + + $bad = array( + '', + 'list<>', + 'list', + 'map|map', + 'int optional', + '(derp)', + 'list', + 'int?|string', + '\\', + '\\\\', + '\\SomeClass\\', + 'SomeClass\\', + ); + + $good = array_fill_keys($good, true); + $bad = array_fill_keys($bad, false); + + foreach ($good + $bad as $input => $expect) { + $caught = null; + try { + PhutilTypeSpec::newFromString($input); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertEqual( + $expect, + ($caught === null), + $input); + } + } + + public function testTypeSpecStringify() { + $types = array( + 'int', + 'list', + 'map', + 'list>', + 'map>', + 'int|null', + 'int|string|null', + 'list', + 'list', + 'optional int', + 'int (even)', + ); + + foreach ($types as $type) { + $this->assertEqual( + $type, + PhutilTypeSpec::newFromString($type)->toString()); + } + } + + public function testCanonicalize() { + $tests = array( + 'int?' => 'optional int', + 'int | null' => 'int|null', + 'list < map < int , string > > ?' => 'optional list>', + 'int ( x )' => 'int ( x )', + ); + + foreach ($tests as $input => $expect) { + $this->assertEqual( + $expect, + PhutilTypeSpec::newFromString($input)->toString(), + $input); + } + } + + public function testGetCommonParentClass() { + $map = array( + 'stdClass' => array( + array('stdClass', 'stdClass'), + ), + false => array( + array('Exception', 'stdClass'), + ), + 'Exception' => array( + array('Exception', 'RuntimeException'), + array('LogicException', 'RuntimeException'), + array('BadMethodCallException', 'OutOfBoundsException'), + ), + ); + + foreach ($map as $expect => $tests) { + if (is_int($expect)) { + $expect = (bool)$expect; + } + + foreach ($tests as $input) { + list($class_a, $class_b) = $input; + + $this->assertEqual( + $expect, + PhutilTypeSpec::getCommonParentClass($class_a, $class_b), + print_r($input, true)); + } + } + } + + public function testGetTypeOf() { + $map = array( + 'int' => 1, + 'string' => 'asdf', + 'float' => 1.5, + 'bool' => true, + 'null' => null, + 'map' => array(), + 'list' => array('a', 'b'), + 'list' => array(1, 2, 3), + 'map' => array('x' => 3), + 'map>' => array(1 => array('x', 'y')), + 'stdClass' => new stdClass(), + 'list' => array( + new Exception(), + new LogicException(), + new RuntimeException(), + ), + 'map' => array('x' => new stdClass()), + ); + + foreach ($map as $expect => $input) { + $this->assertEqual( + $expect, + PhutilTypeSpec::getTypeOf($input), + print_r($input, true)); + + PhutilTypeSpec::newFromString($expect)->check($input); + } + } + + public function testTypeCheckFailures() { + $map = array( + 'int' => 'string', + 'string' => 32, + 'null' => true, + 'bool' => null, + 'map' => 16, + 'list' => array('y' => 'z'), + 'int|null' => 'ducks', + 'stdClass' => new Exception(), + 'list' => array(new Exception()), + ); + + foreach ($map as $type => $value) { + $caught = null; + try { + PhutilTypeSpec::newFromString($type)->check($value); + } catch (PhutilTypeCheckException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof PhutilTypeCheckException); + } + } + + public function testCheckMap() { + $spec = array( + 'count' => 'int', + 'color' => 'optional string', + ); + + // Valid + + PhutilTypeSpec::checkMap( + array( + 'count' => 1, + ), + $spec); + + // Valid, with optional parameter. + + PhutilTypeSpec::checkMap( + array( + 'count' => 3, + 'color' => 'red', + ), + $spec); + + // Parameter "count" is required but missing. + + $caught = null; + try { + PhutilTypeSpec::checkMap( + array(), + $spec); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof PhutilTypeMissingParametersException); + + // Parameter "size" is specified but does not exist. + + $caught = null; + try { + PhutilTypeSpec::checkMap( + array( + 'count' => 4, + 'size' => 'large', + ), + $spec); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof PhutilTypeExtraParametersException); + } + + public function testRegexValidation() { + PhutilTypeSpec::checkMap( + array( + 'regex' => '/.*/', + ), + array( + 'regex' => 'regex', + )); + + $caught = null; + try { + PhutilTypeSpec::checkMap( + array( + 'regex' => '.*', + ), + array( + 'regex' => 'regex', + )); + } catch (PhutilTypeCheckException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof PhutilTypeCheckException); + } + + public function testScalarOrListRegexp() { + PhutilTypeSpec::checkMap( + array( + 'regex' => '/.*/', + ), + array( + 'regex' => 'regex | list', + )); + + PhutilTypeSpec::checkMap( + array( + 'regex' => array('/.*/'), + ), + array( + 'regex' => 'regex | list', + )); + + PhutilTypeSpec::checkMap( + array( + 'regex' => '/.*/', + ), + array( + 'regex' => 'list | regex', + )); + + PhutilTypeSpec::checkMap( + array( + 'regex' => array('/.*/'), + ), + array( + 'regex' => 'list | regex', + )); + + $this->assertTrue(true); + } + + public function testMixedVector() { + // This is a test case for an issue where we would not infer the type + // of a vector containing a mixture of scalar and nonscalar elements + // correctly. + + $caught = null; + try { + PhutilTypeSpec::checkMap( + array( + 'key' => array('!', (object)array()), + ), + array( + 'key' => 'list', + )); + } catch (PhutilTypeCheckException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof PhutilTypeCheckException); + } + +} diff --git a/src/parser/__tests__/PhutilURITestCase.php b/src/parser/__tests__/PhutilURITestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/PhutilURITestCase.php @@ -0,0 +1,278 @@ +assertEqual('http', $uri->getProtocol(), pht('protocol')); + $this->assertEqual('user', $uri->getUser(), pht('user')); + $this->assertEqual('pass', $uri->getPass(), pht('password')); + $this->assertEqual('host', $uri->getDomain(), pht('domain')); + $this->assertEqual('99', $uri->getPort(), pht('port')); + + $this->assertEqual('/path/', $uri->getPath(), pht('path')); + $this->assertEqual( + array( + 'query' => 'value', + ), + $uri->getQueryParams(), + 'query params'); + $this->assertEqual('fragment', $uri->getFragment(), pht('fragment')); + $this->assertEqual( + 'http://user:pass@host:99/path/?query=value#fragment', + (string)$uri, + 'uri'); + + + $uri = new PhutilURI('ssh://git@example.com/example/example.git'); + $this->assertEqual('ssh', $uri->getProtocol(), pht('protocol')); + $this->assertEqual('git', $uri->getUser(), pht('user')); + $this->assertEqual('', $uri->getPass(), pht('password')); + $this->assertEqual('example.com', $uri->getDomain(), pht('domain')); + $this->assertEqual('', $uri->getPort(), 'port'); + + $this->assertEqual('/example/example.git', $uri->getPath(), pht('path')); + $this->assertEqual( + array(), + $uri->getQueryParams(), + pht('query parameters')); + $this->assertEqual('', $uri->getFragment(), pht('fragment')); + $this->assertEqual( + 'ssh://git@example.com/example/example.git', + (string)$uri, + 'uri'); + + + $uri = new PhutilURI('http://0@domain.com/'); + $this->assertEqual('0', $uri->getUser()); + $this->assertEqual('http://0@domain.com/', (string)$uri); + + $uri = new PhutilURI('http://0:0@domain.com/'); + $this->assertEqual('0', $uri->getUser()); + $this->assertEqual('0', $uri->getPass()); + $this->assertEqual('http://0:0@domain.com/', (string)$uri); + + $uri = new PhutilURI('http://%20:%20@domain.com/'); + $this->assertEqual(' ', $uri->getUser()); + $this->assertEqual(' ', $uri->getPass()); + $this->assertEqual('http://%20:%20@domain.com/', (string)$uri); + + $uri = new PhutilURI('http://%40:%40@domain.com/'); + $this->assertEqual('@', $uri->getUser()); + $this->assertEqual('@', $uri->getPass()); + $this->assertEqual('http://%40:%40@domain.com/', (string)$uri); + + $uri = new PhutilURI('http://%2F:%2F@domain.com/'); + $this->assertEqual('/', $uri->getUser()); + $this->assertEqual('/', $uri->getPass()); + $this->assertEqual('http://%2F:%2F@domain.com/', (string)$uri); + + // These tests are covering cases where cURL and parse_url() behavior + // may differ in potentially dangerous ways. See T6755 for discussion. + + // In general, we defuse these attacks by emitting URIs which escape + // special characters so that they are interpreted unambiguously by + // cURL in the same way that parse_url() interpreted them. + + $uri = new PhutilURI('http://u:p@evil.com?@good.com'); + $this->assertEqual('u', $uri->getUser()); + $this->assertEqual('p', $uri->getPass()); + $this->assertEqual('evil.com', $uri->getDomain()); + $this->assertEqual('http://u:p@evil.com?%40good.com=', (string)$uri); + + // The behavior of URLs in these forms differs for different versions + // of cURL, PHP, and other software. Because safe parsing is a tricky + // proposition and these URIs are almost certainly malicious, we just + // reject them. See T12526 for discussion. + + $dangerous = array( + // Ambiguous encoding. + 'http://good.com#u:p@evil.com/' => true, + 'http://good.com?u:p@evil.com/' => true, + + // Unambiguous encoding: with a trailing slash. + 'http://good.com/#u:p@evil.com/' => false, + 'http://good.com/?u:p@evil.com/' => false, + + // Unambiguous encoding: with escaping. + 'http://good.com%23u:p@evil.com/' => false, + 'http://good.com%40u:p@evil.com/' => false, + ); + + foreach ($dangerous as $input => $expect) { + $caught = null; + try { + new PhutilURI($input); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertEqual( + $expect, + ($caught instanceof $ex), + pht('Unexpected parse result for dangerous URI "%s".', $input)); + } + + $uri = new PhutilURI('www.example.com'); + $this->assertEqual('', $uri->getProtocol()); + $this->assertEqual('www.example.com', (string)$uri); + } + + public function testURIGeneration() { + $uri = new PhutilURI('http://example.com'); + $uri->setPath('bar'); + $this->assertEqual('http://example.com/bar', $uri->__toString()); + } + + public function testStrictURIParsingOfHosts() { + $uri = new PhutilURI('http://&/'); + $this->assertEqual('', $uri->getDomain()); + + // See T12961 for more discussion of these hosts which begin with "-". + $uri = new PhutilURI('ssh://-oProxyCommand/'); + $this->assertEqual('', $uri->getDomain()); + $uri = new PhutilURI('ssh://-oProxyCommand=curl/'); + $this->assertEqual('', $uri->getDomain()); + $uri = new PhutilURI('ssh://.com/'); + $this->assertEqual('', $uri->getDomain()); + + // Make sure newlines are rejected. + $uri = new PhutilURI("ssh://example.com\n.domain.us/"); + $this->assertEqual('', $uri->getDomain()); + $uri = new PhutilURI("ssh://example.com\n"); + $this->assertEqual('', $uri->getDomain()); + } + + public function testStrictURIParsingOfLeadingWhitespace() { + $uri = new PhutilURI(' http://example.com/'); + $this->assertEqual('', $uri->getDomain()); + } + + public function testAppendPath() { + $uri = new PhutilURI('http://example.com'); + $uri->appendPath('foo'); + $this->assertEqual('http://example.com/foo', $uri->__toString()); + $uri->appendPath('bar'); + $this->assertEqual('http://example.com/foo/bar', $uri->__toString()); + + $uri = new PhutilURI('http://example.com'); + $uri->appendPath('/foo/'); + $this->assertEqual('http://example.com/foo/', $uri->__toString()); + $uri->appendPath('/bar/'); + $this->assertEqual('http://example.com/foo/bar/', $uri->__toString()); + + $uri = new PhutilURI('http://example.com'); + $uri->appendPath('foo'); + $this->assertEqual('http://example.com/foo', $uri->__toString()); + $uri->appendPath('/bar/'); + $this->assertEqual('http://example.com/foo/bar/', $uri->__toString()); + } + + public function testUnusualURIs() { + $uri = new PhutilURI('file:///path/to/file'); + $this->assertEqual('file', $uri->getProtocol(), pht('protocol')); + $this->assertEqual('', $uri->getDomain(), pht('domain')); + $this->assertEqual('/path/to/file', $uri->getPath(), pht('path')); + + $uri = new PhutilURI('idea://open?x=/'); + $this->assertEqual('idea', $uri->getProtocol(), pht('protocol')); + $this->assertEqual('open', $uri->getDomain(), pht('domain')); + $this->assertEqual('', $uri->getPath(), pht('path')); + $this->assertEqual( + array( + 'x' => '/', + ), + $uri->getQueryParams()); + + // This is not a legitimate URI and should not parse as one. + $uri = new PhutilURI('fruit.list: apple banana cherry'); + $this->assertEqual('', $uri->getDomain()); + } + + public function testAmbiguousURIs() { + // It's important that this be detected as a Javascript URI, because that + // is how browsers will treat it. + $uri = new PhutilURI('javascript:evil'); + $this->assertEqual('javascript', $uri->getProtocol()); + + + // This is "wrong", in that the user probably intends for this to be a + // Git-style URI, but we can not easily parse it as one without making the + // "javascript" case above unsafe. + $uri = new PhutilURI('localhost:todo.txt'); + $this->assertEqual('localhost', $uri->getProtocol()); + + + // These variants are unambiguous and safe. + $uri = new PhutilURI('localhost.com:todo.txt'); + $this->assertEqual('localhost.com', $uri->getDomain()); + + $uri = new PhutilURI('user@localhost:todo.txt'); + $this->assertEqual('localhost', $uri->getDomain()); + + // This could either be a Git URI with relative path "22", or a normal URI + // with port "22". We should assume it is a port number because this is + // relatively common, while relative Git URIs pointing at numeric filenames + // are bizarre. + $uri = new PhutilURI('domain.com:22'); + $this->assertEqual('domain.com', $uri->getDomain()); + $this->assertEqual('22', $uri->getPort()); + } + + public function testDefaultPorts() { + $uri = new PhutilURI('http://www.example.com'); + $this->assertEqual('80', $uri->getPortWithProtocolDefault()); + + $uri = new PhutilURI('https://www.example.com'); + $this->assertEqual('443', $uri->getPortWithProtocolDefault()); + + $uri = new PhutilURI('ssh://git@example.com/example/example.git'); + $this->assertEqual('22', $uri->getPortWithProtocolDefault()); + + $uri = new PhutilURI('unknown://www.example.com'); + $this->assertEqual('', $uri->getPortWithProtocolDefault()); + } + + public function testGitURIParsing() { + $uri = new PhutilURI('git@host.com:path/to/something'); + $this->assertEqual('ssh', $uri->getProtocol()); + $this->assertEqual('git', $uri->getUser()); + $this->assertEqual('host.com', $uri->getDomain()); + $this->assertEqual('path/to/something', $uri->getPath()); + $this->assertEqual('git@host.com:path/to/something', (string)$uri); + + $uri = new PhutilURI('host.com:path/to/something'); + $this->assertEqual('ssh', $uri->getProtocol()); + $this->assertEqual('', $uri->getUser()); + $this->assertEqual('host.com', $uri->getDomain()); + $this->assertEqual('path/to/something', $uri->getPath()); + $this->assertEqual('host.com:path/to/something', (string)$uri); + + $uri_1 = new PhutilURI('host.com:path/to/something'); + $uri_2 = new PhutilURI($uri_1); + + $this->assertEqual((string)$uri_1, (string)$uri_2); + } + + public function testStrictGitURIParsingOfLeadingWhitespace() { + $uri = new PhutilURI(' user@example.com:path'); + $this->assertEqual('', $uri->getDomain()); + } + + public function testNoRelativeURIPaths() { + $uri = new PhutilURI('user@example.com:relative_path'); + + $caught = null; + try { + $uri->setType(PhutilURI::TYPE_URI); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + +} diff --git a/src/parser/__tests__/docblock/embedded-specials.docblock b/src/parser/__tests__/docblock/embedded-specials.docblock new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/docblock/embedded-specials.docblock @@ -0,0 +1,4 @@ +/** + * So long as a @special does not appear at the beginning of a line, + * it is parsed as normal text. + */ diff --git a/src/parser/__tests__/docblock/flag-specials.docblock b/src/parser/__tests__/docblock/flag-specials.docblock new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/docblock/flag-specials.docblock @@ -0,0 +1,15 @@ +/** + * stuff above + * + * @flag + * @stuff + * @stuff + * + * @zebra + * + * stuff in the middle + * + * @apple + * + * stuff below + */ diff --git a/src/parser/__tests__/docblock/indented-block.docblock b/src/parser/__tests__/docblock/indented-block.docblock new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/docblock/indented-block.docblock @@ -0,0 +1,3 @@ + /** + * Cozy lummox gives smart squid who asks for job pen. + */ diff --git a/src/parser/__tests__/docblock/indented-specials.docblock b/src/parser/__tests__/docblock/indented-specials.docblock new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/docblock/indented-specials.docblock @@ -0,0 +1,11 @@ +/** + * @title sendmail + * + * Blah blah add this configuration: + * + * @notspecial.com =~+> do sendmail magic + * + * @special only a + * little bit + * indented + */ diff --git a/src/parser/__tests__/docblock/indented-text.docblock b/src/parser/__tests__/docblock/indented-text.docblock new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/docblock/indented-text.docblock @@ -0,0 +1,3 @@ +/** + * Cozy lummox gives smart squid who asks for job pen. + */ diff --git a/src/parser/__tests__/docblock/linebreak-breaks-specials.docblock b/src/parser/__tests__/docblock/linebreak-breaks-specials.docblock new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/docblock/linebreak-breaks-specials.docblock @@ -0,0 +1,5 @@ +/** + * @title title + * + * This is normal text, not part of the @title. + */ diff --git a/src/parser/__tests__/docblock/mixed-types.docblock b/src/parser/__tests__/docblock/mixed-types.docblock new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/docblock/mixed-types.docblock @@ -0,0 +1,4 @@ +/** + * @special squirrels + * @special + */ diff --git a/src/parser/__tests__/docblock/multi-specials.docblock b/src/parser/__tests__/docblock/multi-specials.docblock new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/docblock/multi-specials.docblock @@ -0,0 +1,8 @@ +/** + * @special north + * @special south + * + * @stable + * @stable + * @stable + */ diff --git a/src/parser/__tests__/docblock/multiline-special.docblock b/src/parser/__tests__/docblock/multiline-special.docblock new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/docblock/multiline-special.docblock @@ -0,0 +1,5 @@ +/** + * @special x + * y + * z + */ diff --git a/src/parser/__tests__/docblock/specials-with-hyphen.docblock b/src/parser/__tests__/docblock/specials-with-hyphen.docblock new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/docblock/specials-with-hyphen.docblock @@ -0,0 +1,7 @@ +/** + * @repeat-hyphen a + * @repeat-hyphen b + * @multiline-hyphen mmm + * nnn + * @normal-hyphen x + */ diff --git a/src/parser/__tests__/docblock/specials.docblock b/src/parser/__tests__/docblock/specials.docblock new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/docblock/specials.docblock @@ -0,0 +1,8 @@ +/** + * @type type + * @task task + * + * @special dot + * @special dot + * @special dash + */ diff --git a/src/parser/__tests__/editorconfig/.editorconfig b/src/parser/__tests__/editorconfig/.editorconfig new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/editorconfig/.editorconfig @@ -0,0 +1,23 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[file*] +indent_size = 3 + +[*.txt] +charset = latin1 + +[{invalid_glob] +indent_size = 1 + +[externals/**] +indent_style = +indent_size = +trim_trailing_whitespace = false +insert_final_newline = false diff --git a/src/parser/__tests__/editorconfig/empty/.editorconfig b/src/parser/__tests__/editorconfig/empty/.editorconfig new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/editorconfig/empty/.editorconfig @@ -0,0 +1 @@ +root = true diff --git a/src/parser/__tests__/editorconfig/externals/.editorconfig b/src/parser/__tests__/editorconfig/externals/.editorconfig new file mode 100644 diff --git a/src/parser/__tests__/editorconfig/subdir/.editorconfig b/src/parser/__tests__/editorconfig/subdir/.editorconfig new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/editorconfig/subdir/.editorconfig @@ -0,0 +1,3 @@ +[*] +indent_style = tab +charset = utf-8-bom diff --git a/src/parser/__tests__/json/base64.data b/src/parser/__tests__/json/base64.data new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/json/base64.data @@ -0,0 +1 @@ +fileName:Resume.doc;base64stream:0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAOwADAP7/CQAGAAAAAAAAAAAAAAABAAAALgAAAAAAAAAAEAAAAgAAAAEAAAD+////AAAAAAAAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9//////////7///8tAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAAP7///8WAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAAIAAAACEAAAAiAAAAIwAAACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAALAAAAP7////+////LwAAAP7//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1IAbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAAAAAAAAAQAAAP7////+////BAAAAAUAAAAGAAAA/v///wgAAAD+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8BAP7/AwoAAP////8GCQIAAAAAAMAAAAAAAABGGAAAAE1pY3Jvc29mdCBXb3JkLURva3VtZW50AAoAAABNU1dvcmREb2MAEAAAAFdvcmQuRG9jdW1lbnQuOAD0ObJxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/wAAAQACAAAAAAAAAAAAAAAAAAAAAAABAAAA4IWf8vlPaBCrkQgAKyez2TAAAAC8AAAACAAAAAEAAABIAAAABAAAAFAAAAAIAAAAaAAAAAkAAACAAAAACgAAAIwAAAALAAAAmAAAAAwAAACkAAAADQAAALAAAAACAAAA6f0AAB4AAAAOAAAAQXByaWwgVmlzbmljawAAAB4AAAAOAAAAQXByaWwgVmlzbmljawAAAB4AAAACAAAAMQAAAEAAAAAAgRssAAAAAEAAAAAAAAAAAAAAAEAAAAAA1pEh62jLAUAAAAAAhXEJ8mjLAQAAAAAAAAAAAAAAAAAAAAAAAAAA/v8AAAEAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAALVzdWcLhsQk5cIACss+a5EAAAABdXN1ZwuGxCTlwgAKyz5rhIANQAKAAEAWwAPAAIAAAAAAAAAbgAAEPH/AgBuAAAABwBEAGUAZgBhAHUAbAB0AAAAGgAAAAMkAGEkADEkACokATckATUkATMkAUEkADMAQioAT0oAAFFKAABDShgAbUgJBHNICQRLSAEAUEoEAG5I/wBeSgUAYUoYAF9I/wB0SP8AAAAAAAAAAAAAAAAAAAAAAAAAAEIAQUDy/6EAQgAAABkAQQBiAHMAYQB0AHoALQBTAHQAYQBuAGQAYQByAGQAcwBjAGgAcgBpAGYAdABhAHIAdAAAAAAAAAAAAAAAAAAuAP4f8v/xAC4AAAAJAFcAVwA4AE4AdQBtADEAegAwAAAADABPSgYAUUoGAF5KBwAuAP4f8v8BAS4AAAAJAFcAVwA4AE4AdQBtADEAegAxAAAADABPSggAUUoIAF5KBwAuAP4f8v8RAS4AAAAJAFcAVwA4AE4AdQBtADIAegAwAAAADABPSgYAUUoGAF5KBwAuAP4f8v8hAS4AAAAJAFcAVwA4AE4AdQBtADIAegAxAAAADABPSggAUUoIAF5KBwAuAP4f8v8xAS4AAAAJAFcAVwA4AE4AdQBtADMAegAwAAAADABPSgYAUUoGAF5KBwAuAP4f8v9BAS4AAAAJAFcAVwA4AE4AdQBtADMAegAxAAAADABPSggAUUoIAF5KBwAuAP4f8v9RAS4AAAAJAFcAVwA4AE4AdQBtADQAegAwAAAADABPSgYAUUoGAF5KBwAuAP4f8v9hAS4AAAAJAFcAVwA4AE4AdQBtADQAegAxAAAADABPSggAUUoIAF5KBwAuAP4f8v9xAS4AAAAJAFcAVwA4AE4AdQBtADUAegAwAAAADABPSgYAUUoGAF5KBwAuAP4f8v+BAS4AAAAJAFcAVwA4AE4AdQBtADUAegAxAAAADABPSggAUUoIAF5KBwAuAP4f8v+RAS4AAAAJAFcAVwA4AE4AdQBtADYAegAwAAAADABPSgYAUUoGAF5KBwA2AP4f8v+hATYAAAAJAFcAVwA4AE4AdQBtADcAegAwAAAAFABPSgYAUUoGAENKHABeSgcAYUocADYA/h/y/7EBNgAAAAkAVwBXADgATgB1AG0ANwB6ADEAAAAUAE9KCQBRSgkAQ0ocAF5KBwBhShwAQgD+H/L/wQFCAAAAGQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0AAAAAABIAP4f8v/RAUgAAAAcAFcAVwAtAEEAYgBzAGEAdAB6AC0AUwB0AGEAbgBkAGEAcgBkAHMAYwBoAHIAaQBmAHQAYQByAHQAAAAAAC4A/h/y/+EBLgAAAAkAVwBXADgATgB1AG0ANgB6ADEAAAAMAE9KCABRSggAXkoHADYA/h/y//EBNgAAAAkAVwBXADgATgB1AG0AOAB6ADAAAAAUAE9KBgBRSgYAQ0ocAF5KBwBhShwANgD+H/L/AQI2AAAACQBXAFcAOABOAHUAbQA4AHoAMQAAABQAT0oIAFFKCABDShwAXkoHAGFKHABKAP4f8v8RAkoAAAAdAFcAVwAtAEEAYgBzAGEAdAB6AC0AUwB0AGEAbgBkAGEAcgBkAHMAYwBoAHIAaQBmAHQAYQByAHQAMQAAAAAATAD+H/L/IQJMAAAAHgBXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAAAAAATgD+H/L/MQJOAAAAHwBXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAxAAAAAABQAP4f8v9BAlAAAAAgAFcAVwAtAEEAYgBzAGEAdAB6AC0AUwB0AGEAbgBkAGEAcgBkAHMAYwBoAHIAaQBmAHQAYQByAHQAMQAxADEAMQAAAAAAUgD+H/L/UQJSAAAAIQBXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAxADEAMQAAAAAAVAD+H/L/YQJUAAAAIgBXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAxADEAMQAxAAAAAABWAP4f8v9xAlYAAAAjAFcAVwAtAEEAYgBzAGEAdAB6AC0AUwB0AGEAbgBkAGEAcgBkAHMAYwBoAHIAaQBmAHQAYQByAHQAMQAxADEAMQAxADEAMQAAAAAAWAD+H/L/gQJYAAAAJABXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAxADEAMQAxADEAMQAAAAAAWgD+H/L/kQJaAAAAJQBXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAxADEAMQAxADEAMQAxAAAAAABcAP4f8v+hAlwAAAAmAFcAVwAtAEEAYgBzAGEAdAB6AC0AUwB0AGEAbgBkAGEAcgBkAHMAYwBoAHIAaQBmAHQAYQByAHQAMQAxADEAMQAxADEAMQAxADEAMQAAAAAAXgD+H/L/sQJeAAAAJwBXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAxADEAMQAxADEAMQAxADEAMQAAAAAAYAD+H/L/wQJgAAAAKABXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAxADEAMQAxADEAMQAxADEAMQAxAAAAAABiAP4f8v/RAmIAAAApAFcAVwAtAEEAYgBzAGEAdAB6AC0AUwB0AGEAbgBkAGEAcgBkAHMAYwBoAHIAaQBmAHQAYQByAHQAMQAxADEAMQAxADEAMQAxADEAMQAxADEAMQAAAAAAZAD+H/L/4QJkAAAAKgBXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAxADEAMQAxADEAMQAxADEAMQAxADEAMQAAAAAANgD+H/L/8QI2AAAABwBCAHUAbABsAGUAdABzAAAAGABPSgcAUUoHAENKHABQSgcAXkoHAGFKHABGAP4fAQASA0YAAAAHAEgAZQBhAGQAaQBuAGcAAAANADAAE6TwABSkeAAGJAEAGABPSgIAUUoCAENKHABQSgoAXkoFAGFKHAAuAEIQAQASAy4AAAAJAFQAZQB4AHQAIABiAG8AZAB5AAAACgAxABOkAAAUpHgAAAAgAC8QEQMiAyAAAAAEAEwAaQBzAHQAAAACADIABABeSgsAQAD+HwEAMgNAAAAABwBDAGEAcAB0AGkAbwBuAAAADQAzABOkeAAUpHgADCQBABIAQ0oYADYIAV5KCwBhShgAXQgBJgD+HwEAQgMmAAAABQBJAG4AZABlAHgAAAAFADQADCQBAAQAXkoLAAAAAACxDAAABAAALgAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAWGQAAYiEAABEAAAASAAAAAAgAAGYLAABiEQAAFhkAAGIhAAATAAAAFAAAABUAAAAWAAAABwABAAAAAQAAAP8P/w//D/8P/w//D/8P/w//DwAAAgAAAAIAAAD/D/8P/w//D/8P/w//D/8P/w8AAAMAAAADAAAA/w//D/8P/w//D/8P/w//D/8PAAAEAAAABAAAAP8P/w//D/8P/w//D/8P/w//DwAABQAAAAUAAAD/D/8P/w//D/8P/w//D/8P/w8AAAYAAAAGAAAA/w//D/8P/w//D/8P/w//D/8PAAAHAAAABwAAAP8P/w//D/8P/w//D/8P/w//DwAAAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EcAhghJj+FcYFAAFwCAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E2AlghJj+FcYFAAHYCQZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EQAtghJj+FcYFAAFACwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EqAxghJj+FcYFAAGoDAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EEA5ghJj+FcYFAAEQDgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EeA9ghJj+FcYFAAF4DwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E4BBghJj+FcYFAAHgEAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6ESBJghJj+FcYFAAFIEgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EsBNghJj+FcYFAAGwEwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EcAhghJj+FcYFAAFwCAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E2AlghJj+FcYFAAHYCQZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EQAtghJj+FcYFAAFACwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EqAxghJj+FcYFAAGoDAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EEA5ghJj+FcYFAAEQDgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EeA9ghJj+FcYFAAF4DwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E4BBghJj+FcYFAAHgEAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6ESBJghJj+FcYFAAFIEgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EsBNghJj+FcYFAAGwEwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EcAhghJj+FcYFAAFwCAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E2AlghJj+FcYFAAHYCQZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EQAtghJj+FcYFAAFACwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EqAxghJj+FcYFAAGoDAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EEA5ghJj+FcYFAAEQDgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EeA9ghJj+FcYFAAF4DwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E4BBghJj+FcYFAAHgEAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6ESBJghJj+FcYFAAFIEgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EsBNghJj+FcYFAAGwEwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EcAhghJj+FcYFAAFwCAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E2AlghJj+FcYFAAHYCQZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EQAtghJj+FcYFAAFACwZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EqAxghJj+FcYFAAGoDAZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EEA5ghJj+FcYFAAEQDgZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EeA9ghJj+FcYFAAF4DwZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E4BBghJj+FcYFAAHgEAZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6ESBJghJj+FcYFAAFIEgZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EsBNghJj+FcYFAAGwEwZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EcAhghJj+FcYFAAFwCAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E2AlghJj+FcYFAAHYCQZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EQAtghJj+FcYFAAFACwZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EqAxghJj+FcYFAAGoDAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EEA5ghJj+FcYFAAEQDgZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EeA9ghJj+FcYFAAF4DwZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E4BBghJj+FcYFAAHgEAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6ESBJghJj+FcYFAAFIEgZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EsBNghJj+FcYFAAGwEwZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAAFBAAAF6EcAhghJj+FcYFAAFwCAZPSgYAUUoGAENKHABeSgcAYUocAAEAt/ABAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAUEAAAXoTYCWCEmP4VxgUAAdgJBk9KCABRSggAQ0ocAF5KBwBhShwAAQDmJQEAAAAXAAAAAAAAAAAAAAAAAAAAAAAAABQQAABehEALYISY/hXGBQABQAsGT0oIAFFKCABDShwAXkoHAGFKHAABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAAFBAAAF6EqAxghJj+FcYFAAGoDAZPSgYAUUoGAENKHABeSgcAYUocAAEAt/ABAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAUEAAAXoQQDmCEmP4VxgUAARAOBk9KCABRSggAQ0ocAF5KBwBhShwAAQDmJQEAAAAXAAAAAAAAAAAAAAAAAAAAAAAAABQQAABehHgPYISY/hXGBQABeA8GT0oIAFFKCABDShwAXkoHAGFKHAABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAAFBAAAF6E4BBghJj+FcYFAAHgEAZPSgYAUUoGAENKHABeSgcAYUocAAEAt/ABAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAUEAAAXoRIEmCEmP4VxgUAAUgSBk9KCABRSggAQ0ocAF5KBwBhShwAAQDmJQEAAAAXAAAAAAAAAAAAAAAAAAAAAAAAABQQAABehLATYISY/hXGBQABsBMGT0oIAFFKCABDShwAXkoHAGFKHAABAKolAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAABAAAF6EsAFghFD+FcYFAAGwAQYAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAQAABehEACYITA/RXGBQABQAIGAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAXoTQAmCEMP0VxgUAAdACBgAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAABAAAF6EYANghKD8FcYFAAFgAwYAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAQAABehPADYIQQ/BXGBQAB8AMGAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAXoSABGCEgPsVxgUAAYAEBgAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAABAAAF6EEAVghPD6FcYFAAEQBQYAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAQAABehKAFYIRg+hXGBQABoAUGAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAXoQwBmCE0PkVxgUAATAGBgAABwAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////8HAAAABwBXAFcAOABOAHUAbQAxAAcAVwBXADgATgB1AG0AMwAHAFcAVwA4AE4AdQBtADQABwBXAFcAOABOAHUAbQA1AAcAVwBXADgATgB1AG0ANgAHAFcAVwA4AE4AdQBtADcAAAAAAAAAsQwAAAAAAAACEAAAAAAAAACxDAAAUAAACAAAAAAMAAAARxaQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAaQBtAGUAcwAgAE4AZQB3ACAAUgBvAG0AYQBuAAAANRaQAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFMAeQBtAGIAbwBsAAAAMyaQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEAcgBpAGEAbAAAAEEmkAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAHIAZQBiAHUAYwBoAGUAdAAgAE0AUwAAAEkmkAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAHIAaQBhAGwAIABVAG4AaQBjAG8AZABlACAATQBTAAAANQaQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAYQBoAG8AbQBhAAAANQSQAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFMAeQBtAGIAbwBsAAAAXwSQAQALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8AcABlAG4AUwB5AG0AYgBvAGwAAABBAHIAaQBhAGwAIABVAG4AaQBjAG8AZABlACAATQBTAAAAXwSQAYALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8AcABlAG4AUwB5AG0AYgBvAGwAAABBAHIAaQBhAGwAIABVAG4AaQBjAG8AZABlACAATQBTAAAAOwSQAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAaQBuAGcAZABpAG4AZwBzAAAAOwaQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE0AUwAgAE0AaQBuAGMAaABvAAAANQSQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAYQBoAG8AbQBhAAAAQgAEAAEIjRgAAMUCAABoAQAAAACWVeoGy1XqBgAAAAABAAAAAAAMAgAAgQwAAAIAPQAAAAQAg5A9AAAADAIAAIEMAAACAD0AAAA9AAAAAAAAACcDACAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAgAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADspQEBTSAJBAAAABK/AAAAAAAAMAAAAAAACAAAYiEAAA4AQ2FvbGFuODAAAAAAAAAAAAAAAAAAAAAAAAAJBBYAMi4AAAAAAAAAAAAAsQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AEQAAAAIAAAD//w8AEwAAAAQAAAD//w8AAAAAAAAAAAAAAAAAAAAAAIgAAAAAAKoKAAAAAAAAqgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqgoAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL4KAAA0AAAA8goAABQAAAAGCwAAJAAAAAAAAAAAAAAAlxsAABwDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdhsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACzHgAAYgIAAAAAAAAAAAAAghsAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqCwAAxgAAAH4aAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOGwAAaAAAAAAAAAAAAAAAdhsAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgDZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEAcAByAGkAbAAgAFYAaQBzAG4AaQBjAGsADQAxADQAMAAgAEwAbwBuAGcAIABEAHIAaQB2AGUADQBJAHIAdwBpAG4ALAAgAFAAQQAgADEANQA2ADQAMgANACgANwAyADQAKQAgADYAMQAwAC0AMQA0ADgAMAANAA0ADQBDAG8AbQBwAHUAdABlAHIAIABTAGsAaQBsAGwAcwANAA0ACQAJAEkAIABhAG0AIABlAHgAcABlAHIAaQBlAG4AYwBlAGQAIAB3AGkAdABoACAATQBpAGMAcgBvAHMAbwBmAHQAIABXAG8AcgBkACAAYQBuAGQAIABFAHgAYwBlAGwALgANAA0ACQAJAEkAIABjAGEAbgAgAHUAcwBlACAASQBuAHQAZQByAG4AZQB0ACAARQB4AHAAbABvAHIAZQByACAAdABvACAAZABvAHcAbgBsAG8AYQBkACAAdQBwAGQAYQB0AGUAcwAgAGYAbwByACAATQBpAGMAcgBvAHMAbwBmAHQAIABXAG8AcgBkACAAYQBuAGQAIABFAHgAYwBlAGwALAAgAHMAZQBhAHIAYwBoAA0ACQAJAGQAaQByAGUAYwB0AGkAbwBuAHMAIAB0AG8AIABhAG4AZAAgAGYAcgBvAG0AIABkAGkAZgBmAGUAcgBlAG4AdAAgAGwAbwBjAGEAdABpAG8AbgBzACwAIABjAGEAbgAgAHMAZQBhAHIAYwBoACAAZgBvAHIAIABwAGgAeQBzAGkAYwBhAGwAIABhAGQAZAByAGUAcwBzAGUAcwAgAGYAbwByAA0ACQAJAGMAbwBtAHAAYQBuAGkAZQBzACAAbwByACAAaQBuAGQAaQB2AGkAZAB1AGEAbABzACwAIABhAG4AZAAgAGUAbQBhAGkAbAAuAA0ADQBFAGQAdQBjAGEAdABpAG8AbgANAA0ACQAJAEIAcgBhAGQAZgBvAHIAZAAgAEIAdQBzAGkAbgBlAHMAcwAsACAAUABpAHQAdABzAGIAdQByAGcAaAAsACAAUABBAAkACQAJAAkACQAJACgAOQAvADAAMAAtADEAMAAvADAAMQApAA0ACQAJAEEAUwBCACwAIABPAGYAZgBpAGMAZQAgAEEAZABtAGkAbgBpAHMAdAByAGEAdABpAG8AbgANAEMAbwB1AHIAcwBlACAAdwBvAHIAawAgAGkAbgBjAGwAdQBkAGUAZAA6ACAARQBzAHMAZQBuAHQAaQBhAGwAcwAgAG8AZgAgAE0AYQBuAGEAZwBlAG0AZQBuAHQALAAgAEQAYQB0AGEAIABBAG4AYQBsAHkAcwBpAHMALAAgAEMAbwBuAGMAZQBwAHQAcwAgAG8AZgAgAEQAZQBzAGsAdABvAHAAIABQAHUAYgBsAGkAcwBoAGkAbgBnACwAIABBAGQAdgBhAG4AYwBlAGQAIABFAGwAZQBjAHQAcgBvAG4AaQBjACAAUwBwAHIAZQBhAGQAcwBoAGUAZQB0AHMALgANAA0ACQAJAFAAZQBuAG4AIABUAHIAYQBmAGYAbwByAGQAIABIAGkAZwBoACAAUwBjAGgAbwBvAGwALAAgAEgAYQByAHIAaQBzAG8AbgAgAEMAaQB0AHkALAAgAFAAQQAJAAkACQAJAAkAKAAxADkAOQA2AC0AMgAwADAAMAApAA0ACQAJAEQAaQBwAGwAbwBtAGEALQAgAEcAZQBuAGUAcgBhAGwAIABTAHQAdQBkAGkAZQBzAA0ARwBlAG4AZQByAGEAbAAgAEMAbwB1AHIAcwBlAHMAIABvAGYAIABzAHQAdQBkAHkAIAB3AGUAcgBlACAATQBhAHQAaAAsACAARQBuAGcAbABpAHMAaAAgAGEAbgBkACAAUwBjAGkAZQBuAGMAZQAuAA0AVABvAG8AawAgAFMAcABlAGUAZAB3AHIAaQB0AGkAbgBnACwAIABTAHAAZQBlAGQAdwByAGkAdABpAG4AZwAgAEkASQAsACAAUABvAHQAdABlAHIAeQAgAGEAbgBkACAASgBlAHcAZQBsAHIAeQAgAGEAcwAgAGEAZABkAGUAZAAgAGMAbwB1AHIAcwBlAHMALgANAFAAZQByAGYAbwByAG0AZQBkACAAaQBuACAAdABoAGUAIABtAGEAcgBjAGgAaQBuAGcAIABiAGEAbgBkACAAYQBuAGQAIABjAG8AbgBjAGUAcgB0ACAAYgBhAG4AZAAgAGEAbABsACAAZgBvAHUAcgAgAHkAZQBhAHIAcwAuAA0AVwBhAHMAIABhACAAbQBlAG0AYgBlAHIAIABvAGYAIABDAG8AbQBtAHUAbgBpAHQAeQAgAEEAYwB0AGkAbwBuACAAUAByAG8AZwByAGEAbQAgACgAQwBBAFAAKQANAEgAZQBsAHAAZQBkACAAbwB1AHQAIABiAGEAYwBrAHMAdABhAGcAZQAgAHcAaQB0AGgAIAB0AGgAZQAgAHMAcAByAGkAbgBnACAAbQB1AHMAaQBjAGEAbAAgAHQAdwBvACAAeQBlAGEAcgBzACAAaQBuACAAYQAgAHIAbwB3AC4ADQANAA0ARQBtAHAAbABvAHkAbQBlAG4AdAAgAEgAaQBzAHQAbwByAHkADQANAAkASwBlAHkAcwB0AG8AbgBlACAAQwBvAGwAbABlAGMAdABpAG8AbgBzACwAIABJAHIAdwBpAG4ALAAgAFAAQQAJAAkACQAJAAkACQAJACgANgAvADEANAAtAFAAcgBlAHMAZQBuAHQAKQANAAkARABhAHQAYQAgAEUAbgB0AHIAeQANAE8AbgAgAGEAIABkAGEAaQBsAHkAIABiAGEAcwBpAHMAIABJACAAdgBlAHIAaQBmAHkAIABmAGkAbgBhAGwAIABsAG8AYwBhAGwAIAByAGUAdAB1AHIAbgBzACAAYQBuAGQAIAB2AGUAcgBpAGYAeQAgAHQAaABlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACAAdABoAGEAdAAgAGkAcwAgAGkAbgANAHQAaABlACAAcwB5AHMAdABlAG0ALgANAAkADQAJAEMAYQB0AGMAaAAtAFUAcAAgAEwAbwBnAGkAcwB0AGkAYwBzACwAIABHAHIAZQBlAG4AcwBiAHUAcgBnACwAIABQAEEACQAJAAkACQAJAAkAKAA0AC8AMQA0AC0ANQAvADEANAApAA0ACQBTAGgAaQBwAHAAaQBuAGcALwBSAGUAYwBlAGkAdgBpAG4AZwAgAEMAbABlAHIAawANAE8AbgAgAGEAIABkAGEAaQBsAHkAIABiAGEAcwBpAHMAIABJACAAcABlAHIAZgBvAHIAbQAgAHQAaABlACAASQBuACAAJgAgAE8AdQB0ACAAYwBvAHUAbgB0ACAAZgBvAHIAIAB0AGgAZQAgAHAAcgBlAHYAaQBvAHUAcwAgAGQAYQB5AC4ADQBPAG4AIABhACAAZABhAGkAbAB5ACAAYgBhAHMAaQBzACAASQAgAHAAcgBvAGMAZQBzAHMAIABCAGkAbABsAHMAIABvAGYAIABMAGEAZABpAG4AZwAgAGYAbwByACAAUwBoAGkAcABtAGUAbgB0AHMAIAB1AHMAaQBuAGcAIAAzAFAATAAuAA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABwAHIAbwBjAGUAcwBzACAAcgBlAGMAZQBpAHAAdABzACAAZgBvAHIAIABpAHQAZQBtAHMAIABkAGUAbABpAHYAZQByAGUAZAAgAHUAcwBpAG4AZwAgADMAUABMAC4ADQBPAG4AIABhACAAZABhAGkAbAB5ACAAYgBhAHMAaQBzACAASQAgAGMAYQBsAGwAIABjAGEAcgByAGkAZQByAHMAIAB0AG8AIABhAHIAcgBhAG4AZwBlACAAcABpAGMAawAgAHUAcABzACAAZgBvAHIAIABzAGgAaQBwAG0AZQBuAHQAcwAuAA0ADQANAAkATABvAGQAbwB2AGkAYwBvACAAJgAgAEEAcwBzAG8AYwBpAGEAdABlAHMALAAgAEYAbwByAGUAcwB0ACAASABpAGwAbABzACwAIABQAEEACQAJAAkACQAJAAkAKAAxAC8AMQAzAC0AMgAvADEANAApAA0ACQBQAHIAbwBjAGUAcwBzAG8AcgANAEQAdQByAGkAbgBnACAAdABhAHgAIABzAGUAYQBzAG8AbgAgAEkAIABwAHIAbwBjAGUAcwBzACAAYwBsAGkAZQBuAHQAcwAgAHQAYQB4ACAAcgBlAHQAdQByAG4AcwAgAGIAeQAgAG0AYQBrAGkAbgBnACAAYwBvAHAAaQBlAHMAIABvAGYAIAB0AGgAZQAgAGMAbABpAGUAbgB0AHMAIAB0AGEAeAAgAHIAZQB0AHUAcgBuACAAZgBvAHIAIAB0AGgAZQAgAGMAbABpAGUAbgB0ACAAdABvACAAawBlAGUAcAAgAGYAbwByACAAdABoAGUAaQByACAAcgBlAGMAbwByAGQAcwAuAA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABwAGUAcgBmAG8AcgBtACAAZwBlAG4AZQByAGEAbAAgAG8AZgBmAGkAYwBlACAAZAB1AHQAaQBlAHMALgANAA0ADQAJAA0ACQBBAG0AZQByAGkAcwBvAHUAcgBjAGUAYgBlAHIAZwBlAG4ALQAgAFQAaABlAHIAYQBjAG8AbQAsACAATQBvAG4AcgBvAGUAdgBpAGwAbABlACwAIABQAEEACQAJAAkACQAoADEAMgAvADEAMQAtADEAMAAvADEAMgApAA0ACQBTAGUAbgBpAG8AcgAgAEQAYQB0AGEAIABFAG4AdAByAHkALQBYAGEAcgBlAGwAdABvAA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABwAGUAcgBmAG8AcgBtACAAZABhAHQAYQAgAGUAbgB0AHIAeQAgAGYAbwByACAAYgBlAG4AZQBmAGkAdAAgAGkAbgB2AGUAcwB0AGkAZwBhAHQAaQBvAG4AcwAgAGYAbwByACAAdABoAGUAIABkAHIAdQBnACAAYwBhAGwAbABlAGQAIABYAGEAcgBlAGwAdABvAC4ADQBFAG4AdABlAHIAIABCAHUAcwBpAG4AZQBzAHMAIABBAHMAcwBvAGMAaQBhAHQAZQBzACAAQQBnAHIAZQBlAG0AZQBuAHQAcwAgAGYAbwByACAAcABoAHkAcwBpAGMAaQBhAG4AcwAgAG8AZgBmAGkAYwBlAHMAIABmAG8AcgAgAHQAaABlACAAZAByAHUAZwAgAGMAYQBsAGwAZQBkACAAWABhAHIAZQBsAHQAbwAuAA0AUwBlAGEAcgBjAGgAIABwAGgAeQBzAGkAYwBpAGEAbgBzACAATgBQAEkAIABuAHUAbQBiAGUAcgBzACAAdQBzAGkAbgBnACAASQBuAHQAZQByAG4AZQB0ACAARQB4AHAAbABvAHIAZQByAC4ADQBMAGkAbgBrACAAaQBtAGEAZwBlAHMAIAB0AG8AIABjAGEAcwBlAHMAIAB1AHMAaQBuAGcAIABLAG8AZgBhAHgALgANAEYAYQB4ACAAaQBuACAAVgBlAHIAYgBhAGwAIABCAGUAbgBlAGYAaQB0ACAASQBuAHYAZQBzAHQAaQBnAGEAdABpAG8AbgAgAGYAbwByAG0AcwAgAHQAbwAgAEsAbwBmAGEAeAAgAHQAbwAgAGwAaQBuAGsAIAB0AG8AIABjAGEAcwBlAHMALgANAA0ADQAJAFQAaABlACAATgBlAHcAIABNAG8AbgByAG8AZQB2AGkAbABsAGUAIABEAG8AZABnAGUAIABDAG8AbABsAGkAcwBpAG8AbgAgAEMAZQBuAHQAZQByACwAIABNAG8AbgByAG8AZQB2AGkAbABsAGUALAAgAFAAQQAJAAkAKAAxAC8AMQAxAC0AMQAyAC8AMQAxACkAIAAJAFIAZQBjAGUAcAB0AGkAbwBuAGkAcwB0AA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABhAG4AcwB3AGUAcgAgAHAAaABvAG4AZQBzAC4ADQBPAG4AIABhACAAZABhAGkAbAB5ACAAYgBhAHMAaQBzACAASQAgAGMAYQBsAGwAIABjAHUAcwB0AG8AbQBlAHIAcwAgACAAdwBpAHQAaAAgAGkAbgBzAHUAcgBhAG4AYwBlACAAYQBzAHMAaQBnAG4AbQBlAG4AdABzACAASQAgAHIAZQBjAGUAaQB2AGUAZAAgAHYAaQBhACAAQwBDAEMAIABPAG4AZQAgAHQAbwAgAHMAYwBoAGUAZAB1AGwAZQAgAGYAbwByACAAZQBzAHQAaQBtAGEAdABlAHMALgANAEkAIABlAG4AdABlAHIAIABiAG8AZAB5ACAAcwBoAG8AcAAgAHQAZQBjAGgAbgBpAGMAaQBhAG4AJwBzACAAdABpAG0AZQAgAGMAYQByAGQAcwAgAHUAcwBpAG4AZwAgAEEARABQAC4ADQBJACAAbwByAGQAZQByACAAJgAgAGMAaABlAGMAawAgAGkAbgAgAHAAYQByAHQAcwAuAA0ASQAgAHcAcgBpAHQAZQAgAHIAZQBwAGEAaQByACAAbwByAGQAZQByAHMAIAB1AHMAaQBuAGcAIABBAEQAUAAuAA0ASQAgAGMAbABvAHMAZQAgAHIAZQBwAGEAaQByACAAbwByAGQAZQByAHMAIAB1AHMAaQBuAGcAIABBAEQAUAAuAA0ATwBuACAAbwBjAGMAYQBzAGkAbwBuACAASQAgAGgAYQB2AGUAIABmAGkAbABsAGUAZAAgAGkAbgAgAGYAbwByACAAdABoAGUAIABjAGEAcwBoAGkAZQByACAAYQB0ACAASwBpAGEALwBNAGEAegBkAGEALgANAA0ACQANAAkARABhAHkAIABGAG8AcgBkACwAIABNAG8AbgByAG8AZQB2AGkAbABsAGUALAAgAFAAQQAJAAkACQAJAAkACQAJACgAMQAxAC8AMAA1AC0ANgAvADEAMAApAA0ACQBSAGUAYwBlAHAAdABpAG8AbgBpAHMAdAAvAEMAYQBzAGgAaQBlAHIALwBDAHUAcwB0AG8AbQBlAHIAIABTAGUAcgB2AGkAYwBlAA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABhAG4AcwB3AGUAcgBlAGQAIABwAGgAbwBuAGUAcwAsACAAdABhAGsAZQAgAGMAYQByAGUAIABvAGYAIABzAGUAcgB2AGkAYwBlACAAYwB1AHMAdABvAG0AZQByAHMALAAgAGIAYQBsAGEAbgBjAGUAIABiAG8AdABoACAAYwBhAHMAaAAgAGQAcgBhAHcAZQByAHMALAAgAGEAbgBkACAAZABvACAAYQAgAGQAZQBwAG8AcwBpAHQALgANAEkAIABzAHQAbwBjAGsAZQBkACAAaQBuACAAbgBlAHcAIABhAG4AZAAgAHUAcwBlAGQAIAB2AGUAaABpAGMAbABlAHMAIAB1AHMAaQBuAGcAIABBAEQAUAAuAA0ASQAgAHcAYQBzACAAcwBvAGwAZQBsAHkAIAByAGUAcwBwAG8AbgBzAGkAYgBsAGUAIABmAG8AcgAgAGUAbgB0AGUAcgBpAG4AZwAgAGkAbgB2AG8AaQBjAGUAcwAgAGYAbwByACAAYQBjAGMAbwB1AG4AdABzACAAcABhAHkAYQBiAGwAZQAgAGEAbgBkACAAcAByAGkAbgB0AGkAbgBnACAAYwBoAGUAYwBrAHMAIABmAG8AcgAgAGEAYwBjAG8AdQBuAHQAcwAgAHAAYQB5AGEAYgBsAGUAIAB1AHMAaQBuAGcAIABBAEQAUAAuAA0ASQAgAGUAbgB0AGUAcgBlAGQAIABzAHQAbwBjAGsAIABuAHUAbQBiAGUAcgBzACAAZgBvAHIAIABuAGUAdwAgAHYAZQBoAGkAYwBsAGUAcwAgAG8AbgBsAGkAbgBlACAAdQBzAGkAbgBnACAASQBuAHQAZQByAG4AZQB0ACAARQB4AHAAbABvAHIAZQByACAAbwBuACAARABlAGEAbABlAHIAIABBAGMAYwBlAHMAcwAgAFMAeQBzAHQAZQBtACAAZgBvAHIAIABQAE4AQwAuAA0ASQAgAFMAdQBiAG0AaQB0AHQAZQBkACAAdwBhAHIAcgBhAG4AdAB5ACAAYwBsAGEAaQBtAHMAIABmAG8AcgAgAEoATQAmAEEAIABvAG4AbABpAG4AZQAgAHUAcwBpAG4AZwAgAEkAbgB0AGUAcgBuAGUAdAAgAEUAeABwAGwAbwByAGUAcgAuAA0ASQAgAFMAdQBiAG0AaQB0AHQAZQBkACAAdAByAGEAbgBzAGYAZQByACAAcABhAHAAZQByAHcAbwByAGsAIABmAG8AcgAgAGQAZQBhAGwAZQByACAAdAByAGEAZABlAHMAIAB1AHMAaQBuAGcAIABDAG8AbgBjAGUAcABzACAAbwBuACAARgBNAEMAIABEAGUAYQBsAGUAcgAuAA0ADQANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAABwIAAA6CAAAWggAAHgIAAB6CAAAfAgAAJwIAACeCAAAAgkAAAQJAACyCQAAWgoAAKgKAACqCgAAvgoAAMAKAAAsCwAAMAsAAGYLAABoDAAAagwAAOgMAADsDAAAHg0AAJANAAAkDgAApA4AAAIPAACEDwAAhg8AAIgPAACuDwAAsA8AABwQAAAeEAAANBAAANwQAAD0EAAA+BAAAPoQAABiEQAAZBEAAJYRAAAeEgAAphIAACwTAAC0EwAAthMAALgTAAAsFAAAQhQAAEwVAACwFQAAshUAALQVAAC4FQAANhYAADgWAABsFgAAKBcAANoXAABIGAAAjBgAABYZAAD06+vr39/Q39/f39/f39DBwcHQwcHBwdDBwcHBwbKy0N/f39DBp9DQ39/QwcHBwaMA39Df39/f39/f0N/f39/fAAAGNQgAXAgAABQ2CAE1CABdCAFcCABPSgMAUUoDAAAcQ0ocADYIATUIAGFKHABdCAFcCABPSgMAUUoDAAAcQ0oYADYIATUIAGFKGABdCAFcCABPSgMAUUoDAAAcQ0oYADYIATUIAWFKGABdCAFcCAFPSgMAUUoDAAAWQ0oYADYIAWFKGABdCAFPSgMAUUoDAAAQQ0ocAGFKHABPSgMAUUoDAAAWQ0owADUIAWFKMABcCAFPSgMAUUoDAEAWGQAAGBkAABoZAACyGQAAzBkAABAaAADwGgAAWhsAAI4bAADQGwAAEhwAAIgcAACKHAAAjhwAAJAcAADqHAAAOB0AABoeAAB2HgAAZh8AADggAADCIAAAXiEAAGAhAABiIQAA9/fr3M3Nzc3Nzc3Nzc3c3Nzc3Nzc3M3NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxDShgANggBNQgAYUoYAF0IAVwIAE9KAwBRSgMAABxDShgANggBNQgBYUoYAF0IAVwIAU9KAwBRSgMAABZDShgANggBYUoYAF0IAU9KAwBRSgMAABBDShgAYUoYAE9KAwBRSgMAGAAIAAAcCAAAOggAAFoIAAB4CAAAeggAAHwIAACcCAAAnggAAAIJAAAECQAAsgkAAFoKAACoCgAAqgoAAL4KAADACgAALAsAAGYLAAD6AAAAAAAAAAAAAAAA9QAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAADrAAAAAAAAAAAAAAAA5gAAAAAAAAAAAAAAAOEAAAAAAAAAAAAAAADcAAAAAAAAAAAAAAAA1wAAAAAAAAAAAAAAANIAAAAAAAAAAAAAAADNAAAAAAAAAAAAAAAAyAAAAAAAAAAAAAAAAMMAAAAAAAAAAAAAAAC+AAAAAAAAAAAAAAAAuQAAAAAAAAAAAAAAALQAAAAAAAAAAAAAAACvAAAAAAAAAAAAAAAAqgAAAAAAAAAAAAAAAKUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAEAAADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAEAAADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAEAAADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAEAAADJABhJAAABAAAAyQBYSQBAAQAAAMkAWEkAQAEAAADJAFhJAEABAAAAyQBYSQBAAQAAAMkAWEkAQASZgsAAGgMAABqDAAA6AwAAB4NAACQDQAAJA4AAKQOAAACDwAAhA8AAIYPAACIDwAArg8AALAPAAAcEAAANBAAANwQAAD0EAAA+BAAAGIRAAD3AAAAAAAAAAAAAAAA8gAAAAAAAAAAAAAAAO0AAAAAAAAAAAAAAADoAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAADbAAAAAAAAAAAAAAAA1gAAAAAAAAAAAAAAANEAAAAAAAAAAAAAAADMAAAAAAAAAAAAAAAAxwAAAAAAAAAAAAAAAMIAAAAAAAAAAAAAAAC9AAAAAAAAAAAAAAAAuAAAAAAAAAAAAAAAALMAAAAAAAAAAAAAAACuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAMkAGEkAAAEAAADJABhJAAFAAAKJgALRgAABQAACiYAC0YBAAAEAAADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAEAAADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAgAAAomAAtGAwADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAEAAADJABhJAAIAAAKJgALRgIAAyQAYSQAABNiEQAAlhEAAB4SAACmEgAALBMAALQTAAC2EwAAuBMAACwUAABCFAAATBUAALAVAACyFQAAtBUAALgVAAA2FgAAbBYAACgXAADaFwAASBgAAIwYAAAWGQAA+gAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA9QAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAA6wAAAAAAAAAAAAAAAOYAAAAAAAAAAAAAAADhAAAAAAAAAAAAAAAA2QAAAAAAAAAAAAAAANkAAAAAAAAAAAAAAADUAAAAAAAAAAAAAAAAzwAAAAAAAAAAAAAAAMoAAAAAAAAAAAAAAADFAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAALgAAAAAAAAAAAAAAAC4AAAAAAAAAAAAAAAAuAAAAAAAAAAAAAAAALgAAAAAAAAAAAAAAAC4AAAAAAAAAAAAAAAAAAAAAAAAAAgAAAomAAtGBQADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAEAAADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAgAAAomAAtGBgADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAEAAADJABhJAAABAAAAyQAYSQABQAACiYAC0YBAAAEAAADJABhJAAAFRYZAAAYGQAAGhkAAMwZAAAQGgAA8BoAAFobAACOGwAA0BsAABIcAACIHAAAihwAAI4cAADqHAAAOB0AABoeAAB2HgAAZh8AADggAADCIAAAXiEAAGAhAABiIQAA+gAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAA6AAAAAAAAAAAAAAAAOgAAAAAAAAAAAAAAADoAAAAAAAAAAAAAAAA6AAAAAAAAAAAAAAAAOgAAAAAAAAAAAAAAADoAAAAAAAAAAAAAAAA6AAAAAAAAAAAAAAAAOMAAAAAAAAAAAAAAADeAAAAAAAAAAAAAAAA2QAAAAAAAAAAAAAAANQAAAAAAAAAAAAAAADMAAAAAAAAAAAAAAAAzAAAAAAAAAAAAAAAAMwAAAAAAAAAAAAAAADMAAAAAAAAAAAAAAAAzAAAAAAAAAAAAAAAAMwAAAAAAAAAAAAAAADHAAAAAAAAAAAAAAAAwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAyQAYSQAAAQAAAMkAGEkAAgAAAomAAtGAQADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAEAAADJABhJAAABAAAAyQAYSQACAAACiYAC0YEAAMkAGEkAAAEAAADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAWMAAfsNAvILDgPSGwwgIisMICI5CwASSQAAAyUAAAMZBoATBwAAAAADNQAAAoMgAOMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAGAAAAAEAAAABAAAAEAAAAAIAAADp/QAAGAAAAAEAAAABAAAAEAAAAAIAAADp/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUA//////////8BAAAABgkCAAAAAADAAAAAAAAARgAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAEACAAAAAAAAAQBDAG8AbQBwAE8AYgBqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAgACAAAABAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAagAAAAAAAAABAE8AbABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgACAP////8DAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAUAAAAAAAAADEAVABhAGIAbABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABUhAAAAAAAABQBTAHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEAdABpAG8AbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAgAFAAAABgAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAA7AAAAAAAAABXAG8AcgBkAEQAbwBjAHUAbQBlAG4AdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgACAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAAAAyLgAAAAAAAAUARABvAGMAdQBtAGUAbgB0AFMAdQBtAG0AYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBuAAAAAAAAAAAAAAA4AAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAAAAAAAA=;type:2 \ No newline at end of file diff --git a/src/parser/__tests__/json/base64.json b/src/parser/__tests__/json/base64.json new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/json/base64.json @@ -0,0 +1 @@ +{"action":"candidate.create","actionId":"80653a26cc46357ff79ff83b47e27c3cb7a668bd","params":{"attachments":["fileName:Resume.doc;base64stream:0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAOwADAP7/CQAGAAAAAAAAAAAAAAABAAAALgAAAAAAAAAAEAAAAgAAAAEAAAD+////AAAAAAAAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9//////////7///8tAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAAP7///8WAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAAIAAAACEAAAAiAAAAIwAAACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAALAAAAP7////+////LwAAAP7//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1IAbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAAAAAAAAAQAAAP7////+////BAAAAAUAAAAGAAAA/v///wgAAAD+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8BAP7/AwoAAP////8GCQIAAAAAAMAAAAAAAABGGAAAAE1pY3Jvc29mdCBXb3JkLURva3VtZW50AAoAAABNU1dvcmREb2MAEAAAAFdvcmQuRG9jdW1lbnQuOAD0ObJxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/wAAAQACAAAAAAAAAAAAAAAAAAAAAAABAAAA4IWf8vlPaBCrkQgAKyez2TAAAAC8AAAACAAAAAEAAABIAAAABAAAAFAAAAAIAAAAaAAAAAkAAACAAAAACgAAAIwAAAALAAAAmAAAAAwAAACkAAAADQAAALAAAAACAAAA6f0AAB4AAAAOAAAAQXByaWwgVmlzbmljawAAAB4AAAAOAAAAQXByaWwgVmlzbmljawAAAB4AAAACAAAAMQAAAEAAAAAAgRssAAAAAEAAAAAAAAAAAAAAAEAAAAAA1pEh62jLAUAAAAAAhXEJ8mjLAQAAAAAAAAAAAAAAAAAAAAAAAAAA/v8AAAEAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAALVzdWcLhsQk5cIACss+a5EAAAABdXN1ZwuGxCTlwgAKyz5rhIANQAKAAEAWwAPAAIAAAAAAAAAbgAAEPH/AgBuAAAABwBEAGUAZgBhAHUAbAB0AAAAGgAAAAMkAGEkADEkACokATckATUkATMkAUEkADMAQioAT0oAAFFKAABDShgAbUgJBHNICQRLSAEAUEoEAG5I/wBeSgUAYUoYAF9I/wB0SP8AAAAAAAAAAAAAAAAAAAAAAAAAAEIAQUDy/6EAQgAAABkAQQBiAHMAYQB0AHoALQBTAHQAYQBuAGQAYQByAGQAcwBjAGgAcgBpAGYAdABhAHIAdAAAAAAAAAAAAAAAAAAuAP4f8v/xAC4AAAAJAFcAVwA4AE4AdQBtADEAegAwAAAADABPSgYAUUoGAF5KBwAuAP4f8v8BAS4AAAAJAFcAVwA4AE4AdQBtADEAegAxAAAADABPSggAUUoIAF5KBwAuAP4f8v8RAS4AAAAJAFcAVwA4AE4AdQBtADIAegAwAAAADABPSgYAUUoGAF5KBwAuAP4f8v8hAS4AAAAJAFcAVwA4AE4AdQBtADIAegAxAAAADABPSggAUUoIAF5KBwAuAP4f8v8xAS4AAAAJAFcAVwA4AE4AdQBtADMAegAwAAAADABPSgYAUUoGAF5KBwAuAP4f8v9BAS4AAAAJAFcAVwA4AE4AdQBtADMAegAxAAAADABPSggAUUoIAF5KBwAuAP4f8v9RAS4AAAAJAFcAVwA4AE4AdQBtADQAegAwAAAADABPSgYAUUoGAF5KBwAuAP4f8v9hAS4AAAAJAFcAVwA4AE4AdQBtADQAegAxAAAADABPSggAUUoIAF5KBwAuAP4f8v9xAS4AAAAJAFcAVwA4AE4AdQBtADUAegAwAAAADABPSgYAUUoGAF5KBwAuAP4f8v+BAS4AAAAJAFcAVwA4AE4AdQBtADUAegAxAAAADABPSggAUUoIAF5KBwAuAP4f8v+RAS4AAAAJAFcAVwA4AE4AdQBtADYAegAwAAAADABPSgYAUUoGAF5KBwA2AP4f8v+hATYAAAAJAFcAVwA4AE4AdQBtADcAegAwAAAAFABPSgYAUUoGAENKHABeSgcAYUocADYA/h/y/7EBNgAAAAkAVwBXADgATgB1AG0ANwB6ADEAAAAUAE9KCQBRSgkAQ0ocAF5KBwBhShwAQgD+H/L/wQFCAAAAGQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0AAAAAABIAP4f8v/RAUgAAAAcAFcAVwAtAEEAYgBzAGEAdAB6AC0AUwB0AGEAbgBkAGEAcgBkAHMAYwBoAHIAaQBmAHQAYQByAHQAAAAAAC4A/h/y/+EBLgAAAAkAVwBXADgATgB1AG0ANgB6ADEAAAAMAE9KCABRSggAXkoHADYA/h/y//EBNgAAAAkAVwBXADgATgB1AG0AOAB6ADAAAAAUAE9KBgBRSgYAQ0ocAF5KBwBhShwANgD+H/L/AQI2AAAACQBXAFcAOABOAHUAbQA4AHoAMQAAABQAT0oIAFFKCABDShwAXkoHAGFKHABKAP4f8v8RAkoAAAAdAFcAVwAtAEEAYgBzAGEAdAB6AC0AUwB0AGEAbgBkAGEAcgBkAHMAYwBoAHIAaQBmAHQAYQByAHQAMQAAAAAATAD+H/L/IQJMAAAAHgBXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAAAAAATgD+H/L/MQJOAAAAHwBXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAxAAAAAABQAP4f8v9BAlAAAAAgAFcAVwAtAEEAYgBzAGEAdAB6AC0AUwB0AGEAbgBkAGEAcgBkAHMAYwBoAHIAaQBmAHQAYQByAHQAMQAxADEAMQAAAAAAUgD+H/L/UQJSAAAAIQBXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAxADEAMQAAAAAAVAD+H/L/YQJUAAAAIgBXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAxADEAMQAxAAAAAABWAP4f8v9xAlYAAAAjAFcAVwAtAEEAYgBzAGEAdAB6AC0AUwB0AGEAbgBkAGEAcgBkAHMAYwBoAHIAaQBmAHQAYQByAHQAMQAxADEAMQAxADEAMQAAAAAAWAD+H/L/gQJYAAAAJABXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAxADEAMQAxADEAMQAAAAAAWgD+H/L/kQJaAAAAJQBXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAxADEAMQAxADEAMQAxAAAAAABcAP4f8v+hAlwAAAAmAFcAVwAtAEEAYgBzAGEAdAB6AC0AUwB0AGEAbgBkAGEAcgBkAHMAYwBoAHIAaQBmAHQAYQByAHQAMQAxADEAMQAxADEAMQAxADEAMQAAAAAAXgD+H/L/sQJeAAAAJwBXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAxADEAMQAxADEAMQAxADEAMQAAAAAAYAD+H/L/wQJgAAAAKABXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAxADEAMQAxADEAMQAxADEAMQAxAAAAAABiAP4f8v/RAmIAAAApAFcAVwAtAEEAYgBzAGEAdAB6AC0AUwB0AGEAbgBkAGEAcgBkAHMAYwBoAHIAaQBmAHQAYQByAHQAMQAxADEAMQAxADEAMQAxADEAMQAxADEAMQAAAAAAZAD+H/L/4QJkAAAAKgBXAFcALQBBAGIAcwBhAHQAegAtAFMAdABhAG4AZABhAHIAZABzAGMAaAByAGkAZgB0AGEAcgB0ADEAMQAxADEAMQAxADEAMQAxADEAMQAxADEAMQAAAAAANgD+H/L/8QI2AAAABwBCAHUAbABsAGUAdABzAAAAGABPSgcAUUoHAENKHABQSgcAXkoHAGFKHABGAP4fAQASA0YAAAAHAEgAZQBhAGQAaQBuAGcAAAANADAAE6TwABSkeAAGJAEAGABPSgIAUUoCAENKHABQSgoAXkoFAGFKHAAuAEIQAQASAy4AAAAJAFQAZQB4AHQAIABiAG8AZAB5AAAACgAxABOkAAAUpHgAAAAgAC8QEQMiAyAAAAAEAEwAaQBzAHQAAAACADIABABeSgsAQAD+HwEAMgNAAAAABwBDAGEAcAB0AGkAbwBuAAAADQAzABOkeAAUpHgADCQBABIAQ0oYADYIAV5KCwBhShgAXQgBJgD+HwEAQgMmAAAABQBJAG4AZABlAHgAAAAFADQADCQBAAQAXkoLAAAAAACxDAAABAAALgAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAWGQAAYiEAABEAAAASAAAAAAgAAGYLAABiEQAAFhkAAGIhAAATAAAAFAAAABUAAAAWAAAABwABAAAAAQAAAP8P/w//D/8P/w//D/8P/w//DwAAAgAAAAIAAAD/D/8P/w//D/8P/w//D/8P/w8AAAMAAAADAAAA/w//D/8P/w//D/8P/w//D/8PAAAEAAAABAAAAP8P/w//D/8P/w//D/8P/w//DwAABQAAAAUAAAD/D/8P/w//D/8P/w//D/8P/w8AAAYAAAAGAAAA/w//D/8P/w//D/8P/w//D/8PAAAHAAAABwAAAP8P/w//D/8P/w//D/8P/w//DwAAAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EcAhghJj+FcYFAAFwCAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E2AlghJj+FcYFAAHYCQZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EQAtghJj+FcYFAAFACwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EqAxghJj+FcYFAAGoDAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EEA5ghJj+FcYFAAEQDgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EeA9ghJj+FcYFAAF4DwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E4BBghJj+FcYFAAHgEAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6ESBJghJj+FcYFAAFIEgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EsBNghJj+FcYFAAGwEwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EcAhghJj+FcYFAAFwCAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E2AlghJj+FcYFAAHYCQZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EQAtghJj+FcYFAAFACwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EqAxghJj+FcYFAAGoDAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EEA5ghJj+FcYFAAEQDgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EeA9ghJj+FcYFAAF4DwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E4BBghJj+FcYFAAHgEAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6ESBJghJj+FcYFAAFIEgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EsBNghJj+FcYFAAGwEwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EcAhghJj+FcYFAAFwCAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E2AlghJj+FcYFAAHYCQZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EQAtghJj+FcYFAAFACwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EqAxghJj+FcYFAAGoDAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EEA5ghJj+FcYFAAEQDgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EeA9ghJj+FcYFAAF4DwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E4BBghJj+FcYFAAHgEAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6ESBJghJj+FcYFAAFIEgZPSggAUUoIAF5KBwABAOYlAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EsBNghJj+FcYFAAGwEwZPSggAUUoIAF5KBwABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EcAhghJj+FcYFAAFwCAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E2AlghJj+FcYFAAHYCQZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EQAtghJj+FcYFAAFACwZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EqAxghJj+FcYFAAGoDAZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EEA5ghJj+FcYFAAEQDgZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EeA9ghJj+FcYFAAF4DwZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E4BBghJj+FcYFAAHgEAZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6ESBJghJj+FcYFAAFIEgZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EsBNghJj+FcYFAAGwEwZPSgkAUUoJAF5KBwABAGzwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EcAhghJj+FcYFAAFwCAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E2AlghJj+FcYFAAHYCQZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EQAtghJj+FcYFAAFACwZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EqAxghJj+FcYFAAGoDAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EEA5ghJj+FcYFAAEQDgZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EeA9ghJj+FcYFAAF4DwZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6E4BBghJj+FcYFAAHgEAZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6ESBJghJj+FcYFAAFIEgZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAADBAAAF6EsBNghJj+FcYFAAGwEwZPSgYAUUoGAF5KBwABALfwAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAAFBAAAF6EcAhghJj+FcYFAAFwCAZPSgYAUUoGAENKHABeSgcAYUocAAEAt/ABAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAUEAAAXoTYCWCEmP4VxgUAAdgJBk9KCABRSggAQ0ocAF5KBwBhShwAAQDmJQEAAAAXAAAAAAAAAAAAAAAAAAAAAAAAABQQAABehEALYISY/hXGBQABQAsGT0oIAFFKCABDShwAXkoHAGFKHAABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAAFBAAAF6EqAxghJj+FcYFAAGoDAZPSgYAUUoGAENKHABeSgcAYUocAAEAt/ABAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAUEAAAXoQQDmCEmP4VxgUAARAOBk9KCABRSggAQ0ocAF5KBwBhShwAAQDmJQEAAAAXAAAAAAAAAAAAAAAAAAAAAAAAABQQAABehHgPYISY/hXGBQABeA8GT0oIAFFKCABDShwAXkoHAGFKHAABAKolAQAAABcAAAAAAAAAAAAAAAAAAAAAAAAAFBAAAF6E4BBghJj+FcYFAAHgEAZPSgYAUUoGAENKHABeSgcAYUocAAEAt/ABAAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAUEAAAXoRIEmCEmP4VxgUAAUgSBk9KCABRSggAQ0ocAF5KBwBhShwAAQDmJQEAAAAXAAAAAAAAAAAAAAAAAAAAAAAAABQQAABehLATYISY/hXGBQABsBMGT0oIAFFKCABDShwAXkoHAGFKHAABAKolAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAABAAAF6EsAFghFD+FcYFAAGwAQYAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAQAABehEACYITA/RXGBQABQAIGAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAXoTQAmCEMP0VxgUAAdACBgAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAABAAAF6EYANghKD8FcYFAAFgAwYAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAQAABehPADYIQQ/BXGBQAB8AMGAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAXoSABGCEgPsVxgUAAYAEBgAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAABAAAF6EEAVghPD6FcYFAAEQBQYAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAQAABehKAFYIRg+hXGBQABoAUGAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAXoQwBmCE0PkVxgUAATAGBgAABwAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAD///////////////////////////////////////8HAAAABwBXAFcAOABOAHUAbQAxAAcAVwBXADgATgB1AG0AMwAHAFcAVwA4AE4AdQBtADQABwBXAFcAOABOAHUAbQA1AAcAVwBXADgATgB1AG0ANgAHAFcAVwA4AE4AdQBtADcAAAAAAAAAsQwAAAAAAAACEAAAAAAAAACxDAAAUAAACAAAAAAMAAAARxaQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAaQBtAGUAcwAgAE4AZQB3ACAAUgBvAG0AYQBuAAAANRaQAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFMAeQBtAGIAbwBsAAAAMyaQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEAcgBpAGEAbAAAAEEmkAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAHIAZQBiAHUAYwBoAGUAdAAgAE0AUwAAAEkmkAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBAHIAaQBhAGwAIABVAG4AaQBjAG8AZABlACAATQBTAAAANQaQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAYQBoAG8AbQBhAAAANQSQAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFMAeQBtAGIAbwBsAAAAXwSQAQALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8AcABlAG4AUwB5AG0AYgBvAGwAAABBAHIAaQBhAGwAIABVAG4AaQBjAG8AZABlACAATQBTAAAAXwSQAYALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE8AcABlAG4AUwB5AG0AYgBvAGwAAABBAHIAaQBhAGwAIABVAG4AaQBjAG8AZABlACAATQBTAAAAOwSQAQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAaQBuAGcAZABpAG4AZwBzAAAAOwaQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE0AUwAgAE0AaQBuAGMAaABvAAAANQSQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAYQBoAG8AbQBhAAAAQgAEAAEIjRgAAMUCAABoAQAAAACWVeoGy1XqBgAAAAABAAAAAAAMAgAAgQwAAAIAPQAAAAQAg5A9AAAADAIAAIEMAAACAD0AAAA9AAAAAAAAACcDACAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAgAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADspQEBTSAJBAAAABK/AAAAAAAAMAAAAAAACAAAYiEAAA4AQ2FvbGFuODAAAAAAAAAAAAAAAAAAAAAAAAAJBBYAMi4AAAAAAAAAAAAAsQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AEQAAAAIAAAD//w8AEwAAAAQAAAD//w8AAAAAAAAAAAAAAAAAAAAAAIgAAAAAAKoKAAAAAAAAqgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqgoAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL4KAAA0AAAA8goAABQAAAAGCwAAJAAAAAAAAAAAAAAAlxsAABwDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdhsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACzHgAAYgIAAAAAAAAAAAAAghsAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqCwAAxgAAAH4aAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOGwAAaAAAAAAAAAAAAAAAdhsAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgDZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEAcAByAGkAbAAgAFYAaQBzAG4AaQBjAGsADQAxADQAMAAgAEwAbwBuAGcAIABEAHIAaQB2AGUADQBJAHIAdwBpAG4ALAAgAFAAQQAgADEANQA2ADQAMgANACgANwAyADQAKQAgADYAMQAwAC0AMQA0ADgAMAANAA0ADQBDAG8AbQBwAHUAdABlAHIAIABTAGsAaQBsAGwAcwANAA0ACQAJAEkAIABhAG0AIABlAHgAcABlAHIAaQBlAG4AYwBlAGQAIAB3AGkAdABoACAATQBpAGMAcgBvAHMAbwBmAHQAIABXAG8AcgBkACAAYQBuAGQAIABFAHgAYwBlAGwALgANAA0ACQAJAEkAIABjAGEAbgAgAHUAcwBlACAASQBuAHQAZQByAG4AZQB0ACAARQB4AHAAbABvAHIAZQByACAAdABvACAAZABvAHcAbgBsAG8AYQBkACAAdQBwAGQAYQB0AGUAcwAgAGYAbwByACAATQBpAGMAcgBvAHMAbwBmAHQAIABXAG8AcgBkACAAYQBuAGQAIABFAHgAYwBlAGwALAAgAHMAZQBhAHIAYwBoAA0ACQAJAGQAaQByAGUAYwB0AGkAbwBuAHMAIAB0AG8AIABhAG4AZAAgAGYAcgBvAG0AIABkAGkAZgBmAGUAcgBlAG4AdAAgAGwAbwBjAGEAdABpAG8AbgBzACwAIABjAGEAbgAgAHMAZQBhAHIAYwBoACAAZgBvAHIAIABwAGgAeQBzAGkAYwBhAGwAIABhAGQAZAByAGUAcwBzAGUAcwAgAGYAbwByAA0ACQAJAGMAbwBtAHAAYQBuAGkAZQBzACAAbwByACAAaQBuAGQAaQB2AGkAZAB1AGEAbABzACwAIABhAG4AZAAgAGUAbQBhAGkAbAAuAA0ADQBFAGQAdQBjAGEAdABpAG8AbgANAA0ACQAJAEIAcgBhAGQAZgBvAHIAZAAgAEIAdQBzAGkAbgBlAHMAcwAsACAAUABpAHQAdABzAGIAdQByAGcAaAAsACAAUABBAAkACQAJAAkACQAJACgAOQAvADAAMAAtADEAMAAvADAAMQApAA0ACQAJAEEAUwBCACwAIABPAGYAZgBpAGMAZQAgAEEAZABtAGkAbgBpAHMAdAByAGEAdABpAG8AbgANAEMAbwB1AHIAcwBlACAAdwBvAHIAawAgAGkAbgBjAGwAdQBkAGUAZAA6ACAARQBzAHMAZQBuAHQAaQBhAGwAcwAgAG8AZgAgAE0AYQBuAGEAZwBlAG0AZQBuAHQALAAgAEQAYQB0AGEAIABBAG4AYQBsAHkAcwBpAHMALAAgAEMAbwBuAGMAZQBwAHQAcwAgAG8AZgAgAEQAZQBzAGsAdABvAHAAIABQAHUAYgBsAGkAcwBoAGkAbgBnACwAIABBAGQAdgBhAG4AYwBlAGQAIABFAGwAZQBjAHQAcgBvAG4AaQBjACAAUwBwAHIAZQBhAGQAcwBoAGUAZQB0AHMALgANAA0ACQAJAFAAZQBuAG4AIABUAHIAYQBmAGYAbwByAGQAIABIAGkAZwBoACAAUwBjAGgAbwBvAGwALAAgAEgAYQByAHIAaQBzAG8AbgAgAEMAaQB0AHkALAAgAFAAQQAJAAkACQAJAAkAKAAxADkAOQA2AC0AMgAwADAAMAApAA0ACQAJAEQAaQBwAGwAbwBtAGEALQAgAEcAZQBuAGUAcgBhAGwAIABTAHQAdQBkAGkAZQBzAA0ARwBlAG4AZQByAGEAbAAgAEMAbwB1AHIAcwBlAHMAIABvAGYAIABzAHQAdQBkAHkAIAB3AGUAcgBlACAATQBhAHQAaAAsACAARQBuAGcAbABpAHMAaAAgAGEAbgBkACAAUwBjAGkAZQBuAGMAZQAuAA0AVABvAG8AawAgAFMAcABlAGUAZAB3AHIAaQB0AGkAbgBnACwAIABTAHAAZQBlAGQAdwByAGkAdABpAG4AZwAgAEkASQAsACAAUABvAHQAdABlAHIAeQAgAGEAbgBkACAASgBlAHcAZQBsAHIAeQAgAGEAcwAgAGEAZABkAGUAZAAgAGMAbwB1AHIAcwBlAHMALgANAFAAZQByAGYAbwByAG0AZQBkACAAaQBuACAAdABoAGUAIABtAGEAcgBjAGgAaQBuAGcAIABiAGEAbgBkACAAYQBuAGQAIABjAG8AbgBjAGUAcgB0ACAAYgBhAG4AZAAgAGEAbABsACAAZgBvAHUAcgAgAHkAZQBhAHIAcwAuAA0AVwBhAHMAIABhACAAbQBlAG0AYgBlAHIAIABvAGYAIABDAG8AbQBtAHUAbgBpAHQAeQAgAEEAYwB0AGkAbwBuACAAUAByAG8AZwByAGEAbQAgACgAQwBBAFAAKQANAEgAZQBsAHAAZQBkACAAbwB1AHQAIABiAGEAYwBrAHMAdABhAGcAZQAgAHcAaQB0AGgAIAB0AGgAZQAgAHMAcAByAGkAbgBnACAAbQB1AHMAaQBjAGEAbAAgAHQAdwBvACAAeQBlAGEAcgBzACAAaQBuACAAYQAgAHIAbwB3AC4ADQANAA0ARQBtAHAAbABvAHkAbQBlAG4AdAAgAEgAaQBzAHQAbwByAHkADQANAAkASwBlAHkAcwB0AG8AbgBlACAAQwBvAGwAbABlAGMAdABpAG8AbgBzACwAIABJAHIAdwBpAG4ALAAgAFAAQQAJAAkACQAJAAkACQAJACgANgAvADEANAAtAFAAcgBlAHMAZQBuAHQAKQANAAkARABhAHQAYQAgAEUAbgB0AHIAeQANAE8AbgAgAGEAIABkAGEAaQBsAHkAIABiAGEAcwBpAHMAIABJACAAdgBlAHIAaQBmAHkAIABmAGkAbgBhAGwAIABsAG8AYwBhAGwAIAByAGUAdAB1AHIAbgBzACAAYQBuAGQAIAB2AGUAcgBpAGYAeQAgAHQAaABlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACAAdABoAGEAdAAgAGkAcwAgAGkAbgANAHQAaABlACAAcwB5AHMAdABlAG0ALgANAAkADQAJAEMAYQB0AGMAaAAtAFUAcAAgAEwAbwBnAGkAcwB0AGkAYwBzACwAIABHAHIAZQBlAG4AcwBiAHUAcgBnACwAIABQAEEACQAJAAkACQAJAAkAKAA0AC8AMQA0AC0ANQAvADEANAApAA0ACQBTAGgAaQBwAHAAaQBuAGcALwBSAGUAYwBlAGkAdgBpAG4AZwAgAEMAbABlAHIAawANAE8AbgAgAGEAIABkAGEAaQBsAHkAIABiAGEAcwBpAHMAIABJACAAcABlAHIAZgBvAHIAbQAgAHQAaABlACAASQBuACAAJgAgAE8AdQB0ACAAYwBvAHUAbgB0ACAAZgBvAHIAIAB0AGgAZQAgAHAAcgBlAHYAaQBvAHUAcwAgAGQAYQB5AC4ADQBPAG4AIABhACAAZABhAGkAbAB5ACAAYgBhAHMAaQBzACAASQAgAHAAcgBvAGMAZQBzAHMAIABCAGkAbABsAHMAIABvAGYAIABMAGEAZABpAG4AZwAgAGYAbwByACAAUwBoAGkAcABtAGUAbgB0AHMAIAB1AHMAaQBuAGcAIAAzAFAATAAuAA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABwAHIAbwBjAGUAcwBzACAAcgBlAGMAZQBpAHAAdABzACAAZgBvAHIAIABpAHQAZQBtAHMAIABkAGUAbABpAHYAZQByAGUAZAAgAHUAcwBpAG4AZwAgADMAUABMAC4ADQBPAG4AIABhACAAZABhAGkAbAB5ACAAYgBhAHMAaQBzACAASQAgAGMAYQBsAGwAIABjAGEAcgByAGkAZQByAHMAIAB0AG8AIABhAHIAcgBhAG4AZwBlACAAcABpAGMAawAgAHUAcABzACAAZgBvAHIAIABzAGgAaQBwAG0AZQBuAHQAcwAuAA0ADQANAAkATABvAGQAbwB2AGkAYwBvACAAJgAgAEEAcwBzAG8AYwBpAGEAdABlAHMALAAgAEYAbwByAGUAcwB0ACAASABpAGwAbABzACwAIABQAEEACQAJAAkACQAJAAkAKAAxAC8AMQAzAC0AMgAvADEANAApAA0ACQBQAHIAbwBjAGUAcwBzAG8AcgANAEQAdQByAGkAbgBnACAAdABhAHgAIABzAGUAYQBzAG8AbgAgAEkAIABwAHIAbwBjAGUAcwBzACAAYwBsAGkAZQBuAHQAcwAgAHQAYQB4ACAAcgBlAHQAdQByAG4AcwAgAGIAeQAgAG0AYQBrAGkAbgBnACAAYwBvAHAAaQBlAHMAIABvAGYAIAB0AGgAZQAgAGMAbABpAGUAbgB0AHMAIAB0AGEAeAAgAHIAZQB0AHUAcgBuACAAZgBvAHIAIAB0AGgAZQAgAGMAbABpAGUAbgB0ACAAdABvACAAawBlAGUAcAAgAGYAbwByACAAdABoAGUAaQByACAAcgBlAGMAbwByAGQAcwAuAA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABwAGUAcgBmAG8AcgBtACAAZwBlAG4AZQByAGEAbAAgAG8AZgBmAGkAYwBlACAAZAB1AHQAaQBlAHMALgANAA0ADQAJAA0ACQBBAG0AZQByAGkAcwBvAHUAcgBjAGUAYgBlAHIAZwBlAG4ALQAgAFQAaABlAHIAYQBjAG8AbQAsACAATQBvAG4AcgBvAGUAdgBpAGwAbABlACwAIABQAEEACQAJAAkACQAoADEAMgAvADEAMQAtADEAMAAvADEAMgApAA0ACQBTAGUAbgBpAG8AcgAgAEQAYQB0AGEAIABFAG4AdAByAHkALQBYAGEAcgBlAGwAdABvAA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABwAGUAcgBmAG8AcgBtACAAZABhAHQAYQAgAGUAbgB0AHIAeQAgAGYAbwByACAAYgBlAG4AZQBmAGkAdAAgAGkAbgB2AGUAcwB0AGkAZwBhAHQAaQBvAG4AcwAgAGYAbwByACAAdABoAGUAIABkAHIAdQBnACAAYwBhAGwAbABlAGQAIABYAGEAcgBlAGwAdABvAC4ADQBFAG4AdABlAHIAIABCAHUAcwBpAG4AZQBzAHMAIABBAHMAcwBvAGMAaQBhAHQAZQBzACAAQQBnAHIAZQBlAG0AZQBuAHQAcwAgAGYAbwByACAAcABoAHkAcwBpAGMAaQBhAG4AcwAgAG8AZgBmAGkAYwBlAHMAIABmAG8AcgAgAHQAaABlACAAZAByAHUAZwAgAGMAYQBsAGwAZQBkACAAWABhAHIAZQBsAHQAbwAuAA0AUwBlAGEAcgBjAGgAIABwAGgAeQBzAGkAYwBpAGEAbgBzACAATgBQAEkAIABuAHUAbQBiAGUAcgBzACAAdQBzAGkAbgBnACAASQBuAHQAZQByAG4AZQB0ACAARQB4AHAAbABvAHIAZQByAC4ADQBMAGkAbgBrACAAaQBtAGEAZwBlAHMAIAB0AG8AIABjAGEAcwBlAHMAIAB1AHMAaQBuAGcAIABLAG8AZgBhAHgALgANAEYAYQB4ACAAaQBuACAAVgBlAHIAYgBhAGwAIABCAGUAbgBlAGYAaQB0ACAASQBuAHYAZQBzAHQAaQBnAGEAdABpAG8AbgAgAGYAbwByAG0AcwAgAHQAbwAgAEsAbwBmAGEAeAAgAHQAbwAgAGwAaQBuAGsAIAB0AG8AIABjAGEAcwBlAHMALgANAA0ADQAJAFQAaABlACAATgBlAHcAIABNAG8AbgByAG8AZQB2AGkAbABsAGUAIABEAG8AZABnAGUAIABDAG8AbABsAGkAcwBpAG8AbgAgAEMAZQBuAHQAZQByACwAIABNAG8AbgByAG8AZQB2AGkAbABsAGUALAAgAFAAQQAJAAkAKAAxAC8AMQAxAC0AMQAyAC8AMQAxACkAIAAJAFIAZQBjAGUAcAB0AGkAbwBuAGkAcwB0AA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABhAG4AcwB3AGUAcgAgAHAAaABvAG4AZQBzAC4ADQBPAG4AIABhACAAZABhAGkAbAB5ACAAYgBhAHMAaQBzACAASQAgAGMAYQBsAGwAIABjAHUAcwB0AG8AbQBlAHIAcwAgACAAdwBpAHQAaAAgAGkAbgBzAHUAcgBhAG4AYwBlACAAYQBzAHMAaQBnAG4AbQBlAG4AdABzACAASQAgAHIAZQBjAGUAaQB2AGUAZAAgAHYAaQBhACAAQwBDAEMAIABPAG4AZQAgAHQAbwAgAHMAYwBoAGUAZAB1AGwAZQAgAGYAbwByACAAZQBzAHQAaQBtAGEAdABlAHMALgANAEkAIABlAG4AdABlAHIAIABiAG8AZAB5ACAAcwBoAG8AcAAgAHQAZQBjAGgAbgBpAGMAaQBhAG4AJwBzACAAdABpAG0AZQAgAGMAYQByAGQAcwAgAHUAcwBpAG4AZwAgAEEARABQAC4ADQBJACAAbwByAGQAZQByACAAJgAgAGMAaABlAGMAawAgAGkAbgAgAHAAYQByAHQAcwAuAA0ASQAgAHcAcgBpAHQAZQAgAHIAZQBwAGEAaQByACAAbwByAGQAZQByAHMAIAB1AHMAaQBuAGcAIABBAEQAUAAuAA0ASQAgAGMAbABvAHMAZQAgAHIAZQBwAGEAaQByACAAbwByAGQAZQByAHMAIAB1AHMAaQBuAGcAIABBAEQAUAAuAA0ATwBuACAAbwBjAGMAYQBzAGkAbwBuACAASQAgAGgAYQB2AGUAIABmAGkAbABsAGUAZAAgAGkAbgAgAGYAbwByACAAdABoAGUAIABjAGEAcwBoAGkAZQByACAAYQB0ACAASwBpAGEALwBNAGEAegBkAGEALgANAA0ACQANAAkARABhAHkAIABGAG8AcgBkACwAIABNAG8AbgByAG8AZQB2AGkAbABsAGUALAAgAFAAQQAJAAkACQAJAAkACQAJACgAMQAxAC8AMAA1AC0ANgAvADEAMAApAA0ACQBSAGUAYwBlAHAAdABpAG8AbgBpAHMAdAAvAEMAYQBzAGgAaQBlAHIALwBDAHUAcwB0AG8AbQBlAHIAIABTAGUAcgB2AGkAYwBlAA0ATwBuACAAYQAgAGQAYQBpAGwAeQAgAGIAYQBzAGkAcwAgAEkAIABhAG4AcwB3AGUAcgBlAGQAIABwAGgAbwBuAGUAcwAsACAAdABhAGsAZQAgAGMAYQByAGUAIABvAGYAIABzAGUAcgB2AGkAYwBlACAAYwB1AHMAdABvAG0AZQByAHMALAAgAGIAYQBsAGEAbgBjAGUAIABiAG8AdABoACAAYwBhAHMAaAAgAGQAcgBhAHcAZQByAHMALAAgAGEAbgBkACAAZABvACAAYQAgAGQAZQBwAG8AcwBpAHQALgANAEkAIABzAHQAbwBjAGsAZQBkACAAaQBuACAAbgBlAHcAIABhAG4AZAAgAHUAcwBlAGQAIAB2AGUAaABpAGMAbABlAHMAIAB1AHMAaQBuAGcAIABBAEQAUAAuAA0ASQAgAHcAYQBzACAAcwBvAGwAZQBsAHkAIAByAGUAcwBwAG8AbgBzAGkAYgBsAGUAIABmAG8AcgAgAGUAbgB0AGUAcgBpAG4AZwAgAGkAbgB2AG8AaQBjAGUAcwAgAGYAbwByACAAYQBjAGMAbwB1AG4AdABzACAAcABhAHkAYQBiAGwAZQAgAGEAbgBkACAAcAByAGkAbgB0AGkAbgBnACAAYwBoAGUAYwBrAHMAIABmAG8AcgAgAGEAYwBjAG8AdQBuAHQAcwAgAHAAYQB5AGEAYgBsAGUAIAB1AHMAaQBuAGcAIABBAEQAUAAuAA0ASQAgAGUAbgB0AGUAcgBlAGQAIABzAHQAbwBjAGsAIABuAHUAbQBiAGUAcgBzACAAZgBvAHIAIABuAGUAdwAgAHYAZQBoAGkAYwBsAGUAcwAgAG8AbgBsAGkAbgBlACAAdQBzAGkAbgBnACAASQBuAHQAZQByAG4AZQB0ACAARQB4AHAAbABvAHIAZQByACAAbwBuACAARABlAGEAbABlAHIAIABBAGMAYwBlAHMAcwAgAFMAeQBzAHQAZQBtACAAZgBvAHIAIABQAE4AQwAuAA0ASQAgAFMAdQBiAG0AaQB0AHQAZQBkACAAdwBhAHIAcgBhAG4AdAB5ACAAYwBsAGEAaQBtAHMAIABmAG8AcgAgAEoATQAmAEEAIABvAG4AbABpAG4AZQAgAHUAcwBpAG4AZwAgAEkAbgB0AGUAcgBuAGUAdAAgAEUAeABwAGwAbwByAGUAcgAuAA0ASQAgAFMAdQBiAG0AaQB0AHQAZQBkACAAdAByAGEAbgBzAGYAZQByACAAcABhAHAAZQByAHcAbwByAGsAIABmAG8AcgAgAGQAZQBhAGwAZQByACAAdAByAGEAZABlAHMAIAB1AHMAaQBuAGcAIABDAG8AbgBjAGUAcABzACAAbwBuACAARgBNAEMAIABEAGUAYQBsAGUAcgAuAA0ADQANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAABwIAAA6CAAAWggAAHgIAAB6CAAAfAgAAJwIAACeCAAAAgkAAAQJAACyCQAAWgoAAKgKAACqCgAAvgoAAMAKAAAsCwAAMAsAAGYLAABoDAAAagwAAOgMAADsDAAAHg0AAJANAAAkDgAApA4AAAIPAACEDwAAhg8AAIgPAACuDwAAsA8AABwQAAAeEAAANBAAANwQAAD0EAAA+BAAAPoQAABiEQAAZBEAAJYRAAAeEgAAphIAACwTAAC0EwAAthMAALgTAAAsFAAAQhQAAEwVAACwFQAAshUAALQVAAC4FQAANhYAADgWAABsFgAAKBcAANoXAABIGAAAjBgAABYZAAD06+vr39/Q39/f39/f39DBwcHQwcHBwdDBwcHBwbKy0N/f39DBp9DQ39/QwcHBwaMA39Df39/f39/f0N/f39/fAAAGNQgAXAgAABQ2CAE1CABdCAFcCABPSgMAUUoDAAAcQ0ocADYIATUIAGFKHABdCAFcCABPSgMAUUoDAAAcQ0oYADYIATUIAGFKGABdCAFcCABPSgMAUUoDAAAcQ0oYADYIATUIAWFKGABdCAFcCAFPSgMAUUoDAAAWQ0oYADYIAWFKGABdCAFPSgMAUUoDAAAQQ0ocAGFKHABPSgMAUUoDAAAWQ0owADUIAWFKMABcCAFPSgMAUUoDAEAWGQAAGBkAABoZAACyGQAAzBkAABAaAADwGgAAWhsAAI4bAADQGwAAEhwAAIgcAACKHAAAjhwAAJAcAADqHAAAOB0AABoeAAB2HgAAZh8AADggAADCIAAAXiEAAGAhAABiIQAA9/fr3M3Nzc3Nzc3Nzc3c3Nzc3Nzc3M3NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxDShgANggBNQgAYUoYAF0IAVwIAE9KAwBRSgMAABxDShgANggBNQgBYUoYAF0IAVwIAU9KAwBRSgMAABZDShgANggBYUoYAF0IAU9KAwBRSgMAABBDShgAYUoYAE9KAwBRSgMAGAAIAAAcCAAAOggAAFoIAAB4CAAAeggAAHwIAACcCAAAnggAAAIJAAAECQAAsgkAAFoKAACoCgAAqgoAAL4KAADACgAALAsAAGYLAAD6AAAAAAAAAAAAAAAA9QAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAADrAAAAAAAAAAAAAAAA5gAAAAAAAAAAAAAAAOEAAAAAAAAAAAAAAADcAAAAAAAAAAAAAAAA1wAAAAAAAAAAAAAAANIAAAAAAAAAAAAAAADNAAAAAAAAAAAAAAAAyAAAAAAAAAAAAAAAAMMAAAAAAAAAAAAAAAC+AAAAAAAAAAAAAAAAuQAAAAAAAAAAAAAAALQAAAAAAAAAAAAAAACvAAAAAAAAAAAAAAAAqgAAAAAAAAAAAAAAAKUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAEAAADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAEAAADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAEAAADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAEAAADJABhJAAABAAAAyQBYSQBAAQAAAMkAWEkAQAEAAADJAFhJAEABAAAAyQBYSQBAAQAAAMkAWEkAQASZgsAAGgMAABqDAAA6AwAAB4NAACQDQAAJA4AAKQOAAACDwAAhA8AAIYPAACIDwAArg8AALAPAAAcEAAANBAAANwQAAD0EAAA+BAAAGIRAAD3AAAAAAAAAAAAAAAA8gAAAAAAAAAAAAAAAO0AAAAAAAAAAAAAAADoAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAADbAAAAAAAAAAAAAAAA1gAAAAAAAAAAAAAAANEAAAAAAAAAAAAAAADMAAAAAAAAAAAAAAAAxwAAAAAAAAAAAAAAAMIAAAAAAAAAAAAAAAC9AAAAAAAAAAAAAAAAuAAAAAAAAAAAAAAAALMAAAAAAAAAAAAAAACuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAMkAGEkAAAEAAADJABhJAAFAAAKJgALRgAABQAACiYAC0YBAAAEAAADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAEAAADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAgAAAomAAtGAwADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAEAAADJABhJAAIAAAKJgALRgIAAyQAYSQAABNiEQAAlhEAAB4SAACmEgAALBMAALQTAAC2EwAAuBMAACwUAABCFAAATBUAALAVAACyFQAAtBUAALgVAAA2FgAAbBYAACgXAADaFwAASBgAAIwYAAAWGQAA+gAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA9QAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAA6wAAAAAAAAAAAAAAAOYAAAAAAAAAAAAAAADhAAAAAAAAAAAAAAAA2QAAAAAAAAAAAAAAANkAAAAAAAAAAAAAAADUAAAAAAAAAAAAAAAAzwAAAAAAAAAAAAAAAMoAAAAAAAAAAAAAAADFAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAALgAAAAAAAAAAAAAAAC4AAAAAAAAAAAAAAAAuAAAAAAAAAAAAAAAALgAAAAAAAAAAAAAAAC4AAAAAAAAAAAAAAAAAAAAAAAAAAgAAAomAAtGBQADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAEAAADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAgAAAomAAtGBgADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAEAAADJABhJAAABAAAAyQAYSQABQAACiYAC0YBAAAEAAADJABhJAAAFRYZAAAYGQAAGhkAAMwZAAAQGgAA8BoAAFobAACOGwAA0BsAABIcAACIHAAAihwAAI4cAADqHAAAOB0AABoeAAB2HgAAZh8AADggAADCIAAAXiEAAGAhAABiIQAA+gAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAA6AAAAAAAAAAAAAAAAOgAAAAAAAAAAAAAAADoAAAAAAAAAAAAAAAA6AAAAAAAAAAAAAAAAOgAAAAAAAAAAAAAAADoAAAAAAAAAAAAAAAA6AAAAAAAAAAAAAAAAOMAAAAAAAAAAAAAAADeAAAAAAAAAAAAAAAA2QAAAAAAAAAAAAAAANQAAAAAAAAAAAAAAADMAAAAAAAAAAAAAAAAzAAAAAAAAAAAAAAAAMwAAAAAAAAAAAAAAADMAAAAAAAAAAAAAAAAzAAAAAAAAAAAAAAAAMwAAAAAAAAAAAAAAADHAAAAAAAAAAAAAAAAwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAyQAYSQAAAQAAAMkAGEkAAgAAAomAAtGAQADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAEAAADJABhJAAABAAAAyQAYSQACAAACiYAC0YEAAMkAGEkAAAEAAADJABhJAAABAAAAyQAYSQAAAQAAAMkAGEkAAAWMAAfsNAvILDgPSGwwgIisMICI5CwASSQAAAyUAAAMZBoATBwAAAAADNQAAAoMgAOMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAAGAAAAAEAAAABAAAAEAAAAAIAAADp/QAAGAAAAAEAAAABAAAAEAAAAAIAAADp/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAbwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUA//////////8BAAAABgkCAAAAAADAAAAAAAAARgAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAEACAAAAAAAAAQBDAG8AbQBwAE8AYgBqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAgACAAAABAAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAagAAAAAAAAABAE8AbABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgACAP////8DAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAUAAAAAAAAADEAVABhAGIAbABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABUhAAAAAAAABQBTAHUAbQBtAGEAcgB5AEkAbgBmAG8AcgBtAGEAdABpAG8AbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAgAFAAAABgAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAA7AAAAAAAAABXAG8AcgBkAEQAbwBjAHUAbQBlAG4AdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGgACAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAAAAyLgAAAAAAAAUARABvAGMAdQBtAGUAbgB0AFMAdQBtAG0AYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBuAAAAAAAAAAAAAAA4AAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAAAAAAAA=;type:2"]}} diff --git a/src/parser/__tests__/languageguesser/bash.shebang b/src/parser/__tests__/languageguesser/bash.shebang new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/languageguesser/bash.shebang @@ -0,0 +1,3 @@ +#!/bin/bash + +exit 1; diff --git a/src/parser/__tests__/languageguesser/console.path b/src/parser/__tests__/languageguesser/console.path new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/languageguesser/console.path @@ -0,0 +1,8 @@ +path/to/somewhere/ $ ls +[ dd kill mv sh wait4path +bash df ksh pax sleep zsh +cat domainname launchctl ps stty +chmod echo link pwd sync +cp ed ln rcp tcsh +csh expr ls rm test +date hostname mkdir rmdir unlink diff --git a/src/parser/__tests__/languageguesser/console.prompt b/src/parser/__tests__/languageguesser/console.prompt new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/languageguesser/console.prompt @@ -0,0 +1,8 @@ +$ ls +[ dd kill mv sh wait4path +bash df ksh pax sleep zsh +cat domainname launchctl ps stty +chmod echo link pwd sync +cp ed ln rcp tcsh +csh expr ls rm test +date hostname mkdir rmdir unlink diff --git a/src/parser/__tests__/languageguesser/diff.git b/src/parser/__tests__/languageguesser/diff.git new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/languageguesser/diff.git @@ -0,0 +1,7 @@ +diff --git a/some_file b/some_file +index 4c479de..637a09b 100644 +--- a/some_file ++++ b/some_file +@@ -1 +1 @@ +-apple ++banana diff --git a/src/parser/__tests__/languageguesser/diff.udiff b/src/parser/__tests__/languageguesser/diff.udiff new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/languageguesser/diff.udiff @@ -0,0 +1,5 @@ +--- some_file 2012-05-20 19:35:28.000000000 -0700 ++++ other_file 2012-05-20 19:35:23.000000000 -0700 +@@ -1 +1 @@ +-apple ++banana diff --git a/src/parser/__tests__/languageguesser/nothing-useful b/src/parser/__tests__/languageguesser/nothing-useful new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/languageguesser/nothing-useful @@ -0,0 +1,2 @@ +derp derp derp derp derp derp derp derp derp derp derp derp derp derp +herp derp herp derp herp derp herp derp herp derp herp derp herp derp diff --git a/src/parser/__tests__/languageguesser/php.shell b/src/parser/__tests__/languageguesser/php.shell new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/languageguesser/php.shell @@ -0,0 +1,3 @@ +#!/usr/bin/php + +exit(1); diff --git a/src/parser/__tests__/languageguesser/php.shell-env b/src/parser/__tests__/languageguesser/php.shell-env new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/languageguesser/php.shell-env @@ -0,0 +1,3 @@ +#!/usr/bin/env php + +exit(1); diff --git a/src/parser/__tests__/languageguesser/php.test b/src/parser/__tests__/languageguesser/php.test new file mode 100644 --- /dev/null +++ b/src/parser/__tests__/languageguesser/php.test @@ -0,0 +1,3 @@ +id = $id; + $this->typeID = $data[0]; + if (isset($data[1])) { + $this->l = $data[1]; + } else { + $this->l = -1; + } + if (isset($data[2])) { + $this->r = $data[2]; + } else { + $this->r = -1; + } + $this->tree = $tree; + } + + final public function getParentNode() { + return $this->parentNode; + } + + final public function setParentNode(AASTNode $node = null) { + $this->parentNode = $node; + return $this; + } + + final public function getPreviousSibling() { + return $this->previousSibling; + } + + final public function setPreviousSibling(AASTNode $node = null) { + $this->previousSibling = $node; + return $this; + } + + final public function getNextSibling() { + return $this->nextSibling; + } + + final public function setNextSibling(AASTNode $node = null) { + $this->nextSibling = $node; + return $this; + } + + final public function getID() { + return $this->id; + } + + final public function getTypeID() { + return $this->typeID; + } + + final public function getTree() { + return $this->tree; + } + + final public function getTypeName() { + if (empty($this->typeName)) { + $this->typeName = + $this->tree->getNodeTypeNameFromTypeID($this->getTypeID()); + } + return $this->typeName; + } + + final public function getChildren() { + return $this->children; + } + + final public function setChildren(array $children) { + // We don't call `assert_instances_of($children, 'AASTNode')` because doing + // so would incur a significant performance penalty. + $this->children = $children; + return $this; + } + + public function getChildrenOfType($type) { + $nodes = array(); + + foreach ($this->children as $child) { + if ($child->getTypeName() == $type) { + $nodes[] = $child; + } + } + + return $nodes; + } + + public function getChildOfType($index, $type) { + $child = $this->getChildByIndex($index); + if ($child->getTypeName() != $type) { + throw new Exception( + pht( + "Child in position '%d' is not of type '%s': %s", + $index, + $type, + $this->getDescription())); + } + + return $child; + } + + public function getChildByIndex($index) { + // NOTE: Microoptimization to avoid calls like array_values() or idx(). + + $idx = 0; + foreach ($this->children as $child) { + if ($idx == $index) { + return $child; + } + ++$idx; + } + + throw new Exception(pht("No child with index '%d'.", $index)); + } + + /** + * Build a cache to improve the performance of + * @{method:selectDescendantsOfType}. This cache makes a time/memory tradeoff + * by aggressively caching node descendants. It may improve the tree's query + * performance substantially if you make a large number of queries, but also + * requires a significant amount of memory. + * + * This builds a cache for the entire tree and improves performance of all + * @{method:selectDescendantsOfType} calls. + */ + public function buildSelectCache() { + $cache = array(); + foreach ($this->getChildren() as $id => $child) { + $type_id = $child->getTypeID(); + if (empty($cache[$type_id])) { + $cache[$type_id] = array(); + } + $cache[$type_id][$id] = $child; + foreach ($child->buildSelectCache() as $type_id => $nodes) { + if (empty($cache[$type_id])) { + $cache[$type_id] = array(); + } + $cache[$type_id] += $nodes; + } + } + $this->selectCache = $cache; + return $this->selectCache; + } + + /** + * Build a cache to improve the performance of @{method:selectTokensOfType}. + * This cache makes a time/memory tradeoff by aggressively caching token + * types. It may improve the tree's query performance substantially if you + * make a large number of queries, but also requires a significant amount of + * memory. + * + * This builds a cache for this node only. + */ + public function buildTokenCache() { + $cache = array(); + foreach ($this->getTokens() as $id => $token) { + $cache[$token->getTypeName()][$id] = $token; + } + $this->tokenCache = $cache; + return $this->tokenCache; + } + + public function selectTokensOfType($type_name) { + return $this->selectTokensOfTypes(array($type_name)); + } + + /** + * Select all tokens of any given types. + */ + public function selectTokensOfTypes(array $type_names) { + $tokens = array(); + + foreach ($type_names as $type_name) { + if (isset($this->tokenCache)) { + $cached_tokens = idx($this->tokenCache, $type_name, array()); + foreach ($cached_tokens as $id => $cached_token) { + $tokens[$id] = $cached_token; + } + } else { + foreach ($this->getTokens() as $id => $token) { + if ($token->getTypeName() == $type_name) { + $tokens[$id] = $token; + } + } + } + } + + return $tokens; + } + + final public function isDescendantOf(AASTNode $node) { + for ($it = $this; $it !== null; $it = $it->getParentNode()) { + if ($it === $node) { + return true; + } + } + + return false; + } + + public function selectDescendantsOfType($type_name) { + return $this->selectDescendantsOfTypes(array($type_name)); + } + + public function selectDescendantsOfTypes(array $type_names) { + $nodes = array(); + foreach ($type_names as $type_name) { + $type = $this->getTypeIDFromTypeName($type_name); + + if (isset($this->selectCache)) { + if (isset($this->selectCache[$type])) { + $nodes = $nodes + $this->selectCache[$type]; + } + } else { + $nodes = $nodes + $this->executeSelectDescendantsOfType($this, $type); + } + } + + return AASTNodeList::newFromTreeAndNodes($this->tree, $nodes); + } + + protected function executeSelectDescendantsOfType($node, $type) { + $results = array(); + foreach ($node->getChildren() as $id => $child) { + if ($child->getTypeID() == $type) { + $results[$id] = $child; + } + $results += $this->executeSelectDescendantsOfType($child, $type); + } + return $results; + } + + public function getTokens() { + if ($this->l == -1 || $this->r == -1) { + return array(); + } + $tokens = $this->tree->getRawTokenStream(); + $result = array(); + foreach (range($this->l, $this->r) as $token_id) { + $result[$token_id] = $tokens[$token_id]; + } + return $result; + } + + public function getConcreteString() { + $values = array(); + foreach ($this->getTokens() as $token) { + $values[] = $token->getValue(); + } + return implode('', $values); + } + + public function getSemanticString() { + $tokens = $this->getTokens(); + foreach ($tokens as $id => $token) { + if ($token->isComment()) { + unset($tokens[$id]); + } + } + return implode('', mpull($tokens, 'getValue')); + } + + public function getIndentation() { + $tokens = $this->getTokens(); + $left = head($tokens); + + while ($left && + (!$left->isAnyWhitespace() || + strpos($left->getValue(), "\n") === false)) { + $left = $left->getPrevToken(); + } + + if (!$left) { + return null; + } + + return preg_replace("/^.*\n/s", '', $left->getValue()); + } + + public function getDescription() { + $concrete = $this->getConcreteString(); + if (strlen($concrete) > 75) { + $concrete = substr($concrete, 0, 36).'...'.substr($concrete, -36); + } + + $concrete = addcslashes($concrete, "\\\n\""); + + return pht('a node of type %s: "%s"', $this->getTypeName(), $concrete); + } + + final protected function getTypeIDFromTypeName($type_name) { + return $this->tree->getNodeTypeIDFromTypeName($type_name); + } + + final public function getOffset() { + $stream = $this->tree->getRawTokenStream(); + if (empty($stream[$this->l])) { + return null; + } + return $stream[$this->l]->getOffset(); + } + + final public function getLength() { + $stream = $this->tree->getRawTokenStream(); + if (empty($stream[$this->r])) { + return null; + } + return $stream[$this->r]->getOffset() - $this->getOffset(); + } + + + public function getSurroundingNonsemanticTokens() { + $before = array(); + $after = array(); + + $tokens = $this->tree->getRawTokenStream(); + + if ($this->l != -1) { + $before = $tokens[$this->l]->getNonsemanticTokensBefore(); + } + + if ($this->r != -1) { + $after = $tokens[$this->r]->getNonsemanticTokensAfter(); + } + + return array($before, $after); + } + + final public function getLineNumber() { + return idx($this->tree->getOffsetToLineNumberMap(), $this->getOffset()); + } + + final public function getEndLineNumber() { + return idx( + $this->tree->getOffsetToLineNumberMap(), + $this->getOffset() + $this->getLength()); + } + + /** + * Determines whether the current node appears //after// a specified node in + * the tree. + * + * @param AASTNode + * @return bool + */ + final public function isAfter(AASTNode $node) { + return head($this->getTokens())->getOffset() > + last($node->getTokens())->getOffset(); + } + + /** + * Determines whether the current node appears //before// a specified node in + * the tree. + * + * @param AASTNode + * @return bool + */ + final public function isBefore(AASTNode $node) { + return last($this->getTokens())->getOffset() < + head($node->getTokens())->getOffset(); + } + + /** + * Determines whether a specified node is a descendant of the current node. + * + * @param AASTNode + * @return bool + */ + final public function containsDescendant(AASTNode $node) { + return !$this->isAfter($node) && !$this->isBefore($node); + } + + public function dispose() { + foreach ($this->getChildren() as $child) { + $child->dispose(); + } + + unset($this->selectCache); + } + +} diff --git a/src/parser/aast/api/AASTNodeList.php b/src/parser/aast/api/AASTNodeList.php new file mode 100644 --- /dev/null +++ b/src/parser/aast/api/AASTNodeList.php @@ -0,0 +1,110 @@ +tree, $nodes); + } + + public function selectDescendantsOfType($type_name) { + return $this->selectDescendantsOfTypes(array($type_name)); + } + + public function selectDescendantsOfTypes(array $type_names) { + $results = array(); + foreach ($type_names as $type_name) { + foreach ($this->list as $id => $node) { + $results += $node->selectDescendantsOfType($type_name)->getRawNodes(); + } + } + return $this->newList($results); + } + + public function getChildrenByIndex($index) { + $results = array(); + foreach ($this->list as $id => $node) { + $child = $node->getChildByIndex($index); + $results[$child->getID()] = $child; + } + return $this->newList($results); + } + + public function add(AASTNodeList $list) { + foreach ($list->list as $id => $node) { + $this->list[$id] = $node; + } + $this->ids = array_keys($this->list); + return $this; + } + + public function getTokens() { + $tokens = array(); + foreach ($this->list as $node) { + $tokens += $node->getTokens(); + } + return $tokens; + } + + public function getRawNodes() { + return $this->list; + } + + public static function newFromTreeAndNodes(AASTTree $tree, array $nodes) { + // We could do `assert_instances_of($nodes, 'AASTNode')` here, but doing + // so imposes an observable performance penalty for linting. + + $obj = new AASTNodeList(); + $obj->tree = $tree; + $obj->list = $nodes; + $obj->ids = array_keys($nodes); + return $obj; + } + + public static function newFromTree(AASTTree $tree) { + $obj = new AASTNodeList(); + $obj->tree = $tree; + $obj->list = array(0 => $tree->getRootNode()); + $obj->ids = array(0 => 0); + return $obj; + } + + +/* -( Countable )---------------------------------------------------------- */ + + public function count() { + return count($this->ids); + } + + +/* -( Iterator )----------------------------------------------------------- */ + + public function current() { + return $this->list[$this->key()]; + } + + public function key() { + return $this->ids[$this->pos]; + } + + public function next() { + $this->pos++; + } + + public function rewind() { + $this->pos = 0; + } + + public function valid() { + return $this->pos < count($this->ids); + } + +} diff --git a/src/parser/aast/api/AASTToken.php b/src/parser/aast/api/AASTToken.php new file mode 100644 --- /dev/null +++ b/src/parser/aast/api/AASTToken.php @@ -0,0 +1,91 @@ +id = $id; + $this->typeID = $type; + $this->value = $value; + $this->offset = $offset; + $this->tree = $tree; + } + + final public function getTokenID() { + return $this->id; + } + + final public function getTypeID() { + return $this->typeID; + } + + public function getTypeName() { + if (empty($this->typeName)) { + $this->typeName = $this->tree->getTokenTypeNameFromTypeID($this->typeID); + } + return $this->typeName; + } + + final public function getValue() { + return $this->value; + } + + final public function overwriteValue($value) { + $this->value = $value; + return $this; + } + + final public function getOffset() { + return $this->offset; + } + + abstract public function isComment(); + abstract public function isAnyWhitespace(); + + public function isSemantic() { + return !($this->isComment() || $this->isAnyWhitespace()); + } + + public function getPrevToken() { + $tokens = $this->tree->getRawTokenStream(); + return idx($tokens, $this->id - 1); + } + + public function getNextToken() { + $tokens = $this->tree->getRawTokenStream(); + return idx($tokens, $this->id + 1); + } + + public function getNonsemanticTokensBefore() { + $tokens = $this->tree->getRawTokenStream(); + $result = array(); + $ii = $this->id - 1; + while ($ii >= 0 && !$tokens[$ii]->isSemantic()) { + $result[$ii] = $tokens[$ii]; + --$ii; + } + return array_reverse($result); + } + + public function getNonsemanticTokensAfter() { + $tokens = $this->tree->getRawTokenStream(); + $result = array(); + $ii = $this->id + 1; + while ($ii < count($tokens) && !$tokens[$ii]->isSemantic()) { + $result[$ii] = $tokens[$ii]; + ++$ii; + } + return $result; + } + + final public function getLineNumber() { + return idx($this->tree->getOffsetToLineNumberMap(), $this->getOffset()); + } + +} diff --git a/src/parser/aast/api/AASTTree.php b/src/parser/aast/api/AASTTree.php new file mode 100644 --- /dev/null +++ b/src/parser/aast/api/AASTTree.php @@ -0,0 +1,194 @@ +stream[$ii] = $this->newToken( + $ii, + $token[0], + substr($source, $offset, $token[1]), + $offset, + $this); + $offset += $token[1]; + ++$ii; + } + + $this->rawSource = $source; + $this->buildTree(array($tree)); + } + + final public function setTreeType($description) { + $this->treeType = $description; + return $this; + } + + final public function getTreeType() { + return $this->treeType; + } + + final public function setTokenConstants(array $token_map) { + $this->tokenConstants = $token_map; + $this->tokenReverseMap = array_flip($token_map); + return $this; + } + + final public function setNodeConstants(array $node_map) { + $this->nodeConstants = $node_map; + $this->nodeReverseMap = array_flip($node_map); + return $this; + } + + final public function getNodeTypeNameFromTypeID($type_id) { + if (empty($this->nodeConstants[$type_id])) { + $tree_type = $this->getTreeType(); + throw new Exception( + pht( + "No type name for node type ID '%s' in '%s' AAST.", + $type_id, + $tree_type)); + } + + return $this->nodeConstants[$type_id]; + } + + final public function getNodeTypeIDFromTypeName($type_name) { + if (empty($this->nodeReverseMap[$type_name])) { + $tree_type = $this->getTreeType(); + throw new Exception( + pht( + "No type ID for node type name '%s' in '%s' AAST.", + $type_name, + $tree_type)); + } + return $this->nodeReverseMap[$type_name]; + } + + final public function getTokenTypeNameFromTypeID($type_id) { + if (empty($this->tokenConstants[$type_id])) { + $tree_type = $this->getTreeType(); + throw new Exception( + pht( + "No type name for token type ID '%s' in '%s' AAST.", + $type_id, + $tree_type)); + } + return $this->tokenConstants[$type_id]; + } + + final public function getTokenTypeIDFromTypeName($type_name) { + if (empty($this->tokenReverseMap[$type_name])) { + $tree_type = $this->getTreeType(); + throw new Exception( + pht( + "No type ID for token type name '%s' in '%s' AAST.", + $type_name, + $tree_type)); + } + return $this->tokenReverseMap[$type_name]; + } + + /** + * Unlink internal datastructures so that PHP will garbage collect the tree. + * + * This renders the object useless. + * + * @return void + */ + public function dispose() { + $this->getRootNode()->dispose(); + unset($this->tree); + unset($this->stream); + } + + final public function getRootNode() { + return $this->tree[0]; + } + + protected function buildTree(array $tree) { + $ii = count($this->tree); + $nodes = array(); + foreach ($tree as $node) { + $this->tree[$ii] = $this->newNode($ii, $node, $this); + $nodes[$ii] = $node; + ++$ii; + } + foreach ($nodes as $node_id => $node) { + if (isset($node[3])) { + $children = $this->buildTree($node[3]); + $previous_child = null; + + foreach ($children as $ii => $child) { + $child->setParentNode($this->tree[$node_id]); + $child->setPreviousSibling($previous_child); + + if ($previous_child) { + $previous_child->setNextSibling($child); + } + + $previous_child = $child; + } + + if ($previous_child) { + $previous_child->setNextSibling($child); + } + + $this->tree[$node_id]->setChildren($children); + } + } + + $result = array(); + foreach ($nodes as $key => $node) { + $result[$key] = $this->tree[$key]; + } + + return $result; + } + + final public function getRawTokenStream() { + return $this->stream; + } + + public function getOffsetToLineNumberMap() { + if ($this->lineMap === null) { + $src = $this->rawSource; + $len = strlen($src); + $lno = 1; + $map = array(); + for ($ii = 0; $ii < $len; ++$ii) { + $map[$ii] = $lno; + if ($src[$ii] == "\n") { + ++$lno; + } + } + $this->lineMap = $map; + } + return $this->lineMap; + } + +} diff --git a/src/parser/argument/PhutilArgumentParser.php b/src/parser/argument/PhutilArgumentParser.php new file mode 100644 --- /dev/null +++ b/src/parser/argument/PhutilArgumentParser.php @@ -0,0 +1,935 @@ +setTagline('make an new dog') + * $args->setSynopsis(<<parse( + * array( + * array( + * 'name' => 'name', + * 'param' => 'dogname', + * 'default' => 'Rover', + * 'help' => 'Set the dog\'s name. By default, the dog will be '. + * 'named "Rover".', + * ), + * array( + * 'name' => 'big', + * 'short' => 'b', + * 'help' => 'If set, create a large dog.', + * ), + * )); + * + * $dog_name = $args->getArg('name'); + * $dog_size = $args->getArg('big') ? 'big' : 'small'; + * + * // ... etc ... + * + * (For detailed documentation on supported keys in argument specifications, + * see @{class:PhutilArgumentSpecification}.) + * + * This will handle argument parsing, and generate appropriate usage help if + * the user provides an unsupported flag. @{class:PhutilArgumentParser} also + * supports some builtin "standard" arguments: + * + * $args->parseStandardArguments(); + * + * See @{method:parseStandardArguments} for details. Notably, this includes + * a "--help" flag, and an "--xprofile" flag for profiling command-line scripts. + * + * Normally, when the parser encounters an unknown flag, it will exit with + * an error. However, you can use @{method:parsePartial} to consume only a + * set of flags: + * + * $args->parsePartial($spec_list); + * + * This allows you to parse some flags before making decisions about other + * parsing, or share some flags across scripts. The builtin standard arguments + * are implemented in this way. + * + * There is also builtin support for "workflows", which allow you to build a + * script that operates in several modes (e.g., by accepting commands like + * `install`, `upgrade`, etc), like `arc` does. For detailed documentation on + * workflows, see @{class:PhutilArgumentWorkflow}. + * + * @task parse Parsing Arguments + * @task read Reading Arguments + * @task help Command Help + * @task internal Internals + */ +final class PhutilArgumentParser extends Phobject { + + private $bin; + private $argv; + private $specs = array(); + private $results = array(); + private $parsed; + + private $tagline; + private $synopsis; + private $workflows; + private $showHelp; + + const PARSE_ERROR_CODE = 77; + + private static $traceModeEnabled = false; + + +/* -( Parsing Arguments )-------------------------------------------------- */ + + + /** + * Build a new parser. Generally, you start a script with: + * + * $args = new PhutilArgumentParser($argv); + * + * @param list Argument vector to parse, generally the $argv global. + * @task parse + */ + public function __construct(array $argv) { + $this->bin = $argv[0]; + $this->argv = array_slice($argv, 1); + } + + + /** + * Parse and consume a list of arguments, removing them from the argument + * vector but leaving unparsed arguments for later consumption. You can + * retrieve unconsumed arguments directly with + * @{method:getUnconsumedArgumentVector}. Doing a partial parse can make it + * easier to share common flags across scripts or workflows. + * + * @param list List of argument specs, see + * @{class:PhutilArgumentSpecification}. + * @param bool Require flags appear before any non-flag arguments. + * @return this + * @task parse + */ + public function parsePartial(array $specs, $initial_only = false) { + return $this->parseInternal($specs, false, $initial_only); + } + + /** + * @return this + */ + private function parseInternal( + array $specs, + $correct_spelling, + $initial_only) { + + $specs = PhutilArgumentSpecification::newSpecsFromList($specs); + $this->mergeSpecs($specs); + + $specs_by_name = mpull($specs, null, 'getName'); + $specs_by_short = mpull($specs, null, 'getShortAlias'); + unset($specs_by_short[null]); + + $argv = $this->argv; + $len = count($argv); + $is_initial = true; + for ($ii = 0; $ii < $len; $ii++) { + $arg = $argv[$ii]; + $map = null; + $options = null; + if (!is_string($arg)) { + // Non-string argument; pass it through as-is. + } else if ($arg == '--') { + // This indicates "end of flags". + break; + } else if ($arg == '-') { + // This is a normal argument (e.g., stdin). + continue; + } else if (!strncmp('--', $arg, 2)) { + $pre = '--'; + $arg = substr($arg, 2); + $map = $specs_by_name; + $options = array_keys($specs_by_name); + } else if (!strncmp('-', $arg, 1) && strlen($arg) > 1) { + $pre = '-'; + $arg = substr($arg, 1); + $map = $specs_by_short; + } else { + $is_initial = false; + } + + if ($map) { + $val = null; + $parts = explode('=', $arg, 2); + if (count($parts) == 2) { + list($arg, $val) = $parts; + } + + // Try to correct flag spelling for full flags, to allow users to make + // minor mistakes. + if ($correct_spelling && $options && !isset($map[$arg])) { + $corrections = PhutilArgumentSpellingCorrector::newFlagCorrector() + ->correctSpelling($arg, $options); + + if (count($corrections) == 1) { + $corrected = head($corrections); + + $this->logMessage( + tsprintf( + "%s\n", + pht( + '(Assuming "%s" is the British spelling of "%s".)', + $pre.$arg, + $pre.$corrected))); + + $arg = $corrected; + } + } + + if (isset($map[$arg])) { + if ($initial_only && !$is_initial) { + throw new PhutilArgumentUsageException( + pht( + 'Argument "%s" appears after the first non-flag argument. '. + 'This special argument must appear before other arguments.', + "{$pre}{$arg}")); + } + + $spec = $map[$arg]; + unset($argv[$ii]); + + $param_name = $spec->getParamName(); + if ($val !== null) { + if ($param_name === null) { + throw new PhutilArgumentUsageException( + pht( + "Argument '%s' does not take a parameter.", + "{$pre}{$arg}")); + } + } else { + if ($param_name !== null) { + if ($ii + 1 < $len) { + $val = $argv[$ii + 1]; + unset($argv[$ii + 1]); + $ii++; + } else { + throw new PhutilArgumentUsageException( + pht( + "Argument '%s' requires a parameter.", + "{$pre}{$arg}")); + } + } else { + $val = true; + } + } + + if (!$spec->getRepeatable()) { + if (array_key_exists($spec->getName(), $this->results)) { + throw new PhutilArgumentUsageException( + pht( + "Argument '%s' was provided twice.", + "{$pre}{$arg}")); + } + } + + $conflicts = $spec->getConflicts(); + foreach ($conflicts as $conflict => $reason) { + if (array_key_exists($conflict, $this->results)) { + + if (!is_string($reason) || !strlen($reason)) { + $reason = '.'; + } else { + $reason = ': '.$reason.'.'; + } + + throw new PhutilArgumentUsageException( + pht( + "Argument '%s' conflicts with argument '%s'%s", + "{$pre}{$arg}", + "--{$conflict}", + $reason)); + } + } + + if ($spec->getRepeatable()) { + if ($spec->getParamName() === null) { + if (empty($this->results[$spec->getName()])) { + $this->results[$spec->getName()] = 0; + } + $this->results[$spec->getName()]++; + } else { + $this->results[$spec->getName()][] = $val; + } + } else { + $this->results[$spec->getName()] = $val; + } + } + } + } + + foreach ($specs as $spec) { + if ($spec->getWildcard()) { + $this->results[$spec->getName()] = $this->filterWildcardArgv($argv); + $argv = array(); + break; + } + } + + $this->argv = array_values($argv); + return $this; + } + + + /** + * Parse and consume a list of arguments, throwing an exception if there is + * anything left unconsumed. This is like @{method:parsePartial}, but raises + * a {class:PhutilArgumentUsageException} if there are leftovers. + * + * Normally, you would call @{method:parse} instead, which emits a + * user-friendly error. You can also use @{method:printUsageException} to + * render the exception in a user-friendly way. + * + * @param list List of argument specs, see + * @{class:PhutilArgumentSpecification}. + * @return this + * @task parse + */ + public function parseFull(array $specs) { + $this->parseInternal($specs, true, false); + + if (count($this->argv)) { + $arg = head($this->argv); + throw new PhutilArgumentUsageException( + pht("Unrecognized argument '%s'.", $arg)); + } + + if ($this->showHelp) { + $this->printHelpAndExit(); + } + + return $this; + } + + + /** + * Parse and consume a list of arguments, raising a user-friendly error if + * anything remains. See also @{method:parseFull} and @{method:parsePartial}. + * + * @param list List of argument specs, see + * @{class:PhutilArgumentSpecification}. + * @return this + * @task parse + */ + public function parse(array $specs) { + try { + return $this->parseFull($specs); + } catch (PhutilArgumentUsageException $ex) { + $this->printUsageException($ex); + exit(self::PARSE_ERROR_CODE); + } + } + + + /** + * Parse and execute workflows, raising a user-friendly error if anything + * remains. See also @{method:parseWorkflowsFull}. + * + * See @{class:PhutilArgumentWorkflow} for details on using workflows. + * + * @param list List of argument specs, see + * @{class:PhutilArgumentSpecification}. + * @return this + * @task parse + */ + public function parseWorkflows(array $workflows) { + try { + return $this->parseWorkflowsFull($workflows); + } catch (PhutilArgumentUsageException $ex) { + $this->printUsageException($ex); + exit(self::PARSE_ERROR_CODE); + } + } + + + /** + * Select a workflow. For commands that may operate in several modes, like + * `arc`, the modes can be split into "workflows". Each workflow specifies + * the arguments it accepts. This method takes a list of workflows, selects + * the chosen workflow, parses its arguments, and either executes it (if it + * is executable) or returns it for handling. + * + * See @{class:PhutilArgumentWorkflow} for details on using workflows. + * + * @param list List of @{class:PhutilArgumentWorkflow}s. + * @return PhutilArgumentWorkflow|no Returns the chosen workflow if it is + * not executable, or executes it and + * exits with a return code if it is. + * @task parse + */ + public function parseWorkflowsFull(array $workflows) { + assert_instances_of($workflows, 'PhutilArgumentWorkflow'); + + // Clear out existing workflows. We need to do this to permit the + // construction of sub-workflows. + $this->workflows = array(); + + foreach ($workflows as $workflow) { + $name = $workflow->getName(); + + if ($name === null) { + throw new PhutilArgumentSpecificationException( + pht('Workflow has no name!')); + } + + if (isset($this->workflows[$name])) { + throw new PhutilArgumentSpecificationException( + pht("Two workflows with name '%s!", $name)); + } + + $this->workflows[$name] = $workflow; + } + + $argv = $this->argv; + if (empty($argv)) { + // TODO: this is kind of hacky / magical. + if (isset($this->workflows['help'])) { + $argv = array('help'); + } else { + throw new PhutilArgumentUsageException(pht('No workflow selected.')); + } + } + + $flow = array_shift($argv); + + if (empty($this->workflows[$flow])) { + $corrected = PhutilArgumentSpellingCorrector::newCommandCorrector() + ->correctSpelling($flow, array_keys($this->workflows)); + + if (count($corrected) == 1) { + $corrected = head($corrected); + + $this->logMessage( + tsprintf( + "%s\n", + pht( + '(Assuming "%s" is the British spelling of "%s".)', + $flow, + $corrected))); + + $flow = $corrected; + } else { + $this->raiseUnknownWorkflow($flow, $corrected); + } + } + + $workflow = $this->workflows[$flow]; + + if ($this->showHelp) { + // Make "cmd flow --help" behave like "cmd help flow", not "cmd help". + $help_flow = idx($this->workflows, 'help'); + if ($help_flow) { + if ($help_flow !== $workflow) { + $workflow = $help_flow; + $argv = array($flow); + + // Prevent parse() from dumping us back out to standard help. + $this->showHelp = false; + } + } else { + $this->printHelpAndExit(); + } + } + + $this->argv = array_values($argv); + + if ($workflow->shouldParsePartial()) { + $this->parsePartial($workflow->getArguments()); + } else { + $this->parse($workflow->getArguments()); + } + + + if ($workflow->isExecutable()) { + $workflow->setArgv($this); + $err = $workflow->execute($this); + exit($err); + } else { + return $workflow; + } + } + + + /** + * Parse "standard" arguments and apply their effects: + * + * --trace Enable service call tracing. + * --no-ansi Disable ANSI color/style sequences. + * --xprofile Write out an XHProf profile. + * --help Show help. + * + * @return this + * + * @phutil-external-symbol function xhprof_enable + */ + public function parseStandardArguments() { + try { + $this->parsePartial( + array( + array( + 'name' => 'trace', + 'help' => pht('Trace command execution and show service calls.'), + 'standard' => true, + ), + array( + 'name' => 'no-ansi', + 'help' => pht( + 'Disable ANSI terminal codes, printing plain text with '. + 'no color or style.'), + 'conflicts' => array( + 'ansi' => null, + ), + 'standard' => true, + ), + array( + 'name' => 'ansi', + 'help' => pht( + "Use formatting even in environments which probably ". + "don't support it."), + 'standard' => true, + ), + array( + 'name' => 'xprofile', + 'param' => 'profile', + 'help' => pht( + 'Profile script execution and write results to a file.'), + 'standard' => true, + ), + array( + 'name' => 'help', + 'short' => 'h', + 'help' => pht('Show this help.'), + 'standard' => true, + ), + array( + 'name' => 'show-standard-options', + 'help' => pht( + 'Show every option, including standard options like this one.'), + 'standard' => true, + ), + array( + 'name' => 'recon', + 'help' => pht('Start in remote console mode.'), + 'standard' => true, + ), + )); + } catch (PhutilArgumentUsageException $ex) { + $this->printUsageException($ex); + exit(self::PARSE_ERROR_CODE); + } + + if ($this->getArg('trace')) { + PhutilServiceProfiler::installEchoListener(); + self::$traceModeEnabled = true; + } + + if ($this->getArg('no-ansi')) { + PhutilConsoleFormatter::disableANSI(true); + } + + if ($this->getArg('ansi')) { + PhutilConsoleFormatter::disableANSI(false); + } + + if ($this->getArg('help')) { + $this->showHelp = true; + } + + $xprofile = $this->getArg('xprofile'); + if ($xprofile) { + if (!function_exists('xhprof_enable')) { + throw new Exception( + pht("To use '%s', you must install XHProf.", '--xprofile')); + } + + xhprof_enable(0); + register_shutdown_function(array($this, 'shutdownProfiler')); + } + + $recon = $this->getArg('recon'); + if ($recon) { + $remote_console = PhutilConsole::newRemoteConsole(); + $remote_console->beginRedirectOut(); + PhutilConsole::setConsole($remote_console); + } else if ($this->getArg('trace')) { + $server = new PhutilConsoleServer(); + $server->setEnableLog(true); + $console = PhutilConsole::newConsoleForServer($server); + PhutilConsole::setConsole($console); + } + + return $this; + } + + +/* -( Reading Arguments )-------------------------------------------------- */ + + + public function getArg($name) { + if (empty($this->specs[$name])) { + throw new PhutilArgumentSpecificationException( + pht("No specification exists for argument '%s'!", $name)); + } + + if (idx($this->results, $name) !== null) { + return $this->results[$name]; + } + + return $this->specs[$name]->getDefault(); + } + + public function getUnconsumedArgumentVector() { + return $this->argv; + } + + public function setUnconsumedArgumentVector(array $argv) { + $this->argv = $argv; + return $this; + } + + +/* -( Command Help )------------------------------------------------------- */ + + + public function setSynopsis($synopsis) { + $this->synopsis = $synopsis; + return $this; + } + + public function setTagline($tagline) { + $this->tagline = $tagline; + return $this; + } + + public function printHelpAndExit() { + echo $this->renderHelp(); + exit(self::PARSE_ERROR_CODE); + } + + public function renderHelp() { + $out = array(); + $more = array(); + + if ($this->bin) { + $out[] = $this->format('**%s**', pht('NAME')); + $name = $this->indent(6, '**%s**', basename($this->bin)); + if ($this->tagline) { + $name .= $this->format(' - '.$this->tagline); + } + $out[] = $name; + $out[] = null; + } + + if ($this->synopsis) { + $out[] = $this->format('**%s**', pht('SYNOPSIS')); + $out[] = $this->indent(6, $this->synopsis); + $out[] = null; + } + + if ($this->workflows) { + $has_help = false; + $out[] = $this->format('**%s**', pht('WORKFLOWS')); + $out[] = null; + $flows = $this->workflows; + ksort($flows); + foreach ($flows as $workflow) { + if ($workflow->getName() == 'help') { + $has_help = true; + } + $out[] = $this->renderWorkflowHelp( + $workflow->getName(), + $show_details = false); + } + if ($has_help) { + $more[] = pht( + 'Use **%s** __command__ for a detailed command reference.', 'help'); + } + } + + $specs = $this->renderArgumentSpecs($this->specs); + if ($specs) { + $out[] = $this->format('**%s**', pht('OPTION REFERENCE')); + $out[] = null; + $out[] = $specs; + } + + // If we have standard options but no --show-standard-options, print out + // a quick hint about it. + if (!empty($this->specs['show-standard-options']) && + !$this->getArg('show-standard-options')) { + $more[] = pht( + 'Use __%s__ to show additional options.', '--show-standard-options'); + } + + $out[] = null; + + if ($more) { + foreach ($more as $hint) { + $out[] = $this->indent(0, $hint); + } + $out[] = null; + } + + return implode("\n", $out); + } + + public function renderWorkflowHelp( + $workflow_name, + $show_details = false) { + + $out = array(); + + $indent = ($show_details ? 0 : 6); + + $workflow = idx($this->workflows, strtolower($workflow_name)); + if (!$workflow) { + $out[] = $this->indent( + $indent, + pht('There is no **%s** workflow.', $workflow_name)); + } else { + $out[] = $this->indent($indent, $workflow->getExamples()); + $out[] = $this->indent($indent, $workflow->getSynopsis()); + if ($show_details) { + $full_help = $workflow->getHelp(); + if ($full_help) { + $out[] = null; + $out[] = $this->indent($indent, $full_help); + } + $specs = $this->renderArgumentSpecs($workflow->getArguments()); + if ($specs) { + $out[] = null; + $out[] = $specs; + } + } + } + + $out[] = null; + + return implode("\n", $out); + } + + public function printUsageException(PhutilArgumentUsageException $ex) { + $message = tsprintf( + "**%s** %B\n", + pht('Usage Exception:'), + $ex->getMessage()); + + $this->logMessage($message); + } + + + private function logMessage($message) { + fwrite(STDERR, $message); + } + + +/* -( Internals )---------------------------------------------------------- */ + + + private function filterWildcardArgv(array $argv) { + foreach ($argv as $key => $value) { + if ($value == '--') { + unset($argv[$key]); + break; + } else if ( + is_string($value) && + !strncmp($value, '-', 1) && + strlen($value) > 1) { + + throw new PhutilArgumentUsageException( + pht( + "Argument '%s' is unrecognized. Use '%s' to indicate ". + "the end of flags.", + $value, + '--')); + } + } + return array_values($argv); + } + + private function mergeSpecs(array $specs) { + + $short_map = mpull($this->specs, null, 'getShortAlias'); + unset($short_map[null]); + + $wildcard = null; + foreach ($this->specs as $spec) { + if ($spec->getWildcard()) { + $wildcard = $spec; + break; + } + } + + foreach ($specs as $spec) { + $spec->validate(); + $name = $spec->getName(); + + if (isset($this->specs[$name])) { + throw new PhutilArgumentSpecificationException( + pht("Two argument specifications have the same name ('%s').", $name)); + } + + $short = $spec->getShortAlias(); + if ($short) { + if (isset($short_map[$short])) { + throw new PhutilArgumentSpecificationException( + pht( + "Two argument specifications have the same short alias ('%s').", + $short)); + } + $short_map[$short] = $spec; + } + + if ($spec->getWildcard()) { + if ($wildcard) { + throw new PhutilArgumentSpecificationException( + pht( + 'Two argument specifications are marked as wildcard arguments. '. + 'You can have a maximum of one wildcard argument.')); + } else { + $wildcard = $spec; + } + } + + $this->specs[$name] = $spec; + } + + foreach ($this->specs as $name => $spec) { + foreach ($spec->getConflicts() as $conflict => $reason) { + if (empty($this->specs[$conflict])) { + throw new PhutilArgumentSpecificationException( + pht( + "Argument '%s' conflicts with unspecified argument '%s'.", + $name, + $conflict)); + } + if ($conflict == $name) { + throw new PhutilArgumentSpecificationException( + pht("Argument '%s' conflicts with itself!", $name)); + } + } + } + + } + + private function renderArgumentSpecs(array $specs) { + foreach ($specs as $key => $spec) { + if ($spec->getWildcard()) { + unset($specs[$key]); + } + } + + $out = array(); + + $no_standard_options = + !empty($this->specs['show-standard-options']) && + !$this->getArg('show-standard-options'); + + $specs = msort($specs, 'getName'); + foreach ($specs as $spec) { + if ($spec->getStandard() && $no_standard_options) { + // If this is a standard argument and the user didn't pass + // --show-standard-options, skip it. + continue; + } + $name = $this->indent(6, '__--%s__', $spec->getName()); + $short = null; + if ($spec->getShortAlias()) { + $short = $this->format(', __-%s__', $spec->getShortAlias()); + } + if ($spec->getParamName()) { + $param = $this->format(' __%s__', $spec->getParamName()); + $name .= $param; + if ($short) { + $short .= $param; + } + } + $out[] = $name.$short; + $out[] = $this->indent(10, $spec->getHelp()); + $out[] = null; + } + + return implode("\n", $out); + } + + private function format($str /* , ... */) { + $args = func_get_args(); + return call_user_func_array( + 'phutil_console_format', + $args); + } + + private function indent($level, $str /* , ... */) { + $args = func_get_args(); + $args = array_slice($args, 1); + $text = call_user_func_array(array($this, 'format'), $args); + return phutil_console_wrap($text, $level); + } + + /** + * @phutil-external-symbol function xhprof_disable + */ + public function shutdownProfiler() { + $data = xhprof_disable(); + $data = json_encode($data); + Filesystem::writeFile($this->getArg('xprofile'), $data); + } + + public static function isTraceModeEnabled() { + return self::$traceModeEnabled; + } + + private function raiseUnknownWorkflow($flow, array $maybe) { + if ($maybe) { + sort($maybe); + + $maybe_list = id(new PhutilConsoleList()) + ->setWrap(false) + ->setBullet(null) + ->addItems($maybe) + ->drawConsoleString(); + + $message = tsprintf( + "%B\n%B", + pht( + 'Invalid command "%s". Did you mean:', + $flow), + $maybe_list); + } else { + $names = mpull($this->workflows, 'getName'); + sort($names); + + $message = tsprintf( + '%B', + pht( + 'Invalid command "%s". Valid commands are: %s.', + $flow, + implode(', ', $names))); + } + + if (isset($this->workflows['help'])) { + $binary = basename($this->bin); + $message = tsprintf( + "%B\n%s", + $message, + pht( + 'For details on available commands, run `%s`.', + "{$binary} help")); + } + + throw new PhutilArgumentUsageException($message); + } + +} diff --git a/src/parser/argument/PhutilArgumentSpecification.php b/src/parser/argument/PhutilArgumentSpecification.php new file mode 100644 --- /dev/null +++ b/src/parser/argument/PhutilArgumentSpecification.php @@ -0,0 +1,268 @@ + 'verbose', + * 'short' => 'v', + * )); + * + * Recognized keys and equivalent verbose methods are: + * + * name setName() + * help setHelp() + * short setShortAlias() + * param setParamName() + * default setDefault() + * conflicts setConflicts() + * wildcard setWildcard() + * repeat setRepeatable() + * + * @param dict Dictionary of quick parameter definitions. + * @return PhutilArgumentSpecification Constructed argument specification. + */ + public static function newQuickSpec(array $spec) { + $recognized_keys = array( + 'name', + 'help', + 'short', + 'param', + 'default', + 'conflicts', + 'wildcard', + 'repeat', + 'standard', + ); + + $unrecognized = array_diff_key( + $spec, + array_fill_keys($recognized_keys, true)); + + foreach ($unrecognized as $key => $ignored) { + throw new PhutilArgumentSpecificationException( + pht( + "Unrecognized key '%s' in argument specification. Recognized keys ". + "are: %s.", + $key, + implode(', ', $recognized_keys))); + } + + $obj = new PhutilArgumentSpecification(); + + foreach ($spec as $key => $value) { + switch ($key) { + case 'name': + $obj->setName($value); + break; + case 'help': + $obj->setHelp($value); + break; + case 'short': + $obj->setShortAlias($value); + break; + case 'param': + $obj->setParamName($value); + break; + case 'default': + $obj->setDefault($value); + break; + case 'conflicts': + $obj->setConflicts($value); + break; + case 'wildcard': + $obj->setWildcard($value); + break; + case 'repeat': + $obj->setRepeatable($value); + break; + case 'standard': + $obj->setStandard($value); + break; + } + } + + $obj->validate(); + + return $obj; + } + + public static function newSpecsFromList(array $specs) { + foreach ($specs as $key => $spec) { + if (is_array($spec)) { + $specs[$key] = self::newQuickSpec( + $spec); + } + } + return $specs; + } + + public function setName($name) { + self::validateName($name); + $this->name = $name; + return $this; + } + + private static function validateName($name) { + if (!preg_match('/^[a-z0-9][a-z0-9-]*$/', $name)) { + throw new PhutilArgumentSpecificationException( + pht( + "Argument names may only contain a-z, 0-9 and -, and must be ". + "at least one character long. '%s' is invalid.", + $name)); + } + } + + public function getName() { + return $this->name; + } + + public function setHelp($help) { + $this->help = $help; + return $this; + } + + public function getHelp() { + return $this->help; + } + + public function setShortAlias($short_alias) { + self::validateShortAlias($short_alias); + $this->shortAlias = $short_alias; + return $this; + } + + private static function validateShortAlias($alias) { + if (strlen($alias) !== 1) { + throw new PhutilArgumentSpecificationException( + pht( + "Argument short aliases must be exactly one character long. ". + "'%s' is invalid.", + $alias)); + } + if (!preg_match('/^[a-zA-Z0-9]$/', $alias)) { + throw new PhutilArgumentSpecificationException( + pht( + "Argument short aliases may only be in a-z, A-Z and 0-9. ". + "'%s' is invalid.", + $alias)); + } + } + + public function getShortAlias() { + return $this->shortAlias; + } + + public function setParamName($param_name) { + $this->paramName = $param_name; + return $this; + } + + public function getParamName() { + return $this->paramName; + } + + public function setDefault($default) { + $this->default = $default; + return $this; + } + + public function getDefault() { + if ($this->getParamName() === null) { + if ($this->getRepeatable()) { + return 0; + } else { + return false; + } + } else { + if ($this->getRepeatable()) { + return array(); + } else { + return $this->default; + } + } + } + + public function setConflicts(array $conflicts) { + $this->conflicts = $conflicts; + return $this; + } + + public function getConflicts() { + return $this->conflicts; + } + + public function setWildcard($wildcard) { + $this->wildcard = $wildcard; + return $this; + } + + public function getWildcard() { + return $this->wildcard; + } + + public function setRepeatable($repeatable) { + $this->repeatable = $repeatable; + return $this; + } + + public function getRepeatable() { + return $this->repeatable; + } + + public function setStandard($standard) { + $this->standard = $standard; + return $this; + } + + public function getStandard() { + return $this->standard; + } + + public function validate() { + if ($this->name === null) { + throw new PhutilArgumentSpecificationException( + pht("Argument specification MUST have a 'name'.")); + } + + if ($this->getWildcard()) { + if ($this->getParamName()) { + throw new PhutilArgumentSpecificationException( + pht('Wildcard arguments may not specify a parameter.')); + } + if ($this->getRepeatable()) { + throw new PhutilArgumentSpecificationException( + pht('Wildcard arguments may not be repeatable.')); + } + } + + if ($this->default !== null) { + if ($this->getRepeatable()) { + throw new PhutilArgumentSpecificationException( + pht( + 'Repeatable arguments may not have a default (always array() for '. + 'arguments which accept a parameter, or 0 for arguments which do '. + 'not).')); + } else if ($this->getParamName() === null) { + throw new PhutilArgumentSpecificationException( + pht('Flag arguments may not have a default (always false).')); + } + } + } + +} diff --git a/src/parser/argument/PhutilArgumentSpellingCorrector.php b/src/parser/argument/PhutilArgumentSpellingCorrector.php new file mode 100644 --- /dev/null +++ b/src/parser/argument/PhutilArgumentSpellingCorrector.php @@ -0,0 +1,132 @@ +setInsertCost(4) + ->setDeleteCost(4) + ->setReplaceCost(3) + ->setTransposeCost(2); + + return id(new self()) + ->setEditDistanceMatrix($matrix) + ->setMaximumDistance($max_distance); + } + + + /** + * Build a new corrector with parameters for correcting flags, like + * fixing "--nolint" into "--no-lint". + * + * @return PhutilArgumentSpellingCorrector Configured corrector. + */ + public static function newFlagCorrector() { + // When correcting flag spelling, we're stricter than we are when + // correcting command spelling: we allow only one inserted or deleted + // character. It is mainly to handle cases like "--no-lint" versus + // "--nolint" or "--reviewer" versus "--reviewers". + $max_distance = 1; + + $matrix = id(new PhutilEditDistanceMatrix()) + ->setInsertCost(1) + ->setDeleteCost(1) + ->setReplaceCost(10); + + return id(new self()) + ->setEditDistanceMatrix($matrix) + ->setMaximumDistance($max_distance); + } + + public function setEditDistanceMatrix(PhutilEditDistanceMatrix $matrix) { + $this->editDistanceMatrix = $matrix; + return $this; + } + + public function getEditDistanceMatrix() { + return $this->editDistanceMatrix; + } + + public function setMaximumDistance($maximum_distance) { + $this->maximumDistance = $maximum_distance; + return $this; + } + + public function getMaximumDistance() { + return $this->maximumDistance; + } + + public function correctSpelling($input, array $options) { + $matrix = $this->getEditDistanceMatrix(); + if (!$matrix) { + throw new PhutilInvalidStateException('setEditDistanceMatrix'); + } + + $max_distance = $this->getMaximumDistance(); + if (!$max_distance) { + throw new PhutilInvalidStateException('setMaximumDistance'); + } + + $input = $this->normalizeString($input); + foreach ($options as $key => $option) { + $options[$key] = $this->normalizeString($option); + } + + $distances = array(); + $inputv = phutil_utf8v($input); + foreach ($options as $option) { + $optionv = phutil_utf8v($option); + $matrix->setSequences($optionv, $inputv); + $distances[$option] = $matrix->getEditDistance(); + } + + asort($distances); + $best = min($max_distance, head($distances)); + foreach ($distances as $option => $distance) { + if ($distance > $best) { + unset($distances[$option]); + } + } + + // Before filtering, check if we have multiple equidistant matches and + // return them if we do. This prevents us from, e.g., matching "alnd" with + // both "land" and "amend", then dropping "land" for being too short, and + // incorrectly completing to "amend". + if (count($distances) > 1) { + return array_keys($distances); + } + + foreach ($distances as $option => $distance) { + if (phutil_utf8_strlen($option) < $distance) { + unset($distances[$option]); + } + } + + return array_keys($distances); + } + + private function normalizeString($string) { + return phutil_utf8_strtolower($string); + } + +} diff --git a/src/parser/argument/__tests__/PhutilArgumentParserTestCase.php b/src/parser/argument/__tests__/PhutilArgumentParserTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/argument/__tests__/PhutilArgumentParserTestCase.php @@ -0,0 +1,426 @@ + 'flag', + ), + ); + + $args = new PhutilArgumentParser(array('bin')); + $args->parseFull($specs); + $this->assertEqual(false, $args->getArg('flag')); + + $args = new PhutilArgumentParser(array('bin', '--flag')); + $args->parseFull($specs); + $this->assertEqual(true, $args->getArg('flag')); + } + + public function testWildcards() { + $specs = array( + array( + 'name' => 'flag', + ), + array( + 'name' => 'files', + 'wildcard' => true, + ), + ); + + $args = new PhutilArgumentParser(array('bin', '--flag', 'a', 'b')); + $args->parseFull($specs); + $this->assertEqual(true, $args->getArg('flag')); + $this->assertEqual( + array('a', 'b'), + $args->getArg('files')); + + $caught = null; + try { + $args = new PhutilArgumentParser(array('bin', '--derp', 'a', 'b')); + $args->parseFull($specs); + } catch (PhutilArgumentUsageException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + + $args = new PhutilArgumentParser(array('bin', '--', '--derp', 'a', 'b')); + $args->parseFull($specs); + $this->assertEqual( + array('--derp', 'a', 'b'), + $args->getArg('files')); + } + + public function testPartialParse() { + $specs = array( + array( + 'name' => 'flag', + ), + ); + + $args = new PhutilArgumentParser(array('bin', 'a', '--flag', '--', 'b')); + $args->parsePartial($specs); + + $this->assertEqual( + array('a', '--', 'b'), + $args->getUnconsumedArgumentVector()); + } + + public function testBadArg() { + $args = new PhutilArgumentParser(array('bin')); + $args->parseFull(array()); + + $caught = null; + try { + $args->getArg('flag'); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testDuplicateNames() { + $args = new PhutilArgumentParser(array('bin')); + $caught = null; + try { + $args->parseFull( + array( + array( + 'name' => 'x', + ), + array( + 'name' => 'x', + ), + )); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testDuplicateNamesWithParsePartial() { + $args = new PhutilArgumentParser(array('bin')); + $caught = null; + try { + $args->parsePartial( + array( + array( + 'name' => 'x', + ), + )); + $args->parsePartial( + array( + array( + 'name' => 'x', + ), + )); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testDuplicateShortAliases() { + $args = new PhutilArgumentParser(array('bin')); + $caught = null; + try { + $args->parseFull( + array( + array( + 'name' => 'x', + 'short' => 'x', + ), + array( + 'name' => 'y', + 'short' => 'x', + ), + )); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testDuplicateWildcards() { + $args = new PhutilArgumentParser(array('bin')); + $caught = null; + try { + $args->parseFull( + array( + array( + 'name' => 'x', + 'wildcard' => true, + ), + array( + 'name' => 'y', + 'wildcard' => true, + ), + )); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testDuplicatePartialWildcards() { + $args = new PhutilArgumentParser(array('bin')); + $caught = null; + try { + $args->parsePartial( + array( + array( + 'name' => 'x', + 'wildcard' => true, + ), + )); + $args->parsePartial( + array( + array( + 'name' => 'y', + 'wildcard' => true, + ), + )); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testConflictSpecificationWithUnrecognizedArg() { + $args = new PhutilArgumentParser(array('bin')); + $caught = null; + try { + $args->parseFull( + array( + array( + 'name' => 'x', + 'conflicts' => array( + 'y' => true, + ), + ), + )); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testConflictSpecificationWithSelf() { + $args = new PhutilArgumentParser(array('bin')); + $caught = null; + try { + $args->parseFull( + array( + array( + 'name' => 'x', + 'conflicts' => array( + 'x' => true, + ), + ), + )); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testUnrecognizedFlag() { + $args = new PhutilArgumentParser(array('bin', '--flag')); + $caught = null; + try { + $args->parseFull(array()); + } catch (PhutilArgumentUsageException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testDuplicateFlag() { + $args = new PhutilArgumentParser(array('bin', '--flag', '--flag')); + $caught = null; + try { + $args->parseFull( + array( + array( + 'name' => 'flag', + ), + )); + } catch (PhutilArgumentUsageException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testMissingParameterValue() { + $args = new PhutilArgumentParser(array('bin', '--with')); + $caught = null; + try { + $args->parseFull( + array( + array( + 'name' => 'with', + 'param' => 'stuff', + ), + )); + } catch (PhutilArgumentUsageException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testExtraParameterValue() { + $args = new PhutilArgumentParser(array('bin', '--true=apple')); + $caught = null; + try { + $args->parseFull( + array( + array( + 'name' => 'true', + ), + )); + } catch (PhutilArgumentUsageException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testConflictParameterValue() { + $args = new PhutilArgumentParser(array('bin', '--true', '--false')); + $caught = null; + try { + $args->parseFull( + array( + array( + 'name' => 'true', + 'conflicts' => array( + 'false' => true, + ), + ), + array( + 'name' => 'false', + 'conflicts' => array( + 'true' => true, + ), + ), + )); + } catch (PhutilArgumentUsageException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + + public function testParameterValues() { + $specs = array( + array( + 'name' => 'a', + 'param' => 'value', + ), + array( + 'name' => 'b', + 'param' => 'value', + ), + array( + 'name' => 'cee', + 'short' => 'c', + 'param' => 'value', + ), + array( + 'name' => 'dee', + 'short' => 'd', + 'param' => 'value', + ), + ); + + $args = new PhutilArgumentParser( + array( + 'bin', + '--a', + 'a', + '--b=b', + '-c', + 'c', + '-d=d', + )); + $args->parseFull($specs); + + $this->assertEqual('a', $args->getArg('a')); + $this->assertEqual('b', $args->getArg('b')); + $this->assertEqual('c', $args->getArg('cee')); + $this->assertEqual('d', $args->getArg('dee')); + } + + public function testStdinValidParameter() { + $specs = array( + array( + 'name' => 'file', + 'param' => 'file', + ), + ); + + $args = new PhutilArgumentParser( + array( + 'bin', + '-', + '--file', + '-', + )); + $args->parsePartial($specs); + + $this->assertEqual('-', $args->getArg('file')); + } + + public function testRepeatableFlag() { + $specs = array( + array( + 'name' => 'verbose', + 'short' => 'v', + 'repeat' => true, + ), + ); + + $args = new PhutilArgumentParser(array('bin', '-v', '-v', '-v')); + $args->parseFull($specs); + + $this->assertEqual(3, $args->getArg('verbose')); + } + + public function testRepeatableParam() { + $specs = array( + array( + 'name' => 'eat', + 'param' => 'fruit', + 'repeat' => true, + ), + ); + + $args = new PhutilArgumentParser(array( + 'bin', + '--eat', + 'apple', + '--eat', + 'pear', + '--eat=orange', + )); + $args->parseFull($specs); + + $this->assertEqual( + array('apple', 'pear', 'orange'), + $args->getArg('eat')); + } + +} diff --git a/src/parser/argument/__tests__/PhutilArgumentSpecificationTestCase.php b/src/parser/argument/__tests__/PhutilArgumentSpecificationTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/argument/__tests__/PhutilArgumentSpecificationTestCase.php @@ -0,0 +1,142 @@ + true, + 'xx' => true, + '!' => false, + 'XX' => false, + '1=' => false, + '--' => false, + + 'no-stuff' => true, + '-stuff' => false, + ); + + foreach ($names as $name => $valid) { + $caught = null; + try { + PhutilArgumentSpecification::newQuickSpec( + array( + 'name' => $name, + )); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + $this->assertEqual( + !$valid, + $caught instanceof Exception, + pht("Argument name '%s'.", $name)); + } + } + + public function testAliases() { + $aliases = array( + 'a' => true, + '1' => true, + + 'no' => false, + '-' => false, + '_' => false, + ' ' => false, + '' => false, + ); + + foreach ($aliases as $alias => $valid) { + $caught = null; + try { + PhutilArgumentSpecification::newQuickSpec( + array( + 'name' => 'example', + 'short' => $alias, + )); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + $this->assertEqual( + !$valid, + $caught instanceof Exception, + pht("Arg alias '%s'.", $alias)); + } + } + + public function testSpecs() { + $good_specs = array( + array( + 'name' => 'verbose', + ), + array( + 'name' => 'verbose', + 'short' => 'v', + 'help' => 'Derp.', + 'param' => 'level', + 'default' => 'y', + 'conflicts' => array( + 'quiet' => true, + ), + 'wildcard' => false, + ), + array( + 'name' => 'files', + 'wildcard' => true, + ), + ); + + $bad_specs = array( + array( + ), + array( + 'alias' => 'v', + ), + array( + 'name' => 'derp', + 'fruit' => 'apple', + ), + array( + 'name' => 'x', + 'default' => 'y', + ), + array( + 'name' => 'x', + 'param' => 'y', + 'default' => 'z', + 'repeat' => true, + ), + array( + 'name' => 'x', + 'wildcard' => true, + 'repeat' => true, + ), + array( + 'name' => 'x', + 'param' => 'y', + 'wildcard' => true, + ), + + ); + + $cases = array( + array(true, $good_specs), + array(false, $bad_specs), + ); + + foreach ($cases as $case) { + list($expect, $specs) = $case; + foreach ($specs as $spec) { + $caught = null; + try { + PhutilArgumentSpecification::newQuickSpec($spec); + } catch (PhutilArgumentSpecificationException $ex) { + $caught = $ex; + } + $this->assertEqual( + !$expect, + $caught instanceof Exception, + pht('Spec validity for: %s', print_r($spec, true))); + } + } + } + +} diff --git a/src/parser/argument/__tests__/PhutilArgumentSpellingCorrectorTestCase.php b/src/parser/argument/__tests__/PhutilArgumentSpellingCorrectorTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/argument/__tests__/PhutilArgumentSpellingCorrectorTestCase.php @@ -0,0 +1,94 @@ +assertCommandCorrection( + array('land'), + 'alnd', + array('land', 'amend')); + + $this->assertCommandCorrection( + array('branch'), + 'brnach', + array('branch', 'browse')); + + $this->assertCommandCorrection( + array(), + 'test', + array('list', 'unit')); + + $this->assertCommandCorrection( + array('list'), + 'lists', + array('list')); + + $this->assertCommandCorrection( + array('diff'), + 'dfif', + array('diff')); + + $this->assertCommandCorrection( + array('unit'), + 'uint', + array('unit', 'lint', 'list')); + + $this->assertCommandCorrection( + array('list', 'lint'), + 'nilt', + array('unit', 'lint', 'list')); + } + + private function assertCommandCorrection($expect, $input, $commands) { + $result = PhutilArgumentSpellingCorrector::newCommandCorrector() + ->correctSpelling($input, $commands); + + sort($result); + sort($expect); + + $commands = implode(', ', $commands); + + $this->assertEqual( + $expect, + $result, + pht('Correction of %s against: %s', $input, $commands)); + } + + public function testFlagCorrection() { + $this->assertFlagCorrection( + array('nolint'), + 'no-lint', + array('nolint', 'nounit')); + + $this->assertFlagCorrection( + array('reviewers'), + 'reviewer', + array('reviewers', 'cc')); + + $this->assertFlagCorrection( + array(), + 'onlint', + array('nolint')); + + $this->assertFlagCorrection( + array(), + 'nolind', + array('nolint')); + } + + private function assertFlagCorrection($expect, $input, $flags) { + $result = PhutilArgumentSpellingCorrector::newFlagCorrector() + ->correctSpelling($input, $flags); + + sort($result); + sort($expect); + + $flags = implode(', ', $flags); + + $this->assertEqual( + $expect, + $result, + pht('Correction of %s against: %s', $input, $flags)); + } + +} diff --git a/src/parser/argument/exception/PhutilArgumentParserException.php b/src/parser/argument/exception/PhutilArgumentParserException.php new file mode 100644 --- /dev/null +++ b/src/parser/argument/exception/PhutilArgumentParserException.php @@ -0,0 +1,3 @@ +setTagline('simple calculator example'); + * $args->setSynopsis(<<setName('add') + * ->setExamples('**add** __n__ ...') + * ->setSynopsis('Compute the sum of a list of numbers.') + * ->setArguments( + * array( + * array( + * 'name' => 'numbers', + * 'wildcard' => true, + * ), + * )); + * + * $mul_workflow = id(new PhutilArgumentWorkflow()) + * ->setName('mul') + * ->setExamples('**mul** __n__ ...') + * ->setSynopsis('Compute the product of a list of numbers.') + * ->setArguments( + * array( + * array( + * 'name' => 'numbers', + * 'wildcard' => true, + * ), + * )); + * + * $flow = $args->parseWorkflows( + * array( + * $add_workflow, + * $mul_workflow, + * new PhutilHelpArgumentWorkflow(), + * )); + * + * $nums = $args->getArg('numbers'); + * if (empty($nums)) { + * echo "You must provide one or more numbers!\n"; + * exit(1); + * } + * + * foreach ($nums as $num) { + * if (!is_numeric($num)) { + * echo "Number '{$num}' is not numeric!\n"; + * exit(1); + * } + * } + * + * switch ($flow->getName()) { + * case 'add': + * echo array_sum($nums)."\n"; + * break; + * case 'mul': + * echo array_product($nums)."\n"; + * break; + * } + * + * You can also subclass this class and return `true` from + * @{method:isExecutable}. In this case, the parser will automatically select + * your workflow when the user invokes it. + * + * @concrete-extensible + */ +class PhutilArgumentWorkflow extends Phobject { + + private $name; + private $synopsis; + private $specs = array(); + private $examples; + private $help; + private $argv; + + final public function __construct() { + $this->didConstruct(); + } + + public function setName($name) { + $this->name = $name; + return $this; + } + + public function getName() { + return $this->name; + } + + /** + * Provide brief usage examples of common calling conventions, like: + * + * $workflow->setExamples("**delete** __file__ [__options__]"); + * + * This text is shown in both brief and detailed help, and should give the + * user a quick reference for common uses. You can separate several common + * uses with newlines, but usually should not provide more than 2-3 examples. + */ + final public function setExamples($examples) { + $this->examples = $examples; + return $this; + } + + final public function getExamples() { + if (!$this->examples) { + return '**'.$this->name.'**'; + } + return $this->examples; + } + + /** + * Provide a brief description of the command, like "Delete a file.". + * + * This text is shown in both brief and detailed help, and should give the + * user a general idea of what the workflow does. + */ + final public function setSynopsis($synopsis) { + $this->synopsis = $synopsis; + return $this; + } + + final public function getSynopsis() { + return $this->synopsis; + } + + + /** + * Provide a full explanation of the command. This text is shown only in + * detailed help. + */ + final public function getHelp() { + return $this->help; + } + + final public function setHelp($help) { + $this->help = $help; + return $this; + } + + final public function setArguments(array $specs) { + $specs = PhutilArgumentSpecification::newSpecsFromList($specs); + $this->specs = $specs; + return $this; + } + + final public function getArguments() { + return $this->specs; + } + + final public function setArgv(PhutilArgumentParser $argv) { + $this->argv = $argv; + return $this; + } + + final public function getArgv() { + return $this->argv; + } + + protected function didConstruct() { + return null; + } + + public function isExecutable() { + return false; + } + + public function execute(PhutilArgumentParser $args) { + throw new Exception(pht("This workflow isn't executable!")); + } + + /** + * Normally, workflow arguments are parsed fully, so unexpected arguments will + * raise an error. You can return `true` from this method to parse workflow + * arguments only partially. This will allow you to manually parse remaining + * arguments or delegate to a second level of workflows. + * + * @return bool True to partially parse workflow arguments (default false). + */ + public function shouldParsePartial() { + return false; + } + +} diff --git a/src/parser/argument/workflow/PhutilHelpArgumentWorkflow.php b/src/parser/argument/workflow/PhutilHelpArgumentWorkflow.php new file mode 100644 --- /dev/null +++ b/src/parser/argument/workflow/PhutilHelpArgumentWorkflow.php @@ -0,0 +1,45 @@ +setName('help'); + $this->setExamples(<<setSynopsis(<<setArguments( + array( + array( + 'name' => 'help-with-what', + 'wildcard' => true, + ), + )); + } + + public function isExecutable() { + return true; + } + + public function execute(PhutilArgumentParser $args) { + $with = $args->getArg('help-with-what'); + + if (!$with) { + $args->printHelpAndExit(); + } else { + foreach ($with as $thing) { + echo phutil_console_format( + "**%s**\n\n", + pht('%s WORKFLOW', strtoupper($thing))); + echo $args->renderWorkflowHelp($thing, $show_flags = true); + echo "\n"; + } + exit(PhutilArgumentParser::PARSE_ERROR_CODE); + } + } + +} diff --git a/src/parser/calendar/data/PhutilCalendarAbsoluteDateTime.php b/src/parser/calendar/data/PhutilCalendarAbsoluteDateTime.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/PhutilCalendarAbsoluteDateTime.php @@ -0,0 +1,287 @@ +\d{4})(?P\d{2})(?P\d{2})'. + '(?:'. + 'T(?P\d{2})(?P\d{2})(?P\d{2})(?Z)?'. + ')?'. + '\z/'; + + $matches = null; + $ok = preg_match($pattern, $value, $matches); + if (!$ok) { + throw new Exception( + pht( + 'Expected ISO8601 datetime in the format "19990105T112233Z", '. + 'found "%s".', + $value)); + } + + if (isset($matches['z'])) { + if ($timezone != 'UTC') { + throw new Exception( + pht( + 'ISO8601 date ends in "Z" indicating UTC, but a timezone other '. + 'than UTC ("%s") was specified.', + $timezone)); + } + } + + $datetime = id(new self()) + ->setYear((int)$matches['y']) + ->setMonth((int)$matches['m']) + ->setDay((int)$matches['d']) + ->setTimezone($timezone); + + if (isset($matches['h'])) { + $datetime + ->setHour((int)$matches['h']) + ->setMinute((int)$matches['i']) + ->setSecond((int)$matches['s']); + } else { + $datetime + ->setIsAllDay(true); + } + + return $datetime; + } + + public static function newFromEpoch($epoch, $timezone = 'UTC') { + $date = new DateTime('@'.$epoch); + + $zone = new DateTimeZone($timezone); + $date->setTimezone($zone); + + return id(new self()) + ->setYear((int)$date->format('Y')) + ->setMonth((int)$date->format('m')) + ->setDay((int)$date->format('d')) + ->setHour((int)$date->format('H')) + ->setMinute((int)$date->format('i')) + ->setSecond((int)$date->format('s')) + ->setTimezone($timezone); + } + + public static function newFromDictionary(array $dict) { + static $keys; + if ($keys === null) { + $keys = array_fuse( + array( + 'kind', + 'year', + 'month', + 'day', + 'hour', + 'minute', + 'second', + 'timezone', + 'isAllDay', + )); + } + + foreach ($dict as $key => $value) { + if (!isset($keys[$key])) { + throw new Exception( + pht( + 'Unexpected key "%s" in datetime dictionary, expected keys: %s.', + $key, + implode(', ', array_keys($keys)))); + } + } + + if (idx($dict, 'kind') !== 'absolute') { + throw new Exception( + pht( + 'Expected key "%s" with value "%s" in datetime dictionary.', + 'kind', + 'absolute')); + } + + if (!isset($dict['year'])) { + throw new Exception( + pht( + 'Expected key "%s" in datetime dictionary.', + 'year')); + } + + $datetime = id(new self()) + ->setYear(idx($dict, 'year')) + ->setMonth(idx($dict, 'month', 1)) + ->setDay(idx($dict, 'day', 1)) + ->setHour(idx($dict, 'hour', 0)) + ->setMinute(idx($dict, 'minute', 0)) + ->setSecond(idx($dict, 'second', 0)) + ->setTimezone(idx($dict, 'timezone')) + ->setIsAllDay((bool)idx($dict, 'isAllDay', false)); + + return $datetime; + } + + public function newRelativeDateTime($duration) { + if (is_string($duration)) { + $duration = PhutilCalendarDuration::newFromISO8601($duration); + } + + if (!($duration instanceof PhutilCalendarDuration)) { + throw new Exception( + pht( + 'Expected "PhutilCalendarDuration" object or ISO8601 duration '. + 'string.')); + } + + return id(new PhutilCalendarRelativeDateTime()) + ->setOrigin($this) + ->setDuration($duration); + } + + public function toDictionary() { + return array( + 'kind' => 'absolute', + 'year' => (int)$this->getYear(), + 'month' => (int)$this->getMonth(), + 'day' => (int)$this->getDay(), + 'hour' => (int)$this->getHour(), + 'minute' => (int)$this->getMinute(), + 'second' => (int)$this->getSecond(), + 'timezone' => $this->getTimezone(), + 'isAllDay' => (bool)$this->getIsAllDay(), + ); + } + + public function setYear($year) { + $this->year = $year; + return $this; + } + + public function getYear() { + return $this->year; + } + + public function setMonth($month) { + $this->month = $month; + return $this; + } + + public function getMonth() { + return $this->month; + } + + public function setDay($day) { + $this->day = $day; + return $this; + } + + public function getDay() { + return $this->day; + } + + public function setHour($hour) { + $this->hour = $hour; + return $this; + } + + public function getHour() { + return $this->hour; + } + + public function setMinute($minute) { + $this->minute = $minute; + return $this; + } + + public function getMinute() { + return $this->minute; + } + + public function setSecond($second) { + $this->second = $second; + return $this; + } + + public function getSecond() { + return $this->second; + } + + public function setTimezone($timezone) { + $this->timezone = $timezone; + return $this; + } + + public function getTimezone() { + return $this->timezone; + } + + private function getEffectiveTimezone() { + $date_timezone = $this->getTimezone(); + $viewer_timezone = $this->getViewerTimezone(); + + // Because all-day events are always "floating", the effective timezone + // is the viewer timezone if it is available. Otherwise, we'll return a + // DateTime object with the correct values, but it will be incorrectly + // adjusted forward or backward to the viewer's zone later. + + $zones = array(); + if ($this->getIsAllDay()) { + $zones[] = $viewer_timezone; + $zones[] = $date_timezone; + } else { + $zones[] = $date_timezone; + $zones[] = $viewer_timezone; + } + $zones = array_filter($zones); + + if (!$zones) { + throw new Exception( + pht( + 'Datetime has no timezone or viewer timezone.')); + } + + return head($zones); + } + + public function newPHPDateTimeZone() { + $zone = $this->getEffectiveTimezone(); + return new DateTimeZone($zone); + } + + public function newPHPDateTime() { + $zone = $this->newPHPDateTimeZone(); + + $y = $this->getYear(); + $m = $this->getMonth(); + $d = $this->getDay(); + + if ($this->getIsAllDay()) { + $h = 0; + $i = 0; + $s = 0; + } else { + $h = $this->getHour(); + $i = $this->getMinute(); + $s = $this->getSecond(); + } + + $format = sprintf('%04d-%02d-%02d %02d:%02d:%02d', $y, $m, $d, $h, $i, $s); + + return new DateTime($format, $zone); + } + + + public function newAbsoluteDateTime() { + return clone $this; + } + +} diff --git a/src/parser/calendar/data/PhutilCalendarContainerNode.php b/src/parser/calendar/data/PhutilCalendarContainerNode.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/PhutilCalendarContainerNode.php @@ -0,0 +1,30 @@ +children; + } + + final public function getChildrenOfType($type) { + $result = array(); + + foreach ($this->getChildren() as $key => $child) { + if ($child->getNodeType() != $type) { + continue; + } + $result[$key] = $child; + } + + return $result; + } + + final public function appendChild(PhutilCalendarNode $node) { + $this->children[] = $node; + return $this; + } + +} diff --git a/src/parser/calendar/data/PhutilCalendarDateTime.php b/src/parser/calendar/data/PhutilCalendarDateTime.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/PhutilCalendarDateTime.php @@ -0,0 +1,54 @@ +viewerTimezone = $viewer_timezone; + return $this; + } + + public function getViewerTimezone() { + return $this->viewerTimezone; + } + + public function setIsAllDay($is_all_day) { + $this->isAllDay = $is_all_day; + return $this; + } + + public function getIsAllDay() { + return $this->isAllDay; + } + + public function getEpoch() { + $datetime = $this->newPHPDateTime(); + return (int)$datetime->format('U'); + } + + public function getISO8601() { + $datetime = $this->newPHPDateTime(); + + if ($this->getIsAllDay()) { + return $datetime->format('Ymd'); + } else if ($this->getTimezone()) { + // With a timezone, the event occurs at a specific second universally. + // We return the UTC representation of that point in time. + $datetime->setTimezone(new DateTimeZone('UTC')); + return $datetime->format('Ymd\\THis\\Z'); + } else { + // With no timezone, events are "floating" and occur at local time. + // We return a representation without the "Z". + return $datetime->format('Ymd\\THis'); + } + } + + abstract public function newPHPDateTimeZone(); + abstract public function newPHPDateTime(); + abstract public function newAbsoluteDateTime(); + + abstract public function getTimezone(); +} diff --git a/src/parser/calendar/data/PhutilCalendarDocumentNode.php b/src/parser/calendar/data/PhutilCalendarDocumentNode.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/PhutilCalendarDocumentNode.php @@ -0,0 +1,12 @@ +getChildrenOfType(PhutilCalendarEventNode::NODETYPE); + } + +} diff --git a/src/parser/calendar/data/PhutilCalendarDuration.php b/src/parser/calendar/data/PhutilCalendarDuration.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/PhutilCalendarDuration.php @@ -0,0 +1,181 @@ + $value) { + if (!isset($keys[$key])) { + throw new Exception( + pht( + 'Unexpected key "%s" in duration dictionary, expected keys: %s.', + $key, + implode(', ', array_keys($keys)))); + } + } + + $duration = id(new self()) + ->setIsNegative(idx($dict, 'isNegative', false)) + ->setWeeks(idx($dict, 'weeks', 0)) + ->setDays(idx($dict, 'days', 0)) + ->setHours(idx($dict, 'hours', 0)) + ->setMinutes(idx($dict, 'minutes', 0)) + ->setSeconds(idx($dict, 'seconds', 0)); + + return $duration; + } + + public function toDictionary() { + return array( + 'isNegative' => $this->getIsNegative(), + 'weeks' => $this->getWeeks(), + 'days' => $this->getDays(), + 'hours' => $this->getHours(), + 'minutes' => $this->getMinutes(), + 'seconds' => $this->getSeconds(), + ); + } + + public static function newFromISO8601($value) { + $pattern = + '/^'. + '(?P[+-])?'. + 'P'. + '(?:'. + '(?P\d+)W'. + '|'. + '(?:(?:(?P\d+)D)?'. + '(?:T(?:(?P\d+)H)?(?:(?P\d+)M)?(?:(?P\d+)S)?)?'. + ')'. + ')'. + '\z/'; + + $matches = null; + $ok = preg_match($pattern, $value, $matches); + if (!$ok) { + throw new Exception( + pht( + 'Expected ISO8601 duration in the format "P12DT3H4M5S", found '. + '"%s".', + $value)); + } + + $is_negative = (idx($matches, 'sign') == '-'); + + return id(new self()) + ->setIsNegative($is_negative) + ->setWeeks((int)idx($matches, 'W', 0)) + ->setDays((int)idx($matches, 'D', 0)) + ->setHours((int)idx($matches, 'H', 0)) + ->setMinutes((int)idx($matches, 'M', 0)) + ->setSeconds((int)idx($matches, 'S', 0)); + } + + public function toISO8601() { + $parts = array(); + $parts[] = 'P'; + + $weeks = $this->getWeeks(); + if ($weeks) { + $parts[] = $weeks.'W'; + } else { + $days = $this->getDays(); + if ($days) { + $parts[] = $days.'D'; + } + + $parts[] = 'T'; + + $hours = $this->getHours(); + if ($hours) { + $parts[] = $hours.'H'; + } + + $minutes = $this->getMinutes(); + if ($minutes) { + $parts[] = $minutes.'M'; + } + + $seconds = $this->getSeconds(); + if ($seconds) { + $parts[] = $seconds.'S'; + } + } + + return implode('', $parts); + } + + public function setIsNegative($is_negative) { + $this->isNegative = $is_negative; + return $this; + } + + public function getIsNegative() { + return $this->isNegative; + } + + public function setWeeks($weeks) { + $this->weeks = $weeks; + return $this; + } + + public function getWeeks() { + return $this->weeks; + } + + public function setDays($days) { + $this->days = $days; + return $this; + } + + public function getDays() { + return $this->days; + } + + public function setHours($hours) { + $this->hours = $hours; + return $this; + } + + public function getHours() { + return $this->hours; + } + + public function setMinutes($minutes) { + $this->minutes = $minutes; + return $this; + } + + public function getMinutes() { + return $this->minutes; + } + + public function setSeconds($seconds) { + $this->seconds = $seconds; + return $this; + } + + public function getSeconds() { + return $this->seconds; + } + +} diff --git a/src/parser/calendar/data/PhutilCalendarEventNode.php b/src/parser/calendar/data/PhutilCalendarEventNode.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/PhutilCalendarEventNode.php @@ -0,0 +1,172 @@ +uid = $uid; + return $this; + } + + public function getUID() { + return $this->uid; + } + + public function setName($name) { + $this->name = $name; + return $this; + } + + public function getName() { + return $this->name; + } + + public function setDescription($description) { + $this->description = $description; + return $this; + } + + public function getDescription() { + return $this->description; + } + + public function setStartDateTime(PhutilCalendarDateTime $start) { + $this->startDateTime = $start; + return $this; + } + + public function getStartDateTime() { + return $this->startDateTime; + } + + public function setEndDateTime(PhutilCalendarDateTime $end) { + $this->endDateTime = $end; + return $this; + } + + public function getEndDateTime() { + $end = $this->endDateTime; + if ($end) { + return $end; + } + + $start = $this->getStartDateTime(); + $duration = $this->getDuration(); + if ($start && $duration) { + return id(new PhutilCalendarRelativeDateTime()) + ->setOrigin($start) + ->setDuration($duration); + } + + // If no end date or duration are specified, the event is instantaneous. + return $start; + } + + public function setDuration(PhutilCalendarDuration $duration) { + $this->duration = $duration; + return $this; + } + + public function getDuration() { + return $this->duration; + } + + public function setCreatedDateTime(PhutilCalendarDateTime $created) { + $this->createdDateTime = $created; + return $this; + } + + public function getCreatedDateTime() { + return $this->createdDateTime; + } + + public function setModifiedDateTime(PhutilCalendarDateTime $modified) { + $this->modifiedDateTime = $modified; + return $this; + } + + public function getModifiedDateTime() { + return $this->modifiedDateTime; + } + + public function setOrganizer(PhutilCalendarUserNode $organizer) { + $this->organizer = $organizer; + return $this; + } + + public function getOrganizer() { + return $this->organizer; + } + + public function setAttendees(array $attendees) { + assert_instances_of($attendees, 'PhutilCalendarUserNode'); + $this->attendees = $attendees; + return $this; + } + + public function getAttendees() { + return $this->attendees; + } + + public function addAttendee(PhutilCalendarUserNode $attendee) { + $this->attendees[] = $attendee; + return $this; + } + + public function setRecurrenceRule( + PhutilCalendarRecurrenceRule $recurrence_rule) { + $this->recurrenceRule = $recurrence_rule; + return $this; + } + + public function getRecurrenceRule() { + return $this->recurrenceRule; + } + + public function setRecurrenceExceptions(array $recurrence_exceptions) { + assert_instances_of($recurrence_exceptions, 'PhutilCalendarDateTime'); + $this->recurrenceExceptions = $recurrence_exceptions; + return $this; + } + + public function getRecurrenceExceptions() { + return $this->recurrenceExceptions; + } + + public function setRecurrenceDates(array $recurrence_dates) { + assert_instances_of($recurrence_dates, 'PhutilCalendarDateTime'); + $this->recurrenceDates = $recurrence_dates; + return $this; + } + + public function getRecurrenceDates() { + return $this->recurrenceDates; + } + + public function setRecurrenceID($recurrence_id) { + $this->recurrenceID = $recurrence_id; + return $this; + } + + public function getRecurrenceID() { + return $this->recurrenceID; + } + +} diff --git a/src/parser/calendar/data/PhutilCalendarNode.php b/src/parser/calendar/data/PhutilCalendarNode.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/PhutilCalendarNode.php @@ -0,0 +1,20 @@ +getPhobjectClassConstant('NODETYPE'); + } + + final public function setAttribute($key, $value) { + $this->attributes[$key] = $value; + return $this; + } + + final public function getAttribute($key, $default = null) { + return idx($this->attributes, $key, $default); + } + +} diff --git a/src/parser/calendar/data/PhutilCalendarProxyDateTime.php b/src/parser/calendar/data/PhutilCalendarProxyDateTime.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/PhutilCalendarProxyDateTime.php @@ -0,0 +1,51 @@ +proxy = $proxy; + return $this; + } + + final protected function getProxy() { + return $this->proxy; + } + + public function __clone() { + $this->proxy = clone $this->proxy; + } + + public function setViewerTimezone($timezone) { + $this->getProxy()->setViewerTimezone($timezone); + return $this; + } + + public function getViewerTimezone() { + return $this->getProxy()->getViewerTimezone(); + } + + public function setIsAllDay($is_all_day) { + $this->getProxy()->setIsAllDay($is_all_day); + return $this; + } + + public function getIsAllDay() { + return $this->getProxy()->getIsAllDay(); + } + + public function newPHPDateTimezone() { + return $this->getProxy()->newPHPDateTimezone(); + } + + public function newPHPDateTime() { + return $this->getProxy()->newPHPDateTime(); + } + + public function getTimezone() { + return $this->getProxy()->getTimezone(); + } + +} diff --git a/src/parser/calendar/data/PhutilCalendarRawNode.php b/src/parser/calendar/data/PhutilCalendarRawNode.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/PhutilCalendarRawNode.php @@ -0,0 +1,8 @@ +dates = $dates; + return $this; + } + + public function getDates() { + return $this->dates; + } + + public function resetSource() { + foreach ($this->getDates() as $date) { + $date->setViewerTimezone($this->getViewerTimezone()); + } + + $order = msort($this->getDates(), 'getEpoch'); + $order = array_reverse($order); + $this->order = $order; + + return $this; + } + + public function getNextEvent($cursor) { + while ($this->order) { + $next = array_pop($this->order); + if ($next->getEpoch() >= $cursor) { + return $next; + } + } + + return null; + } + + +} diff --git a/src/parser/calendar/data/PhutilCalendarRecurrenceRule.php b/src/parser/calendar/data/PhutilCalendarRecurrenceRule.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/PhutilCalendarRecurrenceRule.php @@ -0,0 +1,1820 @@ +getFrequency(); + + $interval = $this->getInterval(); + if ($interval != 1) { + $parts['INTERVAL'] = $interval; + } + + $by_second = $this->getBySecond(); + if ($by_second) { + $parts['BYSECOND'] = $by_second; + } + + $by_minute = $this->getByMinute(); + if ($by_minute) { + $parts['BYMINUTE'] = $by_minute; + } + + $by_hour = $this->getByHour(); + if ($by_hour) { + $parts['BYHOUR'] = $by_hour; + } + + $by_day = $this->getByDay(); + if ($by_day) { + $parts['BYDAY'] = $by_day; + } + + $by_month = $this->getByMonth(); + if ($by_month) { + $parts['BYMONTH'] = $by_month; + } + + $by_monthday = $this->getByMonthDay(); + if ($by_monthday) { + $parts['BYMONTHDAY'] = $by_monthday; + } + + $by_yearday = $this->getByYearDay(); + if ($by_yearday) { + $parts['BYYEARDAY'] = $by_yearday; + } + + $by_weekno = $this->getByWeekNumber(); + if ($by_weekno) { + $parts['BYWEEKNO'] = $by_weekno; + } + + $by_setpos = $this->getBySetPosition(); + if ($by_setpos) { + $parts['BYSETPOS'] = $by_setpos; + } + + $wkst = $this->getWeekStart(); + if ($wkst != self::WEEKDAY_MONDAY) { + $parts['WKST'] = $wkst; + } + + $count = $this->getCount(); + if ($count) { + $parts['COUNT'] = $count; + } + + $until = $this->getUntil(); + if ($until) { + $parts['UNTIL'] = $until->getISO8601(); + } + + return $parts; + } + + public static function newFromDictionary(array $dict) { + static $expect; + if ($expect === null) { + $expect = array_fuse( + array( + 'FREQ', + 'INTERVAL', + 'BYSECOND', + 'BYMINUTE', + 'BYHOUR', + 'BYDAY', + 'BYMONTH', + 'BYMONTHDAY', + 'BYYEARDAY', + 'BYWEEKNO', + 'BYSETPOS', + 'WKST', + 'UNTIL', + 'COUNT', + )); + } + + foreach ($dict as $key => $value) { + if (empty($expect[$key])) { + throw new Exception( + pht( + 'RRULE dictionary includes unknown key "%s". Expected keys '. + 'are: %s.', + $key, + implode(', ', array_keys($expect)))); + } + } + + $rrule = id(new self()) + ->setFrequency(idx($dict, 'FREQ')) + ->setInterval(idx($dict, 'INTERVAL', 1)) + ->setBySecond(idx($dict, 'BYSECOND', array())) + ->setByMinute(idx($dict, 'BYMINUTE', array())) + ->setByHour(idx($dict, 'BYHOUR', array())) + ->setByDay(idx($dict, 'BYDAY', array())) + ->setByMonth(idx($dict, 'BYMONTH', array())) + ->setByMonthDay(idx($dict, 'BYMONTHDAY', array())) + ->setByYearDay(idx($dict, 'BYYEARDAY', array())) + ->setByWeekNumber(idx($dict, 'BYWEEKNO', array())) + ->setBySetPosition(idx($dict, 'BYSETPOS', array())) + ->setWeekStart(idx($dict, 'WKST', self::WEEKDAY_MONDAY)); + + $count = idx($dict, 'COUNT'); + if ($count) { + $rrule->setCount($count); + } + + $until = idx($dict, 'UNTIL'); + if ($until) { + $until = PhutilCalendarAbsoluteDateTime::newFromISO8601($until); + $rrule->setUntil($until); + } + + return $rrule; + } + + public function toRRULE() { + $dict = $this->toDictionary(); + + $parts = array(); + foreach ($dict as $key => $value) { + if (is_array($value)) { + $value = implode(',', $value); + } + $parts[] = "{$key}={$value}"; + } + + return implode(';', $parts); + } + + public static function newFromRRULE($rrule) { + $parts = explode(';', $rrule); + + $dict = array(); + foreach ($parts as $part) { + list($key, $value) = explode('=', $part, 2); + switch ($key) { + case 'FREQ': + case 'INTERVAL': + case 'WKST': + case 'COUNT': + case 'UNTIL'; + break; + default: + $value = explode(',', $value); + break; + } + $dict[$key] = $value; + } + + $int_lists = array_fuse( + array( + // NOTE: "BYDAY" is absent, and takes a list like "MO, TU, WE". + 'BYSECOND', + 'BYMINUTE', + 'BYHOUR', + 'BYMONTH', + 'BYMONTHDAY', + 'BYYEARDAY', + 'BYWEEKNO', + 'BYSETPOS', + )); + + $int_values = array_fuse( + array( + 'COUNT', + 'INTERVAL', + )); + + foreach ($dict as $key => $value) { + if (isset($int_values[$key])) { + // None of these values may be negative. + if (!preg_match('/^\d+\z/', $value)) { + throw new Exception( + pht( + 'Unexpected value "%s" in "%s" RULE property: expected an '. + 'integer.', + $value, + $key)); + } + $dict[$key] = (int)$value; + } + + if (isset($int_lists[$key])) { + foreach ($value as $k => $v) { + if (!preg_match('/^-?\d+\z/', $v)) { + throw new Exception( + pht( + 'Unexpected value "%s" in "%s" RRULE property: expected '. + 'only integers.', + $v, + $key)); + } + $value[$k] = (int)$v; + } + $dict[$key] = $value; + } + } + + return self::newFromDictionary($dict); + } + + private static function getAllWeekdayConstants() { + return array_keys(self::getWeekdayIndexMap()); + } + + private static function getWeekdayIndexMap() { + static $map = array( + self::WEEKDAY_SUNDAY => self::WEEKINDEX_SUNDAY, + self::WEEKDAY_MONDAY => self::WEEKINDEX_MONDAY, + self::WEEKDAY_TUESDAY => self::WEEKINDEX_TUESDAY, + self::WEEKDAY_WEDNESDAY => self::WEEKINDEX_WEDNESDAY, + self::WEEKDAY_THURSDAY => self::WEEKINDEX_THURSDAY, + self::WEEKDAY_FRIDAY => self::WEEKINDEX_FRIDAY, + self::WEEKDAY_SATURDAY => self::WEEKINDEX_SATURDAY, + ); + + return $map; + } + + private static function getWeekdayIndex($weekday) { + $map = self::getWeekdayIndexMap(); + if (!isset($map[$weekday])) { + $constants = array_keys($map); + throw new Exception( + pht( + 'Weekday "%s" is not a valid weekday constant. Valid constants '. + 'are: %s.', + $weekday, + implode(', ', $constants))); + } + + return $map[$weekday]; + } + + public function setStartDateTime(PhutilCalendarDateTime $start) { + $this->startDateTime = $start; + return $this; + } + + public function getStartDateTime() { + return $this->startDateTime; + } + + public function setCount($count) { + if ($count < 1) { + throw new Exception( + pht( + 'RRULE COUNT value "%s" is invalid: count must be at least 1.', + $count)); + } + + $this->count = $count; + return $this; + } + + public function getCount() { + return $this->count; + } + + public function setUntil(PhutilCalendarDateTime $until) { + $this->until = $until; + return $this; + } + + public function getUntil() { + return $this->until; + } + + public function setFrequency($frequency) { + static $map = array( + self::FREQUENCY_SECONDLY => self::SCALE_SECONDLY, + self::FREQUENCY_MINUTELY => self::SCALE_MINUTELY, + self::FREQUENCY_HOURLY => self::SCALE_HOURLY, + self::FREQUENCY_DAILY => self::SCALE_DAILY, + self::FREQUENCY_WEEKLY => self::SCALE_WEEKLY, + self::FREQUENCY_MONTHLY => self::SCALE_MONTHLY, + self::FREQUENCY_YEARLY => self::SCALE_YEARLY, + ); + + if (empty($map[$frequency])) { + throw new Exception( + pht( + 'RRULE FREQ "%s" is invalid. Valid frequencies are: %s.', + $frequency, + implode(', ', array_keys($map)))); + } + + $this->frequency = $frequency; + $this->frequencyScale = $map[$frequency]; + + return $this; + } + + public function getFrequency() { + return $this->frequency; + } + + public function getFrequencyScale() { + return $this->frequencyScale; + } + + public function setInterval($interval) { + if (!is_int($interval)) { + throw new Exception( + pht( + 'RRULE INTERVAL "%s" is invalid: interval must be an integer.', + $interval)); + } + + if ($interval < 1) { + throw new Exception( + pht( + 'RRULE INTERVAL "%s" is invalid: interval must be 1 or more.', + $interval)); + } + + $this->interval = $interval; + return $this; + } + + public function getInterval() { + return $this->interval; + } + + public function setBySecond(array $by_second) { + $this->assertByRange('BYSECOND', $by_second, 0, 60); + $this->bySecond = array_fuse($by_second); + return $this; + } + + public function getBySecond() { + return $this->bySecond; + } + + public function setByMinute(array $by_minute) { + $this->assertByRange('BYMINUTE', $by_minute, 0, 59); + $this->byMinute = array_fuse($by_minute); + return $this; + } + + public function getByMinute() { + return $this->byMinute; + } + + public function setByHour(array $by_hour) { + $this->assertByRange('BYHOUR', $by_hour, 0, 23); + $this->byHour = array_fuse($by_hour); + return $this; + } + + public function getByHour() { + return $this->byHour; + } + + public function setByDay(array $by_day) { + $constants = self::getAllWeekdayConstants(); + $constants = implode('|', $constants); + + $pattern = '/^(?:[+-]?([1-9]\d?))?('.$constants.')\z/'; + foreach ($by_day as $key => $value) { + $matches = null; + if (!preg_match($pattern, $value, $matches)) { + throw new Exception( + pht( + 'RRULE BYDAY value "%s" is invalid: rule part must be in the '. + 'expected form (like "MO", "-3TH", or "+2SU").', + $value)); + } + + // The maximum allowed value is 53, which corresponds to "the 53rd + // Monday every year" or similar when evaluated against a YEARLY rule. + + $maximum = 53; + $magnitude = (int)$matches[1]; + if ($magnitude > $maximum) { + throw new Exception( + pht( + 'RRULE BYDAY value "%s" has an offset with magnitude "%s", but '. + 'the maximum permitted value is "%s".', + $value, + $magnitude, + $maximum)); + } + + // Normalize "+3FR" into "3FR". + $by_day[$key] = ltrim($value, '+'); + } + + $this->byDay = array_fuse($by_day); + return $this; + } + + public function getByDay() { + return $this->byDay; + } + + public function setByMonthDay(array $by_month_day) { + $this->assertByRange('BYMONTHDAY', $by_month_day, -31, 31, false); + $this->byMonthDay = array_fuse($by_month_day); + return $this; + } + + public function getByMonthDay() { + return $this->byMonthDay; + } + + public function setByYearDay($by_year_day) { + $this->assertByRange('BYYEARDAY', $by_year_day, -366, 366, false); + $this->byYearDay = array_fuse($by_year_day); + return $this; + } + + public function getByYearDay() { + return $this->byYearDay; + } + + public function setByMonth(array $by_month) { + $this->assertByRange('BYMONTH', $by_month, 1, 12); + $this->byMonth = array_fuse($by_month); + return $this; + } + + public function getByMonth() { + return $this->byMonth; + } + + public function setByWeekNumber(array $by_week_number) { + $this->assertByRange('BYWEEKNO', $by_week_number, -53, 53, false); + $this->byWeekNumber = array_fuse($by_week_number); + return $this; + } + + public function getByWeekNumber() { + return $this->byWeekNumber; + } + + public function setBySetPosition(array $by_set_position) { + $this->assertByRange('BYSETPOS', $by_set_position, -366, 366, false); + $this->bySetPosition = $by_set_position; + return $this; + } + + public function getBySetPosition() { + return $this->bySetPosition; + } + + public function setWeekStart($week_start) { + // Make sure this is a valid weekday constant. + self::getWeekdayIndex($week_start); + + $this->weekStart = $week_start; + return $this; + } + + public function getWeekStart() { + return $this->weekStart; + } + + public function resetSource() { + $frequency = $this->getFrequency(); + + if ($this->getByMonthDay()) { + switch ($frequency) { + case self::FREQUENCY_WEEKLY: + // RFC5545: "The BYMONTHDAY rule part MUST NOT be specified when the + // FREQ rule part is set to WEEKLY." + throw new Exception( + pht( + 'RRULE specifies BYMONTHDAY with FREQ set to WEEKLY, which '. + 'violates RFC5545.')); + break; + default: + break; + } + + } + + if ($this->getByYearDay()) { + switch ($frequency) { + case self::FREQUENCY_DAILY: + case self::FREQUENCY_WEEKLY: + case self::FREQUENCY_MONTHLY: + // RFC5545: "The BYYEARDAY rule part MUST NOT be specified when the + // FREQ rule part is set to DAILY, WEEKLY, or MONTHLY." + throw new Exception( + pht( + 'RRULE specifies BYYEARDAY with FREQ of DAILY, WEEKLY or '. + 'MONTHLY, which violates RFC5545.')); + default: + break; + } + } + + // TODO + // RFC5545: "The BYDAY rule part MUST NOT be specified with a numeric + // value when the FREQ rule part is not set to MONTHLY or YEARLY." + // RFC5545: "Furthermore, the BYDAY rule part MUST NOT be specified with a + // numeric value with the FREQ rule part set to YEARLY when the BYWEEKNO + // rule part is specified." + + + $date = $this->getStartDateTime(); + + $this->cursorSecond = $date->getSecond(); + $this->cursorMinute = $date->getMinute(); + $this->cursorHour = $date->getHour(); + + $this->cursorDay = $date->getDay(); + $this->cursorMonth = $date->getMonth(); + $this->cursorYear = $date->getYear(); + + $year_map = $this->getYearMap($this->cursorYear, $this->getWeekStart()); + $key = $this->cursorMonth.'M'.$this->cursorDay.'D'; + $this->cursorWeek = $year_map['info'][$key]['week']; + $this->cursorWeekday = $year_map['info'][$key]['weekday']; + + $this->setSeconds = array(); + $this->setMinutes = array(); + $this->setHours = array(); + $this->setDays = array(); + $this->setMonths = array(); + $this->setYears = array(); + + $this->stateSecond = null; + $this->stateMinute = null; + $this->stateHour = null; + $this->stateDay = null; + $this->stateWeek = null; + $this->stateMonth = null; + $this->stateYear = null; + + // If we have a BYSETPOS, we need to generate the entire set before we + // can filter it and return results. Normally, we start generating at + // the start date, but we need to go back one interval to generate + // BYSETPOS events so we can make sure the entire set is generated. + if ($this->getBySetPosition()) { + $interval = $this->getInterval(); + switch ($frequency) { + case self::FREQUENCY_YEARLY: + $this->cursorYear -= $interval; + break; + case self::FREQUENCY_MONTHLY: + $this->cursorMonth -= $interval; + $this->rewindMonth(); + break; + case self::FREQUENCY_WEEKLY: + $this->cursorWeek -= $interval; + $this->rewindWeek(); + break; + case self::FREQUENCY_DAILY: + $this->cursorDay -= $interval; + $this->rewindDay(); + break; + case self::FREQUENCY_HOURLY: + $this->cursorHour -= $interval; + $this->rewindHour(); + break; + case self::FREQUENCY_MINUTELY: + $this->cursorMinute -= $interval; + $this->rewindMinute(); + break; + case self::FREQUENCY_SECONDLY: + default: + throw new Exception( + pht( + 'RRULE specifies BYSETPOS with FREQ "%s", but this is invalid.', + $frequency)); + } + } + + // We can generate events from before the cursor when evaluating rules + // with BYSETPOS or FREQ=WEEKLY. + $this->minimumEpoch = $this->getStartDateTime()->getEpoch(); + + $cursor_state = array( + 'year' => $this->cursorYear, + 'month' => $this->cursorMonth, + 'week' => $this->cursorWeek, + 'day' => $this->cursorDay, + 'hour' => $this->cursorHour, + ); + + $this->cursorDayState = $cursor_state; + $this->cursorWeekState = $cursor_state; + $this->cursorHourState = $cursor_state; + + $by_hour = $this->getByHour(); + $by_minute = $this->getByMinute(); + $by_second = $this->getBySecond(); + + $scale = $this->getFrequencyScale(); + + // We return all-day events if the start date is an all-day event and we + // don't have more granular selectors or a more granular frequency. + $this->isAllDay = $date->getIsAllDay() + && !$by_hour + && !$by_minute + && !$by_second + && ($scale > self::SCALE_HOURLY); + } + + public function getNextEvent($cursor) { + while (true) { + $event = $this->generateNextEvent(); + if (!$event) { + break; + } + + $epoch = $event->getEpoch(); + if ($this->minimumEpoch) { + if ($epoch < $this->minimumEpoch) { + continue; + } + } + + if ($epoch < $cursor) { + continue; + } + + break; + } + + return $event; + } + + private function generateNextEvent() { + if ($this->activeSet) { + return array_pop($this->activeSet); + } + + $this->baseYear = $this->cursorYear; + + $by_setpos = $this->getBySetPosition(); + if ($by_setpos) { + $old_state = $this->getSetPositionState(); + } + + while (!$this->activeSet) { + $this->activeSet = $this->nextSet; + $this->nextSet = array(); + + while (true) { + if ($this->isAllDay) { + $this->nextDay(); + } else { + $this->nextSecond(); + } + + $result = id(new PhutilCalendarAbsoluteDateTime()) + ->setTimezone($this->getStartDateTime()->getTimezone()) + ->setViewerTimezone($this->getViewerTimezone()) + ->setYear($this->stateYear) + ->setMonth($this->stateMonth) + ->setDay($this->stateDay); + + if ($this->isAllDay) { + $result->setIsAllDay(true); + } else { + $result + ->setHour($this->stateHour) + ->setMinute($this->stateMinute) + ->setSecond($this->stateSecond); + } + + // If we don't have BYSETPOS, we're all done. We put this into the + // set and will immediately return it. + if (!$by_setpos) { + $this->activeSet[] = $result; + break; + } + + // Otherwise, check if we've completed a set. The set is complete if + // the state has moved past the span we were examining (for example, + // with a YEARLY event, if the state is now in the next year). + $new_state = $this->getSetPositionState(); + if ($new_state == $old_state) { + $this->activeSet[] = $result; + continue; + } + + $this->activeSet = $this->applySetPos($this->activeSet, $by_setpos); + $this->activeSet = array_reverse($this->activeSet); + $this->nextSet[] = $result; + $old_state = $new_state; + break; + } + } + + return array_pop($this->activeSet); + } + + + protected function nextSecond() { + if ($this->setSeconds) { + $this->stateSecond = array_pop($this->setSeconds); + return; + } + + $frequency = $this->getFrequency(); + $interval = $this->getInterval(); + $is_secondly = ($frequency == self::FREQUENCY_SECONDLY); + $by_second = $this->getBySecond(); + + while (!$this->setSeconds) { + $this->nextMinute(); + + if ($is_secondly || $by_second) { + $seconds = $this->newSecondsSet( + ($is_secondly ? $interval : 1), + $by_second); + } else { + $seconds = array( + $this->cursorSecond, + ); + } + + $this->setSeconds = array_reverse($seconds); + } + + $this->stateSecond = array_pop($this->setSeconds); + } + + protected function nextMinute() { + if ($this->setMinutes) { + $this->stateMinute = array_pop($this->setMinutes); + return; + } + + $frequency = $this->getFrequency(); + $interval = $this->getInterval(); + $scale = $this->getFrequencyScale(); + $is_minutely = ($frequency === self::FREQUENCY_MINUTELY); + $by_minute = $this->getByMinute(); + + while (!$this->setMinutes) { + $this->nextHour(); + + if ($is_minutely || $by_minute) { + $minutes = $this->newMinutesSet( + ($is_minutely ? $interval : 1), + $by_minute); + } else if ($scale < self::SCALE_MINUTELY) { + $minutes = $this->newMinutesSet( + 1, + array()); + } else { + $minutes = array( + $this->cursorMinute, + ); + } + + $this->setMinutes = array_reverse($minutes); + } + + $this->stateMinute = array_pop($this->setMinutes); + } + + protected function nextHour() { + if ($this->setHours) { + $this->stateHour = array_pop($this->setHours); + return; + } + + $frequency = $this->getFrequency(); + $interval = $this->getInterval(); + $scale = $this->getFrequencyScale(); + $is_hourly = ($frequency === self::FREQUENCY_HOURLY); + $by_hour = $this->getByHour(); + + while (!$this->setHours) { + $this->nextDay(); + + $is_dynamic = $is_hourly + || $by_hour + || ($scale < self::SCALE_HOURLY); + + if ($is_dynamic) { + $hours = $this->newHoursSet( + ($is_hourly ? $interval : 1), + $by_hour); + } else { + $hours = array( + $this->cursorHour, + ); + } + + $this->setHours = array_reverse($hours); + } + + $this->stateHour = array_pop($this->setHours); + } + + protected function nextDay() { + if ($this->setDays) { + $info = array_pop($this->setDays); + $this->setDayState($info); + return; + } + + $frequency = $this->getFrequency(); + $interval = $this->getInterval(); + $scale = $this->getFrequencyScale(); + $is_daily = ($frequency === self::FREQUENCY_DAILY); + $is_weekly = ($frequency === self::FREQUENCY_WEEKLY); + + $by_day = $this->getByDay(); + $by_monthday = $this->getByMonthDay(); + $by_yearday = $this->getByYearDay(); + $by_weekno = $this->getByWeekNumber(); + $by_month = $this->getByMonth(); + $week_start = $this->getWeekStart(); + + while (!$this->setDays) { + if ($is_weekly) { + $this->nextWeek(); + } else { + $this->nextMonth(); + } + + // NOTE: We normally handle BYMONTH when iterating months, but it acts + // like a filter if FREQ=WEEKLY. + + $is_dynamic = $is_daily + || $is_weekly + || $by_day + || $by_monthday + || $by_yearday + || $by_weekno + || ($by_month && $is_weekly) + || ($scale < self::SCALE_DAILY); + + if ($is_dynamic) { + $weeks = $this->newDaysSet( + ($is_daily ? $interval : 1), + $by_day, + $by_monthday, + $by_yearday, + $by_weekno, + $by_month, + $week_start); + } else { + // The cursor day may not actually exist in the current month, so + // make sure the day is valid before we generate a set which contains + // it. + $year_map = $this->getYearMap($this->stateYear, $week_start); + if ($this->cursorDay > $year_map['monthDays'][$this->stateMonth]) { + $weeks = array( + array(), + ); + } else { + $key = $this->stateMonth.'M'.$this->cursorDay.'D'; + $weeks = array( + array($year_map['info'][$key]), + ); + } + } + + // Unpack the weeks into days. + $days = array_mergev($weeks); + + $this->setDays = array_reverse($days); + } + + $info = array_pop($this->setDays); + $this->setDayState($info); + } + + private function setDayState(array $info) { + $this->stateDay = $info['monthday']; + $this->stateWeek = $info['week']; + $this->stateMonth = $info['month']; + } + + protected function nextMonth() { + if ($this->setMonths) { + $this->stateMonth = array_pop($this->setMonths); + return; + } + + $frequency = $this->getFrequency(); + $interval = $this->getInterval(); + $scale = $this->getFrequencyScale(); + $is_monthly = ($frequency === self::FREQUENCY_MONTHLY); + + $by_month = $this->getByMonth(); + + // If we have a BYMONTHDAY, we consider that set of days in every month. + // For example, "FREQ=YEARLY;BYMONTHDAY=3" means "the third day of every + // month", so we need to expand the month set if the constraint is present. + $by_monthday = $this->getByMonthDay(); + + // Likewise, we need to generate all months if we have BYYEARDAY or + // BYWEEKNO or BYDAY. + $by_yearday = $this->getByYearDay(); + $by_weekno = $this->getByWeekNumber(); + $by_day = $this->getByDay(); + + while (!$this->setMonths) { + $this->nextYear(); + + $is_dynamic = $is_monthly + || $by_month + || $by_monthday + || $by_yearday + || $by_weekno + || $by_day + || ($scale < self::SCALE_MONTHLY); + + if ($is_dynamic) { + $months = $this->newMonthsSet( + ($is_monthly ? $interval : 1), + $by_month); + } else { + $months = array( + $this->cursorMonth, + ); + } + + $this->setMonths = array_reverse($months); + } + + $this->stateMonth = array_pop($this->setMonths); + } + + protected function nextWeek() { + if ($this->setWeeks) { + $this->stateWeek = array_pop($this->setWeeks); + return; + } + + $frequency = $this->getFrequency(); + $interval = $this->getInterval(); + $scale = $this->getFrequencyScale(); + $by_weekno = $this->getByWeekNumber(); + + while (!$this->setWeeks) { + $this->nextYear(); + + $weeks = $this->newWeeksSet( + $interval, + $by_weekno); + + $this->setWeeks = array_reverse($weeks); + } + + $this->stateWeek = array_pop($this->setWeeks); + } + + protected function nextYear() { + $this->stateYear = $this->cursorYear; + + $frequency = $this->getFrequency(); + $is_yearly = ($frequency === self::FREQUENCY_YEARLY); + + if ($is_yearly) { + $interval = $this->getInterval(); + } else { + $interval = 1; + } + + $this->cursorYear = $this->cursorYear + $interval; + + if ($this->cursorYear > ($this->baseYear + 100)) { + throw new Exception( + pht( + 'RRULE evaluation failed to generate more events in the next 100 '. + 'years. This RRULE is likely invalid or degenerate.')); + } + + } + + private function newSecondsSet($interval, $set) { + // TODO: This doesn't account for leap seconds. In theory, it probably + // should, although this shouldn't impact any real events. + $seconds_in_minute = 60; + + if ($this->cursorSecond >= $seconds_in_minute) { + $this->cursorSecond -= $seconds_in_minute; + return array(); + } + + list($cursor, $result) = $this->newIteratorSet( + $this->cursorSecond, + $interval, + $set, + $seconds_in_minute); + + $this->cursorSecond = ($cursor - $seconds_in_minute); + + return $result; + } + + private function newMinutesSet($interval, $set) { + // NOTE: This value is legitimately a constant! Amazing! + $minutes_in_hour = 60; + + if ($this->cursorMinute >= $minutes_in_hour) { + $this->cursorMinute -= $minutes_in_hour; + return array(); + } + + list($cursor, $result) = $this->newIteratorSet( + $this->cursorMinute, + $interval, + $set, + $minutes_in_hour); + + $this->cursorMinute = ($cursor - $minutes_in_hour); + + return $result; + } + + private function newHoursSet($interval, $set) { + // TODO: This doesn't account for hours caused by daylight savings time. + // It probably should, although this seems unlikely to impact any real + // events. + $hours_in_day = 24; + + // If the hour cursor is behind the current time, we need to forward it in + // INTERVAL increments so we end up with the right offset. + list($skip, $this->cursorHourState) = $this->advanceCursorState( + $this->cursorHourState, + self::SCALE_HOURLY, + $interval, + $this->getWeekStart()); + + if ($skip) { + return array(); + } + + list($cursor, $result) = $this->newIteratorSet( + $this->cursorHour, + $interval, + $set, + $hours_in_day); + + $this->cursorHour = ($cursor - $hours_in_day); + + return $result; + } + + private function newWeeksSet($interval, $set) { + $week_start = $this->getWeekStart(); + + list($skip, $this->cursorWeekState) = $this->advanceCursorState( + $this->cursorWeekState, + self::SCALE_WEEKLY, + $interval, + $week_start); + + if ($skip) { + return array(); + } + + $year_map = $this->getYearMap($this->stateYear, $week_start); + + $result = array(); + while (true) { + if (!isset($year_map['weekMap'][$this->cursorWeek])) { + break; + } + $result[] = $this->cursorWeek; + $this->cursorWeek += $interval; + } + + $this->cursorWeek -= $year_map['weekCount']; + + return $result; + } + + private function newDaysSet( + $interval_day, + $by_day, + $by_monthday, + $by_yearday, + $by_weekno, + $by_month, + $week_start) { + + $frequency = $this->getFrequency(); + $is_yearly = ($frequency == self::FREQUENCY_YEARLY); + $is_monthly = ($frequency == self::FREQUENCY_MONTHLY); + $is_weekly = ($frequency == self::FREQUENCY_WEEKLY); + + $selection = array(); + if ($is_weekly) { + $year_map = $this->getYearMap($this->stateYear, $week_start); + + if (isset($year_map['weekMap'][$this->stateWeek])) { + foreach ($year_map['weekMap'][$this->stateWeek] as $key) { + $selection[] = $year_map['info'][$key]; + } + } + } else { + // If the day cursor is behind the current year and month, we need to + // forward it in INTERVAL increments so we end up with the right offset + // in the current month. + list($skip, $this->cursorDayState) = $this->advanceCursorState( + $this->cursorDayState, + self::SCALE_DAILY, + $interval_day, + $week_start); + + if (!$skip) { + $year_map = $this->getYearMap($this->stateYear, $week_start); + while (true) { + $month_idx = $this->stateMonth; + $month_days = $year_map['monthDays'][$month_idx]; + if ($this->cursorDay > $month_days) { + // NOTE: The year map is now out of date, but we're about to break + // out of the loop anyway so it doesn't matter. + break; + } + + $day_idx = $this->cursorDay; + + $key = "{$month_idx}M{$day_idx}D"; + $selection[] = $year_map['info'][$key]; + + $this->cursorDay += $interval_day; + } + } + } + + // As a special case, BYDAY applies to relative month offsets if BYMONTH + // is present in a YEARLY rule. + if ($is_yearly) { + if ($this->getByMonth()) { + $is_yearly = false; + $is_monthly = true; + } + } + + // As a special case, BYDAY makes us examine all week days. This doesn't + // check BYMONTHDAY or BYYEARDAY because they are not valid with WEEKLY. + $filter_weekday = true; + if ($is_weekly) { + if ($by_day) { + $filter_weekday = false; + } + } + + $weeks = array(); + foreach ($selection as $key => $info) { + if ($is_weekly) { + if ($filter_weekday) { + if ($info['weekday'] != $this->cursorWeekday) { + continue; + } + } + } else { + if ($info['month'] != $this->stateMonth) { + continue; + } + } + + if ($by_day) { + if (empty($by_day[$info['weekday']])) { + if ($is_yearly) { + if (empty($by_day[$info['weekday.yearly']]) && + empty($by_day[$info['-weekday.yearly']])) { + continue; + } + } else if ($is_monthly) { + if (empty($by_day[$info['weekday.monthly']]) && + empty($by_day[$info['-weekday.monthly']])) { + continue; + } + } else { + continue; + } + } + } + + if ($by_monthday) { + if (empty($by_monthday[$info['monthday']]) && + empty($by_monthday[$info['-monthday']])) { + continue; + } + } + + if ($by_yearday) { + if (empty($by_yearday[$info['yearday']]) && + empty($by_yearday[$info['-yearday']])) { + continue; + } + } + + if ($by_weekno) { + if (empty($by_weekno[$info['week']]) && + empty($by_weekno[$info['-week']])) { + continue; + } + } + + if ($by_month) { + if (empty($by_month[$info['month']])) { + continue; + } + } + + $weeks[$info['week']][] = $info; + } + + return array_values($weeks); + } + + private function newMonthsSet($interval, $set) { + // NOTE: This value is also a real constant! Wow! + $months_in_year = 12; + + if ($this->cursorMonth > $months_in_year) { + $this->cursorMonth -= $months_in_year; + return array(); + } + + list($cursor, $result) = $this->newIteratorSet( + $this->cursorMonth, + $interval, + $set, + $months_in_year + 1); + + $this->cursorMonth = ($cursor - $months_in_year); + + return $result; + } + + public static function getYearMap($year, $week_start) { + static $maps = array(); + + $key = "{$year}/{$week_start}"; + if (isset($maps[$key])) { + return $maps[$key]; + } + + $map = self::newYearMap($year, $week_start); + $maps[$key] = $map; + + return $maps[$key]; + } + + private static function newYearMap($year, $weekday_start) { + $weekday_index = self::getWeekdayIndex($weekday_start); + + $is_leap = (($year % 4 === 0) && ($year % 100 !== 0)) || + ($year % 400 === 0); + + // There may be some clever way to figure out which day of the week a given + // year starts on and avoid the cost of a DateTime construction, but I + // wasn't able to turn it up and we only need to do this once per year. + $datetime = new DateTime("{$year}-01-01", new DateTimeZone('UTC')); + $weekday = (int)$datetime->format('w'); + + if ($is_leap) { + $max_day = 366; + } else { + $max_day = 365; + } + + $month_days = array( + 1 => 31, + 2 => $is_leap ? 29 : 28, + 3 => 31, + 4 => 30, + 5 => 31, + 6 => 30, + 7 => 31, + 8 => 31, + 9 => 30, + 10 => 31, + 11 => 30, + 12 => 31, + ); + + // Per the spec, the first week of the year must contain at least four + // days. If the week starts on a Monday but the year starts on a Saturday, + // the first couple of days don't count as a week. In this case, the first + // week will begin on January 3. + $first_week_size = 0; + $first_weekday = $weekday; + for ($year_day = 1; $year_day <= $max_day; $year_day++) { + $first_weekday = ($first_weekday + 1) % 7; + $first_week_size++; + if ($first_weekday === $weekday_index) { + break; + } + } + + if ($first_week_size >= 4) { + $week_number = 1; + } else { + $week_number = 0; + } + + $info_map = array(); + + $weekday_map = self::getWeekdayIndexMap(); + $weekday_map = array_flip($weekday_map); + + $yearly_counts = array(); + $monthly_counts = array(); + + $month_number = 1; + $month_day = 1; + for ($year_day = 1; $year_day <= $max_day; $year_day++) { + $key = "{$month_number}M{$month_day}D"; + + $short_day = $weekday_map[$weekday]; + if (empty($yearly_counts[$short_day])) { + $yearly_counts[$short_day] = 0; + } + $yearly_counts[$short_day]++; + + if (empty($monthly_counts[$month_number][$short_day])) { + $monthly_counts[$month_number][$short_day] = 0; + } + $monthly_counts[$month_number][$short_day]++; + + $info = array( + 'year' => $year, + 'key' => $key, + 'month' => $month_number, + 'monthday' => $month_day, + '-monthday' => -$month_days[$month_number] + $month_day - 1, + 'yearday' => $year_day, + '-yearday' => -$max_day + $year_day - 1, + 'week' => $week_number, + 'weekday' => $short_day, + 'weekday.yearly' => $yearly_counts[$short_day], + 'weekday.monthly' => $monthly_counts[$month_number][$short_day], + ); + + $info_map[$key] = $info; + + $weekday = ($weekday + 1) % 7; + if ($weekday === $weekday_index) { + $week_number++; + } + + $month_day = ($month_day + 1); + if ($month_day > $month_days[$month_number]) { + $month_day = 1; + $month_number++; + } + } + + // Check how long the final week is. If it doesn't have four days, this + // is really the first week of the next year. + $final_week = array(); + foreach ($info_map as $key => $info) { + if ($info['week'] == $week_number) { + $final_week[] = $key; + } + } + + if (count($final_week) < 4) { + $week_number = $week_number - 1; + $next_year = self::getYearMap($year + 1, $weekday_start); + $next_year_weeks = $next_year['weekCount']; + } else { + $next_year_weeks = null; + } + + if ($first_week_size < 4) { + $last_year = self::getYearMap($year - 1, $weekday_start); + $last_year_weeks = $last_year['weekCount']; + } else { + $last_year_weeks = null; + } + + // Now that we know how many weeks the year has, we can compute the + // negative offsets. + foreach ($info_map as $key => $info) { + $week = $info['week']; + + if ($week === 0) { + // If this day is part of the first partial week of the year, give + // it the week number of the last week of the prior year instead. + $info['week'] = $last_year_weeks; + $info['-week'] = -1; + } else if ($week > $week_number) { + // If this day is part of the last partial week of the year, give + // it week numbers from the next year. + $info['week'] = 1; + $info['-week'] = -$next_year_weeks; + } else { + $info['-week'] = -$week_number + $week - 1; + } + + // Do all the arithmetic to figure out if this is the -19th Thursday + // in the year and such. + $month_number = $info['month']; + $short_day = $info['weekday']; + $monthly_count = $monthly_counts[$month_number][$short_day]; + $monthly_index = $info['weekday.monthly']; + $info['-weekday.monthly'] = -$monthly_count + $monthly_index - 1; + $info['-weekday.monthly'] .= $short_day; + $info['weekday.monthly'] .= $short_day; + + $yearly_count = $yearly_counts[$short_day]; + $yearly_index = $info['weekday.yearly']; + $info['-weekday.yearly'] = -$yearly_count + $yearly_index - 1; + $info['-weekday.yearly'] .= $short_day; + $info['weekday.yearly'] .= $short_day; + + $info_map[$key] = $info; + } + + $week_map = array(); + foreach ($info_map as $key => $info) { + $week_map[$info['week']][] = $key; + } + + return array( + 'info' => $info_map, + 'weekCount' => $week_number, + 'dayCount' => $max_day, + 'monthDays' => $month_days, + 'weekMap' => $week_map, + ); + } + + private function newIteratorSet($cursor, $interval, $set, $limit) { + if ($interval < 1) { + throw new Exception( + pht( + 'Invalid iteration interval ("%d"), must be at least 1.', + $interval)); + } + + $result = array(); + $seen = array(); + + $ii = $cursor; + while (true) { + if (!$set || isset($set[$ii])) { + $result[] = $ii; + } + + $ii = ($ii + $interval); + + if ($ii >= $limit) { + break; + } + } + + sort($result); + $result = array_values($result); + + return array($ii, $result); + } + + private function applySetPos(array $values, array $setpos) { + $select = array(); + + $count = count($values); + foreach ($setpos as $pos) { + if ($pos > 0 && $pos <= $count) { + $select[] = ($pos - 1); + } else if ($pos < 0 && $pos >= -$count) { + $select[] = ($count + $pos); + } + } + + sort($select); + $select = array_unique($select); + + return array_select_keys($values, $select); + } + + private function assertByRange( + $source, + array $values, + $min, + $max, + $allow_zero = true) { + + foreach ($values as $value) { + if (!is_int($value)) { + throw new Exception( + pht( + 'Value "%s" in RRULE "%s" parameter is invalid: values must be '. + 'integers.', + $value, + $source)); + } + + if ($value < $min || $value > $max) { + throw new Exception( + pht( + 'Value "%s" in RRULE "%s" parameter is invalid: it must be '. + 'between %s and %s.', + $value, + $source, + $min, + $max)); + } + + if (!$value && !$allow_zero) { + throw new Exception( + pht( + 'Value "%s" in RRULE "%s" parameter is invalid: it must not '. + 'be zero.', + $value, + $source)); + } + } + } + + private function getSetPositionState() { + $scale = $this->getFrequencyScale(); + + $parts = array(); + $parts[] = $this->stateYear; + + if ($scale == self::SCALE_WEEKLY) { + $parts[] = $this->stateWeek; + } else { + if ($scale < self::SCALE_YEARLY) { + $parts[] = $this->stateMonth; + } + if ($scale < self::SCALE_MONTHLY) { + $parts[] = $this->stateDay; + } + if ($scale < self::SCALE_DAILY) { + $parts[] = $this->stateHour; + } + if ($scale < self::SCALE_HOURLY) { + $parts[] = $this->stateMinute; + } + } + + return implode('/', $parts); + } + + private function rewindMonth() { + while ($this->cursorMonth < 1) { + $this->cursorYear--; + $this->cursorMonth += 12; + } + } + + private function rewindWeek() { + $week_start = $this->getWeekStart(); + while ($this->cursorWeek < 1) { + $this->cursorYear--; + $year_map = $this->getYearMap($this->cursorYear, $week_start); + $this->cursorWeek += $year_map['weekCount']; + } + } + + private function rewindDay() { + $week_start = $this->getWeekStart(); + while ($this->cursorDay < 1) { + $year_map = $this->getYearMap($this->cursorYear, $week_start); + $this->cursorDay += $year_map['monthDays'][$this->cursorMonth]; + $this->cursorMonth--; + $this->rewindMonth(); + } + } + + private function rewindHour() { + while ($this->cursorHour < 0) { + $this->cursorHour += 24; + $this->cursorDay--; + $this->rewindDay(); + } + } + + private function rewindMinute() { + while ($this->cursorMinute < 0) { + $this->cursorMinute += 60; + $this->cursorHour--; + $this->rewindHour(); + } + } + + private function advanceCursorState( + array $cursor, + $scale, + $interval, + $week_start) { + + $state = array( + 'year' => $this->stateYear, + 'month' => $this->stateMonth, + 'week' => $this->stateWeek, + 'day' => $this->stateDay, + 'hour' => $this->stateHour, + ); + + // In the common case when the interval is 1, we'll visit every possible + // value so we don't need to do any math and can just jump to the first + // hour, day, etc. + if ($interval == 1) { + if ($this->isCursorBehind($cursor, $state, $scale)) { + switch ($scale) { + case self::SCALE_DAILY: + $this->cursorDay = 1; + break; + case self::SCALE_HOURLY: + $this->cursorHour = 0; + break; + case self::SCALE_WEEKLY: + $this->cursorWeek = 1; + break; + } + } + + return array(false, $state); + } + + $year_map = $this->getYearMap($cursor['year'], $week_start); + while ($this->isCursorBehind($cursor, $state, $scale)) { + switch ($scale) { + case self::SCALE_DAILY: + $cursor['day'] += $interval; + break; + case self::SCALE_HOURLY: + $cursor['hour'] += $interval; + break; + case self::SCALE_WEEKLY: + $cursor['week'] += $interval; + break; + } + + if ($scale <= self::SCALE_HOURLY) { + while ($cursor['hour'] >= 24) { + $cursor['hour'] -= 24; + $cursor['day']++; + } + } + + if ($scale == self::SCALE_WEEKLY) { + while ($cursor['week'] > $year_map['weekCount']) { + $cursor['week'] -= $year_map['weekCount']; + $cursor['year']++; + $year_map = $this->getYearMap($cursor['year'], $week_start); + } + } + + if ($scale <= self::SCALE_DAILY) { + while ($cursor['day'] > $year_map['monthDays'][$cursor['month']]) { + $cursor['day'] -= $year_map['monthDays'][$cursor['month']]; + $cursor['month']++; + if ($cursor['month'] > 12) { + $cursor['month'] -= 12; + $cursor['year']++; + $year_map = $this->getYearMap($cursor['year'], $week_start); + } + } + } + } + + switch ($scale) { + case self::SCALE_DAILY: + $this->cursorDay = $cursor['day']; + break; + case self::SCALE_HOURLY: + $this->cursorHour = $cursor['hour']; + break; + case self::SCALE_WEEKLY: + $this->cursorWeek = $cursor['week']; + break; + } + + $skip = $this->isCursorBehind($state, $cursor, $scale); + + return array($skip, $cursor); + } + + private function isCursorBehind(array $cursor, array $state, $scale) { + if ($cursor['year'] < $state['year']) { + return true; + } else if ($cursor['year'] > $state['year']) { + return false; + } + + if ($scale == self::SCALE_WEEKLY) { + return false; + } + + if ($cursor['month'] < $state['month']) { + return true; + } else if ($cursor['month'] > $state['month']) { + return false; + } + + if ($scale >= self::SCALE_DAILY) { + return false; + } + + if ($cursor['day'] < $state['day']) { + return true; + } else if ($cursor['day'] > $state['day']) { + return false; + } + + if ($scale >= self::SCALE_HOURLY) { + return false; + } + + if ($cursor['hour'] < $state['hour']) { + return true; + } else if ($cursor['hour'] > $state['hour']) { + return false; + } + + return false; + } + + +} diff --git a/src/parser/calendar/data/PhutilCalendarRecurrenceSet.php b/src/parser/calendar/data/PhutilCalendarRecurrenceSet.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/PhutilCalendarRecurrenceSet.php @@ -0,0 +1,162 @@ +sources[] = $source; + return $this; + } + + public function setViewerTimezone($viewer_timezone) { + $this->viewerTimezone = $viewer_timezone; + return $this; + } + + public function getViewerTimezone() { + return $this->viewerTimezone; + } + + public function getEventsBetween( + PhutilCalendarDateTime $start = null, + PhutilCalendarDateTime $end = null, + $limit = null) { + + if ($end === null && $limit === null) { + throw new Exception( + pht( + 'Recurring event range queries must have an end date, a limit, or '. + 'both.')); + } + + $timezone = $this->getViewerTimezone(); + + $sources = array(); + foreach ($this->sources as $source) { + $source = clone $source; + $source->setViewerTimezone($timezone); + $source->resetSource(); + + $sources[] = array( + 'source' => $source, + 'state' => null, + 'epoch' => null, + ); + } + + if ($start) { + $start = clone $start; + $start->setViewerTimezone($timezone); + $min_epoch = $start->getEpoch(); + } else { + $min_epoch = 0; + } + + if ($end) { + $end = clone $end; + $end->setViewerTimezone($timezone); + $end_epoch = $end->getEpoch(); + } else { + $end_epoch = null; + } + + $results = array(); + $index = 0; + $cursor = 0; + while (true) { + // Get the next event for each source which we don't have a future + // event for. + foreach ($sources as $key => $source) { + $state = $source['state']; + $epoch = $source['epoch']; + + if ($state !== null && $epoch >= $cursor) { + // We have an event for this source, and it's a future event, so + // we don't need to do anything. + continue; + } + + $next = $source['source']->getNextEvent($cursor); + if ($next === null) { + // This source doesn't have any more events, so we're all done. + unset($sources[$key]); + continue; + } + + $next_epoch = $next->getEpoch(); + + if ($end_epoch !== null && $next_epoch > $end_epoch) { + // We have an end time and the next event from this source is + // past that end, so we know there are no more relevant events + // coming from this source. + unset($sources[$key]); + continue; + } + + $sources[$key]['state'] = $next; + $sources[$key]['epoch'] = $next_epoch; + } + + if (!$sources) { + // We've run out of sources which can produce valid events in the + // window, so we're all done. + break; + } + + // Find the minimum event time across all sources. + $next_epoch = null; + foreach ($sources as $source) { + if ($next_epoch === null) { + $next_epoch = $source['epoch']; + } else { + $next_epoch = min($next_epoch, $source['epoch']); + } + } + + $is_exception = false; + $next_source = null; + foreach ($sources as $source) { + if ($source['epoch'] == $next_epoch) { + if ($source['source']->getIsExceptionSource()) { + $is_exception = true; + } else { + $next_source = $source; + } + } + } + + // If this is an exception, it means the event does NOT occur. We + // skip it and move on. If it's not an exception, it does occur, so + // we record it. + if (!$is_exception) { + + // Only actually include this event in the results if it starts after + // any specified start time. We increment the index regardless, so we + // return results with proper offsets. + if ($next_source['epoch'] >= $min_epoch) { + $results[$index] = $next_source['state']; + } + $index++; + + if ($limit !== null && (count($results) >= $limit)) { + break; + } + } + + $cursor = $next_epoch + 1; + + // If we have an end of the window and we've reached it, we're done. + if ($end_epoch) { + if ($cursor > $end_epoch) { + break; + } + } + } + + return $results; + } + +} diff --git a/src/parser/calendar/data/PhutilCalendarRecurrenceSource.php b/src/parser/calendar/data/PhutilCalendarRecurrenceSource.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/PhutilCalendarRecurrenceSource.php @@ -0,0 +1,34 @@ +isExceptionSource = $is_exception_source; + return $this; + } + + public function getIsExceptionSource() { + return $this->isExceptionSource; + } + + public function setViewerTimezone($viewer_timezone) { + $this->viewerTimezone = $viewer_timezone; + return $this; + } + + public function getViewerTimezone() { + return $this->viewerTimezone; + } + + public function resetSource() { + return; + } + + abstract public function getNextEvent($cursor); + + +} diff --git a/src/parser/calendar/data/PhutilCalendarRelativeDateTime.php b/src/parser/calendar/data/PhutilCalendarRelativeDateTime.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/PhutilCalendarRelativeDateTime.php @@ -0,0 +1,74 @@ +setProxy($origin); + } + + public function getOrigin() { + return $this->getProxy(); + } + + public function setDuration(PhutilCalendarDuration $duration) { + $this->duration = $duration; + return $this; + } + + public function getDuration() { + return $this->duration; + } + + public function newPHPDateTime() { + $datetime = parent::newPHPDateTime(); + $duration = $this->getDuration(); + + if ($duration->getIsNegative()) { + $sign = '-'; + } else { + $sign = '+'; + } + + $map = array( + 'weeks' => $duration->getWeeks(), + 'days' => $duration->getDays(), + 'hours' => $duration->getHours(), + 'minutes' => $duration->getMinutes(), + 'seconds' => $duration->getSeconds(), + ); + + foreach ($map as $unit => $value) { + if (!$value) { + continue; + } + $datetime->modify("{$sign}{$value} {$unit}"); + } + + return $datetime; + } + + public function newAbsoluteDateTime() { + $clone = clone $this; + + if ($clone->getTimezone()) { + $clone->setViewerTimezone(null); + } + + $datetime = $clone->newPHPDateTime(); + + return id(new PhutilCalendarAbsoluteDateTime()) + ->setYear((int)$datetime->format('Y')) + ->setMonth((int)$datetime->format('m')) + ->setDay((int)$datetime->format('d')) + ->setHour((int)$datetime->format('H')) + ->setMinute((int)$datetime->format('i')) + ->setSecond((int)$datetime->format('s')) + ->setIsAllDay($clone->getIsAllDay()) + ->setTimezone($clone->getTimezone()) + ->setViewerTimezone($this->getViewerTimezone()); + } + +} diff --git a/src/parser/calendar/data/PhutilCalendarRootNode.php b/src/parser/calendar/data/PhutilCalendarRootNode.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/PhutilCalendarRootNode.php @@ -0,0 +1,12 @@ +getChildrenOfType(PhutilCalendarDocumentNode::NODETYPE); + } + +} diff --git a/src/parser/calendar/data/PhutilCalendarUserNode.php b/src/parser/calendar/data/PhutilCalendarUserNode.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/PhutilCalendarUserNode.php @@ -0,0 +1,40 @@ +name = $name; + return $this; + } + + public function getName() { + return $this->name; + } + + public function setURI($uri) { + $this->uri = $uri; + return $this; + } + + public function getURI() { + return $this->uri; + } + + public function setStatus($status) { + $this->status = $status; + return $this; + } + + public function getStatus() { + return $this->status; + } + +} diff --git a/src/parser/calendar/data/__tests__/PhutilCalendarDateTimeTestCase.php b/src/parser/calendar/data/__tests__/PhutilCalendarDateTimeTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/__tests__/PhutilCalendarDateTimeTestCase.php @@ -0,0 +1,49 @@ +setTimezone('America/Los_Angeles') + ->setViewerTimezone('America/Chicago') + ->setIsAllDay(true); + + $this->assertEqual( + '20161128', + $start->getISO8601()); + + $end = $start + ->newAbsoluteDateTime() + ->setHour(0) + ->setMinute(0) + ->setSecond(0) + ->newRelativeDateTime('P1D') + ->newAbsoluteDateTime(); + + $this->assertEqual( + '20161129', + $end->getISO8601()); + + // This is a date which explicitly has no specified timezone. + $start = PhutilCalendarAbsoluteDateTime::newFromISO8601('20161128', null) + ->setViewerTimezone('UTC'); + + $this->assertEqual( + '20161128', + $start->getISO8601()); + + $end = $start + ->newAbsoluteDateTime() + ->setHour(0) + ->setMinute(0) + ->setSecond(0) + ->newRelativeDateTime('P1D') + ->newAbsoluteDateTime(); + + $this->assertEqual( + '20161129', + $end->getISO8601()); + } + + +} diff --git a/src/parser/calendar/data/__tests__/PhutilCalendarRecurrenceRuleTestCase.php b/src/parser/calendar/data/__tests__/PhutilCalendarRecurrenceRuleTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/__tests__/PhutilCalendarRecurrenceRuleTestCase.php @@ -0,0 +1,1750 @@ +setStartDateTime($start) + ->setFrequency(PhutilCalendarRecurrenceRule::FREQUENCY_DAILY); + + $set = id(new PhutilCalendarRecurrenceSet()) + ->addSource($rrule); + + $result = $set->getEventsBetween(null, null, 3); + + $expect = array( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), + ); + + $this->assertEqual( + mpull($expect, 'getISO8601'), + mpull($result, 'getISO8601'), + pht('Simple daily event.')); + + + + $rrule = id(new PhutilCalendarRecurrenceRule()) + ->setStartDateTime($start) + ->setFrequency(PhutilCalendarRecurrenceRule::FREQUENCY_HOURLY) + ->setByHour(array(12, 13)); + + $set = id(new PhutilCalendarRecurrenceSet()) + ->addSource($rrule); + + $result = $set->getEventsBetween(null, null, 5); + + $expect = array( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T130000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T130000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), + ); + + $this->assertEqual( + mpull($expect, 'getISO8601'), + mpull($result, 'getISO8601'), + pht('Hourly event with BYHOUR.')); + + + $rrule = id(new PhutilCalendarRecurrenceRule()) + ->setStartDateTime($start) + ->setFrequency(PhutilCalendarRecurrenceRule::FREQUENCY_YEARLY); + + $set = id(new PhutilCalendarRecurrenceSet()) + ->addSource($rrule); + + $result = $set->getEventsBetween(null, null, 2); + + $expect = array( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20170101T120000Z'), + ); + + $this->assertEqual( + mpull($expect, 'getISO8601'), + mpull($result, 'getISO8601'), + pht('Yearly event.')); + + + // This is an efficiency test for bizarre rules: it defines a secondly + // event which only occurs one a year, and generates 3 instances of it. + // This implementation should be fast enough that this test doesn't take + // a significant amount of time. + + $rrule = id(new PhutilCalendarRecurrenceRule()) + ->setStartDateTime($start) + ->setFrequency(PhutilCalendarRecurrenceRule::FREQUENCY_SECONDLY) + ->setByMonth(array(1)) + ->setByMonthDay(array(1)) + ->setByHour(array(12)) + ->setByMinute(array(0)) + ->setBySecond(array(0)); + + $set = id(new PhutilCalendarRecurrenceSet()) + ->addSource($rrule); + + $result = $set->getEventsBetween(null, null, 3); + + $expect = array( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20170101T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20180101T120000Z'), + ); + + $this->assertEqual( + mpull($expect, 'getISO8601'), + mpull($result, 'getISO8601'), + pht('Secondly event with many constraints.')); + } + + public function testYearlyRecurrenceRules() { + $tests = array(); + $expect = array(); + + $tests[] = array(); + $expect[] = array( + '19970902', + '19980902', + '19990902', + ); + + $tests[] = array( + 'INTERVAL' => 2, + ); + $expect[] = array( + '19970902', + '19990902', + '20010902', + ); + + $tests[] = array( + 'DTSTART' => '20000229', + ); + $expect[] = array( + '20000229', + '20040229', + '20080229', + ); + + $tests[] = array( + 'BYMONTH' => array(1, 3), + ); + $expect[] = array( + '19980102', + '19980302', + '19990102', + ); + + $tests[] = array( + 'BYMONTHDAY' => array(1, 3), + ); + $expect[] = array( + '19970903', + '19971001', + '19971003', + ); + + $tests[] = array( + 'BYMONTH' => array(1, 3), + 'BYMONTHDAY' => array(5, 7), + ); + $expect[] = array( + '19980105', + '19980107', + '19980305', + ); + + $tests[] = array( + 'BYDAY' => array('TU', 'TH'), + ); + $expect[] = array( + '19970902', + '19970904', + '19970909', + ); + + $tests[] = array( + 'BYDAY' => array('SU'), + ); + $expect[] = array( + '19970907', + '19970914', + '19970921', + ); + + $tests[] = array( + 'BYMONTH' => array(1, 3), + 'BYDAY' => array('TU', 'TH'), + ); + $expect[] = array( + '19980101', + '19980106', + '19980108', + ); + + $tests[] = array( + 'BYMONTHDAY' => array(1, 3), + 'BYDAY' => array('TU', 'TH'), + ); + $expect[] = array( + '19980101', + '19980203', + '19980303', + ); + + $tests[] = array( + 'BYMONTHDAY' => array(1, 3), + 'BYDAY' => array('TU', 'TH'), + 'BYMONTH' => array(1, 3), + ); + $expect[] = array( + '19980101', + '19980303', + '20010301', + ); + + $tests[] = array( + 'BYDAY' => array('1TU', '-1TH'), + ); + $expect[] = array( + '19971225', + '19980106', + '19981231', + ); + + // Same test as above, just making sure the optional "+" syntax works. + $tests[] = array( + 'BYDAY' => array('+1TU', '-1TH'), + ); + $expect[] = array( + '19971225', + '19980106', + '19981231', + ); + + $tests[] = array( + 'BYDAY' => array('3TU', '-3TH'), + ); + $expect[] = array( + '19971211', + '19980120', + '19981217', + ); + + $tests[] = array( + 'BYMONTH' => array(1, 3), + 'BYDAY' => array('1TU', '-1TH'), + ); + $expect[] = array( + '19980106', + '19980129', + '19980303', + ); + + $tests[] = array( + 'BYMONTH' => array(1, 3), + 'BYDAY' => array('3TU', '-3TH'), + ); + $expect[] = array( + '19980115', + '19980120', + '19980312', + ); + + $tests[] = array( + 'BYYEARDAY' => array(1, 100, 200, 365), + 'COUNT' => 4, + ); + $expect[] = array( + '19971231', + '19980101', + '19980410', + '19980719', + ); + + $tests[] = array( + 'BYYEARDAY' => array(-365, -266, -166, -1), + 'COUNT' => 4, + ); + $expect[] = array( + '19971231', + '19980101', + '19980410', + '19980719', + ); + + $tests[] = array( + 'BYYEARDAY' => array(1, 100, 200, 365), + 'BYMONTH' => array(4, 7), + 'COUNT' => 4, + ); + $expect[] = array( + '19980410', + '19980719', + '19990410', + '19990719', + ); + + $tests[] = array( + 'BYYEARDAY' => array(-365, -266, -166, -1), + 'BYMONTH' => array(4, 7), + 'COUNT' => 4, + ); + $expect[] = array( + '19980410', + '19980719', + '19990410', + '19990719', + ); + + $tests[] = array( + 'BYWEEKNO' => array(20), + ); + $expect[] = array( + '19980511', + '19980512', + '19980513', + ); + + $tests[] = array( + 'BYWEEKNO' => array(1), + 'BYDAY' => array('MO'), + ); + $expect[] = array( + '19971229', + '19990104', + '20000103', + ); + + $tests[] = array( + 'BYWEEKNO' => array(52), + 'BYDAY' => array('SU'), + ); + $expect[] = array( + '19971228', + '19981227', + '20000102', + ); + + $tests[] = array( + 'BYWEEKNO' => array(-1), + 'BYDAY' => array('SU'), + ); + $expect[] = array( + '19971228', + '19990103', + '20000102', + ); + + $tests[] = array( + 'BYWEEKNO' => array(53), + 'BYDAY' => array('MO'), + ); + $expect[] = array( + '19981228', + '20041227', + '20091228', + ); + + $tests[] = array( + 'BYHOUR' => array(6, 18), + ); + $expect[] = array( + '19970902T060000Z', + '19970902T180000Z', + '19980902T060000Z', + ); + + $tests[] = array( + 'BYMINUTE' => array(15, 30), + ); + $expect[] = array( + '19970902T001500Z', + '19970902T003000Z', + '19980902T001500Z', + ); + + $tests[] = array( + 'BYSECOND' => array(10, 20), + ); + $expect[] = array( + '19970902T000010Z', + '19970902T000020Z', + '19980902T000010Z', + ); + + $tests[] = array( + 'BYHOUR' => array(6, 18), + 'BYMINUTE' => array(15, 30), + ); + $expect[] = array( + '19970902T061500Z', + '19970902T063000Z', + '19970902T181500Z', + ); + + $tests[] = array( + 'BYHOUR' => array(6, 18), + 'BYSECOND' => array(10, 20), + ); + $expect[] = array( + '19970902T060010Z', + '19970902T060020Z', + '19970902T180010Z', + ); + + $tests[] = array( + 'BYMINUTE' => array(15, 30), + 'BYSECOND' => array(10, 20), + ); + $expect[] = array( + '19970902T001510Z', + '19970902T001520Z', + '19970902T003010Z', + ); + + $tests[] = array( + 'BYHOUR' => array(6, 18), + 'BYMINUTE' => array(15, 30), + 'BYSECOND' => array(10, 20), + ); + $expect[] = array( + '19970902T061510Z', + '19970902T061520Z', + '19970902T063010Z', + ); + + $tests[] = array( + 'BYMONTHDAY' => array(15), + 'BYHOUR' => array(6, 18), + 'BYSETPOS' => array(3, -3), + ); + $expect[] = array( + '19971115T180000Z', + '19980215T060000Z', + '19981115T180000Z', + ); + + $this->assertRules( + array( + 'FREQ' => 'YEARLY', + 'COUNT' => 3, + 'DTSTART' => '19970902', + ), + $tests, + $expect); + } + + public function testMonthlyRecurrenceRules() { + $tests = array(); + $expect = array(); + + $tests[] = array(); + $expect[] = array( + '19970902', + '19971002', + '19971102', + ); + + $tests[] = array( + 'INTERVAL' => 2, + ); + $expect[] = array( + '19970902', + '19971102', + '19980102', + ); + + $tests[] = array( + 'INTERVAL' => 18, + ); + $expect[] = array( + '19970902', + '19990302', + '20000902', + ); + + $tests[] = array( + 'BYMONTH' => array(1, 3), + ); + $expect[] = array( + '19980102', + '19980302', + '19990102', + ); + + $tests[] = array( + 'BYMONTHDAY' => array(1, 3), + ); + $expect[] = array( + '19970903', + '19971001', + '19971003', + ); + + $tests[] = array( + 'BYMONTHDAY' => array(5, 7), + 'BYMONTH' => array(1, 3), + ); + $expect[] = array( + '19980105', + '19980107', + '19980305', + ); + + $tests[] = array( + 'BYDAY' => array('TU', 'TH'), + ); + $expect[] = array( + '19970902', + '19970904', + '19970909', + ); + + $tests[] = array( + 'BYDAY' => array('3MO'), + ); + $expect[] = array( + '19970915', + '19971020', + '19971117', + ); + + $tests[] = array( + 'BYDAY' => array('1TU', '-1TH'), + ); + $expect[] = array( + '19970902', + '19970925', + '19971007', + ); + + $tests[] = array( + 'BYDAY' => array('3TU', '-3TH'), + ); + $expect[] = array( + '19970911', + '19970916', + '19971016', + ); + + $tests[] = array( + 'BYDAY' => array('TU', 'TH'), + 'BYMONTH' => array(1, 3), + ); + $expect[] = array( + '19980101', + '19980106', + '19980108', + ); + + $tests[] = array( + 'BYMONTH' => array(1, 3), + 'BYDAY' => array('1TU', '-1TH'), + ); + $expect[] = array( + '19980106', + '19980129', + '19980303', + ); + + $tests[] = array( + 'BYMONTH' => array(1, 3), + 'BYDAY' => array('3TU', '-3TH'), + ); + $expect[] = array( + '19980115', + '19980120', + '19980312', + ); + + $tests[] = array( + 'BYMONTHDAY' => array(1, 3), + 'BYDAY' => array('TU', 'TH'), + ); + $expect[] = array( + '19980101', + '19980203', + '19980303', + ); + + $tests[] = array( + 'BYMONTH' => array(1, 3), + 'BYMONTHDAY' => array(1, 3), + 'BYDAY' => array('TU', 'TH'), + ); + $expect[] = array( + '19980101', + '19980303', + '20010301', + ); + + $tests[] = array( + 'BYDAY' => array('MO', 'TU', 'WE', 'TH', 'FR'), + 'BYSETPOS' => array(-1), + ); + $expect[] = array( + '19970930', + '19971031', + '19971128', + ); + + $tests[] = array( + 'BYDAY' => array('1MO', '1TU', '1WE', '1TH', '1FR', '-1FR'), + 'BYMONTHDAY' => array(1, -1, -2), + ); + $expect[] = array( + '19971001', + '19971031', + '19971201', + ); + + $tests[] = array( + 'BYDAY' => array('1MO', '1TU', '1WE', '1TH', 'FR'), + 'BYMONTHDAY' => array(1, -1, -2), + ); + $expect[] = array( + '19971001', + '19971031', + '19971201', + ); + + $tests[] = array( + 'BYHOUR' => array(6, 18), + ); + $expect[] = array( + '19970902T060000Z', + '19970902T180000Z', + '19971002T060000Z', + ); + + $tests[] = array( + 'BYMINUTE' => array(6, 18), + ); + $expect[] = array( + '19970902T000600Z', + '19970902T001800Z', + '19971002T000600Z', + ); + + $tests[] = array( + 'BYSECOND' => array(6, 18), + ); + $expect[] = array( + '19970902T000006Z', + '19970902T000018Z', + '19971002T000006Z', + ); + + $tests[] = array( + 'BYMONTHDAY' => array(13, 17), + 'BYHOUR' => array(6, 18), + 'BYSETPOS' => array(3, -3), + ); + $expect[] = array( + '19970913T180000Z', + '19970917T060000Z', + '19971013T180000Z', + ); + + $tests[] = array( + 'BYMONTHDAY' => array(13, 17), + 'BYHOUR' => array(6, 18), + 'BYSETPOS' => array(3, 3, -3), + ); + $expect[] = array( + '19970913T180000Z', + '19970917T060000Z', + '19971013T180000Z', + ); + + $tests[] = array( + 'BYMONTHDAY' => array(13, 17), + 'BYHOUR' => array(6, 18), + 'BYSETPOS' => array(4, -1), + ); + $expect[] = array( + '19970917T180000Z', + '19971017T180000Z', + '19971117T180000Z', + ); + + $this->assertRules( + array( + 'FREQ' => 'MONTHLY', + 'COUNT' => 3, + 'DTSTART' => '19970902', + ), + $tests, + $expect); + } + + public function testWeeklyRecurrenceRules() { + $tests = array(); + $expect = array(); + + $tests[] = array(); + $expect[] = array( + '19970902', + '19970909', + '19970916', + ); + + $tests[] = array( + 'INTERVAL' => 2, + ); + $expect[] = array( + '19970902', + '19970916', + '19970930', + ); + + $tests[] = array( + 'INTERVAL' => 20, + ); + $expect[] = array( + '19970902', + '19980120', + '19980609', + ); + + $tests[] = array( + 'BYMONTH' => array(1, 3), + ); + $expect[] = array( + '19980106', + '19980113', + '19980120', + ); + + $tests[] = array( + 'BYDAY' => array('TU', 'TH'), + ); + $expect[] = array( + '19970902', + '19970904', + '19970909', + ); + + $tests[] = array( + 'BYMONTH' => array(1, 3), + 'BYDAY' => array('TU', 'TH'), + ); + $expect[] = array( + '19980101', + '19980106', + '19980108', + ); + + $tests[] = array( + 'BYHOUR' => array(6, 18), + ); + $expect[] = array( + '19970902T060000Z', + '19970902T180000Z', + '19970909T060000Z', + ); + + $tests[] = array( + 'BYDAY' => array('TU', 'TH'), + 'BYHOUR' => array(6, 18), + 'BYSETPOS' => array(3, -3), + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19970902T180000Z', + '19970904T060000Z', + '19970909T180000Z', + ); + + $this->assertRules( + array( + 'FREQ' => 'WEEKLY', + 'COUNT' => 3, + 'DTSTART' => '19970902', + ), + $tests, + $expect); + } + + public function testDailyRecurrenceRules() { + $tests = array(); + $expect = array(); + + $tests[] = array(); + $expect[] = array( + '19970902', + '19970903', + '19970904', + ); + + $tests[] = array( + 'INTERVAL' => 2, + ); + $expect[] = array( + '19970902', + '19970904', + '19970906', + ); + + $tests[] = array( + 'INTERVAL' => 92, + ); + $expect[] = array( + '19970902', + '19971203', + '19980305', + ); + + $tests[] = array( + 'BYMONTH' => array(1, 3), + ); + $expect[] = array( + '19980101', + '19980102', + '19980103', + ); + + // This is testing that INTERVAL is respected in the presence of a BYMONTH + // filter which skips some months. + $tests[] = array( + 'BYMONTH' => array(12), + 'INTERVAL' => 17, + ); + $expect[] = array( + '19971213', + '19971230', + '19981205', + ); + + $tests[] = array( + 'BYMONTHDAY' => array(1, 3), + ); + $expect[] = array( + '19970903', + '19971001', + '19971003', + ); + + $tests[] = array( + 'BYMONTH' => array(1, 3), + 'BYMONTHDAY' => array(5, 7), + ); + $expect[] = array( + '19980105', + '19980107', + '19980305', + ); + + $tests[] = array( + 'BYDAY' => array('TU', 'TH'), + ); + $expect[] = array( + '19970902', + '19970904', + '19970909', + ); + + $tests[] = array( + 'BYMONTH' => array(1, 3), + 'BYDAY' => array('TU', 'TH'), + ); + $expect[] = array( + '19980101', + '19980106', + '19980108', + ); + + $tests[] = array( + 'BYMONTHDAY' => array(1, 3), + 'BYDAY' => array('TU', 'TH'), + ); + $expect[] = array( + '19980101', + '19980203', + '19980303', + ); + + $tests[] = array( + 'BYMONTH' => array(1, 3), + 'BYMONTHDAY' => array(1, 3), + 'BYDAY' => array('TU', 'TH'), + ); + $expect[] = array( + '19980101', + '19980303', + '20010301', + ); + + $tests[] = array( + 'BYHOUR' => array(6, 18), + 'BYMINUTE' => array(15, 45), + 'BYSETPOS' => array(3, -3), + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19970902T181500Z', + '19970903T064500Z', + '19970903T181500Z', + ); + + $this->assertRules( + array( + 'FREQ' => 'DAILY', + 'COUNT' => 3, + 'DTSTART' => '19970902', + ), + $tests, + $expect); + } + + public function testHourlyRecurrenceRules() { + $tests = array(); + $expect = array(); + + $tests[] = array(); + $expect[] = array( + '19970902T090000Z', + '19970902T100000Z', + '19970902T110000Z', + ); + + $tests[] = array( + 'INTERVAL' => 2, + ); + $expect[] = array( + '19970902T090000Z', + '19970902T110000Z', + '19970902T130000Z', + ); + + $tests[] = array( + 'INTERVAL' => 769, + ); + $expect[] = array( + '19970902T090000Z', + '19971004T100000Z', + '19971105T110000Z', + ); + + $tests[] = array( + 'BYMONTH' => array(1, 3), + ); + $expect[] = array( + '19980101T000000Z', + '19980101T010000Z', + '19980101T020000Z', + ); + + $tests[] = array( + 'BYMONTHDAY' => array(1, 3), + ); + $expect[] = array( + '19970903T000000Z', + '19970903T010000Z', + '19970903T020000Z', + ); + + $tests[] = array( + 'BYMONTH' => array(1, 3), + 'BYMONTHDAY' => array(5, 7), + ); + $expect[] = array( + '19980105T000000Z', + '19980105T010000Z', + '19980105T020000Z', + ); + + $tests[] = array( + 'BYDAY' => array('TU', 'TH'), + ); + $expect[] = array( + '19970902T090000Z', + '19970902T100000Z', + '19970902T110000Z', + ); + + $tests[] = array( + 'BYMONTH' => array(1, 3), + 'BYDAY' => array('TU', 'TH'), + ); + $expect[] = array( + '19980101T000000Z', + '19980101T010000Z', + '19980101T020000Z', + ); + + $tests[] = array( + 'BYMONTHDAY' => array(1, 3), + 'BYDAY' => array('TU', 'TH'), + ); + $expect[] = array( + '19980101T000000Z', + '19980101T010000Z', + '19980101T020000Z', + ); + + $tests[] = array( + 'BYMONTHDAY' => array(1, 3), + 'BYMONTH' => array(1, 3), + 'BYDAY' => array('TU', 'TH'), + ); + $expect[] = array( + '19980101T000000Z', + '19980101T010000Z', + '19980101T020000Z', + ); + + $tests[] = array( + 'COUNT' => 4, + 'BYYEARDAY' => array(1, 100, 200, 365), + ); + $expect[] = array( + '19971231T000000Z', + '19971231T010000Z', + '19971231T020000Z', + '19971231T030000Z', + ); + + $tests[] = array( + 'COUNT' => 4, + 'BYYEARDAY' => array(-365, -266, -166, -1), + ); + $expect[] = array( + '19971231T000000Z', + '19971231T010000Z', + '19971231T020000Z', + '19971231T030000Z', + ); + + $tests[] = array( + 'COUNT' => 4, + 'BYMONTH' => array(4, 7), + 'BYYEARDAY' => array(1, 100, 200, 365), + ); + $expect[] = array( + '19980410T000000Z', + '19980410T010000Z', + '19980410T020000Z', + '19980410T030000Z', + ); + + $tests[] = array( + 'COUNT' => 4, + 'BYMONTH' => array(4, 7), + 'BYYEARDAY' => array(-365, -266, -166, -1), + ); + $expect[] = array( + '19980410T000000Z', + '19980410T010000Z', + '19980410T020000Z', + '19980410T030000Z', + ); + + $tests[] = array( + 'BYHOUR' => array(6, 18), + ); + $expect[] = array( + '19970902T180000Z', + '19970903T060000Z', + '19970903T180000Z', + ); + + $tests[] = array( + 'BYMINUTE' => array(15, 45), + 'BYSECOND' => array(15, 45), + 'BYSETPOS' => array(3, -3), + ); + $expect[] = array( + '19970902T091545Z', + '19970902T094515Z', + '19970902T101545Z', + ); + + $this->assertRules( + array( + 'FREQ' => 'HOURLY', + 'COUNT' => 3, + 'DTSTART' => '19970902T090000Z', + ), + $tests, + $expect); + } + + public function testMinutelyRecurrenceRules() { + $tests = array(); + $expect = array(); + + $tests[] = array( + ); + $expect[] = array( + '19970902T090000Z', + '19970902T090100Z', + '19970902T090200Z', + ); + + $tests[] = array( + 'INTERVAL' => 2, + ); + $expect[] = array( + '19970902T090000Z', + '19970902T090200Z', + '19970902T090400Z', + ); + + $tests[] = array( + 'BYHOUR' => array(6, 18), + 'BYMINUTE' => array(6, 18), + 'BYSECOND' => array(6, 18), + ); + $expect[] = array( + '19970902T180606Z', + '19970902T180618Z', + '19970902T181806Z', + ); + + $tests[] = array( + 'BYSECOND' => array(15, 30, 45), + 'BYSETPOS' => array(3, -3), + ); + $expect[] = array( + '19970902T090015Z', + '19970902T090045Z', + '19970902T090115Z', + ); + + $this->assertRules( + array( + 'FREQ' => 'MINUTELY', + 'COUNT' => 3, + 'DTSTART' => '19970902T090000Z', + ), + $tests, + $expect); + } + + public function testSecondlyRecurrenceRules() { + $tests = array(); + $expect = array(); + + $tests[] = array(); + $expect[] = array( + '19970902T090000Z', + '19970902T090001Z', + '19970902T090002Z', + ); + + $tests[] = array( + 'INTERVAL' => 2, + ); + $expect[] = array( + '19970902T090000Z', + '19970902T090002Z', + '19970902T090004Z', + ); + + $tests[] = array( + 'INTERVAL' => 90061, + ); + $expect[] = array( + '19970902T090000Z', + '19970903T100101Z', + '19970904T110202Z', + ); + + $tests[] = array( + 'BYSECOND' => array(0), + 'BYMINUTE' => array(1), + 'DTSTART' => '20100322T120100Z', + ); + $expect[] = array( + '20100322T120100Z', + '20100322T130100Z', + '20100322T140100Z', + ); + + $this->assertRules( + array( + 'FREQ' => 'SECONDLY', + 'COUNT' => 3, + 'DTSTART' => '19970902T090000Z', + ), + $tests, + $expect); + } + + public function testRFC5545RecurrenceRules() { + // These tests are derived from the examples in RFC5545. + $tests = array(); + $expect = array(); + + $tests[] = array( + 'FREQ' => 'DAILY', + 'COUNT' => 10, + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19970902T090000Z', + '19970903T090000Z', + '19970904T090000Z', + '19970905T090000Z', + '19970906T090000Z', + '19970907T090000Z', + '19970908T090000Z', + '19970909T090000Z', + '19970910T090000Z', + '19970911T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'DAILY', + 'INTERVAL' => 2, + 'DTSTART' => '19970902T090000Z', + 'COUNT' => 5, + ); + $expect[] = array( + '19970902T090000Z', + '19970904T090000Z', + '19970906T090000Z', + '19970908T090000Z', + '19970910T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'YEARLY', + 'BYMONTH' => array(1), + 'BYDAY' => array('MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU'), + 'DTSTART' => '19970902T090000Z', + 'COUNT' => 3, + ); + $expect[] = array( + '19980101T090000Z', + '19980102T090000Z', + '19980103T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'MONTHLY', + 'COUNT' => 3, + 'BYDAY' => array('1FR'), + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19970905T090000Z', + '19971003T090000Z', + '19971107T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'MONTHLY', + 'INTERVAL' => 2, + 'COUNT' => 5, + 'BYDAY' => array('1SU', '-1SU'), + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19970907T090000Z', + '19970928T090000Z', + '19971102T090000Z', + '19971130T090000Z', + '19980104T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'MONTHLY', + 'COUNT' => 6, + 'BYDAY' => array('-2MO'), + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19970922T090000Z', + '19971020T090000Z', + '19971117T090000Z', + '19971222T090000Z', + '19980119T090000Z', + '19980216T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'MONTHLY', + 'COUNT' => 6, + 'BYMONTHDAY' => array(-3), + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19970928T090000Z', + '19971029T090000Z', + '19971128T090000Z', + '19971229T090000Z', + '19980129T090000Z', + '19980226T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'MONTHLY', + 'COUNT' => 5, + 'BYMONTHDAY' => array(2, 15), + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19970902T090000Z', + '19970915T090000Z', + '19971002T090000Z', + '19971015T090000Z', + '19971102T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'MONTHLY', + 'COUNT' => 5, + 'BYMONTHDAY' => array(-1, 1), + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19970930T090000Z', + '19971001T090000Z', + '19971031T090000Z', + '19971101T090000Z', + '19971130T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'MONTHLY', + 'COUNT' => 7, + 'INTERVAL' => 18, + 'BYMONTHDAY' => array(10, 11, 12, 13, 14, 15), + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19970910T090000Z', + '19970911T090000Z', + '19970912T090000Z', + '19970913T090000Z', + '19970914T090000Z', + '19970915T090000Z', + '19990310T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'MONTHLY', + 'COUNT' => 6, + 'INTERVAL' => 2, + 'BYDAY' => array('TU'), + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19970902T090000Z', + '19970909T090000Z', + '19970916T090000Z', + '19970923T090000Z', + '19970930T090000Z', + '19971104T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'YEARLY', + 'COUNT' => 10, + 'BYMONTH' => array(6, 7), + 'DTSTART' => '19970610T090000Z', + ); + $expect[] = array( + '19970610T090000Z', + '19970710T090000Z', + '19980610T090000Z', + '19980710T090000Z', + '19990610T090000Z', + '19990710T090000Z', + '20000610T090000Z', + '20000710T090000Z', + '20010610T090000Z', + '20010710T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'YEARLY', + 'COUNT' => 4, + 'INTERVAL' => 3, + 'BYYEARDAY' => array(1, 100, 200), + 'DTSTART' => '19970101T090000Z', + ); + $expect[] = array( + '19970101T090000Z', + '19970410T090000Z', + '19970719T090000Z', + '20000101T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'YEARLY', + 'COUNT' => 3, + 'BYDAY' => array('20MO'), + 'DTSTART' => '19970519T090000Z', + ); + $expect[] = array( + '19970519T090000Z', + '19980518T090000Z', + '19990517T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'YEARLY', + 'COUNT' => 3, + 'BYWEEKNO' => array(20), + 'BYDAY' => array('MO'), + 'DTSTART' => '19970512T090000Z', + ); + $expect[] = array( + '19970512T090000Z', + '19980511T090000Z', + '19990517T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'YEARLY', + 'BYDAY' => array('TH'), + 'BYMONTH' => array(3), + 'DTSTART' => '19970313T090000Z', + 'COUNT' => 5, + ); + $expect[] = array( + '19970313T090000Z', + '19970320T090000Z', + '19970327T090000Z', + '19980305T090000Z', + '19980312T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'YEARLY', + 'BYDAY' => array('TH'), + 'BYMONTH' => array(6, 7, 8), + 'DTSTART' => '19970101T090000Z', + 'COUNT' => 15, + ); + $expect[] = array( + '19970605T090000Z', + '19970612T090000Z', + '19970619T090000Z', + '19970626T090000Z', + '19970703T090000Z', + '19970710T090000Z', + '19970717T090000Z', + '19970724T090000Z', + '19970731T090000Z', + '19970807T090000Z', + '19970814T090000Z', + '19970821T090000Z', + '19970828T090000Z', + '19980604T090000Z', + '19980611T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'YEARLY', + 'BYDAY' => array('FR'), + 'BYMONTHDAY' => array(13), + 'COUNT' => 4, + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19980213T090000Z', + '19980313T090000Z', + '19981113T090000Z', + '19990813T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'MONTHLY', + 'BYDAY' => array('SA'), + 'BYMONTHDAY' => array(7, 8, 9, 10, 11, 12, 13), + 'COUNT' => 10, + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19970913T090000Z', + '19971011T090000Z', + '19971108T090000Z', + '19971213T090000Z', + '19980110T090000Z', + '19980207T090000Z', + '19980307T090000Z', + '19980411T090000Z', + '19980509T090000Z', + '19980613T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'YEARLY', + 'INTERVAL' => 4, + 'BYMONTH' => array(11), + 'BYDAY' => array('TU'), + 'BYMONTHDAY' => array(2, 3, 4, 5, 6, 7, 8), + 'COUNT' => 6, + 'DTSTART' => '19961105T090000Z', + ); + $expect[] = array( + '19961105T090000Z', + '20001107T090000Z', + '20041102T090000Z', + '20081104T090000Z', + '20121106T090000Z', + '20161108T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'MONTHLY', + 'BYDAY' => array('TU', 'WE', 'TH'), + 'BYSETPOS' => array(3), + 'COUNT' => 3, + 'DTSTART' => '19970904T090000Z', + ); + $expect[] = array( + '19970904T090000Z', + '19971007T090000Z', + '19971106T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'MONTHLY', + 'BYDAY' => array('MO', 'TU', 'WE', 'TH', 'FR'), + 'BYSETPOS' => array(-2), + 'COUNT' => 3, + 'DTSTART' => '19970929T090000Z', + ); + $expect[] = array( + '19970929T090000Z', + '19971030T090000Z', + '19971127T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'HOURLY', + 'INTERVAL' => 3, + 'DTSTART' => '19970929T090000Z', + 'COUNT' => 3, + ); + $expect[] = array( + '19970929T090000Z', + '19970929T120000Z', + '19970929T150000Z', + ); + + $tests[] = array( + 'FREQ' => 'MINUTELY', + 'INTERVAL' => 15, + 'COUNT' => 6, + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19970902T090000Z', + '19970902T091500Z', + '19970902T093000Z', + '19970902T094500Z', + '19970902T100000Z', + '19970902T101500Z', + ); + + $tests[] = array( + 'FREQ' => 'MINUTELY', + 'INTERVAL' => 90, + 'COUNT' => 4, + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19970902T090000Z', + '19970902T103000Z', + '19970902T120000Z', + '19970902T133000Z', + ); + + $tests[] = array( + 'FREQ' => 'WEEKLY', + 'COUNT' => 10, + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19970902T090000Z', + '19970909T090000Z', + '19970916T090000Z', + '19970923T090000Z', + '19970930T090000Z', + '19971007T090000Z', + '19971014T090000Z', + '19971021T090000Z', + '19971028T090000Z', + '19971104T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'WEEKLY', + 'INTERVAL' => 2, + 'COUNT' => 6, + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19970902T090000Z', + '19970916T090000Z', + '19970930T090000Z', + '19971014T090000Z', + '19971028T090000Z', + '19971111T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'WEEKLY', + 'COUNT' => 10, + 'WKST' => 'SU', + 'BYDAY' => array('TU', 'TH'), + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19970902T090000Z', + '19970904T090000Z', + '19970909T090000Z', + '19970911T090000Z', + '19970916T090000Z', + '19970918T090000Z', + '19970923T090000Z', + '19970925T090000Z', + '19970930T090000Z', + '19971002T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'WEEKLY', + 'INTERVAL' => 2, + 'COUNT' => 8, + 'WKST' => 'SU', + 'BYDAY' => array('TU', 'TH'), + 'DTSTART' => '19970902T090000Z', + ); + $expect[] = array( + '19970902T090000Z', + '19970904T090000Z', + '19970916T090000Z', + '19970918T090000Z', + '19970930T090000Z', + '19971002T090000Z', + '19971014T090000Z', + '19971016T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'WEEKLY', + 'INTERVAL' => 2, + 'COUNT' => 4, + 'BYDAY' => array('TU', 'SU'), + 'WKST' => 'MO', + 'DTSTART' => '19970805T090000Z', + ); + $expect[] = array( + '19970805T090000Z', + '19970810T090000Z', + '19970819T090000Z', + '19970824T090000Z', + ); + + $tests[] = array( + 'FREQ' => 'WEEKLY', + 'INTERVAL' => 2, + 'COUNT' => 4, + 'BYDAY' => array('TU', 'SU'), + 'WKST' => 'SU', + 'DTSTART' => '19970805T090000Z', + ); + $expect[] = array( + '19970805T090000Z', + '19970817T090000Z', + '19970819T090000Z', + '19970831T090000Z', + ); + + + $this->assertRules(array(), $tests, $expect); + } + + + private function assertRules(array $defaults, array $tests, array $expect) { + foreach ($tests as $key => $test) { + $options = $test + $defaults; + + $start = PhutilCalendarAbsoluteDateTime::newFromISO8601( + $options['DTSTART']); + + $rrule = id(new PhutilCalendarRecurrenceRule()) + ->setStartDateTime($start) + ->setFrequency($options['FREQ']); + + $interval = idx($options, 'INTERVAL'); + if ($interval) { + $rrule->setInterval($interval); + } + + $by_day = idx($options, 'BYDAY'); + if ($by_day) { + $rrule->setByDay($by_day); + } + + $by_month = idx($options, 'BYMONTH'); + if ($by_month) { + $rrule->setByMonth($by_month); + } + + $by_monthday = idx($options, 'BYMONTHDAY'); + if ($by_monthday) { + $rrule->setByMonthDay($by_monthday); + } + + $by_yearday = idx($options, 'BYYEARDAY'); + if ($by_yearday) { + $rrule->setByYearDay($by_yearday); + } + + $by_weekno = idx($options, 'BYWEEKNO'); + if ($by_weekno) { + $rrule->setByWeekNumber($by_weekno); + } + + $by_hour = idx($options, 'BYHOUR'); + if ($by_hour) { + $rrule->setByHour($by_hour); + } + + $by_minute = idx($options, 'BYMINUTE'); + if ($by_minute) { + $rrule->setByMinute($by_minute); + } + + $by_second = idx($options, 'BYSECOND'); + if ($by_second) { + $rrule->setBySecond($by_second); + } + + $by_setpos = idx($options, 'BYSETPOS'); + if ($by_setpos) { + $rrule->setBySetPosition($by_setpos); + } + + $week_start = idx($options, 'WKST'); + if ($week_start) { + $rrule->setWeekStart($week_start); + } + + $set = id(new PhutilCalendarRecurrenceSet()) + ->addSource($rrule); + + $result = $set->getEventsBetween(null, null, $options['COUNT']); + + $this->assertEqual( + $expect[$key], + mpull($result, 'getISO8601')); + } + } + + +} diff --git a/src/parser/calendar/data/__tests__/PhutilCalendarRecurrenceTestCase.php b/src/parser/calendar/data/__tests__/PhutilCalendarRecurrenceTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/data/__tests__/PhutilCalendarRecurrenceTestCase.php @@ -0,0 +1,196 @@ +getEventsBetween(null, null, 0xFFFF); + $this->assertEqual( + array(), + $result, + pht('Set with no sources.')); + + + $set = id(new PhutilCalendarRecurrenceSet()) + ->addSource(new PhutilCalendarRecurrenceList()); + $result = $set->getEventsBetween(null, null, 0xFFFF); + $this->assertEqual( + array(), + $result, + pht('Set with empty list source.')); + + + $list = array( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), + ); + + $source = id(new PhutilCalendarRecurrenceList()) + ->setDates($list); + + $set = id(new PhutilCalendarRecurrenceSet()) + ->addSource($source); + + $expect = array( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), + ); + + $result = $set->getEventsBetween(null, null, 0xFFFF); + $this->assertEqual( + mpull($expect, 'getISO8601'), + mpull($result, 'getISO8601'), + pht('Simple date list.')); + + $list_a = array( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), + ); + + $list_b = array( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), + ); + + $source_a = id(new PhutilCalendarRecurrenceList()) + ->setDates($list_a); + + $source_b = id(new PhutilCalendarRecurrenceList()) + ->setDates($list_b); + + $set = id(new PhutilCalendarRecurrenceSet()) + ->addSource($source_a) + ->addSource($source_b); + + $expect = array( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), + ); + + $result = $set->getEventsBetween(null, null, 0xFFFF); + $this->assertEqual( + mpull($expect, 'getISO8601'), + mpull($result, 'getISO8601'), + pht('Multiple date lists.')); + + $list_a = array( + // This is Jan 1, 3, 5, 7, 8 and 10, but listed out-of-order. + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160105T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160108T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160110T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160107T120000Z'), + ); + + $list_b = array( + // This is Jan 2, 4, 5, 8, but listed out of order. + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160104T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160105T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160108T120000Z'), + ); + + $list_c = array( + // We're going to use this as an exception list. + + // This is Jan 7 (listed in one other source), 8 (listed in two) + // and 9 (listed in none). + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160107T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160108T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160109T120000Z'), + ); + + $expect = array( + // From source A. + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), + // From source B. + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), + // From source A. + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), + // From source B. + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160104T120000Z'), + // From source A and B. Should appear only once. + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160105T120000Z'), + // The 6th appears in no source. + // The 7th, 8th and 9th are excluded. + // The 10th is from source A. + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160110T120000Z'), + ); + + $list_a = id(new PhutilCalendarRecurrenceList()) + ->setDates($list_a); + + $list_b = id(new PhutilCalendarRecurrenceList()) + ->setDates($list_b); + + $list_c = id(new PhutilCalendarRecurrenceList()) + ->setDates($list_c) + ->setIsExceptionSource(true); + + $date_set = id(new PhutilCalendarRecurrenceSet()) + ->addSource($list_b) + ->addSource($list_c) + ->addSource($list_a); + + $date_set->setViewerTimezone('UTC'); + + $result = $date_set->getEventsBetween(null, null, 0xFFFF); + $this->assertEqual( + mpull($expect, 'getISO8601'), + mpull($result, 'getISO8601'), + pht('Set of all results in multiple lists with exclusions.')); + + + $expect = array( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), + ); + $result = $date_set->getEventsBetween(null, null, 1); + $this->assertEqual( + mpull($expect, 'getISO8601'), + mpull($result, 'getISO8601'), + pht('Multiple lists, one result.')); + + $expect = array( + 2 => PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), + 3 => PhutilCalendarAbsoluteDateTime::newFromISO8601('20160104T120000Z'), + ); + $result = $date_set->getEventsBetween( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160104T120000Z')); + $this->assertEqual( + mpull($expect, 'getISO8601'), + mpull($result, 'getISO8601'), + pht('Multiple lists, time window.')); + } + + public function testCalendarRecurrenceOffsets() { + $list = array( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160101T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120000Z'), + ); + + $source = id(new PhutilCalendarRecurrenceList()) + ->setDates($list); + + $set = id(new PhutilCalendarRecurrenceSet()) + ->addSource($source); + + $t1 = PhutilCalendarAbsoluteDateTime::newFromISO8601('20160102T120001Z'); + $t2 = PhutilCalendarAbsoluteDateTime::newFromISO8601('20160103T120000Z'); + + $expect = array( + 2 => $t2, + ); + + $result = $set->getEventsBetween($t1, null, 0xFFFF); + $this->assertEqual( + mpull($expect, 'getISO8601'), + mpull($result, 'getISO8601'), + pht('Correct event indexes with start date.')); + } + +} diff --git a/src/parser/calendar/ics/PhutilICSParser.php b/src/parser/calendar/ics/PhutilICSParser.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/PhutilICSParser.php @@ -0,0 +1,919 @@ +stack = array(); + $this->node = null; + $this->cursor = null; + $this->warnings = array(); + + $lines = $this->unfoldICSLines($data); + $this->lines = $lines; + + $root = $this->newICSNode(''); + $this->stack[] = $root; + $this->node = $root; + + foreach ($lines as $key => $line) { + $this->cursor = $key; + $matches = null; + if (preg_match('(^BEGIN:(.*)\z)', $line, $matches)) { + $this->beginParsingNode($matches[1]); + } else if (preg_match('(^END:(.*)\z)', $line, $matches)) { + $this->endParsingNode($matches[1]); + } else { + if (count($this->stack) < 2) { + $this->raiseParseFailure( + self::PARSE_ROOT_PROPERTY, + pht( + 'Found unexpected property at ICS document root.')); + } + $this->parseICSProperty($line); + } + } + + if (count($this->stack) > 1) { + $this->raiseParseFailure( + self::PARSE_MISSING_END, + pht( + 'Expected all "BEGIN:" sections in ICS document to have '. + 'corresponding "END:" sections.')); + } + + $this->node = null; + $this->lines = null; + $this->cursor = null; + + return $root; + } + + private function getNode() { + return $this->node; + } + + private function unfoldICSLines($data) { + $lines = phutil_split_lines($data, $retain_endings = false); + $this->lines = $lines; + + // ICS files are wrapped at 75 characters, with overlong lines continued + // on the following line with an initial space or tab. Unwrap all of the + // lines in the file. + + // This unwrapping is specifically byte-oriented, not character oriented, + // and RFC5545 anticipates that simple implementations may even split UTF8 + // characters in the middle. + + $last = null; + foreach ($lines as $idx => $line) { + $this->cursor = $idx; + if (!preg_match('/^[ \t]/', $line)) { + $last = $idx; + continue; + } + + if ($last === null) { + $this->raiseParseFailure( + self::PARSE_INITIAL_UNFOLD, + pht( + 'First line of ICS file begins with a space or tab, but this '. + 'marks a line which should be unfolded.')); + } + + $lines[$last] = $lines[$last].substr($line, 1); + unset($lines[$idx]); + } + + return $lines; + } + + private function beginParsingNode($type) { + $node = $this->getNode(); + $new_node = $this->newICSNode($type); + + if ($node instanceof PhutilCalendarContainerNode) { + $node->appendChild($new_node); + } else { + $this->raiseParseFailure( + self::PARSE_UNEXPECTED_CHILD, + pht( + 'Found unexpected node "%s" inside node "%s".', + $new_node->getAttribute('ics.type'), + $node->getAttribute('ics.type'))); + } + + $this->stack[] = $new_node; + $this->node = $new_node; + + return $this; + } + + private function newICSNode($type) { + switch ($type) { + case '': + $node = new PhutilCalendarRootNode(); + break; + case 'VCALENDAR': + $node = new PhutilCalendarDocumentNode(); + break; + case 'VEVENT': + $node = new PhutilCalendarEventNode(); + break; + default: + $node = new PhutilCalendarRawNode(); + break; + } + + $node->setAttribute('ics.type', $type); + + return $node; + } + + private function endParsingNode($type) { + $node = $this->getNode(); + if ($node instanceof PhutilCalendarRootNode) { + $this->raiseParseFailure( + self::PARSE_EXTRA_END, + pht( + 'Found unexpected "END" without a "BEGIN".')); + } + + $old_type = $node->getAttribute('ics.type'); + if ($old_type != $type) { + $this->raiseParseFailure( + self::PARSE_MISMATCHED_SECTIONS, + pht( + 'Found mismatched "BEGIN" ("%s") and "END" ("%s") sections.', + $old_type, + $type)); + } + + array_pop($this->stack); + $this->node = last($this->stack); + + return $this; + } + + private function parseICSProperty($line) { + $matches = null; + + // Properties begin with an alphanumeric name with no escaping, followed + // by either a ";" (to begin a list of parameters) or a ":" (to begin + // the actual field body). + + $ok = preg_match('(^([A-Za-z0-9-]+)([;:])(.*)\z)', $line, $matches); + if (!$ok) { + $this->raiseParseFailure( + self::PARSE_MALFORMED_PROPERTY, + pht( + 'Found malformed property in ICS document.')); + } + + $name = $matches[1]; + $body = $matches[3]; + $has_parameters = ($matches[2] == ';'); + + $parameters = array(); + if ($has_parameters) { + // Parameters are a sensible name, a literal "=", a pile of magic, + // and then maybe a comma and another parameter. + + while (true) { + // We're going to get the first couple of parts first. + $ok = preg_match('(^([^=]+)=)', $body, $matches); + if (!$ok) { + $this->raiseParseFailure( + self::PARSE_MALFORMED_PARAMETER_NAME, + pht( + 'Found malformed property in ICS document: %s', + $body)); + } + + $param_name = $matches[1]; + $body = substr($body, strlen($matches[0])); + + // Now we're going to match zero or more values. + $param_values = array(); + while (true) { + // The value can either be a double-quoted string or an unquoted + // string, with some characters forbidden. + if (strlen($body) && $body[0] == '"') { + $is_quoted = true; + $ok = preg_match( + '(^"([^\x00-\x08\x10-\x19"]*)")', + $body, + $matches); + if (!$ok) { + $this->raiseParseFailure( + self::PARSE_MALFORMED_DOUBLE_QUOTE, + pht( + 'Found malformed double-quoted string in ICS document '. + 'parameter value.')); + } + } else { + $is_quoted = false; + + // It's impossible for this not to match since it can match + // nothing, and it's valid for it to match nothing. + preg_match('(^([^\x00-\x08\x10-\x19";:,]*))', $body, $matches); + } + + // NOTE: RFC5545 says "Property parameter values that are not in + // quoted-strings are case-insensitive." -- that is, the quoted and + // unquoted representations are not equivalent. Thus, preserve the + // original formatting in case we ever need to respect this. + + $param_values[] = array( + 'value' => $this->unescapeParameterValue($matches[1]), + 'quoted' => $is_quoted, + ); + + $body = substr($body, strlen($matches[0])); + if (!strlen($body)) { + $this->raiseParseFailure( + self::PARSE_MISSING_VALUE, + pht( + 'Expected ":" after parameters in ICS document property.')); + } + + // If we have a comma now, we're going to read another value. Strip + // it off and keep going. + if ($body[0] == ',') { + $body = substr($body, 1); + continue; + } + + // If we have a semicolon, we're going to read another parameter. + if ($body[0] == ';') { + break; + } + + // If we have a colon, this is the last value and also the last + // property. Break, then handle the colon below. + if ($body[0] == ':') { + break; + } + + $short_body = id(new PhutilUTF8StringTruncator()) + ->setMaximumGlyphs(32) + ->truncateString($body); + + // We aren't expecting anything else. + $this->raiseParseFailure( + self::PARSE_UNEXPECTED_TEXT, + pht( + 'Found unexpected text ("%s") after reading parameter value.', + $short_body)); + } + + $parameters[] = array( + 'name' => $param_name, + 'values' => $param_values, + ); + + if ($body[0] == ';') { + $body = substr($body, 1); + continue; + } + + if ($body[0] == ':') { + $body = substr($body, 1); + break; + } + } + } + + $value = $this->unescapeFieldValue($name, $parameters, $body); + + $node = $this->getNode(); + + + $raw = $node->getAttribute('ics.properties', array()); + $raw[] = array( + 'name' => $name, + 'parameters' => $parameters, + 'value' => $value, + ); + $node->setAttribute('ics.properties', $raw); + + switch ($node->getAttribute('ics.type')) { + case 'VEVENT': + $this->didParseEventProperty($node, $name, $parameters, $value); + break; + } + } + + private function unescapeParameterValue($data) { + // The parameter grammar is adjusted by RFC6868 to permit escaping with + // carets. Remove that escaping. + + // This escaping is a bit weird because it's trying to be backwards + // compatible and the original spec didn't think about this and didn't + // provide much room to fix things. + + $out = ''; + $esc = false; + foreach (phutil_utf8v($data) as $c) { + if (!$esc) { + if ($c != '^') { + $out .= $c; + } else { + $esc = true; + } + } else { + switch ($c) { + case 'n': + $out .= "\n"; + break; + case '^': + $out .= '^'; + break; + case "'": + // NOTE: This is " " being decoded into a + // double quote! + $out .= '"'; + break; + default: + // NOTE: The caret is NOT an escape for any other characters. + // This is a "MUST" requirement of RFC6868. + $out .= '^'.$c; + break; + } + } + } + + // NOTE: Because caret on its own just means "caret" for backward + // compatibility, we don't warn if we're still in escaped mode once we + // reach the end of the string. + + return $out; + } + + private function unescapeFieldValue($name, array $parameters, $data) { + // NOTE: The encoding of the field value data is dependent on the field + // name (which defines a default encoding) and the parameters (which may + // include "VALUE", specifying a type of the data. + + $default_types = array( + 'CALSCALE' => 'TEXT', + 'METHOD' => 'TEXT', + 'PRODID' => 'TEXT', + 'VERSION' => 'TEXT', + + 'ATTACH' => 'URI', + 'CATEGORIES' => 'TEXT', + 'CLASS' => 'TEXT', + 'COMMENT' => 'TEXT', + 'DESCRIPTION' => 'TEXT', + + // TODO: The spec appears to contradict itself: it says that the value + // type is FLOAT, but it also says that this property value is actually + // two semicolon-separated values, which is not what FLOAT is defined as. + 'GEO' => 'TEXT', + + 'LOCATION' => 'TEXT', + 'PERCENT-COMPLETE' => 'INTEGER', + 'PRIORITY' => 'INTEGER', + 'RESOURCES' => 'TEXT', + 'STATUS' => 'TEXT', + 'SUMMARY' => 'TEXT', + + 'COMPLETED' => 'DATE-TIME', + 'DTEND' => 'DATE-TIME', + 'DUE' => 'DATE-TIME', + 'DTSTART' => 'DATE-TIME', + 'DURATION' => 'DURATION', + 'FREEBUSY' => 'PERIOD', + 'TRANSP' => 'TEXT', + + 'TZID' => 'TEXT', + 'TZNAME' => 'TEXT', + 'TZOFFSETFROM' => 'UTC-OFFSET', + 'TZOFFSETTO' => 'UTC-OFFSET', + 'TZURL' => 'URI', + + 'ATTENDEE' => 'CAL-ADDRESS', + 'CONTACT' => 'TEXT', + 'ORGANIZER' => 'CAL-ADDRESS', + 'RECURRENCE-ID' => 'DATE-TIME', + 'RELATED-TO' => 'TEXT', + 'URL' => 'URI', + 'UID' => 'TEXT', + 'EXDATE' => 'DATE-TIME', + 'RDATE' => 'DATE-TIME', + 'RRULE' => 'RECUR', + + 'ACTION' => 'TEXT', + 'REPEAT' => 'INTEGER', + 'TRIGGER' => 'DURATION', + + 'CREATED' => 'DATE-TIME', + 'DTSTAMP' => 'DATE-TIME', + 'LAST-MODIFIED' => 'DATE-TIME', + 'SEQUENCE' => 'INTEGER', + + 'REQUEST-STATUS' => 'TEXT', + ); + + $value_type = idx($default_types, $name, 'TEXT'); + + foreach ($parameters as $parameter) { + if ($parameter['name'] == 'VALUE') { + $value_type = idx(head($parameter['values']), 'value'); + } + } + + switch ($value_type) { + case 'BINARY': + $result = base64_decode($data, true); + if ($result === false) { + $this->raiseParseFailure( + self::PARSE_BAD_BASE64, + pht( + 'Unable to decode base64 data: %s', + $data)); + } + break; + case 'BOOLEAN': + $map = array( + 'true' => true, + 'false' => false, + ); + $result = phutil_utf8_strtolower($data); + if (!isset($map[$result])) { + $this->raiseParseFailure( + self::PARSE_BAD_BOOLEAN, + pht( + 'Unexpected BOOLEAN value "%s".', + $data)); + } + $result = $map[$result]; + break; + case 'CAL-ADDRESS': + $result = $data; + break; + case 'DATE': + // This is a comma-separated list of "YYYYMMDD" values. + $result = explode(',', $data); + break; + case 'DATE-TIME': + if (!strlen($data)) { + $result = array(); + } else { + $result = explode(',', $data); + } + break; + case 'DURATION': + if (!strlen($data)) { + $result = array(); + } else { + $result = explode(',', $data); + } + break; + case 'FLOAT': + $result = explode(',', $data); + foreach ($result as $k => $v) { + $result[$k] = (float)$v; + } + break; + case 'INTEGER': + $result = explode(',', $data); + foreach ($result as $k => $v) { + $result[$k] = (int)$v; + } + break; + case 'PERIOD': + $result = explode(',', $data); + break; + case 'RECUR': + $result = $data; + break; + case 'TEXT': + $result = $this->unescapeTextValue($data); + break; + case 'TIME': + $result = explode(',', $data); + break; + case 'URI': + $result = $data; + break; + case 'UTC-OFFSET': + $result = $data; + break; + default: + // RFC5545 says we MUST preserve the data for any types we don't + // recognize. + $result = $data; + break; + } + + return array( + 'type' => $value_type, + 'value' => $result, + 'raw' => $data, + ); + } + + private function unescapeTextValue($data) { + $result = array(); + + $buf = ''; + $esc = false; + foreach (phutil_utf8v($data) as $c) { + if (!$esc) { + if ($c == '\\') { + $esc = true; + } else if ($c == ',') { + $result[] = $buf; + $buf = ''; + } else { + $buf .= $c; + } + } else { + switch ($c) { + case 'n': + case 'N': + $buf .= "\n"; + break; + default: + $buf .= $c; + break; + } + $esc = false; + } + } + + if ($esc) { + $this->raiseParseFailure( + self::PARSE_UNESCAPED_BACKSLASH, + pht( + 'ICS document contains TEXT value ending with unescaped '. + 'backslash.')); + } + + $result[] = $buf; + + return $result; + } + + private function raiseParseFailure($code, $message) { + if ($this->lines && isset($this->lines[$this->cursor])) { + $message = pht( + "ICS Parse Error near line %s:\n\n>>> %s\n\n%s", + $this->cursor + 1, + $this->lines[$this->cursor], + $message); + } else { + $message = pht( + 'ICS Parse Error: %s', + $message); + } + + throw id(new PhutilICSParserException($message)) + ->setParserFailureCode($code); + } + + private function raiseWarning($code, $message) { + $this->warnings[] = array( + 'code' => $code, + 'line' => $this->cursor, + 'text' => $this->lines[$this->cursor], + 'message' => $message, + ); + + return $this; + } + + public function getWarnings() { + return $this->warnings; + } + + private function didParseEventProperty( + PhutilCalendarEventNode $node, + $name, + array $parameters, + array $value) { + + switch ($name) { + case 'UID': + $text = $this->newTextFromProperty($parameters, $value); + $node->setUID($text); + break; + case 'CREATED': + $datetime = $this->newDateTimeFromProperty($parameters, $value); + $node->setCreatedDateTime($datetime); + break; + case 'DTSTAMP': + $datetime = $this->newDateTimeFromProperty($parameters, $value); + $node->setModifiedDateTime($datetime); + break; + case 'SUMMARY': + $text = $this->newTextFromProperty($parameters, $value); + $node->setName($text); + break; + case 'DESCRIPTION': + $text = $this->newTextFromProperty($parameters, $value); + $node->setDescription($text); + break; + case 'DTSTART': + $datetime = $this->newDateTimeFromProperty($parameters, $value); + $node->setStartDateTime($datetime); + break; + case 'DTEND': + $datetime = $this->newDateTimeFromProperty($parameters, $value); + $node->setEndDateTime($datetime); + break; + case 'DURATION': + $duration = $this->newDurationFromProperty($parameters, $value); + $node->setDuration($duration); + break; + case 'RRULE': + $rrule = $this->newRecurrenceRuleFromProperty($parameters, $value); + $node->setRecurrenceRule($rrule); + break; + case 'RECURRENCE-ID': + $text = $this->newTextFromProperty($parameters, $value); + $node->setRecurrenceID($text); + break; + case 'ATTENDEE': + $attendee = $this->newAttendeeFromProperty($parameters, $value); + $node->addAttendee($attendee); + break; + } + + } + + private function newTextFromProperty(array $parameters, array $value) { + $value = $value['value']; + return implode("\n\n", $value); + } + + private function newAttendeeFromProperty(array $parameters, array $value) { + $uri = $value['value']; + + switch (idx($parameters, 'PARTSTAT')) { + case 'ACCEPTED': + $status = PhutilCalendarUserNode::STATUS_ACCEPTED; + break; + case 'DECLINED': + $status = PhutilCalendarUserNode::STATUS_DECLINED; + break; + case 'NEEDS-ACTION': + default: + $status = PhutilCalendarUserNode::STATUS_INVITED; + break; + } + + $name = $this->getScalarParameterValue($parameters, 'CN'); + + return id(new PhutilCalendarUserNode()) + ->setURI($uri) + ->setName($name) + ->setStatus($status); + } + + private function newDateTimeFromProperty(array $parameters, array $value) { + $value = $value['value']; + + if (!$value) { + $this->raiseParseFailure( + self::PARSE_EMPTY_DATETIME, + pht( + 'Expected DATE-TIME to have exactly one value, found none.')); + + } + + if (count($value) > 1) { + $this->raiseParseFailure( + self::PARSE_MANY_DATETIME, + pht( + 'Expected DATE-TIME to have exactly one value, found more than '. + 'one.')); + } + + $value = head($value); + $tzid = $this->getScalarParameterValue($parameters, 'TZID'); + + if (preg_match('/Z\z/', $value)) { + if ($tzid) { + $this->raiseWarning( + self::WARN_TZID_UTC, + pht( + 'DATE-TIME "%s" uses "Z" to specify UTC, but also has a TZID '. + 'parameter with value "%s". This violates RFC5545. The TZID '. + 'will be ignored, and the value will be interpreted as UTC.', + $value, + $tzid)); + } + $tzid = 'UTC'; + } else if ($tzid !== null) { + $tzid = $this->guessTimezone($tzid); + } + + try { + $datetime = PhutilCalendarAbsoluteDateTime::newFromISO8601( + $value, + $tzid); + } catch (Exception $ex) { + $this->raiseParseFailure( + self::PARSE_BAD_DATETIME, + pht( + 'Error parsing DATE-TIME: %s', + $ex->getMessage())); + } + + return $datetime; + } + + private function newDurationFromProperty(array $parameters, array $value) { + $value = $value['value']; + + if (!$value) { + $this->raiseParseFailure( + self::PARSE_EMPTY_DURATION, + pht( + 'Expected DURATION to have exactly one value, found none.')); + + } + + if (count($value) > 1) { + $this->raiseParseFailure( + self::PARSE_MANY_DURATION, + pht( + 'Expected DURATION to have exactly one value, found more than '. + 'one.')); + } + + $value = head($value); + + try { + $duration = PhutilCalendarDuration::newFromISO8601($value); + } catch (Exception $ex) { + $this->raiseParseFailure( + self::PARSE_BAD_DURATION, + pht( + 'Invalid DURATION: %s', + $ex->getMessage())); + } + + return $duration; + } + + private function newRecurrenceRuleFromProperty(array $parameters, $value) { + return PhutilCalendarRecurrenceRule::newFromRRULE($value['value']); + } + + private function getScalarParameterValue( + array $parameters, + $name, + $default = null) { + + $match = null; + foreach ($parameters as $parameter) { + if ($parameter['name'] == $name) { + $match = $parameter; + } + } + + if ($match === null) { + return $default; + } + + $value = $match['values']; + if (!$value) { + // Parameter is specified, but with no value, like "KEY=". Just return + // the default, as though the parameter was not specified. + return $default; + } + + if (count($value) > 1) { + $this->raiseParseFailure( + self::PARSE_MULTIPLE_PARAMETERS, + pht( + 'Expected parameter "%s" to have at most one value, but found '. + 'more than one.', + $name)); + } + + return idx(head($value), 'value'); + } + + private function guessTimezone($tzid) { + $map = DateTimeZone::listIdentifiers(); + $map = array_fuse($map); + if (isset($map[$tzid])) { + // This is a real timezone we recognize, so just use it as provided. + return $tzid; + } + + // These are alternate names for timezones. + static $aliases; + + if ($aliases === null) { + $aliases = array( + 'Etc/GMT' => 'UTC', + ); + + // Load the map of Windows timezones. + $root_path = dirname(phutil_get_library_root('phutil')); + $windows_path = $root_path.'/resources/timezones/windows_timezones.json'; + $windows_data = Filesystem::readFile($windows_path); + $windows_zones = phutil_json_decode($windows_data); + + $aliases = $aliases + $windows_zones; + } + + if (isset($aliases[$tzid])) { + return $aliases[$tzid]; + } + + // Look for something that looks like "UTC+3" or "GMT -05.00". If we find + // anything, pick a timezone with that offset. + $offset_pattern = + '/'. + '(?:UTC|GMT)'. + '\s*'. + '(?P[+-])'. + '\s*'. + '(?P\d+)'. + '(?:'. + '[:.](?P\d+)'. + ')?'. + '/i'; + + $matches = null; + if (preg_match($offset_pattern, $tzid, $matches)) { + $hours = (int)$matches['h']; + $minutes = (int)idx($matches, 'm'); + $offset = ($hours * 60 * 60) + ($minutes * 60); + + if (idx($matches, 'sign') == '-') { + $offset = -$offset; + } + + // NOTE: We could possibly do better than this, by using the event start + // time to guess a timezone. However, that won't work for recurring + // events and would require us to do this work after finishing initial + // parsing. Since these unusual offset-based timezones appear to be rare, + // the benefit may not be worth the complexity. + $now = new DateTime('@'.time()); + + foreach ($map as $identifier) { + $zone = new DateTimeZone($identifier); + if ($zone->getOffset($now) == $offset) { + $this->raiseWarning( + self::WARN_TZID_GUESS, + pht( + 'TZID "%s" is unknown, guessing "%s" based on pattern "%s".', + $tzid, + $identifier, + $matches[0])); + return $identifier; + } + } + } + + $this->raiseWarning( + self::WARN_TZID_IGNORED, + pht( + 'TZID "%s" is unknown, using UTC instead.', + $tzid)); + + return 'UTC'; + } + +} diff --git a/src/parser/calendar/ics/PhutilICSParserException.php b/src/parser/calendar/ics/PhutilICSParserException.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/PhutilICSParserException.php @@ -0,0 +1,16 @@ +parserFailureCode = $code; + return $this; + } + + public function getParserFailureCode() { + return $this->parserFailureCode; + } + +} diff --git a/src/parser/calendar/ics/PhutilICSWriter.php b/src/parser/calendar/ics/PhutilICSWriter.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/PhutilICSWriter.php @@ -0,0 +1,387 @@ +getChildren() as $child) { + $out[] = $this->writeNode($child); + } + + return implode('', $out); + } + + private function writeNode(PhutilCalendarNode $node) { + if (!$this->getICSNodeType($node)) { + return null; + } + + $out = array(); + + $out[] = $this->writeBeginNode($node); + $out[] = $this->writeNodeProperties($node); + + if ($node instanceof PhutilCalendarContainerNode) { + foreach ($node->getChildren() as $child) { + $out[] = $this->writeNode($child); + } + } + + $out[] = $this->writeEndNode($node); + + return implode('', $out); + } + + private function writeBeginNode(PhutilCalendarNode $node) { + $type = $this->getICSNodeType($node); + return $this->wrapICSLine("BEGIN:{$type}"); + } + + private function writeEndNode(PhutilCalendarNode $node) { + $type = $this->getICSNodeType($node); + return $this->wrapICSLine("END:{$type}"); + } + + private function writeNodeProperties(PhutilCalendarNode $node) { + $properties = $this->getNodeProperties($node); + + $out = array(); + foreach ($properties as $property) { + $propname = $property['name']; + $propvalue = $property['value']; + + $propline = array(); + $propline[] = $propname; + + foreach ($property['parameters'] as $parameter) { + $paramname = $parameter['name']; + $paramvalue = $parameter['value']; + $propline[] = ";{$paramname}={$paramvalue}"; + } + + $propline[] = ":{$propvalue}"; + $propline = implode('', $propline); + + $out[] = $this->wrapICSLine($propline); + } + + return implode('', $out); + } + + private function getICSNodeType(PhutilCalendarNode $node) { + switch ($node->getNodeType()) { + case PhutilCalendarDocumentNode::NODETYPE: + return 'VCALENDAR'; + case PhutilCalendarEventNode::NODETYPE: + return 'VEVENT'; + default: + return null; + } + } + + private function wrapICSLine($line) { + $out = array(); + $buf = ''; + + // NOTE: The line may contain sequences of combining characters which are + // more than 80 bytes in length. If it does, we'll split them in the + // middle of the sequence. This is okay and generally anticipated by + // RFC5545, which even allows implementations to split multibyte + // characters. The sequence will be stitched back together properly by + // whatever is parsing things. + + foreach (phutil_utf8v($line) as $character) { + // If adding this character would bring the line over 75 bytes, start + // a new line. + if (strlen($buf) + strlen($character) > 75) { + $out[] = $buf."\r\n"; + $buf = ' '; + } + + $buf .= $character; + } + + $out[] = $buf."\r\n"; + + return implode('', $out); + } + + private function getNodeProperties(PhutilCalendarNode $node) { + switch ($node->getNodeType()) { + case PhutilCalendarDocumentNode::NODETYPE: + return $this->getDocumentNodeProperties($node); + case PhutilCalendarEventNode::NODETYPE: + return $this->getEventNodeProperties($node); + default: + return array(); + } + } + + private function getDocumentNodeProperties( + PhutilCalendarDocumentNode $event) { + $properties = array(); + + $properties[] = $this->newTextProperty( + 'VERSION', + '2.0'); + + $properties[] = $this->newTextProperty( + 'PRODID', + '-//Phacility//Phabricator//EN'); + + return $properties; + } + + private function getEventNodeProperties(PhutilCalendarEventNode $event) { + $properties = array(); + + $uid = $event->getUID(); + if (!strlen($uid)) { + throw new Exception( + pht( + 'Unable to write ICS document: event has no UID, but each event '. + 'MUST have a UID.')); + } + $properties[] = $this->newTextProperty( + 'UID', + $uid); + + $created = $event->getCreatedDateTime(); + if ($created) { + $properties[] = $this->newDateTimeProperty( + 'CREATED', + $event->getCreatedDateTime()); + } + + $dtstamp = $event->getModifiedDateTime(); + if (!$dtstamp) { + throw new Exception( + pht( + 'Unable to write ICS document: event has no modified time, but '. + 'each event MUST have a modified time.')); + } + $properties[] = $this->newDateTimeProperty( + 'DTSTAMP', + $dtstamp); + + $dtstart = $event->getStartDateTime(); + if ($dtstart) { + $properties[] = $this->newDateTimeProperty( + 'DTSTART', + $dtstart); + } + + $dtend = $event->getEndDateTime(); + if ($dtend) { + $properties[] = $this->newDateTimeProperty( + 'DTEND', + $event->getEndDateTime()); + } + + $name = $event->getName(); + if (strlen($name)) { + $properties[] = $this->newTextProperty( + 'SUMMARY', + $name); + } + + $description = $event->getDescription(); + if (strlen($description)) { + $properties[] = $this->newTextProperty( + 'DESCRIPTION', + $description); + } + + $organizer = $event->getOrganizer(); + if ($organizer) { + $properties[] = $this->newUserProperty( + 'ORGANIZER', + $organizer); + } + + $attendees = $event->getAttendees(); + if ($attendees) { + foreach ($attendees as $attendee) { + $properties[] = $this->newUserProperty( + 'ATTENDEE', + $attendee); + } + } + + $rrule = $event->getRecurrenceRule(); + if ($rrule) { + $properties[] = $this->newRRULEProperty( + 'RRULE', + $rrule); + } + + $recurrence_id = $event->getRecurrenceID(); + if ($recurrence_id) { + $properties[] = $this->newTextProperty( + 'RECURRENCE-ID', + $recurrence_id); + } + + $exdates = $event->getRecurrenceExceptions(); + if ($exdates) { + $properties[] = $this->newDateTimesProperty( + 'EXDATE', + $exdates); + } + + $rdates = $event->getRecurrenceDates(); + if ($rdates) { + $properties[] = $this->newDateTimesProperty( + 'RDATE', + $rdates); + } + + return $properties; + } + + private function newTextProperty( + $name, + $value, + array $parameters = array()) { + + $map = array( + '\\' => '\\\\', + ',' => '\\,', + "\n" => '\\n', + ); + + $value = (array)$value; + foreach ($value as $k => $v) { + $v = str_replace(array_keys($map), array_values($map), $v); + $value[$k] = $v; + } + + $value = implode(',', $value); + + return $this->newProperty($name, $value, $parameters); + } + + private function newDateTimeProperty( + $name, + PhutilCalendarDateTime $value, + array $parameters = array()) { + + return $this->newDateTimesProperty($name, array($value), $parameters); + } + + private function newDateTimesProperty( + $name, + array $values, + array $parameters = array()) { + assert_instances_of($values, 'PhutilCalendarDateTime'); + + if (head($values)->getIsAllDay()) { + $parameters[] = array( + 'name' => 'VALUE', + 'values' => array( + 'DATE', + ), + ); + } + + $datetimes = array(); + foreach ($values as $value) { + $datetimes[] = $value->getISO8601(); + } + $datetimes = implode(';', $datetimes); + + return $this->newProperty($name, $datetimes, $parameters); + } + + private function newUserProperty( + $name, + PhutilCalendarUserNode $value, + array $parameters = array()) { + + $parameters[] = array( + 'name' => 'CN', + 'values' => array( + $value->getName(), + ), + ); + + $partstat = null; + switch ($value->getStatus()) { + case PhutilCalendarUserNode::STATUS_INVITED: + $partstat = 'NEEDS-ACTION'; + break; + case PhutilCalendarUserNode::STATUS_ACCEPTED: + $partstat = 'ACCEPTED'; + break; + case PhutilCalendarUserNode::STATUS_DECLINED: + $partstat = 'DECLINED'; + break; + } + + if ($partstat !== null) { + $parameters[] = array( + 'name' => 'PARTSTAT', + 'values' => array( + $partstat, + ), + ); + } + + // TODO: We could reasonably fill in "ROLE" and "RSVP" here too, but it + // isn't clear if these are important to external programs or not. + + return $this->newProperty($name, $value->getURI(), $parameters); + } + + private function newRRULEProperty( + $name, + PhutilCalendarRecurrenceRule $rule, + array $parameters = array()) { + + $value = $rule->toRRULE(); + return $this->newProperty($name, $value, $parameters); + } + + private function newProperty( + $name, + $value, + array $parameters = array()) { + + $map = array( + '^' => '^^', + "\n" => '^n', + '"' => "^'", + ); + + $writable_params = array(); + foreach ($parameters as $k => $parameter) { + $value_list = array(); + foreach ($parameter['values'] as $v) { + $v = str_replace(array_keys($map), array_values($map), $v); + + // If the parameter value isn't a very simple one, quote it. + + // RFC5545 says that we MUST quote it if it has a colon, a semicolon, + // or a comma, and that we MUST quote it if it's a URI. + if (!preg_match('/^[A-Za-z0-9-]*\z/', $v)) { + $v = '"'.$v.'"'; + } + + $value_list[] = $v; + } + + $writable_params[] = array( + 'name' => $parameter['name'], + 'value' => implode(',', $value_list), + ); + } + + return array( + 'name' => $name, + 'value' => $value, + 'parameters' => $writable_params, + ); + } + +} diff --git a/src/parser/calendar/ics/__tests__/PhutilICSParserTestCase.php b/src/parser/calendar/ics/__tests__/PhutilICSParserTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/PhutilICSParserTestCase.php @@ -0,0 +1,341 @@ +parseICSSingleEvent('simple.ics'); + + $this->assertEqual( + array( + array( + 'name' => 'CREATED', + 'parameters' => array(), + 'value' => array( + 'type' => 'DATE-TIME', + 'value' => array( + '20160908T172702Z', + ), + 'raw' => '20160908T172702Z', + ), + ), + array( + 'name' => 'UID', + 'parameters' => array(), + 'value' => array( + 'type' => 'TEXT', + 'value' => array( + '1CEB57AF-0C9C-402D-B3BD-D75BD4843F68', + ), + 'raw' => '1CEB57AF-0C9C-402D-B3BD-D75BD4843F68', + ), + ), + array( + 'name' => 'DTSTART', + 'parameters' => array( + array( + 'name' => 'TZID', + 'values' => array( + array( + 'value' => 'America/Los_Angeles', + 'quoted' => false, + ), + ), + ), + ), + 'value' => array( + 'type' => 'DATE-TIME', + 'value' => array( + '20160915T090000', + ), + 'raw' => '20160915T090000', + ), + ), + array( + 'name' => 'DTEND', + 'parameters' => array( + array( + 'name' => 'TZID', + 'values' => array( + array( + 'value' => 'America/Los_Angeles', + 'quoted' => false, + ), + ), + ), + ), + 'value' => array( + 'type' => 'DATE-TIME', + 'value' => array( + '20160915T100000', + ), + 'raw' => '20160915T100000', + ), + ), + array( + 'name' => 'SUMMARY', + 'parameters' => array(), + 'value' => array( + 'type' => 'TEXT', + 'value' => array( + 'Simple Event', + ), + 'raw' => 'Simple Event', + ), + ), + array( + 'name' => 'DESCRIPTION', + 'parameters' => array(), + 'value' => array( + 'type' => 'TEXT', + 'value' => array( + 'This is a simple event.', + ), + 'raw' => 'This is a simple event.', + ), + ), + ), + $event->getAttribute('ics.properties')); + + $this->assertEqual( + 'Simple Event', + $event->getName()); + + $this->assertEqual( + 'This is a simple event.', + $event->getDescription()); + + $this->assertEqual( + 1473955200, + $event->getStartDateTime()->getEpoch()); + + $this->assertEqual( + 1473955200 + phutil_units('1 hour in seconds'), + $event->getEndDateTime()->getEpoch()); + } + + public function testICSOddTimezone() { + $event = $this->parseICSSingleEvent('zimbra-timezone.ics'); + + $start = $event->getStartDateTime(); + + $this->assertEqual( + '20170303T140000Z', + $start->getISO8601()); + } + + public function testICSFloatingTime() { + // This tests "floating" event times, which have no absolute time and are + // supposed to be interpreted using the viewer's timezone. It also uses + // a duration, and the duration needs to float along with the viewer + // timezone. + + $event = $this->parseICSSingleEvent('floating.ics'); + + $start = $event->getStartDateTime(); + + $caught = null; + try { + $start->getEpoch(); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue( + ($caught instanceof Exception), + pht('Expected exception for floating time with no viewer timezone.')); + + $newyears_utc = strtotime('2015-01-01 00:00:00 UTC'); + $this->assertEqual(1420070400, $newyears_utc); + + $start->setViewerTimezone('UTC'); + $this->assertEqual( + $newyears_utc, + $start->getEpoch()); + + $start->setViewerTimezone('America/Los_Angeles'); + $this->assertEqual( + $newyears_utc + phutil_units('8 hours in seconds'), + $start->getEpoch()); + + $start->setViewerTimezone('America/New_York'); + $this->assertEqual( + $newyears_utc + phutil_units('5 hours in seconds'), + $start->getEpoch()); + + $end = $event->getEndDateTime(); + $end->setViewerTimezone('UTC'); + $this->assertEqual( + $newyears_utc + phutil_units('24 hours in seconds'), + $end->getEpoch()); + + $end->setViewerTimezone('America/Los_Angeles'); + $this->assertEqual( + $newyears_utc + phutil_units('32 hours in seconds'), + $end->getEpoch()); + + $end->setViewerTimezone('America/New_York'); + $this->assertEqual( + $newyears_utc + phutil_units('29 hours in seconds'), + $end->getEpoch()); + } + + public function testICSVALARM() { + $event = $this->parseICSSingleEvent('valarm.ics'); + + // For now, we parse but ignore VALARM sections. This test just makes + // sure they survive parsing. + + $start_epoch = strtotime('2016-10-19 22:00:00 UTC'); + $this->assertEqual(1476914400, $start_epoch); + + $this->assertEqual( + $start_epoch, + $event->getStartDateTime()->getEpoch()); + } + + public function testICSDuration() { + $event = $this->parseICSSingleEvent('duration.ics'); + + // Raw value is "20160719T095722Z". + $start_epoch = strtotime('2016-07-19 09:57:22 UTC'); + $this->assertEqual(1468922242, $start_epoch); + + // Raw value is "P1DT17H4M23S". + $duration = + phutil_units('1 day in seconds') + + phutil_units('17 hours in seconds') + + phutil_units('4 minutes in seconds') + + phutil_units('23 seconds in seconds'); + + $this->assertEqual( + $start_epoch, + $event->getStartDateTime()->getEpoch()); + + $this->assertEqual( + $start_epoch + $duration, + $event->getEndDateTime()->getEpoch()); + } + + public function testICSWeeklyEvent() { + $event = $this->parseICSSingleEvent('weekly.ics'); + + $start = $event->getStartDateTime(); + $start->setViewerTimezone('UTC'); + + $rrule = $event->getRecurrenceRule() + ->setStartDateTime($start); + + $rset = id(new PhutilCalendarRecurrenceSet()) + ->addSource($rrule); + + $result = $rset->getEventsBetween(null, null, 3); + + $expect = array( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20150811'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20150818'), + PhutilCalendarAbsoluteDateTime::newFromISO8601('20150825'), + ); + + $this->assertEqual( + mpull($expect, 'getISO8601'), + mpull($result, 'getISO8601'), + pht('Weekly recurring event.')); + } + + public function testICSParserErrors() { + $map = array( + 'err-missing-end.ics' => PhutilICSParser::PARSE_MISSING_END, + 'err-bad-base64.ics' => PhutilICSParser::PARSE_BAD_BASE64, + 'err-bad-boolean.ics' => PhutilICSParser::PARSE_BAD_BOOLEAN, + 'err-extra-end.ics' => PhutilICSParser::PARSE_EXTRA_END, + 'err-initial-unfold.ics' => PhutilICSParser::PARSE_INITIAL_UNFOLD, + 'err-malformed-double-quote.ics' => + PhutilICSParser::PARSE_MALFORMED_DOUBLE_QUOTE, + 'err-malformed-parameter.ics' => + PhutilICSParser::PARSE_MALFORMED_PARAMETER_NAME, + 'err-malformed-property.ics' => + PhutilICSParser::PARSE_MALFORMED_PROPERTY, + 'err-missing-value.ics' => PhutilICSParser::PARSE_MISSING_VALUE, + 'err-mixmatched-sections.ics' => + PhutilICSParser::PARSE_MISMATCHED_SECTIONS, + 'err-root-property.ics' => PhutilICSParser::PARSE_ROOT_PROPERTY, + 'err-unescaped-backslash.ics' => + PhutilICSParser::PARSE_UNESCAPED_BACKSLASH, + 'err-unexpected-text.ics' => PhutilICSParser::PARSE_UNEXPECTED_TEXT, + 'err-multiple-parameters.ics' => + PhutilICSParser::PARSE_MULTIPLE_PARAMETERS, + 'err-empty-datetime.ics' => + PhutilICSParser::PARSE_EMPTY_DATETIME, + 'err-many-datetime.ics' => + PhutilICSParser::PARSE_MANY_DATETIME, + 'err-bad-datetime.ics' => + PhutilICSParser::PARSE_BAD_DATETIME, + 'err-empty-duration.ics' => + PhutilICSParser::PARSE_EMPTY_DURATION, + 'err-many-duration.ics' => + PhutilICSParser::PARSE_MANY_DURATION, + 'err-bad-duration.ics' => + PhutilICSParser::PARSE_BAD_DURATION, + + 'simple.ics' => null, + 'good-boolean.ics' => null, + 'multiple-vcalendars.ics' => null, + ); + + foreach ($map as $test_file => $expect) { + $caught = null; + try { + $this->parseICSDocument($test_file); + } catch (PhutilICSParserException $ex) { + $caught = $ex; + } + + if ($expect === null) { + $this->assertTrue( + ($caught === null), + pht( + 'Expected no exception parsing "%s", got: %s', + $test_file, + (string)$ex)); + } else { + if ($caught) { + $code = $ex->getParserFailureCode(); + $explain = pht( + 'Expected one exception parsing "%s", got a different '. + 'one: %s', + $test_file, + (string)$ex); + } else { + $code = null; + $explain = pht( + 'Expected exception parsing "%s", got none.', + $test_file); + } + + $this->assertEqual($expect, $code, $explain); + } + } + } + + private function parseICSSingleEvent($name) { + $root = $this->parseICSDocument($name); + + $documents = $root->getDocuments(); + $this->assertEqual(1, count($documents)); + $document = head($documents); + + $events = $document->getEvents(); + $this->assertEqual(1, count($events)); + + return head($events); + } + + private function parseICSDocument($name) { + $path = dirname(__FILE__).'/data/'.$name; + $data = Filesystem::readFile($path); + return id(new PhutilICSParser()) + ->parseICSData($data); + } + + +} diff --git a/src/parser/calendar/ics/__tests__/PhutilICSWriterTestCase.php b/src/parser/calendar/ics/__tests__/PhutilICSWriterTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/PhutilICSWriterTestCase.php @@ -0,0 +1,144 @@ +setUID('tea-time') + ->setName('Tea Time') + ->setDescription( + "Tea and, perhaps, crumpets.\n". + "Your presence is requested!\n". + "This is a long list of types of tea to test line wrapping: {$teas}.") + ->setCreatedDateTime( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160915T070000Z')) + ->setModifiedDateTime( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160915T070000Z')) + ->setStartDateTime( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160916T150000Z')) + ->setEndDateTime( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160916T160000Z')); + + $ics_data = $this->writeICSSingleEvent($event); + + $this->assertICS('writer-tea-time.ics', $ics_data); + } + + public function testICSWriterChristmas() { + $start = PhutilCalendarAbsoluteDateTime::newFromISO8601('20001225T000000Z'); + $end = PhutilCalendarAbsoluteDateTime::newFromISO8601('20001226T000000Z'); + + $rrule = id(new PhutilCalendarRecurrenceRule()) + ->setFrequency(PhutilCalendarRecurrenceRule::FREQUENCY_YEARLY) + ->setByMonth(array(12)) + ->setByMonthDay(array(25)); + + $event = id(new PhutilCalendarEventNode()) + ->setUID('recurring-christmas') + ->setName('Christmas') + ->setDescription('Festival holiday first occurring in the year 2000.') + ->setStartDateTime($start) + ->setEndDateTime($end) + ->setCreatedDateTime($start) + ->setModifiedDateTime($start) + ->setRecurrenceRule($rrule) + ->setRecurrenceExceptions( + array( + // In 2007, Christmas was cancelled. + PhutilCalendarAbsoluteDateTime::newFromISO8601('20071225T000000Z'), + )) + ->setRecurrenceDates( + array( + // We had an extra early Christmas in 2009. + PhutilCalendarAbsoluteDateTime::newFromISO8601('20091125T000000Z'), + )); + + $ics_data = $this->writeICSSingleEvent($event); + $this->assertICS('writer-recurring-christmas.ics', $ics_data); + } + + public function testICSWriterAllDay() { + $event = id(new PhutilCalendarEventNode()) + ->setUID('christmas-day') + ->setName('Christmas 2016') + ->setDescription('A minor religious holiday.') + ->setCreatedDateTime( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160901T232425Z')) + ->setModifiedDateTime( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20160901T232425Z')) + ->setStartDateTime( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20161225')) + ->setEndDateTime( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20161226')); + + $ics_data = $this->writeICSSingleEvent($event); + + $this->assertICS('writer-christmas.ics', $ics_data); + } + + public function testICSWriterUsers() { + $event = id(new PhutilCalendarEventNode()) + ->setUID('office-party') + ->setName('Office Party') + ->setCreatedDateTime( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20161001T120000Z')) + ->setModifiedDateTime( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20161001T120000Z')) + ->setStartDateTime( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20161215T200000Z')) + ->setEndDateTime( + PhutilCalendarAbsoluteDateTime::newFromISO8601('20161215T230000Z')) + ->setOrganizer( + id(new PhutilCalendarUserNode()) + ->setName('Big Boss') + ->setURI('mailto:big.boss@example.com')) + ->addAttendee( + id(new PhutilCalendarUserNode()) + ->setName('Milton') + ->setStatus(PhutilCalendarUserNode::STATUS_INVITED) + ->setURI('mailto:milton@example.com')) + ->addAttendee( + id(new PhutilCalendarUserNode()) + ->setName('Nancy') + ->setStatus(PhutilCalendarUserNode::STATUS_ACCEPTED) + ->setURI('mailto:nancy@example.com')); + + $ics_data = $this->writeICSSingleEvent($event); + $this->assertICS('writer-office-party.ics', $ics_data); + } + + private function writeICSSingleEvent(PhutilCalendarEventNode $event) { + $calendar = id(new PhutilCalendarDocumentNode()) + ->appendChild($event); + + $root = id(new PhutilCalendarRootNode()) + ->appendChild($calendar); + + return $this->writeICS($root); + } + + private function writeICS(PhutilCalendarRootNode $root) { + return id(new PhutilICSWriter()) + ->writeICSDocument($root); + } + + private function assertICS($name, $actual) { + $path = dirname(__FILE__).'/data/'.$name; + $data = Filesystem::readFile($path); + $this->assertEqual($data, $actual, pht('ICS: %s', $name)); + } + +} diff --git a/src/parser/calendar/ics/__tests__/data/duration.ics b/src/parser/calendar/ics/__tests__/data/duration.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/duration.ics @@ -0,0 +1,8 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +DTSTART:20160719T095722Z +DURATION:P1DT17H4M23S +SUMMARY:Duration Event +DESCRIPTION:This is an event with a complex duration. +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/err-bad-base64.ics b/src/parser/calendar/ics/__tests__/data/err-bad-base64.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-bad-base64.ics @@ -0,0 +1,5 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +DATA;VALUE=BINARY;ENCODING=BASE64: +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/err-bad-boolean.ics b/src/parser/calendar/ics/__tests__/data/err-bad-boolean.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-bad-boolean.ics @@ -0,0 +1,5 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +DUCK;VALUE=BOOLEAN:QUACK +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/err-bad-datetime.ics b/src/parser/calendar/ics/__tests__/data/err-bad-datetime.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-bad-datetime.ics @@ -0,0 +1,5 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +DTSTART:quack +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/err-bad-duration.ics b/src/parser/calendar/ics/__tests__/data/err-bad-duration.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-bad-duration.ics @@ -0,0 +1,5 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +DURATION:quack +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/err-empty-datetime.ics b/src/parser/calendar/ics/__tests__/data/err-empty-datetime.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-empty-datetime.ics @@ -0,0 +1,5 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +DTSTART: +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/err-empty-duration.ics b/src/parser/calendar/ics/__tests__/data/err-empty-duration.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-empty-duration.ics @@ -0,0 +1,5 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +DURATION: +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/err-extra-end.ics b/src/parser/calendar/ics/__tests__/data/err-extra-end.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-extra-end.ics @@ -0,0 +1 @@ +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/err-initial-unfold.ics b/src/parser/calendar/ics/__tests__/data/err-initial-unfold.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-initial-unfold.ics @@ -0,0 +1,2 @@ + BEGIN:VCALENDAR +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/err-malformed-double-quote.ics b/src/parser/calendar/ics/__tests__/data/err-malformed-double-quote.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-malformed-double-quote.ics @@ -0,0 +1,5 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +A;B="C:D +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/err-malformed-parameter.ics b/src/parser/calendar/ics/__tests__/data/err-malformed-parameter.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-malformed-parameter.ics @@ -0,0 +1,5 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +A;B:C +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/err-malformed-property.ics b/src/parser/calendar/ics/__tests__/data/err-malformed-property.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-malformed-property.ics @@ -0,0 +1,5 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +PEANUTBUTTER&JELLY:sandwich +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/err-many-datetime.ics b/src/parser/calendar/ics/__tests__/data/err-many-datetime.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-many-datetime.ics @@ -0,0 +1,5 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +DTSTART:20130101,20130101 +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/err-many-duration.ics b/src/parser/calendar/ics/__tests__/data/err-many-duration.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-many-duration.ics @@ -0,0 +1,5 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +DURATION:P1W,P2W +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/err-missing-end.ics b/src/parser/calendar/ics/__tests__/data/err-missing-end.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-missing-end.ics @@ -0,0 +1,2 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT diff --git a/src/parser/calendar/ics/__tests__/data/err-missing-value.ics b/src/parser/calendar/ics/__tests__/data/err-missing-value.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-missing-value.ics @@ -0,0 +1,5 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +TRIANGLE;color=red +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/err-mixmatched-sections.ics b/src/parser/calendar/ics/__tests__/data/err-mixmatched-sections.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-mixmatched-sections.ics @@ -0,0 +1,4 @@ +BEGIN:A +BEGIN:B +END:A +END:B diff --git a/src/parser/calendar/ics/__tests__/data/err-multiple-parameters.ics b/src/parser/calendar/ics/__tests__/data/err-multiple-parameters.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-multiple-parameters.ics @@ -0,0 +1,5 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +DTSTART;TZID=A,B:20160915T090000 +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/err-root-property.ics b/src/parser/calendar/ics/__tests__/data/err-root-property.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-root-property.ics @@ -0,0 +1 @@ +NAME:value diff --git a/src/parser/calendar/ics/__tests__/data/err-unescaped-backslash.ics b/src/parser/calendar/ics/__tests__/data/err-unescaped-backslash.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-unescaped-backslash.ics @@ -0,0 +1,5 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +STORY:The duck coughed up an unescaped backslash: \ +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/err-unexpected-text.ics b/src/parser/calendar/ics/__tests__/data/err-unexpected-text.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/err-unexpected-text.ics @@ -0,0 +1,5 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +SQUARE;color=red" +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/floating.ics b/src/parser/calendar/ics/__tests__/data/floating.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/floating.ics @@ -0,0 +1,8 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +DTSTART:20150101T000000 +DURATION:P1D +SUMMARY:New Year's 2015 +DESCRIPTION:This is an event with a floating start time. +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/good-boolean.ics b/src/parser/calendar/ics/__tests__/data/good-boolean.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/good-boolean.ics @@ -0,0 +1,5 @@ +BEGIN:VCALENDAR +BEGIN:VEVENT +DUCK;VALUE=BOOLEAN:TRUE +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/multiple-vcalendars.ics b/src/parser/calendar/ics/__tests__/data/multiple-vcalendars.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/multiple-vcalendars.ics @@ -0,0 +1,4 @@ +BEGIN:VCALENDAR +END:VCALENDAR +BEGIN:VCALENDAR +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/simple.ics b/src/parser/calendar/ics/__tests__/data/simple.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/simple.ics @@ -0,0 +1,12 @@ +BEGIN:VCALENDAR +VERSION:2.0 +CALSCALE:GREGORIAN +BEGIN:VEVENT +CREATED:20160908T172702Z +UID:1CEB57AF-0C9C-402D-B3BD-D75BD4843F68 +DTSTART;TZID=America/Los_Angeles:20160915T090000 +DTEND;TZID=America/Los_Angeles:20160915T100000 +SUMMARY:Simple Event +DESCRIPTION:This is a simple event. +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/valarm.ics b/src/parser/calendar/ics/__tests__/data/valarm.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/valarm.ics @@ -0,0 +1,16 @@ +BEGIN:VCALENDAR +VERSION:2.0 +BEGIN:VEVENT +CREATED:20161027T173727 +DTSTAMP:20161027T173727 +LAST-MODIFIED:20161027T173727 +UID:aic4zm86mg +SUMMARY:alarm event +DTSTART;TZID=Europe/Berlin:20161020T000000 +DTEND;TZID=Europe/Berlin:20161020T010000 +BEGIN:VALARM +ACTION:AUDIO +TRIGGER:-PT15M +END:VALARM +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/weekly.ics b/src/parser/calendar/ics/__tests__/data/weekly.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/weekly.ics @@ -0,0 +1,14 @@ +BEGIN:VCALENDAR +VERSION:2.0 +BEGIN:VEVENT +TRANSP:OPAQUE +DTEND;VALUE=DATE:20150812 +LAST-MODIFIED:20160822T130015Z +UID:4AE69E91-4A51-4B77-8849-85981E037A83 +DTSTAMP:20161129T152151Z +SUMMARY:Weekly Event +DTSTART;VALUE=DATE:20150811 +CREATED:20141109T163445Z +RRULE:FREQ=WEEKLY +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/writer-christmas.ics b/src/parser/calendar/ics/__tests__/data/writer-christmas.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/writer-christmas.ics @@ -0,0 +1,13 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Phacility//Phabricator//EN +BEGIN:VEVENT +UID:christmas-day +CREATED:20160901T232425Z +DTSTAMP:20160901T232425Z +DTSTART;VALUE=DATE:20161225 +DTEND;VALUE=DATE:20161226 +SUMMARY:Christmas 2016 +DESCRIPTION:A minor religious holiday. +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/writer-office-party.ics b/src/parser/calendar/ics/__tests__/data/writer-office-party.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/writer-office-party.ics @@ -0,0 +1,15 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Phacility//Phabricator//EN +BEGIN:VEVENT +UID:office-party +CREATED:20161001T120000Z +DTSTAMP:20161001T120000Z +DTSTART:20161215T200000Z +DTEND:20161215T230000Z +SUMMARY:Office Party +ORGANIZER;CN="Big Boss":mailto:big.boss@example.com +ATTENDEE;CN=Milton;PARTSTAT=NEEDS-ACTION:mailto:milton@example.com +ATTENDEE;CN=Nancy;PARTSTAT=ACCEPTED:mailto:nancy@example.com +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/writer-recurring-christmas.ics b/src/parser/calendar/ics/__tests__/data/writer-recurring-christmas.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/writer-recurring-christmas.ics @@ -0,0 +1,16 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Phacility//Phabricator//EN +BEGIN:VEVENT +UID:recurring-christmas +CREATED:20001225T000000Z +DTSTAMP:20001225T000000Z +DTSTART:20001225T000000Z +DTEND:20001226T000000Z +SUMMARY:Christmas +DESCRIPTION:Festival holiday first occurring in the year 2000. +RRULE:FREQ=YEARLY;BYMONTH=12;BYMONTHDAY=25 +EXDATE:20071225T000000Z +RDATE:20091125T000000Z +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/writer-tea-time.ics b/src/parser/calendar/ics/__tests__/data/writer-tea-time.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/writer-tea-time.ics @@ -0,0 +1,16 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Phacility//Phabricator//EN +BEGIN:VEVENT +UID:tea-time +CREATED:20160915T070000Z +DTSTAMP:20160915T070000Z +DTSTART:20160916T150000Z +DTEND:20160916T160000Z +SUMMARY:Tea Time +DESCRIPTION:Tea and\, perhaps\, crumpets.\nYour presence is requested!\nThi + s is a long list of types of tea to test line wrapping: earl grey tea\, En + glish breakfast tea\, black tea\, green tea\, t-rex\, oolong tea\, mint te + a\, tea with milk. +END:VEVENT +END:VCALENDAR diff --git a/src/parser/calendar/ics/__tests__/data/zimbra-timezone.ics b/src/parser/calendar/ics/__tests__/data/zimbra-timezone.ics new file mode 100644 --- /dev/null +++ b/src/parser/calendar/ics/__tests__/data/zimbra-timezone.ics @@ -0,0 +1,12 @@ +BEGIN:VCALENDAR +VERSION:2.0 +CALSCALE:GREGORIAN +BEGIN:VEVENT +CREATED:20161104T220244Z +UID:zimbra-timezone +SUMMARY:Zimbra Timezone +DTSTART;TZID="(GMT-05.00) Auto-Detected":20170303T090000 +DTSTAMP:20161104T220244Z +SEQUENCE:0 +END:VEVENT +END:VCALENDAR diff --git a/src/parser/exception/PhutilINIParserException.php b/src/parser/exception/PhutilINIParserException.php new file mode 100644 --- /dev/null +++ b/src/parser/exception/PhutilINIParserException.php @@ -0,0 +1,3 @@ +sourceLine = $line; + $this->sourceChar = $char; + $this->sourceToken = $token; + $this->expected = $expected; + + parent::__construct( + pht('Parse error on line %d at column %d: %s', $line, $char, $message)); + } + + public function getSourceLine() { + return $this->sourceLine; + } + + public function getSourceChar() { + return $this->sourceChar; + } + + public function getSourceToken() { + return $this->sourceToken; + } + + public function getExpectedTokens() { + return $this->expected; + } + +} diff --git a/src/parser/exception/PhutilTypeCheckException.php b/src/parser/exception/PhutilTypeCheckException.php new file mode 100644 --- /dev/null +++ b/src/parser/exception/PhutilTypeCheckException.php @@ -0,0 +1,40 @@ +getType() == 'regex') { + if (is_string($value)) { + $message = pht( + "Expected a regular expression, but '%s' is not valid: %s", + $value, + $err); + } else { + $message = pht( + 'Expected a regular expression, but value is not valid: %s', + $err); + } + } else { + $message = pht( + "Expected type '%s', got type '%s'.", + $type->toString(), + PhutilTypeSpec::getTypeOf($value)); + } + + parent::__construct($invalid.' '.$message); + } + +} diff --git a/src/parser/exception/PhutilTypeExtraParametersException.php b/src/parser/exception/PhutilTypeExtraParametersException.php new file mode 100644 --- /dev/null +++ b/src/parser/exception/PhutilTypeExtraParametersException.php @@ -0,0 +1,21 @@ +parameters; + } + + public function __construct(array $extra) { + $message = pht( + 'Got unexpected parameters: %s', + implode(', ', array_keys($extra))); + + parent::__construct($message); + + $this->parameters = $extra; + } + +} diff --git a/src/parser/exception/PhutilTypeMissingParametersException.php b/src/parser/exception/PhutilTypeMissingParametersException.php new file mode 100644 --- /dev/null +++ b/src/parser/exception/PhutilTypeMissingParametersException.php @@ -0,0 +1,21 @@ +parameters; + } + + public function __construct(array $missing) { + $message = pht( + 'Missing required parameters: %s', + implode(', ', $missing)); + + parent::__construct($message); + + $this->parameters = $missing; + } + +} diff --git a/src/parser/generator/exception/PhutilInvalidRuleParserGeneratorException.php b/src/parser/generator/exception/PhutilInvalidRuleParserGeneratorException.php new file mode 100644 --- /dev/null +++ b/src/parser/generator/exception/PhutilInvalidRuleParserGeneratorException.php @@ -0,0 +1,4 @@ +body = new PhutilRope(); + } + + public function setHeaders(array $headers) { + $this->headers = $headers; + return $this; + } + + public function getHeaders() { + return $this->headers; + } + + public function setStatus(HTTPFutureResponseStatus $status) { + $this->status = $status; + return $this; + } + + public function getStatus() { + return $this->status; + } + + public function appendBody($bytes) { + $this->body->append($bytes); + } + + public function getBody() { + return $this->body->getAsString(); + } + +} diff --git a/src/parser/http/PhutilHTTPResponseParser.php b/src/parser/http/PhutilHTTPResponseParser.php new file mode 100644 --- /dev/null +++ b/src/parser/http/PhutilHTTPResponseParser.php @@ -0,0 +1,174 @@ +followLocationHeaders = $follow_location_headers; + return $this; + } + + public function getFollowLocationHeaders() { + return $this->followLocationHeaders; + } + + public function readBytes($bytes) { + if ($this->state == 'discard') { + return $this; + } + + $this->buffer .= $bytes; + + while (true) { + if ($this->state == 'headers') { + $matches = null; + + $ok = preg_match( + "/(\r?\n\r?\n)/", + $this->buffer, + $matches, + PREG_OFFSET_CAPTURE); + if (!$ok) { + break; + } + + $headers_len = $matches[1][1]; + $boundary_len = strlen($matches[1][0]); + $raw_headers = substr($this->buffer, 0, $headers_len); + $this->buffer = substr($this->buffer, $headers_len + $boundary_len); + + $header_lines = phutil_split_lines($raw_headers); + $first_line = array_shift($header_lines); + $response_valid = true; + + $matches = null; + $ok = preg_match( + '(^HTTP/\S+\s+(\d+)(?:\s+(.*))?$)i', + $first_line, + $matches); + + if ($ok) { + $http_code = (int)$matches[1]; + $http_status = phutil_utf8_strtolower($matches[2]); + } else { + $response_valid = false; + } + + $header_list = array(); + $saw_location = false; + foreach ($header_lines as $header_line) { + $pos = strpos($header_line, ':'); + if ($pos === false) { + $response_valid = false; + break; + } + + $name = substr($header_line, 0, $pos); + $value = ltrim(substr($header_line, $pos + 1), ' '); + + if (phutil_utf8_strtolower($name) == 'location') { + $saw_location = true; + } + + $header_list[] = array( + $name, + $value, + ); + } + + // If the response didn't start with a properly formatted "HTTP/..." + // line, or any of the header lines were not formatted correctly, add + // a malformed response to the response list and discard anything else + // we're given. + if (!$response_valid) { + $malformed = new HTTPFutureParseResponseStatus( + HTTPFutureParseResponseStatus::ERROR_MALFORMED_RESPONSE, + $raw_headers); + + $this->newHTTPRepsonse() + ->setStatus($malformed); + + $this->buffer = ''; + $this->state = 'discard'; + break; + } + + // Otherwise, we have a valid set of response headers. + $response_status = new HTTPFutureHTTPResponseStatus( + $http_code, + null, + $header_list); + + $this->newHTTPResponse() + ->setStatus($response_status) + ->setHeaders($header_list); + + $is_https_proxy = + ($http_code === 200) && + ($http_status === 'connection established'); + + if ($http_code === 100) { + // If this is "HTTP/1.1 100 Continue", this is just the server + // telling us that everything is okay. This response won't have + // a body associated with it. + $more_headers = true; + } else if ($is_https_proxy) { + // If this is "HTTP/1.1 200 Connection Established", this is a + // response to a CONNECT request made automatically by cURL to + // an HTTPS proxy. This response won't have a body associated + // with it, and the real body will follow later. + $more_headers = true; + } else if ($saw_location && $this->followLocationHeaders) { + // If we're following location headers and this response had + // a location header, cURL will automatically follow it. This + // response shouldn't have a body. + $more_headers = true; + } else { + $more_headers = false; + } + + // If we're expecting more headers, we're going to stay in the + // "headers" state and parse another set of headers. Otherwise, + // we transition to the "body" state and look for a body. + if (!$more_headers) { + $this->state = 'body'; + } + + continue; + } + + if ($this->state == 'body') { + if (strlen($this->buffer)) { + $this->response->appendBody($this->buffer); + $this->buffer = ''; + } + break; + } + } + + return $this; + } + + public function getResponses() { + if ($this->state !== 'body') { + throw new HTTPFutureParseResponseStatus( + HTTPFutureParseResponseStatus::ERROR_MALFORMED_RESPONSE, + $this->buffer); + } + + return $this->responses; + } + + private function newHTTPResponse() { + $response = new PhutilHTTPResponse(); + $this->responses[] = $response; + $this->response = $response; + return $response; + } + +} diff --git a/src/parser/http/__tests__/PhutilHTTPResponseParserTestCase.php b/src/parser/http/__tests__/PhutilHTTPResponseParserTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/http/__tests__/PhutilHTTPResponseParserTestCase.php @@ -0,0 +1,145 @@ +assertParse( + array( + array( + 'headers' => array( + array('Duck', 'Quack'), + ), + 'body' => 'I am the very model of a modern major general.', + ), + ), + $input); + + $input = <<assertParse( + array( + array( + 'code' => 200, + 'headers' => array( + array('X-I-Am-A-Proxy-Server', 'Hello'), + ), + 'body' => '', + ), + array( + 'code' => 100, + 'headers' => array( + array('X-Everything-Is-Fine', 'true'), + ), + 'body' => '', + ), + array( + 'code' => 302, + 'headers' => array( + array('Location', 'Over-There'), + ), + 'body' => '', + ), + array( + 'code' => 404, + 'headers' => array(), + 'body' => 'Not all who wander are lost.', + ), + ), + $input, + id(new PhutilHTTPResponseParser()) + ->setFollowLocationHeaders(true)); + + $input = <<assertParse( + array( + array( + 'code' => 200, + 'headers' => array( + array('Reason', 'none'), + ), + 'body' => + 'This response has no "reason-phrase", which is unusual but valid.', + ), + ), + $input, + id(new PhutilHTTPResponseParser())); + } + + private function assertParse(array $expect, $input, $parser = null) { + if ($parser === null) { + $parser = new PhutilHTTPResponseParser(); + } + + // Submit the input in little bits to try to catch any weird parser bugs. + $length = strlen($input); + $pos = 0; + while ($pos < $length) { + $next_len = mt_rand(1, 32); + $piece = substr($input, $pos, $next_len); + $pos = $pos + $next_len; + + $parser->readBytes($piece); + } + + $responses = $parser->getResponses(); + + $this->assertEqual(count($expect), count($responses)); + + $expect = array_values($expect); + $responses = array_values($responses); + + for ($ii = 0; $ii < count($expect); $ii++) { + $expect_map = $expect[$ii]; + $actual = $responses[$ii]; + + foreach ($expect_map as $key => $spec) { + switch ($key) { + case 'headers': + $this->assertEqual($spec, $actual->getHeaders()); + break; + case 'body': + $this->assertEqual($spec, $actual->getBody()); + break; + case 'code': + $status = $actual->getStatus(); + $this->assertTrue($status instanceof HTTPFutureHTTPResponseStatus); + $this->assertEqual($spec, $status->getStatusCode()); + break; + default: + throw new Exception( + pht( + 'Unknown HTTPResponseParser test ("%s").', + $key)); + } + } + } + } + +} diff --git a/src/parser/xhpast/__tests__/PHPASTParserTestCase.php b/src/parser/xhpast/__tests__/PHPASTParserTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/__tests__/PHPASTParserTestCase.php @@ -0,0 +1,136 @@ +assertSkipped( + pht('%s is not built or not up to date.', 'xhpast')); + } + } + + $dir = dirname(__FILE__).'/data/'; + foreach (Filesystem::listDirectory($dir) as $file) { + if (preg_match('/\.test$/', $file)) { + $this->executeParserTest($file, $dir.$file); + } + } + } + + private function executeParserTest($name, $file) { + $contents = Filesystem::readFile($file); + $contents = preg_split('/^~{4,}\n/m', $contents); + + if (count($contents) < 2) { + throw new Exception( + pht( + "Expected '%s' separating test case and results.", + '~~~~~~~~~~')); + } + + list($data, $options, $expect) = array_merge($contents, array(null)); + + $options = id(new PhutilSimpleOptions())->parse($options); + + $type = null; + foreach ($options as $key => $value) { + switch ($key) { + case 'pass': + case 'fail-syntax': + case 'fail-parse': + if ($type !== null) { + throw new Exception( + pht( + 'Test file "%s" unexpectedly specifies multiple expected '. + 'test outcomes.', + $name)); + } + $type = $key; + break; + case 'comment': + // Human readable comment providing test case information. + break; + case 'rtrim': + // Allows construction of tests which rely on EOF without newlines. + $data = rtrim($data); + break; + default: + throw new Exception( + pht( + 'Test file "%s" has unknown option "%s" in its options '. + 'string.', + $name, + $key)); + } + } + + if ($type === null) { + throw new Exception( + pht( + 'Test file "%s" does not specify a test result (like "pass") in '. + 'its options string.', + $name)); + } + + $future = PhutilXHPASTBinary::getParserFuture($data); + list($err, $stdout, $stderr) = $future->resolve(); + + switch ($type) { + case 'pass': + case 'fail-parse': + $this->assertEqual(0, $err, pht('Exit code for "%s".', $name)); + + if (!strlen($expect)) { + // If there's no "expect" data in the test case, that's OK. + break; + } + + try { + $expect = phutil_json_decode($expect); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht( + 'Expect data for test "%s" is not valid JSON.', + $name), + $ex); + } + + try { + $stdout = phutil_json_decode($stdout); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht( + 'Output for test file "%s" is not valid JSON.', + $name), + $ex); + } + + $json = new PhutilJSON(); + + $expect_nice = $json->encodeFormatted($expect); + $stdout_nice = $json->encodeFormatted($stdout); + + if ($type == 'pass') { + $this->assertEqual( + $expect_nice, + $stdout_nice, + pht('Parser output for "%s".', $name)); + } else { + $this->assertFalse( + ($expect_nice == $stdout_nice), + pht('Expected parser to parse "%s" incorrectly.', $name)); + } + break; + case 'fail-syntax': + $this->assertEqual(1, $err, pht('Exit code for "%s".', $name)); + $this->assertTrue( + (bool)preg_match('/syntax error/', $stderr), + pht('Expect "syntax error" in stderr or "%s".', $name)); + break; + } + } + +} diff --git a/src/parser/xhpast/__tests__/data/base-fail-parse.php.test b/src/parser/xhpast/__tests__/data/base-fail-parse.php.test new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/base-fail-parse.php.test @@ -0,0 +1,8 @@ + 2 <=> 3; +~~~~~~~~~~ +fail-syntax, comment=Spaceship operator is non-associative diff --git a/src/parser/xhpast/__tests__/data/operator-spaceship.php.test b/src/parser/xhpast/__tests__/data/operator-spaceship.php.test new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/operator-spaceship.php.test @@ -0,0 +1,93 @@ + 2; +~~~~~~~~~~ +pass +~~~~~~~~~~ +{ + "tree": [ + 9000, + 0, + 8, + [ + [ + 9006, + 0, + 7, + [ + [ + 9007, + 0, + 0 + ], + [ + 9004, + 2, + 7, + [ + [ + 9077, + 2, + 6, + [ + [ + 9086, + 2, + 2 + ], + [ + 9081, + 4, + 4 + ], + [ + 9086, + 6, + 6 + ] + ] + ] + ] + ] + ] + ] + ] + ], + "stream": [ + [ + 373, + 5 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 377, + 1 + ], + [ + 285, + 3 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ] + ] +} diff --git a/src/parser/xhpast/__tests__/data/optional-parameter.php.test b/src/parser/xhpast/__tests__/data/optional-parameter.php.test new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/optional-parameter.php.test @@ -0,0 +1,282 @@ +b; + +new a->c(); +~~~~~~~~~~ +fail-syntax diff --git a/src/parser/xhpast/__tests__/data/php-access-on-instanciation.test b/src/parser/xhpast/__tests__/data/php-access-on-instanciation.test new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-access-on-instanciation.test @@ -0,0 +1,663 @@ +b; + +$e = (new a)->c(); + +(new a)->b; + +(new a)->c(); +~~~~~~~~~~ +pass +~~~~~~~~~~ +{ + "tree": [ + 9000, + 0, + 74, + [ + [ + 9006, + 0, + 73, + [ + [ + 9007, + 0, + 0 + ], + [ + 9004, + 2, + 25, + [ + [ + 9051, + 2, + 25, + [ + [ + 9052, + 2, + 2 + ], + [ + 9090, + 4, + 4 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 6, + 25, + [ + [ + 9004, + 8, + 11, + [ + [ + 9063, + 8, + 10, + [ + [ + 9070, + 8, + 8, + [ + [ + 9013, + 8, + 8 + ] + ] + ], + [ + 9064, + 10, + 10, + [ + [ + 9047, + 10, + 10 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 13, + 23, + [ + [ + 9067, + 13, + 23, + [ + [ + 9068, + 13, + 13, + [ + [ + 9013, + 13, + 13 + ] + ] + ], + [ + 9005 + ], + [ + 9013, + 17, + 17 + ], + [ + 9059, + 18, + 19 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 21, + 23 + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 27, + 38, + [ + [ + 9077, + 27, + 37, + [ + [ + 9047, + 27, + 27 + ], + [ + 9081, + 29, + 29 + ], + [ + 9092, + 31, + 37, + [ + [ + 9074, + 31, + 35, + [ + [ + 9090, + 34, + 34 + ], + [ + 9005 + ] + ] + ], + [ + 9013, + 37, + 37 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 40, + 53, + [ + [ + 9077, + 40, + 52, + [ + [ + 9047, + 40, + 40 + ], + [ + 9081, + 42, + 42 + ], + [ + 9102, + 44, + 52, + [ + [ + 9092, + 44, + 50, + [ + [ + 9074, + 44, + 48, + [ + [ + 9090, + 47, + 47 + ], + [ + 9005 + ] + ] + ], + [ + 9013, + 50, + 50 + ] + ] + ], + [ + 9095, + 51, + 52 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 55, + 62, + [ + [ + 9092, + 55, + 61, + [ + [ + 9074, + 55, + 59, + [ + [ + 9090, + 58, + 58 + ], + [ + 9005 + ] + ] + ], + [ + 9013, + 61, + 61 + ] + ] + ] + ] + ], + [ + 9004, + 64, + 73, + [ + [ + 9102, + 64, + 72, + [ + [ + 9092, + 64, + 70, + [ + [ + 9074, + 64, + 68, + [ + [ + 9090, + 67, + 67 + ], + [ + 9005 + ] + ] + ], + [ + 9013, + 70, + 70 + ] + ] + ], + [ + 9095, + 71, + 72 + ] + ] + ] + ] + ] + ] + ] + ] + ], + "stream": [ + [ + 373, + 5 + ], + [ + 377, + 2 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 377, + 2 + ], + [ + 352, + 6 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 352, + 6 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 377, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 302, + 3 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 41, + 1 + ], + [ + 362, + 2 + ], + [ + 311, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 302, + 3 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 41, + 1 + ], + [ + 362, + 2 + ], + [ + 311, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 40, + 1 + ], + [ + 302, + 3 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 41, + 1 + ], + [ + 362, + 2 + ], + [ + 311, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 40, + 1 + ], + [ + 302, + 3 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 41, + 1 + ], + [ + 362, + 2 + ], + [ + 311, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ] + ] +} diff --git a/src/parser/xhpast/__tests__/data/php-array-dereference-2.test b/src/parser/xhpast/__tests__/data/php-array-dereference-2.test new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-array-dereference-2.test @@ -0,0 +1,185 @@ +getStatus()['running']) { + // do something +} +~~~~~~~~~~ +pass +~~~~~~~~~~ +{ + "tree": [ + 9000, + 0, + 19, + [ + [ + 9006, + 0, + 18, + [ + [ + 9007, + 0, + 0 + ], + [ + 9004, + 2, + 18, + [ + [ + 9015, + 2, + 18, + [ + [ + 9017, + 2, + 18, + [ + [ + 9016, + 4, + 13, + [ + [ + 9102, + 5, + 12, + [ + [ + 9092, + 5, + 7, + [ + [ + 9047, + 5, + 5 + ], + [ + 9013, + 7, + 7 + ] + ] + ], + [ + 9100, + 8, + 12, + [ + [ + 9095, + 8, + 9 + ], + [ + 9087, + 11, + 11 + ] + ] + ] + ] + ] + ] + ], + [ + 9006, + 15, + 18 + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ], + "stream": [ + [ + 373, + 5 + ], + [ + 377, + 2 + ], + [ + 305, + 2 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 362, + 2 + ], + [ + 311, + 9 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 91, + 1 + ], + [ + 319, + 9 + ], + [ + 93, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 377, + 3 + ], + [ + 371, + 16 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ] + ] +} diff --git a/src/parser/xhpast/__tests__/data/php-array-dereference-3.test b/src/parser/xhpast/__tests__/data/php-array-dereference-3.test new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-array-dereference-3.test @@ -0,0 +1,209 @@ + $y) {} +foreach ($x as $k => &$y) {} + +foreach (array() as $x) {} +foreach (array() as $k => $y) {} + +foreach ($x as $y): +endforeach; + +declare(x=1); + +declare(y=1) { +} + +declare(z=1): +enddeclare; + +try {} catch (C $x) {} +try {} catch (C $x) {} catch (D $x) {} + +throw 1; + +clone $q; +$x + $x; +$x - $x; +$x * $x; +$x / $x; +$x . $x; +$x % $x; +$x & $x; +$x | $x; +$x ^ $x; +$x << $x; +$x >> $x; +$x++; +++$x; +$x--; +--$x; ++$x; +-$x; +!$x; +~$x; +$x == $x; +$x === $x; +$x != $x; +$x !== $x; +$x = $x; +$x < $x; +$x <= $x; +$x > $x; +$x >= $x; +$x instanceof $x; +($x); +($x ? $x : $x); +($x ?: $x); +$x || $x; +$x && $x; +$x and $x; +$x or $x; +$x xor $x; +$x += $x; +$x -= $x; +$x *= $x; +$x /= $x; +$x .= $x; +$x %= $x; +$x &= $x; +$x |= $x; +$x ^= $x; +$x <<= $x; +$x >>= $x; +(int)$x; +(double)$x; +(string)$x; +(binary)$x; +(array)$x; +(object)$x; +(bool)$x; +(unset)$x; +$x[] = $x; + +@$x; + +__LINE__; +__FILE__; +__DIR__; +__CLASS__; +__METHOD__; +__FUNCTION__; +__NAMESPACE__; + +goto lbl; +~~~~~~~~~~ +pass +~~~~~~~~~~ +{ + "tree": [ + 9000, + 0, + 1376, + [ + [ + 9006, + 0, + 1375, + [ + [ + 9007, + 0, + 0 + ], + [ + 9004, + 2, + 3, + [ + [ + 9086, + 2, + 2 + ] + ] + ], + [ + 9004, + 5, + 9, + [ + [ + 9082, + 5, + 8, + [ + [ + 9093, + 6, + 8, + [ + [ + 9094, + 7, + 7, + [ + [ + 9005 + ], + [ + 9086, + 7, + 7 + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 11, + 18, + [ + [ + 9050, + 11, + 18, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9013, + 13, + 13 + ], + [ + 9059, + 14, + 15 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 17, + 18 + ] + ] + ] + ] + ], + [ + 9004, + 20, + 28, + [ + [ + 9050, + 20, + 28, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9013, + 22, + 22 + ], + [ + 9059, + 23, + 25, + [ + [ + 9060, + 24, + 24, + [ + [ + 9005 + ], + [ + 9047, + 24, + 24 + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 27, + 28 + ] + ] + ] + ] + ], + [ + 9004, + 30, + 39, + [ + [ + 9050, + 30, + 39, + [ + [ + 9005 + ], + [ + 9048, + 32, + 32 + ], + [ + 9013, + 33, + 33 + ], + [ + 9059, + 34, + 36, + [ + [ + 9060, + 35, + 35, + [ + [ + 9005 + ], + [ + 9047, + 35, + 35 + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 38, + 39 + ] + ] + ] + ] + ], + [ + 9004, + 41, + 50, + [ + [ + 9050, + 41, + 50, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9013, + 43, + 43 + ], + [ + 9059, + 44, + 47, + [ + [ + 9060, + 45, + 45, + [ + [ + 9005 + ], + [ + 9049, + 45, + 46, + [ + [ + 9047, + 46, + 46 + ] + ] + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 49, + 50 + ] + ] + ] + ] + ], + [ + 9004, + 52, + 62, + [ + [ + 9050, + 52, + 62, + [ + [ + 9005 + ], + [ + 9048, + 54, + 54 + ], + [ + 9013, + 55, + 55 + ], + [ + 9059, + 56, + 59, + [ + [ + 9060, + 57, + 57, + [ + [ + 9005 + ], + [ + 9049, + 57, + 58, + [ + [ + 9047, + 58, + 58 + ] + ] + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 61, + 62 + ] + ] + ] + ] + ], + [ + 9004, + 64, + 74, + [ + [ + 9050, + 64, + 74, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9013, + 66, + 66 + ], + [ + 9059, + 67, + 71, + [ + [ + 9060, + 68, + 70, + [ + [ + 9090, + 68, + 68 + ], + [ + 9047, + 70, + 70 + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 73, + 74 + ] + ] + ] + ] + ], + [ + 9004, + 76, + 86, + [ + [ + 9050, + 76, + 86, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9013, + 78, + 78 + ], + [ + 9059, + 79, + 83, + [ + [ + 9060, + 80, + 82, + [ + [ + 9061, + 80, + 80 + ], + [ + 9047, + 82, + 82 + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 85, + 86 + ] + ] + ] + ] + ], + [ + 9004, + 88, + 104, + [ + [ + 9050, + 88, + 104, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9013, + 90, + 90 + ], + [ + 9059, + 91, + 101, + [ + [ + 9060, + 92, + 100, + [ + [ + 9061, + 92, + 92 + ], + [ + 9047, + 94, + 94 + ], + [ + 9082, + 98, + 100, + [ + [ + 9093, + 99, + 100 + ] + ] + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 103, + 104 + ] + ] + ] + ] + ], + [ + 9004, + 106, + 118, + [ + [ + 9050, + 106, + 118, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9013, + 108, + 108 + ], + [ + 9059, + 109, + 115, + [ + [ + 9060, + 110, + 114, + [ + [ + 9005 + ], + [ + 9047, + 110, + 110 + ], + [ + 9001, + 114, + 114 + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 117, + 118 + ] + ] + ] + ] + ], + [ + 9004, + 120, + 134, + [ + [ + 9050, + 120, + 134, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9013, + 122, + 122 + ], + [ + 9059, + 123, + 131, + [ + [ + 9060, + 124, + 130, + [ + [ + 9090, + 124, + 124 + ], + [ + 9047, + 126, + 126 + ], + [ + 9001, + 130, + 130 + ] + ] + ] + ] + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 133, + 134 + ] + ] + ] + ] + ], + [ + 9004, + 136, + 141, + [ + [ + 9051, + 136, + 141, + [ + [ + 9052, + 136, + 136 + ], + [ + 9090, + 138, + 138 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 140, + 141 + ] + ] + ] + ] + ], + [ + 9004, + 143, + 152, + [ + [ + 9051, + 143, + 152, + [ + [ + 9052, + 143, + 143 + ], + [ + 9090, + 145, + 145 + ], + [ + 9054, + 147, + 149, + [ + [ + 9090, + 149, + 149 + ] + ] + ], + [ + 9005 + ], + [ + 9006, + 151, + 152 + ] + ] + ] + ] + ], + [ + 9004, + 154, + 167, + [ + [ + 9051, + 154, + 167, + [ + [ + 9052, + 154, + 154 + ], + [ + 9090, + 156, + 156 + ], + [ + 9054, + 158, + 160, + [ + [ + 9090, + 160, + 160 + ] + ] + ], + [ + 9055, + 162, + 164, + [ + [ + 9090, + 164, + 164 + ] + ] + ], + [ + 9006, + 166, + 167 + ] + ] + ] + ] + ], + [ + 9004, + 169, + 185, + [ + [ + 9051, + 169, + 185, + [ + [ + 9052, + 169, + 169 + ], + [ + 9090, + 171, + 171 + ], + [ + 9054, + 173, + 175, + [ + [ + 9090, + 175, + 175 + ] + ] + ], + [ + 9055, + 177, + 182, + [ + [ + 9090, + 179, + 179 + ], + [ + 9090, + 182, + 182 + ] + ] + ], + [ + 9006, + 184, + 185 + ] + ] + ] + ] + ], + [ + 9004, + 187, + 194, + [ + [ + 9051, + 187, + 194, + [ + [ + 9052, + 187, + 189, + [ + [ + 9013, + 187, + 187 + ] + ] + ], + [ + 9090, + 191, + 191 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 193, + 194 + ] + ] + ] + ] + ], + [ + 9004, + 196, + 203, + [ + [ + 9051, + 196, + 203, + [ + [ + 9052, + 196, + 198, + [ + [ + 9013, + 196, + 196 + ] + ] + ], + [ + 9090, + 200, + 200 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 202, + 203 + ] + ] + ] + ] + ], + [ + 9004, + 205, + 354, + [ + [ + 9051, + 205, + 354, + [ + [ + 9052, + 205, + 207, + [ + [ + 9013, + 205, + 205 + ] + ] + ], + [ + 9090, + 209, + 209 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 211, + 354, + [ + [ + 9004, + 213, + 220, + [ + [ + 9065, + 213, + 219, + [ + [ + 9066, + 215, + 219, + [ + [ + 9013, + 215, + 215 + ], + [ + 9086, + 219, + 219 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 222, + 236, + [ + [ + 9065, + 222, + 235, + [ + [ + 9066, + 224, + 228, + [ + [ + 9013, + 224, + 224 + ], + [ + 9086, + 228, + 228 + ] + ] + ], + [ + 9066, + 231, + 235, + [ + [ + 9013, + 231, + 231 + ], + [ + 9086, + 235, + 235 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 238, + 241, + [ + [ + 9063, + 238, + 240, + [ + [ + 9070, + 238, + 238, + [ + [ + 9013, + 238, + 238 + ] + ] + ], + [ + 9064, + 240, + 240, + [ + [ + 9047, + 240, + 240 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 243, + 249, + [ + [ + 9063, + 243, + 248, + [ + [ + 9070, + 243, + 243, + [ + [ + 9013, + 243, + 243 + ] + ] + ], + [ + 9064, + 245, + 245, + [ + [ + 9047, + 245, + 245 + ], + [ + 9005 + ] + ] + ], + [ + 9064, + 248, + 248, + [ + [ + 9047, + 248, + 248 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 251, + 254, + [ + [ + 9063, + 251, + 253, + [ + [ + 9070, + 251, + 251, + [ + [ + 9013, + 251, + 251 + ] + ] + ], + [ + 9064, + 253, + 253, + [ + [ + 9047, + 253, + 253 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 256, + 262, + [ + [ + 9063, + 256, + 261, + [ + [ + 9070, + 256, + 256, + [ + [ + 9013, + 256, + 256 + ] + ] + ], + [ + 9064, + 258, + 258, + [ + [ + 9047, + 258, + 258 + ], + [ + 9005 + ] + ] + ], + [ + 9064, + 261, + 261, + [ + [ + 9047, + 261, + 261 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 264, + 271, + [ + [ + 9063, + 264, + 270, + [ + [ + 9070, + 264, + 264, + [ + [ + 9013, + 264, + 264 + ] + ] + ], + [ + 9064, + 266, + 270, + [ + [ + 9047, + 266, + 266 + ], + [ + 9086, + 270, + 270 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 273, + 289, + [ + [ + 9063, + 273, + 288, + [ + [ + 9070, + 273, + 275, + [ + [ + 9013, + 273, + 273 + ], + [ + 9013, + 275, + 275 + ] + ] + ], + [ + 9064, + 277, + 281, + [ + [ + 9047, + 277, + 277 + ], + [ + 9086, + 281, + 281 + ] + ] + ], + [ + 9064, + 284, + 288, + [ + [ + 9047, + 284, + 284 + ], + [ + 9086, + 288, + 288 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 291, + 298, + [ + [ + 9067, + 291, + 298, + [ + [ + 9068 + ], + [ + 9005 + ], + [ + 9013, + 293, + 293 + ], + [ + 9059, + 294, + 295 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 297, + 298 + ] + ] + ] + ] + ], + [ + 9004, + 300, + 309, + [ + [ + 9067, + 300, + 309, + [ + [ + 9068, + 300, + 300, + [ + [ + 9013, + 300, + 300 + ] + ] + ], + [ + 9005 + ], + [ + 9013, + 304, + 304 + ], + [ + 9059, + 305, + 306 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 308, + 309 + ] + ] + ] + ] + ], + [ + 9004, + 311, + 320, + [ + [ + 9067, + 311, + 320, + [ + [ + 9068, + 311, + 311, + [ + [ + 9013, + 311, + 311 + ] + ] + ], + [ + 9005 + ], + [ + 9013, + 315, + 315 + ], + [ + 9059, + 316, + 317 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 319, + 320 + ] + ] + ] + ] + ], + [ + 9004, + 322, + 331, + [ + [ + 9067, + 322, + 331, + [ + [ + 9068, + 322, + 322, + [ + [ + 9013, + 322, + 322 + ] + ] + ], + [ + 9005 + ], + [ + 9013, + 326, + 326 + ], + [ + 9059, + 327, + 328 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 330, + 331 + ] + ] + ] + ] + ], + [ + 9004, + 333, + 341, + [ + [ + 9067, + 333, + 341, + [ + [ + 9068 + ], + [ + 9048, + 335, + 335 + ], + [ + 9013, + 336, + 336 + ], + [ + 9059, + 337, + 338 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 340, + 341 + ] + ] + ] + ] + ], + [ + 9004, + 343, + 352, + [ + [ + 9067, + 343, + 352, + [ + [ + 9068, + 343, + 343, + [ + [ + 9013, + 343, + 343 + ] + ] + ], + [ + 9005 + ], + [ + 9013, + 347, + 347 + ], + [ + 9059, + 348, + 349 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 351, + 352 + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 356, + 373, + [ + [ + 9051, + 356, + 373, + [ + [ + 9052, + 356, + 358, + [ + [ + 9013, + 356, + 356 + ] + ] + ], + [ + 9090, + 360, + 360 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 362, + 373, + [ + [ + 9004, + 364, + 370, + [ + [ + 9067, + 364, + 370, + [ + [ + 9068, + 364, + 364, + [ + [ + 9013, + 364, + 364 + ] + ] + ], + [ + 9005 + ], + [ + 9013, + 368, + 368 + ], + [ + 9059, + 369, + 370 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 375, + 380, + [ + [ + 9056, + 375, + 380, + [ + [ + 9052 + ], + [ + 9090, + 377, + 377 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 379, + 380 + ] + ] + ] + ] + ], + [ + 9004, + 382, + 391, + [ + [ + 9056, + 382, + 391, + [ + [ + 9052 + ], + [ + 9090, + 384, + 384 + ], + [ + 9054, + 386, + 388, + [ + [ + 9090, + 388, + 388 + ] + ] + ], + [ + 9005 + ], + [ + 9006, + 390, + 391 + ] + ] + ] + ] + ], + [ + 9004, + 393, + 405, + [ + [ + 9056, + 393, + 405, + [ + [ + 9052 + ], + [ + 9090, + 395, + 395 + ], + [ + 9054, + 397, + 402, + [ + [ + 9090, + 399, + 399 + ], + [ + 9090, + 402, + 402 + ] + ] + ], + [ + 9005 + ], + [ + 9006, + 404, + 405 + ] + ] + ] + ] + ], + [ + 9004, + 407, + 410, + [ + [ + 9009, + 407, + 409, + [ + [ + 9010, + 409, + 409, + [ + [ + 9001, + 409, + 409 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 412, + 418, + [ + [ + 9009, + 412, + 417, + [ + [ + 9010, + 414, + 414, + [ + [ + 9001, + 414, + 414 + ], + [ + 9005 + ] + ] + ], + [ + 9010, + 417, + 417, + [ + [ + 9001, + 417, + 417 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 420, + 446, + [ + [ + 9009, + 420, + 445, + [ + [ + 9010, + 422, + 426, + [ + [ + 9001, + 422, + 422 + ], + [ + 9013, + 426, + 426 + ] + ] + ], + [ + 9010, + 429, + 433, + [ + [ + 9001, + 429, + 429 + ], + [ + 9013, + 433, + 433 + ] + ] + ], + [ + 9010, + 436, + 437, + [ + [ + 9001, + 436, + 437 + ], + [ + 9005 + ] + ] + ], + [ + 9010, + 440, + 445, + [ + [ + 9001, + 440, + 441 + ], + [ + 9013, + 445, + 445 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 448, + 455, + [ + [ + 9011, + 448, + 454, + [ + [ + 9012, + 450, + 454, + [ + [ + 9013, + 450, + 450 + ], + [ + 9086, + 454, + 454 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 457, + 471, + [ + [ + 9011, + 457, + 470, + [ + [ + 9012, + 459, + 463, + [ + [ + 9013, + 459, + 459 + ], + [ + 9086, + 463, + 463 + ] + ] + ], + [ + 9012, + 466, + 470, + [ + [ + 9013, + 466, + 466 + ], + [ + 9086, + 470, + 470 + ] + ] + ] + ] + ] + ] + ], + [ + 9014, + 473, + 474, + [ + [ + 9013, + 473, + 473 + ] + ] + ], + [ + 9004, + 476, + 483, + [ + [ + 9015, + 476, + 483, + [ + [ + 9017, + 476, + 483, + [ + [ + 9016, + 478, + 480, + [ + [ + 9086, + 479, + 479 + ] + ] + ], + [ + 9006, + 482, + 483 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 485, + 497, + [ + [ + 9015, + 485, + 497, + [ + [ + 9017, + 485, + 492, + [ + [ + 9016, + 487, + 489, + [ + [ + 9086, + 488, + 488 + ] + ] + ], + [ + 9006, + 491, + 492 + ] + ] + ], + [ + 9019, + 494, + 497, + [ + [ + 9006, + 496, + 497 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 499, + 520, + [ + [ + 9015, + 499, + 520, + [ + [ + 9017, + 499, + 506, + [ + [ + 9016, + 501, + 503, + [ + [ + 9086, + 502, + 502 + ] + ] + ], + [ + 9006, + 505, + 506 + ] + ] + ], + [ + 9018, + 508, + 515, + [ + [ + 9016, + 510, + 512, + [ + [ + 9086, + 511, + 511 + ] + ] + ], + [ + 9006, + 514, + 515 + ] + ] + ], + [ + 9019, + 517, + 520, + [ + [ + 9006, + 519, + 520 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 522, + 547, + [ + [ + 9015, + 522, + 547, + [ + [ + 9017, + 522, + 529, + [ + [ + 9016, + 524, + 526, + [ + [ + 9086, + 525, + 525 + ] + ] + ], + [ + 9006, + 528, + 529 + ] + ] + ], + [ + 9018, + 531, + 538, + [ + [ + 9016, + 533, + 535, + [ + [ + 9086, + 534, + 534 + ] + ] + ], + [ + 9006, + 537, + 538 + ] + ] + ], + [ + 9018, + 540, + 547, + [ + [ + 9016, + 542, + 544, + [ + [ + 9086, + 543, + 543 + ] + ] + ], + [ + 9006, + 546, + 547 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 549, + 557, + [ + [ + 9015, + 549, + 556, + [ + [ + 9017, + 549, + 553, + [ + [ + 9016, + 551, + 553, + [ + [ + 9086, + 552, + 552 + ] + ] + ], + [ + 9006 + ] + ] + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9004, + 559, + 570, + [ + [ + 9015, + 559, + 569, + [ + [ + 9017, + 559, + 563, + [ + [ + 9016, + 561, + 563, + [ + [ + 9086, + 562, + 562 + ] + ] + ], + [ + 9006 + ] + ] + ], + [ + 9019, + 566, + 566, + [ + [ + 9006 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 572, + 587, + [ + [ + 9015, + 572, + 586, + [ + [ + 9017, + 572, + 576, + [ + [ + 9016, + 574, + 576, + [ + [ + 9086, + 575, + 575 + ] + ] + ], + [ + 9006 + ] + ] + ], + [ + 9018, + 579, + 582, + [ + [ + 9086, + 582, + 582 + ], + [ + 9006 + ] + ] + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9004, + 589, + 611, + [ + [ + 9015, + 589, + 610, + [ + [ + 9017, + 589, + 593, + [ + [ + 9016, + 591, + 593, + [ + [ + 9086, + 592, + 592 + ] + ] + ], + [ + 9006 + ] + ] + ], + [ + 9018, + 596, + 599, + [ + [ + 9086, + 599, + 599 + ], + [ + 9006 + ] + ] + ], + [ + 9018, + 603, + 606, + [ + [ + 9086, + 606, + 606 + ], + [ + 9006 + ] + ] + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9004, + 613, + 620, + [ + [ + 9020, + 613, + 620, + [ + [ + 9016, + 615, + 617, + [ + [ + 9086, + 616, + 616 + ] + ] + ], + [ + 9006, + 619, + 620 + ] + ] + ] + ] + ], + [ + 9004, + 622, + 630, + [ + [ + 9020, + 622, + 630, + [ + [ + 9016, + 624, + 626, + [ + [ + 9086, + 625, + 625 + ] + ] + ], + [ + 9006, + 627, + 630 + ] + ] + ] + ] + ], + [ + 9004, + 632, + 642, + [ + [ + 9021, + 632, + 641, + [ + [ + 9006, + 634, + 635 + ], + [ + 9016, + 639, + 641, + [ + [ + 9086, + 640, + 640 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 644, + 652, + [ + [ + 9022, + 644, + 652, + [ + [ + 9023, + 646, + 649, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9005 + ] + ] + ], + [ + 9006, + 651, + 652 + ] + ] + ] + ] + ], + [ + 9004, + 654, + 663, + [ + [ + 9022, + 654, + 663, + [ + [ + 9023, + 656, + 659, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9005 + ] + ] + ], + [ + 9006, + 660, + 663 + ] + ] + ] + ] + ], + [ + 9004, + 665, + 695, + [ + [ + 9024, + 665, + 695, + [ + [ + 9016, + 667, + 669, + [ + [ + 9086, + 668, + 668 + ] + ] + ], + [ + 9006, + 671, + 695, + [ + [ + 9057, + 673, + 679, + [ + [ + 9086, + 675, + 675 + ], + [ + 9006, + 678, + 679, + [ + [ + 9004, + 678, + 679, + [ + [ + 9025, + 678, + 678, + [ + [ + 9005 + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9057, + 681, + 687, + [ + [ + 9086, + 683, + 683 + ], + [ + 9006, + 686, + 687, + [ + [ + 9004, + 686, + 687, + [ + [ + 9025, + 686, + 686, + [ + [ + 9005 + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9058, + 689, + 693, + [ + [ + 9006, + 692, + 693, + [ + [ + 9004, + 692, + 693, + [ + [ + 9026, + 692, + 692, + [ + [ + 9005 + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 697, + 704, + [ + [ + 9024, + 697, + 704, + [ + [ + 9016, + 698, + 700, + [ + [ + 9086, + 699, + 699 + ] + ] + ], + [ + 9006, + 702, + 704, + [ + [ + 9004, + 703, + 703 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 706, + 713, + [ + [ + 9024, + 706, + 713, + [ + [ + 9016, + 707, + 709, + [ + [ + 9086, + 708, + 708 + ] + ] + ], + [ + 9006, + 710, + 713 + ] + ] + ] + ] + ], + [ + 9004, + 715, + 716, + [ + [ + 9025, + 715, + 715, + [ + [ + 9005 + ] + ] + ] + ] + ], + [ + 9004, + 718, + 721, + [ + [ + 9025, + 718, + 720, + [ + [ + 9086, + 720, + 720 + ] + ] + ] + ] + ], + [ + 9004, + 723, + 724, + [ + [ + 9026, + 723, + 723, + [ + [ + 9005 + ] + ] + ] + ] + ], + [ + 9004, + 726, + 729, + [ + [ + 9026, + 726, + 728, + [ + [ + 9086, + 728, + 728 + ] + ] + ] + ] + ], + [ + 9004, + 731, + 732, + [ + [ + 9027, + 731, + 731, + [ + [ + 9005 + ] + ] + ] + ] + ], + [ + 9004, + 734, + 737, + [ + [ + 9027, + 734, + 736, + [ + [ + 9086, + 736, + 736 + ] + ] + ] + ] + ], + [ + 9004, + 739, + 742, + [ + [ + 9027, + 739, + 741, + [ + [ + 9047, + 741, + 741 + ] + ] + ] + ] + ], + [ + 9004, + 744, + 747, + [ + [ + 9028, + 744, + 746, + [ + [ + 9047, + 746, + 746 + ] + ] + ] + ] + ], + [ + 9004, + 749, + 755, + [ + [ + 9028, + 749, + 754, + [ + [ + 9047, + 751, + 751 + ], + [ + 9047, + 754, + 754 + ] + ] + ] + ] + ], + [ + 9004, + 757, + 761, + [ + [ + 9028, + 757, + 760, + [ + [ + 9062, + 759, + 760, + [ + [ + 9047, + 760, + 760 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 763, + 771, + [ + [ + 9028, + 763, + 769, + [ + [ + 9062, + 765, + 769, + [ + [ + 9103, + 767, + 769, + [ + [ + 9047, + 767, + 767 + ], + [ + 9081, + 768, + 768 + ], + [ + 9047, + 769, + 769 + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 773, + 776, + [ + [ + 9030, + 773, + 775, + [ + [ + 9031, + 775, + 775, + [ + [ + 9047, + 775, + 775 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 778, + 784, + [ + [ + 9030, + 778, + 783, + [ + [ + 9031, + 780, + 780, + [ + [ + 9047, + 780, + 780 + ], + [ + 9005 + ] + ] + ], + [ + 9031, + 783, + 783, + [ + [ + 9047, + 783, + 783 + ], + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 786, + 789, + [ + [ + 9032, + 786, + 788, + [ + [ + 9086, + 788, + 788 + ] + ] + ] + ] + ], + [ + 9004, + 791, + 797, + [ + [ + 9032, + 791, + 796, + [ + [ + 9086, + 793, + 793 + ], + [ + 9086, + 796, + 796 + ] + ] + ] + ] + ], + [ + 9004, + 799, + 806, + [ + [ + 9035, + 799, + 805, + [ + [ + 9047, + 801, + 801 + ], + [ + 9047, + 804, + 804 + ] + ] + ] + ] + ], + [ + 9004, + 808, + 819, + [ + [ + 9037, + 808, + 819, + [ + [ + 9038, + 810, + 816, + [ + [ + 9047, + 811, + 811 + ], + [ + 9005 + ], + [ + 9047, + 815, + 815 + ] + ] + ], + [ + 9006, + 818, + 819 + ] + ] + ] + ] + ], + [ + 9004, + 821, + 836, + [ + [ + 9037, + 821, + 836, + [ + [ + 9038, + 823, + 833, + [ + [ + 9047, + 824, + 824 + ], + [ + 9047, + 828, + 828 + ], + [ + 9047, + 832, + 832 + ] + ] + ], + [ + 9006, + 835, + 836 + ] + ] + ] + ] + ], + [ + 9004, + 838, + 854, + [ + [ + 9037, + 838, + 854, + [ + [ + 9038, + 840, + 851, + [ + [ + 9047, + 841, + 841 + ], + [ + 9047, + 845, + 845 + ], + [ + 9049, + 849, + 850, + [ + [ + 9047, + 850, + 850 + ] + ] + ] + ] + ], + [ + 9006, + 853, + 854 + ] + ] + ] + ] + ], + [ + 9004, + 856, + 869, + [ + [ + 9037, + 856, + 869, + [ + [ + 9038, + 858, + 866, + [ + [ + 9082, + 859, + 861, + [ + [ + 9093, + 860, + 861 + ] + ] + ], + [ + 9005 + ], + [ + 9047, + 865, + 865 + ] + ] + ], + [ + 9006, + 868, + 869 + ] + ] + ] + ] + ], + [ + 9004, + 871, + 888, + [ + [ + 9037, + 871, + 888, + [ + [ + 9038, + 873, + 885, + [ + [ + 9082, + 874, + 876, + [ + [ + 9093, + 875, + 876 + ] + ] + ], + [ + 9047, + 880, + 880 + ], + [ + 9047, + 884, + 884 + ] + ] + ], + [ + 9006, + 887, + 888 + ] + ] + ] + ] + ], + [ + 9004, + 890, + 902, + [ + [ + 9037, + 890, + 902, + [ + [ + 9038, + 892, + 898, + [ + [ + 9047, + 893, + 893 + ], + [ + 9005 + ], + [ + 9047, + 897, + 897 + ] + ] + ], + [ + 9006, + 899, + 902 + ] + ] + ] + ] + ], + [ + 9004, + 904, + 910, + [ + [ + 9044, + 904, + 910, + [ + [ + 9045, + 906, + 908, + [ + [ + 9046, + 906, + 908, + [ + [ + 9013, + 906, + 906 + ], + [ + 9086, + 908, + 908 + ] + ] + ] + ] + ], + [ + 9004, + 910, + 910, + [ + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 912, + 921, + [ + [ + 9044, + 912, + 921, + [ + [ + 9045, + 914, + 916, + [ + [ + 9046, + 914, + 916, + [ + [ + 9013, + 914, + 914 + ], + [ + 9086, + 916, + 916 + ] + ] + ] + ] + ], + [ + 9006, + 919, + 921 + ] + ] + ] + ] + ], + [ + 9004, + 923, + 932, + [ + [ + 9044, + 923, + 932, + [ + [ + 9045, + 925, + 927, + [ + [ + 9046, + 925, + 927, + [ + [ + 9013, + 925, + 925 + ], + [ + 9086, + 927, + 927 + ] + ] + ] + ] + ], + [ + 9006, + 929, + 932 + ] + ] + ] + ] + ], + [ + 9004, + 934, + 948, + [ + [ + 9041, + 934, + 948, + [ + [ + 9006, + 936, + 937 + ], + [ + 9042, + 939, + 948, + [ + [ + 9043, + 939, + 948, + [ + [ + 9090, + 942, + 942 + ], + [ + 9047, + 944, + 944 + ], + [ + 9006, + 947, + 948 + ] + ] + ] + ] + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9004, + 950, + 975, + [ + [ + 9041, + 950, + 975, + [ + [ + 9006, + 952, + 953 + ], + [ + 9042, + 955, + 975, + [ + [ + 9043, + 955, + 964, + [ + [ + 9090, + 958, + 958 + ], + [ + 9047, + 960, + 960 + ], + [ + 9006, + 963, + 964 + ] + ] + ], + [ + 9043, + 966, + 975, + [ + [ + 9090, + 969, + 969 + ], + [ + 9047, + 971, + 971 + ], + [ + 9006, + 974, + 975 + ] + ] + ] + ] + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9004, + 977, + 980, + [ + [ + 9039, + 977, + 979, + [ + [ + 9086, + 979, + 979 + ] + ] + ] + ] + ], + [ + 9004, + 982, + 985, + [ + [ + 9075, + 982, + 984, + [ + [ + 9081, + 982, + 982 + ], + [ + 9047, + 984, + 984 + ] + ] + ] + ] + ], + [ + 9004, + 987, + 992, + [ + [ + 9077, + 987, + 991, + [ + [ + 9047, + 987, + 987 + ], + [ + 9081, + 989, + 989 + ], + [ + 9047, + 991, + 991 + ] + ] + ] + ] + ], + [ + 9004, + 994, + 999, + [ + [ + 9077, + 994, + 998, + [ + [ + 9047, + 994, + 994 + ], + [ + 9081, + 996, + 996 + ], + [ + 9047, + 998, + 998 + ] + ] + ] + ] + ], + [ + 9004, + 1001, + 1006, + [ + [ + 9077, + 1001, + 1005, + [ + [ + 9047, + 1001, + 1001 + ], + [ + 9081, + 1003, + 1003 + ], + [ + 9047, + 1005, + 1005 + ] + ] + ] + ] + ], + [ + 9004, + 1008, + 1013, + [ + [ + 9077, + 1008, + 1012, + [ + [ + 9047, + 1008, + 1008 + ], + [ + 9081, + 1010, + 1010 + ], + [ + 9047, + 1012, + 1012 + ] + ] + ] + ] + ], + [ + 9004, + 1015, + 1020, + [ + [ + 9103, + 1015, + 1019, + [ + [ + 9047, + 1015, + 1015 + ], + [ + 9081, + 1017, + 1017 + ], + [ + 9047, + 1019, + 1019 + ] + ] + ] + ] + ], + [ + 9004, + 1022, + 1027, + [ + [ + 9077, + 1022, + 1026, + [ + [ + 9047, + 1022, + 1022 + ], + [ + 9081, + 1024, + 1024 + ], + [ + 9047, + 1026, + 1026 + ] + ] + ] + ] + ], + [ + 9004, + 1029, + 1034, + [ + [ + 9077, + 1029, + 1033, + [ + [ + 9047, + 1029, + 1029 + ], + [ + 9081, + 1031, + 1031 + ], + [ + 9047, + 1033, + 1033 + ] + ] + ] + ] + ], + [ + 9004, + 1036, + 1041, + [ + [ + 9077, + 1036, + 1040, + [ + [ + 9047, + 1036, + 1036 + ], + [ + 9081, + 1038, + 1038 + ], + [ + 9047, + 1040, + 1040 + ] + ] + ] + ] + ], + [ + 9004, + 1043, + 1048, + [ + [ + 9077, + 1043, + 1047, + [ + [ + 9047, + 1043, + 1043 + ], + [ + 9081, + 1045, + 1045 + ], + [ + 9047, + 1047, + 1047 + ] + ] + ] + ] + ], + [ + 9004, + 1050, + 1055, + [ + [ + 9077, + 1050, + 1054, + [ + [ + 9047, + 1050, + 1050 + ], + [ + 9081, + 1052, + 1052 + ], + [ + 9047, + 1054, + 1054 + ] + ] + ] + ] + ], + [ + 9004, + 1057, + 1062, + [ + [ + 9077, + 1057, + 1061, + [ + [ + 9047, + 1057, + 1057 + ], + [ + 9081, + 1059, + 1059 + ], + [ + 9047, + 1061, + 1061 + ] + ] + ] + ] + ], + [ + 9004, + 1064, + 1066, + [ + [ + 9076, + 1064, + 1065, + [ + [ + 9047, + 1064, + 1064 + ], + [ + 9081, + 1065, + 1065 + ] + ] + ] + ] + ], + [ + 9004, + 1068, + 1070, + [ + [ + 9075, + 1068, + 1069, + [ + [ + 9081, + 1068, + 1068 + ], + [ + 9047, + 1069, + 1069 + ] + ] + ] + ] + ], + [ + 9004, + 1072, + 1074, + [ + [ + 9076, + 1072, + 1073, + [ + [ + 9047, + 1072, + 1072 + ], + [ + 9081, + 1073, + 1073 + ] + ] + ] + ] + ], + [ + 9004, + 1076, + 1078, + [ + [ + 9075, + 1076, + 1077, + [ + [ + 9081, + 1076, + 1076 + ], + [ + 9047, + 1077, + 1077 + ] + ] + ] + ] + ], + [ + 9004, + 1080, + 1082, + [ + [ + 9075, + 1080, + 1081, + [ + [ + 9081, + 1080, + 1080 + ], + [ + 9047, + 1081, + 1081 + ] + ] + ] + ] + ], + [ + 9004, + 1084, + 1086, + [ + [ + 9075, + 1084, + 1085, + [ + [ + 9081, + 1084, + 1084 + ], + [ + 9047, + 1085, + 1085 + ] + ] + ] + ] + ], + [ + 9004, + 1088, + 1090, + [ + [ + 9075, + 1088, + 1089, + [ + [ + 9081, + 1088, + 1088 + ], + [ + 9047, + 1089, + 1089 + ] + ] + ] + ] + ], + [ + 9004, + 1092, + 1094, + [ + [ + 9075, + 1092, + 1093, + [ + [ + 9081, + 1092, + 1092 + ], + [ + 9047, + 1093, + 1093 + ] + ] + ] + ] + ], + [ + 9004, + 1096, + 1101, + [ + [ + 9077, + 1096, + 1100, + [ + [ + 9047, + 1096, + 1096 + ], + [ + 9081, + 1098, + 1098 + ], + [ + 9047, + 1100, + 1100 + ] + ] + ] + ] + ], + [ + 9004, + 1103, + 1108, + [ + [ + 9077, + 1103, + 1107, + [ + [ + 9047, + 1103, + 1103 + ], + [ + 9081, + 1105, + 1105 + ], + [ + 9047, + 1107, + 1107 + ] + ] + ] + ] + ], + [ + 9004, + 1110, + 1115, + [ + [ + 9077, + 1110, + 1114, + [ + [ + 9047, + 1110, + 1110 + ], + [ + 9081, + 1112, + 1112 + ], + [ + 9047, + 1114, + 1114 + ] + ] + ] + ] + ], + [ + 9004, + 1117, + 1122, + [ + [ + 9077, + 1117, + 1121, + [ + [ + 9047, + 1117, + 1117 + ], + [ + 9081, + 1119, + 1119 + ], + [ + 9047, + 1121, + 1121 + ] + ] + ] + ] + ], + [ + 9004, + 1124, + 1129, + [ + [ + 9077, + 1124, + 1128, + [ + [ + 9047, + 1124, + 1124 + ], + [ + 9081, + 1126, + 1126 + ], + [ + 9047, + 1128, + 1128 + ] + ] + ] + ] + ], + [ + 9004, + 1131, + 1136, + [ + [ + 9077, + 1131, + 1135, + [ + [ + 9047, + 1131, + 1131 + ], + [ + 9081, + 1133, + 1133 + ], + [ + 9047, + 1135, + 1135 + ] + ] + ] + ] + ], + [ + 9004, + 1138, + 1143, + [ + [ + 9077, + 1138, + 1142, + [ + [ + 9047, + 1138, + 1138 + ], + [ + 9081, + 1140, + 1140 + ], + [ + 9047, + 1142, + 1142 + ] + ] + ] + ] + ], + [ + 9004, + 1145, + 1150, + [ + [ + 9077, + 1145, + 1149, + [ + [ + 9047, + 1145, + 1145 + ], + [ + 9081, + 1147, + 1147 + ], + [ + 9047, + 1149, + 1149 + ] + ] + ] + ] + ], + [ + 9004, + 1152, + 1157, + [ + [ + 9077, + 1152, + 1156, + [ + [ + 9047, + 1152, + 1152 + ], + [ + 9081, + 1154, + 1154 + ], + [ + 9047, + 1156, + 1156 + ] + ] + ] + ] + ], + [ + 9004, + 1159, + 1164, + [ + [ + 9077, + 1159, + 1163, + [ + [ + 9047, + 1159, + 1159 + ], + [ + 9081, + 1161, + 1161 + ], + [ + 9047, + 1163, + 1163 + ] + ] + ] + ] + ], + [ + 9004, + 1166, + 1169, + [ + [ + 9104, + 1166, + 1168, + [ + [ + 9047, + 1167, + 1167 + ] + ] + ] + ] + ], + [ + 9004, + 1171, + 1182, + [ + [ + 9104, + 1171, + 1181, + [ + [ + 9078, + 1172, + 1180, + [ + [ + 9047, + 1172, + 1172 + ], + [ + 9081, + 1174, + 1174 + ], + [ + 9047, + 1176, + 1176 + ], + [ + 9081, + 1178, + 1178 + ], + [ + 9047, + 1180, + 1180 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 1184, + 1192, + [ + [ + 9104, + 1184, + 1191, + [ + [ + 9078, + 1185, + 1190, + [ + [ + 9047, + 1185, + 1185 + ], + [ + 9081, + 1187, + 1187 + ], + [ + 9005 + ], + [ + 9081, + 1188, + 1188 + ], + [ + 9047, + 1190, + 1190 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 1194, + 1199, + [ + [ + 9077, + 1194, + 1198, + [ + [ + 9047, + 1194, + 1194 + ], + [ + 9081, + 1196, + 1196 + ], + [ + 9047, + 1198, + 1198 + ] + ] + ] + ] + ], + [ + 9004, + 1201, + 1206, + [ + [ + 9077, + 1201, + 1205, + [ + [ + 9047, + 1201, + 1201 + ], + [ + 9081, + 1203, + 1203 + ], + [ + 9047, + 1205, + 1205 + ] + ] + ] + ] + ], + [ + 9004, + 1208, + 1213, + [ + [ + 9077, + 1208, + 1212, + [ + [ + 9047, + 1208, + 1208 + ], + [ + 9081, + 1210, + 1210 + ], + [ + 9047, + 1212, + 1212 + ] + ] + ] + ] + ], + [ + 9004, + 1215, + 1220, + [ + [ + 9077, + 1215, + 1219, + [ + [ + 9047, + 1215, + 1215 + ], + [ + 9081, + 1217, + 1217 + ], + [ + 9047, + 1219, + 1219 + ] + ] + ] + ] + ], + [ + 9004, + 1222, + 1227, + [ + [ + 9077, + 1222, + 1226, + [ + [ + 9047, + 1222, + 1222 + ], + [ + 9081, + 1224, + 1224 + ], + [ + 9047, + 1226, + 1226 + ] + ] + ] + ] + ], + [ + 9004, + 1229, + 1234, + [ + [ + 9077, + 1229, + 1233, + [ + [ + 9047, + 1229, + 1229 + ], + [ + 9081, + 1231, + 1231 + ], + [ + 9047, + 1233, + 1233 + ] + ] + ] + ] + ], + [ + 9004, + 1236, + 1241, + [ + [ + 9077, + 1236, + 1240, + [ + [ + 9047, + 1236, + 1236 + ], + [ + 9081, + 1238, + 1238 + ], + [ + 9047, + 1240, + 1240 + ] + ] + ] + ] + ], + [ + 9004, + 1243, + 1248, + [ + [ + 9077, + 1243, + 1247, + [ + [ + 9047, + 1243, + 1243 + ], + [ + 9081, + 1245, + 1245 + ], + [ + 9047, + 1247, + 1247 + ] + ] + ] + ] + ], + [ + 9004, + 1250, + 1255, + [ + [ + 9077, + 1250, + 1254, + [ + [ + 9047, + 1250, + 1250 + ], + [ + 9081, + 1252, + 1252 + ], + [ + 9047, + 1254, + 1254 + ] + ] + ] + ] + ], + [ + 9004, + 1257, + 1262, + [ + [ + 9077, + 1257, + 1261, + [ + [ + 9047, + 1257, + 1257 + ], + [ + 9081, + 1259, + 1259 + ], + [ + 9047, + 1261, + 1261 + ] + ] + ] + ] + ], + [ + 9004, + 1264, + 1269, + [ + [ + 9077, + 1264, + 1268, + [ + [ + 9047, + 1264, + 1264 + ], + [ + 9081, + 1266, + 1266 + ], + [ + 9047, + 1268, + 1268 + ] + ] + ] + ] + ], + [ + 9004, + 1271, + 1276, + [ + [ + 9077, + 1271, + 1275, + [ + [ + 9047, + 1271, + 1271 + ], + [ + 9081, + 1273, + 1273 + ], + [ + 9047, + 1275, + 1275 + ] + ] + ] + ] + ], + [ + 9004, + 1278, + 1283, + [ + [ + 9077, + 1278, + 1282, + [ + [ + 9047, + 1278, + 1278 + ], + [ + 9081, + 1280, + 1280 + ], + [ + 9047, + 1282, + 1282 + ] + ] + ] + ] + ], + [ + 9004, + 1285, + 1290, + [ + [ + 9077, + 1285, + 1289, + [ + [ + 9047, + 1285, + 1285 + ], + [ + 9081, + 1287, + 1287 + ], + [ + 9047, + 1289, + 1289 + ] + ] + ] + ] + ], + [ + 9004, + 1292, + 1297, + [ + [ + 9077, + 1292, + 1296, + [ + [ + 9047, + 1292, + 1292 + ], + [ + 9081, + 1294, + 1294 + ], + [ + 9047, + 1296, + 1296 + ] + ] + ] + ] + ], + [ + 9004, + 1299, + 1304, + [ + [ + 9077, + 1299, + 1303, + [ + [ + 9047, + 1299, + 1299 + ], + [ + 9081, + 1301, + 1301 + ], + [ + 9047, + 1303, + 1303 + ] + ] + ] + ] + ], + [ + 9004, + 1306, + 1308, + [ + [ + 9079, + 1306, + 1307, + [ + [ + 9080, + 1306, + 1306 + ], + [ + 9047, + 1307, + 1307 + ] + ] + ] + ] + ], + [ + 9004, + 1310, + 1312, + [ + [ + 9079, + 1310, + 1311, + [ + [ + 9080, + 1310, + 1310 + ], + [ + 9047, + 1311, + 1311 + ] + ] + ] + ] + ], + [ + 9004, + 1314, + 1316, + [ + [ + 9079, + 1314, + 1315, + [ + [ + 9080, + 1314, + 1314 + ], + [ + 9047, + 1315, + 1315 + ] + ] + ] + ] + ], + [ + 9004, + 1318, + 1320, + [ + [ + 9079, + 1318, + 1319, + [ + [ + 9080, + 1318, + 1318 + ], + [ + 9047, + 1319, + 1319 + ] + ] + ] + ] + ], + [ + 9004, + 1322, + 1324, + [ + [ + 9079, + 1322, + 1323, + [ + [ + 9080, + 1322, + 1322 + ], + [ + 9047, + 1323, + 1323 + ] + ] + ] + ] + ], + [ + 9004, + 1326, + 1328, + [ + [ + 9079, + 1326, + 1327, + [ + [ + 9080, + 1326, + 1326 + ], + [ + 9047, + 1327, + 1327 + ] + ] + ] + ] + ], + [ + 9004, + 1330, + 1332, + [ + [ + 9079, + 1330, + 1331, + [ + [ + 9080, + 1330, + 1330 + ], + [ + 9047, + 1331, + 1331 + ] + ] + ] + ] + ], + [ + 9004, + 1334, + 1336, + [ + [ + 9079, + 1334, + 1335, + [ + [ + 9080, + 1334, + 1334 + ], + [ + 9047, + 1335, + 1335 + ] + ] + ] + ] + ], + [ + 9004, + 1338, + 1345, + [ + [ + 9077, + 1338, + 1344, + [ + [ + 9100, + 1338, + 1340, + [ + [ + 9047, + 1338, + 1338 + ], + [ + 9005 + ] + ] + ], + [ + 9081, + 1342, + 1342 + ], + [ + 9047, + 1344, + 1344 + ] + ] + ] + ] + ], + [ + 9004, + 1347, + 1349, + [ + [ + 9075, + 1347, + 1348, + [ + [ + 9081, + 1347, + 1347 + ], + [ + 9047, + 1348, + 1348 + ] + ] + ] + ] + ], + [ + 9004, + 1351, + 1352, + [ + [ + 9088, + 1351, + 1351 + ] + ] + ], + [ + 9004, + 1354, + 1355, + [ + [ + 9088, + 1354, + 1354 + ] + ] + ], + [ + 9004, + 1357, + 1358, + [ + [ + 9088, + 1357, + 1357 + ] + ] + ], + [ + 9004, + 1360, + 1361, + [ + [ + 9088, + 1360, + 1360 + ] + ] + ], + [ + 9004, + 1363, + 1364, + [ + [ + 9088, + 1363, + 1363 + ] + ] + ], + [ + 9004, + 1366, + 1367, + [ + [ + 9088, + 1366, + 1366 + ] + ] + ], + [ + 9004, + 1369, + 1370, + [ + [ + 9088, + 1369, + 1369 + ] + ] + ], + [ + 9004, + 1372, + 1375, + [ + [ + 9040, + 1372, + 1374, + [ + [ + 9013, + 1374, + 1374 + ] + ] + ] + ] + ] + ] + ] + ] + ], + "stream": [ + [ + 373, + 5 + ], + [ + 377, + 2 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 365, + 5 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 38, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 38, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 38, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 38, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 365, + 5 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 365, + 5 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 365, + 5 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 311, + 4 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 311, + 4 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 360, + 7 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 360, + 7 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 361, + 10 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 360, + 7 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 361, + 10 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 349, + 5 + ], + [ + 377, + 1 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 348, + 8 + ], + [ + 377, + 1 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 349, + 5 + ], + [ + 377, + 1 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 377, + 3 + ], + [ + 340, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 340, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 4 + ], + [ + 353, + 3 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 353, + 3 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 352, + 6 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 351, + 9 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 350, + 7 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 352, + 6 + ], + [ + 377, + 1 + ], + [ + 347, + 6 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 5 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 3 + ], + [ + 352, + 6 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 3 + ], + [ + 351, + 9 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 3 + ], + [ + 350, + 7 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 3 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 38, + 1 + ], + [ + 311, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 3 + ], + [ + 347, + 6 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 348, + 8 + ], + [ + 377, + 1 + ], + [ + 358, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 377, + 3 + ], + [ + 348, + 8 + ], + [ + 377, + 1 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 359, + 9 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 359, + 9 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 360, + 7 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 359, + 9 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 360, + 7 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 345, + 3 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 345, + 3 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 345, + 3 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 377, + 1 + ], + [ + 331, + 2 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 377, + 1 + ], + [ + 331, + 2 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 389, + 1 + ], + [ + 311, + 2 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 389, + 1 + ], + [ + 311, + 2 + ], + [ + 377, + 1 + ], + [ + 331, + 2 + ], + [ + 377, + 1 + ], + [ + 311, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 340, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 340, + 5 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 311, + 3 + ], + [ + 58, + 1 + ], + [ + 377, + 2 + ], + [ + 305, + 2 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 305, + 2 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 307, + 4 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 305, + 2 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 306, + 6 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 307, + 4 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 305, + 2 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 306, + 6 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 306, + 6 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 305, + 2 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 308, + 5 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 305, + 2 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 307, + 4 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 308, + 5 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 305, + 2 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 306, + 6 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 308, + 5 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 305, + 2 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 306, + 6 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 306, + 6 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 308, + 5 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 323, + 5 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 323, + 5 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 324, + 8 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 322, + 2 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 323, + 5 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 325, + 3 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 59, + 1 + ], + [ + 59, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 325, + 3 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 59, + 1 + ], + [ + 59, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 326, + 6 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 332, + 6 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 377, + 3 + ], + [ + 334, + 4 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 5 + ], + [ + 336, + 5 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 334, + 4 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 5 + ], + [ + 336, + 5 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 335, + 7 + ], + [ + 58, + 1 + ], + [ + 377, + 5 + ], + [ + 337, + 8 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 332, + 6 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 59, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 332, + 6 + ], + [ + 40, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 333, + 9 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 336, + 5 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 336, + 5 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 337, + 8 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 337, + 8 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 341, + 6 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 341, + 6 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 341, + 6 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 346, + 6 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 346, + 6 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 346, + 6 + ], + [ + 377, + 1 + ], + [ + 36, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 346, + 6 + ], + [ + 377, + 1 + ], + [ + 36, + 1 + ], + [ + 123, + 1 + ], + [ + 313, + 2 + ], + [ + 46, + 1 + ], + [ + 313, + 2 + ], + [ + 125, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 347, + 6 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 347, + 6 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 321, + 4 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 321, + 4 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 354, + 5 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 44, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 327, + 7 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 331, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 327, + 7 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 331, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 363, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 327, + 7 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 331, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 363, + 2 + ], + [ + 377, + 1 + ], + [ + 38, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 327, + 7 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 365, + 5 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 331, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 327, + 7 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 365, + 5 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 331, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 363, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 327, + 7 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 331, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 328, + 10 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 329, + 7 + ], + [ + 40, + 1 + ], + [ + 311, + 1 + ], + [ + 61, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 329, + 7 + ], + [ + 40, + 1 + ], + [ + 311, + 1 + ], + [ + 61, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 377, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 329, + 7 + ], + [ + 40, + 1 + ], + [ + 311, + 1 + ], + [ + 61, + 1 + ], + [ + 309, + 1 + ], + [ + 41, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 330, + 10 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 342, + 3 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 343, + 5 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 342, + 3 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 343, + 5 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ], + [ + 343, + 5 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 311, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 2 + ], + [ + 344, + 5 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 303, + 5 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 43, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 45, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 42, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 47, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 46, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 37, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 38, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 124, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 94, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 288, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 289, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 291, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 291, + 2 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 292, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 292, + 2 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 43, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 45, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 33, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 126, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 281, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 283, + 3 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 282, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 284, + 3 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 60, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 286, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 62, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 287, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 290, + 10 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 63, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 63, + 1 + ], + [ + 58, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 279, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 280, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 265, + 3 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 263, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 264, + 3 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 267, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 268, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 269, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 270, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 271, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 272, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 273, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 274, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 275, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 276, + 3 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 277, + 3 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 293, + 5 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 294, + 8 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 295, + 8 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 295, + 8 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 298, + 7 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 299, + 8 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 300, + 6 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 301, + 7 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 91, + 1 + ], + [ + 93, + 1 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 64, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 369, + 8 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 370, + 8 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 388, + 7 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 366, + 9 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 367, + 10 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 368, + 12 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 387, + 13 + ], + [ + 59, + 1 + ], + [ + 377, + 2 + ], + [ + 338, + 4 + ], + [ + 377, + 1 + ], + [ + 311, + 3 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ] + ] +} diff --git a/src/parser/xhpast/__tests__/data/php-tags.php.test b/src/parser/xhpast/__tests__/data/php-tags.php.test new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-tags.php.test @@ -0,0 +1,215 @@ + + + +
    + +~~~~~~~~~~ +pass, comment="Omits ASP tags since parser support is off as built." +~~~~~~~~~~ +{ + "tree": [ + 9000, + 0, + 21, + [ + [ + 9006, + 0, + 21, + [ + [ + 9007, + 0, + 0 + ], + [ + 9004, + 2, + 3, + [ + [ + 9086, + 2, + 2 + ] + ] + ], + [ + 9004, + 5, + 5, + [ + [ + 9005 + ] + ] + ], + [ + 9007, + 6, + 6 + ], + [ + 9004, + 8, + 9, + [ + [ + 9086, + 8, + 8 + ] + ] + ], + [ + 9004, + 11, + 11, + [ + [ + 9005 + ] + ] + ], + [ + 9007, + 12, + 12 + ], + [ + 9004, + 14, + 15, + [ + [ + 9086, + 14, + 14 + ] + ] + ], + [ + 9004, + 17, + 17, + [ + [ + 9005 + ] + ] + ], + [ + 9034, + 18, + 18 + ], + [ + 9034, + 19, + 19 + ], + [ + 9034, + 20, + 20 + ], + [ + 9034, + 21, + 21 + ] + ] + ] + ] + ], + "stream": [ + [ + 373, + 5 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 376, + 3 + ], + [ + 373, + 2 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 376, + 3 + ], + [ + 374, + 3 + ], + [ + 377, + 1 + ], + [ + 309, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 376, + 3 + ], + [ + 315, + 1 + ], + [ + 315, + 5 + ], + [ + 315, + 1 + ], + [ + 315, + 5 + ] + ] +} diff --git a/src/parser/xhpast/__tests__/data/php-traits.php.test b/src/parser/xhpast/__tests__/data/php-traits.php.test new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-traits.php.test @@ -0,0 +1,938 @@ + $z; + + $data = (yield $a); + $data = (yield $b => $c); +} +~~~~~~~~~~ +pass +~~~~~~~~~~ +{ + "tree": [ + 9000, + 0, + 54, + [ + [ + 9006, + 0, + 53, + [ + [ + 9007, + 0, + 0 + ], + [ + 9004, + 2, + 53, + [ + [ + 9050, + 2, + 53, + [ + [ + 9005 + ], + [ + 9005 + ], + [ + 9013, + 4, + 4 + ], + [ + 9059, + 5, + 6 + ], + [ + 9005 + ], + [ + 9005 + ], + [ + 9006, + 8, + 53, + [ + [ + 9004, + 10, + 11, + [ + [ + 9112, + 10, + 10, + [ + [ + 9005 + ], + [ + 9005 + ] + ] + ] + ] + ], + [ + 9004, + 13, + 16, + [ + [ + 9112, + 13, + 15, + [ + [ + 9047, + 15, + 15, + [ + [ + 9005 + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 18, + 25, + [ + [ + 9112, + 18, + 24, + [ + [ + 9047, + 20, + 20 + ], + [ + 9047, + 24, + 24 + ] + ] + ] + ] + ], + [ + 9004, + 27, + 36, + [ + [ + 9077, + 27, + 35, + [ + [ + 9047, + 27, + 27 + ], + [ + 9081, + 29, + 29 + ], + [ + 9112, + 31, + 35, + [ + [ + 9047, + 34, + 34, + [ + [ + 9005 + ] + ] + ] + ] + ] + ] + ] + ] + ], + [ + 9004, + 38, + 51, + [ + [ + 9077, + 38, + 50, + [ + [ + 9047, + 38, + 38 + ], + [ + 9081, + 40, + 40 + ], + [ + 9112, + 42, + 50, + [ + [ + 9047, + 45, + 45 + ], + [ + 9047, + 49, + 49 + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ] + ], + "stream": [ + [ + 373, + 5 + ], + [ + 377, + 2 + ], + [ + 339, + 8 + ], + [ + 377, + 1 + ], + [ + 311, + 1 + ], + [ + 40, + 1 + ], + [ + 41, + 1 + ], + [ + 377, + 1 + ], + [ + 123, + 1 + ], + [ + 377, + 3 + ], + [ + 394, + 5 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 394, + 5 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 394, + 5 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 363, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 59, + 1 + ], + [ + 377, + 4 + ], + [ + 313, + 5 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 394, + 5 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 3 + ], + [ + 313, + 5 + ], + [ + 377, + 1 + ], + [ + 61, + 1 + ], + [ + 377, + 1 + ], + [ + 40, + 1 + ], + [ + 394, + 5 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 377, + 1 + ], + [ + 363, + 2 + ], + [ + 377, + 1 + ], + [ + 313, + 2 + ], + [ + 41, + 1 + ], + [ + 59, + 1 + ], + [ + 377, + 1 + ], + [ + 125, + 1 + ], + [ + 377, + 1 + ] + ] +} diff --git a/src/parser/xhpast/__tests__/data/return-type.php.test b/src/parser/xhpast/__tests__/data/return-type.php.test new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/return-type.php.test @@ -0,0 +1,2197 @@ + $right; +} else if ($node instanceof Node\Expr\BinaryOp\GreaterOrEqual) { + return $left >= $right; +} else if ($node instanceof Node\Expr\BinaryOp\Identical) { + return $left === $right; +} else if ($node instanceof Node\Expr\BinaryOp\LogicalAnd) { + return $left && $right; +} else if ($node instanceof Node\Expr\BinaryOp\LogicalOr) { + return $left || $right; +} else if ($node instanceof Node\Expr\BinaryOp\LogicalXor) { + return $left xor $right; +} else if ($node instanceof Node\Expr\BinaryOp\Minus) { + return $left - $right; +} else if ($node instanceof Node\Expr\BinaryOp\Mod) { + return $left % $right; +} else if ($node instanceof Node\Expr\BinaryOp\Mul) { + return $left * $right; +} else if ($node instanceof Node\Expr\BinaryOp\NotEqual) { + return $left != $right; +} else if ($node instanceof Node\Expr\BinaryOp\NotIdentical) { + return $left !== $right; +} else if ($node instanceof Node\Expr\BinaryOp\Plus) { + return $left + $right; +} else if ($node instanceof Node\Expr\BinaryOp\Pow) { + return pow($left, $right); +} else if ($node instanceof Node\Expr\BinaryOp\ShiftLeft) { + return $left << $right; +} else if ($node instanceof Node\Expr\BinaryOp\ShiftRight) { + return $left >> $right; +} else if ($node instanceof Node\Expr\BinaryOp\Smaller) { + return $left < $right; +} else if ($node instanceof Node\Expr\BinaryOp\SmallerOrEqual) { + return $left <= $right; +} else if ($node instanceof Node\Expr\BinaryOp\Spaceship) { + if ($left < $right) { + return -1; + } else if ($left == $right) { + return 0; + } else { + return 1; + } +} +~~~~~~~~~~ +pass diff --git a/src/parser/xhpast/api/XHPASTNode.php b/src/parser/xhpast/api/XHPASTNode.php new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/api/XHPASTNode.php @@ -0,0 +1,301 @@ +getTypeName(), array( + 'n_STRING_SCALAR', + 'n_NUMERIC_SCALAR', + )); + } + + public function getDocblockToken() { + if ($this->l == -1) { + return null; + } + $tokens = $this->tree->getRawTokenStream(); + + for ($ii = $this->l - 1; $ii >= 0; $ii--) { + if ($tokens[$ii]->getTypeName() == 'T_DOC_COMMENT') { + return $tokens[$ii]; + } + if (!$tokens[$ii]->isAnyWhitespace()) { + return null; + } + } + + return null; + } + + public function evalStatic() { + switch ($this->getTypeName()) { + case 'n_STATEMENT': + return $this->getChildByIndex(0)->evalStatic(); + break; + case 'n_STRING_SCALAR': + return (string)$this->getStringLiteralValue(); + case 'n_NUMERIC_SCALAR': + $value = $this->getSemanticString(); + if (preg_match('/^0x/i', $value)) { + // Hex + $value = base_convert(substr($value, 2), 16, 10); + } else if (preg_match('/^0\d+$/i', $value)) { + // Octal + $value = base_convert(substr($value, 1), 8, 10); + } + return +$value; + case 'n_SYMBOL_NAME': + $value = $this->getSemanticString(); + if ($value == 'INF') { + return INF; + } + switch (strtolower($value)) { + case 'true': + return true; + case 'false': + return false; + case 'null': + return null; + default: + throw new Exception(pht('Unrecognized symbol name.')); + } + break; + case 'n_UNARY_PREFIX_EXPRESSION': + $operator = $this->getChildOfType(0, 'n_OPERATOR'); + $operand = $this->getChildByIndex(1); + switch ($operator->getSemanticString()) { + case '-': + return -$operand->evalStatic(); + break; + case '+': + return $operand->evalStatic(); + break; + default: + throw new Exception( + pht('Unexpected operator in static expression.')); + } + break; + case 'n_ARRAY_LITERAL': + $result = array(); + $values = $this->getChildOfType(0, 'n_ARRAY_VALUE_LIST'); + foreach ($values->getChildren() as $child) { + $key = $child->getChildByIndex(0); + $val = $child->getChildByIndex(1); + if ($key->getTypeName() == 'n_EMPTY') { + $result[] = $val->evalStatic(); + } else { + $result[$key->evalStatic()] = $val->evalStatic(); + } + } + return $result; + case 'n_CONCATENATION_LIST': + $result = ''; + foreach ($this->getChildren() as $child) { + if ($child->getTypeName() == 'n_OPERATOR') { + continue; + } + $result .= $child->evalStatic(); + } + return $result; + default: + throw new Exception( + pht( + 'Unexpected node during static evaluation, of type: %s', + $this->getTypeName())); + } + } + + public function isConstantString() { + return $this->checkIsConstantString(); + } + + public function isConstantStringWithMagicConstants() { + return $this->checkIsConstantString(array('n_MAGIC_SCALAR')); + } + + private function checkIsConstantString(array $additional_types = array()) { + switch ($this->getTypeName()) { + case 'n_HEREDOC': + case 'n_STRING_SCALAR': + return !$this->getStringVariables(); + + case 'n_CONCATENATION_LIST': + foreach ($this->getChildren() as $child) { + if ($child->getTypeName() == 'n_OPERATOR') { + continue; + } + if (!$child->checkIsConstantString($additional_types)) { + return false; + } + } + return true; + + default: + if (in_array($this->getTypeName(), $additional_types)) { + return true; + } + + return false; + } + } + + public function getStringVariables() { + $value = $this->getConcreteString(); + + switch ($this->getTypeName()) { + case 'n_HEREDOC': + if (preg_match("/^<<<\s*'/", $value)) { // Nowdoc: <<<'EOT' + return array(); + } + break; + + case 'n_STRING_SCALAR': + if ($value[0] == "'") { + return array(); + } + break; + + default: + throw new Exception(pht('Unexpected type %s.', $this->getTypeName())); + } + + // We extract just the variable names and ignore properties and array keys. + $re = '/\\\\.|(\$|\{\$|\${)([a-z_\x7F-\xFF][a-z0-9_\x7F-\xFF]*)/i'; + $matches = null; + preg_match_all($re, $value, $matches, PREG_OFFSET_CAPTURE); + return ipull(array_filter($matches[2]), 0, 1); + } + + public function getStringLiteralValue() { + if ($this->getTypeName() != 'n_STRING_SCALAR') { + return null; + } + + $value = $this->getSemanticString(); + $type = $value[0]; + $value = preg_replace('/^b?[\'"]|[\'"]$/i', '', $value); + $esc = false; + $len = strlen($value); + $out = ''; + + if ($type == "'") { + // Single quoted strings treat everything as a literal except "\\" and + // "\'". + return str_replace( + array('\\\\', '\\\''), + array('\\', "'"), + $value); + } + + // Double quoted strings treat "\X" as a literal if X isn't specifically + // a character which needs to be escaped -- e.g., "\q" and "\'" are + // literally "\q" and "\'". stripcslashes() is too aggressive, so find + // all these under-escaped backslashes and escape them. + + for ($ii = 0; $ii < $len; $ii++) { + $c = $value[$ii]; + if ($esc) { + $esc = false; + switch ($c) { + case 'x': + $u = isset($value[$ii + 1]) ? $value[$ii + 1] : null; + if (!preg_match('/^[a-f0-9]/i', $u)) { + // PHP treats \x followed by anything which is not a hex digit + // as a literal \x. + $out .= '\\\\'.$c; + break; + } + /* fallthrough */ + case 'n': + case 'r': + case 'f': + case 'v': + case '"': + case '$': + case 't': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + $out .= '\\'.$c; + break; + case 'e': + // Since PHP 5.4.0, this means "esc". However, stripcslashes() does + // not perform this conversion. + $out .= chr(27); + break; + default: + $out .= '\\\\'.$c; + break; + } + } else if ($c == '\\') { + $esc = true; + } else { + $out .= $c; + } + } + + return stripcslashes($out); + } + + /** + * Determines the parent namespace for a node. + * + * Traverses the AST upwards from a given node in order to determine the + * namespace in which the node is declared. + * + * To prevent any possible ambiguity, the returned namespace will always be + * prefixed with the namespace separator. + * + * @param XHPASTNode The input node. + * @return string|null The namespace which contains the input node, or + * `null` if no such node exists. + */ + public function getNamespace() { + $namespaces = $this + ->getTree() + ->getRootNode() + ->selectDescendantsOfType('n_NAMESPACE') + ->getRawNodes(); + + foreach (array_reverse($namespaces) as $namespace) { + if ($namespace->isAfter($this)) { + continue; + } + + $body = $namespace->getChildByIndex(1); + if ($body->getTypeName() != 'n_EMPTY') { + if (!$body->containsDescendant($this)) { + continue; + } + } + + return $namespace->getNamespaceName(); + } + + return null; + } + + /** + * Returns the namespace name from a node of type `n_NAMESPACE`. + * + * @return string|null + */ + private function getNamespaceName() { + if ($this->getTypeName() != 'n_NAMESPACE') { + return null; + } + + $namespace_name = $this->getChildByIndex(0); + if ($namespace_name->getTypeName() == 'n_EMPTY') { + return null; + } + + return '\\'.$namespace_name->getConcreteString(); + } + +} diff --git a/src/parser/xhpast/api/XHPASTSyntaxErrorException.php b/src/parser/xhpast/api/XHPASTSyntaxErrorException.php new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/api/XHPASTSyntaxErrorException.php @@ -0,0 +1,16 @@ +errorLine = $line; + parent::__construct($message); + } + + public function getErrorLine() { + return $this->errorLine; + } + +} diff --git a/src/parser/xhpast/api/XHPASTToken.php b/src/parser/xhpast/api/XHPASTToken.php new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/api/XHPASTToken.php @@ -0,0 +1,39 @@ +typeName)) { + $type_id = $this->typeID; + if ($type_id <= 255) { + $this->typeName = chr($type_id); + } + $this->typeName = parent::getTypeName(); + } + return $this->typeName; + } + + public function isComment() { + static $type_ids = null; + if ($type_ids === null) { + $type_ids = array( + $this->tree->getTokenTypeIDFromTypeName('T_COMMENT') => true, + $this->tree->getTokenTypeIDFromTypeName('T_DOC_COMMENT') => true, + ); + } + + return isset($type_ids[$this->typeID]); + } + + public function isAnyWhitespace() { + static $type_ids = null; + if ($type_ids === null) { + $type_ids = array( + $this->tree->getTokenTypeIDFromTypeName('T_WHITESPACE') => true, + ); + } + + return isset($type_ids[$this->typeID]); + } + +} diff --git a/src/parser/xhpast/api/XHPASTTree.php b/src/parser/xhpast/api/XHPASTTree.php new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/api/XHPASTTree.php @@ -0,0 +1,78 @@ +setTreeType('XHP'); + $this->setNodeConstants(xhp_parser_node_constants()); + $this->setTokenConstants(xhpast_parser_token_constants()); + + parent::__construct($tree, $stream, $source); + } + + public function newNode($id, array $data, AASTTree $tree) { + return new XHPASTNode($id, $data, $tree); + } + + public function newToken($id, $type, $value, $offset, AASTTree $tree) { + return new XHPASTToken($id, $type, $value, $offset, $tree); + } + + public static function newFromData($php_source) { + $future = PhutilXHPASTBinary::getParserFuture($php_source); + return self::newFromDataAndResolvedExecFuture( + $php_source, + $future->resolve()); + } + + public static function newStatementFromString($string) { + $string = 'getRootNode()->selectDescendantsOfType('n_STATEMENT'); + if (count($statements) != 1) { + throw new Exception( + pht('String does not parse into exactly one statement!')); + } + // Return the first one, trying to use reset() with iterators ends in tears. + foreach ($statements as $statement) { + return $statement; + } + } + + public static function newFromDataAndResolvedExecFuture( + $php_source, + array $resolved) { + + list($err, $stdout, $stderr) = $resolved; + if ($err) { + if ($err == 1) { + $matches = null; + $is_syntax = preg_match( + '/^XHPAST Parse Error: (.*) on line (\d+)/s', + $stderr, + $matches); + if ($is_syntax) { + throw new XHPASTSyntaxErrorException($matches[2], trim($stderr)); + } + } + throw new Exception( + pht( + '%s failed to parse file data %d: %s', + 'XHPAST', + $err, + $stderr)); + } + + $data = null; + try { + $data = phutil_json_decode($stdout); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht('%s: failed to decode tree.', 'XHPAST'), + $ex); + } + + return new XHPASTTree($data['tree'], $data['stream'], $php_source); + } + +} diff --git a/src/parser/xhpast/api/__tests__/XHPASTNodeTestCase.php b/src/parser/xhpast/api/__tests__/XHPASTNodeTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/api/__tests__/XHPASTNodeTestCase.php @@ -0,0 +1,101 @@ +assertStringVariables(array(), '""'); + $this->assertStringVariables(array(2 => 'abc'), '"$abc"'); + $this->assertStringVariables(array(), '"\$abc"'); + $this->assertStringVariables(array(2 => 'a'), '"$a[1]"'); + $this->assertStringVariables(array(3 => 'a'), '"{$a[1]}"'); + $this->assertStringVariables(array(2 => 'a', 5 => 'a'), '"$a $a"'); + + $this->assertStringVariables(array(), "''"); + $this->assertStringVariables(array(), "'\$a'"); + + $this->assertStringVariables(array(), "<<assertStringVariables(array(8 => 'a'), "<<assertStringVariables(array(), "<<<'EOT'\n\$a\nEOT"); + } + + private function assertStringVariables($expected, $string) { + $statement = XHPASTTree::newStatementFromString($string); + $this->assertEqual( + $expected, + $statement->getChildByIndex(0)->getStringVariables(), + $string); + } + + public function testGetNamespace() { + $dir = dirname(__FILE__).'/namespace/'; + $files = id(new FileFinder($dir)) + ->withType('f') + ->withSuffix('php.test') + ->find(); + + foreach ($files as $file) { + list($tree, $expect) = $this->readTestData($dir.'/'.$file); + + $root = $tree->getRootNode(); + $classes = $root->selectDescendantsOfType('n_CLASS_DECLARATION'); + + foreach ($classes as $class) { + $id = (string)$class->getID(); + + if (idx($expect, $id, false) === false) { + throw new Exception( + pht( + 'No expected value for node %d in file "%s".', + $class->getID(), + $file)); + } + + $this->assertEqual( + $expect[$id], + $class->getNamespace()); + } + } + } + + /** + * Reads and parses test data from a specified file. + * + * This method reads and parses test data from a file. The file is expected + * to have the following structure + * + * ``` + * The first element of the pair is the + * `XHPASTTree` contained within the test file. + * The second element of the pair is the + * "expect" data. + */ + private function readTestData($file) { + $contents = Filesystem::readFile($file); + $contents = preg_split('/^~{10}$/m', $contents); + + if (count($contents) < 2) { + throw new Exception( + pht( + "Expected '%s' separating test case and results.", + '~~~~~~~~~~')); + } + + list($data, $expect) = $contents; + + $tree = XHPASTTree::newFromData($data); + $expect = phutil_json_decode($expect); + + return array($tree, $expect); + } + +} diff --git a/src/parser/xhpast/api/__tests__/XHPASTTreeTestCase.php b/src/parser/xhpast/api/__tests__/XHPASTTreeTestCase.php new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/api/__tests__/XHPASTTreeTestCase.php @@ -0,0 +1,140 @@ +assertEval(1, '1'); + $this->assertEval('a', '"a"'); + $this->assertEval(-1.1, '-1.1'); + $this->assertEval( + array('foo', 'bar', -1, +2, -3.4, +4.3, 1e10, 1e-5, -2.3e7), + "array('foo', 'bar', -1, +2, -3.4, +4.3, 1e10, 1e-5, -2.3e7)"); + $this->assertEval( + array(), + 'array()'); + $this->assertEval( + array(42 => 7, 'a' => 5, 1, 2, 3, 4, 1 => 'goo'), + "array(42 => 7, 'a' => 5, 1, 2, 3, 4, 1 => 'goo')"); + $this->assertEval( + array('a' => 'a', 'b' => array(1, 2, array(3))), + "array('a' => 'a', 'b' => array(1, 2, array(3)))"); + $this->assertEval( + array(true, false, null), + 'array(true, false, null)'); + + // Duplicate keys + $this->assertEval( + array(0 => '1', 0 => '2'), + "array(0 => '1', 0 => '2')"); + + $this->assertEval('simple string', "'simple string'"); + $this->assertEval('42', "'42'"); + $this->assertEval('binary string', "b'binary string'"); + $this->assertEval(3.1415926, '3.1415926'); + $this->assertEval(42, '42'); + $this->assertEval( + array(2147483648, 2147483647, -2147483648, -2147483647), + 'array(2147483648, 2147483647, -2147483648, -2147483647)'); + + $this->assertEval(INF, 'INF'); + $this->assertEval(-INF, '-INF'); + + $this->assertEval(0x1b, '0x1b'); + $this->assertEval(0X0A, '0X0A'); + + // Octal + $this->assertEval(010, '010'); + // TODO: this passes on < PHP 7 for some reason but fails on PHP 7 correctly + //$this->assertEval(080, '080'); // Invalid! + + // Leading 0, but float, not octal. + $this->assertEval(0.11e1, '0.11e1'); + $this->assertEval(0e1, '0e1'); + + $this->assertEval(0, '0'); + + // Static evaluation treats '$' as a literal dollar glyph. + $this->assertEval('$asdf', '"$asdf"'); + + $this->assertEval( + '\a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z'. + '\1\2\3\4\5\6\7\8\9\0'. + '\!\@\#\$\%\^\&\*\(\)'. + '\`\~\\\|\[\]\{\}\<\>\,\.\/\?\:\;\-\_\=\+', + + "'\\a\\b\\c\\d\\e\\f\\g\\h\\i\\j\\k\\l\\m\\n\\o\\p\\q". + "\\r\\s\\t\\u\\v\\w\\x\\y\\z". + "\\1\\2\\3\\4\\5\\6\\7\\8\\9\\0". + "\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)". + "\\`\\~\\\\\\|\\[\\]\\{\\}\\<\\>\\,\\.\\/\\?\\:\\;\\-\\_\\=\\+". + "'"); + + // After PHP 5.4.0, "\e" means "escape", not "backslash e". We implement the + // newer rules, but if we're running in an older version of PHP we can not + // express them with "\e". + $this->assertEval(chr(27), '"\\e"'); + + $this->assertEval( + "\a\b\c\d\x1B\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z". + "\1\2\3\4\5\6\7\8\9\0". + "\!\@\#\$\%\^\&\*\(\)". + "\`\~\\\|\[\]\{\}\<\>\,\.\/\?\:\;\-\_\=\+", + + '"\\a\\b\\c\\d\\e\\f\\g\\h\\i\\j\\k\\l\\m\\n\\o\\p\\q'. + '\\r\\s\\t\\u\\v\\w\\x\\y\\z'. + '\\1\\2\\3\\4\\5\\6\\7\\8\\9\\0'. + '\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)'. + '\\`\\~\\\\\\|\\[\\]\\{\\}\\<\\>\\,\\.\\/\\?\\:\\;\\-\\_\\=\\+"'); + + $this->assertEval( + '\' "', + "'\\' \"'"); + + $this->assertEval( + '\\ \\\\ ', + '\'\\\\ \\\\\\\\ \''); + + $this->assertEval( + '\ \\ ', + "'\\ \\\\ '"); + + $this->assertEval( + '\x92', + '\'\x92\''); + + $this->assertEval( + "\x92", + '"\x92"'); + + $this->assertEval( + "\x", + '"\x"'); + + $this->assertEval( + "\x1", + '"\x1"'); + + $this->assertEval( + "\x000 !", + '"\x000 !"'); + + $this->assertEval( + "\x0", + '"\x0"'); + + $this->assertEval( + "\xg", + '"\xg"'); + } + + private function assertEval($value, $string) { + $this->assertEqual( + $value, + XHPASTTree::newStatementFromString($string)->evalStatic(), + $string); + } + +} diff --git a/src/parser/xhpast/api/__tests__/namespace/braces.lint-test b/src/parser/xhpast/api/__tests__/namespace/braces.lint-test new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/api/__tests__/namespace/braces.lint-test @@ -0,0 +1,18 @@ +write($data); + + return $future; + } + + /** + * Returns the path to the XHPAST binary. + * + * @return string + */ + public static function getPath() { + if (phutil_is_windows()) { + return dirname(__FILE__).'\\xhpast.exe'; + } + return dirname(__FILE__).'/xhpast'; + } + + /** + * Returns the XHPAST version. + * + * @return string + */ + public static function getVersion() { + if (self::$version === null) { + $bin = self::getPath(); + + if (Filesystem::pathExists($bin)) { + list($err, $stdout) = exec_manual('%s --version', $bin); + if (!$err) { + self::$version = trim($stdout); + } + } + } + + return self::$version; + } + + /** + * Checks if XHPAST is built and up-to-date. + * + * @return bool + */ + public static function isAvailable() { + return self::getVersion() == self::EXPECTED_VERSION; + } + +} diff --git a/src/parser/xhpast/parser_nodes.php b/src/parser/xhpast/parser_nodes.php new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/parser_nodes.php @@ -0,0 +1,127 @@ + 'n_PROGRAM', + 9001 => 'n_SYMBOL_NAME', + 9002 => 'n_HALT_COMPILER', + 9003 => 'n_NAMESPACE', + 9004 => 'n_STATEMENT', + 9005 => 'n_EMPTY', + 9006 => 'n_STATEMENT_LIST', + 9007 => 'n_OPEN_TAG', + 9008 => 'n_CLOSE_TAG', + 9009 => 'n_USE_LIST', + 9010 => 'n_USE', + 9011 => 'n_CONSTANT_DECLARATION_LIST', + 9012 => 'n_CONSTANT_DECLARATION', + 9013 => 'n_STRING', + 9014 => 'n_LABEL', + 9015 => 'n_CONDITION_LIST', + 9016 => 'n_CONTROL_CONDITION', + 9017 => 'n_IF', + 9018 => 'n_ELSEIF', + 9019 => 'n_ELSE', + 9020 => 'n_WHILE', + 9021 => 'n_DO_WHILE', + 9022 => 'n_FOR', + 9023 => 'n_FOR_EXPRESSION', + 9024 => 'n_SWITCH', + 9025 => 'n_BREAK', + 9026 => 'n_CONTINUE', + 9027 => 'n_RETURN', + 9028 => 'n_GLOBAL_DECLARATION_LIST', + 9029 => 'n_GLOBAL_DECLARATION', + 9030 => 'n_STATIC_DECLARATION_LIST', + 9031 => 'n_STATIC_DECLARATION', + 9032 => 'n_ECHO_LIST', + 9033 => 'n_ECHO', + 9034 => 'n_INLINE_HTML', + 9035 => 'n_UNSET_LIST', + 9036 => 'n_UNSET', + 9037 => 'n_FOREACH', + 9038 => 'n_FOREACH_EXPRESSION', + 9039 => 'n_THROW', + 9040 => 'n_GOTO', + 9041 => 'n_TRY', + 9042 => 'n_CATCH_LIST', + 9043 => 'n_CATCH', + 9044 => 'n_DECLARE', + 9045 => 'n_DECLARE_DECLARATION_LIST', + 9046 => 'n_DECLARE_DECLARATION', + 9047 => 'n_VARIABLE', + 9048 => 'n_REFERENCE', + 9049 => 'n_VARIABLE_REFERENCE', + 9050 => 'n_FUNCTION_DECLARATION', + 9051 => 'n_CLASS_DECLARATION', + 9052 => 'n_CLASS_ATTRIBUTES', + 9053 => 'n_EXTENDS', + 9054 => 'n_EXTENDS_LIST', + 9055 => 'n_IMPLEMENTS_LIST', + 9056 => 'n_INTERFACE_DECLARATION', + 9057 => 'n_CASE', + 9058 => 'n_DEFAULT', + 9059 => 'n_DECLARATION_PARAMETER_LIST', + 9060 => 'n_DECLARATION_PARAMETER', + 9061 => 'n_TYPE_NAME', + 9062 => 'n_VARIABLE_VARIABLE', + 9063 => 'n_CLASS_MEMBER_DECLARATION_LIST', + 9064 => 'n_CLASS_MEMBER_DECLARATION', + 9065 => 'n_CLASS_CONSTANT_DECLARATION_LIST', + 9066 => 'n_CLASS_CONSTANT_DECLARATION', + 9067 => 'n_METHOD_DECLARATION', + 9068 => 'n_METHOD_MODIFIER_LIST', + 9069 => 'n_FUNCTION_MODIFIER_LIST', + 9070 => 'n_CLASS_MEMBER_MODIFIER_LIST', + 9071 => 'n_EXPRESSION_LIST', + 9072 => 'n_LIST', + 9073 => 'n_ASSIGNMENT', + 9074 => 'n_NEW', + 9075 => 'n_UNARY_PREFIX_EXPRESSION', + 9076 => 'n_UNARY_POSTFIX_EXPRESSION', + 9077 => 'n_BINARY_EXPRESSION', + 9078 => 'n_TERNARY_EXPRESSION', + 9079 => 'n_CAST_EXPRESSION', + 9080 => 'n_CAST', + 9081 => 'n_OPERATOR', + 9082 => 'n_ARRAY_LITERAL', + 9083 => 'n_EXIT_EXPRESSION', + 9084 => 'n_BACKTICKS_EXPRESSION', + 9085 => 'n_LEXICAL_VARIABLE_LIST', + 9086 => 'n_NUMERIC_SCALAR', + 9087 => 'n_STRING_SCALAR', + 9088 => 'n_MAGIC_SCALAR', + 9089 => 'n_CLASS_STATIC_ACCESS', + 9090 => 'n_CLASS_NAME', + 9091 => 'n_MAGIC_CLASS_KEYWORD', + 9092 => 'n_OBJECT_PROPERTY_ACCESS', + 9093 => 'n_ARRAY_VALUE_LIST', + 9094 => 'n_ARRAY_VALUE', + 9095 => 'n_CALL_PARAMETER_LIST', + 9096 => 'n_VARIABLE_EXPRESSION', + 9097 => 'n_INCLUDE_FILE', + 9098 => 'n_HEREDOC', + 9099 => 'n_FUNCTION_CALL', + 9100 => 'n_INDEX_ACCESS', + 9101 => 'n_ASSIGNMENT_LIST', + 9102 => 'n_METHOD_CALL', + 9103 => 'n_CONCATENATION_LIST', + 9104 => 'n_PARENTHETICAL_EXPRESSION', + 9105 => 'n_TRAIT_USE', + 9106 => 'n_TRAIT_USE_LIST', + 9107 => 'n_TRAIT_ADAPTATION_LIST', + 9108 => 'n_TRAIT_INSTEADOF', + 9109 => 'n_TRAIT_REFERENCE_LIST', + 9110 => 'n_TRAIT_METHOD_REFERENCE', + 9111 => 'n_TRAIT_AS', + 9112 => 'n_YIELD', + 9113 => 'n_FINALLY', + 9114 => 'n_UNPACK', + 9115 => 'n_DECLARATION_RETURN', + 9116 => 'n_NULLABLE_TYPE', + ); +} diff --git a/src/parser/xhpast/parser_tokens.php b/src/parser/xhpast/parser_tokens.php new file mode 100644 --- /dev/null +++ b/src/parser/xhpast/parser_tokens.php @@ -0,0 +1,147 @@ + 'T_INCLUDE', + 259 => 'T_INCLUDE_ONCE', + 260 => 'T_EVAL', + 261 => 'T_REQUIRE', + 262 => 'T_REQUIRE_ONCE', + 263 => 'T_LOGICAL_OR', + 264 => 'T_LOGICAL_XOR', + 265 => 'T_LOGICAL_AND', + 266 => 'T_PRINT', + 267 => 'T_PLUS_EQUAL', + 268 => 'T_MINUS_EQUAL', + 269 => 'T_MUL_EQUAL', + 270 => 'T_DIV_EQUAL', + 271 => 'T_CONCAT_EQUAL', + 272 => 'T_MOD_EQUAL', + 273 => 'T_AND_EQUAL', + 274 => 'T_OR_EQUAL', + 275 => 'T_XOR_EQUAL', + 276 => 'T_SL_EQUAL', + 277 => 'T_SR_EQUAL', + 278 => 'T_COALESCE', + 279 => 'T_BOOLEAN_OR', + 280 => 'T_BOOLEAN_AND', + 281 => 'T_IS_EQUAL', + 282 => 'T_IS_NOT_EQUAL', + 283 => 'T_IS_IDENTICAL', + 284 => 'T_IS_NOT_IDENTICAL', + 285 => 'T_SPACESHIP', + 286 => 'T_IS_SMALLER_OR_EQUAL', + 287 => 'T_IS_GREATER_OR_EQUAL', + 288 => 'T_SL', + 289 => 'T_SR', + 290 => 'T_INSTANCEOF', + 291 => 'T_INC', + 292 => 'T_DEC', + 293 => 'T_INT_CAST', + 294 => 'T_DOUBLE_CAST', + 295 => 'T_STRING_CAST', + 296 => 'T_UNICODE_CAST', + 297 => 'T_BINARY_CAST', + 298 => 'T_ARRAY_CAST', + 299 => 'T_OBJECT_CAST', + 300 => 'T_BOOL_CAST', + 301 => 'T_UNSET_CAST', + 302 => 'T_NEW', + 303 => 'T_CLONE', + 304 => 'T_EXIT', + 305 => 'T_IF', + 306 => 'T_ELSEIF', + 307 => 'T_ELSE', + 308 => 'T_ENDIF', + 309 => 'T_LNUMBER', + 310 => 'T_DNUMBER', + 311 => 'T_STRING', + 312 => 'T_STRING_VARNAME', + 313 => 'T_VARIABLE', + 314 => 'T_NUM_STRING', + 315 => 'T_INLINE_HTML', + 316 => 'T_CHARACTER', + 317 => 'T_BAD_CHARACTER', + 318 => 'T_ENCAPSED_AND_WHITESPACE', + 319 => 'T_CONSTANT_ENCAPSED_STRING', + 320 => 'T_BACKTICKS_EXPR', + 321 => 'T_ECHO', + 322 => 'T_DO', + 323 => 'T_WHILE', + 324 => 'T_ENDWHILE', + 325 => 'T_FOR', + 326 => 'T_ENDFOR', + 327 => 'T_FOREACH', + 328 => 'T_ENDFOREACH', + 329 => 'T_DECLARE', + 330 => 'T_ENDDECLARE', + 331 => 'T_AS', + 332 => 'T_SWITCH', + 333 => 'T_ENDSWITCH', + 334 => 'T_CASE', + 335 => 'T_DEFAULT', + 336 => 'T_BREAK', + 337 => 'T_CONTINUE', + 338 => 'T_GOTO', + 339 => 'T_FUNCTION', + 340 => 'T_CONST', + 341 => 'T_RETURN', + 342 => 'T_TRY', + 343 => 'T_CATCH', + 344 => 'T_THROW', + 345 => 'T_USE', + 346 => 'T_GLOBAL', + 347 => 'T_STATIC', + 348 => 'T_ABSTRACT', + 349 => 'T_FINAL', + 350 => 'T_PRIVATE', + 351 => 'T_PROTECTED', + 352 => 'T_PUBLIC', + 353 => 'T_VAR', + 354 => 'T_UNSET', + 355 => 'T_ISSET', + 356 => 'T_EMPTY', + 357 => 'T_HALT_COMPILER', + 358 => 'T_CLASS', + 359 => 'T_INTERFACE', + 360 => 'T_EXTENDS', + 361 => 'T_IMPLEMENTS', + 362 => 'T_OBJECT_OPERATOR', + 363 => 'T_DOUBLE_ARROW', + 364 => 'T_LIST', + 365 => 'T_ARRAY', + 366 => 'T_CLASS_C', + 367 => 'T_METHOD_C', + 368 => 'T_FUNC_C', + 369 => 'T_LINE', + 370 => 'T_FILE', + 371 => 'T_COMMENT', + 372 => 'T_DOC_COMMENT', + 373 => 'T_OPEN_TAG', + 374 => 'T_OPEN_TAG_WITH_ECHO', + 375 => 'T_OPEN_TAG_FAKE', + 376 => 'T_CLOSE_TAG', + 377 => 'T_WHITESPACE', + 378 => 'T_START_HEREDOC', + 379 => 'T_END_HEREDOC', + 380 => 'T_HEREDOC', + 381 => 'T_DOLLAR_OPEN_CURLY_BRACES', + 382 => 'T_CURLY_OPEN', + 383 => 'T_PAAMAYIM_NEKUDOTAYIM', + 384 => 'T_BINARY_DOUBLE', + 385 => 'T_BINARY_HEREDOC', + 386 => 'T_NAMESPACE', + 387 => 'T_NS_C', + 388 => 'T_DIR', + 389 => 'T_NS_SEPARATOR', + 390 => 'T_INSTEADOF', + 391 => 'T_CALLABLE', + 392 => 'T_TRAIT', + 393 => 'T_TRAIT_C', + 394 => 'T_YIELD', + 395 => 'T_FINALLY', + 396 => 'T_ELLIPSIS', + ); +} diff --git a/src/phage/__tests__/PhageAgentTestCase.php b/src/phage/__tests__/PhageAgentTestCase.php new file mode 100644 --- /dev/null +++ b/src/phage/__tests__/PhageAgentTestCase.php @@ -0,0 +1,49 @@ +runBootloaderTests(new PhagePHPAgentBootloader()); + } + + private function runBootloaderTests(PhageAgentBootloader $boot) { + $name = get_class($boot); + + $exec = new ExecFuture('%C', $boot->getBootCommand()); + $exec->write($boot->getBootSequence(), $keep_open = true); + + $exec_channel = new PhutilExecChannel($exec); + $agent = new PhutilJSONProtocolChannel($exec_channel); + + $agent->write( + array( + 'type' => 'EXEC', + 'key' => 1, + 'command' => 'echo phage', + 'timeout' => null, + )); + + $this->agentExpect( + $agent, + array( + 'type' => 'RSLV', + 'key' => 1, + 'err' => 0, + 'stdout' => "phage\n", + 'stderr' => '', + 'timeout' => false, + ), + pht("'%s' for %s", 'echo phage', $name)); + + $agent->write( + array( + 'type' => 'EXIT', + )); + } + + private function agentExpect(PhutilChannel $agent, $expect, $what) { + $message = $agent->waitForMessage(); + $this->assertEqual($expect, $message, $what); + } + +} diff --git a/src/phage/action/PhageAction.php b/src/phage/action/PhageAction.php new file mode 100644 --- /dev/null +++ b/src/phage/action/PhageAction.php @@ -0,0 +1,49 @@ +requireContainerAction(); + + return $this->actions; + } + + final public function addAction(PhageAction $action) { + $this->requireContainerAction(); + + $this->willAddAction($action); + + $this->actions[] = $action; + } + + protected function getAllWaitingChannels() { + if (!$this->isContainerAction()) { + throw new PhutilMethodNotImplementedException(); + } + + $channels = array(); + foreach ($this->getActions() as $action) { + foreach ($action->getAllWaitingChannels() as $channel) { + $channels[] = $channel; + } + } + + return $channels; + } + + private function requireContainerAction() { + if (!$this->isContainerAction()) { + throw new Exception(pht('This is not a container action.')); + } + } + +} diff --git a/src/phage/action/PhageAgentAction.php b/src/phage/action/PhageAgentAction.php new file mode 100644 --- /dev/null +++ b/src/phage/action/PhageAgentAction.php @@ -0,0 +1,274 @@ +isExiting) { + throw new Exception( + pht( + 'You can not add new actions to an exiting agent.')); + } + + $key = 'command/'.$this->commandKey++; + + $this->commands[$key] = array( + 'key' => $key, + 'command' => $action, + ); + + $this->queued[$key] = $key; + } + + public function isActiveAgent() { + return $this->isActive; + } + + final public function setLimit($limit) { + $this->limit = $limit; + return $this; + } + + final public function getLimit() { + return $this->limit; + } + + final public function setThrottle($throttle) { + $this->throttle = $throttle; + return $this; + } + + final public function getThrottle() { + return $this->throttle; + } + + abstract protected function newAgentFuture(PhutilCommandString $command); + + protected function getAllWaitingChannels() { + $channels = array(); + + if ($this->isActiveAgent()) { + $channels[] = $this->channel; + } + + return $channels; + } + + public function startAgent() { + $bootloader = new PhagePHPAgentBootloader(); + + $future = $this->newAgentFuture($bootloader->getBootCommand()); + + $future->write($bootloader->getBootSequence(), $keep_open = true); + + $channel = new PhutilExecChannel($future); + $channel->setStderrHandler(array($this, 'didReadAgentStderr')); + + $channel = new PhutilJSONProtocolChannel($channel); + + $this->future = $future; + $this->channel = $channel; + $this->isActive = true; + } + + private function updateQueue() { + // If we don't have anything waiting in queue, we have nothing to do. + if (!$this->queued) { + return false; + } + + $now = microtime(true); + + // If we're throttling commands and recently started one, don't start + // another one yet. + $throttle = $this->getThrottle(); + if ($throttle) { + if ($this->waitUntil && ($now < $this->waitUntil)) { + return false; + } + } + + // If we're limiting parallelism and the active list is full, don't + // start anything else yet. + $limit = $this->getLimit(); + if ($limit) { + if (count($this->active) >= $limit) { + return false; + } + } + + // Move a command out of the queue and tell the agent to execute it. + $key = head($this->queued); + unset($this->queued[$key]); + + $this->active[$key] = $key; + $command = $this->commands[$key]['command']; + + $channel = $this->getChannel(); + + $channel->write( + array( + 'type' => 'EXEC', + 'key' => $key, + 'command' => $command->getCommand()->getUnmaskedString(), + 'timeout' => $command->getTimeout(), + )); + + if ($throttle) { + $this->waitUntil = ($now + $throttle); + } + + return true; + } + + private function getChannel() { + return $this->channel; + } + + public function updateAgent() { + if (!$this->isActiveAgent()) { + return; + } + + $channel = $this->channel; + + while (true) { + do { + $did_update = $this->updateQueue(); + } while ($did_update); + + $is_open = $channel->update(); + + $message = $channel->read(); + if ($message !== null) { + switch ($message['type']) { + case 'TEXT': + $key = $message['key']; + $this->writeOutput($key, $message['kind'], $message['text']); + break; + case 'RSLV': + $key = $message['key']; + $command = $this->commands[$key]['command']; + + $this->writeOutput($key, 'stdout', $message['stdout']); + $this->writeOutput($key, 'stderr', $message['stderr']); + + $exit_code = $message['err']; + + $command->setExitCode($exit_code); + $command->setDidTimeout((bool)idx($message, 'timeout')); + + if ($exit_code != 0) { + $exit_code = $this->formatOutput( + pht( + 'Command ("%s") exited nonzero ("%s")!', + $command->getCommand(), + $exit_code), + $command->getLabel()); + + fprintf(STDOUT, '%s', $exit_code); + } + + unset($this->active[$key]); + + if (!$this->active && !$this->queued) { + $channel->write( + array( + 'type' => 'EXIT', + 'key' => 'exit', + )); + + $this->isExiting = true; + break; + } + } + } + + if (!$is_open) { + if ($this->isExiting) { + $this->isActive = false; + break; + } else { + throw new Exception(pht('Channel closed unexpectedly!')); + } + } + + if ($message === null) { + break; + } + } + } + + private function writeOutput($key, $kind, $text) { + if (!strlen($text)) { + return; + } + + switch ($kind) { + case 'stdout': + $target = STDOUT; + break; + case 'stderr': + $target = STDERR; + break; + default: + throw new Exception(pht('Unknown output kind "%s".', $kind)); + } + + $command = $this->commands[$key]['command']; + + $label = $command->getLabel(); + if (!strlen($label)) { + $label = pht('Unknown Command'); + } + + $text = $this->formatOutput($text, $label); + fprintf($target, '%s', $text); + } + + private function formatOutput($output, $context) { + $output = phutil_split_lines($output, false); + foreach ($output as $key => $line) { + $output[$key] = tsprintf("[%s] %R\n", $context, $line); + } + $output = implode('', $output); + + return $output; + } + + public function didReadAgentStderr($channel, $stderr) { + throw new Exception( + pht( + 'Unexpected output on agent stderr: %s.', + $stderr)); + } + +} diff --git a/src/phage/action/PhageExecuteAction.php b/src/phage/action/PhageExecuteAction.php new file mode 100644 --- /dev/null +++ b/src/phage/action/PhageExecuteAction.php @@ -0,0 +1,62 @@ +command = $command; + return $this; + } + + public function getCommand() { + return $this->command; + } + + public function setLabel($label) { + $this->label = $label; + return $this; + } + + public function getLabel() { + return $this->label; + } + + public function setTimeout($timeout) { + $this->timeout = $timeout; + return $this; + } + + public function getTimeout() { + return $this->timeout; + } + + public function setExitCode($exit_code) { + $this->exitCode = $exit_code; + return $this; + } + + public function getExitCode() { + return $this->exitCode; + } + + public function setDidTimeout($did_timeout) { + $this->didTimeout = $did_timeout; + return $this; + } + + public function getDidTimeout() { + return $this->didTimeout; + } + +} diff --git a/src/phage/action/PhageLocalAction.php b/src/phage/action/PhageLocalAction.php new file mode 100644 --- /dev/null +++ b/src/phage/action/PhageLocalAction.php @@ -0,0 +1,10 @@ +getAgents(); + foreach ($agents as $agent) { + $agent->startAgent(); + } + + while (true) { + $channels = $this->getAllWaitingChannels(); + PhutilChannel::waitForAny($channels); + + $agents = $this->getActiveAgents(); + if (!$agents) { + break; + } + + foreach ($agents as $agent) { + $agent->updateAgent(); + } + } + } + + protected function getAgents() { + return $this->getActions(); + } + + protected function getActiveAgents() { + $agents = $this->getAgents(); + + foreach ($agents as $key => $agent) { + if (!$agent->isActiveAgent()) { + unset($agents[$key]); + } + } + + return $agents; + } + + +} diff --git a/src/phage/agent/PhagePHPAgent.php b/src/phage/agent/PhagePHPAgent.php new file mode 100644 --- /dev/null +++ b/src/phage/agent/PhagePHPAgent.php @@ -0,0 +1,145 @@ +stdin = $stdin; + } + + public function execute() { + while (true) { + if ($this->exec) { + $iterator = new FutureIterator($this->exec); + $iterator->setUpdateInterval(0.050); + foreach ($iterator as $key => $future) { + if ($future === null) { + foreach ($this->exec as $read_key => $read_future) { + $this->readFuture($read_key, $read_future); + } + + break; + } else { + $this->resolveFuture($key, $future); + } + } + } else { + PhutilChannel::waitForAny(array($this->getMaster())); + } + + $this->processInput(); + } + } + + private function getMaster() { + if (!$this->master) { + $raw_channel = new PhutilSocketChannel( + $this->stdin, + fopen('php://stdout', 'w')); + + $json_channel = new PhutilJSONProtocolChannel($raw_channel); + $this->master = $json_channel; + } + + return $this->master; + } + + private function processInput() { + $channel = $this->getMaster(); + + $open = $channel->update(); + if (!$open) { + throw new Exception(pht('Channel closed!')); + } + + while (true) { + $command = $channel->read(); + if ($command === null) { + break; + } + $this->processCommand($command); + } + } + + private function processCommand(array $spec) { + switch ($spec['type']) { + case 'EXEC': + $key = $spec['key']; + $cmd = $spec['command']; + + $future = new ExecFuture('%C', $cmd); + + $timeout = $spec['timeout']; + if ($timeout) { + $future->setTimeout(ceil($timeout)); + } + + $future->isReady(); + + $this->exec[$key] = $future; + break; + case 'EXIT': + $this->terminateAgent(); + break; + } + } + + private function readFuture($key, ExecFuture $future) { + $master = $this->getMaster(); + + list($stdout, $stderr) = $future->read(); + $future->discardBuffers(); + + if (strlen($stdout)) { + $master->write( + array( + 'type' => 'TEXT', + 'key' => $key, + 'kind' => 'stdout', + 'text' => $stdout, + )); + } + + if (strlen($stderr)) { + $master->write( + array( + 'type' => 'TEXT', + 'key' => $key, + 'kind' => 'stderr', + 'text' => $stderr, + )); + } + } + + private function resolveFuture($key, ExecFuture $future) { + $result = $future->resolve(); + $master = $this->getMaster(); + + $master->write( + array( + 'type' => 'RSLV', + 'key' => $key, + 'err' => $result[0], + 'stdout' => $result[1], + 'stderr' => $result[2], + 'timeout' => (bool)$future->getWasKilledByTimeout(), + )); + + unset($this->exec[$key]); + } + + public function __destruct() { + $this->terminateAgent(); + } + + private function terminateAgent() { + foreach ($this->exec as $key => $future) { + $future->resolveKill(); + } + exit(0); + } + +} diff --git a/src/phage/bootloader/PhageAgentBootloader.php b/src/phage/bootloader/PhageAgentBootloader.php new file mode 100644 --- /dev/null +++ b/src/phage/bootloader/PhageAgentBootloader.php @@ -0,0 +1,9 @@ +buildBootSequence(); + $len = $this->bootLength; + + // We need to run a command which will bootload a full agent by reading + // and evaluating source code from stdin. This is the smallest bootstrap + // I was able to construct: + // + // - Using `fread(STDIN, ...)` is only good up to 8192 bytes. + // - Using `fread(STDIN, ...)` or various other constructs prevents us + // from opening STDIN later. + // + // Instead, we `fread()` a second-stage bootstrap which has enough code + // to do arbitrary-length reads from stdin. The second-stage bootstrap + // reads and evaluates the main agent program. + + return csprintf( + 'php -r %s', + "eval(fread(\$I=fopen('php://stdin', 'r'), {$len})); /* phage! */"); + } + + public function getBootSequence() { + $boot = $this->buildBootSequence(); + return $boot->toString(); + } + + private function buildBootSequence() { + if (!$this->bootSequence) { + $files = array( + 'utils/utils.php', + 'object/Phobject.php', + 'utils/PhutilRope.php', + 'xsprintf/xsprintf.php', + 'xsprintf/csprintf.php', + 'xsprintf/PhutilCommandString.php', + 'future/Future.php', + 'future/FutureIterator.php', + 'future/exec/PhutilExecutableFuture.php', + 'future/exec/ExecFuture.php', + 'future/exec/CommandException.php', + 'channel/PhutilChannel.php', + 'channel/PhutilSocketChannel.php', + 'channel/PhutilChannelChannel.php', + 'channel/PhutilProtocolChannel.php', + 'channel/PhutilJSONProtocolChannel.php', + 'phage/agent/PhagePHPAgent.php', + ); + + $main_sequence = new PhutilBallOfPHP(); + $root = phutil_get_library_root('phutil'); + foreach ($files as $file) { + $main_sequence->addFile($root.'/'.$file); + } + + // NOTE: If we use id() here, we don't get a stack trace out of it when + // we call a nonexistent method from inside "execute()"? Not exactly sure + // what's going on here, but just sweep it under the rug for now. + + $main_sequence->addText('$A = new PhagePHPAgent($I); $A->execute();'); + $main_length = strlen($main_sequence->toString()); + + $boot_sequence = new PhutilBallOfPHP(); + $boot = ' + $length = '.$main_length.'; + $buffer = ""; + while (strlen($buffer) < $length) { + $data = fread($I, $length - strlen($buffer)); + if (!strlen($data)) { + exit(1); + } + $buffer .= $data; + } + + eval($buffer);'; + $boot_sequence->addText($boot); + $boot_length = strlen($boot_sequence->toString()); + $boot_sequence->addText($main_sequence->toString()); + + if (strlen($boot_length) > 8192) { + throw new Exception(pht('Stage 1 bootloader is too large!')); + } + + $this->bootSequence = $boot_sequence; + $this->bootLength = $boot_length; + $this->mainLength = $main_length; + } + + return $this->bootSequence; + } + +} diff --git a/src/phage/util/PhutilBallOfPHP.php b/src/phage/util/PhutilBallOfPHP.php new file mode 100644 --- /dev/null +++ b/src/phage/util/PhutilBallOfPHP.php @@ -0,0 +1,32 @@ +parts[] = substr($data, 6); + return $this; + } + + public function addText($text) { + $this->parts[] = $text; + } + + public function toString() { + return implode('', $this->parts); + } + +} diff --git a/src/readableserializer/PhutilReadableSerializer.php b/src/readableserializer/PhutilReadableSerializer.php new file mode 100644 --- /dev/null +++ b/src/readableserializer/PhutilReadableSerializer.php @@ -0,0 +1,189 @@ + 1) { + $str .= 'of size '.count($value).' starting with: '; + } + reset($value); // Prevent key() from giving warning message in HPHP. + $str .= '{ '.self::printShort(key($value)).' => '. + self::printShort(head($value)).' }'; + } + return $str; + } else { + // NOTE: Avoid PhutilUTF8StringTruncator here since the data may not be + // UTF8 anyway, it's slow for large inputs, and it might not be loaded + // yet. + $limit = 1024; + $str = self::printableValue($value); + if (strlen($str) > $limit) { + if (is_string($value)) { + $str = "'".substr($str, 1, $limit)."...'"; + } else { + $str = substr($str, 0, $limit).'...'; + } + } + + return $str; + } + } + + + /** + * Dump some debug output about an object's members without the + * potential recursive explosion of verbosity that comes with `print_r()`. + * + * To print any number of member variables, pass null for `$max_members`. + * + * @param wild Any value. + * @param int Maximum depth to print for nested arrays and objects. + * @param int Maximum number of values to print at each level. + * @return string Human-readable shallow representation of the value. + * @task print + */ + public static function printShallow( + $value, + $max_depth = 2, + $max_members = 25) { + + return self::printShallowRecursive($value, $max_depth, $max_members, 0, ''); + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * Implementation for @{method:printShallow}. + * + * @param wild Any value. + * @param int Maximum depth to print for nested arrays and objects. + * @param int Maximum number of values to print at each level. + * @param int Current depth. + * @param string Indentation string. + * @return string Human-readable shallow representation of the value. + * @task internal + */ + private static function printShallowRecursive( + $value, + $max_depth, + $max_members, + $depth, + $indent) { + + if (!is_object($value) && !is_array($value)) { + return self::addIndentation(self::printableValue($value), $indent, 1); + } + + $ret = ''; + if (is_object($value)) { + $ret = get_class($value)."\nwith members "; + $value = array_filter(@(array)$value); + + // Remove null characters that magically appear around keys for + // member variables of parent classes. + $transformed = array(); + foreach ($value as $key => $x) { + $transformed[str_replace("\0", ' ', $key)] = $x; + } + $value = $transformed; + } + + if ($max_members !== null) { + $value = array_slice($value, 0, $max_members, $preserve_keys = true); + } + + $shallow = array(); + if ($depth < $max_depth) { + foreach ($value as $k => $v) { + $shallow[$k] = self::printShallowRecursive( + $v, + $max_depth, + $max_members, + $depth + 1, + ' '); + } + } else { + foreach ($value as $k => $v) { + // Extra indentation is for empty arrays, because they wrap on multiple + // lines and lookup stupid without the extra indentation + $shallow[$k] = self::addIndentation(self::printShort($v), $indent, 1); + } + } + + return self::addIndentation($ret.print_r($shallow, true), $indent, 1); + } + + + /** + * Adds indentation to the beginning of every line starting from + * `$first_line`. + * + * @param string Printed value. + * @param string String to indent with. + * @param int Index of first line to indent. + * @return string + * @task internal + */ + private static function addIndentation($value, $indent, $first_line) { + $lines = explode("\n", $value); + $out = array(); + foreach ($lines as $index => $line) { + $out[] = $index >= $first_line ? $indent.$line : $line; + } + + return implode("\n", $out); + } + +} diff --git a/src/readableserializer/__tests__/PhutilReadableSerializerTestCase.php b/src/readableserializer/__tests__/PhutilReadableSerializerTestCase.php new file mode 100644 --- /dev/null +++ b/src/readableserializer/__tests__/PhutilReadableSerializerTestCase.php @@ -0,0 +1,23 @@ +assertEqual( + $expect, + PhutilReadableSerializer::printableValue($value)); + } + } + +} diff --git a/src/search/PhutilSearchQueryCompiler.php b/src/search/PhutilSearchQueryCompiler.php new file mode 100644 --- /dev/null +++ b/src/search/PhutilSearchQueryCompiler.php @@ -0,0 +1,374 @@ +<()~*:""&|'; + private $query; + private $stemmer; + private $enableFunctions = false; + + const OPERATOR_NOT = 'not'; + const OPERATOR_AND = 'and'; + const OPERATOR_SUBSTRING = 'sub'; + const OPERATOR_EXACT = 'exact'; + + public function setOperators($operators) { + $this->operators = $operators; + return $this; + } + + public function getOperators() { + return $this->operators; + } + + public function setStemmer(PhutilSearchStemmer $stemmer) { + $this->stemmer = $stemmer; + return $this; + } + + public function getStemmer() { + return $this->stemmer; + } + + public function setEnableFunctions($enable_functions) { + $this->enableFunctions = $enable_functions; + return $this; + } + + public function getEnableFunctions() { + return $this->enableFunctions; + } + + public function compileQuery(array $tokens) { + assert_instances_of($tokens, 'PhutilSearchQueryToken'); + + $result = array(); + foreach ($tokens as $token) { + $result[] = $this->renderToken($token); + } + + return $this->compileRenderedTokens($result); + } + + public function compileLiteralQuery(array $tokens) { + assert_instances_of($tokens, 'PhutilSearchQueryToken'); + + $result = array(); + foreach ($tokens as $token) { + if (!$token->isQuoted()) { + continue; + } + $result[] = $this->renderToken($token); + } + + return $this->compileRenderedTokens($result); + } + + public function compileStemmedQuery(array $tokens) { + assert_instances_of($tokens, 'PhutilSearchQueryToken'); + + $result = array(); + foreach ($tokens as $token) { + if ($token->isQuoted()) { + continue; + } + $result[] = $this->renderToken($token, $this->getStemmer()); + } + + return $this->compileRenderedTokens($result); + } + + private function compileRenderedTokens(array $list) { + if (!$list) { + return null; + } + + $list = array_unique($list); + return implode(' ', $list); + } + + public function newTokens($query) { + $results = $this->tokenizeQuery($query); + + $tokens = array(); + foreach ($results as $result) { + $tokens[] = PhutilSearchQueryToken::newFromDictionary($result); + } + + return $tokens; + } + + private function tokenizeQuery($query) { + $maximum_bytes = 1024; + + $query_bytes = strlen($query); + if ($query_bytes > $maximum_bytes) { + throw new PhutilSearchQueryCompilerSyntaxException( + pht( + 'Query is too long (%s bytes, maximum is %s bytes).', + new PhutilNumber($query_bytes), + new PhutilNumber($maximum_bytes))); + } + + $query = phutil_utf8v($query); + $length = count($query); + + $enable_functions = $this->getEnableFunctions(); + + $mode = 'scan'; + $current_operator = array(); + $current_token = array(); + $current_function = null; + $is_quoted = false; + $tokens = array(); + + if ($enable_functions) { + $operator_characters = '[~=+-]'; + } else { + $operator_characters = '[+-]'; + } + + for ($ii = 0; $ii < $length; $ii++) { + $character = $query[$ii]; + + if ($mode == 'scan') { + if (preg_match('/^\s\z/u', $character)) { + continue; + } + + $mode = 'function'; + } + + if ($mode == 'function') { + $mode = 'operator'; + + if ($enable_functions) { + $found = false; + for ($jj = $ii; $jj < $length; $jj++) { + if (preg_match('/^[a-zA-Z]\z/u', $query[$jj])) { + continue; + } + if ($query[$jj] == ':') { + $found = $jj; + } + break; + } + + if ($found !== false) { + $function = array_slice($query, $ii, ($jj - $ii)); + $current_function = implode('', $function); + + if (!strlen($current_function)) { + $current_function = null; + } + + $ii = $jj; + continue; + } + } + } + + if ($mode == 'operator') { + if (preg_match('/^\s\z/u', $character)) { + continue; + } + + if (preg_match('/^'.$operator_characters.'\z/', $character)) { + $current_operator[] = $character; + continue; + } + + $mode = 'quote'; + } + + if ($mode == 'quote') { + if (preg_match('/^"\z/', $character)) { + $is_quoted = true; + $mode = 'token'; + continue; + } + + $mode = 'token'; + } + + if ($mode == 'token') { + $capture = false; + $was_quoted = $is_quoted; + if ($is_quoted) { + if (preg_match('/^"\z/', $character)) { + $capture = true; + $mode = 'scan'; + $is_quoted = false; + } + } else { + if (preg_match('/^\s\z/u', $character)) { + $capture = true; + $mode = 'scan'; + } + + if (preg_match('/^"\z/', $character)) { + $capture = true; + $mode = 'token'; + $is_quoted = true; + } + } + + if ($capture) { + $token = array( + 'operator' => $current_operator, + 'quoted' => $was_quoted, + 'value' => $current_token, + ); + + if ($enable_functions) { + $token['function'] = $current_function; + } + + $tokens[] = $token; + + $current_operator = array(); + $current_token = array(); + $current_function = null; + continue; + } else { + $current_token[] = $character; + } + } + } + + if ($is_quoted) { + throw new PhutilSearchQueryCompilerSyntaxException( + pht( + 'Query contains unmatched double quotes.')); + } + + if ($mode == 'operator') { + throw new PhutilSearchQueryCompilerSyntaxException( + pht( + 'Query contains operator ("%s") with no search term.', + implode('', $current_operator))); + } + + $token = array( + 'operator' => $current_operator, + 'quoted' => false, + 'value' => $current_token, + ); + + if ($enable_functions) { + $token['function'] = $current_function; + } + + $tokens[] = $token; + + $results = array(); + foreach ($tokens as $token) { + $value = implode('', $token['value']); + $operator_string = implode('', $token['operator']); + + if (!strlen($value)) { + continue; + } + + $is_quoted = $token['quoted']; + + switch ($operator_string) { + case '-': + $operator = self::OPERATOR_NOT; + break; + case '~': + $operator = self::OPERATOR_SUBSTRING; + break; + case '=': + $operator = self::OPERATOR_EXACT; + break; + case '+': + $operator = self::OPERATOR_AND; + break; + case '': + // See T12995. If this query term contains Chinese, Japanese or + // Korean characters, treat the term as a substring term by default. + // These languages do not separate words with spaces, so the term + // search mode is normally useless. + if ($enable_functions && !$is_quoted && phutil_utf8_is_cjk($value)) { + $operator = self::OPERATOR_SUBSTRING; + } else { + $operator = self::OPERATOR_AND; + } + break; + default: + throw new PhutilSearchQueryCompilerSyntaxException( + pht( + 'Query has an invalid sequence of operators ("%s").', + $operator_string)); + } + + $result = array( + 'operator' => $operator, + 'quoted' => $is_quoted, + 'value' => $value, + ); + + if ($enable_functions) { + $result['function'] = $token['function']; + } + + $results[] = $result; + } + + return $results; + } + + private function renderToken( + PhutilSearchQueryToken $token, + PhutilSearchStemmer $stemmer = null) { + $value = $token->getValue(); + + if ($stemmer) { + $value = $stemmer->stemToken($value); + } + + $value = $this->quoteToken($value); + $operator = $token->getOperator(); + $prefix = $this->getOperatorPrefix($operator); + + $value = $prefix.$value; + + return $value; + } + + private function getOperatorPrefix($operator) { + $operators = $this->operators; + + switch ($operator) { + case self::OPERATOR_AND: + $prefix = $operators[0]; + break; + case self::OPERATOR_NOT: + $prefix = $operators[2]; + break; + default: + throw new PhutilSearchQueryCompilerSyntaxException( + pht( + 'Unsupported operator prefix "%s".', + $operator)); + } + + if ($prefix == ' ') { + $prefix = null; + } + + return $prefix; + } + + private function quoteToken($value) { + $operators = $this->operators; + + $open_quote = $this->operators[10]; + $close_quote = $this->operators[11]; + + return $open_quote.$value.$close_quote; + } + +} diff --git a/src/search/PhutilSearchQueryCompilerSyntaxException.php b/src/search/PhutilSearchQueryCompilerSyntaxException.php new file mode 100644 --- /dev/null +++ b/src/search/PhutilSearchQueryCompilerSyntaxException.php @@ -0,0 +1,4 @@ +isQuoted = $dictionary['quoted']; + $token->operator = $dictionary['operator']; + $token->value = $dictionary['value']; + $token->function = idx($dictionary, 'function'); + + return $token; + } + + public function isQuoted() { + return $this->isQuoted; + } + + public function getValue() { + return $this->value; + } + + public function getOperator() { + return $this->operator; + } + + public function getFunction() { + return $this->function; + } + +} diff --git a/src/search/PhutilSearchStemmer.php b/src/search/PhutilSearchStemmer.php new file mode 100644 --- /dev/null +++ b/src/search/PhutilSearchStemmer.php @@ -0,0 +1,74 @@ +normalizeToken($token); + return $this->applyStemmer($token); + } + + public function stemCorpus($corpus) { + $corpus = $this->normalizeCorpus($corpus); + $tokens = preg_split('/[^a-zA-Z0-9\x7F-\xFF._]+/', $corpus); + + $words = array(); + foreach ($tokens as $key => $token) { + $token = trim($token, '._'); + + if (strlen($token) < 3) { + continue; + } + + $words[$token] = $token; + } + + $stems = array(); + foreach ($words as $word) { + $stems[] = $this->applyStemmer($word); + } + + return implode(' ', $stems); + } + + private function normalizeToken($token) { + return phutil_utf8_strtolower($token); + } + + private function normalizeCorpus($corpus) { + return phutil_utf8_strtolower($corpus); + } + + /** + * @phutil-external-symbol class Porter + */ + private function applyStemmer($normalized_token) { + // If the token has internal punctuation, handle it literally. This + // deals with things like domain names, Conduit API methods, and other + // sorts of informal tokens. + if (preg_match('/[._]/', $normalized_token)) { + return $normalized_token; + } + + static $loaded; + + if ($loaded === null) { + $root = dirname(phutil_get_library_root('phutil')); + require_once $root.'/externals/porter-stemmer/src/Porter.php'; + $loaded = true; + } + + + $stem = Porter::stem($normalized_token); + + // If the stem is too short, it won't be a candidate for indexing. These + // tokens are also likely to be acronyms (like "DNS") rather than real + // English words. + if (strlen($stem) < 3) { + return $normalized_token; + } + + return $stem; + } + +} diff --git a/src/search/__tests__/PhutilSearchQueryCompilerTestCase.php b/src/search/__tests__/PhutilSearchQueryCompilerTestCase.php new file mode 100644 --- /dev/null +++ b/src/search/__tests__/PhutilSearchQueryCompilerTestCase.php @@ -0,0 +1,220 @@ + null, + 'cat dog' => '+"cat" +"dog"', + 'cat -dog' => '+"cat" -"dog"', + 'cat-dog' => '+"cat-dog"', + + // If there are spaces after an operator, the operator applies to the + // next search term. + 'cat - dog' => '+"cat" -"dog"', + + // Double quotes serve as delimiters even if there is no whitespace + // between terms. + '"cat"dog' => '+"cat" +"dog"', + + // This query is too long. + str_repeat('x', 2048) => false, + + // Multiple operators are not permitted. + '++cat' => false, + '+-cat' => false, + '--cat' => false, + + // Stray operators are not permitted. + '+' => false, + 'cat +' => false, + + // Double quotes must be paired. + '"' => false, + 'cat "' => false, + '"cat' => false, + 'A"' => false, + 'A"B"' => '+"A" +"B"', + ); + + $this->assertCompileQueries($tests); + + // Test that we compile queries correctly if the operators have been + // swapped to use "AND" by default. + $operator_tests = array( + 'cat dog' => '"cat" "dog"', + 'cat -dog' => '"cat" -"dog"', + ); + $this->assertCompileQueries($operator_tests, ' |-><()~*:""&\''); + + + // Test that we compile queries correctly if the quote operators have + // been swapped to differ. + $quote_tests = array( + 'cat dog' => '+[cat] +[dog]', + 'cat -dog' => '+[cat] -[dog]', + ); + $this->assertCompileQueries($quote_tests, '+ -><()~*:[]&|'); + + } + + public function testCompileQueriesWithStemming() { + $stemming_tests = array( + 'cat dog' => array( + null, + '+"cat" +"dog"', + ), + 'cats dogs' => array( + null, + '+"cat" +"dog"', + ), + 'cats "dogs"' => array( + '+"dogs"', + '+"cat"', + ), + '"blessed blade" of the windseeker' => array( + '+"blessed blade"', + '+"of" +"the" +"windseek"', + ), + 'mailing users for mentions on tasks' => array( + null, + '+"mail" +"user" +"for" +"mention" +"on" +"task"', + ), + ); + + $stemmer = new PhutilSearchStemmer(); + $this->assertCompileQueries($stemming_tests, null, $stemmer); + } + + public function testCompileQueriesWithFunctions() { + $op_and = PhutilSearchQueryCompiler::OPERATOR_AND; + $op_sub = PhutilSearchQueryCompiler::OPERATOR_SUBSTRING; + $op_exact = PhutilSearchQueryCompiler::OPERATOR_EXACT; + + $mao = "\xE7\x8C\xAB"; + + $function_tests = array( + 'cat' => array( + array(null, $op_and, 'cat'), + ), + ':cat' => array( + array(null, $op_and, 'cat'), + ), + 'title:cat' => array( + array('title', $op_and, 'cat'), + ), + 'title:cat:dog' => array( + array('title', $op_and, 'cat:dog'), + ), + 'title:~cat' => array( + array('title', $op_sub, 'cat'), + ), + 'cat title:="Meow Meow"' => array( + array(null, $op_and, 'cat'), + array('title', $op_exact, 'Meow Meow'), + ), + 'title:cat title:dog' => array( + array('title', $op_and, 'cat'), + array('title', $op_and, 'dog'), + ), + '~"core and seven years ag"' => array( + array(null, $op_sub, 'core and seven years ag'), + ), + $mao => array( + array(null, $op_sub, $mao), + ), + '+'.$mao => array( + array(null, $op_and, $mao), + ), + '~'.$mao => array( + array(null, $op_sub, $mao), + ), + '"'.$mao.'"' => array( + array(null, $op_and, $mao), + ), + ); + + $this->assertCompileFunctionQueries($function_tests); + } + + private function assertCompileQueries( + array $tests, + $operators = null, + PhutilSearchStemmer $stemmer = null) { + foreach ($tests as $input => $expect) { + $caught = null; + + $query = null; + $literal_query = null; + $stemmed_query = null; + + try { + $compiler = new PhutilSearchQueryCompiler(); + + if ($operators !== null) { + $compiler->setOperators($operators); + } + + if ($stemmer !== null) { + $compiler->setStemmer($stemmer); + } + + $tokens = $compiler->newTokens($input); + + if ($stemmer) { + $literal_query = $compiler->compileLiteralQuery($tokens); + $stemmed_query = $compiler->compileStemmedQuery($tokens); + } else { + $query = $compiler->compileQuery($tokens); + } + } catch (PhutilSearchQueryCompilerSyntaxException $ex) { + $caught = $ex; + } + + if ($caught !== null) { + $query = false; + $literal_query = false; + $stemmed_query = false; + } + + if (!$stemmer) { + $this->assertEqual( + $expect, + $query, + pht('Compilation of query: %s', $input)); + } else { + $this->assertEqual( + $expect, + ($literal_query === false) + ? false + : array($literal_query, $stemmed_query), + pht('Stemmed compilation of query: %s', $input)); + } + } + } + + private function assertCompileFunctionQueries(array $tests) { + foreach ($tests as $input => $expect) { + $compiler = id(new PhutilSearchQueryCompiler()) + ->setEnableFunctions(true); + + $tokens = $compiler->newTokens($input); + + $result = array(); + foreach ($tokens as $token) { + $result[] = array( + $token->getFunction(), + $token->getOperator(), + $token->getValue(), + ); + } + + $this->assertEqual( + $expect, + $result, + pht('Function compilation of query: %s', $input)); + } + } + +} diff --git a/src/search/__tests__/PhutilSearchStemmerTestCase.php b/src/search/__tests__/PhutilSearchStemmerTestCase.php new file mode 100644 --- /dev/null +++ b/src/search/__tests__/PhutilSearchStemmerTestCase.php @@ -0,0 +1,85 @@ + 'token', + 'panels' => 'panel', + + 'renames' => 'renam', + 'rename' => 'renam', + + 'components' => 'compon', + 'component' => 'compon', + + 'implementation' => 'implement', + 'implements' => 'implement', + 'implementing' => 'implement', + 'implementer' => 'implement', + + 'deleting' => 'delet', + 'deletion' => 'delet', + 'delete' => 'delet', + + 'erratically' => 'errat', + 'erratic' => 'errat', + + // Stems should be normalized. + 'DOG' => 'dog', + + // If stemming would bring a token under 3 characters, it should not + // be stemmed. + 'dns' => 'dns', + 'nis' => 'nis', + + // Complex tokens with internal punctuation should be left untouched; + // these are usually things like domain names, API calls, informal tags, + // etc. + 'apples' => 'appl', + 'bananas' => 'banana', + 'apples_bananas' => 'apples_bananas', + 'apples_bananas.apples_bananas' => 'apples_bananas.apples_bananas', + ); + + $stemmer = new PhutilSearchStemmer(); + foreach ($tests as $input => $expect) { + $stem = $stemmer->stemToken($input); + $this->assertEqual( + $expect, + $stem, + pht('Token stem of "%s".', $input)); + } + } + + public function testStemDocuments() { + $tests = array( + 'The wild boar meandered erratically.' => + 'the wild boar meander errat', + 'Fool me onc, shame on you. Fool me twice, shame on me.' => + 'fool onc shame you twice', + 'Fireball is a seventh-level spell which deals 2d16 points of damage '. + 'in a 1-meter radius around a target.' => + 'firebal seventh level spell which deal 2d16 point damag meter '. + 'radiu around target', + 'apples-bananas' => 'appl banana', + 'apples_bananas' => 'apples_bananas', + 'apples.bananas' => 'apples.bananas', + 'oddly-proportioned' => 'oddli proport', + ); + + $stemmer = new PhutilSearchStemmer(); + foreach ($tests as $input => $expect) { + $stem = $stemmer->stemCorpus($input); + $this->assertEqual( + $expect, + $stem, + pht('Corpus stem of: %s', $input)); + } + } + + +} diff --git a/src/serviceprofiler/PhutilServiceProfiler.php b/src/serviceprofiler/PhutilServiceProfiler.php new file mode 100644 --- /dev/null +++ b/src/serviceprofiler/PhutilServiceProfiler.php @@ -0,0 +1,222 @@ +discardMode = true; + } + + public function setCollectStackTraces($collect_stack_traces) { + $this->collectStackTraces = $collect_stack_traces; + return $this; + } + + public function getCollectStackTraces() { + return $this->collectStackTraces; + } + + public static function getInstance() { + if (empty(self::$instance)) { + self::$instance = new PhutilServiceProfiler(); + } + return self::$instance; + } + + public function beginServiceCall(array $data) { + $data['begin'] = microtime(true); + + if ($this->collectStackTraces) { + $trace = debug_backtrace(); + $trace = PhutilErrorHandler::formatStacktrace($trace); + $data['trace'] = $trace; + } + + $id = $this->logSize++; + $this->events[$id] = $data; + foreach ($this->listeners as $listener) { + call_user_func($listener, 'begin', $id, $data); + } + return $id; + } + + public function endServiceCall($call_id, array $data) { + $data = ($this->events[$call_id] + $data); + $data['end'] = microtime(true); + $data['duration'] = ($data['end'] - $data['begin']); + $this->events[$call_id] = $data; + foreach ($this->listeners as $listener) { + call_user_func($listener, 'end', $call_id, $data); + } + if ($this->discardMode) { + unset($this->events[$call_id]); + } + } + + public function getServiceCallLog() { + return $this->events; + } + + public function addListener($callback) { + $this->listeners[] = $callback; + } + + public static function installEchoListener() { + $instance = self::getInstance(); + $instance->addListener(array(__CLASS__, 'echoListener')); + } + + public static function echoListener($type, $id, $data) { + $is_begin = false; + $is_end = false; + + switch ($type) { + case 'begin': + $is_begin = true; + $mark = '>>>'; + break; + case 'end': + $is_end = true; + $mark = '<<<'; + break; + default: + $mark = null; + break; + } + + $type = idx($data, 'type', 'mystery'); + + $desc = null; + if ($is_begin) { + switch ($type) { + case 'connect': + $desc = $data['database']; + break; + case 'query': + $desc = substr($data['query'], 0, 512); + break; + case 'multi-query': + $desc = array(); + foreach ($data['queries'] as $query) { + $desc[] = substr($query, 0, 256); + } + $desc = implode('; ', $desc); + break; + case 'exec': + $desc = '$ '.$data['command']; + break; + case 'conduit': + if (isset($data['size'])) { + $desc = $data['method'].'() '; + $desc .= pht('', new PhutilNumber($data['size'])); + } else { + $desc = $data['method'].'()'; + } + break; + case 'http': + if (isset($data['proxy'])) { + $proxy = phutil_censor_credentials($data['proxy']); + } else { + $proxy = null; + } + + $uri = phutil_censor_credentials($data['uri']); + + if (strlen($proxy)) { + $desc = "{$proxy} >> {$uri}"; + } else { + $desc = $uri; + } + + break; + case 'lint': + $desc = $data['linter']; + if (isset($data['paths'])) { + $desc .= ' '.pht('', phutil_count($data['paths'])); + } + break; + case 'lock': + $desc = $data['name']; + break; + case 'event': + $desc = $data['kind'].' '; + $desc .= pht('', new PhutilNumber($data['count'])); + break; + case 'ldap': + $call = idx($data, 'call', '?'); + $params = array(); + switch ($call) { + case 'connect': + $params[] = $data['host'].':'.$data['port']; + break; + case 'start-tls': + break; + case 'bind': + $params[] = $data['user']; + break; + case 'search': + $params[] = $data['dn']; + $params[] = $data['query']; + break; + default: + $params[] = '?'; + break; + } + $desc = "{$call} (".implode(', ', $params).")"; + break; + } + } else if ($is_end) { + $desc = pht( + '%s us', + new PhutilNumber((int)(1000000 * $data['duration']))); + } + + $instance = self::getInstance(); + if (!$instance->zeroTime) { + $instance->zeroTime = microtime(true); + } + $elapsed = microtime(true) - $instance->zeroTime; + + $console = PhutilConsole::getConsole(); + $console->writeLog( + "%s [%s] (+%s) <%s> %s\n", + $mark, + $id, + pht('%s', new PhutilNumber((int)(1000 * $elapsed))), + $type, + self::escapeProfilerStringForDisplay($desc)); + } + + private static function escapeProfilerStringForDisplay($string) { + // Convert tabs and newlines to spaces and collapse blocks of whitespace, + // most often formatting in queries. + $string = preg_replace('/\s{2,}/', ' ', $string); + + // Replace sequences of binary characters with printable text. We allow + // some printable characters to appear in between unprintable characters + // to try to collapse the entire run. + $string = preg_replace( + '/[\x00-\x1F\x7F-\xFF](.{0,12}[\x00-\x1F\x7F-\xFF])*/', + '<...binary data...>', + $string); + + return $string; + } + + +} diff --git a/src/sprites/PhutilSprite.php b/src/sprites/PhutilSprite.php new file mode 100644 --- /dev/null +++ b/src/sprites/PhutilSprite.php @@ -0,0 +1,76 @@ +name = $name; + return $this; + } + + public function getName() { + return $this->name; + } + + public function setTargetCSS($target_css) { + $this->targetCSS = $target_css; + return $this; + } + + public function getTargetCSS() { + return $this->targetCSS; + } + + public function setSourcePosition($x, $y) { + $this->sourceX = $x; + $this->sourceY = $y; + return $this; + } + + public function setSourceSize($w, $h) { + $this->sourceW = $w; + $this->sourceH = $h; + return $this; + } + + public function getSourceH() { + return $this->sourceH; + } + + public function getSourceW() { + return $this->sourceW; + } + + public function getSourceY() { + return $this->sourceY; + } + + public function getSourceX() { + return $this->sourceX; + } + + public function setSourceFile($source_file, $scale = 1) { + $this->sourceFiles[$scale] = $source_file; + return $this; + } + + public function getSourceFile($scale) { + if (empty($this->sourceFiles[$scale])) { + throw new Exception(pht("No source file for scale '%s'!", $scale)); + } + + return $this->sourceFiles[$scale]; + } + +} diff --git a/src/sprites/PhutilSpriteSheet.php b/src/sprites/PhutilSpriteSheet.php new file mode 100644 --- /dev/null +++ b/src/sprites/PhutilSpriteSheet.php @@ -0,0 +1,385 @@ +generated = false; + $this->sprites[] = $sprite; + return $this; + } + + public function setCSSHeader($header) { + $this->generated = false; + $this->cssHeader = $header; + return $this; + } + + public function setScales(array $scales) { + $this->scales = array_values($scales); + return $this; + } + + public function getScales() { + return $this->scales; + } + + public function setSheetType($type) { + $this->type = $type; + return $this; + } + + public function setBasePath($base_path) { + $this->basePath = $base_path; + return $this; + } + + private function generate() { + if ($this->generated) { + return; + } + + $multi_row = true; + $multi_col = true; + $margin_w = 1; + $margin_h = 1; + + $type = $this->type; + switch ($type) { + case self::TYPE_STANDARD: + break; + case self::TYPE_REPEAT_X: + $multi_col = false; + $margin_w = 0; + + $width = null; + foreach ($this->sprites as $sprite) { + if ($width === null) { + $width = $sprite->getSourceW(); + } else if ($width !== $sprite->getSourceW()) { + throw new Exception( + pht( + "All sprites in a '%s' sheet must have the same width.", + 'repeat-x')); + } + } + break; + case self::TYPE_REPEAT_Y: + $multi_row = false; + $margin_h = 0; + + $height = null; + foreach ($this->sprites as $sprite) { + if ($height === null) { + $height = $sprite->getSourceH(); + } else if ($height !== $sprite->getSourceH()) { + throw new Exception( + pht( + "All sprites in a '%s' sheet must have the same height.", + 'repeat-y')); + } + } + break; + default: + throw new Exception(pht("Unknown sprite sheet type '%s'!", $type)); + } + + + $css = array(); + if ($this->cssHeader) { + $css[] = $this->cssHeader; + } + + $out_w = 0; + $out_h = 0; + + // Lay out the sprite sheet. We attempt to build a roughly square sheet + // so it's easier to manage, since 2000x20 is more cumbersome for humans + // to deal with than 200x200. + // + // To do this, we use a simple greedy algorithm, adding sprites one at a + // time. For each sprite, if the sheet is at least as wide as it is tall + // we create a new row. Otherwise, we try to add it to an existing row. + // + // This isn't optimal, but does a reasonable job in most cases and isn't + // too messy. + + // Group the sprites by their sizes. We lay them out in the sheet as + // boxes, but then put them into the boxes in the order they were added + // so similar sprites end up nearby on the final sheet. + $boxes = array(); + foreach (array_reverse($this->sprites) as $sprite) { + $s_w = $sprite->getSourceW() + $margin_w; + $s_h = $sprite->getSourceH() + $margin_h; + $boxes[$s_w][$s_h][] = $sprite; + } + + $rows = array(); + foreach ($this->sprites as $sprite) { + $s_w = $sprite->getSourceW() + $margin_w; + $s_h = $sprite->getSourceH() + $margin_h; + + // Choose a row for this sprite. + $maybe = array(); + foreach ($rows as $key => $row) { + if ($row['h'] < $s_h) { + // We can only add it to a row if the row is at least as tall as the + // sprite. + continue; + } + // We prefer rows which have the same height as the sprite, and then + // rows which aren't yet very wide. + $wasted_v = ($row['h'] - $s_h); + $wasted_h = ($row['w'] / $out_w); + $maybe[$key] = $wasted_v + $wasted_h; + } + + $row_key = null; + if ($maybe && $multi_col) { + // If there were any candidate rows, pick the best one. + asort($maybe); + $row_key = head_key($maybe); + } + + if ($row_key !== null && $multi_row) { + // If there's a candidate row, but adding the sprite to it would make + // the sprite wider than it is tall, create a new row instead. This + // generally keeps the sprite square-ish. + if ($rows[$row_key]['w'] + $s_w > $out_h) { + $row_key = null; + } + } + + if ($row_key === null) { + // Add a new row. + $rows[] = array( + 'w' => 0, + 'h' => $s_h, + 'boxes' => array(), + ); + $row_key = last_key($rows); + $out_h += $s_h; + } + + // Add the sprite box to the row. + $row = $rows[$row_key]; + $row['w'] += $s_w; + $row['boxes'][] = array($s_w, $s_h); + $rows[$row_key] = $row; + + $out_w = max($row['w'], $out_w); + } + + $images = array(); + foreach ($this->scales as $scale) { + $img = imagecreatetruecolor($out_w * $scale, $out_h * $scale); + imagesavealpha($img, true); + imagefill($img, 0, 0, imagecolorallocatealpha($img, 0, 0, 0, 127)); + + $images[$scale] = $img; + } + + + // Put the shorter rows first. At the same height, put the wider rows first. + // This makes the resulting sheet more human-readable. + foreach ($rows as $key => $row) { + $rows[$key]['sort'] = $row['h'] + (1 - ($row['w'] / $out_w)); + } + $rows = isort($rows, 'sort'); + + $pos_x = 0; + $pos_y = 0; + $rules = array(); + foreach ($rows as $row) { + $max_h = 0; + foreach ($row['boxes'] as $box) { + $sprite = array_pop($boxes[$box[0]][$box[1]]); + + foreach ($images as $scale => $img) { + $src = $this->loadSource($sprite, $scale); + imagecopy( + $img, + $src, + $scale * $pos_x, $scale * $pos_y, + $scale * $sprite->getSourceX(), $scale * $sprite->getSourceY(), + $scale * $sprite->getSourceW(), $scale * $sprite->getSourceH()); + } + + $rule = $sprite->getTargetCSS(); + $cssx = (-$pos_x).'px'; + $cssy = (-$pos_y).'px'; + + $rules[$sprite->getName()] = "{$rule} {\n". + " background-position: {$cssx} {$cssy};\n}"; + + $pos_x += $sprite->getSourceW() + $margin_w; + $max_h = max($max_h, $sprite->getSourceH()); + } + $pos_x = 0; + $pos_y += $max_h + $margin_h; + } + + // Generate CSS rules in input order. + foreach ($this->sprites as $sprite) { + $css[] = $rules[$sprite->getName()]; + } + + $this->images = $images; + $this->css = implode("\n\n", $css)."\n"; + $this->generated = true; + } + + public function generateImage($path, $scale = 1) { + $this->generate(); + $this->log(pht("Writing sprite '%s'...", $path)); + imagepng($this->images[$scale], $path); + return $this; + } + + public function generateCSS($path) { + $this->generate(); + $this->log(pht("Writing CSS '%s'...", $path)); + + $out = $this->css; + $out = str_replace('{X}', imagesx($this->images[1]), $out); + $out = str_replace('{Y}', imagesy($this->images[1]), $out); + + Filesystem::writeFile($path, $out); + return $this; + } + + public function needsRegeneration(array $manifest) { + return ($this->buildManifest() !== $manifest); + } + + private function buildManifest() { + $output = array(); + foreach ($this->sprites as $sprite) { + $output[$sprite->getName()] = array( + 'name' => $sprite->getName(), + 'rule' => $sprite->getTargetCSS(), + 'hash' => $this->loadSourceHash($sprite), + ); + } + + ksort($output); + + $data = array( + 'version' => self::MANIFEST_VERSION, + 'sprites' => $output, + 'scales' => $this->scales, + 'header' => $this->cssHeader, + 'type' => $this->type, + ); + + return $data; + } + + public function generateManifest($path) { + $data = $this->buildManifest(); + + $json = new PhutilJSON(); + $data = $json->encodeFormatted($data); + Filesystem::writeFile($path, $data); + return $this; + } + + private function log($message) { + echo $message."\n"; + } + + private function loadSourceHash(PhutilSprite $sprite) { + $inputs = array(); + + foreach ($this->scales as $scale) { + $file = $sprite->getSourceFile($scale); + + // If two users have a project in different places, like: + // + // /home/alincoln/project + // /home/htaft/project + // + // ...we want to ignore the `/home/alincoln` part when hashing the sheet, + // since the sprites don't change when the project directory moves. If + // the base path is set, build the hashes using paths relative to the + // base path. + + $file_key = $file; + if ($this->basePath) { + $file_key = Filesystem::readablePath($file, $this->basePath); + } + + if (empty($this->hashes[$file_key])) { + $this->hashes[$file_key] = md5(Filesystem::readFile($file)); + } + + $inputs[] = $file_key; + $inputs[] = $this->hashes[$file_key]; + } + + $inputs[] = $sprite->getSourceX(); + $inputs[] = $sprite->getSourceY(); + $inputs[] = $sprite->getSourceW(); + $inputs[] = $sprite->getSourceH(); + + return md5(implode(':', $inputs)); + } + + private function loadSource(PhutilSprite $sprite, $scale) { + $file = $sprite->getSourceFile($scale); + if (empty($this->sources[$file])) { + $data = Filesystem::readFile($file); + $image = imagecreatefromstring($data); + $this->sources[$file] = array( + 'image' => $image, + 'x' => imagesx($image), + 'y' => imagesy($image), + ); + } + + $s_w = $sprite->getSourceW() * $scale; + $i_w = $this->sources[$file]['x']; + if ($s_w > $i_w) { + throw new Exception( + pht( + "Sprite source for '%s' is too small (expected width %d, found %d).", + $file, + $s_w, + $i_w)); + } + + $s_h = $sprite->getSourceH() * $scale; + $i_h = $this->sources[$file]['y']; + if ($s_h > $i_h) { + throw new Exception( + pht( + "Sprite source for '%s' is too small (expected height %d, found %d).", + $file, + $s_h, + $i_h)); + } + + return $this->sources[$file]['image']; + } + +} diff --git a/src/symbols/PhutilClassMapQuery.php b/src/symbols/PhutilClassMapQuery.php new file mode 100644 --- /dev/null +++ b/src/symbols/PhutilClassMapQuery.php @@ -0,0 +1,318 @@ +ancestorClass = $class; + return $this; + } + + + /** + * Provide a method to select a unique key for each instance. + * + * If you provide a method here, the map will be keyed with these values, + * instead of with class names. Exceptions will be raised if entries are + * not unique. + * + * You must provide a method here to use @{method:setExpandMethod}. + * + * @param string Name of the unique key method. + * @param bool If true, then classes which return `null` will be filtered + * from the results. + * @return this + * @task config + */ + public function setUniqueMethod($unique_method, $filter_null = false) { + $this->uniqueMethod = $unique_method; + $this->filterNull = $filter_null; + return $this; + } + + + /** + * Provide a method to expand each concrete subclass into available instances. + * + * With some class maps, each class is allowed to provide multiple entries + * in the map by returning alternatives from some method with a default + * implementation like this: + * + * public function generateVariants() { + * return array($this); + * } + * + * For example, a "color" class may really generate and configure several + * instances in the final class map: + * + * public function generateVariants() { + * return array( + * self::newColor('red'), + * self::newColor('green'), + * self::newColor('blue'), + * ); + * } + * + * This allows multiple entires in the final map to share an entire + * implementation, rather than requiring that they each have their own unique + * subclass. + * + * This pattern is most useful if several variants are nearly identical (so + * the stub subclasses would be essentially empty) or the available variants + * are driven by configuration. + * + * If a class map uses this pattern, it must also provide a unique key for + * each instance with @{method:setUniqueMethod}. + * + * @param string Name of the expansion method. + * @return this + * @task config + */ + public function setExpandMethod($expand_method) { + $this->expandMethod = $expand_method; + return $this; + } + + + /** + * Provide a method to sort the final map. + * + * The map will be sorted using @{function:msort} and passing this method + * name. + * + * @param string Name of the sorting method. + * @return this + * @task config + */ + public function setSortMethod($sort_method) { + $this->sortMethod = $sort_method; + return $this; + } + + + /** + * Provide a method to filter the map. + * + * @param string Name of the filtering method. + * @return this + * @task config + */ + public function setFilterMethod($filter_method) { + $this->filterMethod = $filter_method; + return $this; + } + + +/* -( Executing the Query )------------------------------------------------ */ + + + /** + * Execute the query as configured. + * + * @return map Realized class map. + * @task exec + */ + public function execute() { + $cache_key = $this->getCacheKey(); + + if (!isset(self::$cache[$cache_key])) { + self::$cache[$cache_key] = $this->loadMap(); + } + + return self::$cache[$cache_key]; + } + + + /** + * Delete all class map caches. + * + * @return void + * @task exec + */ + public static function deleteCaches() { + self::$cache = array(); + } + + + /** + * Generate the core query results. + * + * This method is used to fill the cache. + * + * @return map Realized class map. + * @task exec + */ + private function loadMap() { + $ancestor = $this->ancestorClass; + if (!strlen($ancestor)) { + throw new PhutilInvalidStateException('setAncestorClass'); + } + + if (!class_exists($ancestor) && !interface_exists($ancestor)) { + throw new Exception( + pht( + 'Trying to execute a class map query for descendants of class '. + '"%s", but no such class or interface exists.', + $ancestor)); + } + + $expand = $this->expandMethod; + $filter = $this->filterMethod; + $unique = $this->uniqueMethod; + $sort = $this->sortMethod; + + if (strlen($expand)) { + if (!strlen($unique)) { + throw new Exception( + pht( + 'Trying to execute a class map query for descendants of class '. + '"%s", but the query specifies an "expand method" ("%s") without '. + 'specifying a "unique method". Class maps which support expansion '. + 'must have unique keys.', + $ancestor, + $expand)); + } + } + + $objects = id(new PhutilSymbolLoader()) + ->setAncestorClass($ancestor) + ->loadObjects(); + + // Apply the "expand" mechanism, if it is configured. + if (strlen($expand)) { + $list = array(); + foreach ($objects as $object) { + foreach (call_user_func(array($object, $expand)) as $instance) { + $list[] = $instance; + } + } + } else { + $list = $objects; + } + + // Apply the "unique" mechanism, if it is configured. + if (strlen($unique)) { + $map = array(); + foreach ($list as $object) { + $key = call_user_func(array($object, $unique)); + + if ($key === null && $this->filterNull) { + continue; + } + + if (empty($map[$key])) { + $map[$key] = $object; + continue; + } + + throw new Exception( + pht( + 'Two objects (of classes "%s" and "%s", descendants of ancestor '. + 'class "%s") returned the same key from "%s" ("%s"), but each '. + 'object in this class map must be identified by a unique key.', + get_class($object), + get_class($map[$key]), + $ancestor, + $unique.'()', + $key)); + } + } else { + $map = $list; + } + + // Apply the "filter" mechanism, if it is configured. + if (strlen($filter)) { + $map = mfilter($map, $filter); + } + + // Apply the "sort" mechanism, if it is configured. + if (strlen($sort)) { + $map = msort($map, $sort); + } + + return $map; + } + + +/* -( Managing the Map Cache )--------------------------------------------- */ + + + /** + * Return a cache key for this query. + * + * @return string Cache key. + * @task cache + */ + public function getCacheKey() { + $parts = array( + $this->ancestorClass, + $this->uniqueMethod, + $this->filterNull, + $this->expandMethod, + $this->filterMethod, + $this->sortMethod, + ); + return implode(':', $parts); + } + +} diff --git a/src/symbols/PhutilSymbolLoader.php b/src/symbols/PhutilSymbolLoader.php new file mode 100644 --- /dev/null +++ b/src/symbols/PhutilSymbolLoader.php @@ -0,0 +1,414 @@ +setType('class') + * ->setLibrary('example') + * ->selectAndLoadSymbols(); + * ``` + * + * When you execute the loading query, it returns a dictionary of matching + * symbols: + * + * ```lang=php + * array( + * 'class$Example' => array( + * 'type' => 'class', + * 'name' => 'Example', + * 'library' => 'libexample', + * 'where' => 'examples/example.php', + * ), + * // ... more ... + * ); + * ``` + * + * The **library** and **where** keys show where the symbol is defined. The + * **type** and **name** keys identify the symbol itself. + * + * NOTE: This class must not use libphutil functions, including @{function:id} + * and @{function:idx}. + * + * @task config Configuring the Query + * @task load Loading Symbols + * @task internal Internals + */ +final class PhutilSymbolLoader { + + private $type; + private $library; + private $base; + private $name; + private $concrete; + private $pathPrefix; + + private $suppressLoad; + + + /** + * Select the type of symbol to load, either `class`, `function` or + * `interface`. + * + * @param string Type of symbol to load. + * @return this + * + * @task config + */ + public function setType($type) { + $this->type = $type; + return $this; + } + + + /** + * Restrict the symbol query to a specific library; only symbols from this + * library will be loaded. + * + * @param string Library name. + * @return this + * + * @task config + */ + public function setLibrary($library) { + // Validate the library name; this throws if the library in not loaded. + $bootloader = PhutilBootloader::getInstance(); + $bootloader->getLibraryRoot($library); + + $this->library = $library; + return $this; + } + + + /** + * Restrict the symbol query to a specific path prefix; only symbols defined + * in files below that path will be selected. + * + * @param string Path relative to library root, like "apps/cheese/". + * @return this + * + * @task config + */ + public function setPathPrefix($path) { + $this->pathPrefix = str_replace(DIRECTORY_SEPARATOR, '/', $path); + return $this; + } + + + /** + * Restrict the symbol query to a single symbol name, e.g. a specific class + * or function name. + * + * @param string Symbol name. + * @return this + * + * @task config + */ + public function setName($name) { + $this->name = $name; + return $this; + } + + + /** + * Restrict the symbol query to only descendants of some class. This will + * strictly select descendants, the base class will not be selected. This + * implies loading only classes. + * + * @param string Base class name. + * @return this + * + * @task config + */ + public function setAncestorClass($base) { + $this->base = $base; + return $this; + } + + + /** + * Restrict the symbol query to only concrete symbols; this will filter out + * abstract classes. + * + * NOTE: This currently causes class symbols to load, even if you run + * @{method:selectSymbolsWithoutLoading}. + * + * @param bool True if the query should load only concrete symbols. + * @return this + * + * @task config + */ + public function setConcreteOnly($concrete) { + $this->concrete = $concrete; + return $this; + } + + +/* -( Load )--------------------------------------------------------------- */ + + + /** + * Execute the query and select matching symbols, then load them so they can + * be used. + * + * @return dict A dictionary of matching symbols. See top-level class + * documentation for details. These symbols will be loaded + * and available. + * + * @task load + */ + public function selectAndLoadSymbols() { + $map = array(); + + $bootloader = PhutilBootloader::getInstance(); + + if ($this->library) { + $libraries = array($this->library); + } else { + $libraries = $bootloader->getAllLibraries(); + } + + if ($this->type) { + $types = array($this->type); + } else { + $types = array( + 'class', + 'function', + ); + } + + $names = null; + if ($this->base) { + $names = $this->selectDescendantsOf( + $bootloader->getClassTree(), + $this->base); + } + + $symbols = array(); + foreach ($libraries as $library) { + $map = $bootloader->getLibraryMap($library); + foreach ($types as $type) { + if ($type == 'interface') { + $lookup_map = $map['class']; + } else { + $lookup_map = $map[$type]; + } + + // As an optimization, we filter the list of candidate symbols in + // several passes, applying a name-based filter first if possible since + // it is highly selective and guaranteed to match at most one symbol. + // This is the common case and we land here through `__autoload()` so + // it's worthwhile to micro-optimize a bit because this code path is + // very hot and we save 5-10ms per page for a very moderate increase in + // complexity. + + if ($this->name) { + // If we have a name filter, just pick the matching name out if it + // exists. + if (isset($lookup_map[$this->name])) { + $filtered_map = array( + $this->name => $lookup_map[$this->name], + ); + } else { + $filtered_map = array(); + } + } else if ($names !== null) { + $filtered_map = array(); + foreach ($names as $name => $ignored) { + if (isset($lookup_map[$name])) { + $filtered_map[$name] = $lookup_map[$name]; + } + } + } else { + // Otherwise, start with everything. + $filtered_map = $lookup_map; + } + + if ($this->pathPrefix) { + $len = strlen($this->pathPrefix); + foreach ($filtered_map as $name => $where) { + if (strncmp($where, $this->pathPrefix, $len) !== 0) { + unset($filtered_map[$name]); + } + } + } + + foreach ($filtered_map as $name => $where) { + $symbols[$type.'$'.$name] = array( + 'type' => $type, + 'name' => $name, + 'library' => $library, + 'where' => $where, + ); + } + } + } + + if (!$this->suppressLoad) { + $caught = null; + foreach ($symbols as $symbol) { + try { + $this->loadSymbol($symbol); + } catch (Exception $ex) { + $caught = $ex; + } + } + if ($caught) { + // NOTE: We try to load everything even if we fail to load something, + // primarily to make it possible to remove functions from a libphutil + // library without breaking library startup. + throw $caught; + } + } + + + if ($this->concrete) { + // Remove 'abstract' classes. + foreach ($symbols as $key => $symbol) { + if ($symbol['type'] == 'class') { + $reflection = new ReflectionClass($symbol['name']); + if ($reflection->isAbstract()) { + unset($symbols[$key]); + } + } + } + } + + return $symbols; + } + + + /** + * Execute the query and select matching symbols, but do not load them. This + * will perform slightly better if you are only interested in the existence + * of the symbols and don't plan to use them; otherwise, use + * @{method:selectAndLoadSymbols}. + * + * @return dict A dictionary of matching symbols. See top-level class + * documentation for details. + * + * @task load + */ + public function selectSymbolsWithoutLoading() { + $this->suppressLoad = true; + $result = $this->selectAndLoadSymbols(); + $this->suppressLoad = false; + return $result; + } + + + /** + * Select symbols matching the query and then instantiate them, returning + * concrete objects. This is a convenience method which simplifies symbol + * handling if you are only interested in building objects. + * + * If you want to do more than build objects, or want to build objects with + * varying constructor arguments, use @{method:selectAndLoadSymbols} for + * fine-grained control over results. + * + * This method implicitly restricts the query to match only concrete + * classes. + * + * @param list List of constructor arguments. + * @return map Map of class names to constructed objects. + */ + public function loadObjects(array $argv = array()) { + $symbols = $this + ->setConcreteOnly(true) + ->setType('class') + ->selectAndLoadSymbols(); + + $objects = array(); + foreach ($symbols as $symbol) { + $objects[$symbol['name']] = newv($symbol['name'], $argv); + } + + return $objects; + } + + +/* -( Internals )---------------------------------------------------------- */ + + + /** + * @task internal + */ + private function selectDescendantsOf(array $tree, $root) { + $result = array(); + + if (empty($tree[$root])) { + // No known descendants. + return array(); + } + + foreach ($tree[$root] as $child) { + $result[$child] = true; + if (!empty($tree[$child])) { + $result += $this->selectDescendantsOf($tree, $child); + } + } + return $result; + } + + + /** + * @task internal + */ + private function loadSymbol(array $symbol_spec) { + // Check if we've already loaded the symbol; bail if we have. + $name = $symbol_spec['name']; + $is_function = ($symbol_spec['type'] == 'function'); + + if ($is_function) { + if (function_exists($name)) { + return; + } + } else { + if (class_exists($name, false) || interface_exists($name, false)) { + return; + } + } + + $lib_name = $symbol_spec['library']; + $where = $symbol_spec['where']; + $bootloader = PhutilBootloader::getInstance(); + + $bootloader->loadLibrarySource($lib_name, $where); + + // Check that we successfully loaded the symbol from wherever it was + // supposed to be defined. + + $load_failed = null; + if ($is_function) { + if (!function_exists($name)) { + $load_failed = pht('function'); + } + } else { + if (!class_exists($name, false) && !interface_exists($name, false)) { + $load_failed = pht('class or interface'); + } + } + + if ($load_failed !== null) { + $lib_path = phutil_get_library_root($lib_name); + throw new PhutilMissingSymbolException( + $name, + $load_failed, + pht( + "the symbol map for library '%s' (at '%s') claims this %s is ". + "defined in '%s', but loading that source file did not cause the ". + "%s to become defined.", + $lib_name, + $lib_path, + $load_failed, + $where, + $load_failed)); + } + } + +} diff --git a/src/symbols/exception/PhutilMissingSymbolException.php b/src/symbols/exception/PhutilMissingSymbolException.php new file mode 100644 --- /dev/null +++ b/src/symbols/exception/PhutilMissingSymbolException.php @@ -0,0 +1,26 @@ +addNodes( + * array( + * $object->getPHID() => $object->getChildPHIDs(), + * )); + * $detector->loadGraph(); + * + * Now you can query the graph, e.g. by detecting cycles: + * + * $cycle = $detector->detectCycles($object->getPHID()); + * + * If ##$cycle## is empty, no graph cycle is reachable from the node. If it + * is nonempty, it contains a list of nodes which form a graph cycle. + * + * NOTE: Nodes must be represented with scalars. + * + * @task build Graph Construction + * @task cycle Cycle Detection + * @task explore Graph Exploration + */ +abstract class AbstractDirectedGraph extends Phobject { + + + private $knownNodes = array(); + private $graphLoaded = false; + + +/* -( Graph Construction )------------------------------------------------- */ + + + /** + * Load the edges for a list of nodes. You must override this method. You + * will be passed a list of nodes, and should return a dictionary mapping + * each node to the list of nodes that can be reached by following its the + * edges which originate at it: for example, the child nodes of an object + * which has a parent-child relationship to other objects. + * + * The intent of this method is to allow you to issue a single query per + * graph level for graphs which are stored as edge tables in the database. + * Generally, you will load all the objects which correspond to the list of + * nodes, and then return a map from each of their IDs to all their children. + * + * NOTE: You must return an entry for every node you are passed, even if it + * is invalid or can not be loaded. Either return an empty array (if this is + * acceptable for your application) or throw an exception if you can't satisfy + * this requirement. + * + * @param list A list of nodes. + * @return dict A map of nodes to the nodes reachable along their edges. + * There must be an entry for each node you were provided. + * @task build + */ + abstract protected function loadEdges(array $nodes); + + + /** + * Seed the graph with known nodes. Often, you will provide the candidate + * edges that a user is trying to create here, or the initial set of edges + * you know about. + * + * @param dict A map of nodes to the nodes reachable along their edges. + * @return this + * @task build + */ + final public function addNodes(array $nodes) { + if ($this->graphLoaded) { + throw new Exception( + pht( + 'Call %s before calling %s. You can not add more nodes '. + 'once you have loaded the graph.', + __FUNCTION__.'()', + 'loadGraph()')); + } + + $this->knownNodes += $nodes; + return $this; + } + + final public function getNodes() { + return $this->knownNodes; + } + + /** + * Utility function to get a list of topographically sorted nodes out of a + * graph. + * + * This could be useful for example to figure out what order you can safely + * apply dependencies. + * + * Note this will loop indefinitely if the graph has a cycle. + */ + final public function getTopographicallySortedNodes() { + $sorted = array(); + $nodes = $this->getNodes(); + + $inverse_map = array(); + foreach ($nodes as $node => $edges) { + if (!isset($inverse_map[$node])) { + $inverse_map[$node] = array(); + } + foreach ($edges as $edge) { + if (!isset($inverse_map[$edge])) { + $inverse_map[$edge] = array(); + } + $inverse_map[$edge][$node] = $node; + } + } + + $end_nodes = array(); + foreach ($inverse_map as $node => $edges) { + if (empty($edges)) { + $end_nodes[] = $node; + } + } + + while (!empty($end_nodes)) { + $current_node = array_pop($end_nodes); + $sorted[] = $current_node; + $current_edges = $nodes[$current_node]; + foreach ($current_edges as $index => $current_edge) { + // delete the edge from the normal map + unset($nodes[$current_node][$index]); + // and from the inverse map which is modestly trickier + $inverse_nodes = $inverse_map[$current_edge]; + unset($inverse_nodes[$current_node]); + $inverse_map[$current_edge] = $inverse_nodes; + // no more edges means this is an "end node" now + if (empty($inverse_map[$current_edge])) { + $end_nodes[] = $current_edge; + } + } + } + + return $sorted; + } + + /** + * Utility function to get the best effort topographically sorted + * nodes out of a graph. + */ + final public function getBestEffortTopographicallySortedNodes() { + $nodes = $this->getNodes(); + $edges = $this->loadEdges($nodes); + + $results = array(); + $completed = array(); + + $depth = 0; + while (true) { + $next = array(); + + foreach ($nodes as $node) { + if (isset($completed[$node])) { + continue; + } + + $capable = true; + foreach ($edges[$node] as $edge) { + if (!isset($completed[$edge])) { + $capable = false; + break; + } + } + + if ($capable) { + $next[] = $node; + } + } + + if (count($next) === 0) { + // No more nodes to traverse; we are deadlocked if the number + // of completed nodes is less than the total number of nodes. + break; + } + + foreach ($next as $node) { + $results[] = array( + 'node' => $node, + 'depth' => $depth, + 'cycle' => false, + ); + + $completed[$node] = true; + } + + $depth++; + } + + foreach ($nodes as $node) { + if (!isset($completed[$node])) { + $results[] = array( + 'node' => $node, + 'depth' => $depth, + 'cycle' => true, + ); + } + } + + return $results; + } + + /** + * Load the graph, building it out so operations can be performed on it. This + * constructs the graph level-by-level, calling @{method:loadEdges} to + * expand the graph at each stage until it is complete. + * + * @return this + * @task build + */ + final public function loadGraph() { + + $new_nodes = $this->knownNodes; + while (true) { + $load = array(); + foreach ($new_nodes as $node => $edges) { + foreach ($edges as $edge) { + if (!isset($this->knownNodes[$edge])) { + $load[$edge] = true; + } + } + } + + if (empty($load)) { + break; + } + + $load = array_keys($load); + + $new_nodes = $this->loadEdges($load); + foreach ($load as $node) { + if (!isset($new_nodes[$node]) || !is_array($new_nodes[$node])) { + throw new Exception( + pht( + '%s must return an edge list array for each provided '. + 'node, or the cycle detection algorithm may not terminate.', + 'loadEdges()')); + } + } + + $this->addNodes($new_nodes); + } + + $this->graphLoaded = true; + return $this; + } + + +/* -( Cycle Detection )---------------------------------------------------- */ + + + /** + * Detect if there are any cycles reachable from a given node. + * + * If cycles are reachable, it returns a list of nodes which create a cycle. + * Note that this list may include nodes which aren't actually part of the + * cycle, but lie on the graph between the specified node and the cycle. + * For example, it might return something like this (when passed "A"): + * + * A, B, C, D, E, C + * + * This means you can walk from A to B to C to D to E and then back to C, + * which forms a cycle. A and B are included even though they are not part + * of the cycle. When presenting information about graph cycles to users, + * including these nodes is generally useful. This also shouldn't ever happen + * if you've vetted prior edges before writing them, because it means there + * is a preexisting cycle in the graph. + * + * NOTE: This only detects cycles reachable from a node. It does not detect + * cycles in the entire graph. + * + * @param scalar The node to walk from, looking for graph cycles. + * @return list|null Returns null if no cycles are reachable from the node, + * or a list of nodes that form a cycle. + * @task cycle + */ + final public function detectCycles($node) { + if (!$this->graphLoaded) { + throw new Exception( + pht( + 'Call %s to build the graph out before calling %s.', + 'loadGraph()', + __FUNCTION__.'()')); + } + if (!isset($this->knownNodes[$node])) { + throw new Exception( + pht( + "The node '%s' is not known. Call %s to seed the graph with nodes.", + $node, + 'addNodes()')); + } + + $visited = array(); + return $this->performCycleDetection($node, $visited); + } + + + /** + * Internal cycle detection implementation. Recursively walks the graph, + * keeping track of where it's been, and returns the first cycle it finds. + * + * @param scalar The node to walk from. + * @param list Previously visited nodes. + * @return null|list Null if no cycles are found, or a list of nodes + * which cycle. + * @task cycle + */ + final private function performCycleDetection($node, array $visited) { + $visited[$node] = true; + foreach ($this->knownNodes[$node] as $edge) { + if (isset($visited[$edge])) { + $result = array_keys($visited); + $result[] = $edge; + return $result; + } + $result = $this->performCycleDetection($edge, $visited); + if ($result) { + return $result; + } + } + return null; + } + +} diff --git a/src/utils/CaseInsensitiveArray.php b/src/utils/CaseInsensitiveArray.php new file mode 100644 --- /dev/null +++ b/src/utils/CaseInsensitiveArray.php @@ -0,0 +1,121 @@ +toArray()); // array('key' => 'foobar') + * ``` + * + * Note that it is not possible to reuse case variants of a key. That is, if + * the array contains key `xyz` then it is not possible to use any of the + * following case variants as an array key: `xyZ`, `xYz`, `xYZ`, `Xyz`, `XyZ`, + * `XYz`, `XYZ`. In order to use a case variant as a key, it is necessary to + * first unset the original case variant. + * + * ```lang=php + * $array = new CaseInsensitiveArray(array('key' => 'foo', 'KEY' => 'bar')); + * var_dump($array->toArray()); // array('key' => 'bar') + * + * $array['KEY'] = 'baz'; + * var_dump($array->toArray()); // array('key' => 'baz') + * + * unset($array['key']); + * $array['KEY'] = 'baz'; + * var_dump($array->toArray()); // array('KEY' => 'baz') + * ``` + */ +final class CaseInsensitiveArray extends PhutilArray { + + /** + * Mapping between original and case-invariant keys. + * + * All keys in the parent `PhutilArray` are indexed using the case-invariant + * key rather than the original key. + * + * @var map + */ + private $keys = array(); + + /** + * Construct a new array object. + * + * @param array The input array. + */ + public function __construct(array $data = array()) { + foreach ($data as $key => $value) { + $this->offsetSet($key, $value); + } + } + + public function getKeys() { + return array_values($this->keys); + } + + public function offsetExists($key) { + $key = $this->transformKey($key); + return array_key_exists($key, $this->keys); + } + + public function offsetGet($key) { + $key = $this->transformKey($key); + return parent::offsetGet($this->keys[$key]); + } + + public function offsetSet($key, $value) { + $transformed_key = $this->transformKey($key); + + if (isset($this->keys[$transformed_key])) { + // If the key already exists, reuse it and override the + // existing value. + $key = $this->keys[$transformed_key]; + } else { + // If the key doesn't yet, create a new array element. + $this->keys[$transformed_key] = $key; + } + + parent::offsetSet($key, $value); + } + + public function offsetUnset($key) { + $key = $this->transformKey($key); + + parent::offsetUnset($this->keys[$key]); + unset($this->keys[$key]); + } + + /** + * Transform an array key. + * + * This method transforms an array key to be case-invariant. We //could// + * just call [[http://php.net/manual/en/function.strtolower.php | + * `strtolower`]] directly, but this method allows us to contain the key + * transformation logic within a single method, should it ever change. + * + * Theoretically, we should be able to use any of the following functions + * for the purpose of key transformations: + * + * - [[http://php.net/manual/en/function.strtolower.php | `strtolower`]] + * - [[http://php.net/manual/en/function.strtoupper.php | `strtoupper`]] + * - Some creative use of other + * [[http://php.net/manual/en/book.strings.php | string transformation]] + * functions. + * + * @param string The input key. + * @return string The transformed key. + */ + private function transformKey($key) { + return phutil_utf8_strtolower($key); + } + +} diff --git a/src/utils/PhutilArray.php b/src/utils/PhutilArray.php new file mode 100644 --- /dev/null +++ b/src/utils/PhutilArray.php @@ -0,0 +1,80 @@ +data = $initial_value; + } + + +/* -( Conversion )--------------------------------------------------------- */ + + + public function toArray() { + return iterator_to_array($this, true); + } + + +/* -( Countable Interface )------------------------------------------------ */ + + + public function count() { + return count($this->data); + } + + +/* -( Iterator Interface )------------------------------------------------- */ + + + public function current() { + return current($this->data); + } + + public function key() { + return key($this->data); + } + + public function next() { + return next($this->data); + } + + public function rewind() { + reset($this->data); + } + + public function valid() { + return (key($this->data) !== null); + } + + +/* -( ArrayAccess Interface )---------------------------------------------- */ + + + public function offsetExists($key) { + return array_key_exists($key, $this->data); + } + + public function offsetGet($key) { + return $this->data[$key]; + } + + public function offsetSet($key, $value) { + $this->data[$key] = $value; + } + + public function offsetUnset($key) { + unset($this->data[$key]); + } + +} diff --git a/src/utils/PhutilArrayWithDefaultValue.php b/src/utils/PhutilArrayWithDefaultValue.php new file mode 100644 --- /dev/null +++ b/src/utils/PhutilArrayWithDefaultValue.php @@ -0,0 +1,49 @@ +defaultValue = $default_value; + return $this; + } + + public function offsetExists($key) { + return true; + } + + public function offsetGet($key) { + if (!parent::offsetExists($key)) { + $this->offsetSet($key, $this->defaultValue); + } + return parent::offsetGet($key); + } + +} diff --git a/src/utils/PhutilBufferedIterator.php b/src/utils/PhutilBufferedIterator.php new file mode 100644 --- /dev/null +++ b/src/utils/PhutilBufferedIterator.php @@ -0,0 +1,138 @@ + List of results. + * @task impl + */ + abstract protected function loadPage(); + + +/* -( Configuration )------------------------------------------------------ */ + + + /** + * Get the configured page size. + * + * @return int Page size. + * @task config + */ + final public function getPageSize() { + return $this->pageSize; + } + + + /** + * Configure the page size. Note that implementations may ignore this. + * + * @param int Page size. + * @return this + * @task config + */ + final public function setPageSize($size) { + $this->pageSize = $size; + return $this; + } + + +/* -( Iterator Implementation )-------------------------------------------- */ + + + /** + * @task iterator + */ + final public function rewind() { + $this->didRewind(); + $this->data = array(); + $this->naturalKey = 0; + $this->next(); + } + + + /** + * @task iterator + */ + final public function valid() { + return (bool)count($this->data); + } + + + /** + * @task iterator + */ + final public function current() { + return end($this->data); + } + + + /** + * By default, the iterator assigns a "natural" key (0, 1, 2, ...) to each + * result. This method is intentionally nonfinal so you can substitute a + * different behavior by overriding it if you prefer. + * + * @return scalar Key for the current result (as per @{method:current}). + * @task iterator + */ + public function key() { + return $this->naturalKey; + } + + + /** + * @task iterator + */ + final public function next() { + if ($this->data) { + $this->naturalKey++; + array_pop($this->data); + if ($this->data) { + return; + } + } + + $data = $this->loadPage(); + + // NOTE: Reverse the results so we can use array_pop() to discard them, + // since it doesn't have the O(N) key reassignment behavior of + // array_shift(). + + $this->data = array_reverse($data); + } + +} diff --git a/src/utils/PhutilCallbackFilterIterator.php b/src/utils/PhutilCallbackFilterIterator.php new file mode 100644 --- /dev/null +++ b/src/utils/PhutilCallbackFilterIterator.php @@ -0,0 +1,25 @@ +callback = $callback; + } + + public function accept() { + return call_user_func($this->callback, $this->current()); + } + +} diff --git a/src/utils/PhutilChunkedIterator.php b/src/utils/PhutilChunkedIterator.php new file mode 100644 --- /dev/null +++ b/src/utils/PhutilChunkedIterator.php @@ -0,0 +1,60 @@ +iterator = $iterator; + $this->size = $size; + } + + public function rewind() { + $this->iterator->rewind(); + $this->next(); + $this->key = 0; + } + + /** + * @return int + */ + public function key() { + return $this->key; + } + + /** + * @return array + */ + public function current() { + return $this->current; + } + + public function next() { + $this->current = array(); + while ($this->iterator->valid()) { + $key = $this->iterator->key(); + $this->current[$key] = $this->iterator->current(); + $this->iterator->next(); + if (count($this->current) >= $this->size) { + break; + } + } + $this->key++; + } + + public function valid() { + return (bool)$this->current; + } + +} diff --git a/src/utils/PhutilCowsay.php b/src/utils/PhutilCowsay.php new file mode 100644 --- /dev/null +++ b/src/utils/PhutilCowsay.php @@ -0,0 +1,147 @@ +template = $template; + return $this; + } + + public function setEyes($eyes) { + $this->eyes = $eyes; + return $this; + } + + public function setTongue($tongue) { + $this->tongue = $tongue; + return $this; + } + + public function setAction($action) { + $this->action = $action; + return $this; + } + + public function setText($text) { + $this->text = $text; + return $this; + } + + public function renderCow() { + $width = 40; + $template = $this->template; + + // Real ".cow" files are Perl scripts which define a variable called + // "$the_cow". We aren't going to interpret Perl, so strip all this stuff + // (and any comments in the file) away. + $template = phutil_split_lines($template, true); + $keep = array(); + $is_perl_cowfile = false; + foreach ($template as $key => $line) { + if (preg_match('/^#/', $line)) { + continue; + } + if (preg_match('/^\s*\\$the_cow/', $line)) { + $is_perl_cowfile = true; + continue; + } + if (preg_match('/^\s*EOC\s*$/', $line)) { + continue; + } + $keep[] = $line; + } + $template = implode('', $keep); + + // Original .cow files are perl scripts which contain escaped sequences. + // We attempt to unescape here by replacing any character preceded by a + // backslash/escape with just that character. + if ($is_perl_cowfile) { + $template = preg_replace( + '/\\\\(.)/', + '$1', + $template); + } + + $template = preg_replace_callback( + '/\\$([a-z]+)/', + array($this, 'replaceTemplateVariable'), + $template); + if ($template === false) { + throw new Exception( + pht( + 'Failed to replace template variables while rendering cow!')); + } + + $lines = $this->text; + + // TODO: It would be nice to use a utf8 soft wrap here instead, but we + // do not currently have one. Soft wrap first, then force to utf8. + $lines = wordwrap($lines, $width - 4, "\n", true); + $lines = phutil_split_lines($lines, false); + foreach ($lines as $key => $line) { + $lines[$key] = phutil_utf8ize($line); + } + + if ($this->action == 'think') { + $borders = '((()))'; + } else { + if (count($lines) == 1) { + $borders = '<<<>>>'; + } else { + $borders = '/|\\\\|/'; + } + } + + $size = 0; + foreach ($lines as $line) { + $size = max(strlen($line), $size); + } + + $balloon = array(); + $balloon[] = ' '.str_repeat('_', $size + 2); + $lines = array_values($lines); + $last = (count($lines) - 1); + foreach ($lines as $idx => $line) { + if ($idx == 0) { + $l = $borders[0]; + $r = $borders[3]; + } else if ($idx == $last) { + $l = $borders[2]; + $r = $borders[5]; + } else { + $l = $borders[1]; + $r = $borders[4]; + } + $balloon[] = $l.' '.str_pad($line, $size).' '.$r; + + } + $balloon[] = ' '.str_repeat('-', $size + 2); + $balloon = implode("\n", $balloon); + + return rtrim($balloon."\n".$template); + } + + public function replaceTemplateVariable($matches) { + switch ($matches[1]) { + case 'eyes': + return str_pad($this->eyes, 2); + case 'tongue': + return str_pad($this->tongue, 2); + case 'thoughts': + return ($this->action == 'say' ? '\\' : 'o'); + default: + return $matches[0]; + } + } + + +} diff --git a/src/utils/PhutilDirectedScalarGraph.php b/src/utils/PhutilDirectedScalarGraph.php new file mode 100644 --- /dev/null +++ b/src/utils/PhutilDirectedScalarGraph.php @@ -0,0 +1,17 @@ +setSequences(str_split('ran'), str_split('rat')); + * + * $cost = $matrix->getEditDistance(); + * + * Edit distance computation is slow and requires a large amount of memory; + * both are roughly O(N * M) in the length of the strings. + * + * You can customize the cost of insertions, deletions and replacements. By + * default, each has a cost of 1. + * + * $matrix->setReplaceCost(1); + * + * By default, transpositions are not evaluated (i.e., the algorithm is + * Levenshtein). You can cause transpositions to be evaluated by setting a + * transpose cost (which will change the algorithm to Damerau-Levenshtein): + * + * $matrix->setTransposeCost(1); + * + * You can also provide a cost to alter the type of operation being applied. + * Many strings have several equivalently expensive edit sequences, but one + * some sequences are more readable to humans than others. Providing a small + * cost to alter operation type tends to smooth out the sequence and produce + * long runs of a single operation, which are generally more readable. For + * example, these strings: + * + * (x) + * ((x)) + * + * ...have edit strings "issis" and "isssi", which describe edit operations with + * the same cost, but the latter string is more comprehensible to human viewers. + * + * If you set an alter cost, you must call @{method:setComputeString} to enable + * type computation. The alter cost should generally be smaller than `c / N`, + * where `c` is the smallest operational cost and `N` is the length of the + * longest string. For example, if you are using the default costs (insert = 1, + * delete = 1, replace = 1) and computing edit distances for strings of fewer + * than 1,000 characters, you might set the alter cost to 0.001. + */ +final class PhutilEditDistanceMatrix extends Phobject { + + private $insertCost = 1; + private $deleteCost = 1; + private $replaceCost = 1; + private $transposeCost = null; + private $alterCost = 0; + private $maximumLength; + private $computeString; + private $applySmoothing = self::SMOOTHING_NONE; + private $reachedMaximumLength; + + private $x; + private $y; + private $prefix; + private $suffix; + + private $distanceMatrix = null; + private $typeMatrix = null; + + const SMOOTHING_NONE = 'none'; + const SMOOTHING_INTERNAL = 'internal'; + const SMOOTHING_FULL = 'full'; + + public function setMaximumLength($maximum_length) { + $this->maximumLength = $maximum_length; + return $this; + } + + public function getMaximumLength() { + return coalesce($this->maximumLength, $this->getInfinity()); + } + + public function didReachMaximumLength() { + return $this->reachedMaximumLength; + } + + public function setComputeString($compute_string) { + $this->computeString = $compute_string; + return $this; + } + + public function getComputeString() { + return $this->computeString; + } + + public function setTransposeCost($transpose_cost) { + $this->transposeCost = $transpose_cost; + return $this; + } + + public function getTransposeCost() { + return $this->transposeCost; + } + + public function setReplaceCost($replace_cost) { + $this->replaceCost = $replace_cost; + return $this; + } + + public function getReplaceCost() { + return $this->replaceCost; + } + + public function setDeleteCost($delete_cost) { + $this->deleteCost = $delete_cost; + return $this; + } + + public function getDeleteCost() { + return $this->deleteCost; + } + + public function setInsertCost($insert_cost) { + $this->insertCost = $insert_cost; + return $this; + } + + public function getInsertCost() { + return $this->insertCost; + } + + public function setAlterCost($alter_cost) { + $this->alterCost = $alter_cost; + return $this; + } + + public function getAlterCost() { + return $this->alterCost; + } + + public function setApplySmoothing($apply_smoothing) { + $this->applySmoothing = $apply_smoothing; + return $this; + } + + public function getApplySmoothing() { + return $this->applySmoothing; + } + + public function setSequences(array $x, array $y) { + + // NOTE: We strip common prefixes and suffixes from the inputs because + // the runtime of the edit distance algorithm is large and it is common + // to diff similar strings. + + $xl = count($x); + $yl = count($y); + $l = min($xl, $yl); + + $prefix_l = 0; + $suffix_l = 0; + + for ($ii = 0; $ii < $l; $ii++) { + if ($x[$ii] !== $y[$ii]) { + break; + } + $prefix_l++; + } + + for ($ii = 1; $ii <= ($l - $prefix_l); $ii++) { + if ($x[$xl - $ii] !== $y[$yl - $ii]) { + break; + } + $suffix_l++; + } + + $this->prefix = array_slice($x, 0, $prefix_l); + $this->suffix = array_slice($x, $xl - $suffix_l); + + $this->x = array_slice($x, $prefix_l, $xl - ($suffix_l + $prefix_l)); + $this->y = array_slice($y, $prefix_l, $yl - ($suffix_l + $prefix_l)); + $this->distanceMatrix = null; + + return $this; + } + + private function requireSequences() { + if ($this->x === null) { + throw new PhutilInvalidStateException('setSequences'); + } + } + + public function getEditDistance() { + $this->requireSequences(); + + $x = $this->x; + $y = $this->y; + + if (!$x) { + return $this->insertCost * count($y); + } + + if (!$y) { + return $this->deleteCost * count($x); + } + + $max = $this->getMaximumLength(); + if (count($x) > $max || count($y) > $max) { + $this->reachedMaximumLength = true; + return ($this->insertCost * count($y)) + ($this->deleteCost * count($x)); + } + + if ($x === $y) { + return 0; + } + + $matrix = $this->getDistanceMatrix(); + + return $matrix[count($x)][count($y)]; + } + + /** + * Return a string representing the edits between the sequences. The string + * has these characters: + * + * - s (same): Same character in both strings. + * - i (insert): Character inserted. + * - d (delete): Character deleted. + * - x (replace): Character replaced. + * - t (transpose): Character transposed. + */ + public function getEditString() { + $this->requireSequences(); + + $x = $this->x; + $y = $this->y; + + if (!$x && !$y) { + return $this->padEditString(''); + } + + if (!$x) { + return $this->padEditString(str_repeat('i', count($y))); + } + + if (!$y) { + return $this->padEditString(str_repeat('d', count($x))); + } + + if ($x === $y) { + return $this->padEditString(str_repeat('s', count($x))); + } + + $max = $this->getMaximumLength(); + if (count($x) > $max || count($y) > $max) { + $this->reachedMaximumLength = true; + return $this->padEditString( + str_repeat('d', count($x)). + str_repeat('i', count($y))); + } + + $matrix = $this->getTypeMatrix(); + + $xx = count($x); + $yy = count($y); + + $transposes = array(); + $str = ''; + while (true) { + $type = $matrix[$xx][$yy]; + + if (is_array($type)) { + $chr = 't'; + $transposes[$type[0]][$type[1]] = true; + $type = $type[2]; + } else { + $chr = $type; + } + + if (isset($transposes[$xx][$yy])) { + $chr = 't'; + } + + if ($type == 's' || $type == 'x') { + $xx -= 1; + $yy -= 1; + } else if ($type == 'i') { + $yy -= 1; + } else if ($type == 'd') { + $xx -= 1; + } else { + throw new Exception(pht("Unknown type '%s' in type matrix.", $type)); + } + + $str .= $chr; + + if ($xx <= 0 && $yy <= 0) { + break; + } + } + + $str = strrev($str); + + // For full smoothing, we pad the edit string before smoothing it, so + // ranges of similar characters at the beginning or end of the string can + // also be smoothed. + + // For internal smoothing, we only smooth ranges within the change itself. + + $smoothing = $this->getApplySmoothing(); + switch ($smoothing) { + case self::SMOOTHING_FULL: + $str = $this->padEditString($str); + $str = $this->applySmoothing($str, true); + break; + case self::SMOOTHING_INTERNAL: + $str = $this->applySmoothing($str, false); + $str = $this->padEditString($str); + break; + case self::SMOOTHING_NONE: + $str = $this->padEditString($str); + break; + default: + throw new Exception( + pht( + 'Unknown smoothing type "%s".', + $smoothing)); + } + + return $str; + } + + private function padEditString($str) { + if ($this->prefix) { + $str = str_repeat('s', count($this->prefix)).$str; + } + if ($this->suffix) { + $str = $str.str_repeat('s', count($this->suffix)); + } + return $str; + } + + private function getTypeMatrix() { + if (!$this->computeString) { + throw new PhutilInvalidStateException('setComputeString'); + } + if ($this->typeMatrix === null) { + $this->computeMatrix($this->x, $this->y); + } + return $this->typeMatrix; + } + + private function getDistanceMatrix() { + if ($this->distanceMatrix === null) { + $this->computeMatrix($this->x, $this->y); + } + return $this->distanceMatrix; + } + + private function computeMatrix(array $x, array $y) { + $xl = count($x); + $yl = count($y); + + $m = array(); + + $infinity = $this->getInfinity(); + + $use_damerau = ($this->transposeCost !== null); + if ($use_damerau) { + // Initialize the default cost of a transpose. + $m[-1][-1] = $infinity; + + // Initialize the character position dictionary for Damerau. + $d = array(); + foreach ($x as $c) { + $d[$c] = -1; + } + foreach ($y as $c) { + $d[$c] = -1; + } + + // Initialize the transpose costs for Damerau. + for ($xx = 0; $xx <= $xl; $xx++) { + $m[$xx][-1] = $infinity; + } + + for ($yy = 0; $yy <= $yl; $yy++) { + $m[-1][$yy] = $infinity; + } + } + + // Initialize the top row of the matrix. + for ($xx = 0; $xx <= $xl; $xx++) { + $m[$xx][0] = $xx * $this->deleteCost; + } + + // Initialize the left column of the matrix. + $cost = 0; + for ($yy = 0; $yy <= $yl; $yy++) { + $m[0][$yy] = $yy * $this->insertCost; + } + + $use_types = ($this->computeString); + if ($use_types) { + $t = array(); + for ($xx = 0; $xx <= $xl; $xx++) { + $t[$xx][0] = 'd'; + } + for ($yy = 0; $yy <= $yl; $yy++) { + $t[0][$yy] = 'i'; + } + $t[0][0] = 's'; + } + + $alt_cost = $this->getAlterCost(); + if ($alt_cost && !$use_types) { + throw new Exception( + pht( + 'If you provide an alter cost with %s, you must enable '. + 'type computation with %s.', + 'setAlterCost()', + 'setComputeStrings()')); + } + + // Build the edit distance matrix. + for ($xx = 1; $xx <= $xl; $xx++) { + $last_dy = -1; + for ($yy = 1; $yy <= $yl; $yy++) { + if ($use_damerau) { + $dx = $d[$y[$yy - 1]]; + $dy = $last_dy; + } + + if ($x[$xx - 1] === $y[$yy - 1]) { + $rep_cost = $m[$xx - 1][$yy - 1] + 0; + $rep_type = 's'; + } else { + $rep_cost = $m[$xx - 1][$yy - 1] + $this->replaceCost; + $rep_type = 'x'; + } + + $del_cost = $m[$xx - 1][$yy ] + $this->deleteCost; + $ins_cost = $m[$xx ][$yy - 1] + $this->insertCost; + if ($alt_cost) { + $del_char = $t[$xx - 1][$yy ]; + $ins_char = $t[$xx ][$yy - 1]; + $rep_char = $t[$xx - 1][$yy - 1]; + + if ($del_char !== 'd') { + $del_cost += $alt_cost; + } + if ($ins_char !== 'i') { + $ins_cost += $alt_cost; + } + if ($rep_char !== $rep_type) { + $rep_cost += $alt_cost; + } + } + + if ($rep_cost <= $del_cost && $rep_cost <= $ins_cost) { + $cost = $rep_cost; + $type = $rep_type; + if ($rep_type === 's') { + $last_dy = $yy - 1; + } + } else if ($ins_cost <= $del_cost) { + $cost = $ins_cost; + $type = 'i'; + } else { + $cost = $del_cost; + $type = 'd'; + } + + if ($use_damerau) { + $trn_count = (($xx - $dx - 2) + ($yy - $dy - 2) + 1); + $trn_cost = $m[$dx][$dy] + ($trn_count * $this->transposeCost); + if ($trn_cost < $cost) { + $cost = $trn_cost; + $type = array($dx + 1, $dy + 1, $type); + } + } + + $m[$xx][$yy] = $cost; + if ($use_types) { + $t[$xx][$yy] = $type; + } + } + + if ($use_damerau) { + $d[$x[$xx - 1]] = ($xx - 1); + } + } + + $this->distanceMatrix = $m; + if ($use_types) { + $this->typeMatrix = $t; + } + } + + private function getInfinity() { + return INF; + } + + private function printMatrix(array $m) { + $x = $this->x; + $y = $this->y; + + $p = '% 8s '; + printf($p, ' '); + foreach (head($m) as $yk => $yv) { + printf($p, idx($y, $yk - 1, '-')); + } + echo "\n"; + foreach ($m as $xk => $xv) { + printf($p, idx($x, $xk - 1, '-')); + foreach ($xv as $yk => $yv) { + printf($p, ($yv == $this->getInfinity() ? 'inf' : $yv)); + } + echo "\n"; + } + } + + private function printTypeMatrix(array $t) { + $x = $this->x; + $y = $this->y; + + $p = '% 8s '; + printf($p, ' '); + foreach (head($t) as $yk => $yv) { + printf($p, idx($y, $yk - 1, '-')); + } + echo "\n"; + foreach ($t as $xk => $xv) { + printf($p, idx($x, $xk - 1, '-')); + foreach ($xv as $yk => $yv) { + printf($p, ($yv == $this->getInfinity() ? 'inf' : $yv)); + } + echo "\n"; + } + } + + private function applySmoothing($str, $full) { + if ($full) { + $prefix = '(^|[xdi])'; + $suffix = '([xdi]|\z)'; + } else { + $prefix = '([xdi])'; + $suffix = '([xdi])'; + } + + // Smooth the string out, by replacing short runs of similar characters + // with 'x' operations. This makes the result more readable to humans, + // since there are fewer choppy runs of short added and removed substrings. + do { + $original = $str; + $str = preg_replace('/'.$prefix.'(s{3})'.$suffix.'/', '$1xxx$3', $str); + $str = preg_replace('/'.$prefix.'(s{2})'.$suffix.'/', '$1xx$3', $str); + $str = preg_replace('/'.$prefix.'(s{1})'.$suffix.'/', '$1x$3', $str); + } while ($str != $original); + + return $str; + } + +} diff --git a/src/utils/PhutilExampleBufferedIterator.php b/src/utils/PhutilExampleBufferedIterator.php new file mode 100644 --- /dev/null +++ b/src/utils/PhutilExampleBufferedIterator.php @@ -0,0 +1,32 @@ +cursor = 0; + } + + protected function loadPage() { + $result = $this->query($this->cursor, $this->getPageSize()); + $this->cursor += count($result); + return $result; + } + + public function setExampleData(array $data) { + $this->data = $data; + } + + private function query($cursor, $limit) { + // NOTE: Normally you'd load or generate results from some external source + // here. Since this is an example, we just use a premade dataset. + + return array_slice($this->data, $cursor, $limit); + } + +} diff --git a/src/utils/PhutilExecutionEnvironment.php b/src/utils/PhutilExecutionEnvironment.php new file mode 100644 --- /dev/null +++ b/src/utils/PhutilExecutionEnvironment.php @@ -0,0 +1,46 @@ +algorithm = $algorithm; + return $this; + } + + public function getAlgorithm() { + return $this->algorithm; + } + + public function getHash() { + $hash = $this->getHashResource(); + return hash_final($hash, $raw_output = false); + } + + protected function didReadValue($value) { + $hash = $this->getHashResource(); + + hash_update($hash, $value); + + return $value; + } + + private function getHashResource() { + if (!$this->hash) { + $algorithm = $this->getAlgorithm(); + $this->hash = hash_init($algorithm); + } + return $this->hash; + } + +} diff --git a/src/utils/PhutilLunarPhase.php b/src/utils/PhutilLunarPhase.php new file mode 100644 --- /dev/null +++ b/src/utils/PhutilLunarPhase.php @@ -0,0 +1,43 @@ +isFull(); + */ +final class PhutilLunarPhase extends Phobject { + + private $epoch; + + public function __construct($epoch) { + $this->epoch = $epoch; + } + + private function getPhase() { + // (Aug 11, 1999) A new moon. + $new_moon_epoch = 934354800; + + // Number of seconds in the lunar phase. + $phase_length = 2551442.8768992; + + return fmod($this->epoch - $new_moon_epoch, $phase_length) / $phase_length; + } + + public function isFull() { + return abs($this->getPhase() - 0.5) < 0.02; + } + + public function isNew() { + return $this->getPhase() < 0.02 || $this->getPhase() > 0.98; + } + + public function isWaxing() { + return $this->getPhase() < 0.5; + } + + public function isWaning() { + return $this->getPhase() > 0.5; + } + +} diff --git a/src/utils/PhutilProseDiff.php b/src/utils/PhutilProseDiff.php new file mode 100644 --- /dev/null +++ b/src/utils/PhutilProseDiff.php @@ -0,0 +1,292 @@ +parts[] = array( + 'type' => $type, + 'text' => $text, + ); + return $this; + } + + public function getParts() { + return $this->parts; + } + + /** + * Get diff parts, but replace large blocks of unchanged text with "." + * parts representing missing context. + */ + public function getSummaryParts() { + $parts = $this->getParts(); + + $head_key = head_key($parts); + $last_key = last_key($parts); + + $results = array(); + foreach ($parts as $key => $part) { + $is_head = ($key == $head_key); + $is_last = ($key == $last_key); + + switch ($part['type']) { + case '=': + $pieces = $this->splitTextForSummary($part['text']); + + if ($is_head || $is_last) { + $need = 2; + } else { + $need = 3; + } + + // We don't have enough pieces to omit anything, so just continue. + if (count($pieces) < $need) { + $results[] = $part; + break; + } + + if (!$is_head) { + $results[] = array( + 'type' => '=', + 'text' => head($pieces), + ); + } + + $results[] = array( + 'type' => '.', + 'text' => null, + ); + + if (!$is_last) { + $results[] = array( + 'type' => '=', + 'text' => last($pieces), + ); + } + break; + default: + $results[] = $part; + break; + } + } + + return $results; + } + + + public function reorderParts() { + // Reorder sequences of removed and added sections to put all the "-" + // parts together first, then all the "+" parts together. This produces + // a more human-readable result than intermingling them. + + $o_run = array(); + $n_run = array(); + $result = array(); + foreach ($this->parts as $part) { + $type = $part['type']; + switch ($type) { + case '-': + $o_run[] = $part; + break; + case '+': + $n_run[] = $part; + break; + default: + if ($o_run || $n_run) { + foreach ($this->combineRuns($o_run, $n_run) as $merged_part) { + $result[] = $merged_part; + } + $o_run = array(); + $n_run = array(); + } + $result[] = $part; + break; + } + } + + if ($o_run || $n_run) { + foreach ($this->combineRuns($o_run, $n_run) as $part) { + $result[] = $part; + } + } + + // Now, combine consecuitive runs of the same type of change (like a + // series of "-" parts) into a single run. + $combined = array(); + + $last = null; + $last_text = null; + foreach ($result as $part) { + $type = $part['type']; + + if ($last !== $type) { + if ($last !== null) { + $combined[] = array( + 'type' => $last, + 'text' => $last_text, + ); + } + $last_text = null; + $last = $type; + } + + $last_text .= $part['text']; + } + + if ($last_text !== null) { + $combined[] = array( + 'type' => $last, + 'text' => $last_text, + ); + } + + $this->parts = $combined; + + return $this; + } + + private function combineRuns($o_run, $n_run) { + $o_merge = $this->mergeParts($o_run); + $n_merge = $this->mergeParts($n_run); + + // When removed and added blocks share a prefix or suffix, we sometimes + // want to count it as unchanged (for example, if it is whitespace) but + // sometimes want to count it as changed (for example, if it is a word + // suffix like "ing"). Find common prefixes and suffixes of these layout + // characters and emit them as "=" (unchanged) blocks. + + $layout_characters = array( + ' ' => true, + "\n" => true, + '.' => true, + '!' => true, + ',' => true, + '?' => true, + ']' => true, + '[' => true, + '(' => true, + ')' => true, + '<' => true, + '>' => true, + ); + + $o_text = $o_merge['text']; + $n_text = $n_merge['text']; + $o_len = strlen($o_text); + $n_len = strlen($n_text); + $min_len = min($o_len, $n_len); + + $prefix_len = 0; + for ($pos = 0; $pos < $min_len; $pos++) { + $o = $o_text[$pos]; + $n = $n_text[$pos]; + if ($o !== $n) { + break; + } + if (empty($layout_characters[$o])) { + break; + } + $prefix_len++; + } + + $suffix_len = 0; + for ($pos = 0; $pos < ($min_len - $prefix_len); $pos++) { + $o = $o_text[$o_len - ($pos + 1)]; + $n = $n_text[$n_len - ($pos + 1)]; + if ($o !== $n) { + break; + } + if (empty($layout_characters[$o])) { + break; + } + $suffix_len++; + } + + $results = array(); + + if ($prefix_len) { + $results[] = array( + 'type' => '=', + 'text' => substr($o_text, 0, $prefix_len), + ); + } + + if ($prefix_len < $o_len) { + $results[] = array( + 'type' => '-', + 'text' => substr( + $o_text, + $prefix_len, + $o_len - $prefix_len - $suffix_len), + ); + } + + if ($prefix_len < $n_len) { + $results[] = array( + 'type' => '+', + 'text' => substr( + $n_text, + $prefix_len, + $n_len - $prefix_len - $suffix_len), + ); + } + + if ($suffix_len) { + $results[] = array( + 'type' => '=', + 'text' => substr($o_text, -$suffix_len), + ); + } + + return $results; + } + + private function mergeParts(array $parts) { + $text = ''; + $type = null; + foreach ($parts as $part) { + $part_type = $part['type']; + if ($type === null) { + $type = $part_type; + } + if ($type !== $part_type) { + throw new Exception(pht('Can not merge parts of dissimilar types!')); + } + $text .= $part['text']; + } + + return array( + 'type' => $type, + 'text' => $text, + ); + } + + private function splitTextForSummary($text) { + $matches = null; + + $ok = preg_match('/^(\n*[^\n]+)\n/', $text, $matches); + if (!$ok) { + return array($text); + } + + $head = $matches[1]; + $text = substr($text, strlen($head)); + + $ok = preg_match('/\n([^\n]+\n*)\z/', $text, $matches); + if (!$ok) { + return array($text); + } + + $last = $matches[1]; + $text = substr($text, 0, -strlen($last)); + + if (!strlen(trim($text))) { + return array($head, $last); + } else { + return array($head, $text, $last); + } + } + +} diff --git a/src/utils/PhutilProseDifferenceEngine.php b/src/utils/PhutilProseDifferenceEngine.php new file mode 100644 --- /dev/null +++ b/src/utils/PhutilProseDifferenceEngine.php @@ -0,0 +1,209 @@ +buildDiff($u, $v, 0); + } + + private function buildDiff($u, $v, $level) { + $u_parts = $this->splitCorpus($u, $level); + $v_parts = $this->splitCorpus($v, $level); + + $matrix = id(new PhutilEditDistanceMatrix()) + ->setMaximumLength(128) + ->setSequences($u_parts, $v_parts) + ->setComputeString(true); + + // For word-level and character-level changes, smooth the output string + // to reduce the choppiness of the diff. + if ($level > 1) { + $matrix->setApplySmoothing(PhutilEditDistanceMatrix::SMOOTHING_FULL); + } + + $u_pos = 0; + $v_pos = 0; + + $edits = $matrix->getEditString(); + $edits_length = strlen($edits); + + $diff = new PhutilProseDiff(); + for ($ii = 0; $ii < $edits_length; $ii++) { + $c = $edits[$ii]; + if ($c == 's') { + $diff->addPart('=', $u_parts[$u_pos]); + $u_pos++; + $v_pos++; + } else if ($c == 'd') { + $diff->addPart('-', $u_parts[$u_pos]); + $u_pos++; + } else if ($c == 'i') { + $diff->addPart('+', $v_parts[$v_pos]); + $v_pos++; + } else if ($c == 'x') { + $diff->addPart('-', $u_parts[$u_pos]); + $diff->addPart('+', $v_parts[$v_pos]); + $u_pos++; + $v_pos++; + } else { + throw new Exception( + pht( + 'Unexpected character ("%s") in edit string.', + $c)); + } + } + + $diff->reorderParts(); + + // If we just built a character-level diff, we're all done and do not + // need to go any deeper. + if ($level == 3) { + return $diff; + } + + $blocks = array(); + $block = null; + foreach ($diff->getParts() as $part) { + $type = $part['type']; + $text = $part['text']; + switch ($type) { + case '=': + if ($block) { + $blocks[] = $block; + $block = null; + } + $blocks[] = array( + 'type' => $type, + 'text' => $text, + ); + break; + case '-': + if (!$block) { + $block = array( + 'type' => '!', + 'old' => '', + 'new' => '', + ); + } + $block['old'] .= $text; + break; + case '+': + if (!$block) { + $block = array( + 'type' => '!', + 'old' => '', + 'new' => '', + ); + } + $block['new'] .= $text; + break; + } + } + + if ($block) { + $blocks[] = $block; + } + + $result = new PhutilProseDiff(); + foreach ($blocks as $block) { + $type = $block['type']; + if ($type == '=') { + $result->addPart('=', $block['text']); + } else { + $old = $block['old']; + $new = $block['new']; + if (!strlen($old) && !strlen($new)) { + // Nothing to do. + } else if (!strlen($old)) { + $result->addPart('+', $new); + } else if (!strlen($new)) { + $result->addPart('-', $old); + } else { + if ($matrix->didReachMaximumLength()) { + // If this text was too big to diff, don't try to subdivide it. + $result->addPart('-', $old); + $result->addPart('+', $new); + } else { + $subdiff = $this->buildDiff( + $old, + $new, + $level + 1); + + foreach ($subdiff->getParts() as $part) { + $result->addPart($part['type'], $part['text']); + } + } + } + } + } + + $result->reorderParts(); + + return $result; + } + + private function splitCorpus($corpus, $level) { + switch ($level) { + case 0: + // Level 0: Split into paragraphs. + $expr = '/([\n]+)/'; + break; + case 1: + // Level 1: Split into sentences. + $expr = '/([\n,!;?\.]+)/'; + break; + case 2: + // Level 2: Split into words. + $expr = '/(\s+)/'; + break; + case 3: + // Level 3: Split into characters. + return phutil_utf8v_combined($corpus); + } + + $pieces = preg_split($expr, $corpus, -1, PREG_SPLIT_DELIM_CAPTURE); + return $this->stitchPieces($pieces, $level); + } + + private function stitchPieces(array $pieces, $level) { + $results = array(); + $count = count($pieces); + for ($ii = 0; $ii < $count; $ii += 2) { + $result = $pieces[$ii]; + if ($ii + 1 < $count) { + $result .= $pieces[$ii + 1]; + } + + if ($level < 2) { + // Split pieces into separate text and whitespace sections: make one + // piece out of all the whitespace at the beginning, one piece out of + // all the actual text in the middle, and one piece out of all the + // whitespace at the end. + + $matches = null; + preg_match('/^(\s*)(.*?)(\s*)\z/', $result, $matches); + + if (strlen($matches[1])) { + $results[] = $matches[1]; + } + if (strlen($matches[2])) { + $results[] = $matches[2]; + } + if (strlen($matches[3])) { + $results[] = $matches[3]; + } + } else { + $results[] = $result; + } + } + + // If the input ended with a delimiter, we can get an empty final piece. + // Just discard it. + if (last($results) == '') { + array_pop($results); + } + + return $results; + } + +} diff --git a/src/utils/PhutilProxyIterator.php b/src/utils/PhutilProxyIterator.php new file mode 100644 --- /dev/null +++ b/src/utils/PhutilProxyIterator.php @@ -0,0 +1,57 @@ +iterator = $iterator; + } + + protected function didReadValue($value) { + return $value; + } + + +/* -( Iterator Implementation )-------------------------------------------- */ + + + final public function rewind() { + $this->iterator->rewind(); + $this->update(); + } + + final public function valid() { + return $this->valid; + } + + final public function current() { + return $this->value; + } + + final public function key() { + return $this->key; + } + + final public function next() { + $this->iterator->next(); + $this->update(); + } + + private function update() { + $this->key = $this->iterator->key(); + $this->valid = $this->iterator->valid(); + + if ($this->valid) { + $value = $this->iterator->current(); + $value = $this->didReadValue($value); + $this->value = $value; + } + } + +} diff --git a/src/utils/PhutilRope.php b/src/utils/PhutilRope.php new file mode 100644 --- /dev/null +++ b/src/utils/PhutilRope.php @@ -0,0 +1,144 @@ +length += $len; + + if ($len <= $this->segmentSize) { + $this->buffers[] = $string; + } else { + for ($cursor = 0; $cursor < $len; $cursor += $this->segmentSize) { + $this->buffers[] = substr($string, $cursor, $this->segmentSize); + } + } + + return $this; + } + + + /** + * Get the length of the rope. + * + * @return int Length of the rope in bytes. + */ + public function getByteLength() { + return $this->length; + } + + + /** + * Get an arbitrary, nonempty prefix of the rope. + * + * @return string Some rope prefix. + */ + public function getAnyPrefix() { + $result = reset($this->buffers); + if ($result === false) { + return null; + } + + return $result; + } + + + /** + * Get prefix bytes of the rope, up to some maximum size. + * + * @param int Maximum number of bytes to read. + * @return string Bytes. + */ + public function getPrefixBytes($length) { + $result = array(); + + $remaining_bytes = $length; + foreach ($this->buffers as $buf) { + $length = strlen($buf); + if ($length <= $remaining_bytes) { + $result[] = $buf; + $remaining_bytes -= $length; + } else { + $result[] = substr($buf, 0, $remaining_bytes); + $remaining_bytes = 0; + } + if (!$remaining_bytes) { + break; + } + } + + return implode('', $result); + } + + + /** + * Return the entire rope as a normal string. + * + * @return string Normal string. + */ + public function getAsString() { + return implode('', $this->buffers); + } + + + /** + * Remove a specified number of bytes from the head of the rope. + * + * @param int Bytes to remove. + * @return this + */ + public function removeBytesFromHead($remove) { + if ($remove <= 0) { + throw new InvalidArgumentException( + pht('Length must be larger than 0!')); + } + + $remaining_bytes = $remove; + foreach ($this->buffers as $key => $buf) { + $len = strlen($buf); + if ($len <= $remaining_bytes) { + unset($this->buffers[$key]); + $remaining_bytes -= $len; + if (!$remaining_bytes) { + break; + } + } else { + $this->buffers[$key] = substr($buf, $remaining_bytes); + break; + } + } + + if ($this->buffers) { + $this->length -= $remove; + } else { + $this->length = 0; + } + + return $this; + } + +} diff --git a/src/utils/PhutilSortVector.php b/src/utils/PhutilSortVector.php new file mode 100644 --- /dev/null +++ b/src/utils/PhutilSortVector.php @@ -0,0 +1,54 @@ +parts[] = sprintf('%s%020u', $prefix, $value); + return $this; + } + + public function addString($value) { + if (strlen($value) && (strpos("\0", $value) !== false)) { + throw new Exception( + pht( + 'String components of a sort vector must not contain NULL bytes.')); + } + + $this->parts[] = $value; + return $this; + } + + public function __toString() { + return implode("\0", $this->parts); + } + + /** + * This allows you to sort a list of sort vectors using @{function:msortv}. + */ + public function getSelf() { + return $this; + } + +} diff --git a/src/utils/PhutilStreamIterator.php b/src/utils/PhutilStreamIterator.php new file mode 100644 --- /dev/null +++ b/src/utils/PhutilStreamIterator.php @@ -0,0 +1,68 @@ +stream = $stream; + } + +/* -( Iterator Implementation )-------------------------------------------- */ + + + public function rewind() { + if ($this->started) { + // When you first foreach() an iterator the rewind() method gets called + // so we have to work the first time. + throw new Exception( + pht('Stream iterators can not be rewound!')); + } + + $this->started = true; + $this->naturalKey = -1; + $this->next(); + } + + public function valid() { + return ($this->data !== null); + } + + public function current() { + return $this->data; + } + + public function key() { + return $this->naturalKey; + } + + public function next() { + $stream = $this->stream; + + if (!$stream) { + return; + } + + if (feof($stream)) { + fclose($stream); + $this->stream = null; + $this->data = null; + return; + } + + $bytes = fread($stream, 64 * 1024); + if ($bytes === false) { + throw new Exception( + pht('Failed to fread() from request input stream.')); + } + + $this->data = $bytes; + $this->naturalKey++; + } + +} diff --git a/src/utils/PhutilSystem.php b/src/utils/PhutilSystem.php new file mode 100644 --- /dev/null +++ b/src/utils/PhutilSystem.php @@ -0,0 +1,164 @@ + Dictionary of memory information. + * @task memory + */ + public static function getSystemMemoryInformation() { + $meminfo_path = '/proc/meminfo'; + if (Filesystem::pathExists($meminfo_path)) { + $meminfo_data = Filesystem::readFile($meminfo_path); + return self::parseMemInfo($meminfo_data); + } else if (Filesystem::binaryExists('vm_stat')) { + list($vm_stat_stdout) = execx('vm_stat'); + return self::parseVMStat($vm_stat_stdout); + } else { + throw new Exception( + pht( + 'Unable to access %s or `%s` on this system to '. + 'get system memory information.', + '/proc/meminfo', + 'vm_stat')); + } + } + + + /** + * Parse the output of `/proc/meminfo`. + * + * See @{method:getSystemMemoryInformation}. This method is used to get memory + * information on Linux. + * + * @param string Raw `/proc/meminfo`. + * @return map Parsed memory information. + * @task memory + */ + public static function parseMemInfo($data) { + $data = phutil_split_lines($data); + + $map = array(); + foreach ($data as $line) { + list($key, $value) = explode(':', $line, 2); + $key = trim($key); + $value = trim($value); + + $matches = null; + if (preg_match('/^(\d+) kB\z/', $value, $matches)) { + $value = (int)$matches[1] * 1024; + } + + $map[$key] = $value; + } + + $expect = array( + 'MemTotal', + 'MemFree', + 'Buffers', + 'Cached', + ); + foreach ($expect as $key) { + if (!array_key_exists($key, $map)) { + throw new Exception( + pht( + 'Expected to find "%s" in "%s" output, but did not.', + $key, + '/proc/meminfo')); + } + } + + $total = $map['MemTotal']; + $free = $map['MemFree'] + $map['Buffers'] + $map['Cached']; + + return array( + 'total' => $total, + 'free' => $free, + ); + } + + + /** + * Parse the output of `vm_stat`. + * + * See @{method:getSystemMemoryInformation}. This method is used to get memory + * information on Mac OS X. + * + * @param string Raw `vm_stat` output. + * @return map Parsed memory information. + * @task memory + */ + public static function parseVMStat($data) { + $data = phutil_split_lines($data); + + $page_size = null; + $map = array(); + + foreach ($data as $line) { + list($key, $value) = explode(':', $line, 2); + $key = trim($key); + $value = trim($value); + + $matches = null; + if (preg_match('/page size of (\d+) bytes/', $value, $matches)) { + $page_size = (int)$matches[1]; + continue; + } + + $value = trim($value, '.'); + $map[$key] = $value; + } + + if (!$page_size) { + throw new Exception( + pht( + 'Expected to find "%s" in `%s` output, but did not.', + 'page size', + 'vm_stat')); + } + + $expect = array( + 'Pages free', + 'Pages active', + 'Pages inactive', + 'Pages wired down', + ); + foreach ($expect as $key) { + if (!array_key_exists($key, $map)) { + throw new Exception( + pht( + 'Expected to find "%s" in `%s` output, but did not.', + $key, + 'vm_stat')); + } + } + + // NOTE: This calculation probably isn't quite right. In particular, + // the numbers don't exactly add up, and "Pages inactive" includes a + // bunch of disk cache. So these numbers aren't totally reliable and they + // aren't directly comparable to the /proc/meminfo numbers. + + $free = $map['Pages free']; + $active = $map['Pages active']; + $inactive = $map['Pages inactive']; + $wired = $map['Pages wired down']; + + return array( + 'total' => ($free + $active + $inactive + $wired) * $page_size, + 'free' => ($free) * $page_size, + ); + } + +} diff --git a/src/utils/PhutilUTF8StringTruncator.php b/src/utils/PhutilUTF8StringTruncator.php new file mode 100644 --- /dev/null +++ b/src/utils/PhutilUTF8StringTruncator.php @@ -0,0 +1,295 @@ +setMaximumGlyphs(80) + * ->truncateString($long); + * + * Byte limits restrict the number of bytes the result may contain. They are + * appropriate when you care about how much storage a string requires. + * + * Codepoint limits restrict the number of codepoints the result may contain. + * Since codepoints may have up to 4 bytes, the resulting strings may require + * have more than this many bytes. This kind of limit is appropriate when you + * are using UTF-8 storage. + * + * Glyph limits restrict the display size of the string. Because a single glyph + * may have an arbitrary number of combining characters, this does not impose + * a storage size limit on the string: a string with only one glyph may require + * an arbitrarily large number of bytes. + * + * You can set more than one limit; the smallest limit will be used. + * + * NOTE: This function makes a best effort to apply some reasonable rules but + * will not work well for the full range of unicode languages. + */ +final class PhutilUTF8StringTruncator extends Phobject { + + private $maximumBytes; + private $maximumCodepoints; + private $maximumGlyphs; + private $minimumLimit; + + private $terminator = "\xE2\x80\xA6"; + private $terminatorBytes = 3; + private $terminatorCodepoints = 1; + private $terminatorGlyphs = 1; + + public function setMaximumBytes($maximum_bytes) { + $this->maximumBytes = $maximum_bytes; + $this->didUpdateMaxima(); + return $this; + } + + public function setMaximumCodepoints($maximum_codepoints) { + $this->maximumCodepoints = $maximum_codepoints; + $this->didUpdateMaxima(); + return $this; + } + + public function setMaximumGlyphs($maximum_glyphs) { + $this->maximumGlyphs = $maximum_glyphs; + $this->didUpdateMaxima(); + return $this; + } + + private function didUpdateMaxima() { + $this->minimumLimit = INF; + + if ($this->maximumBytes) { + $this->minimumLimit = min($this->minimumLimit, $this->maximumBytes); + } + + if ($this->maximumCodepoints) { + $this->minimumLimit = min($this->minimumLimit, $this->maximumCodepoints); + } + + if ($this->maximumGlyphs) { + $this->minimumLimit = min($this->minimumLimit, $this->maximumGlyphs); + } + } + + public function setTerminator($terminator) { + $this->terminator = $terminator; + $this->terminatorBytes = strlen($terminator); + $this->terminatorCodepoints = count(phutil_utf8v($terminator)); + $this->terminatorGlyphs = count(phutil_utf8v_combined($terminator)); + return $this; + } + + public function truncateString($string) { + // First, check if the string has fewer bytes than the most restrictive + // limit. Codepoints and glyphs always take up at least one byte, so we can + // just return the string unmodified if we're under all of the limits. + $byte_len = strlen($string); + if ($byte_len <= $this->minimumLimit) { + return $string; + } + + // We're going to vectorize the string so we can deal with it in terms + // of unicode characters. If the string is huge (like 10MB) and we are + // only extracting a tiny piece of it (like the first 1024 bytes), we + // want to avoid vectorizing the entire string in cases where there is + // no possibility that we'll need all of it. Try to compute a "hard limit": + // an upper bound on the number of bytes we can ever need to process. + + $hard_limits = array(); + if ($this->maximumBytes) { + $hard_limits[] = $this->maximumBytes; + } + + if ($this->maximumCodepoints) { + // No UTF8 character is longer than 6 bytes, so we can impose a ceiling + // if we have a codepoint limit. + $hard_limits[] = ($this->maximumCodepoints * 6); + } + + if ($hard_limits) { + // Add a few more bytes onto the end so that we have a little more of + // the string than we actually need and can get the right terminator + // behavior. + $hard_limit = max($hard_limits) + 32; + } else { + $hard_limit = null; + } + + // Build a vector of characters first. + $string_pv = phutil_utf8v($string, $hard_limit); + $point_len = count($string_pv); + + // We always need the combined vector, even if we're only doing byte or + // codepoint truncation, because we don't want to truncate to half of a + // combining character. + $string_gv = phutil_utf8v_combine_characters($string_pv); + $glyph_len = count($string_gv); + + // Now, check if we're still over the limits. For example, a string may + // be over the raw byte limit but under the glyph limit if it contains + // several multibyte characters. + + $too_long = false; + if ($this->maximumBytes && ($byte_len > $this->maximumBytes)) { + $too_long = true; + } + if ($this->maximumCodepoints && ($point_len > $this->maximumCodepoints)) { + $too_long = true; + } + if ($this->maximumGlyphs && ($glyph_len > $this->maximumGlyphs)) { + $too_long = true; + } + + if (!$too_long) { + return $string; + } + + // This string is legitimately longer than at least one of the limits, so + // we need to truncate it. Find the minimum cutoff point: this is the last + // glyph we can possibly return while satisfying the limits and having space + // for the terminator. + + $cutoff = $glyph_len; + if ($this->maximumBytes) { + if ($byte_len <= $this->maximumBytes) { + $cutoff = $glyph_len; + } else { + $bytes = $this->terminatorBytes; + for ($ii = 0; $ii < $glyph_len; $ii++) { + $bytes += strlen($string_gv[$ii]); + if ($bytes > $this->maximumBytes) { + $cutoff = $ii; + break; + } + } + } + } + + if ($this->maximumCodepoints) { + if ($point_len <= $this->maximumCodepoints) { + $cutoff = min($cutoff, $glyph_len); + } else { + $points = 0; + for ($ii = 0; $ii < $glyph_len; $ii++) { + $glyph_bytes = strlen($string_gv[$ii]); + while ($points < $point_len) { + $glyph_bytes -= strlen($string_pv[$points]); + $points++; + if ($glyph_bytes <= 0) { + break; + } + } + $points_total = $points + $this->terminatorCodepoints; + if ($points_total > $this->maximumCodepoints) { + $cutoff = min($cutoff, $ii); + break; + } + } + } + } + + if ($this->maximumGlyphs) { + if ($glyph_len <= $this->maximumGlyphs) { + $cutoff = min($cutoff, $glyph_len); + } else { + $cutoff = min($cutoff, $this->maximumGlyphs - $this->terminatorGlyphs); + } + } + + // If we don't have enough characters for anything, just return the + // terminator. + if ($cutoff <= 0) { + return $this->terminator; + } + + // Otherwise, we're going to try to cut the string off somewhere reasonable + // rather than somewhere arbitrary. + + // NOTE: This is not complete, and there are many other word boundary + // characters and reasonable places to break words in the UTF-8 character + // space. For now, this gives us reasonable behavior for latin languages. We + // don't necessarily have access to PCRE+Unicode so there isn't a great way + // for us to look up character attributes. + + // If we encounter these, prefer to break on them instead of cutting the + // string off in the middle of a word. + static $break_characters = array( + ' ' => true, + "\n" => true, + ';' => true, + ':' => true, + '[' => true, + '(' => true, + ',' => true, + '-' => true, + ); + + // If we encounter these, shorten to this character exactly without + // appending the terminal. + static $stop_characters = array( + '.' => true, + '!' => true, + '?' => true, + ); + + // Search backward in the string, looking for reasonable places to break it. + $word_boundary = null; + $stop_boundary = null; + $any_nonboundary = false; + + // If we do a word break with a terminal, we have to look beyond at least + // the number of characters in the terminal. If the terminal is longer than + // the required length, we'll skip this whole block and return it on its + // own. + + // Only search backward for a while. At some point we don't get a better + // result by looking through the whole string, and if this is "MMM..." or + // a non-latin language without word break characters we're just wasting + // time. + + // See PHI654. We also only look for a break near the end of the text, + // relative to the length of the text. If the text is something like + // "O123: MMMMMM..." or "See path/to/long/thing", we want to cut the very + // long word in half, not just render "O123..." or "See...". + + $search = max(0, $cutoff - 256, $cutoff / 2); + for ($ii = min($cutoff, $glyph_len - 1); $ii >= $search; $ii--) { + $c = $string_gv[$ii]; + + if (isset($break_characters[$c])) { + $word_boundary = $ii; + } else if (isset($stop_characters[$c])) { + $stop_boundary = $ii + 1; + break; + } else { + $any_nonboundary = true; + if ($word_boundary !== null) { + break; + } + } + } + + if ($stop_boundary !== null) { + // We found a character like ".". Cut the string there, without appending + // the terminal. + $string_part = array_slice($string_gv, 0, $stop_boundary); + return implode('', $string_part); + } + + // If we didn't find any boundary characters or we found ONLY boundary + // characters, just break at the maximum character length. + if ($word_boundary === null || !$any_nonboundary) { + $word_boundary = $cutoff; + } + + $string_part = array_slice($string_gv, 0, $word_boundary); + $string_part = implode('', $string_part); + + return $string_part.$this->terminator; + } + +} diff --git a/src/utils/__tests__/AbstractDirectedGraphTestCase.php b/src/utils/__tests__/AbstractDirectedGraphTestCase.php new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/AbstractDirectedGraphTestCase.php @@ -0,0 +1,179 @@ + array(), + ); + + $cycle = $this->findGraphCycle($graph); + $this->assertEqual(null, $cycle, pht('Trivial Graph')); + } + + public function testNoncyclicGraph() { + $graph = array( + 'A' => array('B', 'C'), + 'B' => array('D'), + 'C' => array(), + 'D' => array(), + ); + + $cycle = $this->findGraphCycle($graph); + $this->assertEqual(null, $cycle, pht('Noncyclic Graph')); + } + + public function testTrivialCyclicGraph() { + $graph = array( + 'A' => array('A'), + ); + + $cycle = $this->findGraphCycle($graph); + $this->assertEqual(array('A', 'A'), $cycle, pht('Trivial Cycle')); + } + + public function testCyclicGraph() { + $graph = array( + 'A' => array('B', 'C'), + 'B' => array('D'), + 'C' => array('E', 'F'), + 'D' => array(), + 'E' => array(), + 'F' => array('G', 'C'), + 'G' => array(), + ); + + $cycle = $this->findGraphCycle($graph); + $this->assertEqual(array('A', 'C', 'F', 'C'), $cycle, pht('Cyclic Graph')); + } + + public function testNonTreeGraph() { + // This graph is non-cyclic, but C is both a child and a grandchild of A. + // This is permitted. + $graph = array( + 'A' => array('B', 'C'), + 'B' => array('C'), + 'C' => array(), + ); + + $cycle = $this->findGraphCycle($graph); + $this->assertEqual(null, $cycle, pht('Non-tree graph')); + } + + public function testEdgeLoadFailure() { + $graph = array( + 'A' => array('B'), + ); + + $raised = null; + try { + $this->findGraphCycle($graph); + } catch (Exception $ex) { + $raised = $ex; + } + + $this->assertTrue( + (bool)$raised, + pht('Exception raised by unloadable edges.')); + } + + public function testTopographicSortTree() { + $graph = array( + 'A' => array('B', 'C'), + 'B' => array('D', 'E'), + 'C' => array(), + 'D' => array(), + 'E' => array(), + ); + + $sorted = $this->getTopographicSort($graph); + + $this->assertEqual( + array('A', 'C', 'B', 'E', 'D'), + $sorted, + pht('Topographically sorted tree.')); + + $graph = array( + 'A' => array('B', 'C'), + 'B' => array('C'), + 'C' => array('D', 'E'), + 'D' => array('E'), + 'E' => array(), + ); + + $sorted = $this->getTopographicSort($graph); + + $this->assertEqual( + array('A', 'B', 'C', 'D', 'E'), + $sorted, + pht('Topographically sorted tree with nesting.')); + } + + public function testBestEffortTopographicSortTree() { + $graph = array( + 'A' => array('B', 'C'), + 'B' => array('D', 'E'), + 'C' => array(), + 'D' => array(), + 'E' => array(), + 'F' => array('H'), + 'G' => array('F', 'E'), + 'H' => array('G'), + ); + + $sorted = $this->getBestEffortTopographicSort($graph); + + $this->assertEqual(count($graph), count($sorted)); + + $this->assertEqual('C', $sorted[0]['node']); + $this->assertEqual('D', $sorted[1]['node']); + $this->assertEqual('E', $sorted[2]['node']); + $this->assertEqual('B', $sorted[3]['node']); + $this->assertEqual('A', $sorted[4]['node']); + $this->assertEqual('F', $sorted[5]['node']); + $this->assertEqual('G', $sorted[6]['node']); + $this->assertEqual('H', $sorted[7]['node']); + + $this->assertEqual(0, $sorted[0]['depth']); + $this->assertEqual(0, $sorted[1]['depth']); + $this->assertEqual(0, $sorted[2]['depth']); + $this->assertEqual(1, $sorted[3]['depth']); + $this->assertEqual(2, $sorted[4]['depth']); + $this->assertEqual(3, $sorted[5]['depth']); + $this->assertEqual(3, $sorted[6]['depth']); + $this->assertEqual(3, $sorted[7]['depth']); + + $this->assertEqual(false, $sorted[0]['cycle']); + $this->assertEqual(false, $sorted[1]['cycle']); + $this->assertEqual(false, $sorted[2]['cycle']); + $this->assertEqual(false, $sorted[3]['cycle']); + $this->assertEqual(false, $sorted[4]['cycle']); + $this->assertEqual(true, $sorted[5]['cycle']); + $this->assertEqual(true, $sorted[6]['cycle']); + $this->assertEqual(true, $sorted[7]['cycle']); + } + + private function findGraphCycle(array $graph, $seed = 'A', $search = 'A') { + $detector = new TestAbstractDirectedGraph(); + $detector->setTestData($graph); + $detector->addNodes(array_select_keys($graph, array($seed))); + $detector->loadGraph(); + return $detector->detectCycles($search); + } + + private function getTopographicSort(array $graph, $seed = 'A') { + $detector = new TestAbstractDirectedGraph(); + $detector->setTestData($graph); + $detector->addNodes(array_select_keys($graph, array($seed))); + $detector->loadGraph(); + return $detector->getTopographicallySortedNodes(); + } + + private function getBestEffortTopographicSort(array $graph) { + $detector = new TestAbstractDirectedGraph(); + $detector->setTestData($graph); + $detector->addNodes(array_keys($graph)); + return $detector->getBestEffortTopographicallySortedNodes(); + } + +} diff --git a/src/utils/__tests__/CaseInsensitiveArrayTestCase.php b/src/utils/__tests__/CaseInsensitiveArrayTestCase.php new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/CaseInsensitiveArrayTestCase.php @@ -0,0 +1,109 @@ +assertEqual(0, count($array)); + + $array['key'] = 'foo'; + $this->assertEqual(1, count($array)); + + $array['KEY'] = 'bar'; + $this->assertEqual(1, count($array)); + } + + public function testGetKeys() { + $input = array( + 'key' => true, + 'KEY' => true, + 'kEy' => true, + + 'foo' => false, + 'value' => false, + ); + $expected = array( + 'key', + 'foo', + 'value', + ); + + $array = new CaseInsensitiveArray($input); + $this->assertEqual($expected, $array->getKeys()); + } + + public function testOffsetExists() { + $input = array('key' => 'value'); + $expectations = array( + 'key' => true, + 'KEY' => true, + 'kEy' => true, + + 'foo' => false, + 'value' => false, + ); + + $array = new CaseInsensitiveArray($input); + + foreach ($expectations as $key => $expectation) { + if ($expectation) { + $this->assertTrue(isset($array[$key])); + } else { + $this->assertFalse(isset($array[$key])); + } + } + } + + public function testOffsetGet() { + $input = array('key' => 'value'); + $expectations = array( + 'key' => 'value', + 'KEY' => 'value', + 'kEy' => 'value', + + 'foo' => null, + 'value' => null, + ); + + $array = new CaseInsensitiveArray($input); + + foreach ($expectations as $key => $expectation) { + $this->assertEqual($expectation, @$array[$key]); + } + } + + public function testOffsetSet() { + $input = array(); + $data = array( + 'key' => 'foo', + 'KEY' => 'bar', + 'kEy' => 'baz', + ); + $expected = array('key' => 'baz'); + + $array = new CaseInsensitiveArray($input); + + foreach ($data as $key => $value) { + $array[$key] = $value; + } + + $this->assertEqual($expected, $array->toArray()); + } + + public function testOffsetUnset() { + $input = array('key' => 'value'); + $data = array( + 'KEY', + ); + $expected = array(); + + $array = new CaseInsensitiveArray($input); + + foreach ($data as $key) { + unset($array[$key]); + } + + $this->assertEqual($expected, $array->toArray()); + } + +} diff --git a/src/utils/__tests__/MFilterTestHelper.php b/src/utils/__tests__/MFilterTestHelper.php new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/MFilterTestHelper.php @@ -0,0 +1,27 @@ +h = $h_value; + $this->i = $i_value; + $this->j = $j_value; + } + + public function getH() { + return $this->h; + } + + public function getI() { + return $this->i; + } + + public function getJ() { + return $this->j; + } + +} diff --git a/src/utils/__tests__/PhutilArrayTestCase.php b/src/utils/__tests__/PhutilArrayTestCase.php new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/PhutilArrayTestCase.php @@ -0,0 +1,72 @@ +assertEqual(0, $a[99]); + $a[99] = 1; + $this->assertEqual(1, $a[99]); + + $a->setDefaultValue('default'); + $this->assertEqual('default', $a['key']); + + $this->assertEqual( + array( + 99 => 1, + 'key' => 'default', + ), + $a->toArray()); + + $init = array( + 'apple' => 'red', + ); + + $b = new PhutilArrayWithDefaultValue($init); + $this->assertEqual($init, $b->toArray()); + + $fruits = array( + 'apple', + 'cherry', + 'banana', + 'cherry', + 'cherry', + 'apple', + 'banana', + 'plum', + 'cherry', + 'cherry', + ); + + $counts = new PhutilArrayWithDefaultValue(); + foreach ($fruits as $fruit) { + $counts[$fruit] += 1; + } + $this->assertEqual( + array( + 'apple' => 2, + 'cherry' => 5, + 'banana' => 2, + 'plum' => 1, + ), + $counts->toArray()); + + $masks = array( + 1, + 2, + 4, + ); + + $bitmask = new PhutilArrayWithDefaultValue(); + foreach ($masks as $mask) { + $bitmask['value'] |= $mask; + } + + $this->assertEqual(7, $bitmask['value']); + } + +} diff --git a/src/utils/__tests__/PhutilBufferedIteratorTestCase.php b/src/utils/__tests__/PhutilBufferedIteratorTestCase.php new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/PhutilBufferedIteratorTestCase.php @@ -0,0 +1,25 @@ +setPageSize(3); + $iterator->setExampleData($expect); + + $results = array(); + foreach ($iterator as $key => $value) { + $results[$key] = $value; + } + + $this->assertEqual( + $expect, + $results); + } + +} diff --git a/src/utils/__tests__/PhutilChunkedIteratorTestCase.php b/src/utils/__tests__/PhutilChunkedIteratorTestCase.php new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/PhutilChunkedIteratorTestCase.php @@ -0,0 +1,29 @@ + 1, 1 => 3), + array(2 => 5), + ); + + $iterator = new PhutilChunkedIterator( + new ArrayIterator(array(1, 3, 5)), + 2); + + $this->assertEqual( + $expect, + iterator_to_array($iterator)); + + for ($i = 0; $i < 2; $i++) { + foreach ($iterator as $key => $actual) { + $this->assertEqual(idx($expect, $key), $actual); + } + } + } + +} diff --git a/src/utils/__tests__/PhutilCowsayTestCase.php b/src/utils/__tests__/PhutilCowsayTestCase.php new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/PhutilCowsayTestCase.php @@ -0,0 +1,60 @@ +setTemplate($template); + + if (idx($spec, 'text') !== null) { + $cowsay->setText($spec['text']); + } + + if (idx($spec, 'eyes') !== null) { + $cowsay->setEyes($spec['eyes']); + } + + if (idx($spec, 'tongue') !== null) { + $cowsay->setTongue($spec['tongue']); + } + + if (idx($spec, 'action') !== null) { + $cowsay->setAction($spec['action']); + } + + $actual = $cowsay->renderCow(); + + $this->assertEqual( + rtrim($expect), + rtrim($actual), + pht('Cowsay Test Case "%s"', $test)); + } + } + +} diff --git a/src/utils/__tests__/PhutilEditDistanceMatrixTestCase.php b/src/utils/__tests__/PhutilEditDistanceMatrixTestCase.php new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/PhutilEditDistanceMatrixTestCase.php @@ -0,0 +1,207 @@ +assertDistance(0, '', ''); + $this->assertDistance(27, '', 'xxx', 9); + $this->assertDistance(27, 'xxx', '', 1, 9); + + // Both inputs identical. + $this->assertDistance(0, 'x', 'x'); + $this->assertDistance(0, 'xyzabc', 'xyzabc'); + + // Simple edits. + $this->assertDistance(1, 'cat', 'car'); + $this->assertDistance(1, 'cat', 'cut'); + $this->assertDistance(1, 'cat', 'bat'); + $this->assertDistance(2, 'cat', 'bar'); + $this->assertDistance(3, 'cat', 'dog'); + + // Inserts. + $this->assertDistance(1, 'cat', 'cats'); + $this->assertDistance(1, 'cat', 'cast'); + $this->assertDistance(1, 'cat', 'xcat'); + $this->assertDistance(1, 'cat', 'cxat'); + + // Deletes. + $this->assertDistance(1, 'cat', 'ca'); + $this->assertDistance(1, 'cat', 'ct'); + $this->assertDistance(1, 'cat', 'at'); + + // Replacements. + $this->assertDistance(1, 'xxxxx', 'xxxxy'); + $this->assertDistance(1, 'xxxxx', 'xxyxx'); + $this->assertDistance(1, 'yxxxx', 'xxxxx'); + + // Costs. + $this->assertDistance(27, 'x', 'xxxx', 9); + $this->assertDistance(27, 'xxxx', 'x', 1, 9); + $this->assertDistance(27, 'xxxxx', 'xyyyx', 5, 5, 9); + + // Misc. + $this->assertDistance( + 13, + 'The quick brown fox jumped over the lazy dog!', + // dddddd r ii i iii + 'The brown fox pumped over those lazy dogs!~~~'); + } + + public function testDamerauEditDistance() { + + // Simple adjacent transpositions. + $this->assertDistance(1, 'abcd', 'abdc', 3, 3, 3, 1); + $this->assertDistance(1, 'abcd', 'bacd', 3, 3, 3, 1); + $this->assertDistance(2, 'abcd', 'badc', 3, 3, 3, 1); + + // Transpositions with other edits. + $this->assertDistance(7, 'abcd', 'baaa', 3, 3, 3, 1); + $this->assertDistance(7, 'abcd', 'babb', 3, 3, 3, 1); + + // Sequences of adjacent transpositions. + $this->assertDistance(3, 'abcd', 'cbad', 3, 3, 3, 1); + $this->assertDistance(5, 'abcd', 'dbca', 3, 3, 3, 1); + + // Misc. + $this->assertDistance( + 11, + 'Cozy lummox gives smart squid who asks for job pen.', + // t d r i i i ttt ii + 'Cozy lummxo give smarp squid, whom tasks for boj a pen.'); + } + + public function testEditString() { + $this->assertEditString('', '', ''); + $this->assertEditString('iii', '', 'aaa'); + $this->assertEditString('ddd', 'aaa', ''); + + $this->assertEditString('sss', 'aaa', 'aaa'); + $this->assertEditString( + 'xssisssisx', + 'Qz(ab)zQ', + 'Rz((ab))zR', + 1, 1, 1, null, 0.001); + + $this->assertEditString('xxs', 'cat', 'rot'); + + $this->assertEditString( + 'xxsssxxsssixsxxxsssdssssssssxssxsixsissssddddsdxxsssss', + 'Cozy lummox gives smart squid who asks for job pen.', + 'Lazy hammock takes mart squad that basks in pen.'); + } + + public function testDamerauEditString() { + $this->assertEditString('xxss', 'land', 'alnd'); + $this->assertEditString('ttss', 'land', 'alnd', 1, 1, 1, 1); + $this->assertEditString('tsts', 'land', 'nald', 3, 3, 3, 1); + } + + public function testEditMatrixMaximumLength() { + // These tests are hitting the maximum length limit; the expected costs + // and strings are degenerate. + + $matrix = id(new PhutilEditDistanceMatrix()) + ->setInsertCost(3) + ->setDeleteCost(7) + ->setMaximumLength(1) + ->setSequences(array('X', 'a', 'a', 'Y'), array('Q', 'a', 'a', 'R')); + + $this->assertEqual( + 40, + $matrix->getEditDistance()); + + $this->assertEqual( + 'ddddiiii', + $matrix->getEditString()); + + $matrix = id(new PhutilEditDistanceMatrix()) + ->setInsertCost(3) + ->setDeleteCost(7) + ->setMaximumLength(1) + ->setSequences( + array('f', 'f', 'X', 'a', 'a', 'Y', 'g', 'g'), + array('f', 'f', 'Q', 'a', 'a', 'R', 'g', 'g')); + + $this->assertEqual( + 40, + $matrix->getEditDistance()); + + $this->assertEqual( + 'ssddddiiiiss', + $matrix->getEditString()); + } + + private function assertDistance( + $expect, + $x, $y, + $ins = 1, $del = 1, + $rep = 1, $trn = null, + $alt = 0) { + + $matrix = $this->buildMatrix($x, $y, $ins, $del, $rep, $trn, $alt); + $cost = $matrix->getEditDistance(); + + $desc = array($ins, $del, $rep, ($trn === null ? '-' : $trn)); + $desc = implode(', ', $desc); + + $this->assertEqual( + $expect, + $cost, + pht( + "Edit distance of '%s' -> '%s' with costs (%s).", + $x, + $y, + $desc)); + } + + private function assertEditString( + $expect, + $x, $y, + $ins = 1, $del = 1, + $rep = 1, $trn = null, + $alt = 0) { + + $matrix = $this->buildMatrix($x, $y, $ins, $del, $rep, $trn, $alt); + $matrix->setComputeString(true); + + $string = $matrix->getEditString(); + + $desc = array($ins, $del, $rep); + $desc[] = ($trn === null ? '-' : $trn); + $desc[] = ($alt === 0 ? '-' : $alt); + $desc = implode(', ', $desc); + + $this->assertEqual( + $expect, + $string, + pht( + "Edit string of '%s' -> '%s' with costs (%s).", + $x, + $y, + $desc)); + } + + private function buildMatrix($x, $y, $ins, $del, $rep, $trn, $alt) { + if (!strlen($x)) { + $xv = array(); + } else { + $xv = str_split($x); + } + + if (!strlen($y)) { + $yv = array(); + } else { + $yv = str_split($y); + } + + return id(new PhutilEditDistanceMatrix()) + ->setSequences($xv, $yv) + ->setInsertCost($ins) + ->setDeleteCost($del) + ->setReplaceCost($rep) + ->setTransposeCost($trn) + ->setAlterCost($alt); + } + +} diff --git a/src/utils/__tests__/PhutilHashingIteratorTestCase.php b/src/utils/__tests__/PhutilHashingIteratorTestCase.php new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/PhutilHashingIteratorTestCase.php @@ -0,0 +1,45 @@ +setAlgorithm($algorithm); + + $rope = new PhutilRope(); + foreach ($hashing_iterator as $block) { + $rope->append($block); + } + + $expect_data = Filesystem::readFile($path); + $actual_data = $rope->getAsString(); + + $this->assertEqual( + $expect_data, + $actual_data, + pht('Data should be read correctly.')); + + $expect_hash = + 'd50af03db6c8b63084664f352d12bffb8f58022bdd67e3aba21f01e11c3b8939'; + + $single_hash = hash($algorithm, $expect_data, $raw_output = false); + $actual_hash = $hashing_iterator->getHash(); + + $this->assertEqual( + $expect_hash, + $single_hash, + pht('Expected hash should match freshly computed hash.')); + + $this->assertEqual( + $expect_hash, + $actual_hash, + pht('Expected hash should also match iterator actual hash.')); + } + +} diff --git a/src/utils/__tests__/PhutilLunarPhaseTestCase.php b/src/utils/__tests__/PhutilLunarPhaseTestCase.php new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/PhutilLunarPhaseTestCase.php @@ -0,0 +1,58 @@ +assertFalse($moon->isFull()); + $this->assertTrue($moon->isNew()); + $this->assertTrue($moon->isWaxing()); + $this->assertFalse($moon->isWaning()); + + // May 22, 2005 + $moon = new PhutilLunarPhase(1116745200); + $this->assertTrue($moon->isFull()); + $this->assertFalse($moon->isNew()); + $this->assertTrue($moon->isWaxing()); + $this->assertFalse($moon->isWaning()); + + // May 23, 2005 + $moon = new PhutilLunarPhase(1116831600); + $this->assertTrue($moon->isFull()); + $this->assertFalse($moon->isNew()); + $this->assertFalse($moon->isWaxing()); + $this->assertTrue($moon->isWaning()); + + // May 30, 2005 + $moon = new PhutilLunarPhase(1117436400); + $this->assertFalse($moon->isFull()); + $this->assertFalse($moon->isNew()); + $this->assertFalse($moon->isWaxing()); + $this->assertTrue($moon->isWaning()); + + // June 05, 2005 + $moon = new PhutilLunarPhase(1117954800); + $this->assertFalse($moon->isFull()); + $this->assertFalse($moon->isNew()); + $this->assertFalse($moon->isWaxing()); + $this->assertTrue($moon->isWaning()); + + // June 06, 2005 + $moon = new PhutilLunarPhase(1118041200); + $this->assertFalse($moon->isFull()); + $this->assertTrue($moon->isNew()); + $this->assertFalse($moon->isWaxing()); + $this->assertTrue($moon->isWaning()); + + // Oct 4, 2013 + $moon = new PhutilLunarPhase(1380897327); + $this->assertFalse($moon->isFull()); + $this->assertTrue($moon->isNew()); + $this->assertTrue($moon->isWaxing()); + $this->assertFalse($moon->isWaning()); + + } + + +} diff --git a/src/utils/__tests__/PhutilProseDiffTestCase.php b/src/utils/__tests__/PhutilProseDiffTestCase.php new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/PhutilProseDiffTestCase.php @@ -0,0 +1,245 @@ +assertProseParts( + '', + '', + array(), + pht('Empty')); + + $this->assertProseParts( + "xxx\nyyy", + "xxx\nzzz\nyyy", + array( + "= xxx\n", + "+ zzz\n", + '= yyy', + ), + pht('Add Paragraph')); + + $this->assertProseParts( + "xxx\nzzz\nyyy", + "xxx\nyyy", + array( + "= xxx\n", + "- zzz\n", + '= yyy', + ), + pht('Remove Paragraph')); + + + // Without smoothing, the alogorithm identifies that "shark" and "cat" + // both contain the letter "a" and tries to express this as a very + // fine-grained edit which replaces "sh" with "c" and then "rk" with "t". + // This is technically correct, but it is much easier for human viewers to + // parse if we smooth this into a single removal and a single addition. + + $this->assertProseParts( + 'They say the shark has nine lives.', + 'They say the cat has nine lives.', + array( + '= They say the ', + '- shark', + '+ cat', + '= has nine lives.', + ), + pht('"Shark/cat" word edit smoothenss.')); + + $this->assertProseParts( + 'Rising quickly, she says', + 'Rising quickly, she remarks:', + array( + '= Rising quickly, she ', + '- says', + '+ remarks:', + ), + pht('"Says/remarks" word edit smoothenss.')); + + $this->assertProseParts( + 'See screenshots', + 'Viewed video files', + array( + '- See screenshots', + '+ Viewed video files', + ), + pht('Complete paragraph rewrite.')); + + $this->assertProseParts( + 'xaaax', + 'xbbbx', + array( + '- xaaax', + '+ xbbbx', + ), + pht('Whole word rewrite with common prefix and suffix.')); + + $this->assertProseParts( + ' aaa ', + ' bbb ', + array( + '= ', + '- aaa', + '+ bbb', + '= ', + ), + pht('Whole word rewrite with whitespace prefix and suffix.')); + + $this->assertSummaryProseParts( + "a\nb\nc\nd\ne\nf\ng\nh\n", + "a\nb\nc\nd\nX\nf\ng\nh\n", + array( + '.', + "= d\n", + '- e', + '+ X', + "= \nf", + '.', + ), + pht('Summary diff with middle change.')); + + $this->assertSummaryProseParts( + "a\nb\nc\nd\ne\nf\ng\nh\n", + "X\nb\nc\nd\ne\nf\ng\nh\n", + array( + '- a', + '+ X', + "= \nb", + '.', + ), + pht('Summary diff with head change.')); + + $this->assertSummaryProseParts( + "a\nb\nc\nd\ne\nf\ng\nh\n", + "a\nb\nc\nd\ne\nf\ng\nX\n", + array( + '.', + "= g\n", + '- h', + '+ X', + "= \n", + ), + pht('Summary diff with last change.')); + + $this->assertProseParts( + 'aaa aaa aaa aaa, bbb bbb bbb bbb.', + "aaa aaa aaa aaa, bbb bbb bbb bbb.\n\n- ccc ccc ccc", + array( + '= aaa aaa aaa aaa, bbb bbb bbb bbb.', + "+ \n\n- ccc ccc ccc", + ), + pht('Diff with new trailing content.')); + + $this->assertProseParts( + 'aaa aaa aaa aaa, bbb bbb bbb bbb.', + 'aaa aaa aaa aaa bbb bbb bbb bbb.', + array( + '= aaa aaa aaa aaa', + '- ,', + '= bbb bbb bbb bbb.', + ), + pht('Diff with a removed comma.')); + + $this->assertProseParts( + 'aaa aaa aaa aaa, bbb bbb bbb bbb.', + "aaa aaa aaa aaa bbb bbb bbb bbb.\n\n- ccc ccc ccc!", + array( + '= aaa aaa aaa aaa', + '- ,', + '= bbb bbb bbb bbb.', + "+ \n\n- ccc ccc ccc!", + ), + pht('Diff with a removed comma and new trailing content.')); + + $this->assertProseParts( + '[ ] Walnuts', + '[X] Walnuts', + array( + '= [', + '- ', + '+ X', + '= ] Walnuts', + ), + pht('Diff adding a tickmark to a checkbox list.')); + + $this->assertProseParts( + '[[ ./week49 ]]', + '[[ ./week50 ]]', + array( + '= [[ ./week', + '- 49', + '+ 50', + '= ]]', + ), + pht('Diff changing a remarkup wiki link target.')); + + // Create a large corpus with many sentences and paragraphs. + $large_paragraph = 'xyz. '; + $large_paragraph = str_repeat($large_paragraph, 50); + $large_paragraph = rtrim($large_paragraph); + + $large_corpus = $large_paragraph."\n\n"; + $large_corpus = str_repeat($large_corpus, 50); + $large_corpus = rtrim($large_corpus); + + $this->assertProseParts( + $large_corpus, + "aaa\n\n".$large_corpus."\n\nzzz", + array( + "+ aaa\n\n", + '= '.$large_corpus, + "+ \n\nzzz", + ), + pht('Adding initial and final lines to a large corpus.')); + + } + + private function assertProseParts($old, $new, array $expect_parts, $label) { + $engine = new PhutilProseDifferenceEngine(); + $diff = $engine->getDiff($old, $new); + + $parts = $diff->getParts(); + + $this->assertParts($expect_parts, $parts, $label); + } + + private function assertSummaryProseParts( + $old, + $new, + array $expect_parts, + $label) { + + $engine = new PhutilProseDifferenceEngine(); + $diff = $engine->getDiff($old, $new); + + $parts = $diff->getSummaryParts(); + + $this->assertParts($expect_parts, $parts, $label); + } + + private function assertParts( + array $expect, + array $actual_parts, + $label) { + + $actual = array(); + foreach ($actual_parts as $actual_part) { + $type = $actual_part['type']; + $text = $actual_part['text']; + + switch ($type) { + case '.': + $actual[] = $type; + break; + default: + $actual[] = "{$type} {$text}"; + break; + } + } + + $this->assertEqual($expect, $actual, $label); + } + + +} diff --git a/src/utils/__tests__/PhutilRopeTestCase.php b/src/utils/__tests__/PhutilRopeTestCase.php new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/PhutilRopeTestCase.php @@ -0,0 +1,56 @@ +append('aaa'); + $rope->append('bbb'); + + $this->assertEqual(6, $rope->getByteLength()); + $this->assertEqual('aaabbb', $rope->getAsString()); + + $rope->removeBytesFromHead(2); + + $this->assertEqual(4, $rope->getByteLength()); + $this->assertEqual('abbb', $rope->getAsString()); + + $rope->removeBytesFromHead(4); + + $this->assertEqual(0, $rope->getByteLength()); + $this->assertEqual('', $rope->getAsString()); + } + + public function testMoreRopeOperations() { + $rope = new PhutilRope(); + $rope->append('aaa'); + $rope->append('bbb'); + $rope->append('ccc'); + $rope->append('rrrrddddddddd'); + $rope->removeBytesFromHead(4); + + $string = $rope->getAsString(); + $this->assertEqual('bbcccrrrrddddddddd', $string); + $this->assertEqual(strlen($string), $rope->getByteLength()); + + $rope = new PhutilRope(); + $rope->append('aaa'); + $rope->append('bbb'); + $rope->removeBytesFromHead(6); + + $string = $rope->getAsString(); + $this->assertEqual('', $string); + $this->assertEqual(0, $rope->getByteLength()); + + + $rope = new PhutilRope(); + $rope->append('a'); + $rope->append('b'); + $rope->append('c'); + $rope->removeBytesFromHead(1024); + + $string = $rope->getAsString(); + $this->assertEqual('', $string); + $this->assertEqual(0, $rope->getByteLength()); + } +} diff --git a/src/utils/__tests__/PhutilSystemTestCase.php b/src/utils/__tests__/PhutilSystemTestCase.php new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/PhutilSystemTestCase.php @@ -0,0 +1,43 @@ + array( + 'total' => 16503578624, + 'free' => 1732366336, + ), + ); + + $dir = dirname(__FILE__).'/memory'; + foreach ($tests as $input => $expect) { + $raw = Filesystem::readFile($dir.'/'.$input); + $actual = PhutilSystem::parseVMStat($raw); + $this->assertEqual( + $expect, + $actual, + pht('Parse of "%s".', $input)); + } + } + + public function testParseMeminfo() { + $tests = array( + 'meminfo.ubuntu14.txt' => array( + 'total' => 7843336192, + 'free' => 3758297088, + ), + ); + + $dir = dirname(__FILE__).'/memory'; + foreach ($tests as $input => $expect) { + $raw = Filesystem::readFile($dir.'/'.$input); + $actual = PhutilSystem::parseMemInfo($raw); + $this->assertEqual( + $expect, + $actual, + pht('Parse of "%s".', $input)); + } + } + +} diff --git a/src/utils/__tests__/PhutilUTF8TestCase.php b/src/utils/__tests__/PhutilUTF8TestCase.php new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/PhutilUTF8TestCase.php @@ -0,0 +1,813 @@ +assertEqual($input, phutil_utf8ize($input)); + } + + public function testUTF8izeUTF8Ignored() { + $input = "\xc3\x9c \xc3\xbc \xe6\x9d\xb1!"; + $this->assertEqual($input, phutil_utf8ize($input)); + } + + public function testUTF8izeLongStringNosegfault() { + // For some reason my laptop is segfaulting on long inputs inside + // preg_match(). Forestall this craziness in the common case, at least. + phutil_utf8ize(str_repeat('x', 1024 * 1024)); + $this->assertTrue(true); + } + + public function testUTF8izeInvalidUTF8Fixed() { + $input = + "\xc3 this has \xe6\x9d some invalid utf8 \xe6"; + $expect = + "\xEF\xBF\xBD this has \xEF\xBF\xBD\xEF\xBF\xBD some invalid utf8 ". + "\xEF\xBF\xBD"; + $result = phutil_utf8ize($input); + $this->assertEqual($expect, $result); + } + + public function testUTF8izeOwlIsCuteAndFerocious() { + // This was once a ferocious owl when we used to use "?" as the replacement + // character instead of U+FFFD, but now he is sort of not as cute or + // ferocious. + $input = "M(o\xEE\xFF\xFFo)M"; + $expect = "M(o\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBDo)M"; + $result = phutil_utf8ize($input); + $this->assertEqual($expect, $result); + } + + public function testOverlongFormFiltering() { + $bad = "\xEF\xBF\xBD"; + + $map = array( + 'quack' => 'quack', + + // This is U+1000, a valid character. + "\xE1\x80\x80" => "\xE1\x80\x80", + + // This is a 2-byte encoding of U+0000. + "\xC0\x80" => "{$bad}{$bad}", + + // This is a 3-byte encoding of U+0020. + "\xE0\x80\xA0" => "{$bad}{$bad}{$bad}", + + "A \xE0\x83\x83" => "A {$bad}{$bad}{$bad}", + ); + + foreach ($map as $input => $expect) { + $actual = phutil_utf8ize($input); + $this->assertEqual( + $expect, + $actual, + pht('Overlong form canonicalization of: %s', $input)); + } + } + + public function testSurrogateFiltering() { + $bad = "\xEF\xBF\xBD"; + + $map = array( + "A \xED\xA9\x98" => "A {$bad}{$bad}{$bad}", + ); + + foreach ($map as $input => $expect) { + $actual = phutil_utf8ize($input); + $this->assertEqual( + $expect, + $actual, + pht('Surrogate filtering: %s', $input)); + } + } + + + public function testUTF8CodepointEncoding() { + $map = array( + 0x20 => ' ', + 0x7E => '~', + 0xE9 => "\xC3\xA9", + 0x2603 => "\xE2\x98\x83", + 0x1F417 => "\xF0\x9F\x90\x97", + ); + + foreach ($map as $input => $expect) { + $actual = phutil_utf8_encode_codepoint($input); + $this->assertEqual( + $expect, + $actual, + pht('UTF8 codepoint encoding of "%s".', $input)); + } + } + + public function testUTF8len() { + $strings = array( + '' => 0, + 'x' => 1, + "\xEF\xBF\xBD" => 1, + "x\xe6\x9d\xb1y" => 3, + 'xyz' => 3, + 'quack' => 5, + ); + foreach ($strings as $str => $expect) { + $this->assertEqual($expect, phutil_utf8_strlen($str), 'Length of '.$str); + } + } + + public function testUTF8v() { + $strings = array( + '' => array(), + 'x' => array('x'), + 'quack' => array('q', 'u', 'a', 'c', 'k'), + "x\xe6\x9d\xb1y" => array('x', "\xe6\x9d\xb1", 'y'), + + // This is a combining character. + "x\xCD\xA0y" => array('x', "\xCD\xA0", 'y'), + ); + foreach ($strings as $str => $expect) { + $this->assertEqual($expect, phutil_utf8v($str), 'Vector of '.$str); + } + } + + public function testUTF8vCodepoints() { + $strings = array( + '' => array(), + 'x' => array(0x78), + 'quack' => array(0x71, 0x75, 0x61, 0x63, 0x6B), + "x\xe6\x9d\xb1y" => array(0x78, 0x6771, 0x79), + + "\xC2\xBB" => array(0x00BB), + "\xE2\x98\x83" => array(0x2603), + "\xEF\xBF\xBF" => array(0xFFFF), + "\xF0\x9F\x92\xA9" => array(0x1F4A9), + + // This is a combining character. + "x\xCD\xA0y" => array(0x78, 0x0360, 0x79), + ); + foreach ($strings as $str => $expect) { + $this->assertEqual( + $expect, + phutil_utf8v_codepoints($str), + pht('Codepoint Vector of %s', $str)); + } + } + + public function testUTF8ConsoleStrlen() { + $strings = array( + '' => 0, + "\0" => 0, + 'x' => 1, + + // Double-width chinese character. + "\xe6\x9d\xb1" => 2, + + // Combining character. + "x\xCD\xA0y" => 2, + + // Combining plus double-width. + "\xe6\x9d\xb1\xCD\xA0y" => 3, + + // Colors and formatting. + "\x1B[1mx\x1B[m" => 1, + "\x1B[1m\x1B[31mx\x1B[m" => 1, + ); + foreach ($strings as $str => $expect) { + $this->assertEqual( + $expect, + phutil_utf8_console_strlen($str), + pht('Console Length of %s', $str)); + } + } + + public function testUTF8shorten() { + $inputs = array( + array('1erp derp derp', 9, '', '1erp derp'), + array('2erp derp derp', 12, '...', '2erp derp...'), + array('derpxderpxderp', 12, '...', 'derpxderp...'), + array("derp\xE2\x99\x83derpderp", 12, '...', "derp\xE2\x99\x83derp..."), + array('', 12, '...', ''), + array('derp', 12, '...', 'derp'), + array('11111', 5, '2222', '11111'), + array('111111', 5, '2222', '12222'), + + array('D1rp. Derp derp.', 7, '...', 'D1rp.'), + + // "D2rp." is a better shortening of this, but it's dramatically more + // complicated to implement with the newer byte/glyph/character + // shortening code. + array('D2rp. Derp derp.', 5, '...', 'D2...'), + array('D3rp. Derp derp.', 4, '...', 'D...'), + array('D4rp. Derp derp.', 14, '...', 'D4rp. Derp...'), + array('D5rpderp, derp derp', 16, '...', 'D5rpderp...'), + array('D6rpderp, derp derp', 17, '...', 'D6rpderp, derp...'), + + // Strings with combining characters. + array("Gr\xCD\xA0mpyCatSmiles", 8, '...', "Gr\xCD\xA0mpy..."), + array("X\xCD\xA0\xCD\xA0\xCD\xA0Y", 1, '', "X\xCD\xA0\xCD\xA0\xCD\xA0"), + + array( + 'Derp, supercalafragalisticexpialadoshus', + 30, + '...', + 'Derp, supercalafragalistice...', + ), + + // If a string has only word-break characters in it, we should just cut + // it, not produce only the terminal. + array('((((((((((', 8, '...', '(((((...'), + + // Terminal is longer than requested input. + array('derp', 3, 'quack', 'quack'), + + array( + 'O123: com/oracle/java/path/to/application/source/ThingFactory.java', + 32, + '...', + 'O123: com/oracle/java/path/to...', + ), + ); + + foreach ($inputs as $input) { + list($string, $length, $terminal, $expect) = $input; + $result = id(new PhutilUTF8StringTruncator()) + ->setMaximumGlyphs($length) + ->setTerminator($terminal) + ->truncateString($string); + $this->assertEqual($expect, $result, pht('Shortening of %s', $string)); + } + } + + public function testUTF8StringTruncator() { + $cases = array( + array( + "o\xCD\xA0o\xCD\xA0o\xCD\xA0o\xCD\xA0o\xCD\xA0", + 6, + "o\xCD\xA0!", + 6, + "o\xCD\xA0o\xCD\xA0!", + 6, + "o\xCD\xA0o\xCD\xA0o\xCD\xA0o\xCD\xA0o\xCD\xA0", + ), + array( + "X\xCD\xA0\xCD\xA0\xCD\xA0Y", + 6, + '!', + 6, + "X\xCD\xA0\xCD\xA0\xCD\xA0Y", + 6, + "X\xCD\xA0\xCD\xA0\xCD\xA0Y", + ), + array( + "X\xCD\xA0\xCD\xA0\xCD\xA0YZ", + 6, + '!', + 5, + "X\xCD\xA0\xCD\xA0\xCD\xA0!", + 2, + "X\xCD\xA0\xCD\xA0\xCD\xA0!", + ), + array( + "\xE2\x98\x83\xE2\x98\x83\xE2\x98\x83\xE2\x98\x83", + 4, + "\xE2\x98\x83!", + 3, + "\xE2\x98\x83\xE2\x98\x83!", + 3, + "\xE2\x98\x83\xE2\x98\x83!", + ), + ); + + foreach ($cases as $case) { + list($input, $b_len, $b_out, $p_len, $p_out, $g_len, $g_out) = $case; + + $result = id(new PhutilUTF8StringTruncator()) + ->setMaximumBytes($b_len) + ->setTerminator('!') + ->truncateString($input); + $this->assertEqual($b_out, $result, pht('byte-short of %s', $input)); + + $result = id(new PhutilUTF8StringTruncator()) + ->setMaximumCodepoints($p_len) + ->setTerminator('!') + ->truncateString($input); + $this->assertEqual($p_out, $result, pht('codepoint-short of %s', $input)); + + $result = id(new PhutilUTF8StringTruncator()) + ->setMaximumGlyphs($g_len) + ->setTerminator('!') + ->truncateString($input); + $this->assertEqual($g_out, $result, pht('glyph-short of %s', $input)); + } + } + + public function testUTF8LargeTruncation() { + // This is testing that our performance is reasonable when truncating a + // large input into a small output. Runtime should be on the order of the + // output size, not the input size. + + $whale = "\xF0\x9F\x90\xB3"; + $input = str_repeat($whale, 1024 * 1024); + + $result = id(new PhutilUTF8StringTruncator()) + ->setMaximumBytes(16) + ->setTerminator('!') + ->truncateString($input); + + $this->assertEqual( + str_repeat($whale, 3).'!', + $result, + pht('Large truncation.')); + } + + public function testUTF8Wrap() { + $inputs = array( + array( + 'aaaaaaa', + 3, + array( + 'aaa', + 'aaa', + 'a', + ), + ), + array( + 'aaaaaaa', + 3, + array( + 'aaa', + 'aaa', + 'a', + ), + ), + array( + 'aa&aaaa', + 3, + array( + 'aa&', + 'aaa', + 'a', + ), + ), + array( + "aa\xe6\x9d\xb1aaaa", + 3, + array( + "aa\xe6\x9d\xb1", + 'aaa', + 'a', + ), + ), + array( + '', + 80, + array( + ), + ), + array( + 'a', + 80, + array( + 'a', + ), + ), + ); + + foreach ($inputs as $input) { + list($string, $width, $expect) = $input; + $this->assertEqual( + $expect, + phutil_utf8_hard_wrap_html($string, $width), + pht("Wrapping of '%s'.", $string)); + } + } + + public function testUTF8NonHTMLWrap() { + $inputs = array( + array( + 'aaaaaaa', + 3, + array( + 'aaa', + 'aaa', + 'a', + ), + ), + array( + 'abracadabra!', + 4, + array( + 'abra', + 'cada', + 'bra!', + ), + ), + array( + '', + 10, + array( + ), + ), + array( + 'a', + 20, + array( + 'a', + ), + ), + array( + "aa\xe6\x9d\xb1aaaa", + 3, + array( + "aa\xe6\x9d\xb1", + 'aaa', + 'a', + ), + ), + array( + "mmm\nmmm\nmmmm", + 3, + array( + 'mmm', + 'mmm', + 'mmm', + 'm', + ), + ), + ); + + foreach ($inputs as $input) { + list($string, $width, $expect) = $input; + $this->assertEqual( + $expect, + phutil_utf8_hard_wrap($string, $width), + pht("Wrapping of '%s'", $string)); + } + } + + public function testUTF8ConvertParams() { + $caught = null; + try { + phutil_utf8_convert('', 'utf8', ''); + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue((bool)$caught, pht('Requires source encoding.')); + + $caught = null; + try { + phutil_utf8_convert('', '', 'utf8'); + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue((bool)$caught, pht('Requires target encoding.')); + } + + + public function testUTF8Convert() { + if (!function_exists('mb_convert_encoding')) { + $this->assertSkipped(pht('Requires %s extension.', 'mbstring')); + } + + // "[ae]gis se[n]or [(c)] 1970 [+/-] 1 [degree]" + $input = "\xE6gis SE\xD1OR \xA9 1970 \xB11\xB0"; + $expect = "\xC3\xA6gis SE\xC3\x91OR \xC2\xA9 1970 \xC2\xB11\xC2\xB0"; + $output = phutil_utf8_convert($input, 'UTF-8', 'ISO-8859-1'); + + $this->assertEqual($expect, $output, pht('Conversion from ISO-8859-1.')); + + $caught = null; + try { + phutil_utf8_convert('xyz', 'moon language', 'UTF-8'); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue((bool)$caught, pht('Conversion with bogus encoding.')); + } + + + public function testUTF8ucwords() { + $tests = array( + '' => '', + 'x' => 'X', + 'X' => 'X', + 'five short graybles' => 'Five Short Graybles', + 'xXxSNiPeRKiLLeRxXx' => 'XXxSNiPeRKiLLeRxXx', + ); + + foreach ($tests as $input => $expect) { + $this->assertEqual( + $expect, + phutil_utf8_ucwords($input), + 'phutil_utf8_ucwords("'.$input.'")'); + } + } + + public function testUTF8strtolower() { + $tests = array( + '' => '', + 'a' => 'a', + 'A' => 'a', + '!' => '!', + 'OMG!~ LOLolol ROFLwaffle11~' => 'omg!~ lololol roflwaffle11~', + "\xE2\x98\x83" => "\xE2\x98\x83", + ); + + foreach ($tests as $input => $expect) { + $this->assertEqual( + $expect, + phutil_utf8_strtolower($input), + 'phutil_utf8_strtolower("'.$input.'")'); + } + } + + public function testUTF8strtoupper() { + $tests = array( + '' => '', + 'a' => 'A', + 'A' => 'A', + '!' => '!', + 'Cats have 9 lives.' => 'CATS HAVE 9 LIVES.', + "\xE2\x98\x83" => "\xE2\x98\x83", + ); + + foreach ($tests as $input => $expect) { + $this->assertEqual( + $expect, + phutil_utf8_strtoupper($input), + 'phutil_utf8_strtoupper("'.$input.'")'); + } + } + + public function testUTF8IsCombiningCharacter() { + $character = "\xCD\xA0"; + $this->assertEqual( + true, + phutil_utf8_is_combining_character($character)); + + $character = 'a'; + $this->assertEqual( + false, + phutil_utf8_is_combining_character($character)); + } + + public function testUTF8vCombined() { + // Empty string. + $string = ''; + $this->assertEqual(array(), phutil_utf8v_combined($string)); + + // Single character. + $string = 'x'; + $this->assertEqual(array('x'), phutil_utf8v_combined($string)); + + // No combining characters. + $string = 'cat'; + $this->assertEqual(array('c', 'a', 't'), phutil_utf8v_combined($string)); + + // String with a combining character in the middle. + $string = "ca\xCD\xA0t"; + $this->assertEqual( + array('c', "a\xCD\xA0", 't'), + phutil_utf8v_combined($string)); + + // String starting with a combined character. + $string = "c\xCD\xA0at"; + $this->assertEqual( + array("c\xCD\xA0", 'a', 't'), + phutil_utf8v_combined($string)); + + // String with trailing combining character. + $string = "cat\xCD\xA0"; + $this->assertEqual( + array('c', 'a', "t\xCD\xA0"), + phutil_utf8v_combined($string)); + + // String with muliple combined characters. + $string = "c\xCD\xA0a\xCD\xA0t\xCD\xA0"; + $this->assertEqual( + array("c\xCD\xA0", "a\xCD\xA0", "t\xCD\xA0"), + phutil_utf8v_combined($string)); + + // String with multiple combining characters. + $string = "ca\xCD\xA0\xCD\xA0t"; + $this->assertEqual( + array('c', "a\xCD\xA0\xCD\xA0", 't'), + phutil_utf8v_combined($string)); + + // String beginning with a combining character. + $string = "\xCD\xA0\xCD\xA0c"; + $this->assertEqual( + array(" \xCD\xA0\xCD\xA0", 'c'), + phutil_utf8v_combined($string)); + } + + public function testUTF8BMPSegfaults() { + // This test case fails by segfaulting, or passes by not segfaulting. See + // the function implementation for details. + $input = str_repeat("\xEF\xBF\xBF", 1024 * 32); + phutil_is_utf8_with_only_bmp_characters($input); + + $this->assertTrue(true); + } + + public function testCJK() { + $map = array( + '' => false, + 'a' => false, + '.' => false, + "\xE2\x98\x83" => false, + "\xE5\xA0\xB1" => true, + ); + + foreach ($map as $input => $expect) { + $actual = phutil_utf8_is_cjk($input); + + $this->assertEqual($expect, $actual, pht('CJK: "%s"', $input)); + } + } + + public function testUTF8BMP() { + $tests = array( + '' => array( + true, + true, + pht('empty string'), + ), + 'a' => array( + true, + true, + 'a', + ), + "a\xCD\xA0\xCD\xA0" => array( + true, + true, + pht('%s with combining', 'a'), + ), + "\xE2\x98\x83" => array( + true, + true, + pht('snowman'), + ), + + // This is the last character in BMP, U+FFFF. + "\xEF\xBF\xBF" => array( + true, + true, + 'U+FFFF', + ), + + // This isn't valid. + "\xEF\xBF\xC0" => array( + false, + false, + pht('Invalid, byte range.'), + ), + + // This is an invalid nonminimal representation. + "\xF0\x81\x80\x80" => array( + false, + false, + pht('Nonminimal 4-byte character.'), + ), + + // This is the first character above BMP, U+10000. + "\xF0\x90\x80\x80" => array( + true, + false, + 'U+10000', + ), + "\xF0\x9D\x84\x9E" => array( + true, + false, + 'gclef', + ), + + "musical \xF0\x9D\x84\x9E g-clef" => array( + true, + false, + pht('gclef text'), + ), + "\xF0\x9D\x84" => array( + false, + false, + pht('Invalid, truncated.'), + ), + + "\xE0\x80\x80" => array( + false, + false, + pht('Nonminimal 3-byte character.'), + ), + + // Partial BMP characters. + "\xCD" => array( + false, + false, + pht('Partial 2-byte character.'), + ), + "\xE0\xA0" => array( + false, + false, + pht('Partial BMP 0xE0 character.'), + ), + "\xE2\x98" => array( + false, + false, + pht('Partial BMP cahracter.'), + ), + ); + + foreach ($tests as $input => $test) { + list($expect_utf8, $expect_bmp, $test_name) = $test; + + // Depending on what's installed on the system, this may use an + // extension. + $this->assertEqual( + $expect_utf8, + phutil_is_utf8($input), + pht('is_utf(%s)', $test_name)); + + // Also test this against the pure PHP implementation, explicitly. + $this->assertEqual( + $expect_utf8, + phutil_is_utf8_slowly($input), + pht('is_utf_slowly(%s)', $test_name)); + + $this->assertEqual( + $expect_bmp, + phutil_is_utf8_with_only_bmp_characters($input), + pht('is_utf_bmp(%s)', $test_name)); + } + } + + public function testSystemLocaleManagement() { + $original_locale = phutil_get_system_locale(); + $this->assertTrue( + (strlen($original_locale) > 0), + pht('System has some identifiable locale.')); + + $this->assertFalse( + phutil_is_system_locale_available('duck.quack'), + pht('Imaginary locale should be unavailable.')); + + $this->assertEqual( + $original_locale, + phutil_get_system_locale(), + pht('Testing locale availability should not change the locale.')); + + $this->assertTrue( + phutil_is_system_locale_available($original_locale), + pht('The current locale should be available.')); + + $caught = null; + try { + phutil_set_system_locale('duck.quack'); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue( + ($caught instanceof Exception), + pht('Setting an imaginary locale should raise an exception.')); + + // We need two locales for the next part because one of them might be the + // current locale, and we want to make sure we can actually change the + // locale value. + + // If the current locale was "zz_ZZ", and then we do this: + // + // set_locale("zz_ZZ"); + // assert("zz_ZZ" == get_locale()); + // + // ...the test could pass even if "set_locale(...)" does nothing. + + $has_us = phutil_is_system_locale_available('en_US.UTF-8'); + $has_gb = phutil_is_system_locale_available('en_GB.UTF-8'); + if (!$has_us || !$has_gb) { + $this->assertSkipped( + pht( + 'System does not have en_US + en_GB to do locale adjustment '. + 'tests.')); + } + + phutil_set_system_locale('en_US.UTF-8'); + $this->assertEqual( + 'en_US.UTF-8', + phutil_get_system_locale(), + pht('Set locale to en_US.')); + + phutil_set_system_locale('en_GB.UTF-8'); + $this->assertEqual( + 'en_GB.UTF-8', + phutil_get_system_locale(), + pht('Set locale to en_GB.')); + + // Put things back the way they were. + phutil_set_system_locale($original_locale); + } + +} diff --git a/src/utils/__tests__/PhutilUtilsTestCase.php b/src/utils/__tests__/PhutilUtilsTestCase.php new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/PhutilUtilsTestCase.php @@ -0,0 +1,885 @@ +assertTrue($caught instanceof InvalidArgumentException); + } + + + public function testMFilterWithEmptyValueFiltered() { + $a = new MFilterTestHelper('o', 'p', 'q'); + $b = new MFilterTestHelper('o', '', 'q'); + $c = new MFilterTestHelper('o', 'p', 'q'); + + $list = array( + 'a' => $a, + 'b' => $b, + 'c' => $c, + ); + + $actual = mfilter($list, 'getI'); + $expected = array( + 'a' => $a, + 'c' => $c, + ); + + $this->assertEqual($expected, $actual); + } + + public function testMFilterWithEmptyValueNegateFiltered() { + $a = new MFilterTestHelper('o', 'p', 'q'); + $b = new MFilterTestHelper('o', '', 'q'); + $c = new MFilterTestHelper('o', 'p', 'q'); + + $list = array( + 'a' => $a, + 'b' => $b, + 'c' => $c, + ); + + $actual = mfilter($list, 'getI', true); + $expected = array( + 'b' => $b, + ); + + $this->assertEqual($expected, $actual); + } + + public function testIFilterInvalidIndexThrowException() { + $caught = null; + try { + ifilter(array(), null); + } catch (InvalidArgumentException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof InvalidArgumentException); + } + + public function testIFilterWithEmptyValueFiltered() { + $list = array( + 'a' => array('h' => 'o', 'i' => 'p', 'j' => 'q'), + 'b' => array('h' => 'o', 'i' => '', 'j' => 'q'), + 'c' => array('h' => 'o', 'i' => 'p', 'j' => 'q'), + 'd' => array('h' => 'o', 'i' => 0, 'j' => 'q'), + 'e' => array('h' => 'o', 'i' => null, 'j' => 'q'), + 'f' => array('h' => 'o', 'i' => false, 'j' => 'q'), + ); + + $actual = ifilter($list, 'i'); + $expected = array( + 'a' => array('h' => 'o', 'i' => 'p', 'j' => 'q'), + 'c' => array('h' => 'o', 'i' => 'p', 'j' => 'q'), + ); + + $this->assertEqual($expected, $actual); + } + + public function testIFilterIndexNotExistsAllFiltered() { + $list = array( + 'a' => array('h' => 'o', 'i' => 'p', 'j' => 'q'), + 'b' => array('h' => 'o', 'i' => '', 'j' => 'q'), + ); + + $actual = ifilter($list, 'NoneExisting'); + $expected = array(); + + $this->assertEqual($expected, $actual); + } + + + public function testIFilterWithEmptyValueNegateFiltered() { + $list = array( + 'a' => array('h' => 'o', 'i' => 'p', 'j' => 'q'), + 'b' => array('h' => 'o', 'i' => '', 'j' => 'q'), + 'c' => array('h' => 'o', 'i' => 'p', 'j' => 'q'), + 'd' => array('h' => 'o', 'i' => 0, 'j' => 'q'), + 'e' => array('h' => 'o', 'i' => null, 'j' => 'q'), + 'f' => array('h' => 'o', 'i' => false, 'j' => 'q'), + ); + + $actual = ifilter($list, 'i', true); + $expected = array( + 'b' => array('h' => 'o', 'i' => '', 'j' => 'q'), + 'd' => array('h' => 'o', 'i' => 0, 'j' => 'q'), + 'e' => array('h' => 'o', 'i' => null, 'j' => 'q'), + 'f' => array('h' => 'o', 'i' => false, 'j' => 'q'), + ); + + $this->assertEqual($expected, $actual); + } + + public function testIFilterIndexNotExistsNotFiltered() { + $list = array( + 'a' => array('h' => 'o', 'i' => 'p', 'j' => 'q'), + 'b' => array('h' => 'o', 'i' => '', 'j' => 'q'), + ); + + $actual = ifilter($list, 'NoneExisting', true); + $expected = array( + 'a' => array('h' => 'o', 'i' => 'p', 'j' => 'q'), + 'b' => array('h' => 'o', 'i' => '', 'j' => 'q'), + ); + + $this->assertEqual($expected, $actual); + } + + public function testmergevMergingBasicallyWorksCorrectly() { + $this->assertEqual( + array(), + array_mergev( + array( + // + ))); + + $this->assertEqual( + array(), + array_mergev( + array( + array(), + array(), + array(), + ))); + + $this->assertEqual( + array(1, 2, 3, 4, 5), + array_mergev( + array( + array(1, 2), + array(3), + array(), + array(4, 5), + ))); + + $not_valid = array( + 'scalar' => array(1), + 'array plus scalar' => array(array(), 1), + 'null' => array(null), + ); + + foreach ($not_valid as $key => $invalid_input) { + $caught = null; + try { + array_mergev($invalid_input); + } catch (InvalidArgumentException $ex) { + $caught = $ex; + } + + $this->assertTrue( + ($caught instanceof InvalidArgumentException), + pht('%s invalid on %s', 'array_mergev()', $key)); + } + } + + public function testNonempty() { + $this->assertEqual( + 'zebra', + nonempty(false, null, 0, '', array(), 'zebra')); + + $this->assertEqual( + null, + nonempty()); + + $this->assertEqual( + false, + nonempty(null, false)); + + $this->assertEqual( + null, + nonempty(false, null)); + } + + protected function tryAssertInstancesOfArray($input) { + assert_instances_of($input, 'array'); + } + + protected function tryAssertInstancesOfStdClass($input) { + assert_instances_of($input, 'stdClass'); + } + + public function testAssertInstancesOf() { + $object = new stdClass(); + $inputs = array( + 'empty' => array(), + 'stdClass' => array($object, $object), + __CLASS__ => array($object, $this), + 'array' => array(array(), array()), + 'integer' => array($object, 1), + ); + + $this->tryTestCases( + $inputs, + array(true, true, false, false, false), + array($this, 'tryAssertInstancesOfStdClass'), + 'InvalidArgumentException'); + + $this->tryTestCases( + $inputs, + array(true, false, false, true, false), + array($this, 'tryAssertInstancesOfArray'), + 'InvalidArgumentException'); + } + + public function testAssertStringLike() { + $this->assertEqual( + null, + assert_stringlike(null)); + + $this->assertEqual( + null, + assert_stringlike('')); + + $this->assertEqual( + null, + assert_stringlike('Hello World')); + + $this->assertEqual( + null, + assert_stringlike(1)); + + $this->assertEqual( + null, + assert_stringlike(9.9999)); + + $this->assertEqual( + null, + assert_stringlike(true)); + + $obj = new Exception('.'); + $this->assertEqual( + null, + assert_stringlike($obj)); + + $obj = (object)array(); + + try { + assert_stringlike($obj); + } catch (InvalidArgumentException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof InvalidArgumentException); + + $array = array( + 'foo' => 'bar', + 'bar' => 'foo', + ); + + try { + assert_stringlike($array); + } catch (InvalidArgumentException $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof InvalidArgumentException); + + $tmp = new TempFile(); + $resource = fopen($tmp, 'r'); + + try { + assert_stringlike($resource); + } catch (InvalidArgumentException $ex) { + $caught = $ex; + } + + fclose($resource); + + $this->assertTrue($caught instanceof InvalidArgumentException); + } + + public function testCoalesce() { + $this->assertEqual( + 'zebra', + coalesce(null, 'zebra')); + + $this->assertEqual( + null, + coalesce()); + + $this->assertEqual( + false, + coalesce(false, null)); + + $this->assertEqual( + false, + coalesce(null, false)); + } + + public function testHeadLast() { + $this->assertEqual( + 'a', + head(explode('.', 'a.b'))); + $this->assertEqual( + 'b', + last(explode('.', 'a.b'))); + } + + public function testHeadKeyLastKey() { + $this->assertEqual( + 'a', + head_key(array('a' => 0, 'b' => 1))); + $this->assertEqual( + 'b', + last_key(array('a' => 0, 'b' => 1))); + $this->assertEqual(null, head_key(array())); + $this->assertEqual(null, last_key(array())); + } + + public function testID() { + $this->assertEqual(true, id(true)); + $this->assertEqual(false, id(false)); + } + + public function testIdx() { + $array = array( + 'present' => true, + 'null' => null, + ); + $this->assertEqual(true, idx($array, 'present')); + $this->assertEqual(true, idx($array, 'present', false)); + $this->assertEqual(null, idx($array, 'null')); + $this->assertEqual(null, idx($array, 'null', false)); + $this->assertEqual(null, idx($array, 'missing')); + $this->assertEqual(false, idx($array, 'missing', false)); + } + + public function testSplitLines() { + $retain_cases = array( + '' => array(''), + 'x' => array('x'), + "x\n" => array("x\n"), + "\n" => array("\n"), + "\n\n\n" => array("\n", "\n", "\n"), + "\r\n" => array("\r\n"), + "x\r\ny\n" => array("x\r\n", "y\n"), + "x\ry\nz\r\n" => array("x\ry\n", "z\r\n"), + "x\ry\nz\r\n\n" => array("x\ry\n", "z\r\n", "\n"), + ); + + foreach ($retain_cases as $input => $expect) { + $this->assertEqual( + $expect, + phutil_split_lines($input, $retain_endings = true), + pht('(Retained) %s', addcslashes($input, "\r\n\\"))); + } + + $discard_cases = array( + '' => array(''), + 'x' => array('x'), + "x\n" => array('x'), + "\n" => array(''), + "\n\n\n" => array('', '', ''), + "\r\n" => array(''), + "x\r\ny\n" => array('x', 'y'), + "x\ry\nz\r\n" => array("x\ry", 'z'), + "x\ry\nz\r\n\n" => array("x\ry", 'z', ''), + ); + + foreach ($discard_cases as $input => $expect) { + $this->assertEqual( + $expect, + phutil_split_lines($input, $retain_endings = false), + pht('(Discarded) %s', addcslashes($input, "\r\n\\"))); + } + } + + public function testArrayFuse() { + $this->assertEqual(array(), array_fuse(array())); + $this->assertEqual(array('x' => 'x'), array_fuse(array('x'))); + } + + public function testArrayInterleave() { + $this->assertEqual(array(), array_interleave('x', array())); + $this->assertEqual(array('y'), array_interleave('x', array('y'))); + + $this->assertEqual( + array('y', 'x', 'z'), + array_interleave('x', array('y', 'z'))); + + $this->assertEqual( + array('y', 'x', 'z'), + array_interleave( + 'x', + array( + 'kangaroo' => 'y', + 'marmoset' => 'z', + ))); + + $obj1 = (object)array(); + $obj2 = (object)array(); + + $this->assertEqual( + array($obj1, $obj2, $obj1, $obj2, $obj1), + array_interleave( + $obj2, + array( + $obj1, + $obj1, + $obj1, + ))); + + $implode_tests = array( + '' => array(1, 2, 3), + 'x' => array(1, 2, 3), + 'y' => array(), + 'z' => array(1), + ); + + foreach ($implode_tests as $x => $y) { + $this->assertEqual( + implode('', array_interleave($x, $y)), + implode($x, $y)); + } + } + + public function testLoggableString() { + $this->assertEqual( + '', + phutil_loggable_string('')); + + $this->assertEqual( + "a\\nb", + phutil_loggable_string("a\nb")); + + $this->assertEqual( + "a\\x01b", + phutil_loggable_string("a\x01b")); + + $this->assertEqual( + "a\\x1Fb", + phutil_loggable_string("a\x1Fb")); + } + + public function testPhutilUnits() { + $cases = array( + '0 seconds in seconds' => 0, + '1 second in seconds' => 1, + '2 seconds in seconds' => 2, + '100 seconds in seconds' => 100, + '2 minutes in seconds' => 120, + '1 hour in seconds' => 3600, + '1 day in seconds' => 86400, + '3 days in seconds' => 259200, + '128 bits in bytes' => 16, + '1 byte in bytes' => 1, + '8 bits in bytes' => 1, + ); + + foreach ($cases as $input => $expect) { + $this->assertEqual( + $expect, + phutil_units($input), + 'phutil_units("'.$input.'")'); + } + + $bad_cases = array( + 'quack', + '3 years in seconds', + '1 minute in milliseconds', + '1 day in days', + '-1 minutes in seconds', + '1.5 minutes in seconds', + '7 bits in bytes', + '2 hours in bytes', + '1 dram in bytes', + '24 bits in seconds', + ); + + foreach ($bad_cases as $input) { + $caught = null; + try { + phutil_units($input); + } catch (InvalidArgumentException $ex) { + $caught = $ex; + } + + $this->assertTrue( + ($caught instanceof InvalidArgumentException), + 'phutil_units("'.$input.'")'); + } + } + + public function testPhutilJSONDecode() { + $valid_cases = array( + '{}' => array(), + '[]' => array(), + '[1, 2]' => array(1, 2), + '{"a":"b"}' => array('a' => 'b'), + ); + + foreach ($valid_cases as $input => $expect) { + $result = phutil_json_decode($input); + $this->assertEqual($expect, $result, 'phutil_json_decode('.$input.')'); + } + + $invalid_cases = array( + '', + '"a"', + '{,}', + 'null', + '"null"', + ); + + foreach ($invalid_cases as $input) { + $caught = null; + try { + phutil_json_decode($input); + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof PhutilJSONParserException); + } + } + + public function testPhutilINIDecode() { + // Skip the test if we are using an older version of PHP that doesn't + // have the `parse_ini_string` function. + try { + phutil_ini_decode(''); + } catch (PhutilMethodNotImplementedException $ex) { + $this->assertSkipped($ex->getMessage()); + } + + $valid_cases = array( + '' => array(), + 'foo=' => array('foo' => ''), + 'foo=bar' => array('foo' => 'bar'), + 'foo = bar' => array('foo' => 'bar'), + "foo = bar\n" => array('foo' => 'bar'), + "foo\nbar = baz" => array('bar' => 'baz'), + + "[foo]\nbar = baz" => array('foo' => array('bar' => 'baz')), + "[foo]\n[bar]\nbaz = foo" => array( + 'foo' => array(), + 'bar' => array('baz' => 'foo'), + ), + "[foo]\nbar = baz\n\n[bar]\nbaz = foo" => array( + 'foo' => array('bar' => 'baz'), + 'bar' => array('baz' => 'foo'), + ), + + "; Comment\n[foo]\nbar = baz" => array('foo' => array('bar' => 'baz')), + "# Comment\n[foo]\nbar = baz" => array('foo' => array('bar' => 'baz')), + + "foo = true\n[bar]\nbaz = false" + => array('foo' => true, 'bar' => array('baz' => false)), + "foo = 1\nbar = 1.234" => array('foo' => 1, 'bar' => 1.234), + 'x = {"foo": "bar"}' => array('x' => '{"foo": "bar"}'), + ); + + foreach ($valid_cases as $input => $expect) { + $result = phutil_ini_decode($input); + $this->assertEqual($expect, $result, 'phutil_ini_decode('.$input.')'); + } + + $invalid_cases = array( + '[' => new PhutilINIParserException(), + ); + + foreach ($invalid_cases as $input => $expect) { + $caught = null; + try { + phutil_ini_decode($input); + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof $expect); + } + } + + public function testCensorCredentials() { + $cases = array( + '' => '', + 'abc' => 'abc', + + // NOTE: We're liberal about censoring here, since we can't tell + // if this is a truncated password at the end of an input string + // or a domain name. The version with a "/" isn't censored. + 'http://example.com' => 'http://********', + 'http://example.com/' => 'http://example.com/', + + 'http://username@example.com' => 'http://********@example.com', + 'http://user:pass@example.com' => 'http://********@example.com', + + // We censor these because they might be truncated credentials at the end + // of the string. + 'http://user' => 'http://********', + "http://user\n" => "http://********\n", + + 'svn+ssh://user:pass@example.com' => 'svn+ssh://********@example.com', + ); + + foreach ($cases as $input => $expect) { + $this->assertEqual( + $expect, + phutil_censor_credentials($input), + pht('Credential censoring for: %s', $input)); + } + } + + public function testVarExport() { + // Constants + $this->assertEqual('null', phutil_var_export(null)); + $this->assertEqual('true', phutil_var_export(true)); + $this->assertEqual('false', phutil_var_export(false)); + $this->assertEqual("'quack'", phutil_var_export('quack')); + $this->assertEqual('1234567', phutil_var_export(1234567)); + + // Arrays + $this->assertEqual( + 'array()', + phutil_var_export(array())); + $this->assertEqual( + implode("\n", array( + 'array(', + ' 1,', + ' 2,', + ' 3,', + ')', + )), + phutil_var_export(array(1, 2, 3))); + $this->assertEqual( + implode("\n", array( + 'array(', + " 'foo' => 'bar',", + " 'bar' => 'baz',", + ')', + )), + phutil_var_export(array('foo' => 'bar', 'bar' => 'baz'))); + $this->assertEqual( + implode("\n", array( + 'array(', + " 'foo' => array(", + " 'bar' => array(", + " 'baz' => array(),", + ' ),', + ' ),', + ')', + )), + phutil_var_export( + array('foo' => array('bar' => array('baz' => array()))))); + + // Objects + $this->assertEqual( + "stdClass::__set_state(array(\n))", + phutil_var_export(new stdClass())); + $this->assertEqual( + "PhutilTestPhobject::__set_state(array(\n))", + phutil_var_export(new PhutilTestPhobject())); + } + + public function testFnmatch() { + $cases = array( + '' => array( + array(''), + array('.', '/'), + ), + '*' => array( + array('file'), + array('dir/', '/dir'), + ), + '**' => array( + array('file', 'dir/', '/dir', 'dir/subdir/file'), + array(), + ), + '**/file' => array( + array('file', 'dir/file', 'dir/subdir/file', 'dir/subdir/subdir/file'), + array('file/', 'file/dir'), + ), + 'file.*' => array( + array('file.php', 'file.a', 'file.'), + array('files.php', 'file.php/blah'), + ), + 'fo?' => array( + array('foo', 'fot'), + array('fooo', 'ffoo', 'fo/', 'foo/'), + ), + 'fo{o,t}' => array( + array('foo', 'fot'), + array('fob', 'fo/', 'foo/'), + ), + 'fo{o,\\,}' => array( + array('foo', 'fo,'), + array('foo/', 'fo,/'), + ), + 'fo{o,\\\\}' => array( + array('foo', 'fo\\'), + array('foo/', 'fo\\/'), + ), + '/foo' => array( + array('/foo'), + array('foo', '/foo/'), + ), + + // Tests for various `fnmatch` flags. + '*.txt' => array( + array( + 'file.txt', + + // FNM_PERIOD + '.secret-file.txt', + ), + array( + // FNM_PATHNAME + 'dir/file.txt', + + // FNM_CASEFOLD + 'file.TXT', + ), + '\\*.txt' => array( + array( + // FNM_NOESCAPE + '*.txt', + ), + array( + 'file.txt', + ), + ), + ), + ); + + $invalid = array( + '{', + 'asdf\\', + ); + + foreach ($cases as $input => $expect) { + list($matches, $no_matches) = $expect; + + foreach ($matches as $match) { + $this->assertTrue( + phutil_fnmatch($input, $match), + pht('Expecting "%s" to match "%s".', $input, $match)); + } + + foreach ($no_matches as $no_match) { + $this->assertFalse( + phutil_fnmatch($input, $no_match), + pht('Expecting "%s" not to match "%s".', $input, $no_match)); + } + } + + foreach ($invalid as $input) { + $caught = null; + try { + phutil_fnmatch($input, ''); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof InvalidArgumentException); + } + } + + public function testJSONEncode() { + $in = array( + 'example' => "Not Valid UTF8: \x80", + ); + + $caught = null; + try { + $value = phutil_json_encode($in); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue(($caught instanceof Exception)); + } + + public function testHashComparisons() { + $tests = array( + array('1', '12', false), + array('0', '0e123', false), + array('0e123', '0e124', false), + array('', '0', false), + array('000', '0e0', false), + array('001', '002', false), + array('0', '', false), + array('987654321', '123456789', false), + array('A', 'a', false), + array('123456789', '123456789', true), + array('hunter42', 'hunter42', true), + ); + + foreach ($tests as $key => $test) { + list($u, $v, $expect) = $test; + $actual = phutil_hashes_are_identical($u, $v); + $this->assertEqual( + $expect, + $actual, + pht('Test Case: "%s" vs "%s"', $u, $v)); + } + } + + public function testVectorSortInt() { + $original = array( + ~PHP_INT_MAX, + -2147483648, + -5, + -3, + -1, + 0, + 1, + 2, + 3, + 100, + PHP_INT_MAX, + ); + + $items = $this->shuffleMap($original); + + foreach ($items as $key => $value) { + $items[$key] = (string)id(new PhutilSortVector()) + ->addInt($value); + } + + asort($items, SORT_STRING); + + $this->assertEqual( + array_keys($original), + array_keys($items)); + } + + public function testVectorSortString() { + $original = array( + '', + "\1", + 'A', + 'AB', + 'Z', + "Z\1", + 'ZZZ', + ); + + $items = $this->shuffleMap($original); + + foreach ($items as $key => $value) { + $items[$key] = (string)id(new PhutilSortVector()) + ->addString($value); + } + + asort($items, SORT_STRING); + + $this->assertEqual( + array_keys($original), + array_keys($items)); + } + + private function shuffleMap(array $map) { + $keys = array_keys($map); + shuffle($keys); + return array_select_keys($map, $keys); + } + +} diff --git a/src/utils/__tests__/TestAbstractDirectedGraph.php b/src/utils/__tests__/TestAbstractDirectedGraph.php new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/TestAbstractDirectedGraph.php @@ -0,0 +1,16 @@ +nodes = $nodes; + return $this; + } + + protected function loadEdges(array $nodes) { + return array_select_keys($this->nodes, $nodes); + } + +} diff --git a/src/utils/__tests__/cowsay/cube.expect b/src/utils/__tests__/cowsay/cube.expect new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/cowsay/cube.expect @@ -0,0 +1,12 @@ + __________________ +( I made a friend! ) + ------------------ + o + o + /---\__/---\\ + | / .... \ || + \ ..--.. // + |..(<3). || + / ..--.. \\ + | \ .... / || + \---/--\---// diff --git a/src/utils/__tests__/cowsay/cube.test b/src/utils/__tests__/cowsay/cube.test new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/cowsay/cube.test @@ -0,0 +1,15 @@ + $thoughts + $thoughts + /---\__/---\\ + | / .... \ || + \ ..--.. // + |..($eyes). || + / ..--.. \\ + | \ .... / || + \---/--\---// +~~~~~~~~~~ +{ + "text": "I made a friend!", + "action": "think", + "eyes": "<3" +} diff --git a/src/utils/__tests__/cowsay/cube_perl.expect b/src/utils/__tests__/cowsay/cube_perl.expect new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/cowsay/cube_perl.expect @@ -0,0 +1,12 @@ + __________________ +( I made a friend! ) + ------------------ + o + o + /---\__/---\\ + | / .... \ || + \ ..--.. // + |..(<3). || + / ..--.. \\ + | \ .... / || + \---/--\---// diff --git a/src/utils/__tests__/cowsay/cube_perl.test b/src/utils/__tests__/cowsay/cube_perl.test new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/cowsay/cube_perl.test @@ -0,0 +1,17 @@ +# test case for original perl-script cowfile +$the_cow = + $thoughts + $thoughts + /---\\__/---\\\\ + | / .... \\ || + \\ ..--.. // + |..($eyes). || + / ..--.. \\\\ + | \\ .... / || + \\---/--\\---// +~~~~~~~~~~ +{ + "text": "I made a friend!", + "action": "think", + "eyes": "<3" +} diff --git a/src/utils/__tests__/hashingiterator/mostlyprime.txt b/src/utils/__tests__/hashingiterator/mostlyprime.txt new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/hashingiterator/mostlyprime.txt @@ -0,0 +1,1007 @@ +This is a data file which we compute a hash of. The contents are meaningless +but it's a slightly better test if it has enough data that it won't fit into +a single stream buffer, since that exercises more code. + +Thus, here is a list of 9,999 of the first 10,000 prime numbers, plus one +number which I have changed so it is not prime. + + 2 3 5 7 9 11 13 17 19 23 + 31 37 41 43 47 53 59 61 67 71 + 73 79 83 89 97 101 103 107 109 113 + 127 131 137 139 149 151 157 163 167 173 + 179 181 191 193 197 199 211 223 227 229 + 233 239 241 251 257 263 269 271 277 281 + 283 293 307 311 313 317 331 337 347 349 + 353 359 367 373 379 383 389 397 401 409 + 419 421 431 433 439 443 449 457 461 463 + 467 479 487 491 499 503 509 521 523 541 + 547 557 563 569 571 577 587 593 599 601 + 607 613 617 619 631 641 643 647 653 659 + 661 673 677 683 691 701 709 719 727 733 + 739 743 751 757 761 769 773 787 797 809 + 811 821 823 827 829 839 853 857 859 863 + 877 881 883 887 907 911 919 929 937 941 + 947 953 967 971 977 983 991 997 1009 1013 + 1019 1021 1031 1033 1039 1049 1051 1061 1063 1069 + 1087 1091 1093 1097 1103 1109 1117 1123 1129 1151 + 1153 1163 1171 1181 1187 1193 1201 1213 1217 1223 + 1229 1231 1237 1249 1259 1277 1279 1283 1289 1291 + 1297 1301 1303 1307 1319 1321 1327 1361 1367 1373 + 1381 1399 1409 1423 1427 1429 1433 1439 1447 1451 + 1453 1459 1471 1481 1483 1487 1489 1493 1499 1511 + 1523 1531 1543 1549 1553 1559 1567 1571 1579 1583 + 1597 1601 1607 1609 1613 1619 1621 1627 1637 1657 + 1663 1667 1669 1693 1697 1699 1709 1721 1723 1733 + 1741 1747 1753 1759 1777 1783 1787 1789 1801 1811 + 1823 1831 1847 1861 1867 1871 1873 1877 1879 1889 + 1901 1907 1913 1931 1933 1949 1951 1973 1979 1987 + 1993 1997 1999 2003 2011 2017 2027 2029 2039 2053 + 2063 2069 2081 2083 2087 2089 2099 2111 2113 2129 + 2131 2137 2141 2143 2153 2161 2179 2203 2207 2213 + 2221 2237 2239 2243 2251 2267 2269 2273 2281 2287 + 2293 2297 2309 2311 2333 2339 2341 2347 2351 2357 + 2371 2377 2381 2383 2389 2393 2399 2411 2417 2423 + 2437 2441 2447 2459 2467 2473 2477 2503 2521 2531 + 2539 2543 2549 2551 2557 2579 2591 2593 2609 2617 + 2621 2633 2647 2657 2659 2663 2671 2677 2683 2687 + 2689 2693 2699 2707 2711 2713 2719 2729 2731 2741 + 2749 2753 2767 2777 2789 2791 2797 2801 2803 2819 + 2833 2837 2843 2851 2857 2861 2879 2887 2897 2903 + 2909 2917 2927 2939 2953 2957 2963 2969 2971 2999 + 3001 3011 3019 3023 3037 3041 3049 3061 3067 3079 + 3083 3089 3109 3119 3121 3137 3163 3167 3169 3181 + 3187 3191 3203 3209 3217 3221 3229 3251 3253 3257 + 3259 3271 3299 3301 3307 3313 3319 3323 3329 3331 + 3343 3347 3359 3361 3371 3373 3389 3391 3407 3413 + 3433 3449 3457 3461 3463 3467 3469 3491 3499 3511 + 3517 3527 3529 3533 3539 3541 3547 3557 3559 3571 + 3581 3583 3593 3607 3613 3617 3623 3631 3637 3643 + 3659 3671 3673 3677 3691 3697 3701 3709 3719 3727 + 3733 3739 3761 3767 3769 3779 3793 3797 3803 3821 + 3823 3833 3847 3851 3853 3863 3877 3881 3889 3907 + 3911 3917 3919 3923 3929 3931 3943 3947 3967 3989 + 4001 4003 4007 4013 4019 4021 4027 4049 4051 4057 + 4073 4079 4091 4093 4099 4111 4127 4129 4133 4139 + 4153 4157 4159 4177 4201 4211 4217 4219 4229 4231 + 4241 4243 4253 4259 4261 4271 4273 4283 4289 4297 + 4327 4337 4339 4349 4357 4363 4373 4391 4397 4409 + 4421 4423 4441 4447 4451 4457 4463 4481 4483 4493 + 4507 4513 4517 4519 4523 4547 4549 4561 4567 4583 + 4591 4597 4603 4621 4637 4639 4643 4649 4651 4657 + 4663 4673 4679 4691 4703 4721 4723 4729 4733 4751 + 4759 4783 4787 4789 4793 4799 4801 4813 4817 4831 + 4861 4871 4877 4889 4903 4909 4919 4931 4933 4937 + 4943 4951 4957 4967 4969 4973 4987 4993 4999 5003 + 5009 5011 5021 5023 5039 5051 5059 5077 5081 5087 + 5099 5101 5107 5113 5119 5147 5153 5167 5171 5179 + 5189 5197 5209 5227 5231 5233 5237 5261 5273 5279 + 5281 5297 5303 5309 5323 5333 5347 5351 5381 5387 + 5393 5399 5407 5413 5417 5419 5431 5437 5441 5443 + 5449 5471 5477 5479 5483 5501 5503 5507 5519 5521 + 5527 5531 5557 5563 5569 5573 5581 5591 5623 5639 + 5641 5647 5651 5653 5657 5659 5669 5683 5689 5693 + 5701 5711 5717 5737 5741 5743 5749 5779 5783 5791 + 5801 5807 5813 5821 5827 5839 5843 5849 5851 5857 + 5861 5867 5869 5879 5881 5897 5903 5923 5927 5939 + 5953 5981 5987 6007 6011 6029 6037 6043 6047 6053 + 6067 6073 6079 6089 6091 6101 6113 6121 6131 6133 + 6143 6151 6163 6173 6197 6199 6203 6211 6217 6221 + 6229 6247 6257 6263 6269 6271 6277 6287 6299 6301 + 6311 6317 6323 6329 6337 6343 6353 6359 6361 6367 + 6373 6379 6389 6397 6421 6427 6449 6451 6469 6473 + 6481 6491 6521 6529 6547 6551 6553 6563 6569 6571 + 6577 6581 6599 6607 6619 6637 6653 6659 6661 6673 + 6679 6689 6691 6701 6703 6709 6719 6733 6737 6761 + 6763 6779 6781 6791 6793 6803 6823 6827 6829 6833 + 6841 6857 6863 6869 6871 6883 6899 6907 6911 6917 + 6947 6949 6959 6961 6967 6971 6977 6983 6991 6997 + 7001 7013 7019 7027 7039 7043 7057 7069 7079 7103 + 7109 7121 7127 7129 7151 7159 7177 7187 7193 7207 + 7211 7213 7219 7229 7237 7243 7247 7253 7283 7297 + 7307 7309 7321 7331 7333 7349 7351 7369 7393 7411 + 7417 7433 7451 7457 7459 7477 7481 7487 7489 7499 + 7507 7517 7523 7529 7537 7541 7547 7549 7559 7561 + 7573 7577 7583 7589 7591 7603 7607 7621 7639 7643 + 7649 7669 7673 7681 7687 7691 7699 7703 7717 7723 + 7727 7741 7753 7757 7759 7789 7793 7817 7823 7829 + 7841 7853 7867 7873 7877 7879 7883 7901 7907 7919 + 7927 7933 7937 7949 7951 7963 7993 8009 8011 8017 + 8039 8053 8059 8069 8081 8087 8089 8093 8101 8111 + 8117 8123 8147 8161 8167 8171 8179 8191 8209 8219 + 8221 8231 8233 8237 8243 8263 8269 8273 8287 8291 + 8293 8297 8311 8317 8329 8353 8363 8369 8377 8387 + 8389 8419 8423 8429 8431 8443 8447 8461 8467 8501 + 8513 8521 8527 8537 8539 8543 8563 8573 8581 8597 + 8599 8609 8623 8627 8629 8641 8647 8663 8669 8677 + 8681 8689 8693 8699 8707 8713 8719 8731 8737 8741 + 8747 8753 8761 8779 8783 8803 8807 8819 8821 8831 + 8837 8839 8849 8861 8863 8867 8887 8893 8923 8929 + 8933 8941 8951 8963 8969 8971 8999 9001 9007 9011 + 9013 9029 9041 9043 9049 9059 9067 9091 9103 9109 + 9127 9133 9137 9151 9157 9161 9173 9181 9187 9199 + 9203 9209 9221 9227 9239 9241 9257 9277 9281 9283 + 9293 9311 9319 9323 9337 9341 9343 9349 9371 9377 + 9391 9397 9403 9413 9419 9421 9431 9433 9437 9439 + 9461 9463 9467 9473 9479 9491 9497 9511 9521 9533 + 9539 9547 9551 9587 9601 9613 9619 9623 9629 9631 + 9643 9649 9661 9677 9679 9689 9697 9719 9721 9733 + 9739 9743 9749 9767 9769 9781 9787 9791 9803 9811 + 9817 9829 9833 9839 9851 9857 9859 9871 9883 9887 + 9901 9907 9923 9929 9931 9941 9949 9967 9973 10007 + 10009 10037 10039 10061 10067 10069 10079 10091 10093 10099 + 10103 10111 10133 10139 10141 10151 10159 10163 10169 10177 + 10181 10193 10211 10223 10243 10247 10253 10259 10267 10271 + 10273 10289 10301 10303 10313 10321 10331 10333 10337 10343 + 10357 10369 10391 10399 10427 10429 10433 10453 10457 10459 + 10463 10477 10487 10499 10501 10513 10529 10531 10559 10567 + 10589 10597 10601 10607 10613 10627 10631 10639 10651 10657 + 10663 10667 10687 10691 10709 10711 10723 10729 10733 10739 + 10753 10771 10781 10789 10799 10831 10837 10847 10853 10859 + 10861 10867 10883 10889 10891 10903 10909 10937 10939 10949 + 10957 10973 10979 10987 10993 11003 11027 11047 11057 11059 + 11069 11071 11083 11087 11093 11113 11117 11119 11131 11149 + 11159 11161 11171 11173 11177 11197 11213 11239 11243 11251 + 11257 11261 11273 11279 11287 11299 11311 11317 11321 11329 + 11351 11353 11369 11383 11393 11399 11411 11423 11437 11443 + 11447 11467 11471 11483 11489 11491 11497 11503 11519 11527 + 11549 11551 11579 11587 11593 11597 11617 11621 11633 11657 + 11677 11681 11689 11699 11701 11717 11719 11731 11743 11777 + 11779 11783 11789 11801 11807 11813 11821 11827 11831 11833 + 11839 11863 11867 11887 11897 11903 11909 11923 11927 11933 + 11939 11941 11953 11959 11969 11971 11981 11987 12007 12011 + 12037 12041 12043 12049 12071 12073 12097 12101 12107 12109 + 12113 12119 12143 12149 12157 12161 12163 12197 12203 12211 + 12227 12239 12241 12251 12253 12263 12269 12277 12281 12289 + 12301 12323 12329 12343 12347 12373 12377 12379 12391 12401 + 12409 12413 12421 12433 12437 12451 12457 12473 12479 12487 + 12491 12497 12503 12511 12517 12527 12539 12541 12547 12553 + 12569 12577 12583 12589 12601 12611 12613 12619 12637 12641 + 12647 12653 12659 12671 12689 12697 12703 12713 12721 12739 + 12743 12757 12763 12781 12791 12799 12809 12821 12823 12829 + 12841 12853 12889 12893 12899 12907 12911 12917 12919 12923 + 12941 12953 12959 12967 12973 12979 12983 13001 13003 13007 + 13009 13033 13037 13043 13049 13063 13093 13099 13103 13109 + 13121 13127 13147 13151 13159 13163 13171 13177 13183 13187 + 13217 13219 13229 13241 13249 13259 13267 13291 13297 13309 + 13313 13327 13331 13337 13339 13367 13381 13397 13399 13411 + 13417 13421 13441 13451 13457 13463 13469 13477 13487 13499 + 13513 13523 13537 13553 13567 13577 13591 13597 13613 13619 + 13627 13633 13649 13669 13679 13681 13687 13691 13693 13697 + 13709 13711 13721 13723 13729 13751 13757 13759 13763 13781 + 13789 13799 13807 13829 13831 13841 13859 13873 13877 13879 + 13883 13901 13903 13907 13913 13921 13931 13933 13963 13967 + 13997 13999 14009 14011 14029 14033 14051 14057 14071 14081 + 14083 14087 14107 14143 14149 14153 14159 14173 14177 14197 + 14207 14221 14243 14249 14251 14281 14293 14303 14321 14323 + 14327 14341 14347 14369 14387 14389 14401 14407 14411 14419 + 14423 14431 14437 14447 14449 14461 14479 14489 14503 14519 + 14533 14537 14543 14549 14551 14557 14561 14563 14591 14593 + 14621 14627 14629 14633 14639 14653 14657 14669 14683 14699 + 14713 14717 14723 14731 14737 14741 14747 14753 14759 14767 + 14771 14779 14783 14797 14813 14821 14827 14831 14843 14851 + 14867 14869 14879 14887 14891 14897 14923 14929 14939 14947 + 14951 14957 14969 14983 15013 15017 15031 15053 15061 15073 + 15077 15083 15091 15101 15107 15121 15131 15137 15139 15149 + 15161 15173 15187 15193 15199 15217 15227 15233 15241 15259 + 15263 15269 15271 15277 15287 15289 15299 15307 15313 15319 + 15329 15331 15349 15359 15361 15373 15377 15383 15391 15401 + 15413 15427 15439 15443 15451 15461 15467 15473 15493 15497 + 15511 15527 15541 15551 15559 15569 15581 15583 15601 15607 + 15619 15629 15641 15643 15647 15649 15661 15667 15671 15679 + 15683 15727 15731 15733 15737 15739 15749 15761 15767 15773 + 15787 15791 15797 15803 15809 15817 15823 15859 15877 15881 + 15887 15889 15901 15907 15913 15919 15923 15937 15959 15971 + 15973 15991 16001 16007 16033 16057 16061 16063 16067 16069 + 16073 16087 16091 16097 16103 16111 16127 16139 16141 16183 + 16187 16189 16193 16217 16223 16229 16231 16249 16253 16267 + 16273 16301 16319 16333 16339 16349 16361 16363 16369 16381 + 16411 16417 16421 16427 16433 16447 16451 16453 16477 16481 + 16487 16493 16519 16529 16547 16553 16561 16567 16573 16603 + 16607 16619 16631 16633 16649 16651 16657 16661 16673 16691 + 16693 16699 16703 16729 16741 16747 16759 16763 16787 16811 + 16823 16829 16831 16843 16871 16879 16883 16889 16901 16903 + 16921 16927 16931 16937 16943 16963 16979 16981 16987 16993 + 17011 17021 17027 17029 17033 17041 17047 17053 17077 17093 + 17099 17107 17117 17123 17137 17159 17167 17183 17189 17191 + 17203 17207 17209 17231 17239 17257 17291 17293 17299 17317 + 17321 17327 17333 17341 17351 17359 17377 17383 17387 17389 + 17393 17401 17417 17419 17431 17443 17449 17467 17471 17477 + 17483 17489 17491 17497 17509 17519 17539 17551 17569 17573 + 17579 17581 17597 17599 17609 17623 17627 17657 17659 17669 + 17681 17683 17707 17713 17729 17737 17747 17749 17761 17783 + 17789 17791 17807 17827 17837 17839 17851 17863 17881 17891 + 17903 17909 17911 17921 17923 17929 17939 17957 17959 17971 + 17977 17981 17987 17989 18013 18041 18043 18047 18049 18059 + 18061 18077 18089 18097 18119 18121 18127 18131 18133 18143 + 18149 18169 18181 18191 18199 18211 18217 18223 18229 18233 + 18251 18253 18257 18269 18287 18289 18301 18307 18311 18313 + 18329 18341 18353 18367 18371 18379 18397 18401 18413 18427 + 18433 18439 18443 18451 18457 18461 18481 18493 18503 18517 + 18521 18523 18539 18541 18553 18583 18587 18593 18617 18637 + 18661 18671 18679 18691 18701 18713 18719 18731 18743 18749 + 18757 18773 18787 18793 18797 18803 18839 18859 18869 18899 + 18911 18913 18917 18919 18947 18959 18973 18979 19001 19009 + 19013 19031 19037 19051 19069 19073 19079 19081 19087 19121 + 19139 19141 19157 19163 19181 19183 19207 19211 19213 19219 + 19231 19237 19249 19259 19267 19273 19289 19301 19309 19319 + 19333 19373 19379 19381 19387 19391 19403 19417 19421 19423 + 19427 19429 19433 19441 19447 19457 19463 19469 19471 19477 + 19483 19489 19501 19507 19531 19541 19543 19553 19559 19571 + 19577 19583 19597 19603 19609 19661 19681 19687 19697 19699 + 19709 19717 19727 19739 19751 19753 19759 19763 19777 19793 + 19801 19813 19819 19841 19843 19853 19861 19867 19889 19891 + 19913 19919 19927 19937 19949 19961 19963 19973 19979 19991 + 19993 19997 20011 20021 20023 20029 20047 20051 20063 20071 + 20089 20101 20107 20113 20117 20123 20129 20143 20147 20149 + 20161 20173 20177 20183 20201 20219 20231 20233 20249 20261 + 20269 20287 20297 20323 20327 20333 20341 20347 20353 20357 + 20359 20369 20389 20393 20399 20407 20411 20431 20441 20443 + 20477 20479 20483 20507 20509 20521 20533 20543 20549 20551 + 20563 20593 20599 20611 20627 20639 20641 20663 20681 20693 + 20707 20717 20719 20731 20743 20747 20749 20753 20759 20771 + 20773 20789 20807 20809 20849 20857 20873 20879 20887 20897 + 20899 20903 20921 20929 20939 20947 20959 20963 20981 20983 + 21001 21011 21013 21017 21019 21023 21031 21059 21061 21067 + 21089 21101 21107 21121 21139 21143 21149 21157 21163 21169 + 21179 21187 21191 21193 21211 21221 21227 21247 21269 21277 + 21283 21313 21317 21319 21323 21341 21347 21377 21379 21383 + 21391 21397 21401 21407 21419 21433 21467 21481 21487 21491 + 21493 21499 21503 21517 21521 21523 21529 21557 21559 21563 + 21569 21577 21587 21589 21599 21601 21611 21613 21617 21647 + 21649 21661 21673 21683 21701 21713 21727 21737 21739 21751 + 21757 21767 21773 21787 21799 21803 21817 21821 21839 21841 + 21851 21859 21863 21871 21881 21893 21911 21929 21937 21943 + 21961 21977 21991 21997 22003 22013 22027 22031 22037 22039 + 22051 22063 22067 22073 22079 22091 22093 22109 22111 22123 + 22129 22133 22147 22153 22157 22159 22171 22189 22193 22229 + 22247 22259 22271 22273 22277 22279 22283 22291 22303 22307 + 22343 22349 22367 22369 22381 22391 22397 22409 22433 22441 + 22447 22453 22469 22481 22483 22501 22511 22531 22541 22543 + 22549 22567 22571 22573 22613 22619 22621 22637 22639 22643 + 22651 22669 22679 22691 22697 22699 22709 22717 22721 22727 + 22739 22741 22751 22769 22777 22783 22787 22807 22811 22817 + 22853 22859 22861 22871 22877 22901 22907 22921 22937 22943 + 22961 22963 22973 22993 23003 23011 23017 23021 23027 23029 + 23039 23041 23053 23057 23059 23063 23071 23081 23087 23099 + 23117 23131 23143 23159 23167 23173 23189 23197 23201 23203 + 23209 23227 23251 23269 23279 23291 23293 23297 23311 23321 + 23327 23333 23339 23357 23369 23371 23399 23417 23431 23447 + 23459 23473 23497 23509 23531 23537 23539 23549 23557 23561 + 23563 23567 23581 23593 23599 23603 23609 23623 23627 23629 + 23633 23663 23669 23671 23677 23687 23689 23719 23741 23743 + 23747 23753 23761 23767 23773 23789 23801 23813 23819 23827 + 23831 23833 23857 23869 23873 23879 23887 23893 23899 23909 + 23911 23917 23929 23957 23971 23977 23981 23993 24001 24007 + 24019 24023 24029 24043 24049 24061 24071 24077 24083 24091 + 24097 24103 24107 24109 24113 24121 24133 24137 24151 24169 + 24179 24181 24197 24203 24223 24229 24239 24247 24251 24281 + 24317 24329 24337 24359 24371 24373 24379 24391 24407 24413 + 24419 24421 24439 24443 24469 24473 24481 24499 24509 24517 + 24527 24533 24547 24551 24571 24593 24611 24623 24631 24659 + 24671 24677 24683 24691 24697 24709 24733 24749 24763 24767 + 24781 24793 24799 24809 24821 24841 24847 24851 24859 24877 + 24889 24907 24917 24919 24923 24943 24953 24967 24971 24977 + 24979 24989 25013 25031 25033 25037 25057 25073 25087 25097 + 25111 25117 25121 25127 25147 25153 25163 25169 25171 25183 + 25189 25219 25229 25237 25243 25247 25253 25261 25301 25303 + 25307 25309 25321 25339 25343 25349 25357 25367 25373 25391 + 25409 25411 25423 25439 25447 25453 25457 25463 25469 25471 + 25523 25537 25541 25561 25577 25579 25583 25589 25601 25603 + 25609 25621 25633 25639 25643 25657 25667 25673 25679 25693 + 25703 25717 25733 25741 25747 25759 25763 25771 25793 25799 + 25801 25819 25841 25847 25849 25867 25873 25889 25903 25913 + 25919 25931 25933 25939 25943 25951 25969 25981 25997 25999 + 26003 26017 26021 26029 26041 26053 26083 26099 26107 26111 + 26113 26119 26141 26153 26161 26171 26177 26183 26189 26203 + 26209 26227 26237 26249 26251 26261 26263 26267 26293 26297 + 26309 26317 26321 26339 26347 26357 26371 26387 26393 26399 + 26407 26417 26423 26431 26437 26449 26459 26479 26489 26497 + 26501 26513 26539 26557 26561 26573 26591 26597 26627 26633 + 26641 26647 26669 26681 26683 26687 26693 26699 26701 26711 + 26713 26717 26723 26729 26731 26737 26759 26777 26783 26801 + 26813 26821 26833 26839 26849 26861 26863 26879 26881 26891 + 26893 26903 26921 26927 26947 26951 26953 26959 26981 26987 + 26993 27011 27017 27031 27043 27059 27061 27067 27073 27077 + 27091 27103 27107 27109 27127 27143 27179 27191 27197 27211 + 27239 27241 27253 27259 27271 27277 27281 27283 27299 27329 + 27337 27361 27367 27397 27407 27409 27427 27431 27437 27449 + 27457 27479 27481 27487 27509 27527 27529 27539 27541 27551 + 27581 27583 27611 27617 27631 27647 27653 27673 27689 27691 + 27697 27701 27733 27737 27739 27743 27749 27751 27763 27767 + 27773 27779 27791 27793 27799 27803 27809 27817 27823 27827 + 27847 27851 27883 27893 27901 27917 27919 27941 27943 27947 + 27953 27961 27967 27983 27997 28001 28019 28027 28031 28051 + 28057 28069 28081 28087 28097 28099 28109 28111 28123 28151 + 28163 28181 28183 28201 28211 28219 28229 28277 28279 28283 + 28289 28297 28307 28309 28319 28349 28351 28387 28393 28403 + 28409 28411 28429 28433 28439 28447 28463 28477 28493 28499 + 28513 28517 28537 28541 28547 28549 28559 28571 28573 28579 + 28591 28597 28603 28607 28619 28621 28627 28631 28643 28649 + 28657 28661 28663 28669 28687 28697 28703 28711 28723 28729 + 28751 28753 28759 28771 28789 28793 28807 28813 28817 28837 + 28843 28859 28867 28871 28879 28901 28909 28921 28927 28933 + 28949 28961 28979 29009 29017 29021 29023 29027 29033 29059 + 29063 29077 29101 29123 29129 29131 29137 29147 29153 29167 + 29173 29179 29191 29201 29207 29209 29221 29231 29243 29251 + 29269 29287 29297 29303 29311 29327 29333 29339 29347 29363 + 29383 29387 29389 29399 29401 29411 29423 29429 29437 29443 + 29453 29473 29483 29501 29527 29531 29537 29567 29569 29573 + 29581 29587 29599 29611 29629 29633 29641 29663 29669 29671 + 29683 29717 29723 29741 29753 29759 29761 29789 29803 29819 + 29833 29837 29851 29863 29867 29873 29879 29881 29917 29921 + 29927 29947 29959 29983 29989 30011 30013 30029 30047 30059 + 30071 30089 30091 30097 30103 30109 30113 30119 30133 30137 + 30139 30161 30169 30181 30187 30197 30203 30211 30223 30241 + 30253 30259 30269 30271 30293 30307 30313 30319 30323 30341 + 30347 30367 30389 30391 30403 30427 30431 30449 30467 30469 + 30491 30493 30497 30509 30517 30529 30539 30553 30557 30559 + 30577 30593 30631 30637 30643 30649 30661 30671 30677 30689 + 30697 30703 30707 30713 30727 30757 30763 30773 30781 30803 + 30809 30817 30829 30839 30841 30851 30853 30859 30869 30871 + 30881 30893 30911 30931 30937 30941 30949 30971 30977 30983 + 31013 31019 31033 31039 31051 31063 31069 31079 31081 31091 + 31121 31123 31139 31147 31151 31153 31159 31177 31181 31183 + 31189 31193 31219 31223 31231 31237 31247 31249 31253 31259 + 31267 31271 31277 31307 31319 31321 31327 31333 31337 31357 + 31379 31387 31391 31393 31397 31469 31477 31481 31489 31511 + 31513 31517 31531 31541 31543 31547 31567 31573 31583 31601 + 31607 31627 31643 31649 31657 31663 31667 31687 31699 31721 + 31723 31727 31729 31741 31751 31769 31771 31793 31799 31817 + 31847 31849 31859 31873 31883 31891 31907 31957 31963 31973 + 31981 31991 32003 32009 32027 32029 32051 32057 32059 32063 + 32069 32077 32083 32089 32099 32117 32119 32141 32143 32159 + 32173 32183 32189 32191 32203 32213 32233 32237 32251 32257 + 32261 32297 32299 32303 32309 32321 32323 32327 32341 32353 + 32359 32363 32369 32371 32377 32381 32401 32411 32413 32423 + 32429 32441 32443 32467 32479 32491 32497 32503 32507 32531 + 32533 32537 32561 32563 32569 32573 32579 32587 32603 32609 + 32611 32621 32633 32647 32653 32687 32693 32707 32713 32717 + 32719 32749 32771 32779 32783 32789 32797 32801 32803 32831 + 32833 32839 32843 32869 32887 32909 32911 32917 32933 32939 + 32941 32957 32969 32971 32983 32987 32993 32999 33013 33023 + 33029 33037 33049 33053 33071 33073 33083 33091 33107 33113 + 33119 33149 33151 33161 33179 33181 33191 33199 33203 33211 + 33223 33247 33287 33289 33301 33311 33317 33329 33331 33343 + 33347 33349 33353 33359 33377 33391 33403 33409 33413 33427 + 33457 33461 33469 33479 33487 33493 33503 33521 33529 33533 + 33547 33563 33569 33577 33581 33587 33589 33599 33601 33613 + 33617 33619 33623 33629 33637 33641 33647 33679 33703 33713 + 33721 33739 33749 33751 33757 33767 33769 33773 33791 33797 + 33809 33811 33827 33829 33851 33857 33863 33871 33889 33893 + 33911 33923 33931 33937 33941 33961 33967 33997 34019 34031 + 34033 34039 34057 34061 34123 34127 34129 34141 34147 34157 + 34159 34171 34183 34211 34213 34217 34231 34253 34259 34261 + 34267 34273 34283 34297 34301 34303 34313 34319 34327 34337 + 34351 34361 34367 34369 34381 34403 34421 34429 34439 34457 + 34469 34471 34483 34487 34499 34501 34511 34513 34519 34537 + 34543 34549 34583 34589 34591 34603 34607 34613 34631 34649 + 34651 34667 34673 34679 34687 34693 34703 34721 34729 34739 + 34747 34757 34759 34763 34781 34807 34819 34841 34843 34847 + 34849 34871 34877 34883 34897 34913 34919 34939 34949 34961 + 34963 34981 35023 35027 35051 35053 35059 35069 35081 35083 + 35089 35099 35107 35111 35117 35129 35141 35149 35153 35159 + 35171 35201 35221 35227 35251 35257 35267 35279 35281 35291 + 35311 35317 35323 35327 35339 35353 35363 35381 35393 35401 + 35407 35419 35423 35437 35447 35449 35461 35491 35507 35509 + 35521 35527 35531 35533 35537 35543 35569 35573 35591 35593 + 35597 35603 35617 35671 35677 35729 35731 35747 35753 35759 + 35771 35797 35801 35803 35809 35831 35837 35839 35851 35863 + 35869 35879 35897 35899 35911 35923 35933 35951 35963 35969 + 35977 35983 35993 35999 36007 36011 36013 36017 36037 36061 + 36067 36073 36083 36097 36107 36109 36131 36137 36151 36161 + 36187 36191 36209 36217 36229 36241 36251 36263 36269 36277 + 36293 36299 36307 36313 36319 36341 36343 36353 36373 36383 + 36389 36433 36451 36457 36467 36469 36473 36479 36493 36497 + 36523 36527 36529 36541 36551 36559 36563 36571 36583 36587 + 36599 36607 36629 36637 36643 36653 36671 36677 36683 36691 + 36697 36709 36713 36721 36739 36749 36761 36767 36779 36781 + 36787 36791 36793 36809 36821 36833 36847 36857 36871 36877 + 36887 36899 36901 36913 36919 36923 36929 36931 36943 36947 + 36973 36979 36997 37003 37013 37019 37021 37039 37049 37057 + 37061 37087 37097 37117 37123 37139 37159 37171 37181 37189 + 37199 37201 37217 37223 37243 37253 37273 37277 37307 37309 + 37313 37321 37337 37339 37357 37361 37363 37369 37379 37397 + 37409 37423 37441 37447 37463 37483 37489 37493 37501 37507 + 37511 37517 37529 37537 37547 37549 37561 37567 37571 37573 + 37579 37589 37591 37607 37619 37633 37643 37649 37657 37663 + 37691 37693 37699 37717 37747 37781 37783 37799 37811 37813 + 37831 37847 37853 37861 37871 37879 37889 37897 37907 37951 + 37957 37963 37967 37987 37991 37993 37997 38011 38039 38047 + 38053 38069 38083 38113 38119 38149 38153 38167 38177 38183 + 38189 38197 38201 38219 38231 38237 38239 38261 38273 38281 + 38287 38299 38303 38317 38321 38327 38329 38333 38351 38371 + 38377 38393 38431 38447 38449 38453 38459 38461 38501 38543 + 38557 38561 38567 38569 38593 38603 38609 38611 38629 38639 + 38651 38653 38669 38671 38677 38693 38699 38707 38711 38713 + 38723 38729 38737 38747 38749 38767 38783 38791 38803 38821 + 38833 38839 38851 38861 38867 38873 38891 38903 38917 38921 + 38923 38933 38953 38959 38971 38977 38993 39019 39023 39041 + 39043 39047 39079 39089 39097 39103 39107 39113 39119 39133 + 39139 39157 39161 39163 39181 39191 39199 39209 39217 39227 + 39229 39233 39239 39241 39251 39293 39301 39313 39317 39323 + 39341 39343 39359 39367 39371 39373 39383 39397 39409 39419 + 39439 39443 39451 39461 39499 39503 39509 39511 39521 39541 + 39551 39563 39569 39581 39607 39619 39623 39631 39659 39667 + 39671 39679 39703 39709 39719 39727 39733 39749 39761 39769 + 39779 39791 39799 39821 39827 39829 39839 39841 39847 39857 + 39863 39869 39877 39883 39887 39901 39929 39937 39953 39971 + 39979 39983 39989 40009 40013 40031 40037 40039 40063 40087 + 40093 40099 40111 40123 40127 40129 40151 40153 40163 40169 + 40177 40189 40193 40213 40231 40237 40241 40253 40277 40283 + 40289 40343 40351 40357 40361 40387 40423 40427 40429 40433 + 40459 40471 40483 40487 40493 40499 40507 40519 40529 40531 + 40543 40559 40577 40583 40591 40597 40609 40627 40637 40639 + 40693 40697 40699 40709 40739 40751 40759 40763 40771 40787 + 40801 40813 40819 40823 40829 40841 40847 40849 40853 40867 + 40879 40883 40897 40903 40927 40933 40939 40949 40961 40973 + 40993 41011 41017 41023 41039 41047 41051 41057 41077 41081 + 41113 41117 41131 41141 41143 41149 41161 41177 41179 41183 + 41189 41201 41203 41213 41221 41227 41231 41233 41243 41257 + 41263 41269 41281 41299 41333 41341 41351 41357 41381 41387 + 41389 41399 41411 41413 41443 41453 41467 41479 41491 41507 + 41513 41519 41521 41539 41543 41549 41579 41593 41597 41603 + 41609 41611 41617 41621 41627 41641 41647 41651 41659 41669 + 41681 41687 41719 41729 41737 41759 41761 41771 41777 41801 + 41809 41813 41843 41849 41851 41863 41879 41887 41893 41897 + 41903 41911 41927 41941 41947 41953 41957 41959 41969 41981 + 41983 41999 42013 42017 42019 42023 42043 42061 42071 42073 + 42083 42089 42101 42131 42139 42157 42169 42179 42181 42187 + 42193 42197 42209 42221 42223 42227 42239 42257 42281 42283 + 42293 42299 42307 42323 42331 42337 42349 42359 42373 42379 + 42391 42397 42403 42407 42409 42433 42437 42443 42451 42457 + 42461 42463 42467 42473 42487 42491 42499 42509 42533 42557 + 42569 42571 42577 42589 42611 42641 42643 42649 42667 42677 + 42683 42689 42697 42701 42703 42709 42719 42727 42737 42743 + 42751 42767 42773 42787 42793 42797 42821 42829 42839 42841 + 42853 42859 42863 42899 42901 42923 42929 42937 42943 42953 + 42961 42967 42979 42989 43003 43013 43019 43037 43049 43051 + 43063 43067 43093 43103 43117 43133 43151 43159 43177 43189 + 43201 43207 43223 43237 43261 43271 43283 43291 43313 43319 + 43321 43331 43391 43397 43399 43403 43411 43427 43441 43451 + 43457 43481 43487 43499 43517 43541 43543 43573 43577 43579 + 43591 43597 43607 43609 43613 43627 43633 43649 43651 43661 + 43669 43691 43711 43717 43721 43753 43759 43777 43781 43783 + 43787 43789 43793 43801 43853 43867 43889 43891 43913 43933 + 43943 43951 43961 43963 43969 43973 43987 43991 43997 44017 + 44021 44027 44029 44041 44053 44059 44071 44087 44089 44101 + 44111 44119 44123 44129 44131 44159 44171 44179 44189 44201 + 44203 44207 44221 44249 44257 44263 44267 44269 44273 44279 + 44281 44293 44351 44357 44371 44381 44383 44389 44417 44449 + 44453 44483 44491 44497 44501 44507 44519 44531 44533 44537 + 44543 44549 44563 44579 44587 44617 44621 44623 44633 44641 + 44647 44651 44657 44683 44687 44699 44701 44711 44729 44741 + 44753 44771 44773 44777 44789 44797 44809 44819 44839 44843 + 44851 44867 44879 44887 44893 44909 44917 44927 44939 44953 + 44959 44963 44971 44983 44987 45007 45013 45053 45061 45077 + 45083 45119 45121 45127 45131 45137 45139 45161 45179 45181 + 45191 45197 45233 45247 45259 45263 45281 45289 45293 45307 + 45317 45319 45329 45337 45341 45343 45361 45377 45389 45403 + 45413 45427 45433 45439 45481 45491 45497 45503 45523 45533 + 45541 45553 45557 45569 45587 45589 45599 45613 45631 45641 + 45659 45667 45673 45677 45691 45697 45707 45737 45751 45757 + 45763 45767 45779 45817 45821 45823 45827 45833 45841 45853 + 45863 45869 45887 45893 45943 45949 45953 45959 45971 45979 + 45989 46021 46027 46049 46051 46061 46073 46091 46093 46099 + 46103 46133 46141 46147 46153 46171 46181 46183 46187 46199 + 46219 46229 46237 46261 46271 46273 46279 46301 46307 46309 + 46327 46337 46349 46351 46381 46399 46411 46439 46441 46447 + 46451 46457 46471 46477 46489 46499 46507 46511 46523 46549 + 46559 46567 46573 46589 46591 46601 46619 46633 46639 46643 + 46649 46663 46679 46681 46687 46691 46703 46723 46727 46747 + 46751 46757 46769 46771 46807 46811 46817 46819 46829 46831 + 46853 46861 46867 46877 46889 46901 46919 46933 46957 46993 + 46997 47017 47041 47051 47057 47059 47087 47093 47111 47119 + 47123 47129 47137 47143 47147 47149 47161 47189 47207 47221 + 47237 47251 47269 47279 47287 47293 47297 47303 47309 47317 + 47339 47351 47353 47363 47381 47387 47389 47407 47417 47419 + 47431 47441 47459 47491 47497 47501 47507 47513 47521 47527 + 47533 47543 47563 47569 47581 47591 47599 47609 47623 47629 + 47639 47653 47657 47659 47681 47699 47701 47711 47713 47717 + 47737 47741 47743 47777 47779 47791 47797 47807 47809 47819 + 47837 47843 47857 47869 47881 47903 47911 47917 47933 47939 + 47947 47951 47963 47969 47977 47981 48017 48023 48029 48049 + 48073 48079 48091 48109 48119 48121 48131 48157 48163 48179 + 48187 48193 48197 48221 48239 48247 48259 48271 48281 48299 + 48311 48313 48337 48341 48353 48371 48383 48397 48407 48409 + 48413 48437 48449 48463 48473 48479 48481 48487 48491 48497 + 48523 48527 48533 48539 48541 48563 48571 48589 48593 48611 + 48619 48623 48647 48649 48661 48673 48677 48679 48731 48733 + 48751 48757 48761 48767 48779 48781 48787 48799 48809 48817 + 48821 48823 48847 48857 48859 48869 48871 48883 48889 48907 + 48947 48953 48973 48989 48991 49003 49009 49019 49031 49033 + 49037 49043 49057 49069 49081 49103 49109 49117 49121 49123 + 49139 49157 49169 49171 49177 49193 49199 49201 49207 49211 + 49223 49253 49261 49277 49279 49297 49307 49331 49333 49339 + 49363 49367 49369 49391 49393 49409 49411 49417 49429 49433 + 49451 49459 49463 49477 49481 49499 49523 49529 49531 49537 + 49547 49549 49559 49597 49603 49613 49627 49633 49639 49663 + 49667 49669 49681 49697 49711 49727 49739 49741 49747 49757 + 49783 49787 49789 49801 49807 49811 49823 49831 49843 49853 + 49871 49877 49891 49919 49921 49927 49937 49939 49943 49957 + 49991 49993 49999 50021 50023 50033 50047 50051 50053 50069 + 50077 50087 50093 50101 50111 50119 50123 50129 50131 50147 + 50153 50159 50177 50207 50221 50227 50231 50261 50263 50273 + 50287 50291 50311 50321 50329 50333 50341 50359 50363 50377 + 50383 50387 50411 50417 50423 50441 50459 50461 50497 50503 + 50513 50527 50539 50543 50549 50551 50581 50587 50591 50593 + 50599 50627 50647 50651 50671 50683 50707 50723 50741 50753 + 50767 50773 50777 50789 50821 50833 50839 50849 50857 50867 + 50873 50891 50893 50909 50923 50929 50951 50957 50969 50971 + 50989 50993 51001 51031 51043 51047 51059 51061 51071 51109 + 51131 51133 51137 51151 51157 51169 51193 51197 51199 51203 + 51217 51229 51239 51241 51257 51263 51283 51287 51307 51329 + 51341 51343 51347 51349 51361 51383 51407 51413 51419 51421 + 51427 51431 51437 51439 51449 51461 51473 51479 51481 51487 + 51503 51511 51517 51521 51539 51551 51563 51577 51581 51593 + 51599 51607 51613 51631 51637 51647 51659 51673 51679 51683 + 51691 51713 51719 51721 51749 51767 51769 51787 51797 51803 + 51817 51827 51829 51839 51853 51859 51869 51871 51893 51899 + 51907 51913 51929 51941 51949 51971 51973 51977 51991 52009 + 52021 52027 52051 52057 52067 52069 52081 52103 52121 52127 + 52147 52153 52163 52177 52181 52183 52189 52201 52223 52237 + 52249 52253 52259 52267 52289 52291 52301 52313 52321 52361 + 52363 52369 52379 52387 52391 52433 52453 52457 52489 52501 + 52511 52517 52529 52541 52543 52553 52561 52567 52571 52579 + 52583 52609 52627 52631 52639 52667 52673 52691 52697 52709 + 52711 52721 52727 52733 52747 52757 52769 52783 52807 52813 + 52817 52837 52859 52861 52879 52883 52889 52901 52903 52919 + 52937 52951 52957 52963 52967 52973 52981 52999 53003 53017 + 53047 53051 53069 53077 53087 53089 53093 53101 53113 53117 + 53129 53147 53149 53161 53171 53173 53189 53197 53201 53231 + 53233 53239 53267 53269 53279 53281 53299 53309 53323 53327 + 53353 53359 53377 53381 53401 53407 53411 53419 53437 53441 + 53453 53479 53503 53507 53527 53549 53551 53569 53591 53593 + 53597 53609 53611 53617 53623 53629 53633 53639 53653 53657 + 53681 53693 53699 53717 53719 53731 53759 53773 53777 53783 + 53791 53813 53819 53831 53849 53857 53861 53881 53887 53891 + 53897 53899 53917 53923 53927 53939 53951 53959 53987 53993 + 54001 54011 54013 54037 54049 54059 54083 54091 54101 54121 + 54133 54139 54151 54163 54167 54181 54193 54217 54251 54269 + 54277 54287 54293 54311 54319 54323 54331 54347 54361 54367 + 54371 54377 54401 54403 54409 54413 54419 54421 54437 54443 + 54449 54469 54493 54497 54499 54503 54517 54521 54539 54541 + 54547 54559 54563 54577 54581 54583 54601 54617 54623 54629 + 54631 54647 54667 54673 54679 54709 54713 54721 54727 54751 + 54767 54773 54779 54787 54799 54829 54833 54851 54869 54877 + 54881 54907 54917 54919 54941 54949 54959 54973 54979 54983 + 55001 55009 55021 55049 55051 55057 55061 55073 55079 55103 + 55109 55117 55127 55147 55163 55171 55201 55207 55213 55217 + 55219 55229 55243 55249 55259 55291 55313 55331 55333 55337 + 55339 55343 55351 55373 55381 55399 55411 55439 55441 55457 + 55469 55487 55501 55511 55529 55541 55547 55579 55589 55603 + 55609 55619 55621 55631 55633 55639 55661 55663 55667 55673 + 55681 55691 55697 55711 55717 55721 55733 55763 55787 55793 + 55799 55807 55813 55817 55819 55823 55829 55837 55843 55849 + 55871 55889 55897 55901 55903 55921 55927 55931 55933 55949 + 55967 55987 55997 56003 56009 56039 56041 56053 56081 56087 + 56093 56099 56101 56113 56123 56131 56149 56167 56171 56179 + 56197 56207 56209 56237 56239 56249 56263 56267 56269 56299 + 56311 56333 56359 56369 56377 56383 56393 56401 56417 56431 + 56437 56443 56453 56467 56473 56477 56479 56489 56501 56503 + 56509 56519 56527 56531 56533 56543 56569 56591 56597 56599 + 56611 56629 56633 56659 56663 56671 56681 56687 56701 56711 + 56713 56731 56737 56747 56767 56773 56779 56783 56807 56809 + 56813 56821 56827 56843 56857 56873 56891 56893 56897 56909 + 56911 56921 56923 56929 56941 56951 56957 56963 56983 56989 + 56993 56999 57037 57041 57047 57059 57073 57077 57089 57097 + 57107 57119 57131 57139 57143 57149 57163 57173 57179 57191 + 57193 57203 57221 57223 57241 57251 57259 57269 57271 57283 + 57287 57301 57329 57331 57347 57349 57367 57373 57383 57389 + 57397 57413 57427 57457 57467 57487 57493 57503 57527 57529 + 57557 57559 57571 57587 57593 57601 57637 57641 57649 57653 + 57667 57679 57689 57697 57709 57713 57719 57727 57731 57737 + 57751 57773 57781 57787 57791 57793 57803 57809 57829 57839 + 57847 57853 57859 57881 57899 57901 57917 57923 57943 57947 + 57973 57977 57991 58013 58027 58031 58043 58049 58057 58061 + 58067 58073 58099 58109 58111 58129 58147 58151 58153 58169 + 58171 58189 58193 58199 58207 58211 58217 58229 58231 58237 + 58243 58271 58309 58313 58321 58337 58363 58367 58369 58379 + 58391 58393 58403 58411 58417 58427 58439 58441 58451 58453 + 58477 58481 58511 58537 58543 58549 58567 58573 58579 58601 + 58603 58613 58631 58657 58661 58679 58687 58693 58699 58711 + 58727 58733 58741 58757 58763 58771 58787 58789 58831 58889 + 58897 58901 58907 58909 58913 58921 58937 58943 58963 58967 + 58979 58991 58997 59009 59011 59021 59023 59029 59051 59053 + 59063 59069 59077 59083 59093 59107 59113 59119 59123 59141 + 59149 59159 59167 59183 59197 59207 59209 59219 59221 59233 + 59239 59243 59263 59273 59281 59333 59341 59351 59357 59359 + 59369 59377 59387 59393 59399 59407 59417 59419 59441 59443 + 59447 59453 59467 59471 59473 59497 59509 59513 59539 59557 + 59561 59567 59581 59611 59617 59621 59627 59629 59651 59659 + 59663 59669 59671 59693 59699 59707 59723 59729 59743 59747 + 59753 59771 59779 59791 59797 59809 59833 59863 59879 59887 + 59921 59929 59951 59957 59971 59981 59999 60013 60017 60029 + 60037 60041 60077 60083 60089 60091 60101 60103 60107 60127 + 60133 60139 60149 60161 60167 60169 60209 60217 60223 60251 + 60257 60259 60271 60289 60293 60317 60331 60337 60343 60353 + 60373 60383 60397 60413 60427 60443 60449 60457 60493 60497 + 60509 60521 60527 60539 60589 60601 60607 60611 60617 60623 + 60631 60637 60647 60649 60659 60661 60679 60689 60703 60719 + 60727 60733 60737 60757 60761 60763 60773 60779 60793 60811 + 60821 60859 60869 60887 60889 60899 60901 60913 60917 60919 + 60923 60937 60943 60953 60961 61001 61007 61027 61031 61043 + 61051 61057 61091 61099 61121 61129 61141 61151 61153 61169 + 61211 61223 61231 61253 61261 61283 61291 61297 61331 61333 + 61339 61343 61357 61363 61379 61381 61403 61409 61417 61441 + 61463 61469 61471 61483 61487 61493 61507 61511 61519 61543 + 61547 61553 61559 61561 61583 61603 61609 61613 61627 61631 + 61637 61643 61651 61657 61667 61673 61681 61687 61703 61717 + 61723 61729 61751 61757 61781 61813 61819 61837 61843 61861 + 61871 61879 61909 61927 61933 61949 61961 61967 61979 61981 + 61987 61991 62003 62011 62017 62039 62047 62053 62057 62071 + 62081 62099 62119 62129 62131 62137 62141 62143 62171 62189 + 62191 62201 62207 62213 62219 62233 62273 62297 62299 62303 + 62311 62323 62327 62347 62351 62383 62401 62417 62423 62459 + 62467 62473 62477 62483 62497 62501 62507 62533 62539 62549 + 62563 62581 62591 62597 62603 62617 62627 62633 62639 62653 + 62659 62683 62687 62701 62723 62731 62743 62753 62761 62773 + 62791 62801 62819 62827 62851 62861 62869 62873 62897 62903 + 62921 62927 62929 62939 62969 62971 62981 62983 62987 62989 + 63029 63031 63059 63067 63073 63079 63097 63103 63113 63127 + 63131 63149 63179 63197 63199 63211 63241 63247 63277 63281 + 63299 63311 63313 63317 63331 63337 63347 63353 63361 63367 + 63377 63389 63391 63397 63409 63419 63421 63439 63443 63463 + 63467 63473 63487 63493 63499 63521 63527 63533 63541 63559 + 63577 63587 63589 63599 63601 63607 63611 63617 63629 63647 + 63649 63659 63667 63671 63689 63691 63697 63703 63709 63719 + 63727 63737 63743 63761 63773 63781 63793 63799 63803 63809 + 63823 63839 63841 63853 63857 63863 63901 63907 63913 63929 + 63949 63977 63997 64007 64013 64019 64033 64037 64063 64067 + 64081 64091 64109 64123 64151 64153 64157 64171 64187 64189 + 64217 64223 64231 64237 64271 64279 64283 64301 64303 64319 + 64327 64333 64373 64381 64399 64403 64433 64439 64451 64453 + 64483 64489 64499 64513 64553 64567 64577 64579 64591 64601 + 64609 64613 64621 64627 64633 64661 64663 64667 64679 64693 + 64709 64717 64747 64763 64781 64783 64793 64811 64817 64849 + 64853 64871 64877 64879 64891 64901 64919 64921 64927 64937 + 64951 64969 64997 65003 65011 65027 65029 65033 65053 65063 + 65071 65089 65099 65101 65111 65119 65123 65129 65141 65147 + 65167 65171 65173 65179 65183 65203 65213 65239 65257 65267 + 65269 65287 65293 65309 65323 65327 65353 65357 65371 65381 + 65393 65407 65413 65419 65423 65437 65447 65449 65479 65497 + 65519 65521 65537 65539 65543 65551 65557 65563 65579 65581 + 65587 65599 65609 65617 65629 65633 65647 65651 65657 65677 + 65687 65699 65701 65707 65713 65717 65719 65729 65731 65761 + 65777 65789 65809 65827 65831 65837 65839 65843 65851 65867 + 65881 65899 65921 65927 65929 65951 65957 65963 65981 65983 + 65993 66029 66037 66041 66047 66067 66071 66083 66089 66103 + 66107 66109 66137 66161 66169 66173 66179 66191 66221 66239 + 66271 66293 66301 66337 66343 66347 66359 66361 66373 66377 + 66383 66403 66413 66431 66449 66457 66463 66467 66491 66499 + 66509 66523 66529 66533 66541 66553 66569 66571 66587 66593 + 66601 66617 66629 66643 66653 66683 66697 66701 66713 66721 + 66733 66739 66749 66751 66763 66791 66797 66809 66821 66841 + 66851 66853 66863 66877 66883 66889 66919 66923 66931 66943 + 66947 66949 66959 66973 66977 67003 67021 67033 67043 67049 + 67057 67061 67073 67079 67103 67121 67129 67139 67141 67153 + 67157 67169 67181 67187 67189 67211 67213 67217 67219 67231 + 67247 67261 67271 67273 67289 67307 67339 67343 67349 67369 + 67391 67399 67409 67411 67421 67427 67429 67433 67447 67453 + 67477 67481 67489 67493 67499 67511 67523 67531 67537 67547 + 67559 67567 67577 67579 67589 67601 67607 67619 67631 67651 + 67679 67699 67709 67723 67733 67741 67751 67757 67759 67763 + 67777 67783 67789 67801 67807 67819 67829 67843 67853 67867 + 67883 67891 67901 67927 67931 67933 67939 67943 67957 67961 + 67967 67979 67987 67993 68023 68041 68053 68059 68071 68087 + 68099 68111 68113 68141 68147 68161 68171 68207 68209 68213 + 68219 68227 68239 68261 68279 68281 68311 68329 68351 68371 + 68389 68399 68437 68443 68447 68449 68473 68477 68483 68489 + 68491 68501 68507 68521 68531 68539 68543 68567 68581 68597 + 68611 68633 68639 68659 68669 68683 68687 68699 68711 68713 + 68729 68737 68743 68749 68767 68771 68777 68791 68813 68819 + 68821 68863 68879 68881 68891 68897 68899 68903 68909 68917 + 68927 68947 68963 68993 69001 69011 69019 69029 69031 69061 + 69067 69073 69109 69119 69127 69143 69149 69151 69163 69191 + 69193 69197 69203 69221 69233 69239 69247 69257 69259 69263 + 69313 69317 69337 69341 69371 69379 69383 69389 69401 69403 + 69427 69431 69439 69457 69463 69467 69473 69481 69491 69493 + 69497 69499 69539 69557 69593 69623 69653 69661 69677 69691 + 69697 69709 69737 69739 69761 69763 69767 69779 69809 69821 + 69827 69829 69833 69847 69857 69859 69877 69899 69911 69929 + 69931 69941 69959 69991 69997 70001 70003 70009 70019 70039 + 70051 70061 70067 70079 70099 70111 70117 70121 70123 70139 + 70141 70157 70163 70177 70181 70183 70199 70201 70207 70223 + 70229 70237 70241 70249 70271 70289 70297 70309 70313 70321 + 70327 70351 70373 70379 70381 70393 70423 70429 70439 70451 + 70457 70459 70481 70487 70489 70501 70507 70529 70537 70549 + 70571 70573 70583 70589 70607 70619 70621 70627 70639 70657 + 70663 70667 70687 70709 70717 70729 70753 70769 70783 70793 + 70823 70841 70843 70849 70853 70867 70877 70879 70891 70901 + 70913 70919 70921 70937 70949 70951 70957 70969 70979 70981 + 70991 70997 70999 71011 71023 71039 71059 71069 71081 71089 + 71119 71129 71143 71147 71153 71161 71167 71171 71191 71209 + 71233 71237 71249 71257 71261 71263 71287 71293 71317 71327 + 71329 71333 71339 71341 71347 71353 71359 71363 71387 71389 + 71399 71411 71413 71419 71429 71437 71443 71453 71471 71473 + 71479 71483 71503 71527 71537 71549 71551 71563 71569 71593 + 71597 71633 71647 71663 71671 71693 71699 71707 71711 71713 + 71719 71741 71761 71777 71789 71807 71809 71821 71837 71843 + 71849 71861 71867 71879 71881 71887 71899 71909 71917 71933 + 71941 71947 71963 71971 71983 71987 71993 71999 72019 72031 + 72043 72047 72053 72073 72077 72089 72091 72101 72103 72109 + 72139 72161 72167 72169 72173 72211 72221 72223 72227 72229 + 72251 72253 72269 72271 72277 72287 72307 72313 72337 72341 + 72353 72367 72379 72383 72421 72431 72461 72467 72469 72481 + 72493 72497 72503 72533 72547 72551 72559 72577 72613 72617 + 72623 72643 72647 72649 72661 72671 72673 72679 72689 72701 + 72707 72719 72727 72733 72739 72763 72767 72797 72817 72823 + 72859 72869 72871 72883 72889 72893 72901 72907 72911 72923 + 72931 72937 72949 72953 72959 72973 72977 72997 73009 73013 + 73019 73037 73039 73043 73061 73063 73079 73091 73121 73127 + 73133 73141 73181 73189 73237 73243 73259 73277 73291 73303 + 73309 73327 73331 73351 73361 73363 73369 73379 73387 73417 + 73421 73433 73453 73459 73471 73477 73483 73517 73523 73529 + 73547 73553 73561 73571 73583 73589 73597 73607 73609 73613 + 73637 73643 73651 73673 73679 73681 73693 73699 73709 73721 + 73727 73751 73757 73771 73783 73819 73823 73847 73849 73859 + 73867 73877 73883 73897 73907 73939 73943 73951 73961 73973 + 73999 74017 74021 74027 74047 74051 74071 74077 74093 74099 + 74101 74131 74143 74149 74159 74161 74167 74177 74189 74197 + 74201 74203 74209 74219 74231 74257 74279 74287 74293 74297 + 74311 74317 74323 74353 74357 74363 74377 74381 74383 74411 + 74413 74419 74441 74449 74453 74471 74489 74507 74509 74521 + 74527 74531 74551 74561 74567 74573 74587 74597 74609 74611 + 74623 74653 74687 74699 74707 74713 74717 74719 74729 74731 + 74747 74759 74761 74771 74779 74797 74821 74827 74831 74843 + 74857 74861 74869 74873 74887 74891 74897 74903 74923 74929 + 74933 74941 74959 75011 75013 75017 75029 75037 75041 75079 + 75083 75109 75133 75149 75161 75167 75169 75181 75193 75209 + 75211 75217 75223 75227 75239 75253 75269 75277 75289 75307 + 75323 75329 75337 75347 75353 75367 75377 75389 75391 75401 + 75403 75407 75431 75437 75479 75503 75511 75521 75527 75533 + 75539 75541 75553 75557 75571 75577 75583 75611 75617 75619 + 75629 75641 75653 75659 75679 75683 75689 75703 75707 75709 + 75721 75731 75743 75767 75773 75781 75787 75793 75797 75821 + 75833 75853 75869 75883 75913 75931 75937 75941 75967 75979 + 75983 75989 75991 75997 76001 76003 76031 76039 76079 76081 + 76091 76099 76103 76123 76129 76147 76157 76159 76163 76207 + 76213 76231 76243 76249 76253 76259 76261 76283 76289 76303 + 76333 76343 76367 76369 76379 76387 76403 76421 76423 76441 + 76463 76471 76481 76487 76493 76507 76511 76519 76537 76541 + 76543 76561 76579 76597 76603 76607 76631 76649 76651 76667 + 76673 76679 76697 76717 76733 76753 76757 76771 76777 76781 + 76801 76819 76829 76831 76837 76847 76871 76873 76883 76907 + 76913 76919 76943 76949 76961 76963 76991 77003 77017 77023 + 77029 77041 77047 77069 77081 77093 77101 77137 77141 77153 + 77167 77171 77191 77201 77213 77237 77239 77243 77249 77261 + 77263 77267 77269 77279 77291 77317 77323 77339 77347 77351 + 77359 77369 77377 77383 77417 77419 77431 77447 77471 77477 + 77479 77489 77491 77509 77513 77521 77527 77543 77549 77551 + 77557 77563 77569 77573 77587 77591 77611 77617 77621 77641 + 77647 77659 77681 77687 77689 77699 77711 77713 77719 77723 + 77731 77743 77747 77761 77773 77783 77797 77801 77813 77839 + 77849 77863 77867 77893 77899 77929 77933 77951 77969 77977 + 77983 77999 78007 78017 78031 78041 78049 78059 78079 78101 + 78121 78137 78139 78157 78163 78167 78173 78179 78191 78193 + 78203 78229 78233 78241 78259 78277 78283 78301 78307 78311 + 78317 78341 78347 78367 78401 78427 78437 78439 78467 78479 + 78487 78497 78509 78511 78517 78539 78541 78553 78569 78571 + 78577 78583 78593 78607 78623 78643 78649 78653 78691 78697 + 78707 78713 78721 78737 78779 78781 78787 78791 78797 78803 + 78809 78823 78839 78853 78857 78877 78887 78889 78893 78901 + 78919 78929 78941 78977 78979 78989 79031 79039 79043 79063 + 79087 79103 79111 79133 79139 79147 79151 79153 79159 79181 + 79187 79193 79201 79229 79231 79241 79259 79273 79279 79283 + 79301 79309 79319 79333 79337 79349 79357 79367 79379 79393 + 79397 79399 79411 79423 79427 79433 79451 79481 79493 79531 + 79537 79549 79559 79561 79579 79589 79601 79609 79613 79621 + 79627 79631 79633 79657 79669 79687 79691 79693 79697 79699 + 79757 79769 79777 79801 79811 79813 79817 79823 79829 79841 + 79843 79847 79861 79867 79873 79889 79901 79903 79907 79939 + 79943 79967 79973 79979 79987 79997 79999 80021 80039 80051 + 80071 80077 80107 80111 80141 80147 80149 80153 80167 80173 + 80177 80191 80207 80209 80221 80231 80233 80239 80251 80263 + 80273 80279 80287 80309 80317 80329 80341 80347 80363 80369 + 80387 80407 80429 80447 80449 80471 80473 80489 80491 80513 + 80527 80537 80557 80567 80599 80603 80611 80621 80627 80629 + 80651 80657 80669 80671 80677 80681 80683 80687 80701 80713 + 80737 80747 80749 80761 80777 80779 80783 80789 80803 80809 + 80819 80831 80833 80849 80863 80897 80909 80911 80917 80923 + 80929 80933 80953 80963 80989 81001 81013 81017 81019 81023 + 81031 81041 81043 81047 81049 81071 81077 81083 81097 81101 + 81119 81131 81157 81163 81173 81181 81197 81199 81203 81223 + 81233 81239 81281 81283 81293 81299 81307 81331 81343 81349 + 81353 81359 81371 81373 81401 81409 81421 81439 81457 81463 + 81509 81517 81527 81533 81547 81551 81553 81559 81563 81569 + 81611 81619 81629 81637 81647 81649 81667 81671 81677 81689 + 81701 81703 81707 81727 81737 81749 81761 81769 81773 81799 + 81817 81839 81847 81853 81869 81883 81899 81901 81919 81929 + 81931 81937 81943 81953 81967 81971 81973 82003 82007 82009 + 82013 82021 82031 82037 82039 82051 82067 82073 82129 82139 + 82141 82153 82163 82171 82183 82189 82193 82207 82217 82219 + 82223 82231 82237 82241 82261 82267 82279 82301 82307 82339 + 82349 82351 82361 82373 82387 82393 82421 82457 82463 82469 + 82471 82483 82487 82493 82499 82507 82529 82531 82549 82559 + 82561 82567 82571 82591 82601 82609 82613 82619 82633 82651 + 82657 82699 82721 82723 82727 82729 82757 82759 82763 82781 + 82787 82793 82799 82811 82813 82837 82847 82883 82889 82891 + 82903 82913 82939 82963 82981 82997 83003 83009 83023 83047 + 83059 83063 83071 83077 83089 83093 83101 83117 83137 83177 + 83203 83207 83219 83221 83227 83231 83233 83243 83257 83267 + 83269 83273 83299 83311 83339 83341 83357 83383 83389 83399 + 83401 83407 83417 83423 83431 83437 83443 83449 83459 83471 + 83477 83497 83537 83557 83561 83563 83579 83591 83597 83609 + 83617 83621 83639 83641 83653 83663 83689 83701 83717 83719 + 83737 83761 83773 83777 83791 83813 83833 83843 83857 83869 + 83873 83891 83903 83911 83921 83933 83939 83969 83983 83987 + 84011 84017 84047 84053 84059 84061 84067 84089 84121 84127 + 84131 84137 84143 84163 84179 84181 84191 84199 84211 84221 + 84223 84229 84239 84247 84263 84299 84307 84313 84317 84319 + 84347 84349 84377 84389 84391 84401 84407 84421 84431 84437 + 84443 84449 84457 84463 84467 84481 84499 84503 84509 84521 + 84523 84533 84551 84559 84589 84629 84631 84649 84653 84659 + 84673 84691 84697 84701 84713 84719 84731 84737 84751 84761 + 84787 84793 84809 84811 84827 84857 84859 84869 84871 84913 + 84919 84947 84961 84967 84977 84979 84991 85009 85021 85027 + 85037 85049 85061 85081 85087 85091 85093 85103 85109 85121 + 85133 85147 85159 85193 85199 85201 85213 85223 85229 85237 + 85243 85247 85259 85297 85303 85313 85331 85333 85361 85363 + 85369 85381 85411 85427 85429 85439 85447 85451 85453 85469 + 85487 85513 85517 85523 85531 85549 85571 85577 85597 85601 + 85607 85619 85621 85627 85639 85643 85661 85667 85669 85691 + 85703 85711 85717 85733 85751 85781 85793 85817 85819 85829 + 85831 85837 85843 85847 85853 85889 85903 85909 85931 85933 + 85991 85999 86011 86017 86027 86029 86069 86077 86083 86111 + 86113 86117 86131 86137 86143 86161 86171 86179 86183 86197 + 86201 86209 86239 86243 86249 86257 86263 86269 86287 86291 + 86293 86297 86311 86323 86341 86351 86353 86357 86369 86371 + 86381 86389 86399 86413 86423 86441 86453 86461 86467 86477 + 86491 86501 86509 86531 86533 86539 86561 86573 86579 86587 + 86599 86627 86629 86677 86689 86693 86711 86719 86729 86743 + 86753 86767 86771 86783 86813 86837 86843 86851 86857 86861 + 86869 86923 86927 86929 86939 86951 86959 86969 86981 86993 + 87011 87013 87037 87041 87049 87071 87083 87103 87107 87119 + 87121 87133 87149 87151 87179 87181 87187 87211 87221 87223 + 87251 87253 87257 87277 87281 87293 87299 87313 87317 87323 + 87337 87359 87383 87403 87407 87421 87427 87433 87443 87473 + 87481 87491 87509 87511 87517 87523 87539 87541 87547 87553 + 87557 87559 87583 87587 87589 87613 87623 87629 87631 87641 + 87643 87649 87671 87679 87683 87691 87697 87701 87719 87721 + 87739 87743 87751 87767 87793 87797 87803 87811 87833 87853 + 87869 87877 87881 87887 87911 87917 87931 87943 87959 87961 + 87973 87977 87991 88001 88003 88007 88019 88037 88069 88079 + 88093 88117 88129 88169 88177 88211 88223 88237 88241 88259 + 88261 88289 88301 88321 88327 88337 88339 88379 88397 88411 + 88423 88427 88463 88469 88471 88493 88499 88513 88523 88547 + 88589 88591 88607 88609 88643 88651 88657 88661 88663 88667 + 88681 88721 88729 88741 88747 88771 88789 88793 88799 88801 + 88807 88811 88813 88817 88819 88843 88853 88861 88867 88873 + 88883 88897 88903 88919 88937 88951 88969 88993 88997 89003 + 89009 89017 89021 89041 89051 89057 89069 89071 89083 89087 + 89101 89107 89113 89119 89123 89137 89153 89189 89203 89209 + 89213 89227 89231 89237 89261 89269 89273 89293 89303 89317 + 89329 89363 89371 89381 89387 89393 89399 89413 89417 89431 + 89443 89449 89459 89477 89491 89501 89513 89519 89521 89527 + 89533 89561 89563 89567 89591 89597 89599 89603 89611 89627 + 89633 89653 89657 89659 89669 89671 89681 89689 89753 89759 + 89767 89779 89783 89797 89809 89819 89821 89833 89839 89849 + 89867 89891 89897 89899 89909 89917 89923 89939 89959 89963 + 89977 89983 89989 90001 90007 90011 90017 90019 90023 90031 + 90053 90059 90067 90071 90073 90089 90107 90121 90127 90149 + 90163 90173 90187 90191 90197 90199 90203 90217 90227 90239 + 90247 90263 90271 90281 90289 90313 90353 90359 90371 90373 + 90379 90397 90401 90403 90407 90437 90439 90469 90473 90481 + 90499 90511 90523 90527 90529 90533 90547 90583 90599 90617 + 90619 90631 90641 90647 90659 90677 90679 90697 90703 90709 + 90731 90749 90787 90793 90803 90821 90823 90833 90841 90847 + 90863 90887 90901 90907 90911 90917 90931 90947 90971 90977 + 90989 90997 91009 91019 91033 91079 91081 91097 91099 91121 + 91127 91129 91139 91141 91151 91153 91159 91163 91183 91193 + 91199 91229 91237 91243 91249 91253 91283 91291 91297 91303 + 91309 91331 91367 91369 91373 91381 91387 91393 91397 91411 + 91423 91433 91453 91457 91459 91463 91493 91499 91513 91529 + 91541 91571 91573 91577 91583 91591 91621 91631 91639 91673 + 91691 91703 91711 91733 91753 91757 91771 91781 91801 91807 + 91811 91813 91823 91837 91841 91867 91873 91909 91921 91939 + 91943 91951 91957 91961 91967 91969 91997 92003 92009 92033 + 92041 92051 92077 92083 92107 92111 92119 92143 92153 92173 + 92177 92179 92189 92203 92219 92221 92227 92233 92237 92243 + 92251 92269 92297 92311 92317 92333 92347 92353 92357 92363 + 92369 92377 92381 92383 92387 92399 92401 92413 92419 92431 + 92459 92461 92467 92479 92489 92503 92507 92551 92557 92567 + 92569 92581 92593 92623 92627 92639 92641 92647 92657 92669 + 92671 92681 92683 92693 92699 92707 92717 92723 92737 92753 + 92761 92767 92779 92789 92791 92801 92809 92821 92831 92849 + 92857 92861 92863 92867 92893 92899 92921 92927 92941 92951 + 92957 92959 92987 92993 93001 93047 93053 93059 93077 93083 + 93089 93097 93103 93113 93131 93133 93139 93151 93169 93179 + 93187 93199 93229 93239 93241 93251 93253 93257 93263 93281 + 93283 93287 93307 93319 93323 93329 93337 93371 93377 93383 + 93407 93419 93427 93463 93479 93481 93487 93491 93493 93497 + 93503 93523 93529 93553 93557 93559 93563 93581 93601 93607 + 93629 93637 93683 93701 93703 93719 93739 93761 93763 93787 + 93809 93811 93827 93851 93871 93887 93889 93893 93901 93911 + 93913 93923 93937 93941 93949 93967 93971 93979 93983 93997 + 94007 94009 94033 94049 94057 94063 94079 94099 94109 94111 + 94117 94121 94151 94153 94169 94201 94207 94219 94229 94253 + 94261 94273 94291 94307 94309 94321 94327 94331 94343 94349 + 94351 94379 94397 94399 94421 94427 94433 94439 94441 94447 + 94463 94477 94483 94513 94529 94531 94541 94543 94547 94559 + 94561 94573 94583 94597 94603 94613 94621 94649 94651 94687 + 94693 94709 94723 94727 94747 94771 94777 94781 94789 94793 + 94811 94819 94823 94837 94841 94847 94849 94873 94889 94903 + 94907 94933 94949 94951 94961 94993 94999 95003 95009 95021 + 95027 95063 95071 95083 95087 95089 95093 95101 95107 95111 + 95131 95143 95153 95177 95189 95191 95203 95213 95219 95231 + 95233 95239 95257 95261 95267 95273 95279 95287 95311 95317 + 95327 95339 95369 95383 95393 95401 95413 95419 95429 95441 + 95443 95461 95467 95471 95479 95483 95507 95527 95531 95539 + 95549 95561 95569 95581 95597 95603 95617 95621 95629 95633 + 95651 95701 95707 95713 95717 95723 95731 95737 95747 95773 + 95783 95789 95791 95801 95803 95813 95819 95857 95869 95873 + 95881 95891 95911 95917 95923 95929 95947 95957 95959 95971 + 95987 95989 96001 96013 96017 96043 96053 96059 96079 96097 + 96137 96149 96157 96167 96179 96181 96199 96211 96221 96223 + 96233 96259 96263 96269 96281 96289 96293 96323 96329 96331 + 96337 96353 96377 96401 96419 96431 96443 96451 96457 96461 + 96469 96479 96487 96493 96497 96517 96527 96553 96557 96581 + 96587 96589 96601 96643 96661 96667 96671 96697 96703 96731 + 96737 96739 96749 96757 96763 96769 96779 96787 96797 96799 + 96821 96823 96827 96847 96851 96857 96893 96907 96911 96931 + 96953 96959 96973 96979 96989 96997 97001 97003 97007 97021 + 97039 97073 97081 97103 97117 97127 97151 97157 97159 97169 + 97171 97177 97187 97213 97231 97241 97259 97283 97301 97303 + 97327 97367 97369 97373 97379 97381 97387 97397 97423 97429 + 97441 97453 97459 97463 97499 97501 97511 97523 97547 97549 + 97553 97561 97571 97577 97579 97583 97607 97609 97613 97649 + 97651 97673 97687 97711 97729 97771 97777 97787 97789 97813 + 97829 97841 97843 97847 97849 97859 97861 97871 97879 97883 + 97919 97927 97931 97943 97961 97967 97973 97987 98009 98011 + 98017 98041 98047 98057 98081 98101 98123 98129 98143 98179 + 98207 98213 98221 98227 98251 98257 98269 98297 98299 98317 + 98321 98323 98327 98347 98369 98377 98387 98389 98407 98411 + 98419 98429 98443 98453 98459 98467 98473 98479 98491 98507 + 98519 98533 98543 98561 98563 98573 98597 98621 98627 98639 + 98641 98663 98669 98689 98711 98713 98717 98729 98731 98737 + 98773 98779 98801 98807 98809 98837 98849 98867 98869 98873 + 98887 98893 98897 98899 98909 98911 98927 98929 98939 98947 + 98953 98963 98981 98993 98999 99013 99017 99023 99041 99053 + 99079 99083 99089 99103 99109 99119 99131 99133 99137 99139 + 99149 99173 99181 99191 99223 99233 99241 99251 99257 99259 + 99277 99289 99317 99347 99349 99367 99371 99377 99391 99397 + 99401 99409 99431 99439 99469 99487 99497 99523 99527 99529 + 99551 99559 99563 99571 99577 99581 99607 99611 99623 99643 + 99661 99667 99679 99689 99707 99709 99713 99719 99721 99733 + 99761 99767 99787 99793 99809 99817 99823 99829 99833 99839 + 99859 99871 99877 99881 99901 99907 99923 99929 99961 99971 + 99989 99991 100003 100019 100043 100049 100057 100069 100103 100109 + 100129 100151 100153 100169 100183 100189 100193 100207 100213 100237 + 100267 100271 100279 100291 100297 100313 100333 100343 100357 100361 + 100363 100379 100391 100393 100403 100411 100417 100447 100459 100469 + 100483 100493 100501 100511 100517 100519 100523 100537 100547 100549 + 100559 100591 100609 100613 100621 100649 100669 100673 100693 100699 + 100703 100733 100741 100747 100769 100787 100799 100801 100811 100823 + 100829 100847 100853 100907 100913 100927 100931 100937 100943 100957 + 100981 100987 100999 101009 101021 101027 101051 101063 101081 101089 + 101107 101111 101113 101117 101119 101141 101149 101159 101161 101173 + 101183 101197 101203 101207 101209 101221 101267 101273 101279 101281 + 101287 101293 101323 101333 101341 101347 101359 101363 101377 101383 + 101399 101411 101419 101429 101449 101467 101477 101483 101489 101501 + 101503 101513 101527 101531 101533 101537 101561 101573 101581 101599 + 101603 101611 101627 101641 101653 101663 101681 101693 101701 101719 + 101723 101737 101741 101747 101749 101771 101789 101797 101807 101833 + 101837 101839 101863 101869 101873 101879 101891 101917 101921 101929 + 101939 101957 101963 101977 101987 101999 102001 102013 102019 102023 + 102031 102043 102059 102061 102071 102077 102079 102101 102103 102107 + 102121 102139 102149 102161 102181 102191 102197 102199 102203 102217 + 102229 102233 102241 102251 102253 102259 102293 102299 102301 102317 + 102329 102337 102359 102367 102397 102407 102409 102433 102437 102451 + 102461 102481 102497 102499 102503 102523 102533 102539 102547 102551 + 102559 102563 102587 102593 102607 102611 102643 102647 102653 102667 + 102673 102677 102679 102701 102761 102763 102769 102793 102797 102811 + 102829 102841 102859 102871 102877 102881 102911 102913 102929 102931 + 102953 102967 102983 103001 103007 103043 103049 103067 103069 103079 + 103087 103091 103093 103099 103123 103141 103171 103177 103183 103217 + 103231 103237 103289 103291 103307 103319 103333 103349 103357 103387 + 103391 103393 103399 103409 103421 103423 103451 103457 103471 103483 + 103511 103529 103549 103553 103561 103567 103573 103577 103583 103591 + 103613 103619 103643 103651 103657 103669 103681 103687 103699 103703 + 103723 103769 103787 103801 103811 103813 103837 103841 103843 103867 + 103889 103903 103913 103919 103951 103963 103967 103969 103979 103981 + 103991 103993 103997 104003 104009 104021 104033 104047 104053 104059 + 104087 104089 104107 104113 104119 104123 104147 104149 104161 104173 + 104179 104183 104207 104231 104233 104239 104243 104281 104287 104297 + 104309 104311 104323 104327 104347 104369 104381 104383 104393 104399 + 104417 104459 104471 104473 104479 104491 104513 104527 104537 104543 + 104549 104551 104561 104579 104593 104597 104623 104639 104651 104659 + 104677 104681 104683 104693 104701 104707 104711 104717 104723 104729 diff --git a/src/utils/__tests__/memory/meminfo.ubuntu14.txt b/src/utils/__tests__/memory/meminfo.ubuntu14.txt new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/memory/meminfo.ubuntu14.txt @@ -0,0 +1,42 @@ +MemTotal: 7659508 kB +MemFree: 246684 kB +Buffers: 126580 kB +Cached: 3296948 kB +SwapCached: 0 kB +Active: 4916076 kB +Inactive: 1732880 kB +Active(anon): 3225504 kB +Inactive(anon): 20576 kB +Active(file): 1690572 kB +Inactive(file): 1712304 kB +Unevictable: 0 kB +Mlocked: 0 kB +SwapTotal: 0 kB +SwapFree: 0 kB +Dirty: 32 kB +Writeback: 0 kB +AnonPages: 3225428 kB +Mapped: 37500 kB +Shmem: 20652 kB +Slab: 633908 kB +SReclaimable: 467472 kB +SUnreclaim: 166436 kB +KernelStack: 2416 kB +PageTables: 64744 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 3829752 kB +Committed_AS: 4935116 kB +VmallocTotal: 34359738367 kB +VmallocUsed: 17244 kB +VmallocChunk: 34359712740 kB +HardwareCorrupted: 0 kB +AnonHugePages: 954368 kB +HugePages_Total: 0 +HugePages_Free: 0 +HugePages_Rsvd: 0 +HugePages_Surp: 0 +Hugepagesize: 2048 kB +DirectMap4k: 45056 kB +DirectMap2M: 7950336 kB diff --git a/src/utils/__tests__/memory/vmstat.yosemite.txt b/src/utils/__tests__/memory/vmstat.yosemite.txt new file mode 100644 --- /dev/null +++ b/src/utils/__tests__/memory/vmstat.yosemite.txt @@ -0,0 +1,23 @@ +Mach Virtual Memory Statistics: (page size of 4096 bytes) +Pages free: 422941. +Pages active: 2348641. +Pages inactive: 830440. +Pages speculative: 110635. +Pages throttled: 0. +Pages wired down: 427172. +Pages purgeable: 33368. +"Translation faults": 931955891. +Pages copy-on-write: 59498342. +Pages zero filled: 411628732. +Pages reactivated: 175636. +Pages purged: 569552. +File-backed pages: 926777. +Anonymous pages: 2362939. +Pages stored in compressor: 125673. +Pages occupied by compressor: 51938. +Decompressions: 32945. +Compressions: 197789. +Pageins: 13750115. +Pageouts: 39562. +Swapins: 0. +Swapouts: 2290. diff --git a/src/utils/utf8.php b/src/utils/utf8.php new file mode 100644 --- /dev/null +++ b/src/utils/utf8.php @@ -0,0 +1,950 @@ += 0xD800 && $codepoint <= 0xDFFF) { + $result[] = str_repeat($replacement, strlen($match)); + $offset += strlen($matches[0]); + continue; + } + } + + $result[] = $match; + } else { + // Unicode replacement character, U+FFFD. + $result[] = $replacement; + } + + $offset += strlen($matches[0]); + } + + return implode('', $result); +} + + +/** + * Determine if a string is valid UTF-8, with only basic multilingual plane + * characters. This is particularly important because MySQL's `utf8` column + * types silently truncate strings which contain characters outside of this + * set. + * + * @param string String to test for being valid UTF-8 with only characters in + * the basic multilingual plane. + * @return bool True if the string is valid UTF-8 with only BMP characters. + */ +function phutil_is_utf8_with_only_bmp_characters($string) { + return phutil_is_utf8_slowly($string, $only_bmp = true); +} + + +/** + * Determine if a string is valid UTF-8. + * + * @param string Some string which may or may not be valid UTF-8. + * @return bool True if the string is valid UTF-8. + */ +function phutil_is_utf8($string) { + if (function_exists('mb_check_encoding')) { + // If mbstring is available, this is significantly faster than using PHP. + return mb_check_encoding($string, 'UTF-8'); + } + + return phutil_is_utf8_slowly($string); +} + + +/** + * Determine if a string is valid UTF-8, slowly. + * + * This works on any system, but has very poor performance. + * + * You should call @{function:phutil_is_utf8} instead of this function, as + * that function can use more performant mechanisms if they are available on + * the system. + * + * @param string Some string which may or may not be valid UTF-8. + * @param bool True to require all characters be part of the basic + * multilingual plane (no more than 3-bytes long). + * @return bool True if the string is valid UTF-8. + */ +function phutil_is_utf8_slowly($string, $only_bmp = false) { + // First, check the common case of normal ASCII strings. We're fine if + // the string contains no bytes larger than 127. + if (preg_match('/^[\x01-\x7F]+\z/', $string)) { + return true; + } + + // NOTE: In the past, we used a large regular expression in the form of + // '(x|y|z)+' to match UTF8 strings. However, PCRE can segfaults on patterns + // like this at relatively small input sizes, at least on some systems + // (observed on OSX and Windows). This is apparently because the internal + // implementation is recursive and it blows the stack. + + // See for some discussion. Since the + // input limit is extremely low (less than 50KB on my system), do this check + // very very slowly in PHP instead. See also T5316. + + $len = strlen($string); + for ($ii = 0; $ii < $len; $ii++) { + $chr = ord($string[$ii]); + if ($chr >= 0x01 && $chr <= 0x7F) { + continue; + } else if ($chr >= 0xC2 && $chr <= 0xDF) { + ++$ii; + if ($ii >= $len) { + return false; + } + $chr = ord($string[$ii]); + if ($chr >= 0x80 && $chr <= 0xBF) { + continue; + } + return false; + } else if ($chr > 0xE0 && $chr <= 0xEF) { + ++$ii; + if ($ii >= $len) { + return false; + } + $chr = ord($string[$ii]); + if ($chr >= 0x80 && $chr <= 0xBF) { + ++$ii; + if ($ii >= $len) { + return false; + } + $chr = ord($string[$ii]); + if ($chr >= 0x80 && $chr <= 0xBF) { + continue; + } + } + return false; + } else if ($chr == 0xE0) { + ++$ii; + if ($ii >= $len) { + return false; + } + $chr = ord($string[$ii]); + + // NOTE: This range starts at 0xA0, not 0x80. The values 0x80-0xA0 are + // "valid", but not minimal representations, and MySQL rejects them. We're + // special casing this part of the range. + + if ($chr >= 0xA0 && $chr <= 0xBF) { + ++$ii; + if ($ii >= $len) { + return false; + } + $chr = ord($string[$ii]); + if ($chr >= 0x80 && $chr <= 0xBF) { + continue; + } + } + return false; + } else if (!$only_bmp) { + if ($chr > 0xF0 && $chr <= 0xF4) { + ++$ii; + if ($ii >= $len) { + return false; + } + $chr = ord($string[$ii]); + if ($chr >= 0x80 && $chr <= 0xBF) { + ++$ii; + if ($ii >= $len) { + return false; + } + $chr = ord($string[$ii]); + if ($chr >= 0x80 && $chr <= 0xBF) { + ++$ii; + if ($ii >= $len) { + return false; + } + $chr = ord($string[$ii]); + if ($chr >= 0x80 && $chr <= 0xBF) { + continue; + } + } + } + } else if ($chr == 0xF0) { + ++$ii; + if ($ii >= $len) { + return false; + } + $chr = ord($string[$ii]); + + // NOTE: As above, this range starts at 0x90, not 0x80. The values + // 0x80-0x90 are not minimal representations. + + if ($chr >= 0x90 && $chr <= 0xBF) { + ++$ii; + if ($ii >= $len) { + return false; + } + $chr = ord($string[$ii]); + if ($chr >= 0x80 && $chr <= 0xBF) { + ++$ii; + if ($ii >= $len) { + return false; + } + $chr = ord($string[$ii]); + if ($chr >= 0x80 && $chr <= 0xBF) { + continue; + } + } + } + } + } + + return false; + } + + return true; +} + + +/** + * Find the character length of a UTF-8 string. + * + * @param string A valid utf-8 string. + * @return int The character length of the string. + */ +function phutil_utf8_strlen($string) { + if (function_exists('utf8_decode')) { + return strlen(utf8_decode($string)); + } + return count(phutil_utf8v($string)); +} + + +/** + * Find the console display length of a UTF-8 string. This may differ from the + * character length of the string if it contains double-width characters, like + * many Chinese characters. + * + * This method is based on a C implementation here, which is based on the IEEE + * standards. The source has more discussion and addresses more considerations + * than this implementation does. + * + * http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c + * + * NOTE: We currently assume width 1 for East-Asian ambiguous characters. + * + * NOTE: This function is VERY slow. + * + * @param string A valid UTF-8 string. + * @return int The console display length of the string. + */ +function phutil_utf8_console_strlen($string) { + // Formatting and colors don't contribute any width in the console. + $string = preg_replace("/\x1B\[\d*m/", '', $string); + + // In the common case of an ASCII string, just return the string length. + if (preg_match('/^[\x01-\x7F]*\z/', $string)) { + return strlen($string); + } + + $len = 0; + + // NOTE: To deal with combining characters, we're splitting the string into + // glyphs first (characters with combiners) and then counting just the width + // of the first character in each glyph. + + $display_glyphs = phutil_utf8v_combined($string); + foreach ($display_glyphs as $display_glyph) { + $glyph_codepoints = phutil_utf8v_codepoints($display_glyph); + foreach ($glyph_codepoints as $c) { + if ($c == 0) { + break; + } + + $len += 1 + + ($c >= 0x1100 && + ($c <= 0x115F || /* Hangul Jamo init. consonants */ + $c == 0x2329 || $c == 0x232A || + ($c >= 0x2E80 && $c <= 0xA4CF && + $c != 0x303F) || /* CJK ... Yi */ + ($c >= 0xAC00 && $c <= 0xD7A3) || /* Hangul Syllables */ + ($c >= 0xF900 && $c <= 0xFAFF) || /* CJK Compatibility Ideographs */ + ($c >= 0xFE10 && $c <= 0xFE19) || /* Vertical forms */ + ($c >= 0xFE30 && $c <= 0xFE6F) || /* CJK Compatibility Forms */ + ($c >= 0xFF00 && $c <= 0xFF60) || /* Fullwidth Forms */ + ($c >= 0xFFE0 && $c <= 0xFFE6) || + ($c >= 0x20000 && $c <= 0x2FFFD) || + ($c >= 0x30000 && $c <= 0x3FFFD))); + + break; + } + } + + return $len; +} + + +/** + * Test if a string contains Chinese, Japanese, or Korean characters. + * + * Most languages use spaces to separate words, but these languages do not. + * + * @param string String to examine, in UTF8. + * @return bool True if the string contains Chinese, Japanese, or Korean + * characters. + */ +function phutil_utf8_is_cjk($string) { + $codepoints = phutil_utf8v_codepoints($string); + + foreach ($codepoints as $codepoint) { + // CJK Unified Ideographs + if ($codepoint >= 0x4E00 && $codepoint <= 0x9FFF) { + return true; + } + + // CJK Unified Ideographs Extension A + if ($codepoint >= 0x3400 && $codepoint <= 0x4DBF) { + return true; + } + + // CJK Unified Ideographs Extension B + if ($codepoint >= 0x20000 && $codepoint <= 0x2A6DF) { + return true; + } + + // CJK Unified Ideographs Extension C + if ($codepoint >= 0x2A700 && $codepoint <= 0x2B73F) { + return true; + } + + // CJK Unified Ideographs Extension D + if ($codepoint >= 0x2B740 && $codepoint <= 0x2B81F) { + return true; + } + + // CJK Unified Ideographs Extension E + if ($codepoint >= 0x2B820 && $codepoint <= 0x2CEAF) { + return true; + } + + // CJK Unified Ideographs Extension F + if ($codepoint >= 0x2CEB0 && $codepoint <= 0x2EBEF) { + return true; + } + + // CJK Compatibility Ideographs + if ($codepoint >= 0xF900 && $codepoint <= 0xFAFF) { + return true; + } + } + + return false; +} + + +/** + * Split a UTF-8 string into an array of characters. Combining characters are + * also split. + * + * @param string A valid utf-8 string. + * @param int|null Stop processing after examining this many bytes. + * @return list A list of characters in the string. + */ +function phutil_utf8v($string, $byte_limit = null) { + $res = array(); + $len = strlen($string); + + $ii = 0; + while ($ii < $len) { + $byte = $string[$ii]; + if ($byte <= "\x7F") { + $res[] = $byte; + $ii += 1; + + if ($byte_limit && ($ii >= $byte_limit)) { + break; + } + + continue; + } else if ($byte < "\xC0") { + throw new Exception( + pht('Invalid UTF-8 string passed to %s.', __FUNCTION__)); + } else if ($byte <= "\xDF") { + $seq_len = 2; + } else if ($byte <= "\xEF") { + $seq_len = 3; + } else if ($byte <= "\xF7") { + $seq_len = 4; + } else if ($byte <= "\xFB") { + $seq_len = 5; + } else if ($byte <= "\xFD") { + $seq_len = 6; + } else { + throw new Exception( + pht('Invalid UTF-8 string passed to %s.', __FUNCTION__)); + } + + if ($ii + $seq_len > $len) { + throw new Exception( + pht('Invalid UTF-8 string passed to %s.', __FUNCTION__)); + } + for ($jj = 1; $jj < $seq_len; ++$jj) { + if ($string[$ii + $jj] >= "\xC0") { + throw new Exception( + pht('Invalid UTF-8 string passed to %s.', __FUNCTION__)); + } + } + $res[] = substr($string, $ii, $seq_len); + $ii += $seq_len; + + if ($byte_limit && ($ii >= $byte_limit)) { + break; + } + } + + return $res; +} + + +/** + * Split a UTF-8 string into an array of codepoints (as integers). + * + * @param string A valid UTF-8 string. + * @return list A list of codepoints, as integers. + */ +function phutil_utf8v_codepoints($string) { + $str_v = phutil_utf8v($string); + + foreach ($str_v as $key => $char) { + $c = ord($char[0]); + $v = 0; + + if (($c & 0x80) == 0) { + $v = $c; + } else if (($c & 0xE0) == 0xC0) { + $v = (($c & 0x1F) << 6) + + ((ord($char[1]) & 0x3F)); + } else if (($c & 0xF0) == 0xE0) { + $v = (($c & 0x0F) << 12) + + ((ord($char[1]) & 0x3F) << 6) + + ((ord($char[2]) & 0x3F)); + } else if (($c & 0xF8) == 0xF0) { + $v = (($c & 0x07) << 18) + + ((ord($char[1]) & 0x3F) << 12) + + ((ord($char[2]) & 0x3F) << 6) + + ((ord($char[3]) & 0x3F)); + } else if (($c & 0xFC) == 0xF8) { + $v = (($c & 0x03) << 24) + + ((ord($char[1]) & 0x3F) << 18) + + ((ord($char[2]) & 0x3F) << 12) + + ((ord($char[3]) & 0x3F) << 6) + + ((ord($char[4]) & 0x3F)); + } else if (($c & 0xFE) == 0xFC) { + $v = (($c & 0x01) << 30) + + ((ord($char[1]) & 0x3F) << 24) + + ((ord($char[2]) & 0x3F) << 18) + + ((ord($char[3]) & 0x3F) << 12) + + ((ord($char[4]) & 0x3F) << 6) + + ((ord($char[5]) & 0x3F)); + } + + $str_v[$key] = $v; + } + + return $str_v; +} + + +/** + * Convert a Unicode codepoint into a UTF8-encoded string. + * + * @param int Unicode codepoint. + * @return string UTF8 encoding. + */ +function phutil_utf8_encode_codepoint($codepoint) { + if ($codepoint < 0x80) { + $r = chr($codepoint); + } else if ($codepoint < 0x800) { + $r = chr(0xC0 | (($codepoint >> 6) & 0x1F)). + chr(0x80 | (($codepoint) & 0x3F)); + } else if ($codepoint < 0x10000) { + $r = chr(0xE0 | (($codepoint >> 12) & 0x0F)). + chr(0x80 | (($codepoint >> 6) & 0x3F)). + chr(0x80 | (($codepoint) & 0x3F)); + } else if ($codepoint < 0x110000) { + $r = chr(0xF0 | (($codepoint >> 18) & 0x07)). + chr(0x80 | (($codepoint >> 12) & 0x3F)). + chr(0x80 | (($codepoint >> 6) & 0x3F)). + chr(0x80 | (($codepoint) & 0x3F)); + } else { + throw new Exception( + pht( + 'Encoding UTF8 codepoint "%s" is not supported.', + $codepoint)); + } + + return $r; +} + + +/** + * Hard-wrap a block of UTF-8 text with embedded HTML tags and entities. + * + * @param string An HTML string with tags and entities. + * @return list List of hard-wrapped lines. + */ +function phutil_utf8_hard_wrap_html($string, $width) { + $break_here = array(); + + // Convert the UTF-8 string into a list of UTF-8 characters. + $vector = phutil_utf8v($string); + $len = count($vector); + $char_pos = 0; + for ($ii = 0; $ii < $len; ++$ii) { + // An ampersand indicates an HTML entity; consume the whole thing (until + // ";") but treat it all as one character. + if ($vector[$ii] == '&') { + do { + ++$ii; + } while ($vector[$ii] != ';'); + ++$char_pos; + // An "<" indicates an HTML tag, consume the whole thing but don't treat + // it as a character. + } else if ($vector[$ii] == '<') { + do { + ++$ii; + } while ($vector[$ii] != '>'); + } else { + ++$char_pos; + } + + // Keep track of where we need to break the string later. + if ($char_pos == $width) { + $break_here[$ii] = true; + $char_pos = 0; + } + } + + $result = array(); + $string = ''; + foreach ($vector as $ii => $char) { + $string .= $char; + if (isset($break_here[$ii])) { + $result[] = $string; + $string = ''; + } + } + + if (strlen($string)) { + $result[] = $string; + } + + return $result; +} + +/** + * Hard-wrap a block of UTF-8 text with no embedded HTML tags and entities. + * + * @param string A non HTML string + * @param int Width of the hard-wrapped lines + * @return list List of hard-wrapped lines. + */ +function phutil_utf8_hard_wrap($string, $width) { + $result = array(); + + $lines = phutil_split_lines($string, $retain_endings = false); + foreach ($lines as $line) { + + // Convert the UTF-8 string into a list of UTF-8 characters. + $vector = phutil_utf8v($line); + + $len = count($vector); + $buffer = ''; + + for ($ii = 1; $ii <= $len; ++$ii) { + $buffer .= $vector[$ii - 1]; + if (($ii % $width) === 0) { + $result[] = $buffer; + $buffer = ''; + } + } + + if (strlen($buffer)) { + $result[] = $buffer; + } + } + + return $result; +} + +/** + * Convert a string from one encoding (like ISO-8859-1) to another encoding + * (like UTF-8). + * + * This is primarily a thin wrapper around `mb_convert_encoding()` which checks + * you have the extension installed, since we try to require the extension + * only if you actually need it (i.e., you want to work with encodings other + * than UTF-8). + * + * NOTE: This function assumes that the input is in the given source encoding. + * If it is not, it may not output in the specified target encoding. If you + * need to perform a hard conversion to UTF-8, use this function in conjunction + * with @{function:phutil_utf8ize}. We can detect failures caused by invalid + * encoding names, but `mb_convert_encoding()` fails silently if the + * encoding name identifies a real encoding but the string is not actually + * encoded with that encoding. + * + * @param string String to re-encode. + * @param string Target encoding name, like "UTF-8". + * @param string Source encoding name, like "ISO-8859-1". + * @return string Input string, with converted character encoding. + * + * @phutil-external-symbol function mb_convert_encoding + */ +function phutil_utf8_convert($string, $to_encoding, $from_encoding) { + if (!$from_encoding) { + throw new InvalidArgumentException( + pht( + 'Attempting to convert a string encoding, but no source encoding '. + 'was provided. Explicitly provide the source encoding.')); + } + if (!$to_encoding) { + throw new InvalidArgumentException( + pht( + 'Attempting to convert a string encoding, but no target encoding '. + 'was provided. Explicitly provide the target encoding.')); + } + + // Normalize encoding names so we can no-op the very common case of UTF8 + // to UTF8 (or any other conversion where both encodings are identical). + $to_upper = strtoupper(str_replace('-', '', $to_encoding)); + $from_upper = strtoupper(str_replace('-', '', $from_encoding)); + if ($from_upper == $to_upper) { + return $string; + } + + if (!function_exists('mb_convert_encoding')) { + throw new Exception( + pht( + "Attempting to convert a string encoding from '%s' to '%s', ". + "but the '%s' PHP extension is not available. Install %s to ". + "work with encodings other than UTF-8.", + $from_encoding, + $to_encoding, + 'mbstring', + 'mbstring')); + } + + $result = @mb_convert_encoding($string, $to_encoding, $from_encoding); + + if ($result === false) { + $message = error_get_last(); + if ($message) { + $message = idx($message, 'message', pht('Unknown error.')); + } + throw new Exception( + pht( + "String conversion from encoding '%s' to encoding '%s' failed: %s", + $from_encoding, + $to_encoding, + $message)); + } + + return $result; +} + + +/** + * Convert a string to title case in a UTF8-aware way. This function doesn't + * necessarily do a great job, but the builtin implementation of `ucwords()` can + * completely destroy inputs, so it just has to be better than that. Similar to + * @{function:ucwords}. + * + * @param string UTF-8 input string. + * @return string Input, in some semblance of title case. + */ +function phutil_utf8_ucwords($str) { + // NOTE: mb_convert_case() discards uppercase letters in words when converting + // to title case. For example, it will convert "AAA" into "Aaa", which is + // undesirable. + + $v = phutil_utf8v($str); + $result = ''; + $last = null; + + $ord_a = ord('a'); + $ord_z = ord('z'); + foreach ($v as $c) { + $convert = false; + if ($last === null || $last === ' ') { + $o = ord($c[0]); + if ($o >= $ord_a && $o <= $ord_z) { + $convert = true; + } + } + + if ($convert) { + $result .= phutil_utf8_strtoupper($c); + } else { + $result .= $c; + } + + $last = $c; + } + + return $result; +} + + +/** + * Convert a string to lower case in a UTF8-aware way. Similar to + * @{function:strtolower}. + * + * @param string UTF-8 input string. + * @return string Input, in some semblance of lower case. + * + * @phutil-external-symbol function mb_convert_case + */ +function phutil_utf8_strtolower($str) { + if (function_exists('mb_convert_case')) { + return mb_convert_case($str, MB_CASE_LOWER, 'UTF-8'); + } + + static $map; + if ($map === null) { + $map = array_combine( + range('A', 'Z'), + range('a', 'z')); + } + + return phutil_utf8_strtr($str, $map); +} + + +/** + * Convert a string to upper case in a UTF8-aware way. Similar to + * @{function:strtoupper}. + * + * @param string UTF-8 input string. + * @return string Input, in some semblance of upper case. + * + * @phutil-external-symbol function mb_convert_case + */ +function phutil_utf8_strtoupper($str) { + if (function_exists('mb_convert_case')) { + return mb_convert_case($str, MB_CASE_UPPER, 'UTF-8'); + } + + static $map; + if ($map === null) { + $map = array_combine( + range('a', 'z'), + range('A', 'Z')); + } + + return phutil_utf8_strtr($str, $map); +} + + +/** + * Replace characters in a string in a UTF-aware way. Similar to + * @{function:strtr}. + * + * @param string UTF-8 input string. + * @param map Map of characters to replace. + * @return string Input with translated characters. + */ +function phutil_utf8_strtr($str, array $map) { + $v = phutil_utf8v($str); + $result = ''; + foreach ($v as $c) { + if (isset($map[$c])) { + $result .= $map[$c]; + } else { + $result .= $c; + } + } + + return $result; +} + +/** + * Determine if a given unicode character is a combining character or not. + * + * @param string A single unicode character. + * @return boolean True or false. + */ +function phutil_utf8_is_combining_character($character) { + $components = phutil_utf8v_codepoints($character); + + // Combining Diacritical Marks (0300 - 036F). + // Combining Diacritical Marks Supplement (1DC0 - 1DFF). + // Combining Diacritical Marks for Symbols (20D0 - 20FF). + // Combining Half Marks (FE20 - FE2F). + + foreach ($components as $codepoint) { + if ($codepoint >= 0x0300 && $codepoint <= 0x036F || + $codepoint >= 0x1DC0 && $codepoint <= 0x1DFF || + $codepoint >= 0x20D0 && $codepoint <= 0x20FF || + $codepoint >= 0xFE20 && $codepoint <= 0xFE2F) { + return true; + } + } + + return false; +} + + +/** + * Split a UTF-8 string into an array of characters. Combining characters + * are not split. + * + * @param string A valid utf-8 string. + * @return list A list of characters in the string. + */ +function phutil_utf8v_combined($string) { + $components = phutil_utf8v($string); + return phutil_utf8v_combine_characters($components); +} + + +/** + * Merge combining characters in a UTF-8 string. + * + * This is a low-level method which can allow other operations to do less work. + * If you have a string, call @{method:phutil_utf8v_combined} instead. + * + * @param list List of UTF-8 characters. + * @return list List of UTF-8 strings with combining characters merged. + */ +function phutil_utf8v_combine_characters(array $characters) { + if (!$characters) { + return array(); + } + + // If the first character in the string is a combining character, + // start with a space. + if (phutil_utf8_is_combining_character($characters[0])) { + $buf = ' '; + } else { + $buf = null; + } + + $parts = array(); + foreach ($characters as $character) { + if (!isset($character[1])) { + // This an optimization: there are no one-byte combining characters, + // so we can just pass these through unmodified. + $is_combining = false; + } else { + $is_combining = phutil_utf8_is_combining_character($character); + } + + if ($is_combining) { + $buf .= $character; + } else { + if ($buf !== null) { + $parts[] = $buf; + } + $buf = $character; + } + } + + $parts[] = $buf; + + return $parts; +} + + +/** + * Return the current system locale setting (LC_ALL). + * + * @return string Current system locale setting. + */ +function phutil_get_system_locale() { + $locale = setlocale(LC_ALL, 0); + + if ($locale === false) { + throw new Exception( + pht( + 'Unable to determine current system locale (call to '. + '"setlocale(LC_ALL, 0)" failed).')); + } + + return $locale; +} + + +/** + * Test if a system locale (LC_ALL) is available on the system. + * + * @param string Locale name like "en_US.UTF-8". + * @return bool True if the locale is available. + */ +function phutil_is_system_locale_available($locale) { + $old_locale = phutil_get_system_locale(); + $is_available = @setlocale(LC_ALL, $locale); + setlocale(LC_ALL, $old_locale); + + return ($is_available !== false); +} + + +/** + * Set the system locale (LC_ALL) to a particular value. + * + * @param string New locale setting. + * @return void + */ +function phutil_set_system_locale($locale) { + $ok = @setlocale(LC_ALL, $locale); + if (!$ok) { + throw new Exception( + pht( + 'Failed to set system locale (to "%s").', + $locale)); + } +} diff --git a/src/utils/utils.php b/src/utils/utils.php new file mode 100644 --- /dev/null +++ b/src/utils/utils.php @@ -0,0 +1,1516 @@ +doStuff(); + * + * ...but this works fine: + * + * id(new Thing())->doStuff(); + * + * @param wild Anything. + * @return wild Unmodified argument. + */ +function id($x) { + return $x; +} + + +/** + * Access an array index, retrieving the value stored there if it exists or + * a default if it does not. This function allows you to concisely access an + * index which may or may not exist without raising a warning. + * + * @param array Array to access. + * @param scalar Index to access in the array. + * @param wild Default value to return if the key is not present in the + * array. + * @return wild If `$array[$key]` exists, that value is returned. If not, + * $default is returned without raising a warning. + */ +function idx(array $array, $key, $default = null) { + // isset() is a micro-optimization - it is fast but fails for null values. + if (isset($array[$key])) { + return $array[$key]; + } + + // Comparing $default is also a micro-optimization. + if ($default === null || array_key_exists($key, $array)) { + return null; + } + + return $default; +} + + +/** + * Access a sequence of array indexes, retrieving a deeply nested value if + * it exists or a default if it does not. + * + * For example, `idxv($dict, array('a', 'b', 'c'))` accesses the key at + * `$dict['a']['b']['c']`, if it exists. If it does not, or any intermediate + * value is not itself an array, it returns the defualt value. + * + * @param array Array to access. + * @param list List of keys to access, in sequence. + * @param wild Default value to return. + * @return wild Accessed value, or default if the value is not accessible. + */ +function idxv(array $map, array $path, $default = null) { + if (!$path) { + return $default; + } + + $last = last($path); + $path = array_slice($path, 0, -1); + + $cursor = $map; + foreach ($path as $key) { + $cursor = idx($cursor, $key); + if (!is_array($cursor)) { + return $default; + } + } + + return idx($cursor, $last, $default); +} + + +/** + * Call a method on a list of objects. Short for "method pull", this function + * works just like @{function:ipull}, except that it operates on a list of + * objects instead of a list of arrays. This function simplifies a common type + * of mapping operation: + * + * COUNTEREXAMPLE + * $names = array(); + * foreach ($objects as $key => $object) { + * $names[$key] = $object->getName(); + * } + * + * You can express this more concisely with mpull(): + * + * $names = mpull($objects, 'getName'); + * + * mpull() takes a third argument, which allows you to do the same but for + * the array's keys: + * + * COUNTEREXAMPLE + * $names = array(); + * foreach ($objects as $object) { + * $names[$object->getID()] = $object->getName(); + * } + * + * This is the mpull version(): + * + * $names = mpull($objects, 'getName', 'getID'); + * + * If you pass ##null## as the second argument, the objects will be preserved: + * + * COUNTEREXAMPLE + * $id_map = array(); + * foreach ($objects as $object) { + * $id_map[$object->getID()] = $object; + * } + * + * With mpull(): + * + * $id_map = mpull($objects, null, 'getID'); + * + * See also @{function:ipull}, which works similarly but accesses array indexes + * instead of calling methods. + * + * @param list Some list of objects. + * @param string|null Determines which **values** will appear in the result + * array. Use a string like 'getName' to store the + * value of calling the named method in each value, or + * ##null## to preserve the original objects. + * @param string|null Determines how **keys** will be assigned in the result + * array. Use a string like 'getID' to use the result + * of calling the named method as each object's key, or + * `null` to preserve the original keys. + * @return dict A dictionary with keys and values derived according + * to whatever you passed as `$method` and `$key_method`. + */ +function mpull(array $list, $method, $key_method = null) { + $result = array(); + foreach ($list as $key => $object) { + if ($key_method !== null) { + $key = $object->$key_method(); + } + if ($method !== null) { + $value = $object->$method(); + } else { + $value = $object; + } + $result[$key] = $value; + } + return $result; +} + + +/** + * Access a property on a list of objects. Short for "property pull", this + * function works just like @{function:mpull}, except that it accesses object + * properties instead of methods. This function simplifies a common type of + * mapping operation: + * + * COUNTEREXAMPLE + * $names = array(); + * foreach ($objects as $key => $object) { + * $names[$key] = $object->name; + * } + * + * You can express this more concisely with ppull(): + * + * $names = ppull($objects, 'name'); + * + * ppull() takes a third argument, which allows you to do the same but for + * the array's keys: + * + * COUNTEREXAMPLE + * $names = array(); + * foreach ($objects as $object) { + * $names[$object->id] = $object->name; + * } + * + * This is the ppull version(): + * + * $names = ppull($objects, 'name', 'id'); + * + * If you pass ##null## as the second argument, the objects will be preserved: + * + * COUNTEREXAMPLE + * $id_map = array(); + * foreach ($objects as $object) { + * $id_map[$object->id] = $object; + * } + * + * With ppull(): + * + * $id_map = ppull($objects, null, 'id'); + * + * See also @{function:mpull}, which works similarly but calls object methods + * instead of accessing object properties. + * + * @param list Some list of objects. + * @param string|null Determines which **values** will appear in the result + * array. Use a string like 'name' to store the value of + * accessing the named property in each value, or + * `null` to preserve the original objects. + * @param string|null Determines how **keys** will be assigned in the result + * array. Use a string like 'id' to use the result of + * accessing the named property as each object's key, or + * `null` to preserve the original keys. + * @return dict A dictionary with keys and values derived according + * to whatever you passed as `$property` and + * `$key_property`. + */ +function ppull(array $list, $property, $key_property = null) { + $result = array(); + foreach ($list as $key => $object) { + if ($key_property !== null) { + $key = $object->$key_property; + } + if ($property !== null) { + $value = $object->$property; + } else { + $value = $object; + } + $result[$key] = $value; + } + return $result; +} + + +/** + * Choose an index from a list of arrays. Short for "index pull", this function + * works just like @{function:mpull}, except that it operates on a list of + * arrays and selects an index from them instead of operating on a list of + * objects and calling a method on them. + * + * This function simplifies a common type of mapping operation: + * + * COUNTEREXAMPLE + * $names = array(); + * foreach ($list as $key => $dict) { + * $names[$key] = $dict['name']; + * } + * + * With ipull(): + * + * $names = ipull($list, 'name'); + * + * See @{function:mpull} for more usage examples. + * + * @param list Some list of arrays. + * @param scalar|null Determines which **values** will appear in the result + * array. Use a scalar to select that index from each + * array, or null to preserve the arrays unmodified as + * values. + * @param scalar|null Determines which **keys** will appear in the result + * array. Use a scalar to select that index from each + * array, or null to preserve the array keys. + * @return dict A dictionary with keys and values derived according + * to whatever you passed for `$index` and `$key_index`. + */ +function ipull(array $list, $index, $key_index = null) { + $result = array(); + foreach ($list as $key => $array) { + if ($key_index !== null) { + $key = $array[$key_index]; + } + if ($index !== null) { + $value = $array[$index]; + } else { + $value = $array; + } + $result[$key] = $value; + } + return $result; +} + + +/** + * Group a list of objects by the result of some method, similar to how + * GROUP BY works in an SQL query. This function simplifies grouping objects + * by some property: + * + * COUNTEREXAMPLE + * $animals_by_species = array(); + * foreach ($animals as $animal) { + * $animals_by_species[$animal->getSpecies()][] = $animal; + * } + * + * This can be expressed more tersely with mgroup(): + * + * $animals_by_species = mgroup($animals, 'getSpecies'); + * + * In either case, the result is a dictionary which maps species (e.g., like + * "dog") to lists of animals with that property, so all the dogs are grouped + * together and all the cats are grouped together, or whatever super + * businessesey thing is actually happening in your problem domain. + * + * See also @{function:igroup}, which works the same way but operates on + * array indexes. + * + * @param list List of objects to group by some property. + * @param string Name of a method, like 'getType', to call on each object + * in order to determine which group it should be placed into. + * @param ... Zero or more additional method names, to subgroup the + * groups. + * @return dict Dictionary mapping distinct method returns to lists of + * all objects which returned that value. + */ +function mgroup(array $list, $by /* , ... */) { + $map = mpull($list, $by); + + $groups = array(); + foreach ($map as $group) { + // Can't array_fill_keys() here because 'false' gets encoded wrong. + $groups[$group] = array(); + } + + foreach ($map as $key => $group) { + $groups[$group][$key] = $list[$key]; + } + + $args = func_get_args(); + $args = array_slice($args, 2); + if ($args) { + array_unshift($args, null); + foreach ($groups as $group_key => $grouped) { + $args[0] = $grouped; + $groups[$group_key] = call_user_func_array('mgroup', $args); + } + } + + return $groups; +} + + +/** + * Group a list of arrays by the value of some index. This function is the same + * as @{function:mgroup}, except it operates on the values of array indexes + * rather than the return values of method calls. + * + * @param list List of arrays to group by some index value. + * @param string Name of an index to select from each array in order to + * determine which group it should be placed into. + * @param ... Zero or more additional indexes names, to subgroup the + * groups. + * @return dict Dictionary mapping distinct index values to lists of + * all objects which had that value at the index. + */ +function igroup(array $list, $by /* , ... */) { + $map = ipull($list, $by); + + $groups = array(); + foreach ($map as $group) { + $groups[$group] = array(); + } + + foreach ($map as $key => $group) { + $groups[$group][$key] = $list[$key]; + } + + $args = func_get_args(); + $args = array_slice($args, 2); + if ($args) { + array_unshift($args, null); + foreach ($groups as $group_key => $grouped) { + $args[0] = $grouped; + $groups[$group_key] = call_user_func_array('igroup', $args); + } + } + + return $groups; +} + + +/** + * Sort a list of objects by the return value of some method. In PHP, this is + * often vastly more efficient than `usort()` and similar. + * + * // Sort a list of Duck objects by name. + * $sorted = msort($ducks, 'getName'); + * + * It is usually significantly more efficient to define an ordering method + * on objects and call `msort()` than to write a comparator. It is often more + * convenient, as well. + * + * NOTE: This method does not take the list by reference; it returns a new list. + * + * @param list List of objects to sort by some property. + * @param string Name of a method to call on each object; the return values + * will be used to sort the list. + * @return list Objects ordered by the return values of the method calls. + */ +function msort(array $list, $method) { + $surrogate = mpull($list, $method); + + asort($surrogate); + + $result = array(); + foreach ($surrogate as $key => $value) { + $result[$key] = $list[$key]; + } + + return $result; +} + + +/** + * Sort a list of objects by a sort vector. + * + * This sort is stable, well-behaved, and more efficient than `usort()`. + * + * @param list List of objects to sort. + * @param string Name of a method to call on each object. The method must + * return a @{class:PhutilSortVector}. + * @return list Objects ordered by the vectors. + */ +function msortv(array $list, $method) { + $surrogate = mpull($list, $method); + + $index = 0; + foreach ($surrogate as $key => $value) { + if (!($value instanceof PhutilSortVector)) { + throw new Exception( + pht( + 'Objects passed to "%s" must return sort vectors (objects of '. + 'class "%s") from the specified method ("%s"). One object (with '. + 'key "%s") did not.', + 'msortv()', + 'PhutilSortVector', + $method, + $key)); + } + + // Add the original index to keep the sort stable. + $value->addInt($index++); + + $surrogate[$key] = (string)$value; + } + + asort($surrogate, SORT_STRING); + + $result = array(); + foreach ($surrogate as $key => $value) { + $result[$key] = $list[$key]; + } + + return $result; +} + + +/** + * Sort a list of arrays by the value of some index. This method is identical to + * @{function:msort}, but operates on a list of arrays instead of a list of + * objects. + * + * @param list List of arrays to sort by some index value. + * @param string Index to access on each object; the return values + * will be used to sort the list. + * @return list Arrays ordered by the index values. + */ +function isort(array $list, $index) { + $surrogate = ipull($list, $index); + + asort($surrogate); + + $result = array(); + foreach ($surrogate as $key => $value) { + $result[$key] = $list[$key]; + } + + return $result; +} + + +/** + * Filter a list of objects by executing a method across all the objects and + * filter out the ones with empty() results. this function works just like + * @{function:ifilter}, except that it operates on a list of objects instead + * of a list of arrays. + * + * For example, to remove all objects with no children from a list, where + * 'hasChildren' is a method name, do this: + * + * mfilter($list, 'hasChildren'); + * + * The optional third parameter allows you to negate the operation and filter + * out nonempty objects. To remove all objects that DO have children, do this: + * + * mfilter($list, 'hasChildren', true); + * + * @param array List of objects to filter. + * @param string A method name. + * @param bool Optionally, pass true to drop objects which pass the + * filter instead of keeping them. + * @return array List of objects which pass the filter. + */ +function mfilter(array $list, $method, $negate = false) { + if (!is_string($method)) { + throw new InvalidArgumentException(pht('Argument method is not a string.')); + } + + $result = array(); + foreach ($list as $key => $object) { + $value = $object->$method(); + + if (!$negate) { + if (!empty($value)) { + $result[$key] = $object; + } + } else { + if (empty($value)) { + $result[$key] = $object; + } + } + } + + return $result; +} + + +/** + * Filter a list of arrays by removing the ones with an empty() value for some + * index. This function works just like @{function:mfilter}, except that it + * operates on a list of arrays instead of a list of objects. + * + * For example, to remove all arrays without value for key 'username', do this: + * + * ifilter($list, 'username'); + * + * The optional third parameter allows you to negate the operation and filter + * out nonempty arrays. To remove all arrays that DO have value for key + * 'username', do this: + * + * ifilter($list, 'username', true); + * + * @param array List of arrays to filter. + * @param scalar The index. + * @param bool Optionally, pass true to drop arrays which pass the + * filter instead of keeping them. + * @return array List of arrays which pass the filter. + */ +function ifilter(array $list, $index, $negate = false) { + if (!is_scalar($index)) { + throw new InvalidArgumentException(pht('Argument index is not a scalar.')); + } + + $result = array(); + if (!$negate) { + foreach ($list as $key => $array) { + if (!empty($array[$index])) { + $result[$key] = $array; + } + } + } else { + foreach ($list as $key => $array) { + if (empty($array[$index])) { + $result[$key] = $array; + } + } + } + + return $result; +} + + +/** + * Selects a list of keys from an array, returning a new array with only the + * key-value pairs identified by the selected keys, in the specified order. + * + * Note that since this function orders keys in the result according to the + * order they appear in the list of keys, there are effectively two common + * uses: either reducing a large dictionary to a smaller one, or changing the + * key order on an existing dictionary. + * + * @param dict Dictionary of key-value pairs to select from. + * @param list List of keys to select. + * @return dict Dictionary of only those key-value pairs where the key was + * present in the list of keys to select. Ordering is + * determined by the list order. + */ +function array_select_keys(array $dict, array $keys) { + $result = array(); + foreach ($keys as $key) { + if (array_key_exists($key, $dict)) { + $result[$key] = $dict[$key]; + } + } + return $result; +} + + +/** + * Checks if all values of array are instances of the passed class. Throws + * `InvalidArgumentException` if it isn't true for any value. + * + * @param array + * @param string Name of the class or 'array' to check arrays. + * @return array Returns passed array. + */ +function assert_instances_of(array $arr, $class) { + $is_array = !strcasecmp($class, 'array'); + + foreach ($arr as $key => $object) { + if ($is_array) { + if (!is_array($object)) { + $given = gettype($object); + throw new InvalidArgumentException( + pht( + "Array item with key '%s' must be of type array, %s given.", + $key, + $given)); + } + + } else if (!($object instanceof $class)) { + $given = gettype($object); + if (is_object($object)) { + $given = pht('instance of %s', get_class($object)); + } + throw new InvalidArgumentException( + pht( + "Array item with key '%s' must be an instance of %s, %s given.", + $key, + $class, + $given)); + } + } + + return $arr; +} + +/** + * Assert that passed data can be converted to string. + * + * @param string Assert that this data is valid. + * @return void + * + * @task assert + */ +function assert_stringlike($parameter) { + switch (gettype($parameter)) { + case 'string': + case 'NULL': + case 'boolean': + case 'double': + case 'integer': + return; + case 'object': + if (method_exists($parameter, '__toString')) { + return; + } + break; + case 'array': + case 'resource': + case 'unknown type': + default: + break; + } + + throw new InvalidArgumentException( + pht( + 'Argument must be scalar or object which implements %s!', + '__toString()')); +} + +/** + * Returns the first argument which is not strictly null, or `null` if there + * are no such arguments. Identical to the MySQL function of the same name. + * + * @param ... Zero or more arguments of any type. + * @return mixed First non-`null` arg, or null if no such arg exists. + */ +function coalesce(/* ... */) { + $args = func_get_args(); + foreach ($args as $arg) { + if ($arg !== null) { + return $arg; + } + } + return null; +} + + +/** + * Similar to @{function:coalesce}, but less strict: returns the first + * non-`empty()` argument, instead of the first argument that is strictly + * non-`null`. If no argument is nonempty, it returns the last argument. This + * is useful idiomatically for setting defaults: + * + * $display_name = nonempty($user_name, $full_name, "Anonymous"); + * + * @param ... Zero or more arguments of any type. + * @return mixed First non-`empty()` arg, or last arg if no such arg + * exists, or null if you passed in zero args. + */ +function nonempty(/* ... */) { + $args = func_get_args(); + $result = null; + foreach ($args as $arg) { + $result = $arg; + if ($arg) { + break; + } + } + return $result; +} + + +/** + * Invokes the "new" operator with a vector of arguments. There is no way to + * `call_user_func_array()` on a class constructor, so you can instead use this + * function: + * + * $obj = newv($class_name, $argv); + * + * That is, these two statements are equivalent: + * + * $pancake = new Pancake('Blueberry', 'Maple Syrup', true); + * $pancake = newv('Pancake', array('Blueberry', 'Maple Syrup', true)); + * + * DO NOT solve this problem in other, more creative ways! Three popular + * alternatives are: + * + * - Build a fake serialized object and unserialize it. + * - Invoke the constructor twice. + * - just use `eval()` lol + * + * These are really bad solutions to the problem because they can have side + * effects (e.g., __wakeup()) and give you an object in an otherwise impossible + * state. Please endeavor to keep your objects in possible states. + * + * If you own the classes you're doing this for, you should consider whether + * or not restructuring your code (for instance, by creating static + * construction methods) might make it cleaner before using `newv()`. Static + * constructors can be invoked with `call_user_func_array()`, and may give your + * class a cleaner and more descriptive API. + * + * @param string The name of a class. + * @param list Array of arguments to pass to its constructor. + * @return obj A new object of the specified class, constructed by passing + * the argument vector to its constructor. + */ +function newv($class_name, array $argv) { + $reflector = new ReflectionClass($class_name); + if ($argv) { + return $reflector->newInstanceArgs($argv); + } else { + return $reflector->newInstance(); + } +} + + +/** + * Returns the first element of an array. Exactly like reset(), but doesn't + * choke if you pass it some non-referenceable value like the return value of + * a function. + * + * @param array Array to retrieve the first element from. + * @return wild The first value of the array. + */ +function head(array $arr) { + return reset($arr); +} + +/** + * Returns the last element of an array. This is exactly like `end()` except + * that it won't warn you if you pass some non-referencable array to + * it -- e.g., the result of some other array operation. + * + * @param array Array to retrieve the last element from. + * @return wild The last value of the array. + */ +function last(array $arr) { + return end($arr); +} + +/** + * Returns the first key of an array. + * + * @param array Array to retrieve the first key from. + * @return int|string The first key of the array. + */ +function head_key(array $arr) { + reset($arr); + return key($arr); +} + +/** + * Returns the last key of an array. + * + * @param array Array to retrieve the last key from. + * @return int|string The last key of the array. + */ +function last_key(array $arr) { + end($arr); + return key($arr); +} + +/** + * Merge a vector of arrays performantly. This has the same semantics as + * array_merge(), so these calls are equivalent: + * + * array_merge($a, $b, $c); + * array_mergev(array($a, $b, $c)); + * + * However, when you have a vector of arrays, it is vastly more performant to + * merge them with this function than by calling array_merge() in a loop, + * because using a loop generates an intermediary array on each iteration. + * + * @param list Vector of arrays to merge. + * @return list Arrays, merged with array_merge() semantics. + */ +function array_mergev(array $arrayv) { + if (!$arrayv) { + return array(); + } + + foreach ($arrayv as $key => $item) { + if (!is_array($item)) { + throw new InvalidArgumentException( + pht( + 'Expected all items passed to `%s` to be arrays, but '. + 'argument with key "%s" has type "%s".', + __FUNCTION__.'()', + $key, + gettype($item))); + } + } + + return call_user_func_array('array_merge', $arrayv); +} + + +/** + * Split a corpus of text into lines. This function splits on "\n", "\r\n", or + * a mixture of any of them. + * + * NOTE: This function does not treat "\r" on its own as a newline because none + * of SVN, Git or Mercurial do on any OS. + * + * @param string Block of text to be split into lines. + * @param bool If true, retain line endings in result strings. + * @return list List of lines. + */ +function phutil_split_lines($corpus, $retain_endings = true) { + if (!strlen($corpus)) { + return array(''); + } + + // Split on "\r\n" or "\n". + if ($retain_endings) { + $lines = preg_split('/(?<=\n)/', $corpus); + } else { + $lines = preg_split('/\r?\n/', $corpus); + } + + // If the text ends with "\n" or similar, we'll end up with an empty string + // at the end; discard it. + if (end($lines) == '') { + array_pop($lines); + } + + if ($corpus instanceof PhutilSafeHTML) { + return array_map('phutil_safe_html', $lines); + } + + return $lines; +} + + +/** + * Simplifies a common use of `array_combine()`. Specifically, this: + * + * COUNTEREXAMPLE: + * if ($list) { + * $result = array_combine($list, $list); + * } else { + * // Prior to PHP 5.4, array_combine() failed if given empty arrays. + * $result = array(); + * } + * + * ...is equivalent to this: + * + * $result = array_fuse($list); + * + * @param list List of scalars. + * @return dict Dictionary with inputs mapped to themselves. + */ +function array_fuse(array $list) { + if ($list) { + return array_combine($list, $list); + } + return array(); +} + + +/** + * Add an element between every two elements of some array. That is, given a + * list `A, B, C, D`, and some element to interleave, `x`, this function returns + * `A, x, B, x, C, x, D`. This works like `implode()`, but does not concatenate + * the list into a string. In particular: + * + * implode('', array_interleave($x, $list)); + * + * ...is equivalent to: + * + * implode($x, $list); + * + * This function does not preserve keys. + * + * @param wild Element to interleave. + * @param list List of elements to be interleaved. + * @return list Original list with the new element interleaved. + */ +function array_interleave($interleave, array $array) { + $result = array(); + foreach ($array as $item) { + $result[] = $item; + $result[] = $interleave; + } + array_pop($result); + return $result; +} + +function phutil_is_windows() { + // We can also use PHP_OS, but that's kind of sketchy because it returns + // "WINNT" for Windows 7 and "Darwin" for Mac OS X. Practically, testing for + // DIRECTORY_SEPARATOR is more straightforward. + return (DIRECTORY_SEPARATOR != '/'); +} + +function phutil_is_hiphop_runtime() { + return (array_key_exists('HPHP', $_ENV) && $_ENV['HPHP'] === 1); +} + +/** + * Converts a string to a loggable one, with unprintables and newlines escaped. + * + * @param string Any string. + * @return string String with control and newline characters escaped, suitable + * for printing on a single log line. + */ +function phutil_loggable_string($string) { + if (preg_match('/^[\x20-\x7E]+$/', $string)) { + return $string; + } + + $result = ''; + + static $c_map = array( + '\\' => '\\\\', + "\n" => '\\n', + "\r" => '\\r', + "\t" => '\\t', + ); + + $len = strlen($string); + for ($ii = 0; $ii < $len; $ii++) { + $c = $string[$ii]; + if (isset($c_map[$c])) { + $result .= $c_map[$c]; + } else { + $o = ord($c); + if ($o < 0x20 || $o == 0x7F) { + $result .= '\\x'.sprintf('%02X', $o); + } else { + $result .= $c; + } + } + } + + return $result; +} + + +/** + * Perform an `fwrite()` which distinguishes between EAGAIN and EPIPE. + * + * PHP's `fwrite()` is broken, and never returns `false` for writes to broken + * nonblocking pipes: it always returns 0, and provides no straightforward + * mechanism for distinguishing between EAGAIN (buffer is full, can't write any + * more right now) and EPIPE or similar (no write will ever succeed). + * + * See: https://bugs.php.net/bug.php?id=39598 + * + * If you call this method instead of `fwrite()`, it will attempt to detect + * when a zero-length write is caused by EAGAIN and return `0` only if the + * write really should be retried. + * + * @param resource Socket or pipe stream. + * @param string Bytes to write. + * @return bool|int Number of bytes written, or `false` on any error (including + * errors which `fwrite()` can not detect, like a broken pipe). + */ +function phutil_fwrite_nonblocking_stream($stream, $bytes) { + if (!strlen($bytes)) { + return 0; + } + + $result = @fwrite($stream, $bytes); + if ($result !== 0) { + // In cases where some bytes are witten (`$result > 0`) or + // an error occurs (`$result === false`), the behavior of fwrite() is + // correct. We can return the value as-is. + return $result; + } + + // If we make it here, we performed a 0-length write. Try to distinguish + // between EAGAIN and EPIPE. To do this, we're going to `stream_select()` + // the stream, write to it again if PHP claims that it's writable, and + // consider the pipe broken if the write fails. + + $read = array(); + $write = array($stream); + $except = array(); + + @stream_select($read, $write, $except, 0); + + if (!$write) { + // The stream isn't writable, so we conclude that it probably really is + // blocked and the underlying error was EAGAIN. Return 0 to indicate that + // no data could be written yet. + return 0; + } + + // If we make it here, PHP **just** claimed that this stream is writable, so + // perform a write. If the write also fails, conclude that these failures are + // EPIPE or some other permanent failure. + $result = @fwrite($stream, $bytes); + if ($result !== 0) { + // The write worked or failed explicitly. This value is fine to return. + return $result; + } + + // We performed a 0-length write, were told that the stream was writable, and + // then immediately performed another 0-length write. Conclude that the pipe + // is broken and return `false`. + return false; +} + + +/** + * Convert a human-readable unit description into a numeric one. This function + * allows you to replace this: + * + * COUNTEREXAMPLE + * $ttl = (60 * 60 * 24 * 30); // 30 days + * + * ...with this: + * + * $ttl = phutil_units('30 days in seconds'); + * + * ...which is self-documenting and difficult to make a mistake with. + * + * @param string Human readable description of a unit quantity. + * @return int Quantity of specified unit. + */ +function phutil_units($description) { + $matches = null; + if (!preg_match('/^(\d+) (\w+) in (\w+)$/', $description, $matches)) { + throw new InvalidArgumentException( + pht( + 'Unable to parse unit specification (expected a specification in the '. + 'form "%s"): %s', + '5 days in seconds', + $description)); + } + + $quantity = (int)$matches[1]; + $src_unit = $matches[2]; + $dst_unit = $matches[3]; + + $is_divisor = false; + + switch ($dst_unit) { + case 'seconds': + switch ($src_unit) { + case 'second': + case 'seconds': + $factor = 1; + break; + case 'minute': + case 'minutes': + $factor = 60; + break; + case 'hour': + case 'hours': + $factor = 60 * 60; + break; + case 'day': + case 'days': + $factor = 60 * 60 * 24; + break; + default: + throw new InvalidArgumentException( + pht( + 'This function can not convert from the unit "%s".', + $src_unit)); + } + break; + case 'bytes': + switch ($src_unit) { + case 'byte': + case 'bytes': + $factor = 1; + break; + case 'bit': + case 'bits': + $factor = 8; + $is_divisor = true; + break; + default: + throw new InvalidArgumentException( + pht( + 'This function can not convert from the unit "%s".', + $src_unit)); + } + break; + default: + throw new InvalidArgumentException( + pht( + 'This function can not convert into the unit "%s".', + $dst_unit)); + } + + if ($is_divisor) { + if ($quantity % $factor) { + throw new InvalidArgumentException( + pht( + '"%s" is not an exact quantity.', + $description)); + } + return (int)($quantity / $factor); + } else { + return $quantity * $factor; + } +} + + +/** + * Decode a JSON dictionary. + * + * @param string A string which ostensibly contains a JSON-encoded list or + * dictionary. + * @return mixed Decoded list/dictionary. + */ +function phutil_json_decode($string) { + $result = @json_decode($string, true); + + if (!is_array($result)) { + // Failed to decode the JSON. Try to use @{class:PhutilJSONParser} instead. + // This will probably fail, but will throw a useful exception. + $parser = new PhutilJSONParser(); + $result = $parser->parse($string); + } + + return $result; +} + + +/** + * Encode a value in JSON, raising an exception if it can not be encoded. + * + * @param wild A value to encode. + * @return string JSON representation of the value. + */ +function phutil_json_encode($value) { + $result = @json_encode($value); + if ($result === false) { + $reason = phutil_validate_json($value); + if (function_exists('json_last_error')) { + $err = json_last_error(); + if (function_exists('json_last_error_msg')) { + $msg = json_last_error_msg(); + $extra = pht('#%d: %s', $err, $msg); + } else { + $extra = pht('#%d', $err); + } + } else { + $extra = null; + } + + if ($extra) { + $message = pht( + 'Failed to JSON encode value (%s): %s.', + $extra, + $reason); + } else { + $message = pht( + 'Failed to JSON encode value: %s.', + $reason); + } + + throw new Exception($message); + } + + return $result; +} + + +/** + * Produce a human-readable explanation why a value can not be JSON-encoded. + * + * @param wild Value to validate. + * @param string Path within the object to provide context. + * @return string|null Explanation of why it can't be encoded, or null. + */ +function phutil_validate_json($value, $path = '') { + if ($value === null) { + return; + } + + if ($value === true) { + return; + } + + if ($value === false) { + return; + } + + if (is_int($value)) { + return; + } + + if (is_float($value)) { + return; + } + + if (is_array($value)) { + foreach ($value as $key => $subvalue) { + if (strlen($path)) { + $full_key = $path.' > '; + } else { + $full_key = ''; + } + + if (!phutil_is_utf8($key)) { + $full_key = $full_key.phutil_utf8ize($key); + return pht( + 'Dictionary key "%s" is not valid UTF8, and cannot be JSON encoded.', + $full_key); + } + + $full_key .= $key; + $result = phutil_validate_json($subvalue, $full_key); + if ($result !== null) { + return $result; + } + } + } + + if (is_string($value)) { + if (!phutil_is_utf8($value)) { + $display = substr($value, 0, 256); + $display = phutil_utf8ize($display); + if (!strlen($path)) { + return pht( + 'String value is not valid UTF8, and can not be JSON encoded: %s', + $display); + } else { + return pht( + 'Dictionary value at key "%s" is not valid UTF8, and cannot be '. + 'JSON encoded: %s', + $path, + $display); + } + } + } + + return; +} + + +/** + * Decode an INI string. + * + * @param string + * @return mixed + */ +function phutil_ini_decode($string) { + $results = null; + $trap = new PhutilErrorTrap(); + + try { + if (!function_exists('parse_ini_string')) { + throw new PhutilMethodNotImplementedException( + pht( + '%s is not compatible with your version of PHP (%s). This function '. + 'is only supported on PHP versions newer than 5.3.0.', + __FUNCTION__, + phpversion())); + } + + $results = @parse_ini_string($string, true, INI_SCANNER_RAW); + + if ($results === false) { + throw new PhutilINIParserException(trim($trap->getErrorsAsString())); + } + + foreach ($results as $section => $result) { + if (!is_array($result)) { + // We JSON decode the value in ordering to perform the following + // conversions: + // + // - `'true'` => `true` + // - `'false'` => `false` + // - `'123'` => `123` + // - `'1.234'` => `1.234` + // + $result = json_decode($result, true); + + if ($result !== null && !is_array($result)) { + $results[$section] = $result; + } + + continue; + } + + foreach ($result as $key => $value) { + $value = json_decode($value, true); + + if ($value !== null && !is_array($value)) { + $results[$section][$key] = $value; + } + } + } + } catch (Exception $ex) { + $trap->destroy(); + throw $ex; + } + + $trap->destroy(); + return $results; +} + + +/** + * Attempt to censor any plaintext credentials from a string. + * + * The major use case here is to censor usernames and passwords from command + * output. For example, when `git fetch` fails, the output includes credentials + * for authenticated HTTP remotes. + * + * @param string Some block of text. + * @return string A similar block of text, but with credentials that could + * be identified censored. + */ +function phutil_censor_credentials($string) { + return preg_replace(',(?<=://)([^/@\s]+)(?=@|$),', '********', $string); +} + + +/** + * Returns a parsable string representation of a variable. + * + * This function is intended to behave similarly to PHP's `var_export` function, + * but the output is intended to follow our style conventions. + * + * @param wild The variable you want to export. + * @return string + */ +function phutil_var_export($var) { + // `var_export(null, true)` returns `"NULL"` (in uppercase). + if ($var === null) { + return 'null'; + } + + // PHP's `var_export` doesn't format arrays very nicely. In particular: + // + // - An empty array is split over two lines (`"array (\n)"`). + // - A space separates "array" and the first opening brace. + // - Non-associative arrays are returned as associative arrays with an + // integer key. + // + if (is_array($var)) { + if (count($var) === 0) { + return 'array()'; + } + + // Don't show keys for non-associative arrays. + $show_keys = (array_keys($var) !== range(0, count($var) - 1)); + + $output = array(); + $output[] = 'array('; + + foreach ($var as $key => $value) { + // Adjust the indentation of the value. + $value = str_replace("\n", "\n ", phutil_var_export($value)); + $output[] = ' '. + ($show_keys ? var_export($key, true).' => ' : ''). + $value.','; + } + + $output[] = ')'; + return implode("\n", $output); + } + + // Let PHP handle everything else. + return var_export($var, true); +} + + +/** + * An improved version of `fnmatch`. + * + * @param string A glob pattern. + * @param string A path. + * @return bool + */ +function phutil_fnmatch($glob, $path) { + // Modify the glob to allow `**/` to match files in the root directory. + $glob = preg_replace('@(?:(? $now - $shift) { + $format = pht('D, M j'); + } else { + $format = pht('M j Y'); + } + return $format; +} + +function phutil_format_relative_time($duration) { + return phutil_format_units_generic( + $duration, + array(60, 60, 24, 7), + array('s', 'm', 'h', 'd', 'w'), + $precision = 0); +} + +/** + * Format a relative time (duration) into weeks, days, hours, minutes, + * seconds, but unlike phabricator_format_relative_time, does so for more than + * just the largest unit. + * + * @param int Duration in seconds. + * @param int Levels to render - will render the three highest levels, ie: + * 5 h, 37 m, 1 s + * @return string Human-readable description. + */ +function phutil_format_relative_time_detailed($duration, $levels = 2) { + if ($duration == 0) { + return 'now'; + } + $levels = max(1, min($levels, 5)); + $remainder = 0; + + $is_negative = false; + if ($duration < 0) { + $is_negative = true; + $duration = abs($duration); + } + + $this_level = 1; + $detailed_relative_time = phutil_format_units_generic( + $duration, + array(60, 60, 24, 7), + array('s', 'm', 'h', 'd', 'w'), + $precision = 0, + $remainder); + $duration = $remainder; + + while ($remainder > 0 && $this_level < $levels) { + $detailed_relative_time .= ', '.phutil_format_units_generic( + $duration, + array(60, 60, 24, 7), + array('s', 'm', 'h', 'd', 'w'), + $precision = 0, + $remainder); + $duration = $remainder; + $this_level++; + } + + if ($is_negative) { + $detailed_relative_time .= ' ago'; + } + + return $detailed_relative_time; +} + +/** + * Format a byte count for human consumption, e.g. "10MB" instead of + * "10485760". + * + * @param int Number of bytes. + * @return string Human-readable description. + */ +function phutil_format_bytes($bytes) { + return phutil_format_units_generic( + $bytes, + array(1024, 1024, 1024, 1024, 1024), + array('B', 'KB', 'MB', 'GB', 'TB', 'PB'), + $precision = 0); +} + + +/** + * Parse a human-readable byte description (like "6MB") into an integer. + * + * @param string Human-readable description. + * @return int Number of represented bytes. + */ +function phutil_parse_bytes($input) { + $bytes = trim($input); + if (!strlen($bytes)) { + return null; + } + + // NOTE: Assumes US-centric numeral notation. + $bytes = preg_replace('/[ ,]/', '', $bytes); + + $matches = null; + if (!preg_match('/^(?:\d+(?:[.]\d+)?)([kmgtp]?)b?$/i', $bytes, $matches)) { + throw new Exception(pht("Unable to parse byte size '%s'!", $input)); + } + + $scale = array( + 'k' => 1024, + 'm' => 1024 * 1024, + 'g' => 1024 * 1024 * 1024, + 't' => 1024 * 1024 * 1024 * 1024, + 'p' => 1024 * 1024 * 1024 * 1024 * 1024, + ); + + $bytes = (float)$bytes; + if ($matches[1]) { + $bytes *= $scale[strtolower($matches[1])]; + } + + return (int)$bytes; +} + + +function phutil_format_units_generic( + $n, + array $scales, + array $labels, + $precision = 0, + &$remainder = null) { + + $is_negative = false; + if ($n < 0) { + $is_negative = true; + $n = abs($n); + } + + $remainder = 0; + $accum = 1; + + $scale = array_shift($scales); + $label = array_shift($labels); + while ($n >= $scale && count($labels)) { + $remainder += ($n % $scale) * $accum; + $n /= $scale; + $accum *= $scale; + $label = array_shift($labels); + if (!count($scales)) { + break; + } + $scale = array_shift($scales); + } + + if ($is_negative) { + $n = -$n; + $remainder = -$remainder; + } + + if ($precision) { + $num_string = number_format($n, $precision); + } else { + $num_string = (int)floor($n); + } + + if ($label) { + $num_string .= ' '.$label; + } + + return $num_string; +} diff --git a/src/xsprintf/PhutilCommandString.php b/src/xsprintf/PhutilCommandString.php new file mode 100644 --- /dev/null +++ b/src/xsprintf/PhutilCommandString.php @@ -0,0 +1,85 @@ +argv = $argv; + + $this->escapingMode = self::MODE_DEFAULT; + + // This makes sure we throw immediately if there are errors in the + // parameters. + $this->getMaskedString(); + } + + public function __toString() { + return $this->getMaskedString(); + } + + public function getUnmaskedString() { + return $this->renderString(true); + } + + public function getMaskedString() { + return $this->renderString(false); + } + + public function setEscapingMode($escaping_mode) { + $this->escapingMode = $escaping_mode; + return $this; + } + + private function renderString($unmasked) { + return xsprintf( + 'xsprintf_command', + array( + 'unmasked' => $unmasked, + 'mode' => $this->escapingMode, + ), + $this->argv); + } + + public static function escapeArgument($value, $mode) { + switch ($mode) { + case self::MODE_DEFAULT: + return escapeshellarg($value); + case self::MODE_POWERSHELL: + return self::escapePowershell($value); + default: + throw new Exception(pht('Unknown escaping mode!')); + } + } + + private static function escapePowershell($value) { + // These escape sequences are from http://ss64.com/ps/syntax-esc.html + + // Replace backticks first. + $value = str_replace('`', '``', $value); + + // Now replace other required notations. + $value = str_replace("\0", '`0', $value); + $value = str_replace(chr(7), '`a', $value); + $value = str_replace(chr(8), '`b', $value); + $value = str_replace("\f", '`f', $value); + $value = str_replace("\n", '`n', $value); + $value = str_replace("\r", '`r', $value); + $value = str_replace("\t", '`t', $value); + $value = str_replace("\v", '`v', $value); + $value = str_replace('#', '`#', $value); + $value = str_replace("'", '`\'', $value); + $value = str_replace('"', '`"', $value); + + // The rule on dollar signs is mentioned further down the page, and + // they only need to be escaped when using double quotes (which we are). + $value = str_replace('$', '`$', $value); + + return '"'.$value.'"'; + } + +} diff --git a/src/xsprintf/PhutilQsprintfInterface.php b/src/xsprintf/PhutilQsprintfInterface.php new file mode 100644 --- /dev/null +++ b/src/xsprintf/PhutilQsprintfInterface.php @@ -0,0 +1,9 @@ +string = $string; + } + + public function __toString() { + return $this->string; + } + + public function applyWrap() { + $string = (string)$this; + $string = phutil_console_wrap($string); + return new self($string); + } + + public function applyIndent($depth, $with_prefix = true) { + $string = (string)$this; + $string = phutil_console_wrap($string, $depth, $with_prefix); + return new self($string); + } + + public static function escapeStringValue($value, $allow_whitespace) { + if ($value instanceof PhutilTerminalString) { + return (string)$value; + } + + $value = (string)$value; + + static $escape_map; + if ($escape_map === null) { + $escape_map = array( + chr(0x00) => '', + chr(0x07) => '', + chr(0x08) => '', + chr(0x09) => '', + chr(0x0A) => '', + chr(0x0D) => '', + chr(0x1B) => '', + chr(0x7F) => '', + ); + + for ($ii = 0; $ii < 32; $ii++) { + $c = chr($ii); + if (empty($escape_map[$c])) { + $escape_map[$c] = sprintf('<0x%02X>', $ii); + } + } + } + + $map = $escape_map; + if ($allow_whitespace) { + unset($map["\r"]); + unset($map["\n"]); + unset($map["\t"]); + } + + $value = str_replace(array_keys($map), array_values($map), $value); + + // In this mode, we additionally escape any which is not immediately + // followed by . + if ($allow_whitespace) { + $value = preg_replace('/\r(?!\n)/', '', $value); + } + + return $value; + } +} diff --git a/src/xsprintf/__tests__/PhutilCsprintfTestCase.php b/src/xsprintf/__tests__/PhutilCsprintfTestCase.php new file mode 100644 --- /dev/null +++ b/src/xsprintf/__tests__/PhutilCsprintfTestCase.php @@ -0,0 +1,96 @@ + true, + + // For arguments which have any characters which are not safe in some + // context, %R should apply standard escaping. + 'a b' => false, + + + 'http://domain.com/path/' => true, + 'svn+ssh://domain.com/path/' => true, + '`rm -rf`' => false, + '$VALUE' => false, + ); + + foreach ($inputs as $input => $expect_same) { + $actual = (string)csprintf('%R', $input); + if ($expect_same) { + $this->assertEqual($input, $actual); + } else { + $this->assertFalse($input === $actual); + } + } + } + + public function testPowershell() { + $cmd = csprintf('%s', "\n"); + $cmd->setEscapingMode(PhutilCommandString::MODE_POWERSHELL); + + $this->assertEqual( + '"`n"', + (string)$cmd); + } + + public function testNoPowershell() { + if (!phutil_is_windows()) { + $cmd = csprintf('%s', '#'); + $cmd->setEscapingMode(PhutilCommandString::MODE_DEFAULT); + + $this->assertEqual( + '\'#\'', + (string)$cmd); + } + } + + public function testPasswords() { + // Normal "%s" doesn't do anything special. + $command = csprintf('echo %s', 'hunter2trustno1'); + $this->assertTrue(strpos($command, 'hunter2trustno1') !== false); + + // "%P" takes a PhutilOpaqueEnvelope. + $caught = null; + try { + csprintf('echo %P', 'hunter2trustno1'); + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof InvalidArgumentException); + + + // "%P" masks the provided value. + $command = csprintf('echo %P', new PhutilOpaqueEnvelope('hunter2trustno1')); + $this->assertFalse(strpos($command, 'hunter2trustno1')); + + + // Executing the command works as expected. + list($out) = execx('%C', $command); + $this->assertTrue(strpos($out, 'hunter2trustno1') !== false); + } + + public function testEscapingIsRobust() { + if (phutil_is_windows()) { + $this->assertSkipped(pht("This test doesn't work on Windows.")); + } + + // Escaping should be robust even when used to escape commands which take + // other commands. + list($out) = execx( + 'sh -c %s', + csprintf( + 'sh -c %s', + csprintf( + 'sh -c %s', + csprintf( + 'echo %P', + new PhutilOpaqueEnvelope('!@#$%^&*()'))))); + $this->assertTrue(strpos($out, '!@#$%^&*()') !== false); + } + +} diff --git a/src/xsprintf/__tests__/PhutilHgsprintfTestCase.php b/src/xsprintf/__tests__/PhutilHgsprintfTestCase.php new file mode 100644 --- /dev/null +++ b/src/xsprintf/__tests__/PhutilHgsprintfTestCase.php @@ -0,0 +1,23 @@ +assertEqual( + "'version-1'", + hgsprintf('%s', 'version-1')); + + $this->assertEqual( + "'single\\'quote'", + hgsprintf('%s', "single'quote")); + + $this->assertEqual( + "'back\\\\slash'", + hgsprintf('%s', 'back\\slash')); + + $this->assertEqual( + "'33%'", + hgsprintf('%R', hgsprintf('%s', '33%'))); + } + +} diff --git a/src/xsprintf/__tests__/PhutilPregsprintfTestCase.php b/src/xsprintf/__tests__/PhutilPregsprintfTestCase.php new file mode 100644 --- /dev/null +++ b/src/xsprintf/__tests__/PhutilPregsprintfTestCase.php @@ -0,0 +1,23 @@ +assertEqual( + chr(7).'foobar'.chr(7), + pregsprintf('%s', '', 'foobar')); + + $this->assertEqual( + chr(7).'\.\*\[a\-z\]'.chr(7), + pregsprintf('%s', '', '.*[a-z]')); + + $this->assertEqual( + chr(7).'.*[a-z]'.chr(7), + pregsprintf('%R', '', '.*[a-z]')); + + $this->assertEqual( + chr(7).'^abc\.\*xyz.*$'.chr(7).'siU', + pregsprintf('^abc%sxyz%R$', 'siU', '.*', '.*')); + } + +} diff --git a/src/xsprintf/__tests__/PhutilTsprintfTestCase.php b/src/xsprintf/__tests__/PhutilTsprintfTestCase.php new file mode 100644 --- /dev/null +++ b/src/xsprintf/__tests__/PhutilTsprintfTestCase.php @@ -0,0 +1,24 @@ +assertEqual( + '', + (string)tsprintf('%s', "\0")); + + $this->assertEqual( + '[31mred[39m', + (string)tsprintf('%s', "\x1B[31mred\x1B[39m")); + + $block = "1\r\n2\r3\n4"; + + $this->assertEqual( + '1234', + (string)tsprintf('%s', $block)); + $this->assertEqual( + "1\r\n23\n4", + (string)tsprintf('%B', $block)); + } + +} diff --git a/src/xsprintf/__tests__/PhutilUrisprintfTestCase.php b/src/xsprintf/__tests__/PhutilUrisprintfTestCase.php new file mode 100644 --- /dev/null +++ b/src/xsprintf/__tests__/PhutilUrisprintfTestCase.php @@ -0,0 +1,19 @@ +assertEqual( + 'x.com?a=huh%3F', + urisprintf('x.com?a=%s', 'huh?')); + + $this->assertEqual( + '/a/origin%252Fmaster/z/', + urisprintf('/a/%p/z/', 'origin/master')); + + $this->assertEqual( + 'y.com?%21&%23', + vurisprintf('y.com?%s&%s', array('!', '#'))); + } + +} diff --git a/src/xsprintf/csprintf.php b/src/xsprintf/csprintf.php new file mode 100644 --- /dev/null +++ b/src/xsprintf/csprintf.php @@ -0,0 +1,140 @@ + $pos + 1) ? $pattern[$pos + 1] : null; + + $is_unmasked = !empty($userdata['unmasked']); + + if (empty($userdata['mode'])) { + $mode = PhutilCommandString::MODE_DEFAULT; + } else { + $mode = $userdata['mode']; + } + + if ($value instanceof PhutilCommandString) { + if ($is_unmasked) { + $value = $value->getUnmaskedString(); + } else { + $value = $value->getMaskedString(); + } + } + + switch ($type) { + case 'L': + // Remove the L. + $pattern = substr_replace($pattern, '', $pos, 1); + $length = strlen($pattern); + $type = 's'; + + // Check that the value is a non-empty array. + if (!is_array($value)) { + throw new InvalidArgumentException( + pht('Expected an array for %%L%s conversion.', $next)); + } + + switch ($next) { + case 's': + $values = array(); + foreach ($value as $val) { + $values[] = csprintf('%s', $val); + } + $value = implode(' ', $values); + break; + + case 'R': + $values = array(); + foreach ($value as $val) { + $values[] = csprintf('%R', $val); + } + $value = implode(' ', $values); + break; + + default: + throw new XsprintfUnknownConversionException("%L{$next}"); + } + break; + + case 'R': + if (!preg_match('(^[a-zA-Z0-9:/@._+-]+$)', $value)) { + $value = PhutilCommandString::escapeArgument($value, $mode); + } + $type = 's'; + break; + case 's': + $value = PhutilCommandString::escapeArgument($value, $mode); + $type = 's'; + break; + case 'P': + if (!($value instanceof PhutilOpaqueEnvelope)) { + throw new InvalidArgumentException( + pht('Expected %s for %%P conversion.', 'PhutilOpaqueEnvelope')); + } + if ($is_unmasked) { + $value = $value->openEnvelope(); + } else { + $value = '********'; + } + $value = PhutilCommandString::escapeArgument($value, $mode); + $type = 's'; + break; + case 'C': + $type = 's'; + break; + } + + $pattern[$pos] = $type; +} diff --git a/src/xsprintf/exception/XsprintfUnknownConversionException.php b/src/xsprintf/exception/XsprintfUnknownConversionException.php new file mode 100644 --- /dev/null +++ b/src/xsprintf/exception/XsprintfUnknownConversionException.php @@ -0,0 +1,10 @@ + 0x1FFFFFFFFFFFFF) { + throw new RangeException( + pht( + "You are passing an integer to %s which is so large it can ". + "not be represented without loss of precision by Javascript's ". + "native %s class. Use %%# instead.", + 'jsprintf()', + 'Number')); + } + break; + } + + $pattern[$pos] = $type; +} diff --git a/src/xsprintf/ldapsprintf.php b/src/xsprintf/ldapsprintf.php new file mode 100644 --- /dev/null +++ b/src/xsprintf/ldapsprintf.php @@ -0,0 +1,48 @@ +;"= '); + $type = 's'; + break; + + case 'Q': + $type = 's'; + break; + } + + $pattern[$pos] = $type; +} diff --git a/src/xsprintf/pregsprintf.php b/src/xsprintf/pregsprintf.php new file mode 100644 --- /dev/null +++ b/src/xsprintf/pregsprintf.php @@ -0,0 +1,45 @@ + $delim); + + $pattern = xsprintf('xsprintf_regex', $userdata, $args); + return $delim.$pattern.$delim.$flags; +} + +/** + * @{function:xsprintf} callback for regular expressions. + */ +function xsprintf_regex($userdata, &$pattern, &$pos, &$value, &$length) { + $delim = idx($userdata, 'delimiter'); + $type = $pattern[$pos]; + + switch ($type) { + case 's': + $value = preg_quote($value, $delim); + break; + case 'R': + $type = 's'; + break; + } + + $pattern[$pos] = $type; +} diff --git a/src/xsprintf/qsprintf.php b/src/xsprintf/qsprintf.php new file mode 100644 --- /dev/null +++ b/src/xsprintf/qsprintf.php @@ -0,0 +1,318 @@ + and %<. + * + * %> ("Prefix") + * Escapes a prefix query for a LIKE clause. For example: + * + * // Find all rows where `name` starts with $prefix. + * qsprintf($escaper, 'WHERE name LIKE %>', $prefix); + * + * %< ("Suffix") + * Escapes a suffix query for a LIKE clause. For example: + * + * // Find all rows where `name` ends with $suffix. + * qsprintf($escaper, 'WHERE name LIKE %<', $suffix); + */ +function qsprintf(PhutilQsprintfInterface $escaper, $pattern /* , ... */) { + $args = func_get_args(); + array_shift($args); + return xsprintf('xsprintf_query', $escaper, $args); +} + +function vqsprintf(PhutilQsprintfInterface $escaper, $pattern, array $argv) { + array_unshift($argv, $pattern); + return xsprintf('xsprintf_query', $escaper, $argv); +} + +/** + * @{function:xsprintf} callback for encoding SQL queries. See + * @{function:qsprintf}. + */ +function xsprintf_query($userdata, &$pattern, &$pos, &$value, &$length) { + $type = $pattern[$pos]; + $escaper = $userdata; + $next = (strlen($pattern) > $pos + 1) ? $pattern[$pos + 1] : null; + + $nullable = false; + $done = false; + + $prefix = ''; + + if (!($escaper instanceof PhutilQsprintfInterface)) { + throw new InvalidArgumentException(pht('Invalid database escaper.')); + } + + switch ($type) { + case '=': // Nullable test + switch ($next) { + case 'd': + case 'f': + case 's': + $pattern = substr_replace($pattern, '', $pos, 1); + $length = strlen($pattern); + $type = 's'; + if ($value === null) { + $value = 'IS NULL'; + $done = true; + } else { + $prefix = '= '; + $type = $next; + } + break; + default: + throw new Exception( + pht( + 'Unknown conversion, try %s, %s, or %s.', + '%=d', + '%=s', + '%=f')); + } + break; + + case 'n': // Nullable... + switch ($next) { + case 'd': // ...integer. + case 'f': // ...float. + case 's': // ...string. + case 'B': // ...binary string. + $pattern = substr_replace($pattern, '', $pos, 1); + $length = strlen($pattern); + $type = $next; + $nullable = true; + break; + default: + throw new XsprintfUnknownConversionException("%n{$next}"); + } + break; + + case 'L': // List of.. + qsprintf_check_type($value, "L{$next}", $pattern); + $pattern = substr_replace($pattern, '', $pos, 1); + $length = strlen($pattern); + $type = 's'; + $done = true; + + switch ($next) { + case 'd': // ...integers. + $value = implode(', ', array_map('intval', $value)); + break; + case 'f': // ...floats. + $value = implode(', ', array_map('floatval', $value)); + break; + case 's': // ...strings. + foreach ($value as $k => $v) { + $value[$k] = "'".$escaper->escapeUTF8String((string)$v)."'"; + } + $value = implode(', ', $value); + break; + case 'B': // ...binary strings. + foreach ($value as $k => $v) { + $value[$k] = "'".$escaper->escapeBinaryString((string)$v)."'"; + } + $value = implode(', ', $value); + break; + case 'C': // ...columns. + foreach ($value as $k => $v) { + $value[$k] = $escaper->escapeColumnName($v); + } + $value = implode(', ', $value); + break; + default: + throw new XsprintfUnknownConversionException("%L{$next}"); + } + break; + } + + if (!$done) { + qsprintf_check_type($value, $type, $pattern); + switch ($type) { + case 's': // String + if ($nullable && $value === null) { + $value = 'NULL'; + } else { + $value = "'".$escaper->escapeUTF8String((string)$value)."'"; + } + $type = 's'; + break; + + case 'B': // Binary String + if ($nullable && $value === null) { + $value = 'NULL'; + } else { + $value = "'".$escaper->escapeBinaryString((string)$value)."'"; + } + $type = 's'; + break; + + case 'Q': // Query Fragment + $type = 's'; + break; + + case '~': // Like Substring + case '>': // Like Prefix + case '<': // Like Suffix + $value = $escaper->escapeStringForLikeClause($value); + switch ($type) { + case '~': $value = "'%".$value."%'"; break; + case '>': $value = "'".$value."%'"; break; + case '<': $value = "'%".$value."'"; break; + } + $type = 's'; + break; + + case 'f': // Float + if ($nullable && $value === null) { + $value = 'NULL'; + } else { + $value = (float)$value; + } + $type = 's'; + break; + + case 'd': // Integer + if ($nullable && $value === null) { + $value = 'NULL'; + } else { + $value = (int)$value; + } + $type = 's'; + break; + + case 'T': // Table + case 'C': // Column + $value = $escaper->escapeColumnName($value); + $type = 's'; + break; + + case 'K': // Komment + $value = $escaper->escapeMultilineComment($value); + $type = 's'; + break; + + default: + throw new XsprintfUnknownConversionException($type); + } + } + + if ($prefix) { + $value = $prefix.$value; + } + $pattern[$pos] = $type; +} + +function qsprintf_check_type($value, $type, $query) { + switch ($type) { + case 'Ld': + case 'Ls': + case 'LC': + case 'LB': + case 'Lf': + if (!is_array($value)) { + throw new AphrontParameterQueryException( + $query, + pht('Expected array argument for %%%s conversion.', $type)); + } + if (empty($value)) { + throw new AphrontParameterQueryException( + $query, + pht('Array for %%%s conversion is empty.', $type)); + } + + foreach ($value as $scalar) { + qsprintf_check_scalar_type($scalar, $type, $query); + } + break; + default: + qsprintf_check_scalar_type($value, $type, $query); + break; + } +} + +function qsprintf_check_scalar_type($value, $type, $query) { + switch ($type) { + case 'Q': + case 'LC': + case 'T': + case 'C': + if (!is_string($value)) { + throw new AphrontParameterQueryException( + $query, + pht('Expected a string for %%%s conversion.', $type)); + } + break; + + case 'Ld': + case 'Lf': + case 'd': + case 'f': + if (!is_null($value) && !is_numeric($value)) { + throw new AphrontParameterQueryException( + $query, + pht('Expected a numeric scalar or null for %%%s conversion.', $type)); + } + break; + + case 'Ls': + case 's': + case 'LB': + case 'B': + case '~': + case '>': + case '<': + case 'K': + if (!is_null($value) && !is_scalar($value)) { + throw new AphrontParameterQueryException( + $query, + pht('Expected a scalar or null for %%%s conversion.', $type)); + } + break; + + default: + throw new XsprintfUnknownConversionException($type); + } +} diff --git a/src/xsprintf/queryfx.php b/src/xsprintf/queryfx.php new file mode 100644 --- /dev/null +++ b/src/xsprintf/queryfx.php @@ -0,0 +1,27 @@ +setLastActiveEpoch(time()); + $conn->executeRawQuery($query); +} + +function queryfx_all(AphrontDatabaseConnection $conn, $sql /* , ... */) { + $argv = func_get_args(); + call_user_func_array('queryfx', $argv); + return $conn->selectAllResults(); +} + +function queryfx_one(AphrontDatabaseConnection $conn, $sql /* , ... */) { + $argv = func_get_args(); + $ret = call_user_func_array('queryfx_all', $argv); + if (count($ret) > 1) { + throw new AphrontCountQueryException( + pht('Query returned more than one row.')); + } else if (count($ret)) { + return reset($ret); + } + return null; +} diff --git a/src/xsprintf/tsprintf.php b/src/xsprintf/tsprintf.php new file mode 100644 --- /dev/null +++ b/src/xsprintf/tsprintf.php @@ -0,0 +1,44 @@ += $argc) { + throw new BadFunctionCallException( + pht( + 'Too few arguments to %s.', + 'xsprintf()')); + } + + if ($callback !== null) { + $callback($userdata, $pattern, $pos, $argv[$arg], $len); + } + } + } + + if ($c === '%') { + // If we have "%%", this encodes a literal percentage symbol, so we are + // no longer inside a conversion. + $conv = !$conv; + } + } + + if ($arg !== ($argc - 1)) { + throw new BadFunctionCallException( + pht( + 'Too many arguments to %s.', + 'xsprintf()')); + } + + $argv[0] = $pattern; + return call_user_func_array('sprintf', $argv); +} + +/** + * Example @{function:xsprintf} callback. When you call `xsprintf`, you must + * pass a callback like this one. `xsprintf` will invoke the callback when it + * encounters a conversion (like "%Z") in the pattern string. + * + * Generally, this callback should examine `$pattern[$pos]` (which will contain + * the conversion character, like 'Z'), escape `$value` appropriately, and then + * replace `$pattern[$pos]` with an 's' so `sprintf` prints the escaped value + * as a string. However, more sophisticated behaviors are possible -- + * particularly, consuming multiple characters to allow for conversions like + * "%Ld". In this case, the callback needs to `substr_replace` the entire + * conversion with 's' and then update `$length`. + * + * For example implementations, see @{function:xsprintf_command}, + * @{function:xsprintf_javascript} and @{function:xsprintf_query}. + * + * @param wild Arbitrary, optional userdata. This is whatever userdata + * was passed to @{function:xsprintf}. + * @param string The pattern string being parsed. + * @param int The current character position in the string. + * @param wild The value to convert. + * @param int The string length. + */ +function xsprintf_callback_example( + $userdata, + &$pattern, + &$pos, + &$value, + &$length) { + throw new RuntimeException( + pht( + 'This function exists only to document the call signature '. + 'for %s callbacks.', + 'xsprintf()')); +} diff --git a/support/ArcanistRuntime.php b/support/ArcanistRuntime.php --- a/support/ArcanistRuntime.php +++ b/support/ArcanistRuntime.php @@ -35,7 +35,7 @@ array( 'name' => 'library', 'param' => 'path', - 'help' => pht('Load a libphutil library.'), + 'help' => pht('Load a library.'), 'repeat' => true, ), array( @@ -243,21 +243,6 @@ ini_set('include_path', $php_include_path); - // Load libphutil. Note that this has some side effects, including - // adjusting some PHP configuration values. - @include_once 'libphutil/scripts/__init_script__.php'; - - if (!@constant('__LIBPHUTIL__')) { - return $this->fatalError( - 'Unable to load libphutil. Put "libphutil/" next to "arcanist/"; '. - 'or update your PHP "include_path" to include the parent directory '. - 'of "libphutil/"; or symlink "libphutil" into '. - '"arcanist/externals/includes/".'); - } - - // Load Arcanist. - phutil_load_library($arcanist_dir.'/src/'); - return 0; } diff --git a/support/parser/generate-type-parser.php b/support/parser/generate-type-parser.php new file mode 100755 --- /dev/null +++ b/support/parser/generate-type-parser.php @@ -0,0 +1,69 @@ +#!/usr/bin/env php +', + '(', + ')', + ',', + 'k', + 'map', + 'list', + '?', + 'opt', + 'cm', +); + +$rules = array( + 'start' => 'maybe_optional', + 'maybe_optional' => array( + 'yes' => 'opt maybe_comment', + 'no' => 'maybe_comment', + ), + 'maybe_comment' => array( + 'yes' => 'type comment', + 'no' => 'type', + ), + 'comment' => '( comment_text )', + 'comment_text' => array( + 'comment_text cm', + 'cm', + ), + 'type' => array( + 'yes' => 'some_type ?', + 'no' => 'some_type', + ), + 'some_type' => array( + 'or_type', + 'not_or_type', + ), + 'or_type' => array( + 'or_type | not_or_type', + 'not_or_type | not_or_type', + ), + 'not_or_type' => array( + 'basic_type', + 'map_type', + 'list_type', + ), + 'basic_type' => array( + 'k', + ), + 'map_type' => array( + 'map < type , type >', + ), + 'list_type' => array( + 'list < type >', + ), +); + +$parser = id(new PhutilParserGenerator()) + ->setTerminals($terminals) + ->setRules($rules) + ->processGrammar(); + +echo $parser->generateParserFunction('phutil_type_spec_parser')."\n"; diff --git a/support/xhpast/Makefile b/support/xhpast/Makefile new file mode 100644 --- /dev/null +++ b/support/xhpast/Makefile @@ -0,0 +1,77 @@ +BISONFLAGS = --verbose -Wall +CPPFLAGS = -fPIC -Wall +FLEXFLAGS = -CFr + +ifdef DEBUG + BISONFLAGS += --debug + CPPFLAGS += -ggdb -DDEBUG + FLEXFLAGS += --debug +else + CPPFLAGS += -O3 -minline-all-stringops +endif + +ifdef PROFILE + CPPFLAGS += -pg +endif + +ifdef STATIC + CPPFLAGS += -static +endif + +ifdef MSYSTEM + CPPFLAGS += -static-libgcc -static-libstdc++ +endif + +ROOT = ../../src/parser/xhpast + +.PHONY: all +all: xhpast + +clean: + rm -f xhpast parser.yacc.output libxhpast.a *.o + +cleanall: clean + rm -f scanner.lex.hpp scanner.lex.cpp parser.yacc.hpp parser.yacc.cpp + rm -f node_names.hpp parser_nodes.php + +.PHONY: install +install: xhpast + cp xhpast $(ROOT)/bin/xhpast + +.PHONY: parser scanner + +parser: parser.yacc.hpp parser.yacc.cpp +scanner: scanner.lex.hpp scanner.lex.cpp + +%.lex.hpp %.lex.cpp: %.l +ifndef SKIP_SCANNER + flex $(FLEXFLAGS) --header-file=$*.lex.hpp --outfile=$*.lex.cpp $< + @echo '/* @gen''er''ated */' >> $*.lex.hpp + @echo '/* @gen''er''ated */' >> $*.lex.cpp +else + touch $*.lex.hpp $*.lex.cpp +endif + +%.yacc.hpp %.yacc.cpp: %.y +ifndef SKIP_PARSER + bison $(BISONFLAGS) --defines=$*.yacc.hpp --output=$*.yacc.cpp $< + @echo '/* @gen''er''ated */' >> $*.yacc.hpp + @echo '/* @gen''er''ated */' >> $*.yacc.cpp +else + touch $*.yacc.hpp $*.yacc.cpp +endif + +%.o: %.cpp + $(CXX) -c $(CPPFLAGS) -o $@ $< + +node_names.hpp parser_nodes.php: generate_nodes.php + php -f $< + +parser.yacc.o: scanner.lex.hpp +scanner.lex.o: parser.yacc.hpp node_names.hpp scanner.lex.hpp + +libxhpast.a: scanner.lex.o parser.yacc.o + $(AR) -crs $@ $^ + +xhpast: xhpast.cpp libxhpast.a + $(CXX) $(CPPFLAGS) -o $@ $^ diff --git a/support/xhpast/README b/support/xhpast/README new file mode 100644 --- /dev/null +++ b/support/xhpast/README @@ -0,0 +1,18 @@ += Building = + +Normally, you can build `xhpast` by running `make`, which will create a binary +in this directory: + + xhpast/ $ make + +You can run `make install` to copy that binary to the right place in libphutil +so that libphutil, Phabricator, Diviner, etc., can use xhpast. + +If you are developing `xhpast`, you need to `make parser scanner xhpast` +instead to regenerate the parser and scanner: + + xhpast/ $ make parser scanner xhpast + +We ship the generated parser and scanner and do not rebuild them by default to +prevent users from needing to install flex and bison and fiddle around with +flex versions. diff --git a/support/xhpast/ast.hpp b/support/xhpast/ast.hpp new file mode 100644 --- /dev/null +++ b/support/xhpast/ast.hpp @@ -0,0 +1,53 @@ +#pragma once + +#include +#include + +#include "astnode.hpp" + +class yy_extra_type { + public: + yy_extra_type() { + first_lineno = 0; + lineno = 1; + terminated = false; + last_token = -1; + insert_token = -1; + heredoc_yyleng = -1; + list_size = 0; + pushStack(); + } + + size_t first_lineno; // line number before scanning the current token + size_t lineno; // current line number being scanned. + std::string error; // description of error (if terminated true) + bool terminated; // becomes true when the parser terminates with an error + int last_token; // the last token to be returned by the scanner + int insert_token; // insert this token without reading from buffer + size_t heredoc_yyleng; // last length of yytext while scanning + std::string heredoc_label; // heredoc sentinel label + unsigned int list_size; + + xhpast::token_list_t token_list; + + void pushStack() { + tag_stack.push_front(std::deque()); + } + + protected: + std::deque > tag_stack; +}; + +#define YYSTYPE xhpast::Node * +#define YY_HEADER_EXPORT_START_CONDITIONS +#define YY_EXTRA_TYPE yy_extra_type* + +#include "parser.yacc.hpp" +#ifndef FLEX_SCANNER + #include "scanner.lex.hpp" +#endif + +int xhpparse(void*, YYSTYPE *); +void xhp_new_push_state(int s, struct yyguts_t* yyg); +void xhp_new_pop_state(struct yyguts_t* yyg); +void xhp_set_state(int s, struct yyguts_t* yyg); diff --git a/support/xhpast/astnode.hpp b/support/xhpast/astnode.hpp new file mode 100644 --- /dev/null +++ b/support/xhpast/astnode.hpp @@ -0,0 +1,106 @@ +#pragma once +#include +#include +#include +#include + +namespace xhpast { + + class Token; + typedef std::list token_list_t; + + class Token { + + public: + unsigned int type; + std::string value; + unsigned int lineno; + unsigned int n; + + Token(unsigned int type, char *value, unsigned int n) : + type(type), + value(value), + lineno(0), + n(n) { + } + }; + + class Node; + typedef std::list node_list_t; + + class Node { + public: + unsigned int type; + + int l_tok; + int r_tok; + + node_list_t children; + + + Node() : type(0), l_tok(-1), r_tok(-1) {}; + + Node(unsigned int type) : type(type), l_tok(-1), r_tok(-1) {}; + + Node(unsigned int type, int end_tok) : + type(type) { + this->l_tok = end_tok; + this->r_tok = end_tok; + } + + Node(unsigned int type, int l_tok, int r_tok) : + type(type), + l_tok(l_tok), + r_tok(r_tok) { + + } + + Node *appendChild(Node *node) { + this->children.push_back(node); + return this->expandRange(node); + } + + Node *appendChildren(Node *node) { + for (node_list_t::iterator ii = node->children.begin(); + ii != node->children.end(); + ++ii) { + + this->appendChild(*ii); + } + return this; + } + + Node *firstChild() { + if (this->children.empty()) { + return NULL; + } + return *(this->children.begin()); + } + + Node *setType(unsigned int t) { + this->type = t; + return this; + } + + Node *expandRange(Node *n) { + if (!n) { + fprintf( + stderr, + "Trying to expandRange() a null node to one of type %d\n", + this->type); + exit(1); + }; + + if (n->l_tok != -1 && (n->l_tok < this->l_tok || (this->l_tok == -1))) { + this->l_tok = n->l_tok; + } + + if (n->r_tok != -1 && (n->r_tok > this->r_tok || (this->r_tok == -1))) { + this->r_tok = n->r_tok; + } + + return this; + } + + }; +} diff --git a/support/xhpast/generate_nodes.php b/support/xhpast/generate_nodes.php new file mode 100755 --- /dev/null +++ b/support/xhpast/generate_nodes.php @@ -0,0 +1,164 @@ +#!/usr/bin/env php + $value) { + $hpp .= "#define {$node} {$value}\n"; +} +Filesystem::writeFile( + Filesystem::resolvePath('node_names.hpp', dirname(__FILE__)), + $hpp); +echo pht('Wrote C++ definition.')."\n"; + +$at = '@'; +$php = << $value) { + $php .= " {$value} => '{$node}',\n"; +} +$php .= <<(xhpastget_extra(yyscanner)) +#undef yylineno +#define yylineno yyextra->first_lineno +#define push_state(s) xhp_new_push_state(s, (struct yyguts_t*) yyscanner) +#define pop_state() xhp_new_pop_state((struct yyguts_t*) yyscanner) +#define set_state(s) xhp_set_state(s, (struct yyguts_t*) yyscanner) + +#define NNEW(t) \ + (new xhpast::Node(t)) + +#define NTYPE(n, type) \ + ((n)->setType(type)) + +#define NMORE(n, end) \ + ((n)->expandRange(end)) + +#define NSPAN(n, type, end) \ + (NMORE(NTYPE((n), type), end)) + +#define NEXPAND(l, n, r) \ + ((n)->expandRange(l)->expandRange(r)) + +using namespace std; + +static void yyerror(void* yyscanner, void* _, const char* error) { + if (yyextra->terminated) { + return; + } + yyextra->terminated = true; + yyextra->error = error; +} + +%} + +%expect 5 +// 2: PHP's if/else grammar +// 7: expr '[' dim_offset ']' -- shift will default to first grammar +%name-prefix "xhpast" +%pure-parser +%parse-param { void* yyscanner } +%parse-param { xhpast::Node** root } +%lex-param { void* yyscanner } +%error-verbose + +%precedence T_INCLUDE T_INCLUDE_ONCE +%token T_EVAL +%precedence T_REQUIRE T_REQUIRE_ONCE +%token ',' +%left T_LOGICAL_OR +%left T_LOGICAL_XOR +%left T_LOGICAL_AND +%precedence T_PRINT +%precedence '=' T_PLUS_EQUAL + T_MINUS_EQUAL + T_MUL_EQUAL + T_DIV_EQUAL + T_CONCAT_EQUAL + T_MOD_EQUAL + T_AND_EQUAL + T_OR_EQUAL + T_XOR_EQUAL + T_SL_EQUAL + T_SR_EQUAL +%left '?' ':' +%right T_COALESCE +%left T_BOOLEAN_OR +%left T_BOOLEAN_AND +%left '|' +%left '^' +%left '&' +%nonassoc T_IS_EQUAL T_IS_NOT_EQUAL T_IS_IDENTICAL T_IS_NOT_IDENTICAL + T_SPACESHIP +%nonassoc '<' T_IS_SMALLER_OR_EQUAL '>' T_IS_GREATER_OR_EQUAL +%left T_SL T_SR +%left '+' '-' '.' +%left '*' '/' '%' +%precedence '!' +%precedence T_INSTANCEOF +%precedence '~' T_INC +%token T_DEC +%precedence T_INT_CAST T_DOUBLE_CAST T_STRING_CAST +%token T_UNICODE_CAST +%token T_BINARY_CAST +%precedence T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST '@' +%token '[' +%token T_NEW +%precedence T_CLONE +%token T_EXIT +%token T_IF +%token T_ELSEIF +%token T_ELSE +%token T_ENDIF + +%token T_LNUMBER +%token T_DNUMBER +%token T_STRING +%token T_STRING_VARNAME /* unused in XHP: `foo` in `"$foo"` */ +%token T_VARIABLE +%token T_NUM_STRING /* unused in XHP: `0` in `"$foo[0]"` */ +%token T_INLINE_HTML +%token T_CHARACTER /* unused in vanilla PHP */ +%token T_BAD_CHARACTER /* unused in vanilla PHP */ +%token T_ENCAPSED_AND_WHITESPACE /* unused in XHP: ` ` in `" "` */ +%token T_CONSTANT_ENCAPSED_STRING /* overloaded in XHP; + replaces '"' encaps_list '"' */ +%token T_BACKTICKS_EXPR /* new in XHP; replaces '`' backticks_expr '`' */ +%token T_ECHO +%token T_DO +%token T_WHILE +%token T_ENDWHILE +%token T_FOR +%token T_ENDFOR +%token T_FOREACH +%token T_ENDFOREACH +%token T_DECLARE +%token T_ENDDECLARE +%token T_AS +%token T_SWITCH +%token T_ENDSWITCH +%token T_CASE +%token T_DEFAULT +%token T_BREAK +%token T_CONTINUE +%token T_GOTO +%token T_FUNCTION +%token T_CONST +%token T_RETURN +%token T_TRY +%token T_CATCH +%token T_THROW +%token T_USE +%token T_GLOBAL +%token T_STATIC +%token T_ABSTRACT +%token T_FINAL +%token T_PRIVATE +%token T_PROTECTED +%token T_PUBLIC +%token T_VAR +%token T_UNSET +%token T_ISSET +%token T_EMPTY +%token T_HALT_COMPILER +%token T_CLASS +%token T_INTERFACE +%token T_EXTENDS +%token T_IMPLEMENTS +%token T_OBJECT_OPERATOR +%token T_DOUBLE_ARROW +%token T_LIST +%token T_ARRAY +%token T_CLASS_C +%token T_METHOD_C +%token T_FUNC_C +%token T_LINE +%token T_FILE +%token T_COMMENT +%token T_DOC_COMMENT +%token T_OPEN_TAG +%token T_OPEN_TAG_WITH_ECHO +%token T_OPEN_TAG_FAKE +%token T_CLOSE_TAG +%token T_WHITESPACE +%token T_START_HEREDOC /* unused in XHP; replaced with T_HEREDOC */ +%token T_END_HEREDOC /* unused in XHP; replaced with T_HEREDOC */ +%token T_HEREDOC /* new in XHP; + replaces start_heredoc encaps_list T_END_HEREDOC */ +%token T_DOLLAR_OPEN_CURLY_BRACES /* unused in XHP: `${` in `"${foo}"` */ +%token T_CURLY_OPEN /* unused in XHP: `{$` in `"{$foo}"` */ +%token T_PAAMAYIM_NEKUDOTAYIM +%token T_BINARY_DOUBLE /* unsused in XHP: `b"` in `b"foo"` */ +%token T_BINARY_HEREDOC /* unsused in XHP: `b<<<` in `b<<appendChild($1); + } +; + +top_statement_list: + top_statement_list top_statement { + $$ = $1->appendChild($2); + } +| %empty { + $$ = NNEW(n_STATEMENT_LIST); + } +; + +namespace_name: + T_STRING { + $$ = NTYPE($1, n_SYMBOL_NAME); + } +| namespace_name T_NS_SEPARATOR T_STRING { + $$ = NMORE($1, $3); + } +; + +top_statement: + statement +| function_declaration_statement +| class_declaration_statement +| T_HALT_COMPILER '(' ')' ';' { + $1 = NSPAN($1, n_HALT_COMPILER, $3); + $$ = NNEW(n_STATEMENT)->appendChild($1); + NMORE($$, $4); + } +| T_NAMESPACE namespace_name ';' { + NSPAN($1, n_NAMESPACE, $2); + $1->appendChild($2); + $1->appendChild(NNEW(n_EMPTY)); + $$ = NNEW(n_STATEMENT)->appendChild($1); + NMORE($$, $3); + } +| T_NAMESPACE namespace_name '{' top_statement_list '}' { + NSPAN($1, n_NAMESPACE, $5); + $1->appendChild($2); + $1->appendChild(NEXPAND($3, $4, $5)); + $$ = NNEW(n_STATEMENT)->appendChild($1); + } +| T_NAMESPACE '{' top_statement_list '}' { + NSPAN($1, n_NAMESPACE, $4); + $1->appendChild(NNEW(n_EMPTY)); + NMORE($3, $4); + NMORE($3, $2); + $1->appendChild($3); + $$ = NNEW(n_STATEMENT)->appendChild($1); + } +| T_USE use_declarations ';' { + NMORE($2, $1); + $$ = NNEW(n_STATEMENT)->appendChild($2); + NMORE($$, $3); + } +| constant_declaration ';' { + $$ = NNEW(n_STATEMENT)->appendChild($1); + NMORE($$, $2); + } +; + +use_declarations: + use_declarations ',' use_declaration { + $$ = $1->appendChild($3); + } +| use_declaration { + $$ = NNEW(n_USE_LIST); + $$->appendChild($1); + } +; + +use_declaration: + namespace_name { + $$ = NNEW(n_USE); + $$->appendChild($1); + $$->appendChild(NNEW(n_EMPTY)); + } +| namespace_name T_AS T_STRING { + $$ = NNEW(n_USE); + $$->appendChild($1); + NTYPE($3, n_STRING); + $$->appendChild($3); + } +| T_NS_SEPARATOR namespace_name { + $$ = NNEW(n_USE); + NMORE($2, $1); + $$->appendChild($2); + $$->appendChild(NNEW(n_EMPTY)); + } +| T_NS_SEPARATOR namespace_name T_AS T_STRING { + $$ = NNEW(n_USE); + NMORE($2, $1); + $$->appendChild($2); + NTYPE($4, n_STRING); + $$->appendChild($4); + } +; + +constant_declaration: + constant_declaration ',' T_STRING '=' static_scalar { + NMORE($$, $5); + $$->appendChild( + NNEW(n_CONSTANT_DECLARATION) + ->appendChild(NTYPE($3, n_STRING)) + ->appendChild($5)); + } +| T_CONST T_STRING '=' static_scalar { + NSPAN($$, n_CONSTANT_DECLARATION_LIST, $4); + $$->appendChild( + NNEW(n_CONSTANT_DECLARATION) + ->appendChild(NTYPE($2, n_STRING)) + ->appendChild($4)); + } +; + +inner_statement_list: + inner_statement_list inner_statement { + $$ = $1->appendChild($2); + } +| %empty { + $$ = NNEW(n_STATEMENT_LIST); + } +; + +inner_statement: + statement +| function_declaration_statement +| class_declaration_statement +| T_HALT_COMPILER '(' ')' ';' { + $1 = NSPAN($1, n_HALT_COMPILER, $3); + $$ = NNEW(n_STATEMENT)->appendChild($1); + NMORE($$, $4); + } +; + +statement: + unticked_statement +| T_STRING ':' { + NTYPE($1, n_STRING); + $$ = NNEW(n_LABEL); + $$->appendChild($1); + NMORE($$, $2); + } +| T_OPEN_TAG { + $$ = NTYPE($1, n_OPEN_TAG); + } +| T_OPEN_TAG_WITH_ECHO { + $$ = NTYPE($1, n_OPEN_TAG); + } +| T_CLOSE_TAG { + $$ = NTYPE($1, n_CLOSE_TAG); + } +; + +unticked_statement: + '{' inner_statement_list '}' { + $$ = NEXPAND($1, $2, $3); + } +| T_IF '(' expr ')' statement elseif_list else_single { + $$ = NNEW(n_CONDITION_LIST); + + $1 = NTYPE($1, n_IF); + $1->appendChild(NSPAN($2, n_CONTROL_CONDITION, $4)->appendChild($3)); + $1->appendChild($5); + + $$->appendChild($1); + $$->appendChildren($6); + + // Hacks: merge a list of if (x) { } else if (y) { } into a single condition + // list instead of a condition tree. + + if ($7->type == n_EMPTY) { + // Ignore. + } else if ($7->type == n_ELSE) { + xhpast::Node *stype = $7->firstChild()->firstChild(); + if (stype && stype->type == n_CONDITION_LIST) { + NTYPE(stype->firstChild(), n_ELSEIF); + stype->firstChild()->l_tok = $7->l_tok; + $$->appendChildren(stype); + } else { + $$->appendChild($7); + } + } else { + $$->appendChild($7); + } + + $$ = NNEW(n_STATEMENT)->appendChild($$); + } +| T_IF '(' expr ')' ':' + inner_statement_list + new_elseif_list + new_else_single + T_ENDIF ';' { + + $$ = NNEW(n_CONDITION_LIST); + NTYPE($1, n_IF); + $1->appendChild(NSPAN($2, n_CONTROL_CONDITION, $4)->appendChild($3)); + $1->appendChild($6); + + $$->appendChild($1); + $$->appendChildren($7); + $$->appendChild($8); + NMORE($$, $9); + + $$ = NNEW(n_STATEMENT)->appendChild($$); + NMORE($$, $10); + } +| T_WHILE '(' expr ')' while_statement { + NTYPE($1, n_WHILE); + $1->appendChild(NSPAN($2, n_CONTROL_CONDITION, $4)->appendChild($3)); + $1->appendChild($5); + + $$ = NNEW(n_STATEMENT)->appendChild($1); + } +| T_DO statement T_WHILE '(' expr ')' ';' { + NTYPE($1, n_DO_WHILE); + $1->appendChild($2); + $1->appendChild(NSPAN($4, n_CONTROL_CONDITION, $6)->appendChild($5)); + + $$ = NNEW(n_STATEMENT)->appendChild($1); + NMORE($$, $7); + } +| T_FOR '(' for_expr ';' for_expr ';' for_expr ')' for_statement { + NTYPE($1, n_FOR); + + NSPAN($2, n_FOR_EXPRESSION, $8) + ->appendChild($3) + ->appendChild($5) + ->appendChild($7); + + $1->appendChild($2); + $1->appendChild($9); + + $$ = NNEW(n_STATEMENT)->appendChild($1); + } +| T_SWITCH '(' expr ')' switch_case_list { + NTYPE($1, n_SWITCH); + $1->appendChild(NSPAN($2, n_CONTROL_CONDITION, $4)->appendChild($3)); + $1->appendChild($5); + + $$ = NNEW(n_STATEMENT)->appendChild($1); + } +| T_BREAK ';' { + NTYPE($1, n_BREAK); + $1->appendChild(NNEW(n_EMPTY)); + + $$ = NNEW(n_STATEMENT)->appendChild($1); + NMORE($$, $2); + } +| T_BREAK expr ';' { + NTYPE($1, n_BREAK); + $1->appendChild($2); + + $$ = NNEW(n_STATEMENT)->appendChild($1); + NMORE($$, $3); + } +| T_CONTINUE ';' { + NTYPE($1, n_CONTINUE); + $1->appendChild(NNEW(n_EMPTY)); + + $$ = NNEW(n_STATEMENT)->appendChild($1); + NMORE($$, $2); + } +| T_CONTINUE expr ';' { + NTYPE($1, n_CONTINUE); + $1->appendChild($2); + + $$ = NNEW(n_STATEMENT)->appendChild($1); + NMORE($$, $3); + } +| T_RETURN ';' { + NTYPE($1, n_RETURN); + $1->appendChild(NNEW(n_EMPTY)); + + $$ = NNEW(n_STATEMENT)->appendChild($1); + NMORE($$, $2); + } +| T_RETURN expr_without_variable ';' { + NTYPE($1, n_RETURN); + $1->appendChild($2); + + $$ = NNEW(n_STATEMENT)->appendChild($1); + NMORE($$, $3); + } +| T_RETURN variable ';' { + NTYPE($1, n_RETURN); + $1->appendChild($2); + + $$ = NNEW(n_STATEMENT)->appendChild($1); + NMORE($$, $3); + } +| T_GLOBAL global_var_list ';' { + NMORE($2, $1); + $$ = NNEW(n_STATEMENT)->appendChild($2); + NMORE($$, $3); + } +| T_STATIC static_var_list ';' { + NMORE($2, $1); + $$ = NNEW(n_STATEMENT)->appendChild($2); + NMORE($$, $3); + } +| T_ECHO echo_expr_list ';' { + NMORE($2, $1); + $$ = NNEW(n_STATEMENT)->appendChild($2); + NMORE($$, $3); + } +| T_INLINE_HTML { + NTYPE($1, n_INLINE_HTML); + $$ = $1; + } +| expr ';' { + $$ = NNEW(n_STATEMENT)->appendChild($1); + NMORE($$, $2); + } +| yield_expr ';' { + $$ = NNEW(n_STATEMENT)->appendChild($1); + NMORE($$, $2); + } +| T_UNSET '(' unset_variables ')' ';' { + NMORE($3, $4); + NMORE($3, $1); + $$ = NNEW(n_STATEMENT)->appendChild($3); + NMORE($$, $5); + } +| T_FOREACH '(' variable T_AS foreach_variable foreach_optional_arg ')' + foreach_statement { + NTYPE($1, n_FOREACH); + NSPAN($2, n_FOREACH_EXPRESSION, $7); + $2->appendChild($3); + if ($6->type == n_EMPTY) { + $2->appendChild($6); + $2->appendChild($5); + } else { + $2->appendChild($5); + $2->appendChild($6); + } + $1->appendChild($2); + + $1->appendChild($8); + + $$ = NNEW(n_STATEMENT)->appendChild($1); + } +| T_FOREACH '(' expr_without_variable T_AS variable foreach_optional_arg ')' + foreach_statement { + NTYPE($1, n_FOREACH); + NSPAN($2, n_FOREACH_EXPRESSION, $7); + $2->appendChild($3); + if ($6->type == n_EMPTY) { + $2->appendChild($6); + $2->appendChild($5); + } else { + $2->appendChild($5); + $2->appendChild($6); + } + $1->appendChild($2); + $1->appendChild($8); + + $$ = NNEW(n_STATEMENT)->appendChild($1); + } +| T_DECLARE '(' declare_list ')' declare_statement { + NTYPE($1, n_DECLARE); + $1->appendChild($3); + $1->appendChild($5); + $$ = NNEW(n_STATEMENT)->appendChild($1); + } +| ';' /* empty statement */ { + $$ = NNEW(n_STATEMENT)->appendChild(NNEW(n_EMPTY)); + NMORE($$, $1); + } +| T_TRY '{' inner_statement_list '}' catch_list finally_statement { + NTYPE($1, n_TRY); + $1->appendChild(NEXPAND($2, $3, $4)); + + $1->appendChild($5); + $1->appendChild($6); + + $$ = NNEW(n_STATEMENT)->appendChild($1); + } +| T_TRY '{' inner_statement_list '}' non_empty_finally_statement { + NTYPE($1, n_TRY); + $1->appendChild(NEXPAND($2, $3, $4)); + + $1->appendChild(NNEW(n_CATCH_LIST)); + $1->appendChild($5); + + $$ = NNEW(n_STATEMENT)->appendChild($1); + } +| T_THROW expr ';' { + NTYPE($1, n_THROW); + $1->appendChild($2); + + $$ = NNEW(n_STATEMENT)->appendChild($1); + NMORE($$, $3); + + } +| T_GOTO T_STRING ';' { + NTYPE($1, n_GOTO); + NTYPE($2, n_STRING); + $1->appendChild($2); + + $$ = NNEW(n_STATEMENT)->appendChild($1); + NMORE($$, $3); + } +; + +catch_list: + catch_list catch { + $1->appendChild($2); + $$ = $1; + } +| catch { + $$ = NNEW(n_CATCH_LIST); + $$->appendChild($1); +} + +catch: + T_CATCH '(' fully_qualified_class_name T_VARIABLE ')' + '{' inner_statement_list '}' { + NTYPE($1, n_CATCH); + $1->appendChild($3); + $1->appendChild(NTYPE($4, n_VARIABLE)); + $1->appendChild(NEXPAND($6, $7, $8)); + NMORE($1, $8); + $$ = $1; + } +; + +finally_statement: + %empty { + $$ = NNEW(n_EMPTY); + } +| non_empty_finally_statement +; + +non_empty_finally_statement: + T_FINALLY '{' inner_statement_list '}' { + NTYPE($1, n_FINALLY); + $1->appendChild($3); + NMORE($1, $4); + $$ = $1; + } +; + +unset_variables: + unset_variable { + $$ = NNEW(n_UNSET_LIST); + $$->appendChild($1); + } +| unset_variables ',' unset_variable { + $1->appendChild($3); + $$ = $1; + } +; + +unset_variable: + variable +; + +function_declaration_statement: + unticked_function_declaration_statement +; + +class_declaration_statement: + unticked_class_declaration_statement +; + +is_reference: + %empty { + $$ = NNEW(n_EMPTY); + } +| '&' { + $$ = NTYPE($1, n_REFERENCE); + } +; + +unticked_function_declaration_statement: + function is_reference T_STRING + '(' parameter_list ')' return_type '{' inner_statement_list '}' { + NSPAN($1, n_FUNCTION_DECLARATION, $9); + $1->appendChild(NNEW(n_EMPTY)); + $1->appendChild($2); + $1->appendChild(NTYPE($3, n_STRING)); + $1->appendChild(NEXPAND($4, $5, $6)); + $1->appendChild(NNEW(n_EMPTY)); + $1->appendChild($7); + $1->appendChild(NEXPAND($8, $9, $10)); + + $$ = NNEW(n_STATEMENT)->appendChild($1); + } +; + +unticked_class_declaration_statement: + class_entry_type T_STRING extends_from implements_list + '{' class_statement_list '}' { + $$ = NNEW(n_CLASS_DECLARATION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_CLASS_NAME)); + $$->appendChild($3); + $$->appendChild($4); + $$->appendChild(NEXPAND($5, $6, $7)); + NMORE($$, $7); + + $$ = NNEW(n_STATEMENT)->appendChild($$); + } +| interface_entry T_STRING interface_extends_list '{' class_statement_list '}' { + $$ = NNEW(n_INTERFACE_DECLARATION); + $$->appendChild(NNEW(n_CLASS_ATTRIBUTES)); + NMORE($$, $1); + $$->appendChild(NTYPE($2, n_CLASS_NAME)); + $$->appendChild($3); + $$->appendChild(NNEW(n_EMPTY)); + $$->appendChild(NEXPAND($4, $5, $6)); + NMORE($$, $6); + + $$ = NNEW(n_STATEMENT)->appendChild($$); + } +; + +class_entry_type: + T_CLASS { + NTYPE($1, n_CLASS_ATTRIBUTES); + $$ = $1; + } +| T_ABSTRACT T_CLASS { + NTYPE($2, n_CLASS_ATTRIBUTES); + NMORE($2, $1); + $2->appendChild(NTYPE($1, n_STRING)); + + $$ = $2; + } +| T_FINAL T_CLASS { + NTYPE($2, n_CLASS_ATTRIBUTES); + NMORE($2, $1); + $2->appendChild(NTYPE($1, n_STRING)); + + $$ = $2; + } +| T_TRAIT { + $$ = NNEW(n_CLASS_ATTRIBUTES); + $$->appendChild(NTYPE($1, n_STRING)); + } +; + +extends_from: + %empty { + $$ = NNEW(n_EMPTY); + } +| T_EXTENDS fully_qualified_class_name { + $$ = NTYPE($1, n_EXTENDS_LIST)->appendChild($2); + } +; + +interface_entry: + T_INTERFACE +; + +interface_extends_list: + %empty { + $$ = NNEW(n_EMPTY); + } +| T_EXTENDS interface_list { + NTYPE($1, n_EXTENDS_LIST); + $1->appendChildren($2); + $$ = $1; + } +; + +implements_list: + %empty { + $$ = NNEW(n_EMPTY); + } +| T_IMPLEMENTS interface_list { + NTYPE($1, n_IMPLEMENTS_LIST); + $1->appendChildren($2); + $$ = $1; + } +; + +interface_list: + fully_qualified_class_name { + $$ = NNEW(n_IMPLEMENTS_LIST)->appendChild($1); + } +| interface_list ',' fully_qualified_class_name { + $$ = $1->appendChild($3); + } +; + +foreach_optional_arg: + %empty { + $$ = NNEW(n_EMPTY); + } +| T_DOUBLE_ARROW foreach_variable { + $$ = $2; + } +; + +foreach_variable: + variable +| '&' variable { + NTYPE($1, n_VARIABLE_REFERENCE); + $1->appendChild($2); + $$ = $1; + } +; + +for_statement: + statement +| ':' inner_statement_list T_ENDFOR ';' { + NMORE($2, $1); + NMORE($2, $4); + $$ = $2; + } +; + +foreach_statement: + statement +| ':' inner_statement_list T_ENDFOREACH ';' { + NMORE($2, $1); + NMORE($2, $4); + $$ = $2; + } +; + +declare_statement: + statement +| ':' inner_statement_list T_ENDDECLARE ';' { + NMORE($2, $1); + NMORE($2, $4); + $$ = $2; + } +; + +declare_list: + T_STRING '=' static_scalar { + $$ = NNEW(n_DECLARE_DECLARATION); + $$->appendChild(NTYPE($1, n_STRING)); + $$->appendChild($3); + $$ = NNEW(n_DECLARE_DECLARATION_LIST)->appendChild($$); + } +| declare_list ',' T_STRING '=' static_scalar { + $$ = NNEW(n_DECLARE_DECLARATION); + $$->appendChild(NTYPE($3, n_STRING)); + $$->appendChild($5); + + $1->appendChild($$); + $$ = $1; + } +; + +switch_case_list: + '{' case_list '}' { + $$ = NEXPAND($1, $2, $3); + } +| '{' ';' case_list '}' { + // ...why does this rule exist? + + NTYPE($2, n_STATEMENT); + $1->appendChild(NNEW(n_EMPTY)); + + $$ = NNEW(n_STATEMENT_LIST)->appendChild($2); + $$->appendChildren($3); + NEXPAND($1, $$, $4); + } +| ':' case_list T_ENDSWITCH ';' { + NMORE($2, $4); + NMORE($2, $1); + $$ = $2; + } +| ':' ';' case_list T_ENDSWITCH ';' { + NTYPE($2, n_STATEMENT); + $1->appendChild(NNEW(n_EMPTY)); + + $$ = NNEW(n_STATEMENT_LIST)->appendChild($2); + $$->appendChildren($3); + NMORE($$, $5); + NMORE($$, $1); + } +; + +case_list: + %empty { + $$ = NNEW(n_STATEMENT_LIST); + } +| case_list T_CASE expr case_separator inner_statement_list { + NTYPE($2, n_CASE); + $2->appendChild($3); + $2->appendChild($5); + + $1->appendChild($2); + $$ = $1; + } +| case_list T_DEFAULT case_separator inner_statement_list { + NTYPE($2, n_DEFAULT); + $2->appendChild($4); + + $1->appendChild($2); + $$ = $1; + } +; + +case_separator: + ':' +| ';' +; + +while_statement: + statement +| ':' inner_statement_list T_ENDWHILE ';' { + NMORE($2, $4); + NMORE($2, $1); + $$ = $2; + } +; + +elseif_list: + %empty { + $$ = NNEW(n_CONDITION_LIST); + } +| elseif_list T_ELSEIF '(' expr ')' statement { + NTYPE($2, n_ELSEIF); + $2->appendChild(NSPAN($3, n_CONTROL_CONDITION, $5)->appendChild($4)); + $2->appendChild($6); + + $$ = $1->appendChild($2); + } +; + +new_elseif_list: + %empty { + $$ = NNEW(n_CONDITION_LIST); + } +| new_elseif_list T_ELSEIF '(' expr ')' ':' inner_statement_list { + NTYPE($2, n_ELSEIF); + $2->appendChild($4); + $2->appendChild($7); + + $$ = $1->appendChild($2); + } +; + +else_single: + %empty { + $$ = NNEW(n_EMPTY); + } +| T_ELSE statement { + NTYPE($1, n_ELSE); + $1->appendChild($2); + $$ = $1; + } +; + +new_else_single: + %empty { + $$ = NNEW(n_EMPTY); + } +| T_ELSE ':' inner_statement_list { + NTYPE($1, n_ELSE); + $1->appendChild($3); + $$ = $1; + } +; + +parameter_list: + non_empty_parameter_list +| %empty { + $$ = NNEW(n_DECLARATION_PARAMETER_LIST); + } +; + +non_empty_parameter_list: + optional_type parameter { + $$ = NNEW(n_DECLARATION_PARAMETER); + $$->appendChild($1); + $$->appendChild($2); + $$->appendChild(NNEW(n_EMPTY)); + + $$ = NNEW(n_DECLARATION_PARAMETER_LIST)->appendChild($$); + } +| optional_type '&' parameter { + $$ = NNEW(n_DECLARATION_PARAMETER); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_VARIABLE_REFERENCE)); + $2->appendChild($3); + $$->appendChild(NNEW(n_EMPTY)); + + $$ = NNEW(n_DECLARATION_PARAMETER_LIST)->appendChild($$); + } +| optional_type '&' parameter '=' static_scalar { + $$ = NNEW(n_DECLARATION_PARAMETER); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_VARIABLE_REFERENCE)); + $2->appendChild($3); + $$->appendChild($5); + + $$ = NNEW(n_DECLARATION_PARAMETER_LIST)->appendChild($$); + } +| optional_type parameter '=' static_scalar { + $$ = NNEW(n_DECLARATION_PARAMETER); + $$->appendChild($1); + $$->appendChild($2); + $$->appendChild($4); + + $$ = NNEW(n_DECLARATION_PARAMETER_LIST)->appendChild($$); + } +| non_empty_parameter_list ',' optional_type parameter { + $$ = NNEW(n_DECLARATION_PARAMETER); + $$->appendChild($3); + $$->appendChild($4); + $$->appendChild(NNEW(n_EMPTY)); + + $$ = $1->appendChild($$); + } +| non_empty_parameter_list ',' optional_type '&' parameter { + $$ = NNEW(n_DECLARATION_PARAMETER); + $$->appendChild($3); + $$->appendChild(NTYPE($4, n_VARIABLE_REFERENCE)); + $4->appendChild($5); + $$->appendChild(NNEW(n_EMPTY)); + + $$ = $1->appendChild($$); + } +| non_empty_parameter_list ',' optional_type '&' + parameter '=' static_scalar { + $$ = NNEW(n_DECLARATION_PARAMETER); + $$->appendChild($3); + $$->appendChild(NTYPE($4, n_VARIABLE_REFERENCE)); + $4->appendChild($5); + $$->appendChild($7); + + $$ = $1->appendChild($$); + } +| non_empty_parameter_list ',' optional_type + parameter '=' static_scalar { + $$ = NNEW(n_DECLARATION_PARAMETER); + $$->appendChild($3); + $$->appendChild($4); + $$->appendChild($6); + + $$ = $1->appendChild($$); + } +; + +parameter: + T_ELLIPSIS T_VARIABLE { + $$ = NTYPE($1, n_UNPACK); + $$->appendChild(NTYPE($2, n_VARIABLE)); + } +| T_VARIABLE { + $$ = NTYPE($1, n_VARIABLE); + } +; + +optional_type: + %empty { + $$ = NNEW(n_EMPTY); + } +| type +| '?' type { + $$ = NNEW(n_NULLABLE_TYPE); + $$->appendChild($2); + } +; + +type: + fully_qualified_class_name { + $$ = $1; + } +| T_ARRAY { + $$ = NTYPE($1, n_TYPE_NAME); + } +| T_CALLABLE { + $$ = NTYPE($1, n_TYPE_NAME); + } +; + +return_type: + %empty { + $$ = NNEW(n_EMPTY); + } +| ':' optional_type { + $$ = NNEW(n_DECLARATION_RETURN); + $$->appendChild($2); + } +; + +function_call_parameter_list: + non_empty_function_call_parameter_list +| %empty { + $$ = NNEW(n_CALL_PARAMETER_LIST); + } +; + +non_empty_function_call_parameter_list: + argument { + $$ = NNEW(n_CALL_PARAMETER_LIST)->appendChild($1); + } +| non_empty_function_call_parameter_list ',' argument { + $$ = $1->appendChild($3); + } +; + +argument: + expr +| T_ELLIPSIS expr { + $$ = NNEW(n_UNPACK)->appendChild($1); + } +| '&' w_variable { + NTYPE($1, n_VARIABLE_REFERENCE); + $$ = $1->appendChild($2); + } +; + +global_var_list: + global_var_list ',' global_var { + $1->appendChild($3); + $$ = $1; + } +| global_var { + $$ = NNEW(n_GLOBAL_DECLARATION_LIST); + $$->appendChild($1); + } +; + +global_var: + T_VARIABLE { + $$ = NTYPE($1, n_VARIABLE); + } +| '$' r_variable { + $$ = NTYPE($1, n_VARIABLE_VARIABLE); + $$->appendChild($2); + } +| '$' '{' expr '}' { + $$ = NTYPE($1, n_VARIABLE_VARIABLE); + $$->appendChild($3); + } +; + +static_var_list: + static_var_list ',' T_VARIABLE { + NTYPE($3, n_VARIABLE); + $$ = NNEW(n_STATIC_DECLARATION); + $$->appendChild($3); + $$->appendChild(NNEW(n_EMPTY)); + + $$ = $1->appendChild($$); + } +| static_var_list ',' T_VARIABLE '=' static_scalar { + NTYPE($3, n_VARIABLE); + $$ = NNEW(n_STATIC_DECLARATION); + $$->appendChild($3); + $$->appendChild($5); + + $$ = $1->appendChild($$); + } +| T_VARIABLE { + NTYPE($1, n_VARIABLE); + $$ = NNEW(n_STATIC_DECLARATION); + $$->appendChild($1); + $$->appendChild(NNEW(n_EMPTY)); + + $$ = NNEW(n_STATIC_DECLARATION_LIST)->appendChild($$); + } +| T_VARIABLE '=' static_scalar { + NTYPE($1, n_VARIABLE); + $$ = NNEW(n_STATIC_DECLARATION); + $$->appendChild($1); + $$->appendChild($3); + + $$ = NNEW(n_STATIC_DECLARATION_LIST)->appendChild($$); + } +; + +class_statement_list: + class_statement_list class_statement { + $$ = $1->appendChild($2); + } +| %empty { + $$ = NNEW(n_STATEMENT_LIST); + } +; + +class_statement: + variable_modifiers class_variable_declaration ';' { + $$ = NNEW(n_CLASS_MEMBER_DECLARATION_LIST); + $$->appendChild($1); + $$->appendChildren($2); + + $$ = NNEW(n_STATEMENT)->appendChild($$); + NMORE($$, $3); + } +| class_constant_declaration ';' { + $$ = NNEW(n_STATEMENT)->appendChild($1); + NMORE($$, $2); + } +| trait_use_statement { + $$ = $1; + } +| method_modifiers function { + /* empty */ + } is_reference T_STRING '(' parameter_list ')' return_type method_body { + $$ = NNEW(n_METHOD_DECLARATION); + NMORE($$, $2); + $$->appendChild($1); + $$->appendChild($4); + $$->appendChild(NTYPE($5, n_STRING)); + $$->appendChild(NEXPAND($6, $7, $8)); + $$->appendChild(NNEW(n_EMPTY)); + $$->appendChild($9); + $$->appendChild($10); + + $$ = NNEW(n_STATEMENT)->appendChild($$); + } +; + +trait_use_statement: + T_USE trait_list trait_adaptations { + $$ = NTYPE($1, n_TRAIT_USE); + $$->appendChildren($2); + $$->appendChild($3); + } +; + +trait_list: + fully_qualified_class_name { + $$ = NNEW(n_TRAIT_USE_LIST)->appendChild($1); + } +| trait_list ',' fully_qualified_class_name { + $$ = $1->appendChild($3); + } +; + +trait_adaptations: + ';' { + $$ = NNEW(n_EMPTY); + } +| '{' trait_adaptation_list '}' { + $$ = NEXPAND($1, $2, $3); + } +; + +trait_adaptation_list: + %empty { + $$ = NNEW(n_TRAIT_ADAPTATION_LIST); + } +| non_empty_trait_adaptation_list { + $$ = $1; + } +; + +non_empty_trait_adaptation_list: + trait_adaptation_statement { + $$ = NNEW(n_TRAIT_ADAPTATION_LIST); + $$->appendChild($1); + } +| non_empty_trait_adaptation_list trait_adaptation_statement { + $1->appendChild($2); + $$ = $1; + } +; + +trait_adaptation_statement: + trait_precedence ';' { + $$ = NMORE($1, $2); + } +| trait_alias ';' { + $$ = NMORE($1, $2); + } +; + +trait_precedence: + trait_method_reference_fully_qualified T_INSTEADOF trait_reference_list { + $$ = NNEW(n_TRAIT_INSTEADOF); + $$->appendChild($1); + $$->appendChild($3); + } +; + +trait_reference_list: + fully_qualified_class_name { + $$ = NNEW(n_TRAIT_REFERENCE_LIST); + $$->appendChild($1); + } +| trait_reference_list ',' fully_qualified_class_name { + $1->appendChild($3); + $$ = $1; + } +; + +trait_method_reference: + T_STRING { + $$ = NNEW(n_TRAIT_METHOD_REFERENCE); + $$->appendChild(NTYPE($1, n_STRING)); + } +| trait_method_reference_fully_qualified { + $$ = $1; + } +; + +trait_method_reference_fully_qualified: + fully_qualified_class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { + NTYPE($2, n_TRAIT_METHOD_REFERENCE); + NEXPAND($1, $2, NTYPE($3, n_STRING)); + $$ = $2; + } +; + +trait_alias: + trait_method_reference T_AS trait_modifiers T_STRING { + $$ = NNEW(n_TRAIT_AS); + $$->appendChild($1); + $$->appendChild($3); + $$->appendChild(NTYPE($4, n_STRING)); + } +| trait_method_reference T_AS member_modifier { + $$ = NNEW(n_TRAIT_AS); + $$->appendChild($1); + $$->appendChild($3); + $$->appendChild(NNEW(n_EMPTY)); + } +; + +trait_modifiers: + %empty { + $$ = NNEW(n_EMPTY); + } +| member_modifier { + $$ = NNEW(n_METHOD_MODIFIER_LIST); + $$->appendChild(NTYPE($1, n_STRING)); + } +; + + +method_body: + ';' /* abstract method */ { + $$ = NNEW(n_EMPTY); + } +| '{' inner_statement_list '}' { + $$ = NEXPAND($1, $2, $3); + } +; + +variable_modifiers: + non_empty_member_modifiers +| T_VAR { + $$ = NNEW(n_CLASS_MEMBER_MODIFIER_LIST); + $$->appendChild(NTYPE($1, n_STRING)); + } +; + +method_modifiers: + %empty { + $$ = NNEW(n_METHOD_MODIFIER_LIST); + } +| non_empty_member_modifiers { + NTYPE($1, n_METHOD_MODIFIER_LIST); + $$ = $1; + } +; + +non_empty_member_modifiers: + member_modifier { + $$ = NNEW(n_CLASS_MEMBER_MODIFIER_LIST); + $$->appendChild(NTYPE($1, n_STRING)); + } +| non_empty_member_modifiers member_modifier { + $$ = $1->appendChild(NTYPE($2, n_STRING)); + } +; + +member_modifier: + T_PUBLIC +| T_PROTECTED +| T_PRIVATE +| T_STATIC +| T_ABSTRACT +| T_FINAL +; + +class_variable_declaration: + class_variable_declaration ',' T_VARIABLE { + $$ = NNEW(n_CLASS_MEMBER_DECLARATION); + $$->appendChild(NTYPE($3, n_VARIABLE)); + $$->appendChild(NNEW(n_EMPTY)); + + $$ = $1->appendChild($$); + } +| class_variable_declaration ',' T_VARIABLE '=' static_scalar { + $$ = NNEW(n_CLASS_MEMBER_DECLARATION); + $$->appendChild(NTYPE($3, n_VARIABLE)); + $$->appendChild($5); + + $$ = $1->appendChild($$); + } +| T_VARIABLE { + $$ = NNEW(n_CLASS_MEMBER_DECLARATION); + $$->appendChild(NTYPE($1, n_VARIABLE)); + $$->appendChild(NNEW(n_EMPTY)); + + $$ = NNEW(n_CLASS_MEMBER_DECLARATION_LIST)->appendChild($$); + } +| T_VARIABLE '=' static_scalar { + $$ = NNEW(n_CLASS_MEMBER_DECLARATION); + $$->appendChild(NTYPE($1, n_VARIABLE)); + $$->appendChild($3); + + $$ = NNEW(n_CLASS_MEMBER_DECLARATION_LIST)->appendChild($$); + } +; + +class_constant_declaration: + class_constant_declaration ',' T_STRING '=' static_scalar { + $$ = NNEW(n_CLASS_CONSTANT_DECLARATION); + $$->appendChild(NTYPE($3, n_STRING)); + $$->appendChild($5); + + $1->appendChild($$); + + $$ = $1; + } +| T_CONST T_STRING '=' static_scalar { + NTYPE($1, n_CLASS_CONSTANT_DECLARATION_LIST); + $$ = NNEW(n_CLASS_CONSTANT_DECLARATION); + $$->appendChild(NTYPE($2, n_STRING)); + $$->appendChild($4); + $1->appendChild($$); + + $$ = $1; + } +; + +echo_expr_list: + echo_expr_list ',' expr { + $1->appendChild($3); + } +| expr { + $$ = NNEW(n_ECHO_LIST); + $$->appendChild($1); + } +; + +for_expr: + %empty { + $$ = NNEW(n_EMPTY); + } +| non_empty_for_expr +; + + +non_empty_for_expr: + non_empty_for_expr ',' expr { + $1->appendChild($3); + } +| expr { + $$ = NNEW(n_EXPRESSION_LIST); + $$->appendChild($1); + } +; + +expr_without_variable: + T_LIST '(' assignment_list ')' '=' expr { + NTYPE($1, n_LIST); + $1->appendChild(NEXPAND($2, $3, $4)); + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($5, n_OPERATOR)); + $$->appendChild($6); + } +| variable '=' expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| variable '=' '&' variable { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + + NTYPE($3, n_VARIABLE_REFERENCE); + $3->appendChild($4); + + $$->appendChild($3); + } +| variable '=' '&' T_NEW class_name_reference ctor_arguments { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + + NTYPE($4, n_NEW); + $4->appendChild($5); + $4->appendChild($6); + + NTYPE($3, n_VARIABLE_REFERENCE); + $3->appendChild($4); + + $$->appendChild($3); + } +| T_CLONE expr { + $$ = NNEW(n_UNARY_PREFIX_EXPRESSION); + $$->appendChild(NTYPE($1, n_OPERATOR)); + $$->appendChild($2); + } +| variable T_PLUS_EQUAL expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| variable T_MINUS_EQUAL expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| variable T_MUL_EQUAL expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| variable T_DIV_EQUAL expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| variable T_CONCAT_EQUAL expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| variable T_MOD_EQUAL expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| variable T_AND_EQUAL expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| variable T_OR_EQUAL expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| variable T_XOR_EQUAL expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| variable T_SL_EQUAL expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| variable T_SR_EQUAL expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| rw_variable T_INC { + $$ = NNEW(n_UNARY_POSTFIX_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + } +| T_INC rw_variable { + $$ = NNEW(n_UNARY_PREFIX_EXPRESSION); + $$->appendChild(NTYPE($1, n_OPERATOR)); + $$->appendChild($2); + } +| rw_variable T_DEC { + $$ = NNEW(n_UNARY_POSTFIX_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + } +| T_DEC rw_variable { + $$ = NNEW(n_UNARY_PREFIX_EXPRESSION); + $$->appendChild(NTYPE($1, n_OPERATOR)); + $$->appendChild($2); + } +| expr T_BOOLEAN_OR expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr T_BOOLEAN_AND expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr T_LOGICAL_OR expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr T_LOGICAL_AND expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr T_LOGICAL_XOR expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr '|' expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr '&' expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr '^' expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr '.' expr { + + /* The concatenation operator generates n_CONCATENATION_LIST instead of + n_BINARY_EXPRESSION because we tend to run into stack depth issues in a + lot of real-world cases otherwise (e.g., in PHP and JSON decoders). */ + + if ($1->type == n_CONCATENATION_LIST && $3->type == n_CONCATENATION_LIST) { + $1->appendChild(NTYPE($2, n_OPERATOR)); + $1->appendChildren($3); + $$ = $1; + } else if ($1->type == n_CONCATENATION_LIST) { + $1->appendChild(NTYPE($2, n_OPERATOR)); + $1->appendChild($3); + $$ = $1; + } else if ($3->type == n_CONCATENATION_LIST) { + $$ = NNEW(n_CONCATENATION_LIST); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChildren($3); + } else { + $$ = NNEW(n_CONCATENATION_LIST); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } + } +| expr '+' expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr '-' expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr '*' expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr '/' expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr '%' expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr T_SL expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr T_SR expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| '+' expr %prec T_INC { + $$ = NNEW(n_UNARY_PREFIX_EXPRESSION); + $$->appendChild(NTYPE($1, n_OPERATOR)); + $$->appendChild($2); + } +| '-' expr %prec T_INC { + $$ = NNEW(n_UNARY_PREFIX_EXPRESSION); + $$->appendChild(NTYPE($1, n_OPERATOR)); + $$->appendChild($2); + } +| '!' expr { + $$ = NNEW(n_UNARY_PREFIX_EXPRESSION); + $$->appendChild(NTYPE($1, n_OPERATOR)); + $$->appendChild($2); + } +| '~' expr { + $$ = NNEW(n_UNARY_PREFIX_EXPRESSION); + $$->appendChild(NTYPE($1, n_OPERATOR)); + $$->appendChild($2); + } +| expr T_IS_IDENTICAL expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr T_IS_NOT_IDENTICAL expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr T_IS_EQUAL expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr T_IS_NOT_EQUAL expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr '<' expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr T_IS_SMALLER_OR_EQUAL expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr '>' expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr T_IS_GREATER_OR_EQUAL expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr T_SPACESHIP expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| expr T_INSTANCEOF class_name_reference { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| parenthesis_expr +| new_expr +| expr '?' expr ':' expr { + $$ = NNEW(n_TERNARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + $$->appendChild(NTYPE($4, n_OPERATOR)); + $$->appendChild($5); + } +| expr '?' ':' expr { + $$ = NNEW(n_TERNARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild(NNEW(n_EMPTY)); + $$->appendChild(NTYPE($3, n_OPERATOR)); + $$->appendChild($4); + } +| expr T_COALESCE expr { + $$ = NNEW(n_BINARY_EXPRESSION); + $$->appendChild($1); + $$->appendChild(NTYPE($2, n_OPERATOR)); + $$->appendChild($3); + } +| internal_functions_in_yacc +| T_INT_CAST expr { + $$ = NNEW(n_CAST_EXPRESSION); + $$->appendChild(NTYPE($1, n_CAST)); + $$->appendChild($2); + } +| T_DOUBLE_CAST expr { + $$ = NNEW(n_CAST_EXPRESSION); + $$->appendChild(NTYPE($1, n_CAST)); + $$->appendChild($2); + } +| T_STRING_CAST expr { + $$ = NNEW(n_CAST_EXPRESSION); + $$->appendChild(NTYPE($1, n_CAST)); + $$->appendChild($2); + } +| T_ARRAY_CAST expr { + $$ = NNEW(n_CAST_EXPRESSION); + $$->appendChild(NTYPE($1, n_CAST)); + $$->appendChild($2); + } +| T_OBJECT_CAST expr { + $$ = NNEW(n_CAST_EXPRESSION); + $$->appendChild(NTYPE($1, n_CAST)); + $$->appendChild($2); + } +| T_BOOL_CAST expr { + $$ = NNEW(n_CAST_EXPRESSION); + $$->appendChild(NTYPE($1, n_CAST)); + $$->appendChild($2); + } +| T_UNSET_CAST expr { + $$ = NNEW(n_CAST_EXPRESSION); + $$->appendChild(NTYPE($1, n_CAST)); + $$->appendChild($2); + } +| T_EXIT exit_expr { + $$ = NNEW(n_UNARY_PREFIX_EXPRESSION); + $$->appendChild(NTYPE($1, n_OPERATOR)); + $$->appendChild($2); + } +| '@' expr { + $$ = NNEW(n_UNARY_PREFIX_EXPRESSION); + $$->appendChild(NTYPE($1, n_OPERATOR)); + $$->appendChild($2); + } +| T_BACKTICKS_EXPR { + NTYPE($1, n_BACKTICKS_EXPRESSION); + $$ = $1; + } +| scalar +| combined_scalar_offset +| combined_scalar +| T_PRINT expr { + $$ = NNEW(n_UNARY_PREFIX_EXPRESSION); + $$->appendChild(NTYPE($1, n_OPERATOR)); + $$->appendChild($2); + } +| T_YIELD { + NTYPE($1, n_YIELD); + $1->appendChild(NNEW(n_EMPTY)); + $1->appendChild(NNEW(n_EMPTY)); + $$ = $1; + } +| function is_reference + '(' parameter_list ')' + lexical_vars return_type + '{' inner_statement_list '}' { + NSPAN($1, n_FUNCTION_DECLARATION, $9); + $1->appendChild(NNEW(n_EMPTY)); + $1->appendChild($2); + $1->appendChild(NNEW(n_EMPTY)); + $1->appendChild(NEXPAND($3, $4, $5)); + $1->appendChild($6); + $1->appendChild($7); + $1->appendChild(NEXPAND($8, $9, $10)); + + $$ = $1; + } +| T_STATIC function is_reference + '(' parameter_list ')' + lexical_vars return_type + '{' inner_statement_list '}' { + NSPAN($2, n_FUNCTION_DECLARATION, $10); + NMORE($2, $1); + + $$ = NNEW(n_FUNCTION_MODIFIER_LIST); + $$->appendChild(NTYPE($1, n_STRING)); + $2->appendChild($1); + + $2->appendChild(NNEW(n_EMPTY)); + $2->appendChild($3); + $2->appendChild(NNEW(n_EMPTY)); + $2->appendChild(NEXPAND($4, $5, $6)); + $2->appendChild($7); + $2->appendChild($8); + $2->appendChild(NEXPAND($9, $10, $11)); + + $$ = $2; + } +; + +yield_expr: + T_YIELD expr_without_variable { + NTYPE($1, n_YIELD); + $2->appendChild(NNEW(n_EMPTY)); + $1->appendChild($2); + $$ = $1; + } +| T_YIELD variable { + NTYPE($1, n_YIELD); + $2->appendChild(NNEW(n_EMPTY)); + $1->appendChild($2); + $$ = $1; + } +| T_YIELD expr T_DOUBLE_ARROW expr_without_variable { + NTYPE($1, n_YIELD); + $1->appendChild($2); + $1->appendChild($4); + $$ = $1; + } +| T_YIELD expr T_DOUBLE_ARROW variable { + NTYPE($1, n_YIELD); + $1->appendChild($2); + $1->appendChild($4); + $$ = $1; + } +; + +function: + T_FUNCTION +; + +lexical_vars: + %empty { + $$ = NNEW(n_EMPTY); + } +| T_USE '(' lexical_var_list ')' { + NTYPE($1, n_LEXICAL_VARIABLE_LIST); + $1->appendChildren($3); + $$ = $1; + } +; + +lexical_var_list: + lexical_var_list ',' T_VARIABLE { + $$ = $1->appendChild(NTYPE($3, n_VARIABLE)); + } +| lexical_var_list ',' '&' T_VARIABLE { + NTYPE($3, n_VARIABLE_REFERENCE); + $3->appendChild(NTYPE($4, n_VARIABLE)); + $$ = $1->appendChild($3); + } +| T_VARIABLE { + $$ = NNEW(n_LEXICAL_VARIABLE_LIST); + $$->appendChild(NTYPE($1, n_VARIABLE)); + } +| '&' T_VARIABLE { + NTYPE($1, n_VARIABLE_REFERENCE); + $1->appendChild(NTYPE($2, n_VARIABLE)); + $$ = NNEW(n_LEXICAL_VARIABLE_LIST); + $$->appendChild($1); + } +; + +function_call: + namespace_name '(' function_call_parameter_list ')' { + $$ = NNEW(n_FUNCTION_CALL); + $$->appendChild($1); + $$->appendChild(NEXPAND($2, $3, $4)); + } +| T_NAMESPACE T_NS_SEPARATOR namespace_name + '(' function_call_parameter_list ')' { + NMORE($3, $1); + $$ = NNEW(n_FUNCTION_CALL); + $$->appendChild($3); + $$->appendChild(NEXPAND($4, $5, $6)); + } +| T_NS_SEPARATOR namespace_name '(' function_call_parameter_list ')' { + NMORE($2, $1); + $$ = NNEW(n_FUNCTION_CALL); + $$->appendChild($2); + $$->appendChild(NEXPAND($3, $4, $5)); + } +| class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING + '(' function_call_parameter_list ')' { + $$ = NNEW(n_CLASS_STATIC_ACCESS); + $$->appendChild($1); + $$->appendChild(NTYPE($3, n_STRING)); + + $$ = NNEW(n_FUNCTION_CALL)->appendChild($$); + $$->appendChild(NEXPAND($4, $5, $6)); + } +| variable_class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING + '(' function_call_parameter_list ')' { + $$ = NNEW(n_CLASS_STATIC_ACCESS); + $$->appendChild($1); + $$->appendChild(NTYPE($3, n_STRING)); + + $$ = NNEW(n_FUNCTION_CALL)->appendChild($$); + $$->appendChild(NEXPAND($4, $5, $6)); + } +| variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects + '(' function_call_parameter_list ')' { + $$ = NNEW(n_CLASS_STATIC_ACCESS); + $$->appendChild($1); + $$->appendChild(NTYPE($3, n_STRING)); + + $$ = NNEW(n_FUNCTION_CALL)->appendChild($$); + $$->appendChild(NEXPAND($4, $5, $6)); + } +| class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects + '(' function_call_parameter_list ')' { + $$ = NNEW(n_CLASS_STATIC_ACCESS); + $$->appendChild($1); + $$->appendChild(NTYPE($3, n_STRING)); + + $$ = NNEW(n_FUNCTION_CALL)->appendChild($$); + $$->appendChild(NEXPAND($4, $5, $6)); + } +| variable_without_objects '(' function_call_parameter_list ')' { + $$ = NNEW(n_FUNCTION_CALL); + $$->appendChild($1); + $$->appendChild(NEXPAND($2, $3, $4)); + } +; + +class_name: + T_STATIC { + $$ = NTYPE($1, n_CLASS_NAME); + } +| namespace_name { + $$ = NTYPE($1, n_CLASS_NAME); + } +| T_NAMESPACE T_NS_SEPARATOR namespace_name { + NMORE($3, $1); + $$ = NTYPE($3, n_CLASS_NAME); + } +| T_NS_SEPARATOR namespace_name { + NMORE($2, $1); + $$ = NTYPE($2, n_CLASS_NAME); + } +; + +fully_qualified_class_name: + namespace_name { + $$ = NTYPE($1, n_CLASS_NAME); + } +| T_NAMESPACE T_NS_SEPARATOR namespace_name { + NMORE($3, $1); + $$ = NTYPE($3, n_CLASS_NAME); + } +| T_NS_SEPARATOR namespace_name { + NMORE($2, $1); + $$ = NTYPE($2, n_CLASS_NAME); + } +; + +class_name_reference: + class_name +| dynamic_class_name_reference +; + +dynamic_class_name_reference: + base_variable + T_OBJECT_OPERATOR + object_property + dynamic_class_name_variable_properties { + $$ = NNEW(n_OBJECT_PROPERTY_ACCESS); + $$->appendChild($1); + $$->appendChild($3); + for (xhpast::node_list_t::iterator ii = $4->children.begin(); + ii != $4->children.end(); + ++ii) { + + $$ = NNEW(n_OBJECT_PROPERTY_ACCESS)->appendChild($$); + $$->appendChild(*ii); + } + } +| base_variable +; + +dynamic_class_name_variable_properties: + dynamic_class_name_variable_properties dynamic_class_name_variable_property { + $$ = $1->appendChild($2); + } +| %empty { + $$ = NNEW(n_EMPTY); + } +; + +dynamic_class_name_variable_property: + T_OBJECT_OPERATOR object_property { + $$ = $2; + } +; + +exit_expr: + %empty { + $$ = NNEW(n_EMPTY); + } +| '(' ')' { + NSPAN($1, n_EMPTY, $2); + $$ = $1; + } +| '(' expr ')' { + NSPAN($1, n_PARENTHETICAL_EXPRESSION, $3); + $1->appendChild($2); + $$ = $1; + } +; + +ctor_arguments: + %empty { + $$ = NNEW(n_EMPTY); + } +| '(' function_call_parameter_list ')' { + $$ = NEXPAND($1, $2, $3); + } +; + +common_scalar: + T_LNUMBER { + $$ = NTYPE($1, n_NUMERIC_SCALAR); + } +| T_DNUMBER { + $$ = NTYPE($1, n_NUMERIC_SCALAR); + } +| T_CONSTANT_ENCAPSED_STRING { + $$ = NTYPE($1, n_STRING_SCALAR); + } +| T_LINE { + $$ = NTYPE($1, n_MAGIC_SCALAR); + } +| T_FILE { + $$ = NTYPE($1, n_MAGIC_SCALAR); + } +| T_DIR { + $$ = NTYPE($1, n_MAGIC_SCALAR); + } +| T_CLASS_C { + $$ = NTYPE($1, n_MAGIC_SCALAR); + } +| T_METHOD_C { + $$ = NTYPE($1, n_MAGIC_SCALAR); + } +| T_TRAIT_C { + $$ = NTYPE($1, n_MAGIC_SCALAR); + } +| T_FUNC_C { + $$ = NTYPE($1, n_MAGIC_SCALAR); + } +| T_NS_C { + $$ = NTYPE($1, n_MAGIC_SCALAR); + } +| T_HEREDOC { + $$ = NTYPE($1, n_HEREDOC); + } +; + +static_scalar: /* compile-time evaluated scalars */ + common_scalar +| namespace_name +| T_NAMESPACE T_NS_SEPARATOR namespace_name { + NMORE($3, $1); + $$ = $3; + } +| T_NS_SEPARATOR namespace_name { + NMORE($2, $1); + $$ = $2; + } +| '+' static_scalar { + $$ = NNEW(n_UNARY_PREFIX_EXPRESSION); + $$->appendChild(NTYPE($1, n_OPERATOR)); + $$->appendChild($2); + } +| '-' static_scalar { + $$ = NNEW(n_UNARY_PREFIX_EXPRESSION); + $$->appendChild(NTYPE($1, n_OPERATOR)); + $$->appendChild($2); + } +| T_ARRAY '(' static_array_pair_list ')' { + NTYPE($1, n_ARRAY_LITERAL); + $1->appendChild(NEXPAND($2, $3, $4)); + $$ = $1; + } +| '[' static_array_pair_list ']' { + NTYPE($1, n_ARRAY_LITERAL); + $1->appendChild(NEXPAND($1, $2, $3)); + $$ = $1; + } +| static_class_constant +; + +static_class_constant: + class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { + $$ = NNEW(n_CLASS_STATIC_ACCESS); + $$->appendChild($1); + $$->appendChild(NTYPE($3, n_STRING)); + } +; + +scalar: + T_STRING_VARNAME +| class_constant +| namespace_name +| T_NAMESPACE T_NS_SEPARATOR namespace_name { + $$ = NMORE($3, $1); + } +| T_NS_SEPARATOR namespace_name { + $$ = NMORE($2, $1); + } +| common_scalar +; + +static_array_pair_list: + %empty { + $$ = NNEW(n_ARRAY_VALUE_LIST); + } +| non_empty_static_array_pair_list possible_comma { + $$ = NMORE($1, $2); + } +; + +possible_comma: + %empty { + $$ = NNEW(n_EMPTY); + } +| ',' +; + +non_empty_static_array_pair_list: + non_empty_static_array_pair_list + ',' + static_scalar + T_DOUBLE_ARROW + static_scalar { + $$ = NNEW(n_ARRAY_VALUE); + $$->appendChild($3); + $$->appendChild($5); + + $$ = $1->appendChild($$); + } +| non_empty_static_array_pair_list ',' static_scalar { + $$ = NNEW(n_ARRAY_VALUE); + $$->appendChild(NNEW(n_EMPTY)); + $$->appendChild($3); + + $$ = $1->appendChild($$); + } +| static_scalar T_DOUBLE_ARROW static_scalar { + $$ = NNEW(n_ARRAY_VALUE); + $$->appendChild($1); + $$->appendChild($3); + + $$ = NNEW(n_ARRAY_VALUE_LIST)->appendChild($$); + } +| static_scalar { + $$ = NNEW(n_ARRAY_VALUE); + $$->appendChild(NNEW(n_EMPTY)); + $$->appendChild($1); + + $$ = NNEW(n_ARRAY_VALUE_LIST)->appendChild($$); + } +; + +expr: + r_variable +| expr_without_variable +; + +r_variable: + variable +; + +w_variable: + variable +; + +rw_variable: + variable +; + +variable: + base_variable_with_function_calls + T_OBJECT_OPERATOR + object_property method_or_not + variable_properties { + $$ = NNEW(n_OBJECT_PROPERTY_ACCESS); + $$->appendChild($1); + $$->appendChild($3); + + if ($4->type != n_EMPTY) { + $$ = NNEW(n_METHOD_CALL)->appendChild($$); + $$->appendChild($4); + } + + for (xhpast::node_list_t::iterator ii = $5->children.begin(); + ii != $5->children.end(); + ++ii) { + + if ((*ii)->type == n_CALL_PARAMETER_LIST) { + $$ = NNEW(n_METHOD_CALL)->appendChild($$); + $$->appendChild((*ii)); + } else { + $$ = NNEW(n_OBJECT_PROPERTY_ACCESS)->appendChild($$); + $$->appendChild((*ii)); + } + } + } +| base_variable_with_function_calls +; + +variable_properties: + variable_properties variable_property { + $$ = $1->appendChildren($2); + } +| %empty { + $$ = NNEW(n_EMPTY); + } +; + +variable_property: + T_OBJECT_OPERATOR object_property method_or_not { + $$ = NNEW(n_EMPTY); + $$->appendChild($2); + if ($3->type != n_EMPTY) { + $$->appendChild($3); + } + } +; + +array_method_dereference: + array_method_dereference '[' dim_offset ']' { + $$ = NNEW(n_INDEX_ACCESS); + $$->appendChild($1); + $$->appendChild($3); + NMORE($$, $4); + } +| method '[' dim_offset ']' { + $$ = NNEW(n_INDEX_ACCESS); + $$->appendChild($1); + $$->appendChild($3); + NMORE($$, $4); + } +; + +method: + '(' function_call_parameter_list ')' { + $$ = NEXPAND($1, $2, $3); + } +; + +method_or_not: + method +| array_method_dereference +| %empty { + $$ = NNEW(n_EMPTY); + } +; + +variable_without_objects: + reference_variable +| simple_indirect_reference reference_variable { + xhpast::Node *last = $1; + NMORE($1, $2); + while (last->firstChild() && + last->firstChild()->type == n_VARIABLE_VARIABLE) { + NMORE(last, $2); + last = last->firstChild(); + } + last->appendChild($2); + + $$ = $1; + } +; + +static_member: + class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { + $$ = NNEW(n_CLASS_STATIC_ACCESS); + $$->appendChild($1); + $$->appendChild($3); + } +| variable_class_name T_PAAMAYIM_NEKUDOTAYIM variable_without_objects { + $$ = NNEW(n_CLASS_STATIC_ACCESS); + $$->appendChild($1); + $$->appendChild($3); + } +; + +variable_class_name: + reference_variable +; + +array_function_dereference: + array_function_dereference '[' dim_offset ']' { + $$ = NNEW(n_INDEX_ACCESS); + $$->appendChild($1); + $$->appendChild($3); + NMORE($$, $4); + } +| function_call '[' dim_offset ']' { + $$ = NNEW(n_INDEX_ACCESS); + $$->appendChild($1); + $$->appendChild($3); + NMORE($$, $4); + } +; + +base_variable_with_function_calls: + base_variable +| array_function_dereference +| function_call +; + +base_variable: + reference_variable +| '(' new_expr ')' { + $$ = NEXPAND($1, $2, $3); + } +| simple_indirect_reference reference_variable { + xhpast::Node *last = $1; + NMORE($1, $2); + while (last->firstChild() && + last->firstChild()->type == n_VARIABLE_VARIABLE) { + NMORE(last, $2); + last = last->firstChild(); + } + last->appendChild($2); + + $$ = $1; + } +| static_member +; + +reference_variable: + reference_variable '[' dim_offset ']' { + $$ = NNEW(n_INDEX_ACCESS); + $$->appendChild($1); + $$->appendChild($3); + NMORE($$, $4); + } +| reference_variable '{' expr '}' { + $$ = NNEW(n_INDEX_ACCESS); + $$->appendChild($1); + $$->appendChild($3); + NMORE($$, $4); + } +| compound_variable +; + +compound_variable: + T_VARIABLE { + NTYPE($1, n_VARIABLE); + } +| '$' '{' expr '}' { + NSPAN($1, n_VARIABLE_EXPRESSION, $4); + $1->appendChild($3); + $$ = $1; + } +; + +dim_offset: + %empty { + $$ = NNEW(n_EMPTY); + } +| expr { + $$ = $1; + } +; + +object_property: + object_dim_list +| variable_without_objects +; + +object_dim_list: + object_dim_list '[' dim_offset ']' { + $$ = NNEW(n_INDEX_ACCESS); + $$->appendChild($1); + $$->appendChild($3); + NMORE($$, $4); + } +| object_dim_list '{' expr '}' { + $$ = NNEW(n_INDEX_ACCESS); + $$->appendChild($1); + $$->appendChild($3); + NMORE($$, $4); + } +| variable_name +; + +variable_name: + T_STRING { + NTYPE($1, n_STRING); + $$ = $1; + } +| '{' expr '}' { + $$ = NEXPAND($1, $2, $3); + } +; + +simple_indirect_reference: + '$' { + $$ = NTYPE($1, n_VARIABLE_VARIABLE); + } +| simple_indirect_reference '$' { + $2 = NTYPE($2, n_VARIABLE_VARIABLE); + + xhpast::Node *last = $1; + while (last->firstChild() && + last->firstChild()->type == n_VARIABLE_VARIABLE) { + last = last->firstChild(); + } + last->appendChild($2); + + $$ = $1; + } +; + +assignment_list: + assignment_list ',' assignment_list_element { + $$ = $1->appendChild($3); + } +| assignment_list_element { + $$ = NNEW(n_ASSIGNMENT_LIST); + $$->appendChild($1); + } +; + +assignment_list_element: + variable +| T_LIST '(' assignment_list ')' { + $$ = NNEW(n_LIST); + $$->appendChild(NEXPAND($2, $3, $4)); + } +| %empty { + $$ = NNEW(n_EMPTY); + } +; + +array_pair_list: + %empty { + $$ = NNEW(n_ARRAY_VALUE_LIST); + } +| non_empty_array_pair_list possible_comma { + $$ = NMORE($1, $2); + } +; + +non_empty_array_pair_list: + non_empty_array_pair_list ',' expr T_DOUBLE_ARROW expr { + $$ = NNEW(n_ARRAY_VALUE); + $$->appendChild($3); + $$->appendChild($5); + + $$ = $1->appendChild($$); + } +| non_empty_array_pair_list ',' expr { + $$ = NNEW(n_ARRAY_VALUE); + $$->appendChild(NNEW(n_EMPTY)); + $$->appendChild($3); + + $$ = $1->appendChild($$); + } +| expr T_DOUBLE_ARROW expr { + $$ = NNEW(n_ARRAY_VALUE); + $$->appendChild($1); + $$->appendChild($3); + + $$ = NNEW(n_ARRAY_VALUE_LIST)->appendChild($$); + } +| expr { + $$ = NNEW(n_ARRAY_VALUE); + $$->appendChild(NNEW(n_EMPTY)); + $$->appendChild($1); + + $$ = NNEW(n_ARRAY_VALUE_LIST)->appendChild($$); + } +| non_empty_array_pair_list ',' expr T_DOUBLE_ARROW '&' w_variable { + $$ = NNEW(n_ARRAY_VALUE); + $$->appendChild($3); + $$->appendChild(NTYPE($5, n_VARIABLE_REFERENCE)->appendChild($6)); + + $$ = $1->appendChild($$); + } +| non_empty_array_pair_list ',' '&' w_variable { + $$ = NNEW(n_ARRAY_VALUE); + $$->appendChild(NNEW(n_EMPTY)); + $$->appendChild(NTYPE($3, n_VARIABLE_REFERENCE)->appendChild($4)); + + $$ = $1->appendChild($$); + } +| expr T_DOUBLE_ARROW '&' w_variable { + $$ = NNEW(n_ARRAY_VALUE); + $$->appendChild($1); + $$->appendChild(NTYPE($3, n_VARIABLE_REFERENCE)->appendChild($4)); + + $$ = NNEW(n_ARRAY_VALUE_LIST)->appendChild($$); + } +| '&' w_variable { + $$ = NNEW(n_ARRAY_VALUE); + $$->appendChild(NNEW(n_EMPTY)); + $$->appendChild(NTYPE($1, n_VARIABLE_REFERENCE)->appendChild($2)); + + $$ = NNEW(n_ARRAY_VALUE_LIST)->appendChild($$); + } +; + +internal_functions_in_yacc: + T_ISSET '(' isset_variables ')' { + NTYPE($1, n_SYMBOL_NAME); + + NSPAN($2, n_CALL_PARAMETER_LIST, $4); + $2->appendChildren($3); + + $$ = NNEW(n_FUNCTION_CALL); + $$->appendChild($1); + $$->appendChild($2); + } +| T_EMPTY '(' variable ')' { + NTYPE($1, n_SYMBOL_NAME); + + NSPAN($2, n_CALL_PARAMETER_LIST, $4); + $2->appendChild($3); + + $$ = NNEW(n_FUNCTION_CALL); + $$->appendChild($1); + $$->appendChild($2); + } +| T_INCLUDE expr { + $$ = NTYPE($1, n_INCLUDE_FILE)->appendChild($2); + } +| T_INCLUDE_ONCE expr { + $$ = NTYPE($1, n_INCLUDE_FILE)->appendChild($2); + } +| T_EVAL '(' expr ')' { + NTYPE($1, n_SYMBOL_NAME); + + NSPAN($2, n_CALL_PARAMETER_LIST, $4); + $2->appendChild($3); + + $$ = NNEW(n_FUNCTION_CALL); + $$->appendChild($1); + $$->appendChild($2); + } +| T_REQUIRE expr { + $$ = NTYPE($1, n_INCLUDE_FILE)->appendChild($2); + } +| T_REQUIRE_ONCE expr { + $$ = NTYPE($1, n_INCLUDE_FILE)->appendChild($2); + } +; + +isset_variables: + variable { + $$ = NNEW(n_EMPTY); + $$->appendChild($1); + } +| isset_variables ',' variable { + $$ = $1->appendChild($3); + } +; + +parenthesis_expr: + '(' expr ')' { + NSPAN($1, n_PARENTHETICAL_EXPRESSION, $3); + $1->appendChild($2); + $$ = $1; + } +| '(' yield_expr ')' { + $$ = NEXPAND($1, $2, $3); + } +; + +combined_scalar_offset: + combined_scalar '[' dim_offset ']' { + $$ = NNEW(n_INDEX_ACCESS); + $$->appendChild($1); + $$->appendChild($3); + NMORE($$, $4); + } +| combined_scalar_offset '[' dim_offset ']' { + $$ = NNEW(n_INDEX_ACCESS); + $$->appendChild($1); + $$->appendChild($3); + NMORE($$, $4); + } +| T_CONSTANT_ENCAPSED_STRING '[' dim_offset ']' { + $$ = NNEW(n_INDEX_ACCESS); + $$->appendChild(NTYPE($1, n_STRING_SCALAR)); + $$->appendChild($3); + NMORE($$, $4); + } +| class_constant '[' dim_offset ']' { + $$ = NNEW(n_INDEX_ACCESS); + $$->appendChild($1); + $$->appendChild($3); + NMORE($$, $4); + } +| T_STRING '[' dim_offset ']' { + $$ = NNEW(n_INDEX_ACCESS); + $$->appendChild(NTYPE($1, n_STRING)); + $$->appendChild($3); + NMORE($$, $4); + } +; + +combined_scalar: + T_ARRAY '(' array_pair_list ')' { + NTYPE($1, n_ARRAY_LITERAL); + $1->appendChild(NEXPAND($2, $3, $4)); + $$ = $1; + } +| '[' array_pair_list ']' { + NTYPE($1, n_ARRAY_LITERAL); + $1->appendChild(NEXPAND($1, $2, $3)); + $$ = $1; + } +; + +new_expr: + T_NEW class_name_reference ctor_arguments { + NTYPE($1, n_NEW); + $1->appendChild($2); + $1->appendChild($3); + $$ = $1; + } +; + +class_constant: + class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { + $$ = NNEW(n_CLASS_STATIC_ACCESS); + $$->appendChild($1); + $$->appendChild(NTYPE($3, n_STRING)); + } +| variable_class_name T_PAAMAYIM_NEKUDOTAYIM T_STRING { + $$ = NNEW(n_CLASS_STATIC_ACCESS); + $$->appendChild($1); + $$->appendChild(NTYPE($3, n_STRING)); + } +; + +%% + +const char* yytokname(int tok) { + if (tok < 255) { + return NULL; + } + return yytname[YYTRANSLATE(tok)]; +} diff --git a/support/xhpast/parser.yacc.hpp b/support/xhpast/parser.yacc.hpp new file mode 100644 --- /dev/null +++ b/support/xhpast/parser.yacc.hpp @@ -0,0 +1,202 @@ +/* A Bison parser, made by GNU Bison 3.0.4. */ + +/* Bison interface for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +#ifndef YY_XHPAST_PARSER_YACC_HPP_INCLUDED +# define YY_XHPAST_PARSER_YACC_HPP_INCLUDED +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif +#if YYDEBUG +extern int xhpastdebug; +#endif + +/* Token type. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + enum yytokentype + { + T_INCLUDE = 258, + T_INCLUDE_ONCE = 259, + T_EVAL = 260, + T_REQUIRE = 261, + T_REQUIRE_ONCE = 262, + T_LOGICAL_OR = 263, + T_LOGICAL_XOR = 264, + T_LOGICAL_AND = 265, + T_PRINT = 266, + T_PLUS_EQUAL = 267, + T_MINUS_EQUAL = 268, + T_MUL_EQUAL = 269, + T_DIV_EQUAL = 270, + T_CONCAT_EQUAL = 271, + T_MOD_EQUAL = 272, + T_AND_EQUAL = 273, + T_OR_EQUAL = 274, + T_XOR_EQUAL = 275, + T_SL_EQUAL = 276, + T_SR_EQUAL = 277, + T_COALESCE = 278, + T_BOOLEAN_OR = 279, + T_BOOLEAN_AND = 280, + T_IS_EQUAL = 281, + T_IS_NOT_EQUAL = 282, + T_IS_IDENTICAL = 283, + T_IS_NOT_IDENTICAL = 284, + T_SPACESHIP = 285, + T_IS_SMALLER_OR_EQUAL = 286, + T_IS_GREATER_OR_EQUAL = 287, + T_SL = 288, + T_SR = 289, + T_INSTANCEOF = 290, + T_INC = 291, + T_DEC = 292, + T_INT_CAST = 293, + T_DOUBLE_CAST = 294, + T_STRING_CAST = 295, + T_UNICODE_CAST = 296, + T_BINARY_CAST = 297, + T_ARRAY_CAST = 298, + T_OBJECT_CAST = 299, + T_BOOL_CAST = 300, + T_UNSET_CAST = 301, + T_NEW = 302, + T_CLONE = 303, + T_EXIT = 304, + T_IF = 305, + T_ELSEIF = 306, + T_ELSE = 307, + T_ENDIF = 308, + T_LNUMBER = 309, + T_DNUMBER = 310, + T_STRING = 311, + T_STRING_VARNAME = 312, + T_VARIABLE = 313, + T_NUM_STRING = 314, + T_INLINE_HTML = 315, + T_CHARACTER = 316, + T_BAD_CHARACTER = 317, + T_ENCAPSED_AND_WHITESPACE = 318, + T_CONSTANT_ENCAPSED_STRING = 319, + T_BACKTICKS_EXPR = 320, + T_ECHO = 321, + T_DO = 322, + T_WHILE = 323, + T_ENDWHILE = 324, + T_FOR = 325, + T_ENDFOR = 326, + T_FOREACH = 327, + T_ENDFOREACH = 328, + T_DECLARE = 329, + T_ENDDECLARE = 330, + T_AS = 331, + T_SWITCH = 332, + T_ENDSWITCH = 333, + T_CASE = 334, + T_DEFAULT = 335, + T_BREAK = 336, + T_CONTINUE = 337, + T_GOTO = 338, + T_FUNCTION = 339, + T_CONST = 340, + T_RETURN = 341, + T_TRY = 342, + T_CATCH = 343, + T_THROW = 344, + T_USE = 345, + T_GLOBAL = 346, + T_STATIC = 347, + T_ABSTRACT = 348, + T_FINAL = 349, + T_PRIVATE = 350, + T_PROTECTED = 351, + T_PUBLIC = 352, + T_VAR = 353, + T_UNSET = 354, + T_ISSET = 355, + T_EMPTY = 356, + T_HALT_COMPILER = 357, + T_CLASS = 358, + T_INTERFACE = 359, + T_EXTENDS = 360, + T_IMPLEMENTS = 361, + T_OBJECT_OPERATOR = 362, + T_DOUBLE_ARROW = 363, + T_LIST = 364, + T_ARRAY = 365, + T_CLASS_C = 366, + T_METHOD_C = 367, + T_FUNC_C = 368, + T_LINE = 369, + T_FILE = 370, + T_COMMENT = 371, + T_DOC_COMMENT = 372, + T_OPEN_TAG = 373, + T_OPEN_TAG_WITH_ECHO = 374, + T_OPEN_TAG_FAKE = 375, + T_CLOSE_TAG = 376, + T_WHITESPACE = 377, + T_START_HEREDOC = 378, + T_END_HEREDOC = 379, + T_HEREDOC = 380, + T_DOLLAR_OPEN_CURLY_BRACES = 381, + T_CURLY_OPEN = 382, + T_PAAMAYIM_NEKUDOTAYIM = 383, + T_BINARY_DOUBLE = 384, + T_BINARY_HEREDOC = 385, + T_NAMESPACE = 386, + T_NS_C = 387, + T_DIR = 388, + T_NS_SEPARATOR = 389, + T_INSTEADOF = 390, + T_CALLABLE = 391, + T_TRAIT = 392, + T_TRAIT_C = 393, + T_YIELD = 394, + T_FINALLY = 395, + T_ELLIPSIS = 396 + }; +#endif + +/* Value type. */ +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef int YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 +#endif + + + +int xhpastparse (void* yyscanner, xhpast::Node** root); + +#endif /* !YY_XHPAST_PARSER_YACC_HPP_INCLUDED */ +/* @generated */ diff --git a/support/xhpast/parser.yacc.cpp b/support/xhpast/parser.yacc.cpp new file mode 100644 --- /dev/null +++ b/support/xhpast/parser.yacc.cpp @@ -0,0 +1,7586 @@ +/* A Bison parser, made by GNU Bison 3.0.4. */ + +/* Bison implementation for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "3.0.4" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 1 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + + +/* Substitute the variable and function names. */ +#define yyparse xhpastparse +#define yylex xhpastlex +#define yyerror xhpasterror +#define yydebug xhpastdebug +#define yynerrs xhpastnerrs + + +/* Copy the first part of user declarations. */ +#line 1 "parser.y" /* yacc.c:339 */ + +/* + * If you modify this grammar, please update the version number in + * ./xhpast.cpp and libphutil/src/parser/xhpast/bin/xhpast_parse.php + */ + +#include "ast.hpp" +#include "node_names.hpp" +// PHP's if/else rules use right reduction rather than left reduction which +// means while parsing nested if/else's the stack grows until it the last +// statement is read. This is annoying, particularly because of a quirk in +// bison. +// http://www.gnu.org/software/bison/manual/html_node/Memory-Management.html +// Apparently if you compile a bison parser with g++ it can no longer grow +// the stack. The work around is to just make your initial stack ridiculously +// large. Unfortunately that increases memory usage while parsing which is +// dumb. Anyway, putting a TODO here to fix PHP's if/else grammar. +#define YYINITDEPTH 500 +#line 21 "parser.y" /* yacc.c:339 */ + +#undef yyextra +#define yyextra static_cast(xhpastget_extra(yyscanner)) +#undef yylineno +#define yylineno yyextra->first_lineno +#define push_state(s) xhp_new_push_state(s, (struct yyguts_t*) yyscanner) +#define pop_state() xhp_new_pop_state((struct yyguts_t*) yyscanner) +#define set_state(s) xhp_set_state(s, (struct yyguts_t*) yyscanner) + +#define NNEW(t) \ + (new xhpast::Node(t)) + +#define NTYPE(n, type) \ + ((n)->setType(type)) + +#define NMORE(n, end) \ + ((n)->expandRange(end)) + +#define NSPAN(n, type, end) \ + (NMORE(NTYPE((n), type), end)) + +#define NEXPAND(l, n, r) \ + ((n)->expandRange(l)->expandRange(r)) + +using namespace std; + +static void yyerror(void* yyscanner, void* _, const char* error) { + if (yyextra->terminated) { + return; + } + yyextra->terminated = true; + yyextra->error = error; +} + + +#line 127 "parser.yacc.cpp" /* yacc.c:339 */ + +# ifndef YY_NULLPTR +# if defined __cplusplus && 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif +# endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 1 +#endif + +/* In a future release of Bison, this section will be replaced + by #include "parser.yacc.hpp". */ +#ifndef YY_XHPAST_PARSER_YACC_HPP_INCLUDED +# define YY_XHPAST_PARSER_YACC_HPP_INCLUDED +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif +#if YYDEBUG +extern int xhpastdebug; +#endif + +/* Token type. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + enum yytokentype + { + T_INCLUDE = 258, + T_INCLUDE_ONCE = 259, + T_EVAL = 260, + T_REQUIRE = 261, + T_REQUIRE_ONCE = 262, + T_LOGICAL_OR = 263, + T_LOGICAL_XOR = 264, + T_LOGICAL_AND = 265, + T_PRINT = 266, + T_PLUS_EQUAL = 267, + T_MINUS_EQUAL = 268, + T_MUL_EQUAL = 269, + T_DIV_EQUAL = 270, + T_CONCAT_EQUAL = 271, + T_MOD_EQUAL = 272, + T_AND_EQUAL = 273, + T_OR_EQUAL = 274, + T_XOR_EQUAL = 275, + T_SL_EQUAL = 276, + T_SR_EQUAL = 277, + T_COALESCE = 278, + T_BOOLEAN_OR = 279, + T_BOOLEAN_AND = 280, + T_IS_EQUAL = 281, + T_IS_NOT_EQUAL = 282, + T_IS_IDENTICAL = 283, + T_IS_NOT_IDENTICAL = 284, + T_SPACESHIP = 285, + T_IS_SMALLER_OR_EQUAL = 286, + T_IS_GREATER_OR_EQUAL = 287, + T_SL = 288, + T_SR = 289, + T_INSTANCEOF = 290, + T_INC = 291, + T_DEC = 292, + T_INT_CAST = 293, + T_DOUBLE_CAST = 294, + T_STRING_CAST = 295, + T_UNICODE_CAST = 296, + T_BINARY_CAST = 297, + T_ARRAY_CAST = 298, + T_OBJECT_CAST = 299, + T_BOOL_CAST = 300, + T_UNSET_CAST = 301, + T_NEW = 302, + T_CLONE = 303, + T_EXIT = 304, + T_IF = 305, + T_ELSEIF = 306, + T_ELSE = 307, + T_ENDIF = 308, + T_LNUMBER = 309, + T_DNUMBER = 310, + T_STRING = 311, + T_STRING_VARNAME = 312, + T_VARIABLE = 313, + T_NUM_STRING = 314, + T_INLINE_HTML = 315, + T_CHARACTER = 316, + T_BAD_CHARACTER = 317, + T_ENCAPSED_AND_WHITESPACE = 318, + T_CONSTANT_ENCAPSED_STRING = 319, + T_BACKTICKS_EXPR = 320, + T_ECHO = 321, + T_DO = 322, + T_WHILE = 323, + T_ENDWHILE = 324, + T_FOR = 325, + T_ENDFOR = 326, + T_FOREACH = 327, + T_ENDFOREACH = 328, + T_DECLARE = 329, + T_ENDDECLARE = 330, + T_AS = 331, + T_SWITCH = 332, + T_ENDSWITCH = 333, + T_CASE = 334, + T_DEFAULT = 335, + T_BREAK = 336, + T_CONTINUE = 337, + T_GOTO = 338, + T_FUNCTION = 339, + T_CONST = 340, + T_RETURN = 341, + T_TRY = 342, + T_CATCH = 343, + T_THROW = 344, + T_USE = 345, + T_GLOBAL = 346, + T_STATIC = 347, + T_ABSTRACT = 348, + T_FINAL = 349, + T_PRIVATE = 350, + T_PROTECTED = 351, + T_PUBLIC = 352, + T_VAR = 353, + T_UNSET = 354, + T_ISSET = 355, + T_EMPTY = 356, + T_HALT_COMPILER = 357, + T_CLASS = 358, + T_INTERFACE = 359, + T_EXTENDS = 360, + T_IMPLEMENTS = 361, + T_OBJECT_OPERATOR = 362, + T_DOUBLE_ARROW = 363, + T_LIST = 364, + T_ARRAY = 365, + T_CLASS_C = 366, + T_METHOD_C = 367, + T_FUNC_C = 368, + T_LINE = 369, + T_FILE = 370, + T_COMMENT = 371, + T_DOC_COMMENT = 372, + T_OPEN_TAG = 373, + T_OPEN_TAG_WITH_ECHO = 374, + T_OPEN_TAG_FAKE = 375, + T_CLOSE_TAG = 376, + T_WHITESPACE = 377, + T_START_HEREDOC = 378, + T_END_HEREDOC = 379, + T_HEREDOC = 380, + T_DOLLAR_OPEN_CURLY_BRACES = 381, + T_CURLY_OPEN = 382, + T_PAAMAYIM_NEKUDOTAYIM = 383, + T_BINARY_DOUBLE = 384, + T_BINARY_HEREDOC = 385, + T_NAMESPACE = 386, + T_NS_C = 387, + T_DIR = 388, + T_NS_SEPARATOR = 389, + T_INSTEADOF = 390, + T_CALLABLE = 391, + T_TRAIT = 392, + T_TRAIT_C = 393, + T_YIELD = 394, + T_FINALLY = 395, + T_ELLIPSIS = 396 + }; +#endif + +/* Value type. */ +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef int YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 +#endif + + + +int xhpastparse (void* yyscanner, xhpast::Node** root); + +#endif /* !YY_XHPAST_PARSER_YACC_HPP_INCLUDED */ + +/* Copy the second part of user declarations. */ + +#line 319 "parser.yacc.cpp" /* yacc.c:358 */ + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#else +typedef signed char yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(Msgid) dgettext ("bison-runtime", Msgid) +# endif +# endif +# ifndef YY_ +# define YY_(Msgid) Msgid +# endif +#endif + +#ifndef YY_ATTRIBUTE +# if (defined __GNUC__ \ + && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ + || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C +# define YY_ATTRIBUTE(Spec) __attribute__(Spec) +# else +# define YY_ATTRIBUTE(Spec) /* empty */ +# endif +#endif + +#ifndef YY_ATTRIBUTE_PURE +# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) +#endif + +#if !defined _Noreturn \ + && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) +# if defined _MSC_VER && 1200 <= _MSC_VER +# define _Noreturn __declspec (noreturn) +# else +# define _Noreturn YY_ATTRIBUTE ((__noreturn__)) +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(E) ((void) (E)) +#else +# define YYUSE(E) /* empty */ +#endif + +#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") +#else +# define YY_INITIAL_VALUE(Value) Value +#endif +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS +# include /* INFRINGES ON USER NAME SPACE */ + /* Use EXIT_SUCCESS as a witness for stdlib.h. */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's 'empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined EXIT_SUCCESS +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined EXIT_SUCCESS +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss_alloc; + YYSTYPE yyvs_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +# define YYCOPY_NEEDED 1 + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from SRC to DST. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(Dst, Src, Count) \ + __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) +# else +# define YYCOPY(Dst, Src, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (Dst)[yyi] = (Src)[yyi]; \ + } \ + while (0) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 3 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 7552 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 168 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 135 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 442 +/* YYNSTATES -- Number of states. */ +#define YYNSTATES 908 + +/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned + by yylex, with out-of-bounds checking. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 396 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, without out-of-bounds checking. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 50, 2, 2, 166, 49, 32, 2, + 161, 162, 47, 44, 8, 45, 46, 48, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 26, 163, + 38, 13, 40, 25, 64, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 65, 2, 167, 31, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 164, 30, 165, 52, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 9, 10, 11, 12, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 27, 28, + 29, 33, 34, 35, 36, 37, 39, 41, 42, 43, + 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160 +}; + +#if YYDEBUG + /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +static const yytype_uint16 yyrline[] = +{ + 0, 210, 210, 216, 219, 225, 228, 234, 235, 236, + 237, 242, 249, 255, 263, 268, 275, 278, 285, 290, + 296, 302, 312, 319, 329, 332, 338, 339, 340, 341, + 349, 350, 356, 359, 362, 368, 371, 401, 420, 427, + 435, 448, 455, 462, 469, 476, 483, 490, 497, 504, + 509, 514, 519, 523, 527, 531, 537, 555, 572, 578, + 582, 591, 600, 608, 619, 623, 629, 641, 644, 648, + 657, 661, 668, 672, 676, 680, 683, 689, 705, 717, + 732, 736, 743, 750, 757, 760, 766, 770, 773, 781, + 784, 792, 795, 801, 804, 810, 811, 819, 820, 828, + 829, 837, 838, 846, 852, 863, 866, 876, 881, 893, + 896, 904, 914, 915, 919, 920, 928, 931, 941, 944, + 954, 957, 965, 968, 976, 977, 983, 991, 1000, 1009, + 1017, 1025, 1034, 1044, 1056, 1060, 1066, 1069, 1070, 1077, + 1080, 1083, 1089, 1092, 1099, 1100, 1106, 1109, 1115, 1116, + 1119, 1126, 1130, 1137, 1140, 1144, 1151, 1159, 1167, 1175, + 1186, 1189, 1195, 1203, 1207, 1210, 1210, 1228, 1236, 1239, + 1245, 1248, 1254, 1257, 1263, 1267, 1274, 1277, 1283, 1291, + 1295, 1302, 1306, 1312, 1320, 1326, 1335, 1338, 1346, 1349, + 1355, 1356, 1363, 1366, 1373, 1377, 1383, 1384, 1385, 1386, + 1387, 1388, 1392, 1399, 1406, 1413, 1423, 1432, 1444, 1447, + 1454, 1457, 1462, 1465, 1472, 1480, 1486, 1496, 1510, 1515, + 1521, 1527, 1533, 1539, 1545, 1551, 1557, 1563, 1569, 1575, + 1581, 1586, 1591, 1596, 1601, 1607, 1613, 1619, 1625, 1631, + 1637, 1643, 1649, 1675, 1681, 1687, 1693, 1699, 1705, 1711, + 1717, 1722, 1727, 1732, 1737, 1743, 1749, 1755, 1761, 1767, + 1773, 1779, 1785, 1791, 1797, 1798, 1799, 1807, 1815, 1821, + 1822, 1827, 1832, 1837, 1842, 1847, 1852, 1857, 1862, 1867, + 1871, 1872, 1873, 1874, 1879, 1885, 1900, 1924, 1930, 1936, + 1942, 1951, 1955, 1958, 1966, 1969, 1974, 1978, 1987, 1992, + 1999, 2005, 2014, 2023, 2032, 2041, 2049, 2052, 2055, 2059, + 2066, 2069, 2073, 2080, 2081, 2085, 2100, 2104, 2107, 2113, + 2119, 2122, 2126, 2134, 2137, 2143, 2146, 2149, 2152, 2155, + 2158, 2161, 2164, 2167, 2170, 2173, 2176, 2182, 2183, 2184, + 2188, 2192, 2197, 2202, 2207, 2212, 2216, 2224, 2225, 2226, + 2227, 2230, 2233, 2237, 2240, 2246, 2249, 2253, 2264, 2271, + 2278, 2288, 2289, 2293, 2297, 2301, 2305, 2331, 2335, 2338, + 2344, 2354, 2360, 2369, 2375, 2376, 2377, 2383, 2384, 2399, + 2404, 2412, 2416, 2422, 2431, 2432, 2433, 2437, 2438, 2441, + 2453, 2457, 2463, 2469, 2473, 2476, 2484, 2487, 2493, 2494, + 2498, 2504, 2510, 2514, 2518, 2524, 2527, 2542, 2545, 2552, + 2553, 2557, 2563, 2566, 2572, 2579, 2586, 2593, 2600, 2607, + 2614, 2621, 2631, 2641, 2651, 2654, 2657, 2667, 2670, 2676, + 2680, 2686, 2691, 2697, 2703, 2709, 2715, 2721, 2730, 2735, + 2743, 2752, 2757 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || 1 +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "T_INCLUDE", "T_INCLUDE_ONCE", "T_EVAL", + "T_REQUIRE", "T_REQUIRE_ONCE", "','", "T_LOGICAL_OR", "T_LOGICAL_XOR", + "T_LOGICAL_AND", "T_PRINT", "'='", "T_PLUS_EQUAL", "T_MINUS_EQUAL", + "T_MUL_EQUAL", "T_DIV_EQUAL", "T_CONCAT_EQUAL", "T_MOD_EQUAL", + "T_AND_EQUAL", "T_OR_EQUAL", "T_XOR_EQUAL", "T_SL_EQUAL", "T_SR_EQUAL", + "'?'", "':'", "T_COALESCE", "T_BOOLEAN_OR", "T_BOOLEAN_AND", "'|'", + "'^'", "'&'", "T_IS_EQUAL", "T_IS_NOT_EQUAL", "T_IS_IDENTICAL", + "T_IS_NOT_IDENTICAL", "T_SPACESHIP", "'<'", "T_IS_SMALLER_OR_EQUAL", + "'>'", "T_IS_GREATER_OR_EQUAL", "T_SL", "T_SR", "'+'", "'-'", "'.'", + "'*'", "'/'", "'%'", "'!'", "T_INSTANCEOF", "'~'", "T_INC", "T_DEC", + "T_INT_CAST", "T_DOUBLE_CAST", "T_STRING_CAST", "T_UNICODE_CAST", + "T_BINARY_CAST", "T_ARRAY_CAST", "T_OBJECT_CAST", "T_BOOL_CAST", + "T_UNSET_CAST", "'@'", "'['", "T_NEW", "T_CLONE", "T_EXIT", "T_IF", + "T_ELSEIF", "T_ELSE", "T_ENDIF", "T_LNUMBER", "T_DNUMBER", "T_STRING", + "T_STRING_VARNAME", "T_VARIABLE", "T_NUM_STRING", "T_INLINE_HTML", + "T_CHARACTER", "T_BAD_CHARACTER", "T_ENCAPSED_AND_WHITESPACE", + "T_CONSTANT_ENCAPSED_STRING", "T_BACKTICKS_EXPR", "T_ECHO", "T_DO", + "T_WHILE", "T_ENDWHILE", "T_FOR", "T_ENDFOR", "T_FOREACH", + "T_ENDFOREACH", "T_DECLARE", "T_ENDDECLARE", "T_AS", "T_SWITCH", + "T_ENDSWITCH", "T_CASE", "T_DEFAULT", "T_BREAK", "T_CONTINUE", "T_GOTO", + "T_FUNCTION", "T_CONST", "T_RETURN", "T_TRY", "T_CATCH", "T_THROW", + "T_USE", "T_GLOBAL", "T_STATIC", "T_ABSTRACT", "T_FINAL", "T_PRIVATE", + "T_PROTECTED", "T_PUBLIC", "T_VAR", "T_UNSET", "T_ISSET", "T_EMPTY", + "T_HALT_COMPILER", "T_CLASS", "T_INTERFACE", "T_EXTENDS", "T_IMPLEMENTS", + "T_OBJECT_OPERATOR", "T_DOUBLE_ARROW", "T_LIST", "T_ARRAY", "T_CLASS_C", + "T_METHOD_C", "T_FUNC_C", "T_LINE", "T_FILE", "T_COMMENT", + "T_DOC_COMMENT", "T_OPEN_TAG", "T_OPEN_TAG_WITH_ECHO", "T_OPEN_TAG_FAKE", + "T_CLOSE_TAG", "T_WHITESPACE", "T_START_HEREDOC", "T_END_HEREDOC", + "T_HEREDOC", "T_DOLLAR_OPEN_CURLY_BRACES", "T_CURLY_OPEN", + "T_PAAMAYIM_NEKUDOTAYIM", "T_BINARY_DOUBLE", "T_BINARY_HEREDOC", + "T_NAMESPACE", "T_NS_C", "T_DIR", "T_NS_SEPARATOR", "T_INSTEADOF", + "T_CALLABLE", "T_TRAIT", "T_TRAIT_C", "T_YIELD", "T_FINALLY", + "T_ELLIPSIS", "'('", "')'", "';'", "'{'", "'}'", "'$'", "']'", "$accept", + "start", "top_statement_list", "namespace_name", "top_statement", + "use_declarations", "use_declaration", "constant_declaration", + "inner_statement_list", "inner_statement", "statement", + "unticked_statement", "catch_list", "catch", "finally_statement", + "non_empty_finally_statement", "unset_variables", "unset_variable", + "function_declaration_statement", "class_declaration_statement", + "is_reference", "unticked_function_declaration_statement", + "unticked_class_declaration_statement", "class_entry_type", + "extends_from", "interface_entry", "interface_extends_list", + "implements_list", "interface_list", "foreach_optional_arg", + "foreach_variable", "for_statement", "foreach_statement", + "declare_statement", "declare_list", "switch_case_list", "case_list", + "case_separator", "while_statement", "elseif_list", "new_elseif_list", + "else_single", "new_else_single", "parameter_list", + "non_empty_parameter_list", "parameter", "optional_type", "type", + "return_type", "function_call_parameter_list", + "non_empty_function_call_parameter_list", "argument", "global_var_list", + "global_var", "static_var_list", "class_statement_list", + "class_statement", "$@1", "trait_use_statement", "trait_list", + "trait_adaptations", "trait_adaptation_list", + "non_empty_trait_adaptation_list", "trait_adaptation_statement", + "trait_precedence", "trait_reference_list", "trait_method_reference", + "trait_method_reference_fully_qualified", "trait_alias", + "trait_modifiers", "method_body", "variable_modifiers", + "method_modifiers", "non_empty_member_modifiers", "member_modifier", + "class_variable_declaration", "class_constant_declaration", + "echo_expr_list", "for_expr", "non_empty_for_expr", + "expr_without_variable", "yield_expr", "function", "lexical_vars", + "lexical_var_list", "function_call", "class_name", + "fully_qualified_class_name", "class_name_reference", + "dynamic_class_name_reference", "dynamic_class_name_variable_properties", + "dynamic_class_name_variable_property", "exit_expr", "ctor_arguments", + "common_scalar", "static_scalar", "static_class_constant", "scalar", + "static_array_pair_list", "possible_comma", + "non_empty_static_array_pair_list", "expr", "r_variable", "w_variable", + "rw_variable", "variable", "variable_properties", "variable_property", + "array_method_dereference", "method", "method_or_not", + "variable_without_objects", "static_member", "variable_class_name", + "array_function_dereference", "base_variable_with_function_calls", + "base_variable", "reference_variable", "compound_variable", "dim_offset", + "object_property", "object_dim_list", "variable_name", + "simple_indirect_reference", "assignment_list", + "assignment_list_element", "array_pair_list", + "non_empty_array_pair_list", "internal_functions_in_yacc", + "isset_variables", "parenthesis_expr", "combined_scalar_offset", + "combined_scalar", "new_expr", "class_constant", YY_NULLPTR +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[NUM] -- (External) token number corresponding to the + (internal) symbol number NUM (which must be that of a token). */ +static const yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 44, 263, + 264, 265, 266, 61, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 63, 58, 278, 279, 280, + 124, 94, 38, 281, 282, 283, 284, 285, 60, 286, + 62, 287, 288, 289, 43, 45, 46, 42, 47, 37, + 33, 290, 126, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 64, 91, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 40, 41, 59, 123, 125, 36, 93 +}; +# endif + +#define YYPACT_NINF -702 + +#define yypact_value_is_default(Yystate) \ + (!!((Yystate) == (-702))) + +#define YYTABLE_NINF -382 + +#define yytable_value_is_error(Yytable_value) \ + (!!((Yytable_value) == (-382))) + + /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +static const yytype_int16 yypact[] = +{ + -702, 51, 1810, -702, 5980, 5980, -97, 5980, 5980, 5980, + 5980, 5980, 5980, 5980, 394, 394, 5980, 5980, 5980, 5980, + 5980, 5980, 5980, 5980, 4650, 440, 5980, -95, -85, -702, + -702, 33, -702, -702, -702, 13, -702, 5980, 4508, -76, + -71, -62, 38, 64, 4783, 4916, 107, -702, 155, 5049, + 7, 5980, 138, 48, -17, 116, 184, 92, 143, 161, + 166, -702, -702, 174, 177, -702, -702, -702, -702, -702, + -702, -702, -702, -702, 84, -702, -702, 275, -702, -702, + 5980, 6113, -702, -702, 194, -73, -702, 9, -702, -702, + -702, -702, -702, -702, 291, 299, -702, 215, 347, 315, + 234, -702, -702, 6536, -702, 41, 1047, 221, -702, 240, + 323, 264, -702, -9, -702, 56, -702, -702, 326, 327, + -702, 330, 332, 295, 248, -702, 347, 7366, 7366, 5980, + 7366, 7366, 7433, -702, -702, 352, -702, -702, -702, 253, + 275, 342, -98, 265, -702, -702, 269, -702, -702, -702, + -702, -702, -702, -702, -702, -702, 394, 7126, 244, 409, + 267, 275, 268, 271, 262, -702, 280, 302, -11, 56, + -702, 5182, -702, 5980, -702, 5980, 5980, 16, 7366, 363, + 5980, 5980, 5980, 377, 5980, -702, 6579, -702, 6622, 290, + 442, -702, 294, 7366, 959, -702, 6673, 275, 115, 17, + -702, -702, 249, 20, -702, 448, 21, 347, -702, -702, + 394, 394, 394, 301, 298, 4650, 275, -702, 150, 103, + 104, 7169, 96, 303, 6716, 304, 1952, 5980, 393, 1276, + 395, -702, 348, 349, -702, -702, 6, 5980, -27, 5980, + 5980, 5980, 5315, 5980, 5980, 5980, 5980, 5980, 5980, 5980, + 5980, 5980, 5980, 5980, 5980, 5980, 5980, 5980, 5980, 5980, + 5980, 5980, 5980, 5980, 5980, 5980, 440, -702, -702, -702, + 5448, 5980, 5980, 5980, 5980, 5980, 5980, 5980, 5980, 5980, + 5980, 5980, 1276, 52, 5980, 91, 5980, 5980, 194, 0, + 5980, 5980, 5980, 316, 6759, 275, -86, 304, 67, 126, + -702, -702, 5581, -702, 5714, -702, 275, 268, 81, 1276, + -702, 81, 91, -21, -702, 6810, 6854, 7366, 311, 317, + 5980, -702, 322, 6897, 328, 484, 7366, 399, 1032, 483, + 25, 6946, -702, -702, -702, 7235, -702, -702, 2094, -702, + 117, 423, 138, -702, 5980, -702, -702, 48, -702, 7235, + 422, -702, 345, 26, -702, -702, -702, 27, 351, 346, + 350, -702, 28, -702, 357, 118, 1498, -702, -702, 1276, + 5980, -702, -702, -702, 353, -702, -702, -702, -702, -702, + 6258, -702, 394, 5980, 360, 510, -702, 7366, 511, 165, + 401, 165, 368, 366, 66, 369, 374, 378, -21, 56, + 7408, 1202, 7433, 5980, 7294, 7458, 1659, 7480, 7501, 4703, + 1449, 1802, 1802, 1802, 1802, 1802, 1219, 1219, 1219, 1219, + 398, 398, 314, 314, 314, 352, 352, 352, -702, 206, + 7433, 7433, 7433, 7433, 7433, 7433, 7433, 7433, 7433, 7433, + 7433, 7433, 379, 381, 382, 373, -702, 5980, -702, 384, + -7, -702, 385, 6301, 386, 387, 389, -702, -82, 374, + 381, 394, 7366, 394, 7227, 268, -702, 403, -702, -702, + -702, 3798, -702, -702, 7366, 5980, 3940, 5980, 5980, 394, + 70, 7235, 471, 4082, 1, 7235, 7235, 7235, -702, 388, + 404, 275, 49, 414, -702, -702, -702, -58, 488, -702, + -702, 6344, -702, -702, 556, 66, 394, 408, 394, -702, + -702, -702, 298, 298, 559, -702, 1276, -702, 1668, 411, + 124, 947, 412, -702, -702, 7366, -702, 1276, 7235, 424, + 275, 268, -702, 165, 415, 567, -702, -702, 66, 202, + -702, -702, 416, 573, 10, -702, -702, -702, 1276, 1276, + -21, 7458, 5980, 440, -702, -702, 1276, 1276, -702, 6397, + 1276, 517, 520, -702, 5980, 5980, -702, -702, -702, -702, + -702, -702, -702, 5847, -702, 460, -702, -702, 6990, -702, + -702, -702, 425, 7366, 462, 394, 462, -702, -702, 578, + -702, -702, -702, 431, 432, -702, -702, -702, 472, 435, + 590, 7235, 275, 98, 528, 444, 447, -58, -702, -702, + -702, -702, 7235, 452, -702, -702, -702, 29, -702, 5980, + 453, -702, -702, 455, -702, -702, 275, 268, 567, -702, + 165, 582, 454, -702, 513, 79, 86, -702, 542, 607, + 461, 464, 7458, 262, 474, 476, -702, 477, 5980, 5980, + 498, 466, 6440, 394, 7366, 91, -702, 3656, 263, 479, + 2236, 5980, 70, 481, -702, 482, 7235, 2378, -702, 213, + -702, -37, 7235, -702, 7235, -702, 485, 131, -702, 165, + -702, -702, -702, -702, -702, 513, -702, 7433, -702, -702, + 268, 661, -702, 571, 165, -702, -702, -702, -702, -702, + -702, -702, -702, -702, -702, 557, 295, 319, -702, 22, + 624, 490, 624, 57, 640, -702, 7235, -702, -702, -702, + -702, -702, -702, 487, 495, 91, -702, -702, -702, -702, + -702, 272, 502, 4508, -702, -702, 501, 506, -702, 4224, + 4224, -702, 507, 222, 508, 5980, 14, 128, -702, -702, + 545, -702, 596, 2520, 624, -702, 662, 11, -702, 663, + 23, -702, -702, 602, -702, 79, 514, 162, 516, 86, + 668, 7235, -702, -702, -702, 384, 522, 659, 615, 5980, + -702, -702, 4366, -702, -702, -702, -702, -702, 529, -702, + 6485, -702, -702, -702, -702, 7235, 538, -702, 537, 7235, + 165, -702, 179, -702, 7235, 626, -702, 347, 692, -702, + -702, 632, -702, 31, -702, 710, 7235, -702, -702, 5980, + -702, 561, 7033, -702, -702, -702, 2662, -702, -702, 3656, + -702, 563, -702, -702, -702, 630, 564, 179, -702, 565, + 635, 577, 569, 594, -702, 724, 667, 7235, 2804, -702, + 172, -702, 2946, 7235, -702, 7082, 3656, -702, 4508, 3088, + 580, 3656, -702, 3230, -702, -702, -702, 604, 165, -702, + 669, 7235, 584, -702, -702, 671, -702, -702, -702, 720, + -702, 586, -702, 3372, -702, 675, 678, 746, -702, -702, + -702, 66, -702, -702, -702, -702, -702, 165, 595, 3656, + -702, 624, 182, -702, -702, -702, 3514, -702 +}; + + /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ +static const yytype_uint16 yydefact[] = +{ + 4, 0, 2, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 412, 0, 0, 320, 0, 325, + 326, 5, 347, 394, 52, 327, 279, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, + 0, 0, 0, 0, 306, 0, 0, 0, 0, 0, + 0, 80, 86, 0, 0, 331, 332, 334, 328, 329, + 32, 33, 34, 336, 0, 335, 330, 0, 83, 333, + 284, 0, 59, 25, 405, 349, 3, 0, 7, 30, + 8, 9, 73, 74, 0, 0, 362, 0, 75, 386, + 0, 352, 280, 0, 361, 0, 363, 0, 390, 0, + 385, 367, 384, 387, 393, 0, 269, 264, 281, 282, + 265, 348, 5, 306, 0, 284, 75, 424, 425, 0, + 427, 428, 283, 250, 251, 252, 253, 5, 306, 0, + 0, 0, 307, 0, 231, 365, 0, 233, 270, 271, + 272, 273, 274, 275, 276, 278, 0, 417, 0, 355, + 0, 0, 307, 313, 323, 314, 0, 316, 387, 0, + 218, 0, 277, 0, 31, 396, 396, 0, 209, 0, + 0, 210, 0, 0, 0, 42, 0, 44, 0, 0, + 0, 46, 362, 0, 363, 25, 0, 0, 18, 0, + 17, 153, 0, 0, 152, 158, 0, 75, 81, 82, + 0, 0, 0, 0, 411, 412, 0, 4, 0, 351, + 362, 0, 363, 0, 0, 265, 0, 0, 0, 145, + 0, 15, 84, 87, 54, 76, 0, 396, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 53, 230, 232, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 145, 0, 396, 0, 396, 0, 406, 389, + 396, 396, 396, 0, 0, 0, 309, 0, 0, 0, + 421, 364, 0, 439, 356, 413, 0, 309, 0, 145, + 440, 0, 0, 389, 321, 0, 0, 397, 0, 0, + 0, 51, 0, 0, 0, 211, 213, 362, 363, 0, + 0, 0, 43, 45, 63, 0, 47, 48, 0, 62, + 20, 0, 0, 14, 0, 154, 363, 0, 49, 0, + 0, 50, 0, 0, 70, 72, 429, 0, 0, 0, + 0, 409, 0, 408, 0, 350, 0, 11, 4, 145, + 0, 432, 431, 388, 0, 35, 24, 26, 27, 28, + 0, 6, 0, 0, 0, 144, 146, 148, 0, 0, + 89, 0, 0, 0, 136, 0, 441, 379, 377, 0, + 236, 238, 237, 0, 0, 268, 234, 235, 239, 241, + 240, 256, 257, 254, 255, 262, 258, 259, 260, 261, + 248, 249, 243, 244, 242, 245, 246, 247, 263, 0, + 215, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 0, 442, 380, 0, 403, 0, 399, 376, + 398, 402, 0, 0, 0, 0, 0, 426, 308, 0, + 0, 0, 416, 0, 415, 308, 379, 0, 380, 318, + 322, 0, 437, 435, 208, 0, 0, 210, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 353, 327, 0, + 0, 0, 338, 0, 337, 23, 345, 0, 0, 19, + 16, 0, 151, 159, 156, 136, 0, 0, 0, 422, + 423, 10, 411, 411, 0, 438, 145, 13, 0, 0, + 362, 363, 0, 395, 150, 149, 298, 0, 0, 0, + 0, 310, 85, 0, 0, 88, 91, 161, 136, 0, + 140, 141, 0, 124, 0, 137, 139, 383, 145, 145, + 378, 267, 0, 0, 216, 305, 145, 145, 382, 0, + 145, 375, 374, 369, 396, 0, 391, 392, 434, 433, + 436, 420, 419, 0, 324, 315, 25, 116, 0, 25, + 114, 38, 0, 212, 93, 0, 93, 95, 103, 0, + 25, 101, 58, 109, 109, 41, 341, 342, 360, 0, + 355, 353, 0, 340, 0, 0, 0, 67, 65, 61, + 21, 155, 0, 0, 71, 55, 430, 0, 407, 0, + 0, 12, 300, 0, 147, 22, 0, 312, 90, 161, + 0, 192, 0, 138, 292, 136, 0, 135, 0, 126, + 0, 0, 266, 323, 0, 0, 404, 0, 396, 396, + 366, 0, 0, 0, 414, 0, 317, 118, 120, 0, + 0, 210, 0, 0, 96, 0, 0, 0, 109, 0, + 109, 0, 0, 344, 356, 354, 0, 339, 346, 0, + 25, 64, 60, 68, 157, 292, 410, 214, 299, 29, + 311, 192, 92, 0, 0, 199, 200, 201, 198, 197, + 196, 191, 79, 160, 164, 0, 0, 190, 194, 0, + 142, 0, 142, 0, 127, 134, 0, 301, 304, 217, + 302, 303, 373, 0, 0, 0, 368, 400, 401, 418, + 319, 122, 0, 0, 36, 39, 0, 0, 94, 0, + 0, 104, 0, 0, 0, 0, 0, 0, 105, 359, + 358, 343, 0, 0, 142, 78, 0, 0, 168, 204, + 0, 165, 195, 0, 163, 136, 0, 0, 0, 0, + 130, 0, 129, 371, 372, 376, 0, 0, 0, 0, + 121, 115, 0, 25, 99, 57, 56, 102, 0, 107, + 0, 112, 113, 25, 106, 0, 0, 69, 0, 0, + 0, 170, 172, 167, 0, 0, 162, 75, 0, 143, + 25, 0, 296, 0, 25, 131, 0, 128, 370, 0, + 25, 0, 0, 25, 97, 40, 0, 108, 25, 111, + 357, 0, 25, 207, 169, 5, 0, 173, 174, 0, + 0, 182, 0, 0, 205, 202, 0, 0, 0, 297, + 0, 293, 0, 0, 133, 0, 123, 37, 0, 0, + 0, 110, 25, 0, 171, 175, 176, 186, 0, 177, + 0, 0, 0, 206, 77, 0, 294, 285, 132, 0, + 117, 0, 100, 0, 286, 0, 185, 178, 179, 183, + 203, 136, 295, 25, 98, 66, 184, 0, 0, 119, + 180, 142, 0, 188, 25, 166, 0, 189 +}; + + /* YYPGOTO[NTERM-NUM]. */ +static const yytype_int16 yypgoto[] = +{ + -702, -702, -199, -5, -702, -702, 419, -702, -183, -702, + 19, -702, -702, 149, -702, 156, -702, 256, 2, 3, + -125, -702, -702, -702, -702, -702, -702, -702, 231, 181, + 106, -702, 39, -702, -702, -702, -562, -8, -702, -702, + -702, -702, -702, -497, -702, -591, -589, 230, -701, -209, + -702, 254, -702, 436, -702, 157, -702, -702, -702, -702, + -702, -702, -702, -53, -702, -702, -702, -702, -702, -702, + -702, -702, -702, -702, -694, -702, -702, -702, -463, -702, + -42, 706, -2, 108, -702, -702, 227, -66, -251, -702, + -702, -702, -702, 145, -187, -212, -702, -702, 188, 191, + -702, 908, 598, -356, 339, 356, -702, -702, -702, -702, + 30, -215, -702, 793, -702, -702, -22, -23, -702, -160, + -306, -702, -702, -3, 284, 279, 583, -702, -702, -702, + -702, -702, -702, -38, -702 +}; + + /* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + -1, 1, 2, 85, 86, 199, 200, 87, 226, 376, + 377, 89, 607, 608, 682, 609, 353, 354, 378, 379, + 236, 92, 93, 94, 390, 95, 392, 534, 535, 663, + 586, 825, 785, 592, 330, 595, 669, 793, 581, 658, + 731, 734, 778, 542, 543, 639, 544, 545, 766, 384, + 385, 386, 203, 204, 206, 631, 703, 807, 704, 757, + 803, 836, 837, 838, 839, 887, 840, 841, 842, 885, + 905, 705, 706, 707, 708, 760, 709, 177, 324, 325, + 96, 97, 126, 712, 813, 99, 100, 546, 164, 165, + 575, 656, 172, 310, 101, 598, 496, 102, 599, 305, + 600, 103, 104, 300, 105, 106, 650, 726, 561, 562, + 563, 107, 108, 109, 110, 111, 112, 113, 114, 318, + 449, 450, 451, 115, 362, 363, 158, 159, 116, 357, + 117, 118, 119, 120, 121 +}; + + /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ +static const yytype_int16 yytable[] = +{ + 98, 293, 168, 167, 90, 91, 469, 192, 613, 142, + 142, 768, 338, 762, 582, 428, 319, 230, 366, 800, + 162, 88, 169, 397, 320, 342, 524, 593, 347, 350, + 763, 805, 671, 482, 506, 508, 513, 513, 220, 850, + 791, 632, 636, 225, 286, 714, 713, 198, 396, 605, + 33, 3, 207, 798, 286, 228, 286, 179, 564, 174, + 205, 745, 746, 229, 129, 286, 171, 228, 444, 218, + 448, 228, 219, 442, -307, 369, 173, 395, 176, 516, + 228, 393, 352, 397, 444, 180, 47, 637, 229, 769, + 181, 539, 289, 466, 268, 269, 468, 448, 175, 182, + 467, 606, 585, 297, 539, 571, 743, 572, 747, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 207, 770, 495, 445, 201, 452, 443, 748, 33, + 454, 455, 456, 33, 637, 296, -381, 503, -381, 84, + 327, 137, 459, 287, 33, 137, 313, 33, 494, -365, + -365, 142, -377, 287, 137, 287, 307, 565, 33, 137, + 519, -378, 494, 637, 287, 594, 446, 394, 33, 518, + 638, 195, 231, 886, 801, 802, 809, 792, 815, 321, + 343, 138, 189, 348, 351, 764, 806, 483, 507, 509, + 514, 686, 340, 851, 811, 540, -307, 142, 737, 183, + 902, 460, 228, 33, 875, 142, 142, 142, 540, 142, + 341, 365, 498, 137, 202, 398, 529, 638, 84, 530, + 139, 541, 288, 140, 98, 184, 745, 746, -125, 529, + 190, 141, 530, 84, 541, 399, 84, 216, 208, 812, + 137, 143, 143, 168, 167, -309, 638, 84, 217, 876, + -309, 228, 163, 210, 835, 447, 228, 84, -288, -288, + 398, 162, 398, 169, 369, -308, -287, -287, 228, 588, + 228, 228, 553, 596, 597, 398, 398, 137, -308, 516, + 399, 137, 399, 33, 228, 398, -289, -289, 398, 398, + 458, 197, 84, 794, 494, 399, 399, 729, 494, 494, + 494, 465, 643, 228, 211, 399, 209, 620, 399, 399, + 744, 745, 746, 367, 368, 529, 625, 138, 530, 788, + 745, 746, 212, 532, 137, 536, 33, 213, 520, 529, + 492, 540, 530, 732, 733, 214, 98, 198, 215, 640, + 641, 494, 776, 777, 492, 903, 904, 644, 645, 730, + 137, 647, 529, 144, 147, 530, 139, 541, 227, 140, + 138, 263, 264, 265, 98, 266, 232, 141, 90, 91, + 145, 145, 84, 137, 233, 33, 550, 142, 234, 235, + 237, 238, 282, 143, 531, 88, 531, 283, 284, 531, + 285, 290, 291, 657, 898, 292, 660, 175, 47, 139, + 684, 216, 140, 266, 651, 194, 295, 667, 25, 138, + 141, 303, 298, 344, 494, 84, 299, 304, 308, 775, + 306, 228, -193, 309, 142, 494, 360, 311, 312, 143, + 695, 696, 697, 698, 699, 700, 222, 143, 143, 143, + 448, 143, 260, 261, 262, 263, 264, 265, 139, 266, + 322, 140, 329, 334, 741, 335, 142, 336, 142, 141, + 749, 349, 750, 359, 84, 371, 373, 536, 381, 137, + 388, 33, 389, 391, 142, 142, 492, 394, 472, 494, + 492, 492, 492, 475, 473, 494, 603, 494, 723, 724, + 577, 477, 478, 163, 479, 580, 481, 753, 499, 504, + 531, 142, 591, 142, 772, 138, 505, 142, 142, 511, + 448, 512, 301, 510, 522, 137, 98, 33, 527, 515, + 90, 91, 526, 492, 528, 627, 533, 538, 531, 494, + 168, 167, 537, 531, 531, 548, 547, 88, 328, 549, + 558, 555, 556, 557, 139, 560, 589, 140, 162, 601, + 169, 138, 566, 568, 569, 141, 570, 602, 346, 817, + 84, 604, 493, 610, 692, 574, 355, 356, 358, 612, + 361, 615, 619, 622, 623, 630, 493, 626, 634, 629, + 142, 635, 648, 830, 494, 649, 655, 833, 661, 662, + 160, 666, 844, 161, 668, 670, 492, 677, 674, 672, + 826, 141, 673, 678, 854, 679, 84, 492, 494, 143, + 829, 680, 494, 752, 685, 688, 710, 494, 689, 715, + 716, 690, 711, 717, 725, 531, 718, 848, 758, 494, + 531, 852, 398, 727, 759, 873, 720, 856, 721, 722, + 859, 878, 735, 739, 740, 861, 756, 751, 142, 863, + 765, 767, 399, 771, 773, 98, 143, 142, 98, 890, + 494, 492, 774, 779, 781, 98, 494, 492, 782, 492, + 787, 789, 795, 796, 531, 799, 804, 808, 810, 883, + 814, 816, 846, 819, 494, 820, 693, 821, 143, 531, + 143, 694, 827, 695, 696, 697, 698, 699, 700, 701, + 831, 832, 398, 845, 761, 847, 143, 143, 493, 849, + 899, 492, 493, 493, 493, 695, 696, 697, 698, 699, + 700, 906, 399, 853, 857, -181, 521, 862, 866, 864, + 867, 868, 869, 143, 834, 143, 843, 871, 301, 143, + 143, 870, 872, 882, 889, 891, 893, 702, 892, 894, + 896, 98, 780, -187, 897, 493, 681, 901, 784, 784, + 531, 500, 614, 683, 628, 693, 492, 665, 738, 633, + 694, 843, 695, 696, 697, 698, 699, 700, 701, 786, + 163, 624, 828, 502, 865, 554, 691, 223, 719, 676, + 492, 675, 618, 754, 492, 531, 617, 531, 364, 492, + 345, 824, 888, 0, 0, 818, 0, 146, 146, 0, + 0, 492, 143, 0, 0, 0, 0, 301, 166, 301, + 0, 0, 0, 0, 98, 0, 755, 98, 493, 0, + 0, 900, 531, 0, 0, 584, 587, 0, 0, 493, + 0, 0, 492, 0, 0, 0, 98, 0, 492, 0, + 98, 0, 0, 0, 98, 0, 0, 98, 0, 98, + 0, 98, 355, 531, 616, 0, 492, 0, 361, 361, + 0, 0, 0, 0, 0, 0, 0, 880, 0, 0, + 143, 98, 0, 0, 0, 0, 531, 0, 0, 143, + 0, 0, 531, 493, 0, 0, 0, 98, 0, 493, + 0, 493, 0, 0, 98, 0, 0, 0, 0, 0, + 0, 0, 127, 128, 0, 130, 131, 132, 133, 134, + 135, 136, 0, 0, 148, 149, 150, 151, 152, 153, + 154, 155, 157, 0, 170, 0, 0, 0, 0, 0, + 0, 664, 0, 493, 0, 178, 0, 0, 0, 146, + 0, 0, 186, 188, 0, 0, 0, 193, 0, 196, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 0, 0, 0, 0, 221, 224, + 0, 0, 0, 0, 0, 146, 0, 0, 493, 0, + -365, -365, 0, 146, 146, 146, 0, 146, 0, 301, + 0, 0, -365, -365, 0, 0, 0, 0, 587, 0, + 0, 0, 493, 0, 0, 0, 493, 0, 0, 0, + 0, 493, 0, 0, 0, 0, 0, 294, 0, 0, + 0, 0, 0, 493, 0, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 0, 0, 166, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 0, 0, 493, 0, 0, 0, 0, 315, + 493, 316, 0, 317, 317, -365, -365, 0, 323, 326, + 193, 0, 331, 0, 0, 0, 0, 0, 493, 0, + -365, -365, 0, 0, 0, 0, 0, 0, 0, -290, + -290, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 337, 157, 0, 0, 0, 480, 0, 0, + 0, 0, 0, 0, 0, 380, 0, 387, 0, 0, + 0, 0, 0, 0, 0, 317, 0, 400, 401, 402, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 0, 146, 0, 0, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 387, 0, 317, 0, 317, 453, 0, 0, 317, 317, + 317, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 462, 0, 464, 241, 0, 0, 0, 387, 0, 0, + 0, 0, 146, 0, 0, 0, 0, 242, 474, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 501, 266, 146, 0, 146, -382, -382, -382, + -382, 258, 259, 260, 261, 262, 263, 264, 265, 0, + 266, 0, 146, 146, 0, 0, 0, 387, 193, 4, + 5, 6, 7, 8, 0, 0, 0, 0, 9, 0, + 0, 525, 0, 0, 0, 0, 0, 0, 0, 146, + 0, 146, 0, 0, 0, 146, 146, 0, 382, 0, + 0, 551, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 11, 0, 0, 0, 0, 12, 0, 13, 14, + 15, 16, 17, 18, 0, 0, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 0, 166, 0, 0, 29, + 30, 122, 32, 33, 0, 559, 0, 0, 0, 35, + 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 146, 47, + 0, 0, 0, 578, 0, 326, 583, 123, 0, 0, + 0, 0, 0, 0, 0, 58, 59, 0, 0, 0, + 0, 0, 0, 0, 63, 64, 65, 66, 67, 68, + 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 73, 0, 0, 0, 387, 0, 124, 75, 76, 77, + 0, 0, 0, 79, 125, 387, 383, 81, 0, 0, + 0, 0, 84, 0, 0, 0, 146, 0, 0, 0, + 0, 0, 0, 0, 0, 146, 387, 387, 0, 0, + 642, 0, 0, 0, 387, 387, 0, 0, 387, 0, + 0, 0, 317, 652, 0, 0, 0, 0, 0, 0, + 0, 654, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 0, + 266, 4, 5, 6, 7, 8, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 687, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 11, 0, 0, 0, 0, 12, 0, + 13, 14, 15, 16, 17, 18, 317, 317, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 0, 326, + 0, 29, 30, 31, 32, 33, 0, 34, 0, 0, + 0, 35, 36, 37, 38, 39, 0, 40, 0, 41, + 0, 42, 0, 0, 43, 0, 0, 0, 44, 45, + 46, 47, 48, 49, 50, 0, 51, 52, 53, 54, + 55, 56, 0, 0, 0, 0, 57, 58, 59, 60, + 61, 62, 0, 0, 0, 0, 63, 64, 65, 66, + 67, 68, 69, 0, 0, 70, 71, 0, 72, 0, + 0, 0, 73, 0, 0, 0, 0, 0, 74, 75, + 76, 77, 0, 790, 78, 79, 80, 0, 0, 81, + 0, 82, 83, 517, 84, 0, 0, 0, 0, 0, + 0, 4, 5, 6, 7, 8, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 822, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 0, + 266, 0, 10, 11, 0, 0, 0, 0, 12, 0, + 13, 14, 15, 16, 17, 18, 0, 855, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 0, 0, + 0, 29, 30, 31, 32, 33, 0, 34, 0, 0, + 0, 35, 36, 37, 38, 39, 0, 40, 0, 41, + 0, 42, 0, 0, 43, 0, 0, 0, 44, 45, + 46, 47, 48, 49, 50, 0, 51, 52, 53, 54, + 55, 56, 0, 0, 0, 0, 57, 58, 59, 60, + 61, 62, 0, 0, 0, 0, 63, 64, 65, 66, + 67, 68, 69, 0, 0, 70, 71, 0, 72, 0, + 0, 0, 73, 4, 5, 6, 7, 8, 74, 75, + 76, 77, 9, 0, 78, 79, 80, 0, 0, 81, + 0, 82, 83, 621, 84, -382, -382, -382, -382, -382, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 0, 266, 10, 11, 0, 0, 0, 0, + 12, 0, 13, 14, 15, 16, 17, 18, 0, 0, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 0, 0, 0, 29, 30, 31, 32, 33, 0, 34, + 0, 0, 0, 35, 36, 37, 38, 39, 0, 40, + 0, 41, 0, 42, 0, 0, 43, 0, 0, 0, + 44, 45, 46, 47, 48, 49, 50, 0, 51, 52, + 53, 54, 55, 56, 0, 0, 0, 0, 57, 58, + 59, 60, 61, 62, 0, 0, 0, 0, 63, 64, + 65, 66, 67, 68, 69, 0, 0, 70, 71, 0, + 72, 0, 0, 0, 73, 4, 5, 6, 7, 8, + 74, 75, 76, 77, 9, 0, 78, 79, 80, 0, + 0, 81, 0, 82, 83, 0, 84, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 11, 0, 0, + 0, 0, 12, 0, 13, 14, 15, 16, 17, 18, + 0, 0, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 0, 0, 0, 29, 30, 31, 32, 33, + 0, 34, 0, 0, 0, 35, 36, 37, 38, 39, + 0, 40, 0, 41, 0, 42, 0, 0, 43, 0, + 0, 0, 44, 45, 46, 47, 0, 49, 50, 0, + 51, 0, 53, 54, 55, 56, 0, 0, 0, 0, + 57, 58, 59, 374, 61, 62, 0, 0, 0, 0, + 63, 64, 65, 66, 67, 68, 69, 0, 0, 70, + 71, 0, 72, 0, 0, 0, 73, 4, 5, 6, + 7, 8, 124, 75, 76, 77, 9, 0, 78, 79, + 80, 0, 0, 81, 0, 82, 83, 375, 84, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, + 0, 0, 0, 0, 12, 0, 13, 14, 15, 16, + 17, 18, 0, 0, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 0, 0, 0, 29, 30, 31, + 32, 33, 0, 34, 0, 0, 0, 35, 36, 37, + 38, 39, 0, 40, 0, 41, 0, 42, 0, 0, + 43, 0, 0, 0, 44, 45, 46, 47, 0, 49, + 50, 0, 51, 0, 53, 54, 55, 56, 0, 0, + 0, 0, 57, 58, 59, 374, 61, 62, 0, 0, + 0, 0, 63, 64, 65, 66, 67, 68, 69, 0, + 0, 70, 71, 0, 72, 0, 0, 0, 73, 4, + 5, 6, 7, 8, 124, 75, 76, 77, 9, 0, + 78, 79, 80, 0, 0, 81, 0, 82, 83, 497, + 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 11, 0, 0, 0, 0, 12, 0, 13, 14, + 15, 16, 17, 18, 0, 0, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 0, 0, 0, 29, + 30, 31, 32, 33, 0, 34, 0, 0, 0, 35, + 36, 37, 38, 39, 736, 40, 0, 41, 0, 42, + 0, 0, 43, 0, 0, 0, 44, 45, 46, 47, + 0, 49, 50, 0, 51, 0, 53, 54, 55, 56, + 0, 0, 0, 0, 57, 58, 59, 374, 61, 62, + 0, 0, 0, 0, 63, 64, 65, 66, 67, 68, + 69, 0, 0, 70, 71, 0, 72, 0, 0, 0, + 73, 4, 5, 6, 7, 8, 124, 75, 76, 77, + 9, 0, 78, 79, 80, 0, 0, 81, 0, 82, + 83, 0, 84, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 11, 0, 0, 0, 0, 12, 0, + 13, 14, 15, 16, 17, 18, 0, 0, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 0, 0, + 0, 29, 30, 31, 32, 33, 0, 34, 0, 0, + 0, 35, 36, 37, 38, 39, 0, 40, 0, 41, + 0, 42, 742, 0, 43, 0, 0, 0, 44, 45, + 46, 47, 0, 49, 50, 0, 51, 0, 53, 54, + 55, 56, 0, 0, 0, 0, 57, 58, 59, 374, + 61, 62, 0, 0, 0, 0, 63, 64, 65, 66, + 67, 68, 69, 0, 0, 70, 71, 0, 72, 0, + 0, 0, 73, 4, 5, 6, 7, 8, 124, 75, + 76, 77, 9, 0, 78, 79, 80, 0, 0, 81, + 0, 82, 83, 0, 84, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 11, 0, 0, 0, 0, + 12, 0, 13, 14, 15, 16, 17, 18, 0, 0, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 0, 0, 0, 29, 30, 31, 32, 33, 0, 34, + 0, 0, 0, 35, 36, 37, 38, 39, 0, 40, + 0, 41, 0, 42, 0, 0, 43, 0, 0, 0, + 44, 45, 46, 47, 0, 49, 50, 0, 51, 0, + 53, 54, 55, 56, 0, 0, 0, 0, 57, 58, + 59, 374, 61, 62, 0, 0, 0, 0, 63, 64, + 65, 66, 67, 68, 69, 0, 0, 70, 71, 0, + 72, 0, 0, 0, 73, 4, 5, 6, 7, 8, + 124, 75, 76, 77, 9, 0, 78, 79, 80, 0, + 0, 81, 0, 82, 83, 797, 84, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 11, 0, 0, + 0, 0, 12, 0, 13, 14, 15, 16, 17, 18, + 0, 0, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 0, 0, 0, 29, 30, 31, 32, 33, + 0, 34, 0, 0, 0, 35, 36, 37, 38, 39, + 0, 40, 0, 41, 860, 42, 0, 0, 43, 0, + 0, 0, 44, 45, 46, 47, 0, 49, 50, 0, + 51, 0, 53, 54, 55, 56, 0, 0, 0, 0, + 57, 58, 59, 374, 61, 62, 0, 0, 0, 0, + 63, 64, 65, 66, 67, 68, 69, 0, 0, 70, + 71, 0, 72, 0, 0, 0, 73, 4, 5, 6, + 7, 8, 124, 75, 76, 77, 9, 0, 78, 79, + 80, 0, 0, 81, 0, 82, 83, 0, 84, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, + 0, 0, 0, 0, 12, 0, 13, 14, 15, 16, + 17, 18, 0, 0, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 0, 0, 0, 29, 30, 31, + 32, 33, 0, 34, 0, 0, 0, 35, 36, 37, + 38, 39, 0, 40, 0, 41, 0, 42, 0, 0, + 43, 0, 0, 0, 44, 45, 46, 47, 0, 49, + 50, 0, 51, 0, 53, 54, 55, 56, 0, 0, + 0, 0, 57, 58, 59, 374, 61, 62, 0, 0, + 0, 0, 63, 64, 65, 66, 67, 68, 69, 0, + 0, 70, 71, 0, 72, 0, 0, 0, 73, 4, + 5, 6, 7, 8, 124, 75, 76, 77, 9, 0, + 78, 79, 80, 0, 0, 81, 0, 82, 83, 874, + 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 11, 0, 0, 0, 0, 12, 0, 13, 14, + 15, 16, 17, 18, 0, 0, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 0, 0, 0, 29, + 30, 31, 32, 33, 0, 34, 0, 0, 0, 35, + 36, 37, 38, 39, 0, 40, 0, 41, 0, 42, + 0, 0, 43, 0, 0, 0, 44, 45, 46, 47, + 0, 49, 50, 0, 51, 0, 53, 54, 55, 56, + 0, 0, 0, 0, 57, 58, 59, 374, 61, 62, + 0, 0, 0, 0, 63, 64, 65, 66, 67, 68, + 69, 0, 0, 70, 71, 0, 72, 0, 0, 0, + 73, 4, 5, 6, 7, 8, 124, 75, 76, 77, + 9, 0, 78, 79, 80, 0, 0, 81, 0, 82, + 83, 877, 84, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 11, 0, 0, 0, 0, 12, 0, + 13, 14, 15, 16, 17, 18, 0, 0, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 0, 0, + 0, 29, 30, 31, 32, 33, 0, 34, 0, 0, + 0, 35, 36, 37, 38, 39, 0, 40, 881, 41, + 0, 42, 0, 0, 43, 0, 0, 0, 44, 45, + 46, 47, 0, 49, 50, 0, 51, 0, 53, 54, + 55, 56, 0, 0, 0, 0, 57, 58, 59, 374, + 61, 62, 0, 0, 0, 0, 63, 64, 65, 66, + 67, 68, 69, 0, 0, 70, 71, 0, 72, 0, + 0, 0, 73, 4, 5, 6, 7, 8, 124, 75, + 76, 77, 9, 0, 78, 79, 80, 0, 0, 81, + 0, 82, 83, 0, 84, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 11, 0, 0, 0, 0, + 12, 0, 13, 14, 15, 16, 17, 18, 0, 0, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 0, 0, 0, 29, 30, 31, 32, 33, 0, 34, + 0, 0, 0, 35, 36, 37, 38, 39, 0, 40, + 0, 41, 0, 42, 0, 0, 43, 0, 0, 0, + 44, 45, 46, 47, 0, 49, 50, 0, 51, 0, + 53, 54, 55, 56, 0, 0, 0, 0, 57, 58, + 59, 374, 61, 62, 0, 0, 0, 0, 63, 64, + 65, 66, 67, 68, 69, 0, 0, 70, 71, 0, + 72, 0, 0, 0, 73, 4, 5, 6, 7, 8, + 124, 75, 76, 77, 9, 0, 78, 79, 80, 0, + 0, 81, 0, 82, 83, 884, 84, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 11, 0, 0, + 0, 0, 12, 0, 13, 14, 15, 16, 17, 18, + 0, 0, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 0, 0, 0, 29, 30, 31, 32, 33, + 0, 34, 0, 0, 0, 35, 36, 37, 38, 39, + 0, 40, 0, 41, 0, 42, 0, 0, 43, 0, + 0, 0, 44, 45, 46, 47, 0, 49, 50, 0, + 51, 0, 53, 54, 55, 56, 0, 0, 0, 0, + 57, 58, 59, 374, 61, 62, 0, 0, 0, 0, + 63, 64, 65, 66, 67, 68, 69, 0, 0, 70, + 71, 0, 72, 0, 0, 0, 73, 4, 5, 6, + 7, 8, 124, 75, 76, 77, 9, 0, 78, 79, + 80, 0, 0, 81, 0, 82, 83, 895, 84, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, + 0, 0, 0, 0, 12, 0, 13, 14, 15, 16, + 17, 18, 0, 0, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 0, 0, 0, 29, 30, 31, + 32, 33, 0, 34, 0, 0, 0, 35, 36, 37, + 38, 39, 0, 40, 0, 41, 0, 42, 0, 0, + 43, 0, 0, 0, 44, 45, 46, 47, 0, 49, + 50, 0, 51, 0, 53, 54, 55, 56, 0, 0, + 0, 0, 57, 58, 59, 374, 61, 62, 0, 0, + 0, 0, 63, 64, 65, 66, 67, 68, 69, 0, + 0, 70, 71, 0, 72, 0, 0, 0, 73, 4, + 5, 6, 7, 8, 124, 75, 76, 77, 9, 0, + 78, 79, 80, 0, 0, 81, 0, 82, 83, 907, + 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 11, 0, 0, 0, 0, 12, 0, 13, 14, + 15, 16, 17, 18, 0, 0, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 0, 0, 0, 29, + 30, 31, 32, 33, 0, 34, 0, 0, 0, 35, + 36, 37, 38, 39, 0, 40, 0, 41, 0, 42, + 0, 0, 43, 0, 0, 0, 44, 45, 46, 47, + 0, 49, 50, 0, 51, 0, 53, 54, 55, 56, + 0, 0, 0, 0, 57, 58, 59, 374, 61, 62, + 0, 0, 0, 0, 63, 64, 65, 66, 67, 68, + 69, 0, 0, 70, 71, 0, 72, 0, 0, 0, + 73, 4, 5, 6, 7, 8, 124, 75, 76, 77, + 9, 0, 78, 79, 80, 0, 0, 81, 0, 82, + 83, 0, 84, 0, 576, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 11, 0, 0, 0, 0, 12, 0, + 13, 14, 15, 16, 17, 18, 0, 0, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 0, 0, + 0, 29, 30, 31, 32, 33, 0, 34, 0, 0, + 0, 35, 36, 37, 38, 39, 0, 40, 0, 41, + 0, 42, 0, 0, 43, 0, 0, 0, 44, 45, + 46, 47, 0, 49, 50, 0, 51, 0, 53, 54, + 0, 0, 0, 0, 0, 0, 57, 58, 59, 0, + 0, 0, 0, 0, 0, 0, 63, 64, 65, 66, + 67, 68, 69, 0, 0, 70, 71, 0, 72, 0, + 0, 0, 73, 4, 5, 6, 7, 8, 124, 75, + 76, 77, 9, 0, 0, 79, 80, 0, 0, 81, + 0, 82, 83, 0, 84, 0, 579, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 11, 0, 0, 0, 0, + 12, 0, 13, 14, 15, 16, 17, 18, 0, 0, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 0, 0, 0, 29, 30, 31, 32, 33, 0, 34, + 0, 0, 0, 35, 36, 37, 38, 39, 0, 40, + 0, 41, 0, 42, 0, 0, 43, 0, 0, 0, + 44, 45, 46, 47, 0, 49, 50, 0, 51, 0, + 53, 54, 0, 0, 0, 0, 0, 0, 57, 58, + 59, 0, 0, 0, 0, 0, 0, 0, 63, 64, + 65, 66, 67, 68, 69, 0, 0, 70, 71, 0, + 72, 0, 0, 0, 73, 4, 5, 6, 7, 8, + 124, 75, 76, 77, 9, 0, 0, 79, 80, 0, + 0, 81, 0, 82, 83, 0, 84, 0, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 11, 0, 0, + 0, 0, 12, 0, 13, 14, 15, 16, 17, 18, + 0, 0, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 0, 0, 0, 29, 30, 31, 32, 33, + 0, 34, 0, 0, 0, 35, 36, 37, 38, 39, + 0, 40, 0, 41, 0, 42, 0, 0, 43, 0, + 0, 0, 44, 45, 46, 47, 0, 49, 50, 0, + 51, 0, 53, 54, 0, 0, 0, 0, 0, 0, + 57, 58, 59, 0, 0, 0, 0, 0, 0, 0, + 63, 64, 65, 66, 67, 68, 69, 0, 0, 70, + 71, 0, 72, 0, 0, 0, 73, 4, 5, 6, + 7, 8, 124, 75, 76, 77, 9, 0, 0, 79, + 80, 0, 0, 81, 0, 82, 83, 0, 84, 0, + 783, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, + 0, 0, 0, 0, 12, 0, 13, 14, 15, 16, + 17, 18, 0, 0, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 0, 0, 0, 29, 30, 31, + 32, 33, 0, 34, 0, 0, 0, 35, 36, 37, + 38, 39, 0, 40, 0, 41, 0, 42, 0, 0, + 43, 0, 0, 0, 44, 45, 46, 47, 0, 49, + 50, 0, 51, 0, 53, 54, 0, 0, 0, 0, + 0, 0, 57, 58, 59, 0, 0, 0, 0, 0, + 0, 0, 63, 64, 65, 66, 67, 68, 69, 0, + 0, 70, 71, 0, 72, 0, 0, 0, 73, 4, + 5, 6, 7, 8, 124, 75, 76, 77, 9, 0, + 0, 79, 80, 0, 0, 81, 0, 82, 83, 0, + 84, 0, 823, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 11, 0, 0, 0, 0, 12, 0, 13, 14, + 15, 16, 17, 18, 0, 0, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 0, 0, 0, 29, + 30, 31, 32, 33, 0, 34, 0, 0, 0, 35, + 36, 37, 38, 39, 0, 40, 0, 41, 0, 42, + 0, 0, 43, 0, 0, 0, 44, 45, 46, 47, + 0, 49, 50, 0, 51, 0, 53, 54, 0, 0, + 0, 0, 0, 0, 57, 58, 59, 0, 0, 0, + 0, 0, 0, 0, 63, 64, 65, 66, 67, 68, + 69, 0, 0, 70, 71, 0, 72, 0, 0, 0, + 73, 4, 5, 6, 7, 8, 124, 75, 76, 77, + 9, 0, 0, 79, 80, 0, 0, 81, 0, 82, + 83, 0, 84, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 11, 0, 0, 0, 0, 12, 0, + 13, 14, 15, 16, 17, 18, 0, 0, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 0, 0, + 0, 29, 30, 31, 32, 33, 0, 34, 0, 0, + 0, 35, 36, 37, 38, 39, 0, 40, 0, 41, + 0, 42, 0, 0, 43, 0, 0, 0, 44, 45, + 46, 47, 0, 49, 50, 0, 51, 0, 53, 54, + 0, 0, 0, 0, 0, 0, 57, 58, 59, 0, + 0, 0, 0, 0, 0, 0, 63, 64, 65, 66, + 67, 68, 69, 0, 0, 70, 71, 0, 72, 0, + 0, 0, 73, 4, 5, 6, 7, 8, 124, 75, + 76, 77, 9, 0, 0, 79, 80, 0, 0, 81, + 0, 82, 83, 0, 84, 0, 0, 0, 0, 0, + 0, 0, 156, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 11, 0, 0, 0, 0, + 12, 0, 13, 14, 15, 16, 17, 18, 0, 0, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 0, + 0, 0, 0, 29, 30, 122, 32, 33, 0, 0, + 0, 0, 0, 35, 36, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 47, 266, 0, 0, 0, 0, 0, + 0, 123, 0, 0, 0, 0, 0, 0, 0, 58, + 59, 0, 0, 0, 0, 0, 0, 0, 63, 64, + 65, 66, 67, 68, 69, 0, 4, 5, 6, 7, + 8, 0, 0, 0, 73, 9, 0, 0, 0, 0, + 124, 75, 76, 77, 0, 0, 0, 79, 125, 0, + 0, 81, 0, 0, 0, 0, 84, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 10, 11, 0, + 0, 0, 0, 12, 0, 13, 14, 15, 16, 17, + 18, 0, 0, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 0, 0, 0, 0, 29, 30, 122, 32, + 33, 0, 0, 0, 0, 0, 35, 36, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, + 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, + 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, + 0, 63, 64, 65, 66, 67, 68, 69, 0, 4, + 5, 6, 7, 8, 0, 0, 0, 73, 9, 0, + 0, 0, 0, 124, 75, 76, 77, 0, 0, 0, + 79, 125, 0, 0, 81, 0, 185, 0, 0, 84, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 11, 0, 0, 0, 0, 12, 0, 13, 14, + 15, 16, 17, 18, 0, 0, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 0, 0, 0, 0, 29, + 30, 122, 32, 33, 0, 0, 0, 0, 0, 35, + 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, + 0, 0, 0, 0, 0, 0, 0, 123, 0, 0, + 0, 0, 0, 0, 0, 58, 59, 0, 0, 0, + 0, 0, 0, 0, 63, 64, 65, 66, 67, 68, + 69, 0, 4, 5, 6, 7, 8, 0, 0, 0, + 73, 9, 0, 0, 0, 0, 124, 75, 76, 77, + 0, 0, 0, 79, 125, 0, 0, 81, 0, 187, + 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 11, 0, 0, 0, 0, 12, + 0, 13, 14, 15, 16, 17, 18, 0, 0, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 0, 0, + 0, 0, 29, 30, 122, 32, 33, 0, 0, 0, + 0, 0, 35, 36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, + 123, 0, 0, 0, 0, 0, 0, 0, 58, 59, + 0, 0, 0, 0, 0, 0, 0, 63, 64, 65, + 66, 67, 68, 69, 0, 4, 5, 6, 7, 8, + 0, 0, 0, 73, 9, 0, 0, 0, 0, 124, + 75, 76, 77, 0, 0, 0, 79, 125, 0, 0, + 81, 0, 191, 0, 0, 84, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 11, 0, 0, + 0, 0, 12, 0, 13, 14, 15, 16, 17, 18, + 0, 0, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 0, 0, 0, 0, 29, 30, 122, 32, 33, + 0, 0, 0, 0, 0, 35, 36, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, + 0, 0, 0, 123, 0, 0, 0, 0, 0, 0, + 0, 58, 59, 0, 0, 0, 0, 0, 0, 0, + 63, 64, 65, 66, 67, 68, 69, 0, 4, 5, + 6, 7, 8, 0, 0, 0, 73, 9, 0, 0, + 0, 0, 124, 75, 76, 77, 0, 0, 0, 79, + 125, 403, 0, 81, 314, 0, 0, 0, 84, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 11, 0, 0, 0, 0, 12, 0, 13, 14, 15, + 16, 17, 18, 0, 0, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 0, 0, 0, 0, 29, 30, + 122, 32, 33, 0, 0, 0, 0, 0, 35, 36, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, + 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, + 0, 0, 0, 0, 58, 59, 0, 0, 0, 0, + 0, 0, 0, 63, 64, 65, 66, 67, 68, 69, + 0, 4, 5, 6, 7, 8, 0, 0, 0, 73, + 9, 0, 0, 0, 0, 124, 75, 76, 77, 0, + 0, 0, 79, 125, 0, 0, 81, 0, 0, 0, + 429, 84, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 10, 11, 0, 0, 0, 0, 12, 0, + 13, 14, 15, 16, 17, 18, 0, 0, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 0, 0, 0, + 0, 29, 30, 122, 32, 33, 0, 0, 0, 0, + 0, 35, 36, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 47, 0, 0, 0, 0, 0, 0, 0, 123, + 0, 0, 0, 0, 0, 0, 0, 58, 59, 0, + 0, 0, 0, 0, 0, 0, 63, 64, 65, 66, + 67, 68, 69, 0, 4, 5, 6, 7, 8, 0, + 0, 0, 73, 9, 0, 0, 0, 0, 124, 75, + 76, 77, 0, 0, 0, 79, 125, 0, 0, 81, + 0, 0, 0, 461, 84, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 11, 0, 0, 0, + 0, 12, 0, 13, 14, 15, 16, 17, 18, 0, + 0, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 0, 0, 0, 0, 29, 30, 122, 32, 33, 0, + 0, 0, 0, 0, 35, 36, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, + 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, + 58, 59, 0, 0, 0, 0, 0, 0, 0, 63, + 64, 65, 66, 67, 68, 69, 0, 4, 5, 6, + 7, 8, 0, 0, 0, 73, 9, 0, 0, 0, + 0, 124, 75, 76, 77, 0, 0, 0, 79, 125, + 0, 0, 81, 0, 0, 0, 463, 84, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, + 0, 0, 0, 0, 12, 0, 13, 14, 15, 16, + 17, 18, 0, 0, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 0, 0, 0, 0, 29, 30, 122, + 32, 33, 0, 0, 0, 0, 0, 35, 36, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, + 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, + 0, 0, 0, 58, 59, 0, 0, 0, 0, 0, + 0, 0, 63, 64, 65, 66, 67, 68, 69, 0, + 4, 5, 6, 7, 8, 0, 0, 0, 73, 9, + 0, 0, 0, 0, 124, 75, 76, 77, 0, 0, + 0, 79, 125, 0, 0, 81, 0, 0, 0, 653, + 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 11, 0, 0, 0, 0, 12, 0, 13, + 14, 15, 16, 17, 18, 0, 0, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 0, 0, 0, 0, + 29, 30, 122, 32, 33, 0, 0, 0, 0, 0, + 35, 36, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 47, 0, 0, 0, 0, 0, 0, 0, 123, 0, + 0, 0, 0, 0, 0, 0, 58, 59, 0, 0, + 0, 0, 0, 0, 0, 63, 64, 65, 66, 67, + 68, 69, 0, 4, 5, 6, 7, 8, 0, 0, + 0, 73, 9, 0, 0, 0, 0, 124, 75, 76, + 77, 0, 0, 0, 79, 125, 0, 0, 81, 0, + 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10, 11, 0, 0, 0, 0, + 12, 0, 13, 14, 15, 16, 17, 18, 0, 0, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 0, + 0, 0, 0, 29, 30, 122, 32, 33, 0, 0, + 0, 0, 0, 35, 36, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, + 0, 123, 0, 0, 0, 0, 0, 0, 0, 58, + 59, 0, 0, 0, 0, 0, 0, 0, 63, 64, + 65, 66, 67, 68, 69, 0, 4, 5, 6, 7, + 8, 0, 0, 0, 73, 9, 0, 0, 0, 0, + 124, 75, 76, 77, 0, 0, 0, 79, 125, 0, + 0, 81, 0, 0, 0, 0, 84, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 10, 11, 0, + 0, 0, 0, 12, 0, 13, 14, 15, 16, 17, + 18, 0, 0, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 0, 0, 0, 0, 29, 30, 122, 32, + 33, 0, 0, 0, 0, 0, 35, 36, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, + 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, + 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, + 0, 63, 64, 65, 66, 67, 68, 69, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, + 0, 0, 0, 124, 75, 76, 77, 239, 240, 241, + 79, 80, 0, 0, 81, 0, 0, 0, 0, 84, + 0, 0, 0, 242, 0, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 0, 266, + 239, 240, 241, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 242, 0, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 0, 266, 239, 240, 241, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, + 0, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 0, 266, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 239, 240, 241, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 242, 523, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 0, 266, 239, + 240, 241, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 242, 567, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 0, 266, 0, 0, 239, 240, 241, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 611, + 242, 791, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 0, 266, 0, 0, 0, + 0, 0, 0, 0, 0, 239, 240, 241, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 242, 646, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 0, 266, 239, 240, + 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 242, 728, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 0, + 266, 239, 240, 241, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 242, 792, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 0, 266, 0, 0, 0, 0, 0, 0, + 0, 0, 239, 240, 241, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 242, 267, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 0, 266, 239, 240, 241, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 242, 332, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 0, 266, 239, 240, + 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 242, 333, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 0, + 266, 0, 0, 0, 0, 0, 0, 0, 0, 239, + 240, 241, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 242, 339, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 0, 266, 0, 239, 240, 241, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 372, 242, + 0, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 0, 266, 239, 240, 241, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 457, 242, 0, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 0, 266, 0, + 0, 0, 0, 0, 0, 239, 240, 241, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 242, 470, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 0, 266, 0, 239, + 240, 241, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 242, 471, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 0, 266, 239, 240, 241, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 242, 476, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 0, 266, 0, 0, 0, 0, 0, + 0, 239, 240, 241, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 242, 484, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 0, 266, 0, 239, 240, 241, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 242, 659, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 0, 266, 239, 240, + 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 242, 858, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 0, + 266, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 239, 240, 241, 0, + 0, 0, 0, 0, 879, 0, 0, 0, 0, 0, + 0, 0, 242, 302, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 0, 266, 485, + 486, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, + 487, 0, 0, 239, 240, 241, 0, 0, 29, 30, + 137, 0, 0, 0, 0, 0, 0, 0, 488, 242, + 552, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 0, 266, 138, 0, 0, 0, + 0, 0, 0, 0, 573, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 489, 65, 66, 67, 68, 69, + 0, 0, 0, 0, 0, 239, 240, 241, 0, 73, + 0, 0, 0, 0, 0, 490, 75, 76, 491, 0, + 0, 242, 79, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 0, 266, 240, 241, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 242, 0, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 242, 266, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 0, 266, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 0, 266, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 0, 266, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 0, 266 +}; + +static const yytype_int16 yycheck[] = +{ + 2, 126, 25, 25, 2, 2, 312, 49, 505, 14, + 15, 712, 195, 707, 477, 266, 176, 8, 217, 8, + 25, 2, 25, 238, 8, 8, 382, 26, 8, 8, + 8, 8, 594, 8, 8, 8, 8, 8, 80, 8, + 26, 538, 32, 81, 65, 636, 635, 52, 75, 107, + 77, 0, 54, 754, 65, 153, 65, 38, 65, 26, + 77, 98, 99, 161, 161, 65, 161, 153, 283, 74, + 285, 153, 77, 282, 147, 161, 161, 237, 65, 161, + 153, 75, 207, 298, 299, 161, 103, 77, 161, 32, + 161, 25, 115, 308, 53, 54, 311, 312, 65, 161, + 309, 159, 32, 141, 25, 461, 668, 463, 670, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 123, 713, 335, 284, 77, 286, 75, 165, 77, + 290, 291, 292, 77, 77, 140, 147, 349, 147, 166, + 182, 75, 75, 164, 77, 75, 169, 77, 335, 53, + 54, 156, 161, 164, 75, 164, 161, 164, 77, 75, + 369, 161, 349, 77, 164, 164, 75, 161, 77, 368, + 160, 164, 163, 867, 163, 164, 765, 163, 769, 163, + 163, 111, 75, 163, 163, 163, 163, 162, 162, 162, + 162, 162, 197, 162, 32, 129, 147, 202, 661, 161, + 901, 75, 153, 77, 32, 210, 211, 212, 129, 214, + 95, 216, 95, 75, 166, 238, 150, 160, 166, 153, + 150, 155, 166, 153, 226, 161, 98, 99, 162, 150, + 75, 161, 153, 166, 155, 238, 166, 153, 122, 77, + 75, 14, 15, 266, 266, 147, 160, 166, 164, 77, + 147, 153, 25, 161, 75, 164, 153, 166, 162, 163, + 283, 266, 285, 266, 161, 147, 162, 163, 153, 481, + 153, 153, 66, 485, 486, 298, 299, 75, 147, 161, + 283, 75, 285, 77, 153, 308, 162, 163, 311, 312, + 295, 153, 166, 165, 481, 298, 299, 653, 485, 486, + 487, 306, 553, 153, 161, 308, 122, 516, 311, 312, + 97, 98, 99, 163, 164, 150, 528, 111, 153, 97, + 98, 99, 161, 389, 75, 391, 77, 161, 370, 150, + 335, 129, 153, 70, 71, 161, 338, 342, 161, 548, + 549, 528, 70, 71, 349, 163, 164, 556, 557, 655, + 75, 560, 150, 14, 15, 153, 150, 155, 164, 153, + 111, 47, 48, 49, 366, 51, 75, 161, 366, 366, + 14, 15, 166, 75, 75, 77, 399, 382, 163, 32, + 65, 147, 161, 156, 389, 366, 391, 147, 65, 394, + 126, 65, 65, 576, 891, 65, 579, 65, 103, 150, + 612, 153, 153, 51, 564, 49, 153, 590, 66, 111, + 161, 167, 147, 164, 601, 166, 147, 8, 147, 725, + 153, 153, 103, 161, 429, 612, 128, 147, 126, 202, + 111, 112, 113, 114, 115, 116, 80, 210, 211, 212, + 655, 214, 44, 45, 46, 47, 48, 49, 150, 51, + 87, 153, 75, 163, 666, 13, 461, 163, 463, 161, + 672, 13, 674, 162, 166, 162, 162, 533, 75, 75, + 75, 77, 124, 124, 479, 480, 481, 161, 167, 666, + 485, 486, 487, 161, 167, 672, 491, 674, 648, 649, + 471, 163, 8, 266, 95, 476, 13, 680, 75, 77, + 505, 506, 483, 508, 716, 111, 161, 512, 513, 163, + 725, 161, 156, 162, 161, 75, 518, 77, 8, 162, + 518, 518, 162, 528, 13, 530, 125, 161, 533, 716, + 553, 553, 164, 538, 539, 161, 167, 518, 182, 161, + 167, 162, 161, 161, 150, 161, 75, 153, 553, 161, + 553, 111, 167, 167, 167, 161, 167, 153, 202, 771, + 166, 147, 335, 75, 630, 162, 210, 211, 212, 13, + 214, 163, 13, 162, 162, 8, 349, 153, 162, 164, + 585, 8, 65, 795, 771, 65, 126, 799, 163, 127, + 150, 13, 804, 153, 163, 163, 601, 602, 8, 127, + 783, 161, 167, 75, 816, 161, 166, 612, 795, 382, + 793, 164, 799, 679, 162, 162, 162, 804, 163, 77, + 13, 626, 109, 162, 126, 630, 162, 810, 694, 816, + 635, 814, 655, 167, 77, 847, 162, 820, 162, 162, + 823, 853, 163, 162, 162, 828, 75, 162, 653, 832, + 26, 161, 655, 13, 167, 657, 429, 662, 660, 871, + 847, 666, 167, 161, 163, 667, 853, 672, 162, 674, + 163, 163, 127, 77, 679, 13, 13, 75, 164, 862, + 164, 13, 807, 161, 871, 26, 104, 72, 461, 694, + 463, 109, 163, 111, 112, 113, 114, 115, 116, 117, + 162, 164, 725, 77, 706, 13, 479, 480, 481, 77, + 893, 716, 485, 486, 487, 111, 112, 113, 114, 115, + 116, 904, 725, 13, 163, 95, 370, 164, 163, 165, + 95, 154, 163, 506, 800, 508, 802, 13, 382, 512, + 513, 147, 75, 163, 75, 161, 26, 165, 77, 163, + 75, 753, 733, 75, 8, 528, 607, 162, 739, 740, + 765, 342, 506, 607, 533, 104, 771, 586, 662, 539, + 109, 837, 111, 112, 113, 114, 115, 116, 117, 740, + 553, 527, 790, 347, 837, 429, 629, 81, 643, 601, + 795, 600, 513, 685, 799, 800, 512, 802, 215, 804, + 202, 782, 868, -1, -1, 775, -1, 14, 15, -1, + -1, 816, 585, -1, -1, -1, -1, 461, 25, 463, + -1, -1, -1, -1, 826, -1, 165, 829, 601, -1, + -1, 897, 837, -1, -1, 479, 480, -1, -1, 612, + -1, -1, 847, -1, -1, -1, 848, -1, 853, -1, + 852, -1, -1, -1, 856, -1, -1, 859, -1, 861, + -1, 863, 506, 868, 508, -1, 871, -1, 512, 513, + -1, -1, -1, -1, -1, -1, -1, 858, -1, -1, + 653, 883, -1, -1, -1, -1, 891, -1, -1, 662, + -1, -1, 897, 666, -1, -1, -1, 899, -1, 672, + -1, 674, -1, -1, 906, -1, -1, -1, -1, -1, + -1, -1, 4, 5, -1, 7, 8, 9, 10, 11, + 12, 13, -1, -1, 16, 17, 18, 19, 20, 21, + 22, 23, 24, -1, 26, -1, -1, -1, -1, -1, + -1, 585, -1, 716, -1, 37, -1, -1, -1, 156, + -1, -1, 44, 45, -1, -1, -1, 49, -1, 51, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, -1, -1, -1, -1, 80, 81, + -1, -1, -1, -1, -1, 202, -1, -1, 771, -1, + 53, 54, -1, 210, 211, 212, -1, 214, -1, 653, + -1, -1, 53, 54, -1, -1, -1, -1, 662, -1, + -1, -1, 795, -1, -1, -1, 799, -1, -1, -1, + -1, 804, -1, -1, -1, -1, -1, 129, -1, -1, + -1, -1, -1, 816, -1, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, -1, -1, 266, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, -1, -1, 847, -1, -1, -1, -1, 171, + 853, 173, -1, 175, 176, 53, 54, -1, 180, 181, + 182, -1, 184, -1, -1, -1, -1, -1, 871, -1, + 53, 54, -1, -1, -1, -1, -1, -1, -1, 162, + 163, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 163, 215, -1, -1, -1, 95, -1, -1, + -1, -1, -1, -1, -1, 227, -1, 229, -1, -1, + -1, -1, -1, -1, -1, 237, -1, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, -1, 382, -1, -1, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, -1, 284, -1, 286, 287, -1, -1, 290, 291, + 292, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 302, -1, 304, 11, -1, -1, -1, 309, -1, -1, + -1, -1, 429, -1, -1, -1, -1, 25, 320, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 344, 51, 461, -1, 463, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, -1, + 51, -1, 479, 480, -1, -1, -1, 369, 370, 3, + 4, 5, 6, 7, -1, -1, -1, -1, 12, -1, + -1, 383, -1, -1, -1, -1, -1, -1, -1, 506, + -1, 508, -1, -1, -1, 512, 513, -1, 32, -1, + -1, 403, -1, -1, -1, -1, -1, -1, -1, -1, + 44, 45, -1, -1, -1, -1, 50, -1, 52, 53, + 54, 55, 56, 57, -1, -1, 60, 61, 62, 63, + 64, 65, 66, 67, 68, -1, 553, -1, -1, 73, + 74, 75, 76, 77, -1, 447, -1, -1, -1, 83, + 84, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 585, 103, + -1, -1, -1, 475, -1, 477, 478, 111, -1, -1, + -1, -1, -1, -1, -1, 119, 120, -1, -1, -1, + -1, -1, -1, -1, 128, 129, 130, 131, 132, 133, + 134, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, 516, -1, 150, 151, 152, 153, + -1, -1, -1, 157, 158, 527, 160, 161, -1, -1, + -1, -1, 166, -1, -1, -1, 653, -1, -1, -1, + -1, -1, -1, -1, -1, 662, 548, 549, -1, -1, + 552, -1, -1, -1, 556, 557, -1, -1, 560, -1, + -1, -1, 564, 565, -1, -1, -1, -1, -1, -1, + -1, 573, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, -1, + 51, 3, 4, 5, 6, 7, -1, -1, -1, -1, + 12, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 619, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 44, 45, -1, -1, -1, -1, 50, -1, + 52, 53, 54, 55, 56, 57, 648, 649, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, -1, 661, + -1, 73, 74, 75, 76, 77, -1, 79, -1, -1, + -1, 83, 84, 85, 86, 87, -1, 89, -1, 91, + -1, 93, -1, -1, 96, -1, -1, -1, 100, 101, + 102, 103, 104, 105, 106, -1, 108, 109, 110, 111, + 112, 113, -1, -1, -1, -1, 118, 119, 120, 121, + 122, 123, -1, -1, -1, -1, 128, 129, 130, 131, + 132, 133, 134, -1, -1, 137, 138, -1, 140, -1, + -1, -1, 144, -1, -1, -1, -1, -1, 150, 151, + 152, 153, -1, 745, 156, 157, 158, -1, -1, 161, + -1, 163, 164, 165, 166, -1, -1, -1, -1, -1, + -1, 3, 4, 5, 6, 7, -1, -1, -1, -1, + 12, -1, -1, -1, -1, -1, -1, 779, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, -1, + 51, -1, 44, 45, -1, -1, -1, -1, 50, -1, + 52, 53, 54, 55, 56, 57, -1, 819, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, -1, -1, + -1, 73, 74, 75, 76, 77, -1, 79, -1, -1, + -1, 83, 84, 85, 86, 87, -1, 89, -1, 91, + -1, 93, -1, -1, 96, -1, -1, -1, 100, 101, + 102, 103, 104, 105, 106, -1, 108, 109, 110, 111, + 112, 113, -1, -1, -1, -1, 118, 119, 120, 121, + 122, 123, -1, -1, -1, -1, 128, 129, 130, 131, + 132, 133, 134, -1, -1, 137, 138, -1, 140, -1, + -1, -1, 144, 3, 4, 5, 6, 7, 150, 151, + 152, 153, 12, -1, 156, 157, 158, -1, -1, 161, + -1, 163, 164, 165, 166, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, -1, 51, 44, 45, -1, -1, -1, -1, + 50, -1, 52, 53, 54, 55, 56, 57, -1, -1, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + -1, -1, -1, 73, 74, 75, 76, 77, -1, 79, + -1, -1, -1, 83, 84, 85, 86, 87, -1, 89, + -1, 91, -1, 93, -1, -1, 96, -1, -1, -1, + 100, 101, 102, 103, 104, 105, 106, -1, 108, 109, + 110, 111, 112, 113, -1, -1, -1, -1, 118, 119, + 120, 121, 122, 123, -1, -1, -1, -1, 128, 129, + 130, 131, 132, 133, 134, -1, -1, 137, 138, -1, + 140, -1, -1, -1, 144, 3, 4, 5, 6, 7, + 150, 151, 152, 153, 12, -1, 156, 157, 158, -1, + -1, 161, -1, 163, 164, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, + -1, -1, 50, -1, 52, 53, 54, 55, 56, 57, + -1, -1, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, -1, -1, -1, 73, 74, 75, 76, 77, + -1, 79, -1, -1, -1, 83, 84, 85, 86, 87, + -1, 89, -1, 91, -1, 93, -1, -1, 96, -1, + -1, -1, 100, 101, 102, 103, -1, 105, 106, -1, + 108, -1, 110, 111, 112, 113, -1, -1, -1, -1, + 118, 119, 120, 121, 122, 123, -1, -1, -1, -1, + 128, 129, 130, 131, 132, 133, 134, -1, -1, 137, + 138, -1, 140, -1, -1, -1, 144, 3, 4, 5, + 6, 7, 150, 151, 152, 153, 12, -1, 156, 157, + 158, -1, -1, 161, -1, 163, 164, 165, 166, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, + -1, -1, -1, -1, 50, -1, 52, 53, 54, 55, + 56, 57, -1, -1, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, -1, -1, -1, 73, 74, 75, + 76, 77, -1, 79, -1, -1, -1, 83, 84, 85, + 86, 87, -1, 89, -1, 91, -1, 93, -1, -1, + 96, -1, -1, -1, 100, 101, 102, 103, -1, 105, + 106, -1, 108, -1, 110, 111, 112, 113, -1, -1, + -1, -1, 118, 119, 120, 121, 122, 123, -1, -1, + -1, -1, 128, 129, 130, 131, 132, 133, 134, -1, + -1, 137, 138, -1, 140, -1, -1, -1, 144, 3, + 4, 5, 6, 7, 150, 151, 152, 153, 12, -1, + 156, 157, 158, -1, -1, 161, -1, 163, 164, 165, + 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 44, 45, -1, -1, -1, -1, 50, -1, 52, 53, + 54, 55, 56, 57, -1, -1, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, -1, -1, -1, 73, + 74, 75, 76, 77, -1, 79, -1, -1, -1, 83, + 84, 85, 86, 87, 88, 89, -1, 91, -1, 93, + -1, -1, 96, -1, -1, -1, 100, 101, 102, 103, + -1, 105, 106, -1, 108, -1, 110, 111, 112, 113, + -1, -1, -1, -1, 118, 119, 120, 121, 122, 123, + -1, -1, -1, -1, 128, 129, 130, 131, 132, 133, + 134, -1, -1, 137, 138, -1, 140, -1, -1, -1, + 144, 3, 4, 5, 6, 7, 150, 151, 152, 153, + 12, -1, 156, 157, 158, -1, -1, 161, -1, 163, + 164, -1, 166, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 44, 45, -1, -1, -1, -1, 50, -1, + 52, 53, 54, 55, 56, 57, -1, -1, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, -1, -1, + -1, 73, 74, 75, 76, 77, -1, 79, -1, -1, + -1, 83, 84, 85, 86, 87, -1, 89, -1, 91, + -1, 93, 94, -1, 96, -1, -1, -1, 100, 101, + 102, 103, -1, 105, 106, -1, 108, -1, 110, 111, + 112, 113, -1, -1, -1, -1, 118, 119, 120, 121, + 122, 123, -1, -1, -1, -1, 128, 129, 130, 131, + 132, 133, 134, -1, -1, 137, 138, -1, 140, -1, + -1, -1, 144, 3, 4, 5, 6, 7, 150, 151, + 152, 153, 12, -1, 156, 157, 158, -1, -1, 161, + -1, 163, 164, -1, 166, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 44, 45, -1, -1, -1, -1, + 50, -1, 52, 53, 54, 55, 56, 57, -1, -1, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + -1, -1, -1, 73, 74, 75, 76, 77, -1, 79, + -1, -1, -1, 83, 84, 85, 86, 87, -1, 89, + -1, 91, -1, 93, -1, -1, 96, -1, -1, -1, + 100, 101, 102, 103, -1, 105, 106, -1, 108, -1, + 110, 111, 112, 113, -1, -1, -1, -1, 118, 119, + 120, 121, 122, 123, -1, -1, -1, -1, 128, 129, + 130, 131, 132, 133, 134, -1, -1, 137, 138, -1, + 140, -1, -1, -1, 144, 3, 4, 5, 6, 7, + 150, 151, 152, 153, 12, -1, 156, 157, 158, -1, + -1, 161, -1, 163, 164, 165, 166, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, + -1, -1, 50, -1, 52, 53, 54, 55, 56, 57, + -1, -1, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, -1, -1, -1, 73, 74, 75, 76, 77, + -1, 79, -1, -1, -1, 83, 84, 85, 86, 87, + -1, 89, -1, 91, 92, 93, -1, -1, 96, -1, + -1, -1, 100, 101, 102, 103, -1, 105, 106, -1, + 108, -1, 110, 111, 112, 113, -1, -1, -1, -1, + 118, 119, 120, 121, 122, 123, -1, -1, -1, -1, + 128, 129, 130, 131, 132, 133, 134, -1, -1, 137, + 138, -1, 140, -1, -1, -1, 144, 3, 4, 5, + 6, 7, 150, 151, 152, 153, 12, -1, 156, 157, + 158, -1, -1, 161, -1, 163, 164, -1, 166, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, + -1, -1, -1, -1, 50, -1, 52, 53, 54, 55, + 56, 57, -1, -1, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, -1, -1, -1, 73, 74, 75, + 76, 77, -1, 79, -1, -1, -1, 83, 84, 85, + 86, 87, -1, 89, -1, 91, -1, 93, -1, -1, + 96, -1, -1, -1, 100, 101, 102, 103, -1, 105, + 106, -1, 108, -1, 110, 111, 112, 113, -1, -1, + -1, -1, 118, 119, 120, 121, 122, 123, -1, -1, + -1, -1, 128, 129, 130, 131, 132, 133, 134, -1, + -1, 137, 138, -1, 140, -1, -1, -1, 144, 3, + 4, 5, 6, 7, 150, 151, 152, 153, 12, -1, + 156, 157, 158, -1, -1, 161, -1, 163, 164, 165, + 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 44, 45, -1, -1, -1, -1, 50, -1, 52, 53, + 54, 55, 56, 57, -1, -1, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, -1, -1, -1, 73, + 74, 75, 76, 77, -1, 79, -1, -1, -1, 83, + 84, 85, 86, 87, -1, 89, -1, 91, -1, 93, + -1, -1, 96, -1, -1, -1, 100, 101, 102, 103, + -1, 105, 106, -1, 108, -1, 110, 111, 112, 113, + -1, -1, -1, -1, 118, 119, 120, 121, 122, 123, + -1, -1, -1, -1, 128, 129, 130, 131, 132, 133, + 134, -1, -1, 137, 138, -1, 140, -1, -1, -1, + 144, 3, 4, 5, 6, 7, 150, 151, 152, 153, + 12, -1, 156, 157, 158, -1, -1, 161, -1, 163, + 164, 165, 166, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 44, 45, -1, -1, -1, -1, 50, -1, + 52, 53, 54, 55, 56, 57, -1, -1, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, -1, -1, + -1, 73, 74, 75, 76, 77, -1, 79, -1, -1, + -1, 83, 84, 85, 86, 87, -1, 89, 90, 91, + -1, 93, -1, -1, 96, -1, -1, -1, 100, 101, + 102, 103, -1, 105, 106, -1, 108, -1, 110, 111, + 112, 113, -1, -1, -1, -1, 118, 119, 120, 121, + 122, 123, -1, -1, -1, -1, 128, 129, 130, 131, + 132, 133, 134, -1, -1, 137, 138, -1, 140, -1, + -1, -1, 144, 3, 4, 5, 6, 7, 150, 151, + 152, 153, 12, -1, 156, 157, 158, -1, -1, 161, + -1, 163, 164, -1, 166, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 44, 45, -1, -1, -1, -1, + 50, -1, 52, 53, 54, 55, 56, 57, -1, -1, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + -1, -1, -1, 73, 74, 75, 76, 77, -1, 79, + -1, -1, -1, 83, 84, 85, 86, 87, -1, 89, + -1, 91, -1, 93, -1, -1, 96, -1, -1, -1, + 100, 101, 102, 103, -1, 105, 106, -1, 108, -1, + 110, 111, 112, 113, -1, -1, -1, -1, 118, 119, + 120, 121, 122, 123, -1, -1, -1, -1, 128, 129, + 130, 131, 132, 133, 134, -1, -1, 137, 138, -1, + 140, -1, -1, -1, 144, 3, 4, 5, 6, 7, + 150, 151, 152, 153, 12, -1, 156, 157, 158, -1, + -1, 161, -1, 163, 164, 165, 166, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, + -1, -1, 50, -1, 52, 53, 54, 55, 56, 57, + -1, -1, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, -1, -1, -1, 73, 74, 75, 76, 77, + -1, 79, -1, -1, -1, 83, 84, 85, 86, 87, + -1, 89, -1, 91, -1, 93, -1, -1, 96, -1, + -1, -1, 100, 101, 102, 103, -1, 105, 106, -1, + 108, -1, 110, 111, 112, 113, -1, -1, -1, -1, + 118, 119, 120, 121, 122, 123, -1, -1, -1, -1, + 128, 129, 130, 131, 132, 133, 134, -1, -1, 137, + 138, -1, 140, -1, -1, -1, 144, 3, 4, 5, + 6, 7, 150, 151, 152, 153, 12, -1, 156, 157, + 158, -1, -1, 161, -1, 163, 164, 165, 166, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, + -1, -1, -1, -1, 50, -1, 52, 53, 54, 55, + 56, 57, -1, -1, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, -1, -1, -1, 73, 74, 75, + 76, 77, -1, 79, -1, -1, -1, 83, 84, 85, + 86, 87, -1, 89, -1, 91, -1, 93, -1, -1, + 96, -1, -1, -1, 100, 101, 102, 103, -1, 105, + 106, -1, 108, -1, 110, 111, 112, 113, -1, -1, + -1, -1, 118, 119, 120, 121, 122, 123, -1, -1, + -1, -1, 128, 129, 130, 131, 132, 133, 134, -1, + -1, 137, 138, -1, 140, -1, -1, -1, 144, 3, + 4, 5, 6, 7, 150, 151, 152, 153, 12, -1, + 156, 157, 158, -1, -1, 161, -1, 163, 164, 165, + 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 44, 45, -1, -1, -1, -1, 50, -1, 52, 53, + 54, 55, 56, 57, -1, -1, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, -1, -1, -1, 73, + 74, 75, 76, 77, -1, 79, -1, -1, -1, 83, + 84, 85, 86, 87, -1, 89, -1, 91, -1, 93, + -1, -1, 96, -1, -1, -1, 100, 101, 102, 103, + -1, 105, 106, -1, 108, -1, 110, 111, 112, 113, + -1, -1, -1, -1, 118, 119, 120, 121, 122, 123, + -1, -1, -1, -1, 128, 129, 130, 131, 132, 133, + 134, -1, -1, 137, 138, -1, 140, -1, -1, -1, + 144, 3, 4, 5, 6, 7, 150, 151, 152, 153, + 12, -1, 156, 157, 158, -1, -1, 161, -1, 163, + 164, -1, 166, -1, 26, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 44, 45, -1, -1, -1, -1, 50, -1, + 52, 53, 54, 55, 56, 57, -1, -1, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, -1, -1, + -1, 73, 74, 75, 76, 77, -1, 79, -1, -1, + -1, 83, 84, 85, 86, 87, -1, 89, -1, 91, + -1, 93, -1, -1, 96, -1, -1, -1, 100, 101, + 102, 103, -1, 105, 106, -1, 108, -1, 110, 111, + -1, -1, -1, -1, -1, -1, 118, 119, 120, -1, + -1, -1, -1, -1, -1, -1, 128, 129, 130, 131, + 132, 133, 134, -1, -1, 137, 138, -1, 140, -1, + -1, -1, 144, 3, 4, 5, 6, 7, 150, 151, + 152, 153, 12, -1, -1, 157, 158, -1, -1, 161, + -1, 163, 164, -1, 166, -1, 26, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 44, 45, -1, -1, -1, -1, + 50, -1, 52, 53, 54, 55, 56, 57, -1, -1, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + -1, -1, -1, 73, 74, 75, 76, 77, -1, 79, + -1, -1, -1, 83, 84, 85, 86, 87, -1, 89, + -1, 91, -1, 93, -1, -1, 96, -1, -1, -1, + 100, 101, 102, 103, -1, 105, 106, -1, 108, -1, + 110, 111, -1, -1, -1, -1, -1, -1, 118, 119, + 120, -1, -1, -1, -1, -1, -1, -1, 128, 129, + 130, 131, 132, 133, 134, -1, -1, 137, 138, -1, + 140, -1, -1, -1, 144, 3, 4, 5, 6, 7, + 150, 151, 152, 153, 12, -1, -1, 157, 158, -1, + -1, 161, -1, 163, 164, -1, 166, -1, 26, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, + -1, -1, 50, -1, 52, 53, 54, 55, 56, 57, + -1, -1, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, -1, -1, -1, 73, 74, 75, 76, 77, + -1, 79, -1, -1, -1, 83, 84, 85, 86, 87, + -1, 89, -1, 91, -1, 93, -1, -1, 96, -1, + -1, -1, 100, 101, 102, 103, -1, 105, 106, -1, + 108, -1, 110, 111, -1, -1, -1, -1, -1, -1, + 118, 119, 120, -1, -1, -1, -1, -1, -1, -1, + 128, 129, 130, 131, 132, 133, 134, -1, -1, 137, + 138, -1, 140, -1, -1, -1, 144, 3, 4, 5, + 6, 7, 150, 151, 152, 153, 12, -1, -1, 157, + 158, -1, -1, 161, -1, 163, 164, -1, 166, -1, + 26, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, + -1, -1, -1, -1, 50, -1, 52, 53, 54, 55, + 56, 57, -1, -1, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, -1, -1, -1, 73, 74, 75, + 76, 77, -1, 79, -1, -1, -1, 83, 84, 85, + 86, 87, -1, 89, -1, 91, -1, 93, -1, -1, + 96, -1, -1, -1, 100, 101, 102, 103, -1, 105, + 106, -1, 108, -1, 110, 111, -1, -1, -1, -1, + -1, -1, 118, 119, 120, -1, -1, -1, -1, -1, + -1, -1, 128, 129, 130, 131, 132, 133, 134, -1, + -1, 137, 138, -1, 140, -1, -1, -1, 144, 3, + 4, 5, 6, 7, 150, 151, 152, 153, 12, -1, + -1, 157, 158, -1, -1, 161, -1, 163, 164, -1, + 166, -1, 26, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 44, 45, -1, -1, -1, -1, 50, -1, 52, 53, + 54, 55, 56, 57, -1, -1, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, -1, -1, -1, 73, + 74, 75, 76, 77, -1, 79, -1, -1, -1, 83, + 84, 85, 86, 87, -1, 89, -1, 91, -1, 93, + -1, -1, 96, -1, -1, -1, 100, 101, 102, 103, + -1, 105, 106, -1, 108, -1, 110, 111, -1, -1, + -1, -1, -1, -1, 118, 119, 120, -1, -1, -1, + -1, -1, -1, -1, 128, 129, 130, 131, 132, 133, + 134, -1, -1, 137, 138, -1, 140, -1, -1, -1, + 144, 3, 4, 5, 6, 7, 150, 151, 152, 153, + 12, -1, -1, 157, 158, -1, -1, 161, -1, 163, + 164, -1, 166, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 44, 45, -1, -1, -1, -1, 50, -1, + 52, 53, 54, 55, 56, 57, -1, -1, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, -1, -1, + -1, 73, 74, 75, 76, 77, -1, 79, -1, -1, + -1, 83, 84, 85, 86, 87, -1, 89, -1, 91, + -1, 93, -1, -1, 96, -1, -1, -1, 100, 101, + 102, 103, -1, 105, 106, -1, 108, -1, 110, 111, + -1, -1, -1, -1, -1, -1, 118, 119, 120, -1, + -1, -1, -1, -1, -1, -1, 128, 129, 130, 131, + 132, 133, 134, -1, -1, 137, 138, -1, 140, -1, + -1, -1, 144, 3, 4, 5, 6, 7, 150, 151, + 152, 153, 12, -1, -1, 157, 158, -1, -1, 161, + -1, 163, 164, -1, 166, -1, -1, -1, -1, -1, + -1, -1, 32, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 44, 45, -1, -1, -1, -1, + 50, -1, 52, 53, 54, 55, 56, 57, -1, -1, + 60, 61, 62, 63, 64, 65, 66, 67, 68, -1, + -1, -1, -1, 73, 74, 75, 76, 77, -1, -1, + -1, -1, -1, 83, 84, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 103, 51, -1, -1, -1, -1, -1, + -1, 111, -1, -1, -1, -1, -1, -1, -1, 119, + 120, -1, -1, -1, -1, -1, -1, -1, 128, 129, + 130, 131, 132, 133, 134, -1, 3, 4, 5, 6, + 7, -1, -1, -1, 144, 12, -1, -1, -1, -1, + 150, 151, 152, 153, -1, -1, -1, 157, 158, -1, + -1, 161, -1, -1, -1, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, + -1, -1, -1, 50, -1, 52, 53, 54, 55, 56, + 57, -1, -1, 60, 61, 62, 63, 64, 65, 66, + 67, 68, -1, -1, -1, -1, 73, 74, 75, 76, + 77, -1, -1, -1, -1, -1, 83, 84, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 103, -1, -1, -1, + -1, -1, -1, -1, 111, -1, -1, -1, -1, -1, + -1, -1, 119, 120, -1, -1, -1, -1, -1, -1, + -1, 128, 129, 130, 131, 132, 133, 134, -1, 3, + 4, 5, 6, 7, -1, -1, -1, 144, 12, -1, + -1, -1, -1, 150, 151, 152, 153, -1, -1, -1, + 157, 158, -1, -1, 161, -1, 163, -1, -1, 166, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 44, 45, -1, -1, -1, -1, 50, -1, 52, 53, + 54, 55, 56, 57, -1, -1, 60, 61, 62, 63, + 64, 65, 66, 67, 68, -1, -1, -1, -1, 73, + 74, 75, 76, 77, -1, -1, -1, -1, -1, 83, + 84, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 103, + -1, -1, -1, -1, -1, -1, -1, 111, -1, -1, + -1, -1, -1, -1, -1, 119, 120, -1, -1, -1, + -1, -1, -1, -1, 128, 129, 130, 131, 132, 133, + 134, -1, 3, 4, 5, 6, 7, -1, -1, -1, + 144, 12, -1, -1, -1, -1, 150, 151, 152, 153, + -1, -1, -1, 157, 158, -1, -1, 161, -1, 163, + -1, -1, 166, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 44, 45, -1, -1, -1, -1, 50, + -1, 52, 53, 54, 55, 56, 57, -1, -1, 60, + 61, 62, 63, 64, 65, 66, 67, 68, -1, -1, + -1, -1, 73, 74, 75, 76, 77, -1, -1, -1, + -1, -1, 83, 84, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 103, -1, -1, -1, -1, -1, -1, -1, + 111, -1, -1, -1, -1, -1, -1, -1, 119, 120, + -1, -1, -1, -1, -1, -1, -1, 128, 129, 130, + 131, 132, 133, 134, -1, 3, 4, 5, 6, 7, + -1, -1, -1, 144, 12, -1, -1, -1, -1, 150, + 151, 152, 153, -1, -1, -1, 157, 158, -1, -1, + 161, -1, 163, -1, -1, 166, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, + -1, -1, 50, -1, 52, 53, 54, 55, 56, 57, + -1, -1, 60, 61, 62, 63, 64, 65, 66, 67, + 68, -1, -1, -1, -1, 73, 74, 75, 76, 77, + -1, -1, -1, -1, -1, 83, 84, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 103, -1, -1, -1, -1, + -1, -1, -1, 111, -1, -1, -1, -1, -1, -1, + -1, 119, 120, -1, -1, -1, -1, -1, -1, -1, + 128, 129, 130, 131, 132, 133, 134, -1, 3, 4, + 5, 6, 7, -1, -1, -1, 144, 12, -1, -1, + -1, -1, 150, 151, 152, 153, -1, -1, -1, 157, + 158, 26, -1, 161, 162, -1, -1, -1, 166, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, + 45, -1, -1, -1, -1, 50, -1, 52, 53, 54, + 55, 56, 57, -1, -1, 60, 61, 62, 63, 64, + 65, 66, 67, 68, -1, -1, -1, -1, 73, 74, + 75, 76, 77, -1, -1, -1, -1, -1, 83, 84, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 103, -1, + -1, -1, -1, -1, -1, -1, 111, -1, -1, -1, + -1, -1, -1, -1, 119, 120, -1, -1, -1, -1, + -1, -1, -1, 128, 129, 130, 131, 132, 133, 134, + -1, 3, 4, 5, 6, 7, -1, -1, -1, 144, + 12, -1, -1, -1, -1, 150, 151, 152, 153, -1, + -1, -1, 157, 158, -1, -1, 161, -1, -1, -1, + 32, 166, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 44, 45, -1, -1, -1, -1, 50, -1, + 52, 53, 54, 55, 56, 57, -1, -1, 60, 61, + 62, 63, 64, 65, 66, 67, 68, -1, -1, -1, + -1, 73, 74, 75, 76, 77, -1, -1, -1, -1, + -1, 83, 84, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 103, -1, -1, -1, -1, -1, -1, -1, 111, + -1, -1, -1, -1, -1, -1, -1, 119, 120, -1, + -1, -1, -1, -1, -1, -1, 128, 129, 130, 131, + 132, 133, 134, -1, 3, 4, 5, 6, 7, -1, + -1, -1, 144, 12, -1, -1, -1, -1, 150, 151, + 152, 153, -1, -1, -1, 157, 158, -1, -1, 161, + -1, -1, -1, 32, 166, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 44, 45, -1, -1, -1, + -1, 50, -1, 52, 53, 54, 55, 56, 57, -1, + -1, 60, 61, 62, 63, 64, 65, 66, 67, 68, + -1, -1, -1, -1, 73, 74, 75, 76, 77, -1, + -1, -1, -1, -1, 83, 84, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 103, -1, -1, -1, -1, -1, + -1, -1, 111, -1, -1, -1, -1, -1, -1, -1, + 119, 120, -1, -1, -1, -1, -1, -1, -1, 128, + 129, 130, 131, 132, 133, 134, -1, 3, 4, 5, + 6, 7, -1, -1, -1, 144, 12, -1, -1, -1, + -1, 150, 151, 152, 153, -1, -1, -1, 157, 158, + -1, -1, 161, -1, -1, -1, 32, 166, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, + -1, -1, -1, -1, 50, -1, 52, 53, 54, 55, + 56, 57, -1, -1, 60, 61, 62, 63, 64, 65, + 66, 67, 68, -1, -1, -1, -1, 73, 74, 75, + 76, 77, -1, -1, -1, -1, -1, 83, 84, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 103, -1, -1, + -1, -1, -1, -1, -1, 111, -1, -1, -1, -1, + -1, -1, -1, 119, 120, -1, -1, -1, -1, -1, + -1, -1, 128, 129, 130, 131, 132, 133, 134, -1, + 3, 4, 5, 6, 7, -1, -1, -1, 144, 12, + -1, -1, -1, -1, 150, 151, 152, 153, -1, -1, + -1, 157, 158, -1, -1, 161, -1, -1, -1, 32, + 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 44, 45, -1, -1, -1, -1, 50, -1, 52, + 53, 54, 55, 56, 57, -1, -1, 60, 61, 62, + 63, 64, 65, 66, 67, 68, -1, -1, -1, -1, + 73, 74, 75, 76, 77, -1, -1, -1, -1, -1, + 83, 84, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 103, -1, -1, -1, -1, -1, -1, -1, 111, -1, + -1, -1, -1, -1, -1, -1, 119, 120, -1, -1, + -1, -1, -1, -1, -1, 128, 129, 130, 131, 132, + 133, 134, -1, 3, 4, 5, 6, 7, -1, -1, + -1, 144, 12, -1, -1, -1, -1, 150, 151, 152, + 153, -1, -1, -1, 157, 158, -1, -1, 161, -1, + -1, -1, -1, 166, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 44, 45, -1, -1, -1, -1, + 50, -1, 52, 53, 54, 55, 56, 57, -1, -1, + 60, 61, 62, 63, 64, 65, 66, 67, 68, -1, + -1, -1, -1, 73, 74, 75, 76, 77, -1, -1, + -1, -1, -1, 83, 84, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 103, -1, -1, -1, -1, -1, -1, + -1, 111, -1, -1, -1, -1, -1, -1, -1, 119, + 120, -1, -1, -1, -1, -1, -1, -1, 128, 129, + 130, 131, 132, 133, 134, -1, 3, 4, 5, 6, + 7, -1, -1, -1, 144, 12, -1, -1, -1, -1, + 150, 151, 152, 153, -1, -1, -1, 157, 158, -1, + -1, 161, -1, -1, -1, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, + -1, -1, -1, 50, -1, 52, 53, 54, 55, 56, + 57, -1, -1, 60, 61, 62, 63, 64, 65, 66, + 67, 68, -1, -1, -1, -1, 73, 74, 75, 76, + 77, -1, -1, -1, -1, -1, 83, 84, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 103, -1, -1, -1, + -1, -1, -1, -1, 111, -1, -1, -1, -1, -1, + -1, -1, 119, 120, -1, -1, -1, -1, -1, -1, + -1, 128, 129, 130, 131, 132, 133, 134, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, 150, 151, 152, 153, 9, 10, 11, + 157, 158, -1, -1, 161, -1, -1, -1, -1, 166, + -1, -1, -1, 25, -1, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, -1, 51, + 9, 10, 11, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 25, -1, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, -1, 51, 9, 10, 11, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, + -1, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, -1, 51, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 9, 10, 11, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 25, 165, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, -1, 51, 9, + 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 25, 165, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + -1, 51, -1, -1, 9, 10, 11, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 165, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, -1, 51, -1, -1, -1, + -1, -1, -1, -1, -1, 9, 10, 11, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 25, 165, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, -1, 51, 9, 10, + 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 25, 165, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, -1, + 51, 9, 10, 11, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 25, 163, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, -1, 51, -1, -1, -1, -1, -1, -1, + -1, -1, 9, 10, 11, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 25, 163, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, -1, 51, 9, 10, 11, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 25, 163, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, -1, 51, 9, 10, + 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 25, 163, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, -1, + 51, -1, -1, -1, -1, -1, -1, -1, -1, 9, + 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 25, 163, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + -1, 51, -1, 9, 10, 11, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 162, 25, + -1, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, -1, 51, 9, 10, 11, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 162, 25, -1, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, -1, 51, -1, + -1, -1, -1, -1, -1, 9, 10, 11, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 25, 162, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, -1, 51, -1, 9, + 10, 11, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 25, 162, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + -1, 51, 9, 10, 11, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 25, 162, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, -1, 51, -1, -1, -1, -1, -1, + -1, 9, 10, 11, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 25, 162, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, -1, 51, -1, 9, 10, 11, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 25, 162, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, -1, 51, 9, 10, + 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 25, 162, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, -1, + 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 9, 10, 11, -1, + -1, -1, -1, -1, 162, -1, -1, -1, -1, -1, + -1, -1, 25, 127, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, -1, 51, 44, + 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 127, -1, -1, -1, + 65, -1, -1, 9, 10, 11, -1, -1, 73, 74, + 75, -1, -1, -1, -1, -1, -1, -1, 83, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, -1, 51, 111, -1, -1, -1, + -1, -1, -1, -1, 127, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 129, 130, 131, 132, 133, 134, + -1, -1, -1, -1, -1, 9, 10, 11, -1, 144, + -1, -1, -1, -1, -1, 150, 151, 152, 153, -1, + -1, 25, 157, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, -1, 51, 10, 11, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 25, -1, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 25, 51, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, -1, 51, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, -1, 51, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + -1, 51, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, -1, 51 +}; + + /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint16 yystos[] = +{ + 0, 169, 170, 0, 3, 4, 5, 6, 7, 12, + 44, 45, 50, 52, 53, 54, 55, 56, 57, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 73, + 74, 75, 76, 77, 79, 83, 84, 85, 86, 87, + 89, 91, 93, 96, 100, 101, 102, 103, 104, 105, + 106, 108, 109, 110, 111, 112, 113, 118, 119, 120, + 121, 122, 123, 128, 129, 130, 131, 132, 133, 134, + 137, 138, 140, 144, 150, 151, 152, 153, 156, 157, + 158, 161, 163, 164, 166, 171, 172, 175, 178, 179, + 186, 187, 189, 190, 191, 193, 248, 249, 250, 253, + 254, 262, 265, 269, 270, 272, 273, 279, 280, 281, + 282, 283, 284, 285, 286, 291, 296, 298, 299, 300, + 301, 302, 75, 111, 150, 158, 250, 269, 269, 161, + 269, 269, 269, 269, 269, 269, 269, 75, 111, 150, + 153, 161, 171, 254, 272, 273, 281, 272, 269, 269, + 269, 269, 269, 269, 269, 269, 32, 269, 294, 295, + 150, 153, 171, 254, 256, 257, 281, 284, 285, 291, + 269, 161, 260, 161, 26, 65, 65, 245, 269, 178, + 161, 161, 161, 161, 161, 163, 269, 163, 269, 75, + 75, 163, 248, 269, 273, 164, 269, 153, 171, 173, + 174, 77, 166, 220, 221, 77, 222, 250, 122, 122, + 161, 161, 161, 161, 161, 161, 153, 164, 171, 171, + 248, 269, 273, 249, 269, 301, 176, 164, 153, 161, + 8, 163, 75, 75, 163, 32, 188, 65, 147, 9, + 10, 11, 25, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 51, 163, 53, 54, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 161, 147, 65, 126, 65, 164, 166, 285, + 65, 65, 65, 188, 269, 153, 171, 301, 147, 147, + 271, 273, 127, 167, 8, 267, 153, 171, 147, 161, + 261, 147, 126, 285, 162, 269, 269, 269, 287, 287, + 8, 163, 87, 269, 246, 247, 269, 248, 273, 75, + 202, 269, 163, 163, 163, 13, 163, 163, 176, 163, + 171, 95, 8, 163, 164, 270, 273, 8, 163, 13, + 8, 163, 188, 184, 185, 273, 273, 297, 273, 162, + 128, 273, 292, 293, 294, 171, 170, 163, 164, 161, + 127, 162, 162, 162, 121, 165, 177, 178, 186, 187, + 269, 75, 32, 160, 217, 218, 219, 269, 75, 124, + 192, 124, 194, 75, 161, 287, 75, 279, 285, 291, + 269, 269, 269, 26, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 269, 269, 269, 256, 32, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 217, 75, 279, 287, 75, 164, 279, 288, + 289, 290, 287, 269, 287, 287, 287, 162, 171, 75, + 75, 32, 269, 32, 269, 171, 279, 217, 279, 288, + 162, 162, 167, 167, 269, 161, 162, 163, 8, 95, + 95, 13, 8, 162, 162, 44, 45, 65, 83, 129, + 150, 153, 171, 254, 262, 263, 264, 165, 95, 75, + 174, 269, 221, 263, 77, 161, 8, 162, 8, 162, + 162, 163, 161, 8, 162, 162, 161, 165, 170, 217, + 248, 273, 161, 165, 271, 269, 162, 8, 13, 150, + 153, 171, 255, 125, 195, 196, 255, 164, 161, 25, + 129, 155, 211, 212, 214, 215, 255, 167, 161, 161, + 285, 269, 26, 66, 273, 162, 161, 161, 167, 269, + 161, 276, 277, 278, 65, 164, 167, 165, 167, 167, + 167, 271, 271, 127, 162, 258, 26, 178, 269, 26, + 178, 206, 246, 269, 273, 32, 198, 273, 263, 75, + 26, 178, 201, 26, 164, 203, 263, 263, 263, 266, + 268, 161, 153, 171, 147, 107, 159, 180, 181, 183, + 75, 165, 13, 211, 185, 163, 273, 292, 293, 13, + 217, 165, 162, 162, 219, 263, 153, 171, 196, 164, + 8, 223, 211, 215, 162, 8, 32, 77, 160, 213, + 217, 217, 269, 256, 217, 217, 165, 217, 65, 65, + 274, 287, 269, 32, 269, 126, 259, 176, 207, 162, + 176, 163, 127, 197, 273, 197, 13, 176, 163, 204, + 163, 204, 127, 167, 8, 267, 266, 171, 75, 161, + 164, 181, 182, 183, 263, 162, 162, 269, 162, 163, + 171, 223, 255, 104, 109, 111, 112, 113, 114, 115, + 116, 117, 165, 224, 226, 239, 240, 241, 242, 244, + 162, 109, 251, 214, 213, 77, 13, 162, 162, 261, + 162, 162, 162, 287, 287, 126, 275, 167, 165, 271, + 288, 208, 70, 71, 209, 163, 88, 246, 198, 162, + 162, 263, 94, 204, 97, 98, 99, 204, 165, 263, + 263, 162, 255, 176, 251, 165, 75, 227, 255, 77, + 243, 250, 242, 8, 163, 26, 216, 161, 216, 32, + 213, 13, 263, 167, 167, 288, 70, 71, 210, 161, + 178, 163, 162, 26, 178, 200, 200, 163, 97, 163, + 269, 26, 163, 205, 165, 127, 77, 165, 216, 13, + 8, 163, 164, 228, 13, 8, 163, 225, 75, 214, + 164, 32, 77, 252, 164, 213, 13, 263, 278, 161, + 26, 72, 269, 26, 178, 199, 176, 163, 205, 176, + 263, 162, 164, 263, 255, 75, 229, 230, 231, 232, + 234, 235, 236, 255, 263, 77, 188, 13, 176, 77, + 8, 162, 176, 13, 263, 269, 176, 163, 162, 176, + 92, 176, 164, 176, 165, 231, 163, 95, 154, 163, + 147, 13, 75, 263, 165, 32, 77, 165, 263, 162, + 178, 90, 163, 176, 165, 237, 242, 233, 255, 75, + 263, 161, 77, 26, 163, 165, 75, 8, 211, 176, + 255, 162, 216, 163, 164, 238, 176, 165 +}; + + /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint16 yyr1[] = +{ + 0, 168, 169, 170, 170, 171, 171, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 173, 173, 174, 174, + 174, 174, 175, 175, 176, 176, 177, 177, 177, 177, + 178, 178, 178, 178, 178, 179, 179, 179, 179, 179, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 179, 179, 179, 179, 180, 180, 181, 182, 182, 183, + 184, 184, 185, 186, 187, 188, 188, 189, 190, 190, + 191, 191, 191, 191, 192, 192, 193, 194, 194, 195, + 195, 196, 196, 197, 197, 198, 198, 199, 199, 200, + 200, 201, 201, 202, 202, 203, 203, 203, 203, 204, + 204, 204, 205, 205, 206, 206, 207, 207, 208, 208, + 209, 209, 210, 210, 211, 211, 212, 212, 212, 212, + 212, 212, 212, 212, 213, 213, 214, 214, 214, 215, + 215, 215, 216, 216, 217, 217, 218, 218, 219, 219, + 219, 220, 220, 221, 221, 221, 222, 222, 222, 222, + 223, 223, 224, 224, 224, 225, 224, 226, 227, 227, + 228, 228, 229, 229, 230, 230, 231, 231, 232, 233, + 233, 234, 234, 235, 236, 236, 237, 237, 238, 238, + 239, 239, 240, 240, 241, 241, 242, 242, 242, 242, + 242, 242, 243, 243, 243, 243, 244, 244, 245, 245, + 246, 246, 247, 247, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 249, 249, 249, + 249, 250, 251, 251, 252, 252, 252, 252, 253, 253, + 253, 253, 253, 253, 253, 253, 254, 254, 254, 254, + 255, 255, 255, 256, 256, 257, 257, 258, 258, 259, + 260, 260, 260, 261, 261, 262, 262, 262, 262, 262, + 262, 262, 262, 262, 262, 262, 262, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 264, 265, 265, 265, + 265, 265, 265, 266, 266, 267, 267, 268, 268, 268, + 268, 269, 269, 270, 271, 272, 273, 273, 274, 274, + 275, 276, 276, 277, 278, 278, 278, 279, 279, 280, + 280, 281, 282, 282, 283, 283, 283, 284, 284, 284, + 284, 285, 285, 285, 286, 286, 287, 287, 288, 288, + 289, 289, 289, 290, 290, 291, 291, 292, 292, 293, + 293, 293, 294, 294, 295, 295, 295, 295, 295, 295, + 295, 295, 296, 296, 296, 296, 296, 296, 296, 297, + 297, 298, 298, 299, 299, 299, 299, 299, 300, 300, + 301, 302, 302 +}; + + /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 1, 2, 0, 1, 3, 1, 1, 1, + 4, 3, 5, 4, 3, 2, 3, 1, 1, 3, + 2, 4, 5, 4, 2, 0, 1, 1, 1, 4, + 1, 2, 1, 1, 1, 3, 7, 10, 5, 7, + 9, 5, 2, 3, 2, 3, 2, 3, 3, 3, + 3, 3, 1, 2, 2, 5, 8, 8, 5, 1, + 6, 5, 3, 3, 2, 1, 8, 0, 1, 4, + 1, 3, 1, 1, 1, 0, 1, 10, 7, 6, + 1, 2, 2, 1, 0, 2, 1, 0, 2, 0, + 2, 1, 3, 0, 2, 1, 2, 1, 4, 1, + 4, 1, 4, 3, 5, 3, 4, 4, 5, 0, + 5, 4, 1, 1, 1, 4, 0, 6, 0, 7, + 0, 2, 0, 3, 1, 0, 2, 3, 5, 4, + 4, 5, 7, 6, 2, 1, 0, 1, 2, 1, + 1, 1, 0, 2, 1, 0, 1, 3, 1, 2, + 2, 3, 1, 1, 2, 4, 3, 5, 1, 3, + 2, 0, 3, 2, 1, 0, 10, 3, 1, 3, + 1, 3, 0, 1, 1, 2, 2, 2, 3, 1, + 3, 1, 1, 3, 4, 3, 0, 1, 1, 3, + 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, + 1, 1, 3, 5, 1, 3, 5, 4, 3, 1, + 0, 1, 3, 1, 6, 3, 4, 6, 2, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 1, 1, 5, 4, 3, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, + 1, 1, 1, 2, 1, 10, 11, 2, 2, 4, + 4, 1, 0, 4, 3, 4, 1, 2, 4, 6, + 5, 6, 6, 6, 6, 4, 1, 1, 3, 2, + 1, 3, 2, 1, 1, 4, 1, 2, 0, 2, + 0, 2, 3, 0, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 2, 2, 2, 4, 3, 1, 3, 1, 1, 1, + 3, 2, 1, 0, 2, 0, 1, 5, 3, 3, + 1, 1, 1, 1, 1, 1, 5, 1, 2, 0, + 3, 4, 4, 3, 1, 1, 0, 1, 2, 3, + 3, 1, 4, 4, 1, 1, 1, 1, 3, 2, + 1, 4, 4, 1, 1, 4, 0, 1, 1, 1, + 4, 4, 1, 1, 3, 1, 2, 3, 1, 1, + 4, 0, 0, 2, 5, 3, 3, 1, 6, 4, + 4, 2, 4, 4, 2, 2, 4, 2, 2, 1, + 3, 3, 3, 4, 4, 4, 4, 4, 4, 3, + 3, 3, 3 +}; + + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (yyscanner, root, YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (0) + +/* Error token number */ +#define YYTERROR 1 +#define YYERRCODE 256 + + + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +/* This macro is provided for backward compatibility. */ +#ifndef YY_LOCATION_PRINT +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +#endif + + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value, yyscanner, root); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + + +/*----------------------------------------. +| Print this symbol's value on YYOUTPUT. | +`----------------------------------------*/ + +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, void* yyscanner, xhpast::Node** root) +{ + FILE *yyo = yyoutput; + YYUSE (yyo); + YYUSE (yyscanner); + YYUSE (root); + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + YYUSE (yytype); +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, void* yyscanner, xhpast::Node** root) +{ + YYFPRINTF (yyoutput, "%s %s (", + yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep, yyscanner, root); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +static void +yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +static void +yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule, void* yyscanner, xhpast::Node** root) +{ + unsigned long int yylno = yyrline[yyrule]; + int yynrhs = yyr2[yyrule]; + int yyi; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, + yystos[yyssp[yyi + 1 - yynrhs]], + &(yyvsp[(yyi + 1) - (yynrhs)]) + , yyscanner, root); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, Rule, yyscanner, root); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +yystrlen (const char *yystr) +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +yystpcpy (char *yydest, const char *yysrc) +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message + about the unexpected token YYTOKEN for the state stack whose top is + YYSSP. + + Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is + not large enough to hold the message. In that case, also set + *YYMSG_ALLOC to the required number of bytes. Return 2 if the + required number of bytes is too large to store. */ +static int +yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, + yytype_int16 *yyssp, int yytoken) +{ + YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); + YYSIZE_T yysize = yysize0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + /* Internationalized format string. */ + const char *yyformat = YY_NULLPTR; + /* Arguments of yyformat. */ + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + /* Number of reported tokens (one for the "unexpected", one per + "expected"). */ + int yycount = 0; + + /* There are many possibilities here to consider: + - If this state is a consistent state with a default action, then + the only way this function was invoked is if the default action + is an error action. In that case, don't check for expected + tokens because there are none. + - The only way there can be no lookahead present (in yychar) is if + this state is a consistent state with a default action. Thus, + detecting the absence of a lookahead is sufficient to determine + that there is no unexpected or expected token to report. In that + case, just report a simple "syntax error". + - Don't assume there isn't a lookahead just because this state is a + consistent state with a default action. There might have been a + previous inconsistent state, consistent state with a non-default + action, or user semantic action that manipulated yychar. + - Of course, the expected token list depends on states to have + correct lookahead information, and it depends on the parser not + to perform extra reductions after fetching a lookahead from the + scanner and before detecting a syntax error. Thus, state merging + (from LALR or IELR) and default reductions corrupt the expected + token list. However, the list is correct for canonical LR with + one exception: it will still contain any token that will not be + accepted due to an error action in a later state. + */ + if (yytoken != YYEMPTY) + { + int yyn = yypact[*yyssp]; + yyarg[yycount++] = yytname[yytoken]; + if (!yypact_value_is_default (yyn)) + { + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. In other words, skip the first -YYN actions for + this state because they are default actions. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yyx; + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR + && !yytable_value_is_error (yytable[yyx + yyn])) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + break; + } + yyarg[yycount++] = yytname[yyx]; + { + YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); + if (! (yysize <= yysize1 + && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } + } + } + } + + switch (yycount) + { +# define YYCASE_(N, S) \ + case N: \ + yyformat = S; \ + break + YYCASE_(0, YY_("syntax error")); + YYCASE_(1, YY_("syntax error, unexpected %s")); + YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); + YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); + YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); + YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); +# undef YYCASE_ + } + + { + YYSIZE_T yysize1 = yysize + yystrlen (yyformat); + if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } + + if (*yymsg_alloc < yysize) + { + *yymsg_alloc = 2 * yysize; + if (! (yysize <= *yymsg_alloc + && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) + *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; + return 1; + } + + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + { + char *yyp = *yymsg; + int yyi = 0; + while ((*yyp = *yyformat) != '\0') + if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyformat += 2; + } + else + { + yyp++; + yyformat++; + } + } + return 0; +} +#endif /* YYERROR_VERBOSE */ + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, void* yyscanner, xhpast::Node** root) +{ + YYUSE (yyvaluep); + YYUSE (yyscanner); + YYUSE (root); + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YYUSE (yytype); + YY_IGNORE_MAYBE_UNINITIALIZED_END +} + + + + +/*----------. +| yyparse. | +`----------*/ + +int +yyparse (void* yyscanner, xhpast::Node** root) +{ +/* The lookahead symbol. */ +int yychar; + + +/* The semantic value of the lookahead symbol. */ +/* Default value used for initialization, for pacifying older GCCs + or non-GCC compilers. */ +YY_INITIAL_VALUE (static YYSTYPE yyval_default;) +YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); + + /* Number of syntax errors so far. */ + int yynerrs; + + int yystate; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + + /* The stacks and their tools: + 'yyss': related to states. + 'yyvs': related to semantic values. + + Refer to the stacks through separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs; + YYSTYPE *yyvsp; + + YYSIZE_T yystacksize; + + int yyn; + int yyresult; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + yyssp = yyss = yyssa; + yyvsp = yyvs = yyvsa; + yystacksize = YYINITDEPTH; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yypact_value_is_default (yyn)) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = yylex (&yylval, yyscanner); + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yytable_value_is_error (yyn)) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + yychar = YYEMPTY; + + yystate = yyn; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + '$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: +#line 210 "parser.y" /* yacc.c:1646 */ + { + *root = NNEW(n_PROGRAM)->appendChild((yyvsp[0])); + } +#line 3439 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 3: +#line 216 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[-1])->appendChild((yyvsp[0])); + } +#line 3447 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 4: +#line 219 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_STATEMENT_LIST); + } +#line 3455 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 5: +#line 225 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_SYMBOL_NAME); + } +#line 3463 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 6: +#line 228 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NMORE((yyvsp[-2]), (yyvsp[0])); + } +#line 3471 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 10: +#line 237 "parser.y" /* yacc.c:1646 */ + { + (yyvsp[-3]) = NSPAN((yyvsp[-3]), n_HALT_COMPILER, (yyvsp[-1])); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-3])); + NMORE((yyval), (yyvsp[0])); + } +#line 3481 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 11: +#line 242 "parser.y" /* yacc.c:1646 */ + { + NSPAN((yyvsp[-2]), n_NAMESPACE, (yyvsp[-1])); + (yyvsp[-2])->appendChild((yyvsp[-1])); + (yyvsp[-2])->appendChild(NNEW(n_EMPTY)); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-2])); + NMORE((yyval), (yyvsp[0])); + } +#line 3493 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 12: +#line 249 "parser.y" /* yacc.c:1646 */ + { + NSPAN((yyvsp[-4]), n_NAMESPACE, (yyvsp[0])); + (yyvsp[-4])->appendChild((yyvsp[-3])); + (yyvsp[-4])->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-4])); + } +#line 3504 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 13: +#line 255 "parser.y" /* yacc.c:1646 */ + { + NSPAN((yyvsp[-3]), n_NAMESPACE, (yyvsp[0])); + (yyvsp[-3])->appendChild(NNEW(n_EMPTY)); + NMORE((yyvsp[-1]), (yyvsp[0])); + NMORE((yyvsp[-1]), (yyvsp[-2])); + (yyvsp[-3])->appendChild((yyvsp[-1])); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-3])); + } +#line 3517 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 14: +#line 263 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyvsp[-1]), (yyvsp[-2])); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 3527 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 15: +#line 268 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 3536 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 16: +#line 275 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[-2])->appendChild((yyvsp[0])); + } +#line 3544 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 17: +#line 278 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_USE_LIST); + (yyval)->appendChild((yyvsp[0])); + } +#line 3553 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 18: +#line 285 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_USE); + (yyval)->appendChild((yyvsp[0])); + (yyval)->appendChild(NNEW(n_EMPTY)); + } +#line 3563 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 19: +#line 290 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_USE); + (yyval)->appendChild((yyvsp[-2])); + NTYPE((yyvsp[0]), n_STRING); + (yyval)->appendChild((yyvsp[0])); + } +#line 3574 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 20: +#line 296 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_USE); + NMORE((yyvsp[0]), (yyvsp[-1])); + (yyval)->appendChild((yyvsp[0])); + (yyval)->appendChild(NNEW(n_EMPTY)); + } +#line 3585 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 21: +#line 302 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_USE); + NMORE((yyvsp[-2]), (yyvsp[-3])); + (yyval)->appendChild((yyvsp[-2])); + NTYPE((yyvsp[0]), n_STRING); + (yyval)->appendChild((yyvsp[0])); + } +#line 3597 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 22: +#line 312 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyval), (yyvsp[0])); + (yyval)->appendChild( + NNEW(n_CONSTANT_DECLARATION) + ->appendChild(NTYPE((yyvsp[-2]), n_STRING)) + ->appendChild((yyvsp[0]))); + } +#line 3609 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 23: +#line 319 "parser.y" /* yacc.c:1646 */ + { + NSPAN((yyval), n_CONSTANT_DECLARATION_LIST, (yyvsp[0])); + (yyval)->appendChild( + NNEW(n_CONSTANT_DECLARATION) + ->appendChild(NTYPE((yyvsp[-2]), n_STRING)) + ->appendChild((yyvsp[0]))); + } +#line 3621 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 24: +#line 329 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[-1])->appendChild((yyvsp[0])); + } +#line 3629 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 25: +#line 332 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_STATEMENT_LIST); + } +#line 3637 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 29: +#line 341 "parser.y" /* yacc.c:1646 */ + { + (yyvsp[-3]) = NSPAN((yyvsp[-3]), n_HALT_COMPILER, (yyvsp[-1])); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-3])); + NMORE((yyval), (yyvsp[0])); + } +#line 3647 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 31: +#line 350 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-1]), n_STRING); + (yyval) = NNEW(n_LABEL); + (yyval)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 3658 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 32: +#line 356 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_OPEN_TAG); + } +#line 3666 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 33: +#line 359 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_OPEN_TAG); + } +#line 3674 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 34: +#line 362 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_CLOSE_TAG); + } +#line 3682 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 35: +#line 368 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0])); + } +#line 3690 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 36: +#line 371 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CONDITION_LIST); + + (yyvsp[-6]) = NTYPE((yyvsp[-6]), n_IF); + (yyvsp[-6])->appendChild(NSPAN((yyvsp[-5]), n_CONTROL_CONDITION, (yyvsp[-3]))->appendChild((yyvsp[-4]))); + (yyvsp[-6])->appendChild((yyvsp[-2])); + + (yyval)->appendChild((yyvsp[-6])); + (yyval)->appendChildren((yyvsp[-1])); + + // Hacks: merge a list of if (x) { } else if (y) { } into a single condition + // list instead of a condition tree. + + if ((yyvsp[0])->type == n_EMPTY) { + // Ignore. + } else if ((yyvsp[0])->type == n_ELSE) { + xhpast::Node *stype = (yyvsp[0])->firstChild()->firstChild(); + if (stype && stype->type == n_CONDITION_LIST) { + NTYPE(stype->firstChild(), n_ELSEIF); + stype->firstChild()->l_tok = (yyvsp[0])->l_tok; + (yyval)->appendChildren(stype); + } else { + (yyval)->appendChild((yyvsp[0])); + } + } else { + (yyval)->appendChild((yyvsp[0])); + } + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyval)); + } +#line 3725 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 37: +#line 405 "parser.y" /* yacc.c:1646 */ + { + + (yyval) = NNEW(n_CONDITION_LIST); + NTYPE((yyvsp[-9]), n_IF); + (yyvsp[-9])->appendChild(NSPAN((yyvsp[-8]), n_CONTROL_CONDITION, (yyvsp[-6]))->appendChild((yyvsp[-7]))); + (yyvsp[-9])->appendChild((yyvsp[-4])); + + (yyval)->appendChild((yyvsp[-9])); + (yyval)->appendChildren((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-2])); + NMORE((yyval), (yyvsp[-1])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyval)); + NMORE((yyval), (yyvsp[0])); + } +#line 3745 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 38: +#line 420 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-4]), n_WHILE); + (yyvsp[-4])->appendChild(NSPAN((yyvsp[-3]), n_CONTROL_CONDITION, (yyvsp[-1]))->appendChild((yyvsp[-2]))); + (yyvsp[-4])->appendChild((yyvsp[0])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-4])); + } +#line 3757 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 39: +#line 427 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-6]), n_DO_WHILE); + (yyvsp[-6])->appendChild((yyvsp[-5])); + (yyvsp[-6])->appendChild(NSPAN((yyvsp[-3]), n_CONTROL_CONDITION, (yyvsp[-1]))->appendChild((yyvsp[-2]))); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-6])); + NMORE((yyval), (yyvsp[0])); + } +#line 3770 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 40: +#line 435 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-8]), n_FOR); + + NSPAN((yyvsp[-7]), n_FOR_EXPRESSION, (yyvsp[-1])) + ->appendChild((yyvsp[-6])) + ->appendChild((yyvsp[-4])) + ->appendChild((yyvsp[-2])); + + (yyvsp[-8])->appendChild((yyvsp[-7])); + (yyvsp[-8])->appendChild((yyvsp[0])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-8])); + } +#line 3788 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 41: +#line 448 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-4]), n_SWITCH); + (yyvsp[-4])->appendChild(NSPAN((yyvsp[-3]), n_CONTROL_CONDITION, (yyvsp[-1]))->appendChild((yyvsp[-2]))); + (yyvsp[-4])->appendChild((yyvsp[0])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-4])); + } +#line 3800 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 42: +#line 455 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-1]), n_BREAK); + (yyvsp[-1])->appendChild(NNEW(n_EMPTY)); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 3812 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 43: +#line 462 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-2]), n_BREAK); + (yyvsp[-2])->appendChild((yyvsp[-1])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-2])); + NMORE((yyval), (yyvsp[0])); + } +#line 3824 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 44: +#line 469 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-1]), n_CONTINUE); + (yyvsp[-1])->appendChild(NNEW(n_EMPTY)); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 3836 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 45: +#line 476 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-2]), n_CONTINUE); + (yyvsp[-2])->appendChild((yyvsp[-1])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-2])); + NMORE((yyval), (yyvsp[0])); + } +#line 3848 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 46: +#line 483 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-1]), n_RETURN); + (yyvsp[-1])->appendChild(NNEW(n_EMPTY)); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 3860 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 47: +#line 490 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-2]), n_RETURN); + (yyvsp[-2])->appendChild((yyvsp[-1])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-2])); + NMORE((yyval), (yyvsp[0])); + } +#line 3872 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 48: +#line 497 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-2]), n_RETURN); + (yyvsp[-2])->appendChild((yyvsp[-1])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-2])); + NMORE((yyval), (yyvsp[0])); + } +#line 3884 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 49: +#line 504 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyvsp[-1]), (yyvsp[-2])); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 3894 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 50: +#line 509 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyvsp[-1]), (yyvsp[-2])); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 3904 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 51: +#line 514 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyvsp[-1]), (yyvsp[-2])); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 3914 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 52: +#line 519 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[0]), n_INLINE_HTML); + (yyval) = (yyvsp[0]); + } +#line 3923 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 53: +#line 523 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 3932 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 54: +#line 527 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 3941 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 55: +#line 531 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyvsp[-2]), (yyvsp[-1])); + NMORE((yyvsp[-2]), (yyvsp[-4])); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-2])); + NMORE((yyval), (yyvsp[0])); + } +#line 3952 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 56: +#line 538 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-7]), n_FOREACH); + NSPAN((yyvsp[-6]), n_FOREACH_EXPRESSION, (yyvsp[-1])); + (yyvsp[-6])->appendChild((yyvsp[-5])); + if ((yyvsp[-2])->type == n_EMPTY) { + (yyvsp[-6])->appendChild((yyvsp[-2])); + (yyvsp[-6])->appendChild((yyvsp[-3])); + } else { + (yyvsp[-6])->appendChild((yyvsp[-3])); + (yyvsp[-6])->appendChild((yyvsp[-2])); + } + (yyvsp[-7])->appendChild((yyvsp[-6])); + + (yyvsp[-7])->appendChild((yyvsp[0])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-7])); + } +#line 3974 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 57: +#line 556 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-7]), n_FOREACH); + NSPAN((yyvsp[-6]), n_FOREACH_EXPRESSION, (yyvsp[-1])); + (yyvsp[-6])->appendChild((yyvsp[-5])); + if ((yyvsp[-2])->type == n_EMPTY) { + (yyvsp[-6])->appendChild((yyvsp[-2])); + (yyvsp[-6])->appendChild((yyvsp[-3])); + } else { + (yyvsp[-6])->appendChild((yyvsp[-3])); + (yyvsp[-6])->appendChild((yyvsp[-2])); + } + (yyvsp[-7])->appendChild((yyvsp[-6])); + (yyvsp[-7])->appendChild((yyvsp[0])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-7])); + } +#line 3995 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 58: +#line 572 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-4]), n_DECLARE); + (yyvsp[-4])->appendChild((yyvsp[-2])); + (yyvsp[-4])->appendChild((yyvsp[0])); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-4])); + } +#line 4006 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 59: +#line 578 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_STATEMENT)->appendChild(NNEW(n_EMPTY)); + NMORE((yyval), (yyvsp[0])); + } +#line 4015 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 60: +#line 582 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-5]), n_TRY); + (yyvsp[-5])->appendChild(NEXPAND((yyvsp[-4]), (yyvsp[-3]), (yyvsp[-2]))); + + (yyvsp[-5])->appendChild((yyvsp[-1])); + (yyvsp[-5])->appendChild((yyvsp[0])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-5])); + } +#line 4029 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 61: +#line 591 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-4]), n_TRY); + (yyvsp[-4])->appendChild(NEXPAND((yyvsp[-3]), (yyvsp[-2]), (yyvsp[-1]))); + + (yyvsp[-4])->appendChild(NNEW(n_CATCH_LIST)); + (yyvsp[-4])->appendChild((yyvsp[0])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-4])); + } +#line 4043 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 62: +#line 600 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-2]), n_THROW); + (yyvsp[-2])->appendChild((yyvsp[-1])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-2])); + NMORE((yyval), (yyvsp[0])); + + } +#line 4056 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 63: +#line 608 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-2]), n_GOTO); + NTYPE((yyvsp[-1]), n_STRING); + (yyvsp[-2])->appendChild((yyvsp[-1])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-2])); + NMORE((yyval), (yyvsp[0])); + } +#line 4069 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 64: +#line 619 "parser.y" /* yacc.c:1646 */ + { + (yyvsp[-1])->appendChild((yyvsp[0])); + (yyval) = (yyvsp[-1]); + } +#line 4078 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 65: +#line 623 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CATCH_LIST); + (yyval)->appendChild((yyvsp[0])); +} +#line 4087 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 66: +#line 630 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-7]), n_CATCH); + (yyvsp[-7])->appendChild((yyvsp[-5])); + (yyvsp[-7])->appendChild(NTYPE((yyvsp[-4]), n_VARIABLE)); + (yyvsp[-7])->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + NMORE((yyvsp[-7]), (yyvsp[0])); + (yyval) = (yyvsp[-7]); + } +#line 4100 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 67: +#line 641 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 4108 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 69: +#line 648 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-3]), n_FINALLY); + (yyvsp[-3])->appendChild((yyvsp[-1])); + NMORE((yyvsp[-3]), (yyvsp[0])); + (yyval) = (yyvsp[-3]); + } +#line 4119 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 70: +#line 657 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_UNSET_LIST); + (yyval)->appendChild((yyvsp[0])); + } +#line 4128 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 71: +#line 661 "parser.y" /* yacc.c:1646 */ + { + (yyvsp[-2])->appendChild((yyvsp[0])); + (yyval) = (yyvsp[-2]); + } +#line 4137 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 75: +#line 680 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 4145 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 76: +#line 683 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_REFERENCE); + } +#line 4153 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 77: +#line 690 "parser.y" /* yacc.c:1646 */ + { + NSPAN((yyvsp[-9]), n_FUNCTION_DECLARATION, (yyvsp[-1])); + (yyvsp[-9])->appendChild(NNEW(n_EMPTY)); + (yyvsp[-9])->appendChild((yyvsp[-8])); + (yyvsp[-9])->appendChild(NTYPE((yyvsp[-7]), n_STRING)); + (yyvsp[-9])->appendChild(NEXPAND((yyvsp[-6]), (yyvsp[-5]), (yyvsp[-4]))); + (yyvsp[-9])->appendChild(NNEW(n_EMPTY)); + (yyvsp[-9])->appendChild((yyvsp[-3])); + (yyvsp[-9])->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-9])); + } +#line 4170 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 78: +#line 706 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_DECLARATION); + (yyval)->appendChild((yyvsp[-6])); + (yyval)->appendChild(NTYPE((yyvsp[-5]), n_CLASS_NAME)); + (yyval)->appendChild((yyvsp[-4])); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + NMORE((yyval), (yyvsp[0])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyval)); + } +#line 4186 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 79: +#line 717 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_INTERFACE_DECLARATION); + (yyval)->appendChild(NNEW(n_CLASS_ATTRIBUTES)); + NMORE((yyval), (yyvsp[-5])); + (yyval)->appendChild(NTYPE((yyvsp[-4]), n_CLASS_NAME)); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + NMORE((yyval), (yyvsp[0])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyval)); + } +#line 4203 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 80: +#line 732 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[0]), n_CLASS_ATTRIBUTES); + (yyval) = (yyvsp[0]); + } +#line 4212 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 81: +#line 736 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[0]), n_CLASS_ATTRIBUTES); + NMORE((yyvsp[0]), (yyvsp[-1])); + (yyvsp[0])->appendChild(NTYPE((yyvsp[-1]), n_STRING)); + + (yyval) = (yyvsp[0]); + } +#line 4224 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 82: +#line 743 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[0]), n_CLASS_ATTRIBUTES); + NMORE((yyvsp[0]), (yyvsp[-1])); + (yyvsp[0])->appendChild(NTYPE((yyvsp[-1]), n_STRING)); + + (yyval) = (yyvsp[0]); + } +#line 4236 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 83: +#line 750 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_ATTRIBUTES); + (yyval)->appendChild(NTYPE((yyvsp[0]), n_STRING)); + } +#line 4245 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 84: +#line 757 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 4253 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 85: +#line 760 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[-1]), n_EXTENDS_LIST)->appendChild((yyvsp[0])); + } +#line 4261 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 87: +#line 770 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 4269 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 88: +#line 773 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-1]), n_EXTENDS_LIST); + (yyvsp[-1])->appendChildren((yyvsp[0])); + (yyval) = (yyvsp[-1]); + } +#line 4279 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 89: +#line 781 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 4287 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 90: +#line 784 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-1]), n_IMPLEMENTS_LIST); + (yyvsp[-1])->appendChildren((yyvsp[0])); + (yyval) = (yyvsp[-1]); + } +#line 4297 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 91: +#line 792 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_IMPLEMENTS_LIST)->appendChild((yyvsp[0])); + } +#line 4305 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 92: +#line 795 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[-2])->appendChild((yyvsp[0])); + } +#line 4313 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 93: +#line 801 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 4321 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 94: +#line 804 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[0]); + } +#line 4329 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 96: +#line 811 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-1]), n_VARIABLE_REFERENCE); + (yyvsp[-1])->appendChild((yyvsp[0])); + (yyval) = (yyvsp[-1]); + } +#line 4339 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 98: +#line 820 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyvsp[-2]), (yyvsp[-3])); + NMORE((yyvsp[-2]), (yyvsp[0])); + (yyval) = (yyvsp[-2]); + } +#line 4349 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 100: +#line 829 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyvsp[-2]), (yyvsp[-3])); + NMORE((yyvsp[-2]), (yyvsp[0])); + (yyval) = (yyvsp[-2]); + } +#line 4359 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 102: +#line 838 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyvsp[-2]), (yyvsp[-3])); + NMORE((yyvsp[-2]), (yyvsp[0])); + (yyval) = (yyvsp[-2]); + } +#line 4369 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 103: +#line 846 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_DECLARE_DECLARATION); + (yyval)->appendChild(NTYPE((yyvsp[-2]), n_STRING)); + (yyval)->appendChild((yyvsp[0])); + (yyval) = NNEW(n_DECLARE_DECLARATION_LIST)->appendChild((yyval)); + } +#line 4380 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 104: +#line 852 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_DECLARE_DECLARATION); + (yyval)->appendChild(NTYPE((yyvsp[-2]), n_STRING)); + (yyval)->appendChild((yyvsp[0])); + + (yyvsp[-4])->appendChild((yyval)); + (yyval) = (yyvsp[-4]); + } +#line 4393 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 105: +#line 863 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0])); + } +#line 4401 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 106: +#line 866 "parser.y" /* yacc.c:1646 */ + { + // ...why does this rule exist? + + NTYPE((yyvsp[-2]), n_STATEMENT); + (yyvsp[-3])->appendChild(NNEW(n_EMPTY)); + + (yyval) = NNEW(n_STATEMENT_LIST)->appendChild((yyvsp[-2])); + (yyval)->appendChildren((yyvsp[-1])); + NEXPAND((yyvsp[-3]), (yyval), (yyvsp[0])); + } +#line 4416 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 107: +#line 876 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyvsp[-2]), (yyvsp[0])); + NMORE((yyvsp[-2]), (yyvsp[-3])); + (yyval) = (yyvsp[-2]); + } +#line 4426 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 108: +#line 881 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-3]), n_STATEMENT); + (yyvsp[-4])->appendChild(NNEW(n_EMPTY)); + + (yyval) = NNEW(n_STATEMENT_LIST)->appendChild((yyvsp[-3])); + (yyval)->appendChildren((yyvsp[-2])); + NMORE((yyval), (yyvsp[0])); + NMORE((yyval), (yyvsp[-4])); + } +#line 4440 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 109: +#line 893 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_STATEMENT_LIST); + } +#line 4448 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 110: +#line 896 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-3]), n_CASE); + (yyvsp[-3])->appendChild((yyvsp[-2])); + (yyvsp[-3])->appendChild((yyvsp[0])); + + (yyvsp[-4])->appendChild((yyvsp[-3])); + (yyval) = (yyvsp[-4]); + } +#line 4461 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 111: +#line 904 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-2]), n_DEFAULT); + (yyvsp[-2])->appendChild((yyvsp[0])); + + (yyvsp[-3])->appendChild((yyvsp[-2])); + (yyval) = (yyvsp[-3]); + } +#line 4473 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 115: +#line 920 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyvsp[-2]), (yyvsp[0])); + NMORE((yyvsp[-2]), (yyvsp[-3])); + (yyval) = (yyvsp[-2]); + } +#line 4483 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 116: +#line 928 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CONDITION_LIST); + } +#line 4491 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 117: +#line 931 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-4]), n_ELSEIF); + (yyvsp[-4])->appendChild(NSPAN((yyvsp[-3]), n_CONTROL_CONDITION, (yyvsp[-1]))->appendChild((yyvsp[-2]))); + (yyvsp[-4])->appendChild((yyvsp[0])); + + (yyval) = (yyvsp[-5])->appendChild((yyvsp[-4])); + } +#line 4503 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 118: +#line 941 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CONDITION_LIST); + } +#line 4511 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 119: +#line 944 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-5]), n_ELSEIF); + (yyvsp[-5])->appendChild((yyvsp[-3])); + (yyvsp[-5])->appendChild((yyvsp[0])); + + (yyval) = (yyvsp[-6])->appendChild((yyvsp[-5])); + } +#line 4523 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 120: +#line 954 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 4531 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 121: +#line 957 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-1]), n_ELSE); + (yyvsp[-1])->appendChild((yyvsp[0])); + (yyval) = (yyvsp[-1]); + } +#line 4541 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 122: +#line 965 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 4549 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 123: +#line 968 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-2]), n_ELSE); + (yyvsp[-2])->appendChild((yyvsp[0])); + (yyval) = (yyvsp[-2]); + } +#line 4559 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 125: +#line 977 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_DECLARATION_PARAMETER_LIST); + } +#line 4567 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 126: +#line 983 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_DECLARATION_PARAMETER); + (yyval)->appendChild((yyvsp[-1])); + (yyval)->appendChild((yyvsp[0])); + (yyval)->appendChild(NNEW(n_EMPTY)); + + (yyval) = NNEW(n_DECLARATION_PARAMETER_LIST)->appendChild((yyval)); + } +#line 4580 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 127: +#line 991 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_DECLARATION_PARAMETER); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_VARIABLE_REFERENCE)); + (yyvsp[-1])->appendChild((yyvsp[0])); + (yyval)->appendChild(NNEW(n_EMPTY)); + + (yyval) = NNEW(n_DECLARATION_PARAMETER_LIST)->appendChild((yyval)); + } +#line 4594 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 128: +#line 1000 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_DECLARATION_PARAMETER); + (yyval)->appendChild((yyvsp[-4])); + (yyval)->appendChild(NTYPE((yyvsp[-3]), n_VARIABLE_REFERENCE)); + (yyvsp[-3])->appendChild((yyvsp[-2])); + (yyval)->appendChild((yyvsp[0])); + + (yyval) = NNEW(n_DECLARATION_PARAMETER_LIST)->appendChild((yyval)); + } +#line 4608 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 129: +#line 1009 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_DECLARATION_PARAMETER); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild((yyvsp[0])); + + (yyval) = NNEW(n_DECLARATION_PARAMETER_LIST)->appendChild((yyval)); + } +#line 4621 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 130: +#line 1017 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_DECLARATION_PARAMETER); + (yyval)->appendChild((yyvsp[-1])); + (yyval)->appendChild((yyvsp[0])); + (yyval)->appendChild(NNEW(n_EMPTY)); + + (yyval) = (yyvsp[-3])->appendChild((yyval)); + } +#line 4634 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 131: +#line 1025 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_DECLARATION_PARAMETER); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_VARIABLE_REFERENCE)); + (yyvsp[-1])->appendChild((yyvsp[0])); + (yyval)->appendChild(NNEW(n_EMPTY)); + + (yyval) = (yyvsp[-4])->appendChild((yyval)); + } +#line 4648 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 132: +#line 1035 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_DECLARATION_PARAMETER); + (yyval)->appendChild((yyvsp[-4])); + (yyval)->appendChild(NTYPE((yyvsp[-3]), n_VARIABLE_REFERENCE)); + (yyvsp[-3])->appendChild((yyvsp[-2])); + (yyval)->appendChild((yyvsp[0])); + + (yyval) = (yyvsp[-6])->appendChild((yyval)); + } +#line 4662 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 133: +#line 1045 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_DECLARATION_PARAMETER); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild((yyvsp[0])); + + (yyval) = (yyvsp[-5])->appendChild((yyval)); + } +#line 4675 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 134: +#line 1056 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[-1]), n_UNPACK); + (yyval)->appendChild(NTYPE((yyvsp[0]), n_VARIABLE)); + } +#line 4684 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 135: +#line 1060 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_VARIABLE); + } +#line 4692 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 136: +#line 1066 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 4700 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 138: +#line 1070 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_NULLABLE_TYPE); + (yyval)->appendChild((yyvsp[0])); + } +#line 4709 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 139: +#line 1077 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[0]); + } +#line 4717 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 140: +#line 1080 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_TYPE_NAME); + } +#line 4725 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 141: +#line 1083 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_TYPE_NAME); + } +#line 4733 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 142: +#line 1089 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 4741 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 143: +#line 1092 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_DECLARATION_RETURN); + (yyval)->appendChild((yyvsp[0])); + } +#line 4750 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 145: +#line 1100 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CALL_PARAMETER_LIST); + } +#line 4758 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 146: +#line 1106 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CALL_PARAMETER_LIST)->appendChild((yyvsp[0])); + } +#line 4766 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 147: +#line 1109 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[-2])->appendChild((yyvsp[0])); + } +#line 4774 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 149: +#line 1116 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_UNPACK)->appendChild((yyvsp[-1])); + } +#line 4782 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 150: +#line 1119 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-1]), n_VARIABLE_REFERENCE); + (yyval) = (yyvsp[-1])->appendChild((yyvsp[0])); + } +#line 4791 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 151: +#line 1126 "parser.y" /* yacc.c:1646 */ + { + (yyvsp[-2])->appendChild((yyvsp[0])); + (yyval) = (yyvsp[-2]); + } +#line 4800 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 152: +#line 1130 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_GLOBAL_DECLARATION_LIST); + (yyval)->appendChild((yyvsp[0])); + } +#line 4809 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 153: +#line 1137 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_VARIABLE); + } +#line 4817 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 154: +#line 1140 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[-1]), n_VARIABLE_VARIABLE); + (yyval)->appendChild((yyvsp[0])); + } +#line 4826 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 155: +#line 1144 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[-3]), n_VARIABLE_VARIABLE); + (yyval)->appendChild((yyvsp[-1])); + } +#line 4835 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 156: +#line 1151 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[0]), n_VARIABLE); + (yyval) = NNEW(n_STATIC_DECLARATION); + (yyval)->appendChild((yyvsp[0])); + (yyval)->appendChild(NNEW(n_EMPTY)); + + (yyval) = (yyvsp[-2])->appendChild((yyval)); + } +#line 4848 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 157: +#line 1159 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-2]), n_VARIABLE); + (yyval) = NNEW(n_STATIC_DECLARATION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild((yyvsp[0])); + + (yyval) = (yyvsp[-4])->appendChild((yyval)); + } +#line 4861 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 158: +#line 1167 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[0]), n_VARIABLE); + (yyval) = NNEW(n_STATIC_DECLARATION); + (yyval)->appendChild((yyvsp[0])); + (yyval)->appendChild(NNEW(n_EMPTY)); + + (yyval) = NNEW(n_STATIC_DECLARATION_LIST)->appendChild((yyval)); + } +#line 4874 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 159: +#line 1175 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-2]), n_VARIABLE); + (yyval) = NNEW(n_STATIC_DECLARATION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild((yyvsp[0])); + + (yyval) = NNEW(n_STATIC_DECLARATION_LIST)->appendChild((yyval)); + } +#line 4887 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 160: +#line 1186 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[-1])->appendChild((yyvsp[0])); + } +#line 4895 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 161: +#line 1189 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_STATEMENT_LIST); + } +#line 4903 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 162: +#line 1195 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_MEMBER_DECLARATION_LIST); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChildren((yyvsp[-1])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyval)); + NMORE((yyval), (yyvsp[0])); + } +#line 4916 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 163: +#line 1203 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 4925 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 164: +#line 1207 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[0]); + } +#line 4933 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 165: +#line 1210 "parser.y" /* yacc.c:1646 */ + { + /* empty */ + } +#line 4941 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 166: +#line 1212 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_METHOD_DECLARATION); + NMORE((yyval), (yyvsp[-8])); + (yyval)->appendChild((yyvsp[-9])); + (yyval)->appendChild((yyvsp[-6])); + (yyval)->appendChild(NTYPE((yyvsp[-5]), n_STRING)); + (yyval)->appendChild(NEXPAND((yyvsp[-4]), (yyvsp[-3]), (yyvsp[-2]))); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild((yyvsp[-1])); + (yyval)->appendChild((yyvsp[0])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyval)); + } +#line 4959 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 167: +#line 1228 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[-2]), n_TRAIT_USE); + (yyval)->appendChildren((yyvsp[-1])); + (yyval)->appendChild((yyvsp[0])); + } +#line 4969 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 168: +#line 1236 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_TRAIT_USE_LIST)->appendChild((yyvsp[0])); + } +#line 4977 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 169: +#line 1239 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[-2])->appendChild((yyvsp[0])); + } +#line 4985 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 170: +#line 1245 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 4993 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 171: +#line 1248 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0])); + } +#line 5001 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 172: +#line 1254 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_TRAIT_ADAPTATION_LIST); + } +#line 5009 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 173: +#line 1257 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[0]); + } +#line 5017 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 174: +#line 1263 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_TRAIT_ADAPTATION_LIST); + (yyval)->appendChild((yyvsp[0])); + } +#line 5026 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 175: +#line 1267 "parser.y" /* yacc.c:1646 */ + { + (yyvsp[-1])->appendChild((yyvsp[0])); + (yyval) = (yyvsp[-1]); + } +#line 5035 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 176: +#line 1274 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NMORE((yyvsp[-1]), (yyvsp[0])); + } +#line 5043 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 177: +#line 1277 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NMORE((yyvsp[-1]), (yyvsp[0])); + } +#line 5051 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 178: +#line 1283 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_TRAIT_INSTEADOF); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild((yyvsp[0])); + } +#line 5061 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 179: +#line 1291 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_TRAIT_REFERENCE_LIST); + (yyval)->appendChild((yyvsp[0])); + } +#line 5070 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 180: +#line 1295 "parser.y" /* yacc.c:1646 */ + { + (yyvsp[-2])->appendChild((yyvsp[0])); + (yyval) = (yyvsp[-2]); + } +#line 5079 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 181: +#line 1302 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_TRAIT_METHOD_REFERENCE); + (yyval)->appendChild(NTYPE((yyvsp[0]), n_STRING)); + } +#line 5088 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 182: +#line 1306 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[0]); + } +#line 5096 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 183: +#line 1312 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-1]), n_TRAIT_METHOD_REFERENCE); + NEXPAND((yyvsp[-2]), (yyvsp[-1]), NTYPE((yyvsp[0]), n_STRING)); + (yyval) = (yyvsp[-1]); + } +#line 5106 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 184: +#line 1320 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_TRAIT_AS); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-1])); + (yyval)->appendChild(NTYPE((yyvsp[0]), n_STRING)); + } +#line 5117 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 185: +#line 1326 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_TRAIT_AS); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild((yyvsp[0])); + (yyval)->appendChild(NNEW(n_EMPTY)); + } +#line 5128 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 186: +#line 1335 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 5136 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 187: +#line 1338 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_METHOD_MODIFIER_LIST); + (yyval)->appendChild(NTYPE((yyvsp[0]), n_STRING)); + } +#line 5145 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 188: +#line 1346 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 5153 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 189: +#line 1349 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0])); + } +#line 5161 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 191: +#line 1356 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_MEMBER_MODIFIER_LIST); + (yyval)->appendChild(NTYPE((yyvsp[0]), n_STRING)); + } +#line 5170 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 192: +#line 1363 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_METHOD_MODIFIER_LIST); + } +#line 5178 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 193: +#line 1366 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[0]), n_METHOD_MODIFIER_LIST); + (yyval) = (yyvsp[0]); + } +#line 5187 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 194: +#line 1373 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_MEMBER_MODIFIER_LIST); + (yyval)->appendChild(NTYPE((yyvsp[0]), n_STRING)); + } +#line 5196 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 195: +#line 1377 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[-1])->appendChild(NTYPE((yyvsp[0]), n_STRING)); + } +#line 5204 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 202: +#line 1392 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_MEMBER_DECLARATION); + (yyval)->appendChild(NTYPE((yyvsp[0]), n_VARIABLE)); + (yyval)->appendChild(NNEW(n_EMPTY)); + + (yyval) = (yyvsp[-2])->appendChild((yyval)); + } +#line 5216 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 203: +#line 1399 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_MEMBER_DECLARATION); + (yyval)->appendChild(NTYPE((yyvsp[-2]), n_VARIABLE)); + (yyval)->appendChild((yyvsp[0])); + + (yyval) = (yyvsp[-4])->appendChild((yyval)); + } +#line 5228 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 204: +#line 1406 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_MEMBER_DECLARATION); + (yyval)->appendChild(NTYPE((yyvsp[0]), n_VARIABLE)); + (yyval)->appendChild(NNEW(n_EMPTY)); + + (yyval) = NNEW(n_CLASS_MEMBER_DECLARATION_LIST)->appendChild((yyval)); + } +#line 5240 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 205: +#line 1413 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_MEMBER_DECLARATION); + (yyval)->appendChild(NTYPE((yyvsp[-2]), n_VARIABLE)); + (yyval)->appendChild((yyvsp[0])); + + (yyval) = NNEW(n_CLASS_MEMBER_DECLARATION_LIST)->appendChild((yyval)); + } +#line 5252 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 206: +#line 1423 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_CONSTANT_DECLARATION); + (yyval)->appendChild(NTYPE((yyvsp[-2]), n_STRING)); + (yyval)->appendChild((yyvsp[0])); + + (yyvsp[-4])->appendChild((yyval)); + + (yyval) = (yyvsp[-4]); + } +#line 5266 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 207: +#line 1432 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-3]), n_CLASS_CONSTANT_DECLARATION_LIST); + (yyval) = NNEW(n_CLASS_CONSTANT_DECLARATION); + (yyval)->appendChild(NTYPE((yyvsp[-2]), n_STRING)); + (yyval)->appendChild((yyvsp[0])); + (yyvsp[-3])->appendChild((yyval)); + + (yyval) = (yyvsp[-3]); + } +#line 5280 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 208: +#line 1444 "parser.y" /* yacc.c:1646 */ + { + (yyvsp[-2])->appendChild((yyvsp[0])); + } +#line 5288 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 209: +#line 1447 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_ECHO_LIST); + (yyval)->appendChild((yyvsp[0])); + } +#line 5297 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 210: +#line 1454 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 5305 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 212: +#line 1462 "parser.y" /* yacc.c:1646 */ + { + (yyvsp[-2])->appendChild((yyvsp[0])); + } +#line 5313 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 213: +#line 1465 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EXPRESSION_LIST); + (yyval)->appendChild((yyvsp[0])); + } +#line 5322 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 214: +#line 1472 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-5]), n_LIST); + (yyvsp[-5])->appendChild(NEXPAND((yyvsp[-4]), (yyvsp[-3]), (yyvsp[-2]))); + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-5])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5335 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 215: +#line 1480 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5346 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 216: +#line 1486 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild(NTYPE((yyvsp[-2]), n_OPERATOR)); + + NTYPE((yyvsp[-1]), n_VARIABLE_REFERENCE); + (yyvsp[-1])->appendChild((yyvsp[0])); + + (yyval)->appendChild((yyvsp[-1])); + } +#line 5361 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 217: +#line 1496 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-5])); + (yyval)->appendChild(NTYPE((yyvsp[-4]), n_OPERATOR)); + + NTYPE((yyvsp[-2]), n_NEW); + (yyvsp[-2])->appendChild((yyvsp[-1])); + (yyvsp[-2])->appendChild((yyvsp[0])); + + NTYPE((yyvsp[-3]), n_VARIABLE_REFERENCE); + (yyvsp[-3])->appendChild((yyvsp[-2])); + + (yyval)->appendChild((yyvsp[-3])); + } +#line 5380 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 218: +#line 1510 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5390 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 219: +#line 1515 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5401 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 220: +#line 1521 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5412 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 221: +#line 1527 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5423 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 222: +#line 1533 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5434 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 223: +#line 1539 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5445 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 224: +#line 1545 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5456 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 225: +#line 1551 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5467 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 226: +#line 1557 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5478 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 227: +#line 1563 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5489 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 228: +#line 1569 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5500 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 229: +#line 1575 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5511 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 230: +#line 1581 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_UNARY_POSTFIX_EXPRESSION); + (yyval)->appendChild((yyvsp[-1])); + (yyval)->appendChild(NTYPE((yyvsp[0]), n_OPERATOR)); + } +#line 5521 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 231: +#line 1586 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5531 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 232: +#line 1591 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_UNARY_POSTFIX_EXPRESSION); + (yyval)->appendChild((yyvsp[-1])); + (yyval)->appendChild(NTYPE((yyvsp[0]), n_OPERATOR)); + } +#line 5541 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 233: +#line 1596 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5551 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 234: +#line 1601 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5562 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 235: +#line 1607 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5573 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 236: +#line 1613 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5584 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 237: +#line 1619 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5595 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 238: +#line 1625 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5606 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 239: +#line 1631 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5617 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 240: +#line 1637 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5628 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 241: +#line 1643 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5639 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 242: +#line 1649 "parser.y" /* yacc.c:1646 */ + { + + /* The concatenation operator generates n_CONCATENATION_LIST instead of + n_BINARY_EXPRESSION because we tend to run into stack depth issues in a + lot of real-world cases otherwise (e.g., in PHP and JSON decoders). */ + + if ((yyvsp[-2])->type == n_CONCATENATION_LIST && (yyvsp[0])->type == n_CONCATENATION_LIST) { + (yyvsp[-2])->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyvsp[-2])->appendChildren((yyvsp[0])); + (yyval) = (yyvsp[-2]); + } else if ((yyvsp[-2])->type == n_CONCATENATION_LIST) { + (yyvsp[-2])->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyvsp[-2])->appendChild((yyvsp[0])); + (yyval) = (yyvsp[-2]); + } else if ((yyvsp[0])->type == n_CONCATENATION_LIST) { + (yyval) = NNEW(n_CONCATENATION_LIST); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChildren((yyvsp[0])); + } else { + (yyval) = NNEW(n_CONCATENATION_LIST); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } + } +#line 5670 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 243: +#line 1675 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5681 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 244: +#line 1681 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5692 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 245: +#line 1687 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5703 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 246: +#line 1693 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5714 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 247: +#line 1699 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5725 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 248: +#line 1705 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5736 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 249: +#line 1711 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5747 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 250: +#line 1717 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5757 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 251: +#line 1722 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5767 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 252: +#line 1727 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5777 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 253: +#line 1732 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5787 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 254: +#line 1737 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5798 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 255: +#line 1743 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5809 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 256: +#line 1749 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5820 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 257: +#line 1755 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5831 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 258: +#line 1761 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5842 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 259: +#line 1767 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5853 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 260: +#line 1773 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5864 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 261: +#line 1779 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5875 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 262: +#line 1785 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5886 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 263: +#line 1791 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5897 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 266: +#line 1799 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_TERNARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-4])); + (yyval)->appendChild(NTYPE((yyvsp[-3]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5910 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 267: +#line 1807 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_TERNARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild(NTYPE((yyvsp[-2]), n_OPERATOR)); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5923 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 268: +#line 1815 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5934 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 270: +#line 1822 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CAST_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_CAST)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5944 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 271: +#line 1827 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CAST_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_CAST)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5954 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 272: +#line 1832 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CAST_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_CAST)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5964 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 273: +#line 1837 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CAST_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_CAST)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5974 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 274: +#line 1842 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CAST_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_CAST)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5984 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 275: +#line 1847 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CAST_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_CAST)); + (yyval)->appendChild((yyvsp[0])); + } +#line 5994 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 276: +#line 1852 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CAST_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_CAST)); + (yyval)->appendChild((yyvsp[0])); + } +#line 6004 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 277: +#line 1857 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 6014 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 278: +#line 1862 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 6024 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 279: +#line 1867 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[0]), n_BACKTICKS_EXPRESSION); + (yyval) = (yyvsp[0]); + } +#line 6033 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 283: +#line 1874 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 6043 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 284: +#line 1879 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[0]), n_YIELD); + (yyvsp[0])->appendChild(NNEW(n_EMPTY)); + (yyvsp[0])->appendChild(NNEW(n_EMPTY)); + (yyval) = (yyvsp[0]); + } +#line 6054 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 285: +#line 1888 "parser.y" /* yacc.c:1646 */ + { + NSPAN((yyvsp[-9]), n_FUNCTION_DECLARATION, (yyvsp[-1])); + (yyvsp[-9])->appendChild(NNEW(n_EMPTY)); + (yyvsp[-9])->appendChild((yyvsp[-8])); + (yyvsp[-9])->appendChild(NNEW(n_EMPTY)); + (yyvsp[-9])->appendChild(NEXPAND((yyvsp[-7]), (yyvsp[-6]), (yyvsp[-5]))); + (yyvsp[-9])->appendChild((yyvsp[-4])); + (yyvsp[-9])->appendChild((yyvsp[-3])); + (yyvsp[-9])->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + + (yyval) = (yyvsp[-9]); + } +#line 6071 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 286: +#line 1903 "parser.y" /* yacc.c:1646 */ + { + NSPAN((yyvsp[-9]), n_FUNCTION_DECLARATION, (yyvsp[-1])); + NMORE((yyvsp[-9]), (yyvsp[-10])); + + (yyval) = NNEW(n_FUNCTION_MODIFIER_LIST); + (yyval)->appendChild(NTYPE((yyvsp[-10]), n_STRING)); + (yyvsp[-9])->appendChild((yyvsp[-10])); + + (yyvsp[-9])->appendChild(NNEW(n_EMPTY)); + (yyvsp[-9])->appendChild((yyvsp[-8])); + (yyvsp[-9])->appendChild(NNEW(n_EMPTY)); + (yyvsp[-9])->appendChild(NEXPAND((yyvsp[-7]), (yyvsp[-6]), (yyvsp[-5]))); + (yyvsp[-9])->appendChild((yyvsp[-4])); + (yyvsp[-9])->appendChild((yyvsp[-3])); + (yyvsp[-9])->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + + (yyval) = (yyvsp[-9]); + } +#line 6094 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 287: +#line 1924 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-1]), n_YIELD); + (yyvsp[0])->appendChild(NNEW(n_EMPTY)); + (yyvsp[-1])->appendChild((yyvsp[0])); + (yyval) = (yyvsp[-1]); + } +#line 6105 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 288: +#line 1930 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-1]), n_YIELD); + (yyvsp[0])->appendChild(NNEW(n_EMPTY)); + (yyvsp[-1])->appendChild((yyvsp[0])); + (yyval) = (yyvsp[-1]); + } +#line 6116 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 289: +#line 1936 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-3]), n_YIELD); + (yyvsp[-3])->appendChild((yyvsp[-2])); + (yyvsp[-3])->appendChild((yyvsp[0])); + (yyval) = (yyvsp[-3]); + } +#line 6127 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 290: +#line 1942 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-3]), n_YIELD); + (yyvsp[-3])->appendChild((yyvsp[-2])); + (yyvsp[-3])->appendChild((yyvsp[0])); + (yyval) = (yyvsp[-3]); + } +#line 6138 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 292: +#line 1955 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 6146 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 293: +#line 1958 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-3]), n_LEXICAL_VARIABLE_LIST); + (yyvsp[-3])->appendChildren((yyvsp[-1])); + (yyval) = (yyvsp[-3]); + } +#line 6156 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 294: +#line 1966 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[-2])->appendChild(NTYPE((yyvsp[0]), n_VARIABLE)); + } +#line 6164 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 295: +#line 1969 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-1]), n_VARIABLE_REFERENCE); + (yyvsp[-1])->appendChild(NTYPE((yyvsp[0]), n_VARIABLE)); + (yyval) = (yyvsp[-3])->appendChild((yyvsp[-1])); + } +#line 6174 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 296: +#line 1974 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_LEXICAL_VARIABLE_LIST); + (yyval)->appendChild(NTYPE((yyvsp[0]), n_VARIABLE)); + } +#line 6183 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 297: +#line 1978 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-1]), n_VARIABLE_REFERENCE); + (yyvsp[-1])->appendChild(NTYPE((yyvsp[0]), n_VARIABLE)); + (yyval) = NNEW(n_LEXICAL_VARIABLE_LIST); + (yyval)->appendChild((yyvsp[-1])); + } +#line 6194 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 298: +#line 1987 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_FUNCTION_CALL); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + } +#line 6204 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 299: +#line 1993 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyvsp[-3]), (yyvsp[-5])); + (yyval) = NNEW(n_FUNCTION_CALL); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + } +#line 6215 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 300: +#line 1999 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyvsp[-3]), (yyvsp[-4])); + (yyval) = NNEW(n_FUNCTION_CALL); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + } +#line 6226 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 301: +#line 2006 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_STATIC_ACCESS); + (yyval)->appendChild((yyvsp[-5])); + (yyval)->appendChild(NTYPE((yyvsp[-3]), n_STRING)); + + (yyval) = NNEW(n_FUNCTION_CALL)->appendChild((yyval)); + (yyval)->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + } +#line 6239 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 302: +#line 2015 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_STATIC_ACCESS); + (yyval)->appendChild((yyvsp[-5])); + (yyval)->appendChild(NTYPE((yyvsp[-3]), n_STRING)); + + (yyval) = NNEW(n_FUNCTION_CALL)->appendChild((yyval)); + (yyval)->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + } +#line 6252 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 303: +#line 2024 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_STATIC_ACCESS); + (yyval)->appendChild((yyvsp[-5])); + (yyval)->appendChild(NTYPE((yyvsp[-3]), n_STRING)); + + (yyval) = NNEW(n_FUNCTION_CALL)->appendChild((yyval)); + (yyval)->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + } +#line 6265 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 304: +#line 2033 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_STATIC_ACCESS); + (yyval)->appendChild((yyvsp[-5])); + (yyval)->appendChild(NTYPE((yyvsp[-3]), n_STRING)); + + (yyval) = NNEW(n_FUNCTION_CALL)->appendChild((yyval)); + (yyval)->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + } +#line 6278 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 305: +#line 2041 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_FUNCTION_CALL); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + } +#line 6288 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 306: +#line 2049 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_CLASS_NAME); + } +#line 6296 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 307: +#line 2052 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_CLASS_NAME); + } +#line 6304 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 308: +#line 2055 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyvsp[0]), (yyvsp[-2])); + (yyval) = NTYPE((yyvsp[0]), n_CLASS_NAME); + } +#line 6313 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 309: +#line 2059 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyvsp[0]), (yyvsp[-1])); + (yyval) = NTYPE((yyvsp[0]), n_CLASS_NAME); + } +#line 6322 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 310: +#line 2066 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_CLASS_NAME); + } +#line 6330 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 311: +#line 2069 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyvsp[0]), (yyvsp[-2])); + (yyval) = NTYPE((yyvsp[0]), n_CLASS_NAME); + } +#line 6339 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 312: +#line 2073 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyvsp[0]), (yyvsp[-1])); + (yyval) = NTYPE((yyvsp[0]), n_CLASS_NAME); + } +#line 6348 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 315: +#line 2088 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_OBJECT_PROPERTY_ACCESS); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-1])); + for (xhpast::node_list_t::iterator ii = (yyvsp[0])->children.begin(); + ii != (yyvsp[0])->children.end(); + ++ii) { + + (yyval) = NNEW(n_OBJECT_PROPERTY_ACCESS)->appendChild((yyval)); + (yyval)->appendChild(*ii); + } + } +#line 6365 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 317: +#line 2104 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[-1])->appendChild((yyvsp[0])); + } +#line 6373 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 318: +#line 2107 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 6381 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 319: +#line 2113 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[0]); + } +#line 6389 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 320: +#line 2119 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 6397 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 321: +#line 2122 "parser.y" /* yacc.c:1646 */ + { + NSPAN((yyvsp[-1]), n_EMPTY, (yyvsp[0])); + (yyval) = (yyvsp[-1]); + } +#line 6406 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 322: +#line 2126 "parser.y" /* yacc.c:1646 */ + { + NSPAN((yyvsp[-2]), n_PARENTHETICAL_EXPRESSION, (yyvsp[0])); + (yyvsp[-2])->appendChild((yyvsp[-1])); + (yyval) = (yyvsp[-2]); + } +#line 6416 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 323: +#line 2134 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 6424 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 324: +#line 2137 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0])); + } +#line 6432 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 325: +#line 2143 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_NUMERIC_SCALAR); + } +#line 6440 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 326: +#line 2146 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_NUMERIC_SCALAR); + } +#line 6448 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 327: +#line 2149 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_STRING_SCALAR); + } +#line 6456 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 328: +#line 2152 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_MAGIC_SCALAR); + } +#line 6464 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 329: +#line 2155 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_MAGIC_SCALAR); + } +#line 6472 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 330: +#line 2158 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_MAGIC_SCALAR); + } +#line 6480 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 331: +#line 2161 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_MAGIC_SCALAR); + } +#line 6488 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 332: +#line 2164 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_MAGIC_SCALAR); + } +#line 6496 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 333: +#line 2167 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_MAGIC_SCALAR); + } +#line 6504 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 334: +#line 2170 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_MAGIC_SCALAR); + } +#line 6512 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 335: +#line 2173 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_MAGIC_SCALAR); + } +#line 6520 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 336: +#line 2176 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_HEREDOC); + } +#line 6528 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 339: +#line 2184 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyvsp[0]), (yyvsp[-2])); + (yyval) = (yyvsp[0]); + } +#line 6537 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 340: +#line 2188 "parser.y" /* yacc.c:1646 */ + { + NMORE((yyvsp[0]), (yyvsp[-1])); + (yyval) = (yyvsp[0]); + } +#line 6546 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 341: +#line 2192 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 6556 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 342: +#line 2197 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[0])); + } +#line 6566 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 343: +#line 2202 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-3]), n_ARRAY_LITERAL); + (yyvsp[-3])->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + (yyval) = (yyvsp[-3]); + } +#line 6576 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 344: +#line 2207 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-2]), n_ARRAY_LITERAL); + (yyvsp[-2])->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + (yyval) = (yyvsp[-2]); + } +#line 6586 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 346: +#line 2216 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_STATIC_ACCESS); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[0]), n_STRING)); + } +#line 6596 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 350: +#line 2227 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NMORE((yyvsp[0]), (yyvsp[-2])); + } +#line 6604 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 351: +#line 2230 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NMORE((yyvsp[0]), (yyvsp[-1])); + } +#line 6612 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 353: +#line 2237 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_ARRAY_VALUE_LIST); + } +#line 6620 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 354: +#line 2240 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NMORE((yyvsp[-1]), (yyvsp[0])); + } +#line 6628 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 355: +#line 2246 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 6636 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 357: +#line 2257 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild((yyvsp[0])); + + (yyval) = (yyvsp[-4])->appendChild((yyval)); + } +#line 6648 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 358: +#line 2264 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild((yyvsp[0])); + + (yyval) = (yyvsp[-2])->appendChild((yyval)); + } +#line 6660 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 359: +#line 2271 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild((yyvsp[0])); + + (yyval) = NNEW(n_ARRAY_VALUE_LIST)->appendChild((yyval)); + } +#line 6672 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 360: +#line 2278 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild((yyvsp[0])); + + (yyval) = NNEW(n_ARRAY_VALUE_LIST)->appendChild((yyval)); + } +#line 6684 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 366: +#line 2308 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_OBJECT_PROPERTY_ACCESS); + (yyval)->appendChild((yyvsp[-4])); + (yyval)->appendChild((yyvsp[-2])); + + if ((yyvsp[-1])->type != n_EMPTY) { + (yyval) = NNEW(n_METHOD_CALL)->appendChild((yyval)); + (yyval)->appendChild((yyvsp[-1])); + } + + for (xhpast::node_list_t::iterator ii = (yyvsp[0])->children.begin(); + ii != (yyvsp[0])->children.end(); + ++ii) { + + if ((*ii)->type == n_CALL_PARAMETER_LIST) { + (yyval) = NNEW(n_METHOD_CALL)->appendChild((yyval)); + (yyval)->appendChild((*ii)); + } else { + (yyval) = NNEW(n_OBJECT_PROPERTY_ACCESS)->appendChild((yyval)); + (yyval)->appendChild((*ii)); + } + } + } +#line 6712 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 368: +#line 2335 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[-1])->appendChildren((yyvsp[0])); + } +#line 6720 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 369: +#line 2338 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 6728 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 370: +#line 2344 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + (yyval)->appendChild((yyvsp[-1])); + if ((yyvsp[0])->type != n_EMPTY) { + (yyval)->appendChild((yyvsp[0])); + } + } +#line 6740 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 371: +#line 2354 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 6751 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 372: +#line 2360 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 6762 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 373: +#line 2369 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0])); + } +#line 6770 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 376: +#line 2377 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 6778 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 378: +#line 2384 "parser.y" /* yacc.c:1646 */ + { + xhpast::Node *last = (yyvsp[-1]); + NMORE((yyvsp[-1]), (yyvsp[0])); + while (last->firstChild() && + last->firstChild()->type == n_VARIABLE_VARIABLE) { + NMORE(last, (yyvsp[0])); + last = last->firstChild(); + } + last->appendChild((yyvsp[0])); + + (yyval) = (yyvsp[-1]); + } +#line 6795 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 379: +#line 2399 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_STATIC_ACCESS); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild((yyvsp[0])); + } +#line 6805 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 380: +#line 2404 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_STATIC_ACCESS); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild((yyvsp[0])); + } +#line 6815 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 382: +#line 2416 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 6826 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 383: +#line 2422 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 6837 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 388: +#line 2438 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0])); + } +#line 6845 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 389: +#line 2441 "parser.y" /* yacc.c:1646 */ + { + xhpast::Node *last = (yyvsp[-1]); + NMORE((yyvsp[-1]), (yyvsp[0])); + while (last->firstChild() && + last->firstChild()->type == n_VARIABLE_VARIABLE) { + NMORE(last, (yyvsp[0])); + last = last->firstChild(); + } + last->appendChild((yyvsp[0])); + + (yyval) = (yyvsp[-1]); + } +#line 6862 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 391: +#line 2457 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 6873 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 392: +#line 2463 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 6884 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 394: +#line 2473 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[0]), n_VARIABLE); + } +#line 6892 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 395: +#line 2476 "parser.y" /* yacc.c:1646 */ + { + NSPAN((yyvsp[-3]), n_VARIABLE_EXPRESSION, (yyvsp[0])); + (yyvsp[-3])->appendChild((yyvsp[-1])); + (yyval) = (yyvsp[-3]); + } +#line 6902 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 396: +#line 2484 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 6910 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 397: +#line 2487 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[0]); + } +#line 6918 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 400: +#line 2498 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 6929 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 401: +#line 2504 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 6940 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 403: +#line 2514 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[0]), n_STRING); + (yyval) = (yyvsp[0]); + } +#line 6949 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 404: +#line 2518 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0])); + } +#line 6957 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 405: +#line 2524 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[0]), n_VARIABLE_VARIABLE); + } +#line 6965 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 406: +#line 2527 "parser.y" /* yacc.c:1646 */ + { + (yyvsp[0]) = NTYPE((yyvsp[0]), n_VARIABLE_VARIABLE); + + xhpast::Node *last = (yyvsp[-1]); + while (last->firstChild() && + last->firstChild()->type == n_VARIABLE_VARIABLE) { + last = last->firstChild(); + } + last->appendChild((yyvsp[0])); + + (yyval) = (yyvsp[-1]); + } +#line 6982 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 407: +#line 2542 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[-2])->appendChild((yyvsp[0])); + } +#line 6990 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 408: +#line 2545 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_ASSIGNMENT_LIST); + (yyval)->appendChild((yyvsp[0])); + } +#line 6999 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 410: +#line 2553 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_LIST); + (yyval)->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + } +#line 7008 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 411: +#line 2557 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + } +#line 7016 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 412: +#line 2563 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_ARRAY_VALUE_LIST); + } +#line 7024 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 413: +#line 2566 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NMORE((yyvsp[-1]), (yyvsp[0])); + } +#line 7032 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 414: +#line 2572 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild((yyvsp[0])); + + (yyval) = (yyvsp[-4])->appendChild((yyval)); + } +#line 7044 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 415: +#line 2579 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild((yyvsp[0])); + + (yyval) = (yyvsp[-2])->appendChild((yyval)); + } +#line 7056 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 416: +#line 2586 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild((yyvsp[0])); + + (yyval) = NNEW(n_ARRAY_VALUE_LIST)->appendChild((yyval)); + } +#line 7068 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 417: +#line 2593 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild((yyvsp[0])); + + (yyval) = NNEW(n_ARRAY_VALUE_LIST)->appendChild((yyval)); + } +#line 7080 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 418: +#line 2600 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_VARIABLE_REFERENCE)->appendChild((yyvsp[0]))); + + (yyval) = (yyvsp[-5])->appendChild((yyval)); + } +#line 7092 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 419: +#line 2607 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_VARIABLE_REFERENCE)->appendChild((yyvsp[0]))); + + (yyval) = (yyvsp[-3])->appendChild((yyval)); + } +#line 7104 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 420: +#line 2614 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_VARIABLE_REFERENCE)->appendChild((yyvsp[0]))); + + (yyval) = NNEW(n_ARRAY_VALUE_LIST)->appendChild((yyval)); + } +#line 7116 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 421: +#line 2621 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild(NTYPE((yyvsp[-1]), n_VARIABLE_REFERENCE)->appendChild((yyvsp[0]))); + + (yyval) = NNEW(n_ARRAY_VALUE_LIST)->appendChild((yyval)); + } +#line 7128 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 422: +#line 2631 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-3]), n_SYMBOL_NAME); + + NSPAN((yyvsp[-2]), n_CALL_PARAMETER_LIST, (yyvsp[0])); + (yyvsp[-2])->appendChildren((yyvsp[-1])); + + (yyval) = NNEW(n_FUNCTION_CALL); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-2])); + } +#line 7143 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 423: +#line 2641 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-3]), n_SYMBOL_NAME); + + NSPAN((yyvsp[-2]), n_CALL_PARAMETER_LIST, (yyvsp[0])); + (yyvsp[-2])->appendChild((yyvsp[-1])); + + (yyval) = NNEW(n_FUNCTION_CALL); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-2])); + } +#line 7158 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 424: +#line 2651 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[-1]), n_INCLUDE_FILE)->appendChild((yyvsp[0])); + } +#line 7166 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 425: +#line 2654 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[-1]), n_INCLUDE_FILE)->appendChild((yyvsp[0])); + } +#line 7174 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 426: +#line 2657 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-3]), n_SYMBOL_NAME); + + NSPAN((yyvsp[-2]), n_CALL_PARAMETER_LIST, (yyvsp[0])); + (yyvsp[-2])->appendChild((yyvsp[-1])); + + (yyval) = NNEW(n_FUNCTION_CALL); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-2])); + } +#line 7189 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 427: +#line 2667 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[-1]), n_INCLUDE_FILE)->appendChild((yyvsp[0])); + } +#line 7197 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 428: +#line 2670 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NTYPE((yyvsp[-1]), n_INCLUDE_FILE)->appendChild((yyvsp[0])); + } +#line 7205 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 429: +#line 2676 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_EMPTY); + (yyval)->appendChild((yyvsp[0])); + } +#line 7214 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 430: +#line 2680 "parser.y" /* yacc.c:1646 */ + { + (yyval) = (yyvsp[-2])->appendChild((yyvsp[0])); + } +#line 7222 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 431: +#line 2686 "parser.y" /* yacc.c:1646 */ + { + NSPAN((yyvsp[-2]), n_PARENTHETICAL_EXPRESSION, (yyvsp[0])); + (yyvsp[-2])->appendChild((yyvsp[-1])); + (yyval) = (yyvsp[-2]); + } +#line 7232 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 432: +#line 2691 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0])); + } +#line 7240 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 433: +#line 2697 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 7251 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 434: +#line 2703 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 7262 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 435: +#line 2709 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild(NTYPE((yyvsp[-3]), n_STRING_SCALAR)); + (yyval)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 7273 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 436: +#line 2715 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[-3])); + (yyval)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 7284 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 437: +#line 2721 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild(NTYPE((yyvsp[-3]), n_STRING)); + (yyval)->appendChild((yyvsp[-1])); + NMORE((yyval), (yyvsp[0])); + } +#line 7295 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 438: +#line 2730 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-3]), n_ARRAY_LITERAL); + (yyvsp[-3])->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + (yyval) = (yyvsp[-3]); + } +#line 7305 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 439: +#line 2735 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-2]), n_ARRAY_LITERAL); + (yyvsp[-2])->appendChild(NEXPAND((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]))); + (yyval) = (yyvsp[-2]); + } +#line 7315 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 440: +#line 2743 "parser.y" /* yacc.c:1646 */ + { + NTYPE((yyvsp[-2]), n_NEW); + (yyvsp[-2])->appendChild((yyvsp[-1])); + (yyvsp[-2])->appendChild((yyvsp[0])); + (yyval) = (yyvsp[-2]); + } +#line 7326 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 441: +#line 2752 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_STATIC_ACCESS); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[0]), n_STRING)); + } +#line 7336 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + case 442: +#line 2757 "parser.y" /* yacc.c:1646 */ + { + (yyval) = NNEW(n_CLASS_STATIC_ACCESS); + (yyval)->appendChild((yyvsp[-2])); + (yyval)->appendChild(NTYPE((yyvsp[0]), n_STRING)); + } +#line 7346 "parser.yacc.cpp" /* yacc.c:1646 */ + break; + + +#line 7350 "parser.yacc.cpp" /* yacc.c:1646 */ + default: break; + } + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + /* Now 'shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ +yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); + + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (yyscanner, root, YY_("syntax error")); +#else +# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ + yyssp, yytoken) + { + char const *yymsgp = YY_("syntax error"); + int yysyntax_error_status; + yysyntax_error_status = YYSYNTAX_ERROR; + if (yysyntax_error_status == 0) + yymsgp = yymsg; + else if (yysyntax_error_status == 1) + { + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); + if (!yymsg) + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + yysyntax_error_status = 2; + } + else + { + yysyntax_error_status = YYSYNTAX_ERROR; + yymsgp = yymsg; + } + } + yyerror (yyscanner, root, yymsgp); + if (yysyntax_error_status == 2) + goto yyexhaustedlab; + } +# undef YYSYNTAX_ERROR +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval, yyscanner, root); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + /* Do not reclaim the symbols of the rule whose action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (!yypact_value_is_default (yyn)) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + yystos[yystate], yyvsp, yyscanner, root); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#if !defined yyoverflow || YYERROR_VERBOSE +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (yyscanner, root, YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEMPTY) + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, yyscanner, root); + } + /* Do not reclaim the symbols of the rule whose action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp, yyscanner, root); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + return yyresult; +} +#line 2764 "parser.y" /* yacc.c:1906 */ + + +const char* yytokname(int tok) { + if (tok < 255) { + return NULL; + } + return yytname[YYTRANSLATE(tok)]; +} +/* @generated */ diff --git a/support/xhpast/parser_nodes.php b/support/xhpast/parser_nodes.php new file mode 100644 --- /dev/null +++ b/support/xhpast/parser_nodes.php @@ -0,0 +1,127 @@ + 'n_PROGRAM', + 9001 => 'n_SYMBOL_NAME', + 9002 => 'n_HALT_COMPILER', + 9003 => 'n_NAMESPACE', + 9004 => 'n_STATEMENT', + 9005 => 'n_EMPTY', + 9006 => 'n_STATEMENT_LIST', + 9007 => 'n_OPEN_TAG', + 9008 => 'n_CLOSE_TAG', + 9009 => 'n_USE_LIST', + 9010 => 'n_USE', + 9011 => 'n_CONSTANT_DECLARATION_LIST', + 9012 => 'n_CONSTANT_DECLARATION', + 9013 => 'n_STRING', + 9014 => 'n_LABEL', + 9015 => 'n_CONDITION_LIST', + 9016 => 'n_CONTROL_CONDITION', + 9017 => 'n_IF', + 9018 => 'n_ELSEIF', + 9019 => 'n_ELSE', + 9020 => 'n_WHILE', + 9021 => 'n_DO_WHILE', + 9022 => 'n_FOR', + 9023 => 'n_FOR_EXPRESSION', + 9024 => 'n_SWITCH', + 9025 => 'n_BREAK', + 9026 => 'n_CONTINUE', + 9027 => 'n_RETURN', + 9028 => 'n_GLOBAL_DECLARATION_LIST', + 9029 => 'n_GLOBAL_DECLARATION', + 9030 => 'n_STATIC_DECLARATION_LIST', + 9031 => 'n_STATIC_DECLARATION', + 9032 => 'n_ECHO_LIST', + 9033 => 'n_ECHO', + 9034 => 'n_INLINE_HTML', + 9035 => 'n_UNSET_LIST', + 9036 => 'n_UNSET', + 9037 => 'n_FOREACH', + 9038 => 'n_FOREACH_EXPRESSION', + 9039 => 'n_THROW', + 9040 => 'n_GOTO', + 9041 => 'n_TRY', + 9042 => 'n_CATCH_LIST', + 9043 => 'n_CATCH', + 9044 => 'n_DECLARE', + 9045 => 'n_DECLARE_DECLARATION_LIST', + 9046 => 'n_DECLARE_DECLARATION', + 9047 => 'n_VARIABLE', + 9048 => 'n_REFERENCE', + 9049 => 'n_VARIABLE_REFERENCE', + 9050 => 'n_FUNCTION_DECLARATION', + 9051 => 'n_CLASS_DECLARATION', + 9052 => 'n_CLASS_ATTRIBUTES', + 9053 => 'n_EXTENDS', + 9054 => 'n_EXTENDS_LIST', + 9055 => 'n_IMPLEMENTS_LIST', + 9056 => 'n_INTERFACE_DECLARATION', + 9057 => 'n_CASE', + 9058 => 'n_DEFAULT', + 9059 => 'n_DECLARATION_PARAMETER_LIST', + 9060 => 'n_DECLARATION_PARAMETER', + 9061 => 'n_TYPE_NAME', + 9062 => 'n_VARIABLE_VARIABLE', + 9063 => 'n_CLASS_MEMBER_DECLARATION_LIST', + 9064 => 'n_CLASS_MEMBER_DECLARATION', + 9065 => 'n_CLASS_CONSTANT_DECLARATION_LIST', + 9066 => 'n_CLASS_CONSTANT_DECLARATION', + 9067 => 'n_METHOD_DECLARATION', + 9068 => 'n_METHOD_MODIFIER_LIST', + 9069 => 'n_FUNCTION_MODIFIER_LIST', + 9070 => 'n_CLASS_MEMBER_MODIFIER_LIST', + 9071 => 'n_EXPRESSION_LIST', + 9072 => 'n_LIST', + 9073 => 'n_ASSIGNMENT', + 9074 => 'n_NEW', + 9075 => 'n_UNARY_PREFIX_EXPRESSION', + 9076 => 'n_UNARY_POSTFIX_EXPRESSION', + 9077 => 'n_BINARY_EXPRESSION', + 9078 => 'n_TERNARY_EXPRESSION', + 9079 => 'n_CAST_EXPRESSION', + 9080 => 'n_CAST', + 9081 => 'n_OPERATOR', + 9082 => 'n_ARRAY_LITERAL', + 9083 => 'n_EXIT_EXPRESSION', + 9084 => 'n_BACKTICKS_EXPRESSION', + 9085 => 'n_LEXICAL_VARIABLE_LIST', + 9086 => 'n_NUMERIC_SCALAR', + 9087 => 'n_STRING_SCALAR', + 9088 => 'n_MAGIC_SCALAR', + 9089 => 'n_CLASS_STATIC_ACCESS', + 9090 => 'n_CLASS_NAME', + 9091 => 'n_MAGIC_CLASS_KEYWORD', + 9092 => 'n_OBJECT_PROPERTY_ACCESS', + 9093 => 'n_ARRAY_VALUE_LIST', + 9094 => 'n_ARRAY_VALUE', + 9095 => 'n_CALL_PARAMETER_LIST', + 9096 => 'n_VARIABLE_EXPRESSION', + 9097 => 'n_INCLUDE_FILE', + 9098 => 'n_HEREDOC', + 9099 => 'n_FUNCTION_CALL', + 9100 => 'n_INDEX_ACCESS', + 9101 => 'n_ASSIGNMENT_LIST', + 9102 => 'n_METHOD_CALL', + 9103 => 'n_CONCATENATION_LIST', + 9104 => 'n_PARENTHETICAL_EXPRESSION', + 9105 => 'n_TRAIT_USE', + 9106 => 'n_TRAIT_USE_LIST', + 9107 => 'n_TRAIT_ADAPTATION_LIST', + 9108 => 'n_TRAIT_INSTEADOF', + 9109 => 'n_TRAIT_REFERENCE_LIST', + 9110 => 'n_TRAIT_METHOD_REFERENCE', + 9111 => 'n_TRAIT_AS', + 9112 => 'n_YIELD', + 9113 => 'n_FINALLY', + 9114 => 'n_UNPACK', + 9115 => 'n_DECLARATION_RETURN', + 9116 => 'n_NULLABLE_TYPE', + ); +} diff --git a/support/xhpast/scanner.l b/support/xhpast/scanner.l new file mode 100644 --- /dev/null +++ b/support/xhpast/scanner.l @@ -0,0 +1,488 @@ +%{ +#include "ast.hpp" +#define push_state(s) xhp_new_push_state(s, yyg) +#define pop_state() xhp_new_pop_state(yyg) +#define set_state(s) xhp_set_state(s, yyg) + +#define pttok(t, txt) \ + yyextra->token_list.push_back( \ + new xhpast::Token(t, txt, yyextra->list_size++)); \ + *yylval = new xhpast::Node(0, yyextra->list_size - 1); +#define ptok(t) \ + pttok(t, yytext); +#define tok(t) \ + ptok(t); \ + return yy_token(t, yyg) +#define YY_USER_INIT \ + if (yyextra->insert_token) { \ + yyg->yy_init = 0; \ + int ft = yyextra->insert_token; \ + yyextra->insert_token = 0; \ + return yy_token(ft, yyg); \ + } + +using namespace std; + +const char* yytokname(int tok); +static int yy_token(int tok, struct yyguts_t* yyg); +static void yy_scan_newlines(const char* text, struct yyguts_t* yyg); + +%} + +%option prefix="xhpast" +%option reentrant + /* PHP allows IF or if */ +%option case-insensitive +%option noyywrap nodefault +%option stack +%option bison-bridge +%option 8bit + + /* The different lexing states. Note that the transitions are done either + * in the lex actions, or in a generic manner in yy_token(). */ +%s PHP +%s PHP_COMMENT +%s PHP_EOL_COMMENT +%s PHP_DOC_COMMENT +%s PHP_HEREDOC_START +%s PHP_HEREDOC_NSTART +%s PHP_HEREDOC_NEWLINE +%s PHP_NO_RESERVED_WORDS +%s PHP_NO_RESERVED_WORDS_PERSIST +%s PHP_ + +LNUM [0-9]+ +DNUM ([0-9]*"."[0-9]+)|([0-9]+"."[0-9]*) +EXPONENT_DNUM (({LNUM}|{DNUM})[eE][+-]?{LNUM}) +HNUM "0x"[0-9a-fA-F]+ +BNUM "0b"[01]+ + +LABEL [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]* +BYTE (.|\n) + +WHITESPACE [ \n\r\t]+ +TABS_AND_SPACES [ \t]* +NEWLINE ("\r\n"|"\n"|"\r") + +%% + + /* Open / close PHP + inline HTML */ +{ + "{ + ("?>"|""){NEWLINE}? { + yy_scan_newlines(yytext + 2, yyg); + tok(T_CLOSE_TAG); + } +} + + /* Comments and whitespace */ +{ + "#"|"//" { + push_state(PHP_EOL_COMMENT); + yymore(); + } + "/**"{WHITESPACE} { + yy_scan_newlines(yytext + 3, yyg); + push_state(PHP_DOC_COMMENT); + yymore(); + } + "/*" { + push_state(PHP_COMMENT); + yymore(); + } + {WHITESPACE}+ { + yy_scan_newlines(yytext, yyg); + ptok(T_WHITESPACE); + } +} +<> { + ptok(T_COMMENT); + pop_state(); +} +{ + {NEWLINE} { + ++yyextra->lineno; + ptok(T_COMMENT); + pop_state(); + } + [^\r\n?]+ yymore(); + "?>" { + yyless(yyleng - 2); + ptok(T_COMMENT); + pop_state(); + } + . yymore(); +} +{ + {NEWLINE} { + ++yyextra->lineno; + yymore(); + } + [^*\r\n]+|"*" yymore(); +} +"*/" { + ptok(T_DOC_COMMENT); + pop_state(); +} +<> { + ptok(T_DOC_COMMENT); + pop_state(); +} +"*/" { + ptok(T_COMMENT); + pop_state(); +} +<> { + ptok(T_COMMENT); + pop_state(); +} + + /* Reserved words */ +{ + include tok(T_INCLUDE); + include_once tok(T_INCLUDE_ONCE); + eval tok(T_EVAL); + require tok(T_REQUIRE); + require_once tok(T_REQUIRE_ONCE); + or tok(T_LOGICAL_OR); + xor tok(T_LOGICAL_XOR); + and tok(T_LOGICAL_AND); + print tok(T_PRINT); + instanceof tok(T_INSTANCEOF); + new tok(T_NEW); + clone tok(T_CLONE); + exit tok(T_EXIT); + if tok(T_IF); + elseif tok(T_ELSEIF); + else tok(T_ELSE); + endif tok(T_ENDIF); + echo tok(T_ECHO); + do tok(T_DO); + while tok(T_WHILE); + endwhile tok(T_ENDWHILE); + for tok(T_FOR); + endfor tok(T_ENDFOR); + foreach tok(T_FOREACH); + endforeach tok(T_ENDFOREACH); + declare tok(T_DECLARE); + enddeclare tok(T_ENDDECLARE); + as tok(T_AS); + switch tok(T_SWITCH); + endswitch tok(T_ENDSWITCH); + case tok(T_CASE); + default tok(T_DEFAULT); + break tok(T_BREAK); + continue tok(T_CONTINUE); + goto tok(T_GOTO); + function tok(T_FUNCTION); + const tok(T_CONST); + return tok(T_RETURN); + try tok(T_TRY); + catch tok(T_CATCH); + throw tok(T_THROW); + use tok(T_USE); + global tok(T_GLOBAL); + static tok(T_STATIC); + abstract tok(T_ABSTRACT); + final tok(T_FINAL); + private tok(T_PRIVATE); + protected tok(T_PROTECTED); + public tok(T_PUBLIC); + var tok(T_VAR); + unset tok(T_UNSET); + isset tok(T_ISSET); + empty tok(T_EMPTY); + __halt_compiler tok(T_HALT_COMPILER); + class tok(T_CLASS); + interface tok(T_INTERFACE); + extends tok(T_EXTENDS); + implements tok(T_IMPLEMENTS); + list tok(T_LIST); + array tok(T_ARRAY); + __class__ tok(T_CLASS_C); + __method__ tok(T_METHOD_C); + __function__ tok(T_FUNC_C); + __line__ tok(T_LINE); + __file__ tok(T_FILE); + namespace tok(T_NAMESPACE); + __namespace__ tok(T_NS_C); + __dir__ tok(T_DIR); + insteadof tok(T_INSTEADOF); + callable tok(T_CALLABLE); + trait tok(T_TRAIT); + __trait__ tok(T_TRAIT_C); + yield tok(T_YIELD); + finally tok(T_FINALLY); +} + + /* Operators */ +{ + "+=" tok(T_PLUS_EQUAL); + "-=" tok(T_MINUS_EQUAL); + "*=" tok(T_MUL_EQUAL); + "/=" tok(T_DIV_EQUAL); + ".=" tok(T_CONCAT_EQUAL); + "%=" tok(T_MOD_EQUAL); + "&=" tok(T_AND_EQUAL); + "|=" tok(T_OR_EQUAL); + "^=" tok(T_XOR_EQUAL); + "<<=" tok(T_SL_EQUAL); + ">>=" tok(T_SR_EQUAL); + "||" tok(T_BOOLEAN_OR); + "&&" tok(T_BOOLEAN_AND); + "==" tok(T_IS_EQUAL); + "!="|"<>" tok(T_IS_NOT_EQUAL); + "===" tok(T_IS_IDENTICAL); + "!==" tok(T_IS_NOT_IDENTICAL); + "<=" tok(T_IS_SMALLER_OR_EQUAL); + ">=" tok(T_IS_GREATER_OR_EQUAL); + "<<" tok(T_SL); + ">>" tok(T_SR); + "++" tok(T_INC); + "--" tok(T_DEC); + "->" tok(T_OBJECT_OPERATOR); + "=>" tok(T_DOUBLE_ARROW); + "::" tok(T_PAAMAYIM_NEKUDOTAYIM); + "\\" tok(T_NS_SEPARATOR); + "..." tok(T_ELLIPSIS); + "??" tok(T_COALESCE); + "<=>" tok(T_SPACESHIP); +} + + /* Casts */ +{ + "("{TABS_AND_SPACES}(int|integer){TABS_AND_SPACES}")" tok(T_INT_CAST); + "("{TABS_AND_SPACES}(real|double|float){TABS_AND_SPACES}")" tok(T_DOUBLE_CAST); + "("{TABS_AND_SPACES}(string|binary){TABS_AND_SPACES}")" tok(T_STRING_CAST); + "("{TABS_AND_SPACES}array{TABS_AND_SPACES}")" tok(T_ARRAY_CAST); + "("{TABS_AND_SPACES}object{TABS_AND_SPACES}")" tok(T_OBJECT_CAST); + "("{TABS_AND_SPACES}(bool|boolean){TABS_AND_SPACES}")" tok(T_BOOL_CAST); + "("{TABS_AND_SPACES}unset{TABS_AND_SPACES}")" tok(T_UNSET_CAST); +} + + /* Scalars (parsing these doesn't really matter since we just pass them + through literally) */ +{ + {LNUM}|{HNUM}|{BNUM} tok(T_LNUMBER); + {DNUM}|{EXPONENT_DNUM} tok(T_DNUMBER); + {LABEL} tok(T_STRING); + "$"{LABEL} tok(T_VARIABLE); + b?'(\\.|\\\n|[^\\']+)*'|b?\"(\\.|\\\n|[^\\\"]+)*\" { + yy_scan_newlines(yytext, yyg); + tok(T_CONSTANT_ENCAPSED_STRING); + } + `[^`]*` { + yy_scan_newlines(yytext, yyg); + tok(T_BACKTICKS_EXPR); + } +} + + /* (HERE|NOW)DOC's */ +b?"<<<"{TABS_AND_SPACES} { + push_state(PHP_HEREDOC_START); + yyextra->heredoc_yyleng = yyleng; + yymore(); +} +{ + "'"{LABEL}"'"|\"{LABEL}\" { + // Create a new string for the heredoc label. Since we're using yymore above + // yytext will actually start at the "<<<" and not the label. Use of + // heredoc_yyleng jumps past that. Then we add 1 to get past the " or '. The + // match is similar to calculate length. + yyextra->heredoc_label = string( + yytext + yyextra->heredoc_yyleng + 1, + yyleng - yyextra->heredoc_yyleng - 2); + set_state(PHP_HEREDOC_NSTART); + yyextra->heredoc_yyleng = yyleng; + yymore(); + } + {LABEL} { + yyextra->heredoc_label = string(yytext + yyextra->heredoc_yyleng); + set_state(PHP_HEREDOC_NSTART); + yyextra->heredoc_yyleng = yyleng; + yymore(); + } +} +{NEWLINE} { + yyextra->heredoc_yyleng = yyleng; + set_state(PHP_HEREDOC_NEWLINE); + yymore(); +} +{ + {LABEL};?{NEWLINE} { + if (strncmp( + yyextra->heredoc_label.c_str(), + yytext + yyextra->heredoc_yyleng, yyextra->heredoc_label.size()) == 0) { + + switch (yytext[yyextra->heredoc_yyleng + yyextra->heredoc_label.size()]) { + case ';': case '\n': case '\r': + yyless( + yyleng - ( + yyleng - + yyextra->heredoc_yyleng - + yyextra->heredoc_label.size())); + pop_state(); + tok(T_HEREDOC); + } + } + ++yyextra->lineno; + yyextra->heredoc_yyleng = yyleng; + yymore(); + } + [^\r\n]+ { + yyextra->heredoc_yyleng = yyleng; + yymore(); + } + {NEWLINE} { + ++yyextra->lineno; + yyextra->heredoc_yyleng = yyleng; + yymore(); + } +} + + /* Other */ +<*>{BYTE} { + tok(yytext[0]); + // fix unused function warnings + yy_top_state(NULL); + yyunput(0, 0, NULL); +} + +%% + +#ifdef DEBUG +static const char* yy_state_name(int state) { + switch (state) { + case INITIAL: + return "INITIAL"; + case PHP: + return "PHP"; + case PHP_COMMENT: + return "PHP_COMMENT"; + case PHP_EOL_COMMENT: + return "PHP_EOL_COMMENT"; + case PHP_DOC_COMMENT: + return "PHP_DOC_COMMENT"; + case PHP_HEREDOC_START: + return "PHP_HEREDOC_START"; + case PHP_HEREDOC_NSTART: + return "PHP_HEREDOC_NSTART"; + case PHP_HEREDOC_NEWLINE: + return "PHP_HEREDOC_NEWLINE"; + case PHP_NO_RESERVED_WORDS: + return "PHP_NO_RESERVED_WORDS"; + case PHP_NO_RESERVED_WORDS_PERSIST: + return "PHP_NO_RESERVED_WORDS_PERSIST"; + default: + return "???"; + } +} + +static void yy_log_token(int tok) { + const char* tokname = yytokname(tok); + if (tokname) { + fprintf(stderr, "--> %s\n", tokname); + } else { + fprintf(stderr, "--> '%c'\n", tok); + } +} +#endif + +static int yy_token(int tok, yyguts_t* yyg) { + if (YY_START == PHP_NO_RESERVED_WORDS) { + pop_state(); + } + + switch (tok) { + case T_OPEN_TAG: + case T_OPEN_TAG_WITH_ECHO: + case T_OPEN_TAG_FAKE: + push_state(PHP); + break; + + case T_CLOSE_TAG: + pop_state(); + // We need to return a ';', not a T_CLOSE_TAG, because a construct like + // "" is valid and there are about a billion parser rules + // which terminate with ';' so making a new rule like + // "semicolon_or_close_tag" would be hard. The token in yylval has the + // correct type and value, we just don't generate a node. + return ';'; + + // In PHP it's ok to use keywords such as 'if' as field names + // or function names. + case T_OBJECT_OPERATOR: + case T_FUNCTION: + push_state(PHP_NO_RESERVED_WORDS); + break; + + case T_PAAMAYIM_NEKUDOTAYIM: + push_state(PHP_NO_RESERVED_WORDS); + break; + } +#ifdef DEBUG + yy_log_token(tok); +#endif + return yyextra->last_token = tok; +} + +static inline void yy_scan_newlines(const char* text, struct yyguts_t* yyg) { + for (; *text; ++text) { + if (*text == '\r') { + if (text[1] == '\n') { + ++text; + } + ++yyextra->lineno; + } else if (*text == '\n') { + ++yyextra->lineno; + } + } +} + +void xhp_new_push_state(int s, struct yyguts_t* yyg) { +#ifdef DEBUG + fprintf( + stderr, + "--> PUSH(%s -> %s)\n", + yy_state_name(YY_START), + yy_state_name(s)); +#endif + yy_push_state(s, yyg); +} + +void xhp_new_pop_state(struct yyguts_t* yyg) { +#ifdef DEBUG + int s = YY_START; +#endif + yy_pop_state(yyg); +#ifdef DEBUG + fprintf( + stderr, + "--> POP(%s -> %s)\n", + yy_state_name(s), + yy_state_name(YY_START)); +#endif +} + +void xhp_set_state(int s, struct yyguts_t* yyg) { +#ifdef DEBUG + fprintf(stderr, "--> SET(%s)\n", yy_state_name(s)); +#endif + BEGIN(s); +} diff --git a/support/xhpast/scanner.lex.hpp b/support/xhpast/scanner.lex.hpp new file mode 100644 --- /dev/null +++ b/support/xhpast/scanner.lex.hpp @@ -0,0 +1,366 @@ +#ifndef xhpastHEADER_H +#define xhpastHEADER_H 1 +#define xhpastIN_HEADER 1 + +#line 6 "scanner.lex.hpp" + +#line 8 "scanner.lex.hpp" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 35 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* An opaque pointer. */ +#ifndef YY_TYPEDEF_YY_SCANNER_T +#define YY_TYPEDEF_YY_SCANNER_T +typedef void* yyscan_t; +#endif + +/* For convenience, these vars (plus the bison vars far below) + are macros in the reentrant scanner. */ +#define yyin yyg->yyin_r +#define yyout yyg->yyout_r +#define yyextra yyg->yyextra_r +#define yyleng yyg->yyleng_r +#define yytext yyg->yytext_r +#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) +#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) +#define yy_flex_debug yyg->yy_flex_debug_r + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else +#define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ +#endif + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +void xhpastrestart (FILE *input_file ,yyscan_t yyscanner ); +void xhpast_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +YY_BUFFER_STATE xhpast_create_buffer (FILE *file,int size ,yyscan_t yyscanner ); +void xhpast_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void xhpast_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void xhpastpush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +void xhpastpop_buffer_state (yyscan_t yyscanner ); + +YY_BUFFER_STATE xhpast_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner ); +YY_BUFFER_STATE xhpast_scan_string (yyconst char *yy_str ,yyscan_t yyscanner ); +YY_BUFFER_STATE xhpast_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner ); + +void *xhpastalloc (yy_size_t ,yyscan_t yyscanner ); +void *xhpastrealloc (void *,yy_size_t ,yyscan_t yyscanner ); +void xhpastfree (void * ,yyscan_t yyscanner ); + +/* Begin user sect3 */ + +#define xhpastwrap(n) 1 +#define YY_SKIP_YYWRAP + +#define yytext_ptr yytext_r + +#ifdef YY_HEADER_EXPORT_START_CONDITIONS +#define INITIAL 0 +#define PHP 1 +#define PHP_COMMENT 2 +#define PHP_EOL_COMMENT 3 +#define PHP_DOC_COMMENT 4 +#define PHP_HEREDOC_START 5 +#define PHP_HEREDOC_NSTART 6 +#define PHP_HEREDOC_NEWLINE 7 +#define PHP_NO_RESERVED_WORDS 8 +#define PHP_NO_RESERVED_WORDS_PERSIST 9 +#define PHP_ 10 + +#endif + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +int xhpastlex_init (yyscan_t* scanner); + +int xhpastlex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int xhpastlex_destroy (yyscan_t yyscanner ); + +int xhpastget_debug (yyscan_t yyscanner ); + +void xhpastset_debug (int debug_flag ,yyscan_t yyscanner ); + +YY_EXTRA_TYPE xhpastget_extra (yyscan_t yyscanner ); + +void xhpastset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner ); + +FILE *xhpastget_in (yyscan_t yyscanner ); + +void xhpastset_in (FILE * in_str ,yyscan_t yyscanner ); + +FILE *xhpastget_out (yyscan_t yyscanner ); + +void xhpastset_out (FILE * out_str ,yyscan_t yyscanner ); + +int xhpastget_leng (yyscan_t yyscanner ); + +char *xhpastget_text (yyscan_t yyscanner ); + +int xhpastget_lineno (yyscan_t yyscanner ); + +void xhpastset_lineno (int line_number ,yyscan_t yyscanner ); + +YYSTYPE * xhpastget_lval (yyscan_t yyscanner ); + +void xhpastset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int xhpastwrap (yyscan_t yyscanner ); +#else +extern int xhpastwrap (yyscan_t yyscanner ); +#endif +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner); +#endif + +#ifndef YY_NO_INPUT + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else +#define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int xhpastlex \ + (YYSTYPE * yylval_param ,yyscan_t yyscanner); + +#define YY_DECL int xhpastlex \ + (YYSTYPE * yylval_param , yyscan_t yyscanner) +#endif /* !YY_DECL */ + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +#undef YY_NEW_FILE +#undef YY_FLUSH_BUFFER +#undef yy_set_bol +#undef yy_new_buffer +#undef yy_set_interactive +#undef YY_DO_BEFORE_ACTION + +#ifdef YY_DECL_IS_OURS +#undef YY_DECL_IS_OURS +#undef YY_DECL +#endif + +#line 367 "scanner.l" + + +#line 364 "scanner.lex.hpp" +#undef xhpastIN_HEADER +#endif /* xhpastHEADER_H */ +/* @generated */ diff --git a/support/xhpast/scanner.lex.cpp b/support/xhpast/scanner.lex.cpp new file mode 100644 --- /dev/null +++ b/support/xhpast/scanner.lex.cpp @@ -0,0 +1,26985 @@ +#line 2 "scanner.lex.cpp" + +#line 4 "scanner.lex.cpp" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 35 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* An opaque pointer. */ +#ifndef YY_TYPEDEF_YY_SCANNER_T +#define YY_TYPEDEF_YY_SCANNER_T +typedef void* yyscan_t; +#endif + +/* For convenience, these vars (plus the bison vars far below) + are macros in the reentrant scanner. */ +#define yyin yyg->yyin_r +#define yyout yyg->yyout_r +#define yyextra yyg->yyextra_r +#define yyleng yyg->yyleng_r +#define yytext yyg->yytext_r +#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) +#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) +#define yy_flex_debug yyg->yy_flex_debug_r + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yyg->yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yyg->yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE xhpastrestart(yyin ,yyscanner ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else +#define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = yyg->yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via xhpastrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ + ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] + +void xhpastrestart (FILE *input_file ,yyscan_t yyscanner ); +void xhpast_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +YY_BUFFER_STATE xhpast_create_buffer (FILE *file,int size ,yyscan_t yyscanner ); +void xhpast_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void xhpast_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void xhpastpush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +void xhpastpop_buffer_state (yyscan_t yyscanner ); + +static void xhpastensure_buffer_stack (yyscan_t yyscanner ); +static void xhpast_load_buffer_state (yyscan_t yyscanner ); +static void xhpast_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner ); + +#define YY_FLUSH_BUFFER xhpast_flush_buffer(YY_CURRENT_BUFFER ,yyscanner) + +YY_BUFFER_STATE xhpast_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner ); +YY_BUFFER_STATE xhpast_scan_string (yyconst char *yy_str ,yyscan_t yyscanner ); +YY_BUFFER_STATE xhpast_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner ); + +void *xhpastalloc (yy_size_t ,yyscan_t yyscanner ); +void *xhpastrealloc (void *,yy_size_t ,yyscan_t yyscanner ); +void xhpastfree (void * ,yyscan_t yyscanner ); + +#define yy_new_buffer xhpast_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + xhpastensure_buffer_stack (yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + xhpast_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + xhpastensure_buffer_stack (yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + xhpast_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +#define xhpastwrap(n) 1 +#define YY_SKIP_YYWRAP + +typedef unsigned char YY_CHAR; + +typedef yyconst struct yy_trans_info *yy_state_type; + +#define yytext_ptr yytext_r + +static yy_state_type yy_get_previous_state (yyscan_t yyscanner ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ,yyscan_t yyscanner); +static int yy_get_next_buffer (yyscan_t yyscanner ); +static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yyg->yytext_ptr = yy_bp; \ + yyg->yytext_ptr -= yyg->yy_more_len; \ + yyleng = (size_t) (yy_cp - yyg->yytext_ptr); \ + yyg->yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yyg->yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 143 +#define YY_END_OF_BUFFER 144 +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst struct yy_trans_info yy_transition[109294] = + { + { 0, 0 }, { 0,109038 }, { 0, 4 }, { 0,109036 }, { 1,5676 }, + { 2,5676 }, { 3,5676 }, { 4,5676 }, { 5,5676 }, { 6,5676 }, + { 7,5676 }, { 8,5676 }, { 9,5676 }, { 10,5676 }, { 11,5676 }, + { 12,5676 }, { 13,5676 }, { 14,5676 }, { 15,5676 }, { 16,5676 }, + { 17,5676 }, { 18,5676 }, { 19,5676 }, { 20,5676 }, { 21,5676 }, + { 22,5676 }, { 23,5676 }, { 24,5676 }, { 25,5676 }, { 26,5676 }, + { 27,5676 }, { 28,5676 }, { 29,5676 }, { 30,5676 }, { 31,5676 }, + { 32,5676 }, { 33,5676 }, { 34,5676 }, { 35,5676 }, { 36,5676 }, + { 37,5676 }, { 38,5676 }, { 39,5676 }, { 40,5676 }, { 41,5676 }, + { 42,5676 }, { 43,5676 }, { 44,5676 }, { 45,5676 }, { 46,5676 }, + + { 47,5676 }, { 48,5676 }, { 49,5676 }, { 50,5676 }, { 51,5676 }, + { 52,5676 }, { 53,5676 }, { 54,5676 }, { 55,5676 }, { 56,5676 }, + { 57,5676 }, { 58,5676 }, { 59,5676 }, { 60,5934 }, { 61,5676 }, + { 62,5676 }, { 63,5676 }, { 64,5676 }, { 65,5676 }, { 66,5676 }, + { 67,5676 }, { 68,5676 }, { 69,5676 }, { 70,5676 }, { 71,5676 }, + { 72,5676 }, { 73,5676 }, { 74,5676 }, { 75,5676 }, { 76,5676 }, + { 77,5676 }, { 78,5676 }, { 79,5676 }, { 80,5676 }, { 81,5676 }, + { 82,5676 }, { 83,5676 }, { 84,5676 }, { 85,5676 }, { 86,5676 }, + { 87,5676 }, { 88,5676 }, { 89,5676 }, { 90,5676 }, { 91,5676 }, + { 92,5676 }, { 93,5676 }, { 94,5676 }, { 95,5676 }, { 96,5676 }, + + { 97,5676 }, { 98,5676 }, { 99,5676 }, { 100,5676 }, { 101,5676 }, + { 102,5676 }, { 103,5676 }, { 104,5676 }, { 105,5676 }, { 106,5676 }, + { 107,5676 }, { 108,5676 }, { 109,5676 }, { 110,5676 }, { 111,5676 }, + { 112,5676 }, { 113,5676 }, { 114,5676 }, { 115,5676 }, { 116,5676 }, + { 117,5676 }, { 118,5676 }, { 119,5676 }, { 120,5676 }, { 121,5676 }, + { 122,5676 }, { 123,5676 }, { 124,5676 }, { 125,5676 }, { 126,5676 }, + { 127,5676 }, { 128,5676 }, { 129,5676 }, { 130,5676 }, { 131,5676 }, + { 132,5676 }, { 133,5676 }, { 134,5676 }, { 135,5676 }, { 136,5676 }, + { 137,5676 }, { 138,5676 }, { 139,5676 }, { 140,5676 }, { 141,5676 }, + { 142,5676 }, { 143,5676 }, { 144,5676 }, { 145,5676 }, { 146,5676 }, + + { 147,5676 }, { 148,5676 }, { 149,5676 }, { 150,5676 }, { 151,5676 }, + { 152,5676 }, { 153,5676 }, { 154,5676 }, { 155,5676 }, { 156,5676 }, + { 157,5676 }, { 158,5676 }, { 159,5676 }, { 160,5676 }, { 161,5676 }, + { 162,5676 }, { 163,5676 }, { 164,5676 }, { 165,5676 }, { 166,5676 }, + { 167,5676 }, { 168,5676 }, { 169,5676 }, { 170,5676 }, { 171,5676 }, + { 172,5676 }, { 173,5676 }, { 174,5676 }, { 175,5676 }, { 176,5676 }, + { 177,5676 }, { 178,5676 }, { 179,5676 }, { 180,5676 }, { 181,5676 }, + { 182,5676 }, { 183,5676 }, { 184,5676 }, { 185,5676 }, { 186,5676 }, + { 187,5676 }, { 188,5676 }, { 189,5676 }, { 190,5676 }, { 191,5676 }, + { 192,5676 }, { 193,5676 }, { 194,5676 }, { 195,5676 }, { 196,5676 }, + + { 197,5676 }, { 198,5676 }, { 199,5676 }, { 200,5676 }, { 201,5676 }, + { 202,5676 }, { 203,5676 }, { 204,5676 }, { 205,5676 }, { 206,5676 }, + { 207,5676 }, { 208,5676 }, { 209,5676 }, { 210,5676 }, { 211,5676 }, + { 212,5676 }, { 213,5676 }, { 214,5676 }, { 215,5676 }, { 216,5676 }, + { 217,5676 }, { 218,5676 }, { 219,5676 }, { 220,5676 }, { 221,5676 }, + { 222,5676 }, { 223,5676 }, { 224,5676 }, { 225,5676 }, { 226,5676 }, + { 227,5676 }, { 228,5676 }, { 229,5676 }, { 230,5676 }, { 231,5676 }, + { 232,5676 }, { 233,5676 }, { 234,5676 }, { 235,5676 }, { 236,5676 }, + { 237,5676 }, { 238,5676 }, { 239,5676 }, { 240,5676 }, { 241,5676 }, + { 242,5676 }, { 243,5676 }, { 244,5676 }, { 245,5676 }, { 246,5676 }, + + { 247,5676 }, { 248,5676 }, { 249,5676 }, { 250,5676 }, { 251,5676 }, + { 252,5676 }, { 253,5676 }, { 254,5676 }, { 255,5676 }, { 256,5676 }, + { 0, 4 }, { 0,108778 }, { 1,5418 }, { 2,5418 }, { 3,5418 }, + { 4,5418 }, { 5,5418 }, { 6,5418 }, { 7,5418 }, { 8,5418 }, + { 9,5418 }, { 10,5418 }, { 11,5418 }, { 12,5418 }, { 13,5418 }, + { 14,5418 }, { 15,5418 }, { 16,5418 }, { 17,5418 }, { 18,5418 }, + { 19,5418 }, { 20,5418 }, { 21,5418 }, { 22,5418 }, { 23,5418 }, + { 24,5418 }, { 25,5418 }, { 26,5418 }, { 27,5418 }, { 28,5418 }, + { 29,5418 }, { 30,5418 }, { 31,5418 }, { 32,5418 }, { 33,5418 }, + { 34,5418 }, { 35,5418 }, { 36,5418 }, { 37,5418 }, { 38,5418 }, + + { 39,5418 }, { 40,5418 }, { 41,5418 }, { 42,5418 }, { 43,5418 }, + { 44,5418 }, { 45,5418 }, { 46,5418 }, { 47,5418 }, { 48,5418 }, + { 49,5418 }, { 50,5418 }, { 51,5418 }, { 52,5418 }, { 53,5418 }, + { 54,5418 }, { 55,5418 }, { 56,5418 }, { 57,5418 }, { 58,5418 }, + { 59,5418 }, { 60,5676 }, { 61,5418 }, { 62,5418 }, { 63,5418 }, + { 64,5418 }, { 65,5418 }, { 66,5418 }, { 67,5418 }, { 68,5418 }, + { 69,5418 }, { 70,5418 }, { 71,5418 }, { 72,5418 }, { 73,5418 }, + { 74,5418 }, { 75,5418 }, { 76,5418 }, { 77,5418 }, { 78,5418 }, + { 79,5418 }, { 80,5418 }, { 81,5418 }, { 82,5418 }, { 83,5418 }, + { 84,5418 }, { 85,5418 }, { 86,5418 }, { 87,5418 }, { 88,5418 }, + + { 89,5418 }, { 90,5418 }, { 91,5418 }, { 92,5418 }, { 93,5418 }, + { 94,5418 }, { 95,5418 }, { 96,5418 }, { 97,5418 }, { 98,5418 }, + { 99,5418 }, { 100,5418 }, { 101,5418 }, { 102,5418 }, { 103,5418 }, + { 104,5418 }, { 105,5418 }, { 106,5418 }, { 107,5418 }, { 108,5418 }, + { 109,5418 }, { 110,5418 }, { 111,5418 }, { 112,5418 }, { 113,5418 }, + { 114,5418 }, { 115,5418 }, { 116,5418 }, { 117,5418 }, { 118,5418 }, + { 119,5418 }, { 120,5418 }, { 121,5418 }, { 122,5418 }, { 123,5418 }, + { 124,5418 }, { 125,5418 }, { 126,5418 }, { 127,5418 }, { 128,5418 }, + { 129,5418 }, { 130,5418 }, { 131,5418 }, { 132,5418 }, { 133,5418 }, + { 134,5418 }, { 135,5418 }, { 136,5418 }, { 137,5418 }, { 138,5418 }, + + { 139,5418 }, { 140,5418 }, { 141,5418 }, { 142,5418 }, { 143,5418 }, + { 144,5418 }, { 145,5418 }, { 146,5418 }, { 147,5418 }, { 148,5418 }, + { 149,5418 }, { 150,5418 }, { 151,5418 }, { 152,5418 }, { 153,5418 }, + { 154,5418 }, { 155,5418 }, { 156,5418 }, { 157,5418 }, { 158,5418 }, + { 159,5418 }, { 160,5418 }, { 161,5418 }, { 162,5418 }, { 163,5418 }, + { 164,5418 }, { 165,5418 }, { 166,5418 }, { 167,5418 }, { 168,5418 }, + { 169,5418 }, { 170,5418 }, { 171,5418 }, { 172,5418 }, { 173,5418 }, + { 174,5418 }, { 175,5418 }, { 176,5418 }, { 177,5418 }, { 178,5418 }, + { 179,5418 }, { 180,5418 }, { 181,5418 }, { 182,5418 }, { 183,5418 }, + { 184,5418 }, { 185,5418 }, { 186,5418 }, { 187,5418 }, { 188,5418 }, + + { 189,5418 }, { 190,5418 }, { 191,5418 }, { 192,5418 }, { 193,5418 }, + { 194,5418 }, { 195,5418 }, { 196,5418 }, { 197,5418 }, { 198,5418 }, + { 199,5418 }, { 200,5418 }, { 201,5418 }, { 202,5418 }, { 203,5418 }, + { 204,5418 }, { 205,5418 }, { 206,5418 }, { 207,5418 }, { 208,5418 }, + { 209,5418 }, { 210,5418 }, { 211,5418 }, { 212,5418 }, { 213,5418 }, + { 214,5418 }, { 215,5418 }, { 216,5418 }, { 217,5418 }, { 218,5418 }, + { 219,5418 }, { 220,5418 }, { 221,5418 }, { 222,5418 }, { 223,5418 }, + { 224,5418 }, { 225,5418 }, { 226,5418 }, { 227,5418 }, { 228,5418 }, + { 229,5418 }, { 230,5418 }, { 231,5418 }, { 232,5418 }, { 233,5418 }, + { 234,5418 }, { 235,5418 }, { 236,5418 }, { 237,5418 }, { 238,5418 }, + + { 239,5418 }, { 240,5418 }, { 241,5418 }, { 242,5418 }, { 243,5418 }, + { 244,5418 }, { 245,5418 }, { 246,5418 }, { 247,5418 }, { 248,5418 }, + { 249,5418 }, { 250,5418 }, { 251,5418 }, { 252,5418 }, { 253,5418 }, + { 254,5418 }, { 255,5418 }, { 256,5418 }, { 0, 0 }, { 0,108520 }, + { 1,5420 }, { 2,5420 }, { 3,5420 }, { 4,5420 }, { 5,5420 }, + { 6,5420 }, { 7,5420 }, { 8,5420 }, { 9,5422 }, { 10,5422 }, + { 11,5420 }, { 12,5420 }, { 13,5422 }, { 14,5420 }, { 15,5420 }, + { 16,5420 }, { 17,5420 }, { 18,5420 }, { 19,5420 }, { 20,5420 }, + { 21,5420 }, { 22,5420 }, { 23,5420 }, { 24,5420 }, { 25,5420 }, + { 26,5420 }, { 27,5420 }, { 28,5420 }, { 29,5420 }, { 30,5420 }, + + { 31,5420 }, { 32,5422 }, { 33,5424 }, { 34,5487 }, { 35,5426 }, + { 36,5745 }, { 37,5747 }, { 38,6002 }, { 39,6065 }, { 40,6323 }, + { 41,5420 }, { 42,6325 }, { 43,6329 }, { 44,5420 }, { 45,6336 }, + { 46,6361 }, { 47,6338 }, { 48,6395 }, { 49,6454 }, { 50,6454 }, + { 51,6454 }, { 52,6454 }, { 53,6454 }, { 54,6454 }, { 55,6454 }, + { 56,6454 }, { 57,6454 }, { 58,6342 }, { 59,5420 }, { 60,6427 }, + { 61,6430 }, { 62,6433 }, { 63,6436 }, { 64,5420 }, { 65,6513 }, + { 66,6770 }, { 67,7027 }, { 68,7284 }, { 69,7541 }, { 70,7798 }, + { 71,8055 }, { 72,8312 }, { 73,8569 }, { 74,8312 }, { 75,8312 }, + { 76,8826 }, { 77,8312 }, { 78,9083 }, { 79,9340 }, { 80,9597 }, + + { 81,8312 }, { 82,9854 }, { 83,10111 }, { 84,10368 }, { 85,10625 }, + { 86,10882 }, { 87,11139 }, { 88,11396 }, { 89,11653 }, { 90,8312 }, + { 91,5420 }, { 92,6456 }, { 93,5420 }, { 94,6458 }, { 95,11910 }, + { 96,12167 }, { 97,6513 }, { 98,6770 }, { 99,7027 }, { 100,7284 }, + { 101,7541 }, { 102,7798 }, { 103,8055 }, { 104,8312 }, { 105,8569 }, + { 106,8312 }, { 107,8312 }, { 108,8826 }, { 109,8312 }, { 110,9083 }, + { 111,9340 }, { 112,9597 }, { 113,8312 }, { 114,9854 }, { 115,10111 }, + { 116,10368 }, { 117,10625 }, { 118,10882 }, { 119,11139 }, { 120,11396 }, + { 121,11653 }, { 122,8312 }, { 123,5420 }, { 124,6480 }, { 125,5420 }, + { 126,5420 }, { 127,8312 }, { 128,8312 }, { 129,8312 }, { 130,8312 }, + + { 131,8312 }, { 132,8312 }, { 133,8312 }, { 134,8312 }, { 135,8312 }, + { 136,8312 }, { 137,8312 }, { 138,8312 }, { 139,8312 }, { 140,8312 }, + { 141,8312 }, { 142,8312 }, { 143,8312 }, { 144,8312 }, { 145,8312 }, + { 146,8312 }, { 147,8312 }, { 148,8312 }, { 149,8312 }, { 150,8312 }, + { 151,8312 }, { 152,8312 }, { 153,8312 }, { 154,8312 }, { 155,8312 }, + { 156,8312 }, { 157,8312 }, { 158,8312 }, { 159,8312 }, { 160,8312 }, + { 161,8312 }, { 162,8312 }, { 163,8312 }, { 164,8312 }, { 165,8312 }, + { 166,8312 }, { 167,8312 }, { 168,8312 }, { 169,8312 }, { 170,8312 }, + { 171,8312 }, { 172,8312 }, { 173,8312 }, { 174,8312 }, { 175,8312 }, + { 176,8312 }, { 177,8312 }, { 178,8312 }, { 179,8312 }, { 180,8312 }, + + { 181,8312 }, { 182,8312 }, { 183,8312 }, { 184,8312 }, { 185,8312 }, + { 186,8312 }, { 187,8312 }, { 188,8312 }, { 189,8312 }, { 190,8312 }, + { 191,8312 }, { 192,8312 }, { 193,8312 }, { 194,8312 }, { 195,8312 }, + { 196,8312 }, { 197,8312 }, { 198,8312 }, { 199,8312 }, { 200,8312 }, + { 201,8312 }, { 202,8312 }, { 203,8312 }, { 204,8312 }, { 205,8312 }, + { 206,8312 }, { 207,8312 }, { 208,8312 }, { 209,8312 }, { 210,8312 }, + { 211,8312 }, { 212,8312 }, { 213,8312 }, { 214,8312 }, { 215,8312 }, + { 216,8312 }, { 217,8312 }, { 218,8312 }, { 219,8312 }, { 220,8312 }, + { 221,8312 }, { 222,8312 }, { 223,8312 }, { 224,8312 }, { 225,8312 }, + { 226,8312 }, { 227,8312 }, { 228,8312 }, { 229,8312 }, { 230,8312 }, + + { 231,8312 }, { 232,8312 }, { 233,8312 }, { 234,8312 }, { 235,8312 }, + { 236,8312 }, { 237,8312 }, { 238,8312 }, { 239,8312 }, { 240,8312 }, + { 241,8312 }, { 242,8312 }, { 243,8312 }, { 244,8312 }, { 245,8312 }, + { 246,8312 }, { 247,8312 }, { 248,8312 }, { 249,8312 }, { 250,8312 }, + { 251,8312 }, { 252,8312 }, { 253,8312 }, { 254,8312 }, { 255,8312 }, + { 256,5420 }, { 0, 0 }, { 0,108262 }, { 1,5162 }, { 2,5162 }, + { 3,5162 }, { 4,5162 }, { 5,5162 }, { 6,5162 }, { 7,5162 }, + { 8,5162 }, { 9,5164 }, { 10,5164 }, { 11,5162 }, { 12,5162 }, + { 13,5164 }, { 14,5162 }, { 15,5162 }, { 16,5162 }, { 17,5162 }, + { 18,5162 }, { 19,5162 }, { 20,5162 }, { 21,5162 }, { 22,5162 }, + + { 23,5162 }, { 24,5162 }, { 25,5162 }, { 26,5162 }, { 27,5162 }, + { 28,5162 }, { 29,5162 }, { 30,5162 }, { 31,5162 }, { 32,5164 }, + { 33,5166 }, { 34,5229 }, { 35,5168 }, { 36,5487 }, { 37,5489 }, + { 38,5744 }, { 39,5807 }, { 40,6065 }, { 41,5162 }, { 42,6067 }, + { 43,6071 }, { 44,5162 }, { 45,6078 }, { 46,6103 }, { 47,6080 }, + { 48,6137 }, { 49,6196 }, { 50,6196 }, { 51,6196 }, { 52,6196 }, + { 53,6196 }, { 54,6196 }, { 55,6196 }, { 56,6196 }, { 57,6196 }, + { 58,6084 }, { 59,5162 }, { 60,6169 }, { 61,6172 }, { 62,6175 }, + { 63,6178 }, { 64,5162 }, { 65,6255 }, { 66,6512 }, { 67,6769 }, + { 68,7026 }, { 69,7283 }, { 70,7540 }, { 71,7797 }, { 72,8054 }, + + { 73,8311 }, { 74,8054 }, { 75,8054 }, { 76,8568 }, { 77,8054 }, + { 78,8825 }, { 79,9082 }, { 80,9339 }, { 81,8054 }, { 82,9596 }, + { 83,9853 }, { 84,10110 }, { 85,10367 }, { 86,10624 }, { 87,10881 }, + { 88,11138 }, { 89,11395 }, { 90,8054 }, { 91,5162 }, { 92,6198 }, + { 93,5162 }, { 94,6200 }, { 95,11652 }, { 96,11909 }, { 97,6255 }, + { 98,6512 }, { 99,6769 }, { 100,7026 }, { 101,7283 }, { 102,7540 }, + { 103,7797 }, { 104,8054 }, { 105,8311 }, { 106,8054 }, { 107,8054 }, + { 108,8568 }, { 109,8054 }, { 110,8825 }, { 111,9082 }, { 112,9339 }, + { 113,8054 }, { 114,9596 }, { 115,9853 }, { 116,10110 }, { 117,10367 }, + { 118,10624 }, { 119,10881 }, { 120,11138 }, { 121,11395 }, { 122,8054 }, + + { 123,5162 }, { 124,6222 }, { 125,5162 }, { 126,5162 }, { 127,8054 }, + { 128,8054 }, { 129,8054 }, { 130,8054 }, { 131,8054 }, { 132,8054 }, + { 133,8054 }, { 134,8054 }, { 135,8054 }, { 136,8054 }, { 137,8054 }, + { 138,8054 }, { 139,8054 }, { 140,8054 }, { 141,8054 }, { 142,8054 }, + { 143,8054 }, { 144,8054 }, { 145,8054 }, { 146,8054 }, { 147,8054 }, + { 148,8054 }, { 149,8054 }, { 150,8054 }, { 151,8054 }, { 152,8054 }, + { 153,8054 }, { 154,8054 }, { 155,8054 }, { 156,8054 }, { 157,8054 }, + { 158,8054 }, { 159,8054 }, { 160,8054 }, { 161,8054 }, { 162,8054 }, + { 163,8054 }, { 164,8054 }, { 165,8054 }, { 166,8054 }, { 167,8054 }, + { 168,8054 }, { 169,8054 }, { 170,8054 }, { 171,8054 }, { 172,8054 }, + + { 173,8054 }, { 174,8054 }, { 175,8054 }, { 176,8054 }, { 177,8054 }, + { 178,8054 }, { 179,8054 }, { 180,8054 }, { 181,8054 }, { 182,8054 }, + { 183,8054 }, { 184,8054 }, { 185,8054 }, { 186,8054 }, { 187,8054 }, + { 188,8054 }, { 189,8054 }, { 190,8054 }, { 191,8054 }, { 192,8054 }, + { 193,8054 }, { 194,8054 }, { 195,8054 }, { 196,8054 }, { 197,8054 }, + { 198,8054 }, { 199,8054 }, { 200,8054 }, { 201,8054 }, { 202,8054 }, + { 203,8054 }, { 204,8054 }, { 205,8054 }, { 206,8054 }, { 207,8054 }, + { 208,8054 }, { 209,8054 }, { 210,8054 }, { 211,8054 }, { 212,8054 }, + { 213,8054 }, { 214,8054 }, { 215,8054 }, { 216,8054 }, { 217,8054 }, + { 218,8054 }, { 219,8054 }, { 220,8054 }, { 221,8054 }, { 222,8054 }, + + { 223,8054 }, { 224,8054 }, { 225,8054 }, { 226,8054 }, { 227,8054 }, + { 228,8054 }, { 229,8054 }, { 230,8054 }, { 231,8054 }, { 232,8054 }, + { 233,8054 }, { 234,8054 }, { 235,8054 }, { 236,8054 }, { 237,8054 }, + { 238,8054 }, { 239,8054 }, { 240,8054 }, { 241,8054 }, { 242,8054 }, + { 243,8054 }, { 244,8054 }, { 245,8054 }, { 246,8054 }, { 247,8054 }, + { 248,8054 }, { 249,8054 }, { 250,8054 }, { 251,8054 }, { 252,8054 }, + { 253,8054 }, { 254,8054 }, { 255,8054 }, { 256,5162 }, { 0, 0 }, + { 0,108004 }, { 1,11909 }, { 2,11909 }, { 3,11909 }, { 4,11909 }, + { 5,11909 }, { 6,11909 }, { 7,11909 }, { 8,11909 }, { 9,11909 }, + { 10,5966 }, { 11,11909 }, { 12,11909 }, { 13,6001 }, { 14,11909 }, + + { 15,11909 }, { 16,11909 }, { 17,11909 }, { 18,11909 }, { 19,11909 }, + { 20,11909 }, { 21,11909 }, { 22,11909 }, { 23,11909 }, { 24,11909 }, + { 25,11909 }, { 26,11909 }, { 27,11909 }, { 28,11909 }, { 29,11909 }, + { 30,11909 }, { 31,11909 }, { 32,11909 }, { 33,11909 }, { 34,11909 }, + { 35,11909 }, { 36,11909 }, { 37,11909 }, { 38,11909 }, { 39,11909 }, + { 40,11909 }, { 41,11909 }, { 42,6009 }, { 43,11909 }, { 44,11909 }, + { 45,11909 }, { 46,11909 }, { 47,11909 }, { 48,11909 }, { 49,11909 }, + { 50,11909 }, { 51,11909 }, { 52,11909 }, { 53,11909 }, { 54,11909 }, + { 55,11909 }, { 56,11909 }, { 57,11909 }, { 58,11909 }, { 59,11909 }, + { 60,11909 }, { 61,11909 }, { 62,11909 }, { 63,11909 }, { 64,11909 }, + + { 65,11909 }, { 66,11909 }, { 67,11909 }, { 68,11909 }, { 69,11909 }, + { 70,11909 }, { 71,11909 }, { 72,11909 }, { 73,11909 }, { 74,11909 }, + { 75,11909 }, { 76,11909 }, { 77,11909 }, { 78,11909 }, { 79,11909 }, + { 80,11909 }, { 81,11909 }, { 82,11909 }, { 83,11909 }, { 84,11909 }, + { 85,11909 }, { 86,11909 }, { 87,11909 }, { 88,11909 }, { 89,11909 }, + { 90,11909 }, { 91,11909 }, { 92,11909 }, { 93,11909 }, { 94,11909 }, + { 95,11909 }, { 96,11909 }, { 97,11909 }, { 98,11909 }, { 99,11909 }, + { 100,11909 }, { 101,11909 }, { 102,11909 }, { 103,11909 }, { 104,11909 }, + { 105,11909 }, { 106,11909 }, { 107,11909 }, { 108,11909 }, { 109,11909 }, + { 110,11909 }, { 111,11909 }, { 112,11909 }, { 113,11909 }, { 114,11909 }, + + { 115,11909 }, { 116,11909 }, { 117,11909 }, { 118,11909 }, { 119,11909 }, + { 120,11909 }, { 121,11909 }, { 122,11909 }, { 123,11909 }, { 124,11909 }, + { 125,11909 }, { 126,11909 }, { 127,11909 }, { 128,11909 }, { 129,11909 }, + { 130,11909 }, { 131,11909 }, { 132,11909 }, { 133,11909 }, { 134,11909 }, + { 135,11909 }, { 136,11909 }, { 137,11909 }, { 138,11909 }, { 139,11909 }, + { 140,11909 }, { 141,11909 }, { 142,11909 }, { 143,11909 }, { 144,11909 }, + { 145,11909 }, { 146,11909 }, { 147,11909 }, { 148,11909 }, { 149,11909 }, + { 150,11909 }, { 151,11909 }, { 152,11909 }, { 153,11909 }, { 154,11909 }, + { 155,11909 }, { 156,11909 }, { 157,11909 }, { 158,11909 }, { 159,11909 }, + { 160,11909 }, { 161,11909 }, { 162,11909 }, { 163,11909 }, { 164,11909 }, + + { 165,11909 }, { 166,11909 }, { 167,11909 }, { 168,11909 }, { 169,11909 }, + { 170,11909 }, { 171,11909 }, { 172,11909 }, { 173,11909 }, { 174,11909 }, + { 175,11909 }, { 176,11909 }, { 177,11909 }, { 178,11909 }, { 179,11909 }, + { 180,11909 }, { 181,11909 }, { 182,11909 }, { 183,11909 }, { 184,11909 }, + { 185,11909 }, { 186,11909 }, { 187,11909 }, { 188,11909 }, { 189,11909 }, + { 190,11909 }, { 191,11909 }, { 192,11909 }, { 193,11909 }, { 194,11909 }, + { 195,11909 }, { 196,11909 }, { 197,11909 }, { 198,11909 }, { 199,11909 }, + { 200,11909 }, { 201,11909 }, { 202,11909 }, { 203,11909 }, { 204,11909 }, + { 205,11909 }, { 206,11909 }, { 207,11909 }, { 208,11909 }, { 209,11909 }, + { 210,11909 }, { 211,11909 }, { 212,11909 }, { 213,11909 }, { 214,11909 }, + + { 215,11909 }, { 216,11909 }, { 217,11909 }, { 218,11909 }, { 219,11909 }, + { 220,11909 }, { 221,11909 }, { 222,11909 }, { 223,11909 }, { 224,11909 }, + { 225,11909 }, { 226,11909 }, { 227,11909 }, { 228,11909 }, { 229,11909 }, + { 230,11909 }, { 231,11909 }, { 232,11909 }, { 233,11909 }, { 234,11909 }, + { 235,11909 }, { 236,11909 }, { 237,11909 }, { 238,11909 }, { 239,11909 }, + { 240,11909 }, { 241,11909 }, { 242,11909 }, { 243,11909 }, { 244,11909 }, + { 245,11909 }, { 246,11909 }, { 247,11909 }, { 248,11909 }, { 249,11909 }, + { 250,11909 }, { 251,11909 }, { 252,11909 }, { 253,11909 }, { 254,11909 }, + { 255,11909 }, { 256,11909 }, { 0, 0 }, { 0,107746 }, { 1,11651 }, + { 2,11651 }, { 3,11651 }, { 4,11651 }, { 5,11651 }, { 6,11651 }, + + { 7,11651 }, { 8,11651 }, { 9,11651 }, { 10,5708 }, { 11,11651 }, + { 12,11651 }, { 13,5743 }, { 14,11651 }, { 15,11651 }, { 16,11651 }, + { 17,11651 }, { 18,11651 }, { 19,11651 }, { 20,11651 }, { 21,11651 }, + { 22,11651 }, { 23,11651 }, { 24,11651 }, { 25,11651 }, { 26,11651 }, + { 27,11651 }, { 28,11651 }, { 29,11651 }, { 30,11651 }, { 31,11651 }, + { 32,11651 }, { 33,11651 }, { 34,11651 }, { 35,11651 }, { 36,11651 }, + { 37,11651 }, { 38,11651 }, { 39,11651 }, { 40,11651 }, { 41,11651 }, + { 42,5751 }, { 43,11651 }, { 44,11651 }, { 45,11651 }, { 46,11651 }, + { 47,11651 }, { 48,11651 }, { 49,11651 }, { 50,11651 }, { 51,11651 }, + { 52,11651 }, { 53,11651 }, { 54,11651 }, { 55,11651 }, { 56,11651 }, + + { 57,11651 }, { 58,11651 }, { 59,11651 }, { 60,11651 }, { 61,11651 }, + { 62,11651 }, { 63,11651 }, { 64,11651 }, { 65,11651 }, { 66,11651 }, + { 67,11651 }, { 68,11651 }, { 69,11651 }, { 70,11651 }, { 71,11651 }, + { 72,11651 }, { 73,11651 }, { 74,11651 }, { 75,11651 }, { 76,11651 }, + { 77,11651 }, { 78,11651 }, { 79,11651 }, { 80,11651 }, { 81,11651 }, + { 82,11651 }, { 83,11651 }, { 84,11651 }, { 85,11651 }, { 86,11651 }, + { 87,11651 }, { 88,11651 }, { 89,11651 }, { 90,11651 }, { 91,11651 }, + { 92,11651 }, { 93,11651 }, { 94,11651 }, { 95,11651 }, { 96,11651 }, + { 97,11651 }, { 98,11651 }, { 99,11651 }, { 100,11651 }, { 101,11651 }, + { 102,11651 }, { 103,11651 }, { 104,11651 }, { 105,11651 }, { 106,11651 }, + + { 107,11651 }, { 108,11651 }, { 109,11651 }, { 110,11651 }, { 111,11651 }, + { 112,11651 }, { 113,11651 }, { 114,11651 }, { 115,11651 }, { 116,11651 }, + { 117,11651 }, { 118,11651 }, { 119,11651 }, { 120,11651 }, { 121,11651 }, + { 122,11651 }, { 123,11651 }, { 124,11651 }, { 125,11651 }, { 126,11651 }, + { 127,11651 }, { 128,11651 }, { 129,11651 }, { 130,11651 }, { 131,11651 }, + { 132,11651 }, { 133,11651 }, { 134,11651 }, { 135,11651 }, { 136,11651 }, + { 137,11651 }, { 138,11651 }, { 139,11651 }, { 140,11651 }, { 141,11651 }, + { 142,11651 }, { 143,11651 }, { 144,11651 }, { 145,11651 }, { 146,11651 }, + { 147,11651 }, { 148,11651 }, { 149,11651 }, { 150,11651 }, { 151,11651 }, + { 152,11651 }, { 153,11651 }, { 154,11651 }, { 155,11651 }, { 156,11651 }, + + { 157,11651 }, { 158,11651 }, { 159,11651 }, { 160,11651 }, { 161,11651 }, + { 162,11651 }, { 163,11651 }, { 164,11651 }, { 165,11651 }, { 166,11651 }, + { 167,11651 }, { 168,11651 }, { 169,11651 }, { 170,11651 }, { 171,11651 }, + { 172,11651 }, { 173,11651 }, { 174,11651 }, { 175,11651 }, { 176,11651 }, + { 177,11651 }, { 178,11651 }, { 179,11651 }, { 180,11651 }, { 181,11651 }, + { 182,11651 }, { 183,11651 }, { 184,11651 }, { 185,11651 }, { 186,11651 }, + { 187,11651 }, { 188,11651 }, { 189,11651 }, { 190,11651 }, { 191,11651 }, + { 192,11651 }, { 193,11651 }, { 194,11651 }, { 195,11651 }, { 196,11651 }, + { 197,11651 }, { 198,11651 }, { 199,11651 }, { 200,11651 }, { 201,11651 }, + { 202,11651 }, { 203,11651 }, { 204,11651 }, { 205,11651 }, { 206,11651 }, + + { 207,11651 }, { 208,11651 }, { 209,11651 }, { 210,11651 }, { 211,11651 }, + { 212,11651 }, { 213,11651 }, { 214,11651 }, { 215,11651 }, { 216,11651 }, + { 217,11651 }, { 218,11651 }, { 219,11651 }, { 220,11651 }, { 221,11651 }, + { 222,11651 }, { 223,11651 }, { 224,11651 }, { 225,11651 }, { 226,11651 }, + { 227,11651 }, { 228,11651 }, { 229,11651 }, { 230,11651 }, { 231,11651 }, + { 232,11651 }, { 233,11651 }, { 234,11651 }, { 235,11651 }, { 236,11651 }, + { 237,11651 }, { 238,11651 }, { 239,11651 }, { 240,11651 }, { 241,11651 }, + { 242,11651 }, { 243,11651 }, { 244,11651 }, { 245,11651 }, { 246,11651 }, + { 247,11651 }, { 248,11651 }, { 249,11651 }, { 250,11651 }, { 251,11651 }, + { 252,11651 }, { 253,11651 }, { 254,11651 }, { 255,11651 }, { 256,11651 }, + + { 0, 0 }, { 0,107488 }, { 1,11651 }, { 2,11651 }, { 3,11651 }, + { 4,11651 }, { 5,11651 }, { 6,11651 }, { 7,11651 }, { 8,11651 }, + { 9,11651 }, { 10,5497 }, { 11,11651 }, { 12,11651 }, { 13,5500 }, + { 14,11651 }, { 15,11651 }, { 16,11651 }, { 17,11651 }, { 18,11651 }, + { 19,11651 }, { 20,11651 }, { 21,11651 }, { 22,11651 }, { 23,11651 }, + { 24,11651 }, { 25,11651 }, { 26,11651 }, { 27,11651 }, { 28,11651 }, + { 29,11651 }, { 30,11651 }, { 31,11651 }, { 32,11651 }, { 33,11651 }, + { 34,11651 }, { 35,11651 }, { 36,11651 }, { 37,11651 }, { 38,11651 }, + { 39,11651 }, { 40,11651 }, { 41,11651 }, { 42,11651 }, { 43,11651 }, + { 44,11651 }, { 45,11651 }, { 46,11651 }, { 47,11651 }, { 48,11651 }, + + { 49,11651 }, { 50,11651 }, { 51,11651 }, { 52,11651 }, { 53,11651 }, + { 54,11651 }, { 55,11651 }, { 56,11651 }, { 57,11651 }, { 58,11651 }, + { 59,11651 }, { 60,11651 }, { 61,11651 }, { 62,11651 }, { 63,5512 }, + { 64,11651 }, { 65,11651 }, { 66,11651 }, { 67,11651 }, { 68,11651 }, + { 69,11651 }, { 70,11651 }, { 71,11651 }, { 72,11651 }, { 73,11651 }, + { 74,11651 }, { 75,11651 }, { 76,11651 }, { 77,11651 }, { 78,11651 }, + { 79,11651 }, { 80,11651 }, { 81,11651 }, { 82,11651 }, { 83,11651 }, + { 84,11651 }, { 85,11651 }, { 86,11651 }, { 87,11651 }, { 88,11651 }, + { 89,11651 }, { 90,11651 }, { 91,11651 }, { 92,11651 }, { 93,11651 }, + { 94,11651 }, { 95,11651 }, { 96,11651 }, { 97,11651 }, { 98,11651 }, + + { 99,11651 }, { 100,11651 }, { 101,11651 }, { 102,11651 }, { 103,11651 }, + { 104,11651 }, { 105,11651 }, { 106,11651 }, { 107,11651 }, { 108,11651 }, + { 109,11651 }, { 110,11651 }, { 111,11651 }, { 112,11651 }, { 113,11651 }, + { 114,11651 }, { 115,11651 }, { 116,11651 }, { 117,11651 }, { 118,11651 }, + { 119,11651 }, { 120,11651 }, { 121,11651 }, { 122,11651 }, { 123,11651 }, + { 124,11651 }, { 125,11651 }, { 126,11651 }, { 127,11651 }, { 128,11651 }, + { 129,11651 }, { 130,11651 }, { 131,11651 }, { 132,11651 }, { 133,11651 }, + { 134,11651 }, { 135,11651 }, { 136,11651 }, { 137,11651 }, { 138,11651 }, + { 139,11651 }, { 140,11651 }, { 141,11651 }, { 142,11651 }, { 143,11651 }, + { 144,11651 }, { 145,11651 }, { 146,11651 }, { 147,11651 }, { 148,11651 }, + + { 149,11651 }, { 150,11651 }, { 151,11651 }, { 152,11651 }, { 153,11651 }, + { 154,11651 }, { 155,11651 }, { 156,11651 }, { 157,11651 }, { 158,11651 }, + { 159,11651 }, { 160,11651 }, { 161,11651 }, { 162,11651 }, { 163,11651 }, + { 164,11651 }, { 165,11651 }, { 166,11651 }, { 167,11651 }, { 168,11651 }, + { 169,11651 }, { 170,11651 }, { 171,11651 }, { 172,11651 }, { 173,11651 }, + { 174,11651 }, { 175,11651 }, { 176,11651 }, { 177,11651 }, { 178,11651 }, + { 179,11651 }, { 180,11651 }, { 181,11651 }, { 182,11651 }, { 183,11651 }, + { 184,11651 }, { 185,11651 }, { 186,11651 }, { 187,11651 }, { 188,11651 }, + { 189,11651 }, { 190,11651 }, { 191,11651 }, { 192,11651 }, { 193,11651 }, + { 194,11651 }, { 195,11651 }, { 196,11651 }, { 197,11651 }, { 198,11651 }, + + { 199,11651 }, { 200,11651 }, { 201,11651 }, { 202,11651 }, { 203,11651 }, + { 204,11651 }, { 205,11651 }, { 206,11651 }, { 207,11651 }, { 208,11651 }, + { 209,11651 }, { 210,11651 }, { 211,11651 }, { 212,11651 }, { 213,11651 }, + { 214,11651 }, { 215,11651 }, { 216,11651 }, { 217,11651 }, { 218,11651 }, + { 219,11651 }, { 220,11651 }, { 221,11651 }, { 222,11651 }, { 223,11651 }, + { 224,11651 }, { 225,11651 }, { 226,11651 }, { 227,11651 }, { 228,11651 }, + { 229,11651 }, { 230,11651 }, { 231,11651 }, { 232,11651 }, { 233,11651 }, + { 234,11651 }, { 235,11651 }, { 236,11651 }, { 237,11651 }, { 238,11651 }, + { 239,11651 }, { 240,11651 }, { 241,11651 }, { 242,11651 }, { 243,11651 }, + { 244,11651 }, { 245,11651 }, { 246,11651 }, { 247,11651 }, { 248,11651 }, + + { 249,11651 }, { 250,11651 }, { 251,11651 }, { 252,11651 }, { 253,11651 }, + { 254,11651 }, { 255,11651 }, { 256,11651 }, { 0, 0 }, { 0,107230 }, + { 1,11393 }, { 2,11393 }, { 3,11393 }, { 4,11393 }, { 5,11393 }, + { 6,11393 }, { 7,11393 }, { 8,11393 }, { 9,11393 }, { 10,5239 }, + { 11,11393 }, { 12,11393 }, { 13,5242 }, { 14,11393 }, { 15,11393 }, + { 16,11393 }, { 17,11393 }, { 18,11393 }, { 19,11393 }, { 20,11393 }, + { 21,11393 }, { 22,11393 }, { 23,11393 }, { 24,11393 }, { 25,11393 }, + { 26,11393 }, { 27,11393 }, { 28,11393 }, { 29,11393 }, { 30,11393 }, + { 31,11393 }, { 32,11393 }, { 33,11393 }, { 34,11393 }, { 35,11393 }, + { 36,11393 }, { 37,11393 }, { 38,11393 }, { 39,11393 }, { 40,11393 }, + + { 41,11393 }, { 42,11393 }, { 43,11393 }, { 44,11393 }, { 45,11393 }, + { 46,11393 }, { 47,11393 }, { 48,11393 }, { 49,11393 }, { 50,11393 }, + { 51,11393 }, { 52,11393 }, { 53,11393 }, { 54,11393 }, { 55,11393 }, + { 56,11393 }, { 57,11393 }, { 58,11393 }, { 59,11393 }, { 60,11393 }, + { 61,11393 }, { 62,11393 }, { 63,5254 }, { 64,11393 }, { 65,11393 }, + { 66,11393 }, { 67,11393 }, { 68,11393 }, { 69,11393 }, { 70,11393 }, + { 71,11393 }, { 72,11393 }, { 73,11393 }, { 74,11393 }, { 75,11393 }, + { 76,11393 }, { 77,11393 }, { 78,11393 }, { 79,11393 }, { 80,11393 }, + { 81,11393 }, { 82,11393 }, { 83,11393 }, { 84,11393 }, { 85,11393 }, + { 86,11393 }, { 87,11393 }, { 88,11393 }, { 89,11393 }, { 90,11393 }, + + { 91,11393 }, { 92,11393 }, { 93,11393 }, { 94,11393 }, { 95,11393 }, + { 96,11393 }, { 97,11393 }, { 98,11393 }, { 99,11393 }, { 100,11393 }, + { 101,11393 }, { 102,11393 }, { 103,11393 }, { 104,11393 }, { 105,11393 }, + { 106,11393 }, { 107,11393 }, { 108,11393 }, { 109,11393 }, { 110,11393 }, + { 111,11393 }, { 112,11393 }, { 113,11393 }, { 114,11393 }, { 115,11393 }, + { 116,11393 }, { 117,11393 }, { 118,11393 }, { 119,11393 }, { 120,11393 }, + { 121,11393 }, { 122,11393 }, { 123,11393 }, { 124,11393 }, { 125,11393 }, + { 126,11393 }, { 127,11393 }, { 128,11393 }, { 129,11393 }, { 130,11393 }, + { 131,11393 }, { 132,11393 }, { 133,11393 }, { 134,11393 }, { 135,11393 }, + { 136,11393 }, { 137,11393 }, { 138,11393 }, { 139,11393 }, { 140,11393 }, + + { 141,11393 }, { 142,11393 }, { 143,11393 }, { 144,11393 }, { 145,11393 }, + { 146,11393 }, { 147,11393 }, { 148,11393 }, { 149,11393 }, { 150,11393 }, + { 151,11393 }, { 152,11393 }, { 153,11393 }, { 154,11393 }, { 155,11393 }, + { 156,11393 }, { 157,11393 }, { 158,11393 }, { 159,11393 }, { 160,11393 }, + { 161,11393 }, { 162,11393 }, { 163,11393 }, { 164,11393 }, { 165,11393 }, + { 166,11393 }, { 167,11393 }, { 168,11393 }, { 169,11393 }, { 170,11393 }, + { 171,11393 }, { 172,11393 }, { 173,11393 }, { 174,11393 }, { 175,11393 }, + { 176,11393 }, { 177,11393 }, { 178,11393 }, { 179,11393 }, { 180,11393 }, + { 181,11393 }, { 182,11393 }, { 183,11393 }, { 184,11393 }, { 185,11393 }, + { 186,11393 }, { 187,11393 }, { 188,11393 }, { 189,11393 }, { 190,11393 }, + + { 191,11393 }, { 192,11393 }, { 193,11393 }, { 194,11393 }, { 195,11393 }, + { 196,11393 }, { 197,11393 }, { 198,11393 }, { 199,11393 }, { 200,11393 }, + { 201,11393 }, { 202,11393 }, { 203,11393 }, { 204,11393 }, { 205,11393 }, + { 206,11393 }, { 207,11393 }, { 208,11393 }, { 209,11393 }, { 210,11393 }, + { 211,11393 }, { 212,11393 }, { 213,11393 }, { 214,11393 }, { 215,11393 }, + { 216,11393 }, { 217,11393 }, { 218,11393 }, { 219,11393 }, { 220,11393 }, + { 221,11393 }, { 222,11393 }, { 223,11393 }, { 224,11393 }, { 225,11393 }, + { 226,11393 }, { 227,11393 }, { 228,11393 }, { 229,11393 }, { 230,11393 }, + { 231,11393 }, { 232,11393 }, { 233,11393 }, { 234,11393 }, { 235,11393 }, + { 236,11393 }, { 237,11393 }, { 238,11393 }, { 239,11393 }, { 240,11393 }, + + { 241,11393 }, { 242,11393 }, { 243,11393 }, { 244,11393 }, { 245,11393 }, + { 246,11393 }, { 247,11393 }, { 248,11393 }, { 249,11393 }, { 250,11393 }, + { 251,11393 }, { 252,11393 }, { 253,11393 }, { 254,11393 }, { 255,11393 }, + { 256,11393 }, { 0, 0 }, { 0,106972 }, { 1,10877 }, { 2,10877 }, + { 3,10877 }, { 4,10877 }, { 5,10877 }, { 6,10877 }, { 7,10877 }, + { 8,10877 }, { 9,10877 }, { 10,4934 }, { 11,10877 }, { 12,10877 }, + { 13,4969 }, { 14,10877 }, { 15,10877 }, { 16,10877 }, { 17,10877 }, + { 18,10877 }, { 19,10877 }, { 20,10877 }, { 21,10877 }, { 22,10877 }, + { 23,10877 }, { 24,10877 }, { 25,10877 }, { 26,10877 }, { 27,10877 }, + { 28,10877 }, { 29,10877 }, { 30,10877 }, { 31,10877 }, { 32,10877 }, + + { 33,10877 }, { 34,10877 }, { 35,10877 }, { 36,10877 }, { 37,10877 }, + { 38,10877 }, { 39,10877 }, { 40,10877 }, { 41,10877 }, { 42,5010 }, + { 43,10877 }, { 44,10877 }, { 45,10877 }, { 46,10877 }, { 47,10877 }, + { 48,10877 }, { 49,10877 }, { 50,10877 }, { 51,10877 }, { 52,10877 }, + { 53,10877 }, { 54,10877 }, { 55,10877 }, { 56,10877 }, { 57,10877 }, + { 58,10877 }, { 59,10877 }, { 60,10877 }, { 61,10877 }, { 62,10877 }, + { 63,10877 }, { 64,10877 }, { 65,10877 }, { 66,10877 }, { 67,10877 }, + { 68,10877 }, { 69,10877 }, { 70,10877 }, { 71,10877 }, { 72,10877 }, + { 73,10877 }, { 74,10877 }, { 75,10877 }, { 76,10877 }, { 77,10877 }, + { 78,10877 }, { 79,10877 }, { 80,10877 }, { 81,10877 }, { 82,10877 }, + + { 83,10877 }, { 84,10877 }, { 85,10877 }, { 86,10877 }, { 87,10877 }, + { 88,10877 }, { 89,10877 }, { 90,10877 }, { 91,10877 }, { 92,10877 }, + { 93,10877 }, { 94,10877 }, { 95,10877 }, { 96,10877 }, { 97,10877 }, + { 98,10877 }, { 99,10877 }, { 100,10877 }, { 101,10877 }, { 102,10877 }, + { 103,10877 }, { 104,10877 }, { 105,10877 }, { 106,10877 }, { 107,10877 }, + { 108,10877 }, { 109,10877 }, { 110,10877 }, { 111,10877 }, { 112,10877 }, + { 113,10877 }, { 114,10877 }, { 115,10877 }, { 116,10877 }, { 117,10877 }, + { 118,10877 }, { 119,10877 }, { 120,10877 }, { 121,10877 }, { 122,10877 }, + { 123,10877 }, { 124,10877 }, { 125,10877 }, { 126,10877 }, { 127,10877 }, + { 128,10877 }, { 129,10877 }, { 130,10877 }, { 131,10877 }, { 132,10877 }, + + { 133,10877 }, { 134,10877 }, { 135,10877 }, { 136,10877 }, { 137,10877 }, + { 138,10877 }, { 139,10877 }, { 140,10877 }, { 141,10877 }, { 142,10877 }, + { 143,10877 }, { 144,10877 }, { 145,10877 }, { 146,10877 }, { 147,10877 }, + { 148,10877 }, { 149,10877 }, { 150,10877 }, { 151,10877 }, { 152,10877 }, + { 153,10877 }, { 154,10877 }, { 155,10877 }, { 156,10877 }, { 157,10877 }, + { 158,10877 }, { 159,10877 }, { 160,10877 }, { 161,10877 }, { 162,10877 }, + { 163,10877 }, { 164,10877 }, { 165,10877 }, { 166,10877 }, { 167,10877 }, + { 168,10877 }, { 169,10877 }, { 170,10877 }, { 171,10877 }, { 172,10877 }, + { 173,10877 }, { 174,10877 }, { 175,10877 }, { 176,10877 }, { 177,10877 }, + { 178,10877 }, { 179,10877 }, { 180,10877 }, { 181,10877 }, { 182,10877 }, + + { 183,10877 }, { 184,10877 }, { 185,10877 }, { 186,10877 }, { 187,10877 }, + { 188,10877 }, { 189,10877 }, { 190,10877 }, { 191,10877 }, { 192,10877 }, + { 193,10877 }, { 194,10877 }, { 195,10877 }, { 196,10877 }, { 197,10877 }, + { 198,10877 }, { 199,10877 }, { 200,10877 }, { 201,10877 }, { 202,10877 }, + { 203,10877 }, { 204,10877 }, { 205,10877 }, { 206,10877 }, { 207,10877 }, + { 208,10877 }, { 209,10877 }, { 210,10877 }, { 211,10877 }, { 212,10877 }, + { 213,10877 }, { 214,10877 }, { 215,10877 }, { 216,10877 }, { 217,10877 }, + { 218,10877 }, { 219,10877 }, { 220,10877 }, { 221,10877 }, { 222,10877 }, + { 223,10877 }, { 224,10877 }, { 225,10877 }, { 226,10877 }, { 227,10877 }, + { 228,10877 }, { 229,10877 }, { 230,10877 }, { 231,10877 }, { 232,10877 }, + + { 233,10877 }, { 234,10877 }, { 235,10877 }, { 236,10877 }, { 237,10877 }, + { 238,10877 }, { 239,10877 }, { 240,10877 }, { 241,10877 }, { 242,10877 }, + { 243,10877 }, { 244,10877 }, { 245,10877 }, { 246,10877 }, { 247,10877 }, + { 248,10877 }, { 249,10877 }, { 250,10877 }, { 251,10877 }, { 252,10877 }, + { 253,10877 }, { 254,10877 }, { 255,10877 }, { 256,10877 }, { 0, 0 }, + { 0,106714 }, { 1,10619 }, { 2,10619 }, { 3,10619 }, { 4,10619 }, + { 5,10619 }, { 6,10619 }, { 7,10619 }, { 8,10619 }, { 9,10619 }, + { 10,4676 }, { 11,10619 }, { 12,10619 }, { 13,4711 }, { 14,10619 }, + { 15,10619 }, { 16,10619 }, { 17,10619 }, { 18,10619 }, { 19,10619 }, + { 20,10619 }, { 21,10619 }, { 22,10619 }, { 23,10619 }, { 24,10619 }, + + { 25,10619 }, { 26,10619 }, { 27,10619 }, { 28,10619 }, { 29,10619 }, + { 30,10619 }, { 31,10619 }, { 32,10619 }, { 33,10619 }, { 34,10619 }, + { 35,10619 }, { 36,10619 }, { 37,10619 }, { 38,10619 }, { 39,10619 }, + { 40,10619 }, { 41,10619 }, { 42,4752 }, { 43,10619 }, { 44,10619 }, + { 45,10619 }, { 46,10619 }, { 47,10619 }, { 48,10619 }, { 49,10619 }, + { 50,10619 }, { 51,10619 }, { 52,10619 }, { 53,10619 }, { 54,10619 }, + { 55,10619 }, { 56,10619 }, { 57,10619 }, { 58,10619 }, { 59,10619 }, + { 60,10619 }, { 61,10619 }, { 62,10619 }, { 63,10619 }, { 64,10619 }, + { 65,10619 }, { 66,10619 }, { 67,10619 }, { 68,10619 }, { 69,10619 }, + { 70,10619 }, { 71,10619 }, { 72,10619 }, { 73,10619 }, { 74,10619 }, + + { 75,10619 }, { 76,10619 }, { 77,10619 }, { 78,10619 }, { 79,10619 }, + { 80,10619 }, { 81,10619 }, { 82,10619 }, { 83,10619 }, { 84,10619 }, + { 85,10619 }, { 86,10619 }, { 87,10619 }, { 88,10619 }, { 89,10619 }, + { 90,10619 }, { 91,10619 }, { 92,10619 }, { 93,10619 }, { 94,10619 }, + { 95,10619 }, { 96,10619 }, { 97,10619 }, { 98,10619 }, { 99,10619 }, + { 100,10619 }, { 101,10619 }, { 102,10619 }, { 103,10619 }, { 104,10619 }, + { 105,10619 }, { 106,10619 }, { 107,10619 }, { 108,10619 }, { 109,10619 }, + { 110,10619 }, { 111,10619 }, { 112,10619 }, { 113,10619 }, { 114,10619 }, + { 115,10619 }, { 116,10619 }, { 117,10619 }, { 118,10619 }, { 119,10619 }, + { 120,10619 }, { 121,10619 }, { 122,10619 }, { 123,10619 }, { 124,10619 }, + + { 125,10619 }, { 126,10619 }, { 127,10619 }, { 128,10619 }, { 129,10619 }, + { 130,10619 }, { 131,10619 }, { 132,10619 }, { 133,10619 }, { 134,10619 }, + { 135,10619 }, { 136,10619 }, { 137,10619 }, { 138,10619 }, { 139,10619 }, + { 140,10619 }, { 141,10619 }, { 142,10619 }, { 143,10619 }, { 144,10619 }, + { 145,10619 }, { 146,10619 }, { 147,10619 }, { 148,10619 }, { 149,10619 }, + { 150,10619 }, { 151,10619 }, { 152,10619 }, { 153,10619 }, { 154,10619 }, + { 155,10619 }, { 156,10619 }, { 157,10619 }, { 158,10619 }, { 159,10619 }, + { 160,10619 }, { 161,10619 }, { 162,10619 }, { 163,10619 }, { 164,10619 }, + { 165,10619 }, { 166,10619 }, { 167,10619 }, { 168,10619 }, { 169,10619 }, + { 170,10619 }, { 171,10619 }, { 172,10619 }, { 173,10619 }, { 174,10619 }, + + { 175,10619 }, { 176,10619 }, { 177,10619 }, { 178,10619 }, { 179,10619 }, + { 180,10619 }, { 181,10619 }, { 182,10619 }, { 183,10619 }, { 184,10619 }, + { 185,10619 }, { 186,10619 }, { 187,10619 }, { 188,10619 }, { 189,10619 }, + { 190,10619 }, { 191,10619 }, { 192,10619 }, { 193,10619 }, { 194,10619 }, + { 195,10619 }, { 196,10619 }, { 197,10619 }, { 198,10619 }, { 199,10619 }, + { 200,10619 }, { 201,10619 }, { 202,10619 }, { 203,10619 }, { 204,10619 }, + { 205,10619 }, { 206,10619 }, { 207,10619 }, { 208,10619 }, { 209,10619 }, + { 210,10619 }, { 211,10619 }, { 212,10619 }, { 213,10619 }, { 214,10619 }, + { 215,10619 }, { 216,10619 }, { 217,10619 }, { 218,10619 }, { 219,10619 }, + { 220,10619 }, { 221,10619 }, { 222,10619 }, { 223,10619 }, { 224,10619 }, + + { 225,10619 }, { 226,10619 }, { 227,10619 }, { 228,10619 }, { 229,10619 }, + { 230,10619 }, { 231,10619 }, { 232,10619 }, { 233,10619 }, { 234,10619 }, + { 235,10619 }, { 236,10619 }, { 237,10619 }, { 238,10619 }, { 239,10619 }, + { 240,10619 }, { 241,10619 }, { 242,10619 }, { 243,10619 }, { 244,10619 }, + { 245,10619 }, { 246,10619 }, { 247,10619 }, { 248,10619 }, { 249,10619 }, + { 250,10619 }, { 251,10619 }, { 252,10619 }, { 253,10619 }, { 254,10619 }, + { 255,10619 }, { 256,10619 }, { 0, 0 }, { 0,106456 }, { 1,3356 }, + { 2,3356 }, { 3,3356 }, { 4,3356 }, { 5,3356 }, { 6,3356 }, + { 7,3356 }, { 8,3356 }, { 9,3356 }, { 10,3356 }, { 11,3356 }, + { 12,3356 }, { 13,3356 }, { 14,3356 }, { 15,3356 }, { 16,3356 }, + + { 17,3356 }, { 18,3356 }, { 19,3356 }, { 20,3356 }, { 21,3356 }, + { 22,3356 }, { 23,3356 }, { 24,3356 }, { 25,3356 }, { 26,3356 }, + { 27,3356 }, { 28,3356 }, { 29,3356 }, { 30,3356 }, { 31,3356 }, + { 32,3356 }, { 33,3356 }, { 34,10877 }, { 35,3356 }, { 36,3356 }, + { 37,3356 }, { 38,3356 }, { 39,11134 }, { 40,3356 }, { 41,3356 }, + { 42,3356 }, { 43,3356 }, { 44,3356 }, { 45,3356 }, { 46,3356 }, + { 47,3356 }, { 48,3356 }, { 49,3356 }, { 50,3356 }, { 51,3356 }, + { 52,3356 }, { 53,3356 }, { 54,3356 }, { 55,3356 }, { 56,3356 }, + { 57,3356 }, { 58,3356 }, { 59,3356 }, { 60,3356 }, { 61,3356 }, + { 62,3356 }, { 63,3356 }, { 64,3356 }, { 65,11391 }, { 66,11391 }, + + { 67,11391 }, { 68,11391 }, { 69,11391 }, { 70,11391 }, { 71,11391 }, + { 72,11391 }, { 73,11391 }, { 74,11391 }, { 75,11391 }, { 76,11391 }, + { 77,11391 }, { 78,11391 }, { 79,11391 }, { 80,11391 }, { 81,11391 }, + { 82,11391 }, { 83,11391 }, { 84,11391 }, { 85,11391 }, { 86,11391 }, + { 87,11391 }, { 88,11391 }, { 89,11391 }, { 90,11391 }, { 91,3356 }, + { 92,3356 }, { 93,3356 }, { 94,3356 }, { 95,11391 }, { 96,3356 }, + { 97,11391 }, { 98,11391 }, { 99,11391 }, { 100,11391 }, { 101,11391 }, + { 102,11391 }, { 103,11391 }, { 104,11391 }, { 105,11391 }, { 106,11391 }, + { 107,11391 }, { 108,11391 }, { 109,11391 }, { 110,11391 }, { 111,11391 }, + { 112,11391 }, { 113,11391 }, { 114,11391 }, { 115,11391 }, { 116,11391 }, + + { 117,11391 }, { 118,11391 }, { 119,11391 }, { 120,11391 }, { 121,11391 }, + { 122,11391 }, { 123,3356 }, { 124,3356 }, { 125,3356 }, { 126,3356 }, + { 127,11391 }, { 128,11391 }, { 129,11391 }, { 130,11391 }, { 131,11391 }, + { 132,11391 }, { 133,11391 }, { 134,11391 }, { 135,11391 }, { 136,11391 }, + { 137,11391 }, { 138,11391 }, { 139,11391 }, { 140,11391 }, { 141,11391 }, + { 142,11391 }, { 143,11391 }, { 144,11391 }, { 145,11391 }, { 146,11391 }, + { 147,11391 }, { 148,11391 }, { 149,11391 }, { 150,11391 }, { 151,11391 }, + { 152,11391 }, { 153,11391 }, { 154,11391 }, { 155,11391 }, { 156,11391 }, + { 157,11391 }, { 158,11391 }, { 159,11391 }, { 160,11391 }, { 161,11391 }, + { 162,11391 }, { 163,11391 }, { 164,11391 }, { 165,11391 }, { 166,11391 }, + + { 167,11391 }, { 168,11391 }, { 169,11391 }, { 170,11391 }, { 171,11391 }, + { 172,11391 }, { 173,11391 }, { 174,11391 }, { 175,11391 }, { 176,11391 }, + { 177,11391 }, { 178,11391 }, { 179,11391 }, { 180,11391 }, { 181,11391 }, + { 182,11391 }, { 183,11391 }, { 184,11391 }, { 185,11391 }, { 186,11391 }, + { 187,11391 }, { 188,11391 }, { 189,11391 }, { 190,11391 }, { 191,11391 }, + { 192,11391 }, { 193,11391 }, { 194,11391 }, { 195,11391 }, { 196,11391 }, + { 197,11391 }, { 198,11391 }, { 199,11391 }, { 200,11391 }, { 201,11391 }, + { 202,11391 }, { 203,11391 }, { 204,11391 }, { 205,11391 }, { 206,11391 }, + { 207,11391 }, { 208,11391 }, { 209,11391 }, { 210,11391 }, { 211,11391 }, + { 212,11391 }, { 213,11391 }, { 214,11391 }, { 215,11391 }, { 216,11391 }, + + { 217,11391 }, { 218,11391 }, { 219,11391 }, { 220,11391 }, { 221,11391 }, + { 222,11391 }, { 223,11391 }, { 224,11391 }, { 225,11391 }, { 226,11391 }, + { 227,11391 }, { 228,11391 }, { 229,11391 }, { 230,11391 }, { 231,11391 }, + { 232,11391 }, { 233,11391 }, { 234,11391 }, { 235,11391 }, { 236,11391 }, + { 237,11391 }, { 238,11391 }, { 239,11391 }, { 240,11391 }, { 241,11391 }, + { 242,11391 }, { 243,11391 }, { 244,11391 }, { 245,11391 }, { 246,11391 }, + { 247,11391 }, { 248,11391 }, { 249,11391 }, { 250,11391 }, { 251,11391 }, + { 252,11391 }, { 253,11391 }, { 254,11391 }, { 255,11391 }, { 256,3356 }, + { 0, 0 }, { 0,106198 }, { 1,3098 }, { 2,3098 }, { 3,3098 }, + { 4,3098 }, { 5,3098 }, { 6,3098 }, { 7,3098 }, { 8,3098 }, + + { 9,3098 }, { 10,3098 }, { 11,3098 }, { 12,3098 }, { 13,3098 }, + { 14,3098 }, { 15,3098 }, { 16,3098 }, { 17,3098 }, { 18,3098 }, + { 19,3098 }, { 20,3098 }, { 21,3098 }, { 22,3098 }, { 23,3098 }, + { 24,3098 }, { 25,3098 }, { 26,3098 }, { 27,3098 }, { 28,3098 }, + { 29,3098 }, { 30,3098 }, { 31,3098 }, { 32,3098 }, { 33,3098 }, + { 34,10619 }, { 35,3098 }, { 36,3098 }, { 37,3098 }, { 38,3098 }, + { 39,10876 }, { 40,3098 }, { 41,3098 }, { 42,3098 }, { 43,3098 }, + { 44,3098 }, { 45,3098 }, { 46,3098 }, { 47,3098 }, { 48,3098 }, + { 49,3098 }, { 50,3098 }, { 51,3098 }, { 52,3098 }, { 53,3098 }, + { 54,3098 }, { 55,3098 }, { 56,3098 }, { 57,3098 }, { 58,3098 }, + + { 59,3098 }, { 60,3098 }, { 61,3098 }, { 62,3098 }, { 63,3098 }, + { 64,3098 }, { 65,11133 }, { 66,11133 }, { 67,11133 }, { 68,11133 }, + { 69,11133 }, { 70,11133 }, { 71,11133 }, { 72,11133 }, { 73,11133 }, + { 74,11133 }, { 75,11133 }, { 76,11133 }, { 77,11133 }, { 78,11133 }, + { 79,11133 }, { 80,11133 }, { 81,11133 }, { 82,11133 }, { 83,11133 }, + { 84,11133 }, { 85,11133 }, { 86,11133 }, { 87,11133 }, { 88,11133 }, + { 89,11133 }, { 90,11133 }, { 91,3098 }, { 92,3098 }, { 93,3098 }, + { 94,3098 }, { 95,11133 }, { 96,3098 }, { 97,11133 }, { 98,11133 }, + { 99,11133 }, { 100,11133 }, { 101,11133 }, { 102,11133 }, { 103,11133 }, + { 104,11133 }, { 105,11133 }, { 106,11133 }, { 107,11133 }, { 108,11133 }, + + { 109,11133 }, { 110,11133 }, { 111,11133 }, { 112,11133 }, { 113,11133 }, + { 114,11133 }, { 115,11133 }, { 116,11133 }, { 117,11133 }, { 118,11133 }, + { 119,11133 }, { 120,11133 }, { 121,11133 }, { 122,11133 }, { 123,3098 }, + { 124,3098 }, { 125,3098 }, { 126,3098 }, { 127,11133 }, { 128,11133 }, + { 129,11133 }, { 130,11133 }, { 131,11133 }, { 132,11133 }, { 133,11133 }, + { 134,11133 }, { 135,11133 }, { 136,11133 }, { 137,11133 }, { 138,11133 }, + { 139,11133 }, { 140,11133 }, { 141,11133 }, { 142,11133 }, { 143,11133 }, + { 144,11133 }, { 145,11133 }, { 146,11133 }, { 147,11133 }, { 148,11133 }, + { 149,11133 }, { 150,11133 }, { 151,11133 }, { 152,11133 }, { 153,11133 }, + { 154,11133 }, { 155,11133 }, { 156,11133 }, { 157,11133 }, { 158,11133 }, + + { 159,11133 }, { 160,11133 }, { 161,11133 }, { 162,11133 }, { 163,11133 }, + { 164,11133 }, { 165,11133 }, { 166,11133 }, { 167,11133 }, { 168,11133 }, + { 169,11133 }, { 170,11133 }, { 171,11133 }, { 172,11133 }, { 173,11133 }, + { 174,11133 }, { 175,11133 }, { 176,11133 }, { 177,11133 }, { 178,11133 }, + { 179,11133 }, { 180,11133 }, { 181,11133 }, { 182,11133 }, { 183,11133 }, + { 184,11133 }, { 185,11133 }, { 186,11133 }, { 187,11133 }, { 188,11133 }, + { 189,11133 }, { 190,11133 }, { 191,11133 }, { 192,11133 }, { 193,11133 }, + { 194,11133 }, { 195,11133 }, { 196,11133 }, { 197,11133 }, { 198,11133 }, + { 199,11133 }, { 200,11133 }, { 201,11133 }, { 202,11133 }, { 203,11133 }, + { 204,11133 }, { 205,11133 }, { 206,11133 }, { 207,11133 }, { 208,11133 }, + + { 209,11133 }, { 210,11133 }, { 211,11133 }, { 212,11133 }, { 213,11133 }, + { 214,11133 }, { 215,11133 }, { 216,11133 }, { 217,11133 }, { 218,11133 }, + { 219,11133 }, { 220,11133 }, { 221,11133 }, { 222,11133 }, { 223,11133 }, + { 224,11133 }, { 225,11133 }, { 226,11133 }, { 227,11133 }, { 228,11133 }, + { 229,11133 }, { 230,11133 }, { 231,11133 }, { 232,11133 }, { 233,11133 }, + { 234,11133 }, { 235,11133 }, { 236,11133 }, { 237,11133 }, { 238,11133 }, + { 239,11133 }, { 240,11133 }, { 241,11133 }, { 242,11133 }, { 243,11133 }, + { 244,11133 }, { 245,11133 }, { 246,11133 }, { 247,11133 }, { 248,11133 }, + { 249,11133 }, { 250,11133 }, { 251,11133 }, { 252,11133 }, { 253,11133 }, + { 254,11133 }, { 255,11133 }, { 256,3098 }, { 0, 0 }, { 0,105940 }, + + { 1,2840 }, { 2,2840 }, { 3,2840 }, { 4,2840 }, { 5,2840 }, + { 6,2840 }, { 7,2840 }, { 8,2840 }, { 9,2840 }, { 10,3980 }, + { 11,2840 }, { 12,2840 }, { 13,4192 }, { 14,2840 }, { 15,2840 }, + { 16,2840 }, { 17,2840 }, { 18,2840 }, { 19,2840 }, { 20,2840 }, + { 21,2840 }, { 22,2840 }, { 23,2840 }, { 24,2840 }, { 25,2840 }, + { 26,2840 }, { 27,2840 }, { 28,2840 }, { 29,2840 }, { 30,2840 }, + { 31,2840 }, { 32,2840 }, { 33,2840 }, { 34,2840 }, { 35,2840 }, + { 36,2840 }, { 37,2840 }, { 38,2840 }, { 39,2840 }, { 40,2840 }, + { 41,2840 }, { 42,2840 }, { 43,2840 }, { 44,2840 }, { 45,2840 }, + { 46,2840 }, { 47,2840 }, { 48,2840 }, { 49,2840 }, { 50,2840 }, + + { 51,2840 }, { 52,2840 }, { 53,2840 }, { 54,2840 }, { 55,2840 }, + { 56,2840 }, { 57,2840 }, { 58,2840 }, { 59,2840 }, { 60,2840 }, + { 61,2840 }, { 62,2840 }, { 63,2840 }, { 64,2840 }, { 65,2840 }, + { 66,2840 }, { 67,2840 }, { 68,2840 }, { 69,2840 }, { 70,2840 }, + { 71,2840 }, { 72,2840 }, { 73,2840 }, { 74,2840 }, { 75,2840 }, + { 76,2840 }, { 77,2840 }, { 78,2840 }, { 79,2840 }, { 80,2840 }, + { 81,2840 }, { 82,2840 }, { 83,2840 }, { 84,2840 }, { 85,2840 }, + { 86,2840 }, { 87,2840 }, { 88,2840 }, { 89,2840 }, { 90,2840 }, + { 91,2840 }, { 92,2840 }, { 93,2840 }, { 94,2840 }, { 95,2840 }, + { 96,2840 }, { 97,2840 }, { 98,2840 }, { 99,2840 }, { 100,2840 }, + + { 101,2840 }, { 102,2840 }, { 103,2840 }, { 104,2840 }, { 105,2840 }, + { 106,2840 }, { 107,2840 }, { 108,2840 }, { 109,2840 }, { 110,2840 }, + { 111,2840 }, { 112,2840 }, { 113,2840 }, { 114,2840 }, { 115,2840 }, + { 116,2840 }, { 117,2840 }, { 118,2840 }, { 119,2840 }, { 120,2840 }, + { 121,2840 }, { 122,2840 }, { 123,2840 }, { 124,2840 }, { 125,2840 }, + { 126,2840 }, { 127,2840 }, { 128,2840 }, { 129,2840 }, { 130,2840 }, + { 131,2840 }, { 132,2840 }, { 133,2840 }, { 134,2840 }, { 135,2840 }, + { 136,2840 }, { 137,2840 }, { 138,2840 }, { 139,2840 }, { 140,2840 }, + { 141,2840 }, { 142,2840 }, { 143,2840 }, { 144,2840 }, { 145,2840 }, + { 146,2840 }, { 147,2840 }, { 148,2840 }, { 149,2840 }, { 150,2840 }, + + { 151,2840 }, { 152,2840 }, { 153,2840 }, { 154,2840 }, { 155,2840 }, + { 156,2840 }, { 157,2840 }, { 158,2840 }, { 159,2840 }, { 160,2840 }, + { 161,2840 }, { 162,2840 }, { 163,2840 }, { 164,2840 }, { 165,2840 }, + { 166,2840 }, { 167,2840 }, { 168,2840 }, { 169,2840 }, { 170,2840 }, + { 171,2840 }, { 172,2840 }, { 173,2840 }, { 174,2840 }, { 175,2840 }, + { 176,2840 }, { 177,2840 }, { 178,2840 }, { 179,2840 }, { 180,2840 }, + { 181,2840 }, { 182,2840 }, { 183,2840 }, { 184,2840 }, { 185,2840 }, + { 186,2840 }, { 187,2840 }, { 188,2840 }, { 189,2840 }, { 190,2840 }, + { 191,2840 }, { 192,2840 }, { 193,2840 }, { 194,2840 }, { 195,2840 }, + { 196,2840 }, { 197,2840 }, { 198,2840 }, { 199,2840 }, { 200,2840 }, + + { 201,2840 }, { 202,2840 }, { 203,2840 }, { 204,2840 }, { 205,2840 }, + { 206,2840 }, { 207,2840 }, { 208,2840 }, { 209,2840 }, { 210,2840 }, + { 211,2840 }, { 212,2840 }, { 213,2840 }, { 214,2840 }, { 215,2840 }, + { 216,2840 }, { 217,2840 }, { 218,2840 }, { 219,2840 }, { 220,2840 }, + { 221,2840 }, { 222,2840 }, { 223,2840 }, { 224,2840 }, { 225,2840 }, + { 226,2840 }, { 227,2840 }, { 228,2840 }, { 229,2840 }, { 230,2840 }, + { 231,2840 }, { 232,2840 }, { 233,2840 }, { 234,2840 }, { 235,2840 }, + { 236,2840 }, { 237,2840 }, { 238,2840 }, { 239,2840 }, { 240,2840 }, + { 241,2840 }, { 242,2840 }, { 243,2840 }, { 244,2840 }, { 245,2840 }, + { 246,2840 }, { 247,2840 }, { 248,2840 }, { 249,2840 }, { 250,2840 }, + + { 251,2840 }, { 252,2840 }, { 253,2840 }, { 254,2840 }, { 255,2840 }, + { 256,2840 }, { 0, 0 }, { 0,105682 }, { 1,2582 }, { 2,2582 }, + { 3,2582 }, { 4,2582 }, { 5,2582 }, { 6,2582 }, { 7,2582 }, + { 8,2582 }, { 9,2582 }, { 10,3722 }, { 11,2582 }, { 12,2582 }, + { 13,3934 }, { 14,2582 }, { 15,2582 }, { 16,2582 }, { 17,2582 }, + { 18,2582 }, { 19,2582 }, { 20,2582 }, { 21,2582 }, { 22,2582 }, + { 23,2582 }, { 24,2582 }, { 25,2582 }, { 26,2582 }, { 27,2582 }, + { 28,2582 }, { 29,2582 }, { 30,2582 }, { 31,2582 }, { 32,2582 }, + { 33,2582 }, { 34,2582 }, { 35,2582 }, { 36,2582 }, { 37,2582 }, + { 38,2582 }, { 39,2582 }, { 40,2582 }, { 41,2582 }, { 42,2582 }, + + { 43,2582 }, { 44,2582 }, { 45,2582 }, { 46,2582 }, { 47,2582 }, + { 48,2582 }, { 49,2582 }, { 50,2582 }, { 51,2582 }, { 52,2582 }, + { 53,2582 }, { 54,2582 }, { 55,2582 }, { 56,2582 }, { 57,2582 }, + { 58,2582 }, { 59,2582 }, { 60,2582 }, { 61,2582 }, { 62,2582 }, + { 63,2582 }, { 64,2582 }, { 65,2582 }, { 66,2582 }, { 67,2582 }, + { 68,2582 }, { 69,2582 }, { 70,2582 }, { 71,2582 }, { 72,2582 }, + { 73,2582 }, { 74,2582 }, { 75,2582 }, { 76,2582 }, { 77,2582 }, + { 78,2582 }, { 79,2582 }, { 80,2582 }, { 81,2582 }, { 82,2582 }, + { 83,2582 }, { 84,2582 }, { 85,2582 }, { 86,2582 }, { 87,2582 }, + { 88,2582 }, { 89,2582 }, { 90,2582 }, { 91,2582 }, { 92,2582 }, + + { 93,2582 }, { 94,2582 }, { 95,2582 }, { 96,2582 }, { 97,2582 }, + { 98,2582 }, { 99,2582 }, { 100,2582 }, { 101,2582 }, { 102,2582 }, + { 103,2582 }, { 104,2582 }, { 105,2582 }, { 106,2582 }, { 107,2582 }, + { 108,2582 }, { 109,2582 }, { 110,2582 }, { 111,2582 }, { 112,2582 }, + { 113,2582 }, { 114,2582 }, { 115,2582 }, { 116,2582 }, { 117,2582 }, + { 118,2582 }, { 119,2582 }, { 120,2582 }, { 121,2582 }, { 122,2582 }, + { 123,2582 }, { 124,2582 }, { 125,2582 }, { 126,2582 }, { 127,2582 }, + { 128,2582 }, { 129,2582 }, { 130,2582 }, { 131,2582 }, { 132,2582 }, + { 133,2582 }, { 134,2582 }, { 135,2582 }, { 136,2582 }, { 137,2582 }, + { 138,2582 }, { 139,2582 }, { 140,2582 }, { 141,2582 }, { 142,2582 }, + + { 143,2582 }, { 144,2582 }, { 145,2582 }, { 146,2582 }, { 147,2582 }, + { 148,2582 }, { 149,2582 }, { 150,2582 }, { 151,2582 }, { 152,2582 }, + { 153,2582 }, { 154,2582 }, { 155,2582 }, { 156,2582 }, { 157,2582 }, + { 158,2582 }, { 159,2582 }, { 160,2582 }, { 161,2582 }, { 162,2582 }, + { 163,2582 }, { 164,2582 }, { 165,2582 }, { 166,2582 }, { 167,2582 }, + { 168,2582 }, { 169,2582 }, { 170,2582 }, { 171,2582 }, { 172,2582 }, + { 173,2582 }, { 174,2582 }, { 175,2582 }, { 176,2582 }, { 177,2582 }, + { 178,2582 }, { 179,2582 }, { 180,2582 }, { 181,2582 }, { 182,2582 }, + { 183,2582 }, { 184,2582 }, { 185,2582 }, { 186,2582 }, { 187,2582 }, + { 188,2582 }, { 189,2582 }, { 190,2582 }, { 191,2582 }, { 192,2582 }, + + { 193,2582 }, { 194,2582 }, { 195,2582 }, { 196,2582 }, { 197,2582 }, + { 198,2582 }, { 199,2582 }, { 200,2582 }, { 201,2582 }, { 202,2582 }, + { 203,2582 }, { 204,2582 }, { 205,2582 }, { 206,2582 }, { 207,2582 }, + { 208,2582 }, { 209,2582 }, { 210,2582 }, { 211,2582 }, { 212,2582 }, + { 213,2582 }, { 214,2582 }, { 215,2582 }, { 216,2582 }, { 217,2582 }, + { 218,2582 }, { 219,2582 }, { 220,2582 }, { 221,2582 }, { 222,2582 }, + { 223,2582 }, { 224,2582 }, { 225,2582 }, { 226,2582 }, { 227,2582 }, + { 228,2582 }, { 229,2582 }, { 230,2582 }, { 231,2582 }, { 232,2582 }, + { 233,2582 }, { 234,2582 }, { 235,2582 }, { 236,2582 }, { 237,2582 }, + { 238,2582 }, { 239,2582 }, { 240,2582 }, { 241,2582 }, { 242,2582 }, + + { 243,2582 }, { 244,2582 }, { 245,2582 }, { 246,2582 }, { 247,2582 }, + { 248,2582 }, { 249,2582 }, { 250,2582 }, { 251,2582 }, { 252,2582 }, + { 253,2582 }, { 254,2582 }, { 255,2582 }, { 256,2582 }, { 0, 0 }, + { 0,105424 }, { 1,10616 }, { 2,10616 }, { 3,10616 }, { 4,10616 }, + { 5,10616 }, { 6,10616 }, { 7,10616 }, { 8,10616 }, { 9,10616 }, + { 10,3678 }, { 11,10616 }, { 12,10616 }, { 13,3680 }, { 14,10616 }, + { 15,10616 }, { 16,10616 }, { 17,10616 }, { 18,10616 }, { 19,10616 }, + { 20,10616 }, { 21,10616 }, { 22,10616 }, { 23,10616 }, { 24,10616 }, + { 25,10616 }, { 26,10616 }, { 27,10616 }, { 28,10616 }, { 29,10616 }, + { 30,10616 }, { 31,10616 }, { 32,10616 }, { 33,10616 }, { 34,10616 }, + + { 35,10616 }, { 36,10616 }, { 37,10616 }, { 38,10616 }, { 39,10616 }, + { 40,10616 }, { 41,10616 }, { 42,10616 }, { 43,10616 }, { 44,10616 }, + { 45,10616 }, { 46,10616 }, { 47,10616 }, { 48,10616 }, { 49,10616 }, + { 50,10616 }, { 51,10616 }, { 52,10616 }, { 53,10616 }, { 54,10616 }, + { 55,10616 }, { 56,10616 }, { 57,10616 }, { 58,10616 }, { 59,10616 }, + { 60,10616 }, { 61,10616 }, { 62,10616 }, { 63,10616 }, { 64,10616 }, + { 65,10874 }, { 66,10874 }, { 67,10874 }, { 68,10874 }, { 69,10874 }, + { 70,10874 }, { 71,10874 }, { 72,10874 }, { 73,10874 }, { 74,10874 }, + { 75,10874 }, { 76,10874 }, { 77,10874 }, { 78,10874 }, { 79,10874 }, + { 80,10874 }, { 81,10874 }, { 82,10874 }, { 83,10874 }, { 84,10874 }, + + { 85,10874 }, { 86,10874 }, { 87,10874 }, { 88,10874 }, { 89,10874 }, + { 90,10874 }, { 91,10616 }, { 92,10616 }, { 93,10616 }, { 94,10616 }, + { 95,10874 }, { 96,10616 }, { 97,10874 }, { 98,10874 }, { 99,10874 }, + { 100,10874 }, { 101,10874 }, { 102,10874 }, { 103,10874 }, { 104,10874 }, + { 105,10874 }, { 106,10874 }, { 107,10874 }, { 108,10874 }, { 109,10874 }, + { 110,10874 }, { 111,10874 }, { 112,10874 }, { 113,10874 }, { 114,10874 }, + { 115,10874 }, { 116,10874 }, { 117,10874 }, { 118,10874 }, { 119,10874 }, + { 120,10874 }, { 121,10874 }, { 122,10874 }, { 123,10616 }, { 124,10616 }, + { 125,10616 }, { 126,10616 }, { 127,10874 }, { 128,10874 }, { 129,10874 }, + { 130,10874 }, { 131,10874 }, { 132,10874 }, { 133,10874 }, { 134,10874 }, + + { 135,10874 }, { 136,10874 }, { 137,10874 }, { 138,10874 }, { 139,10874 }, + { 140,10874 }, { 141,10874 }, { 142,10874 }, { 143,10874 }, { 144,10874 }, + { 145,10874 }, { 146,10874 }, { 147,10874 }, { 148,10874 }, { 149,10874 }, + { 150,10874 }, { 151,10874 }, { 152,10874 }, { 153,10874 }, { 154,10874 }, + { 155,10874 }, { 156,10874 }, { 157,10874 }, { 158,10874 }, { 159,10874 }, + { 160,10874 }, { 161,10874 }, { 162,10874 }, { 163,10874 }, { 164,10874 }, + { 165,10874 }, { 166,10874 }, { 167,10874 }, { 168,10874 }, { 169,10874 }, + { 170,10874 }, { 171,10874 }, { 172,10874 }, { 173,10874 }, { 174,10874 }, + { 175,10874 }, { 176,10874 }, { 177,10874 }, { 178,10874 }, { 179,10874 }, + { 180,10874 }, { 181,10874 }, { 182,10874 }, { 183,10874 }, { 184,10874 }, + + { 185,10874 }, { 186,10874 }, { 187,10874 }, { 188,10874 }, { 189,10874 }, + { 190,10874 }, { 191,10874 }, { 192,10874 }, { 193,10874 }, { 194,10874 }, + { 195,10874 }, { 196,10874 }, { 197,10874 }, { 198,10874 }, { 199,10874 }, + { 200,10874 }, { 201,10874 }, { 202,10874 }, { 203,10874 }, { 204,10874 }, + { 205,10874 }, { 206,10874 }, { 207,10874 }, { 208,10874 }, { 209,10874 }, + { 210,10874 }, { 211,10874 }, { 212,10874 }, { 213,10874 }, { 214,10874 }, + { 215,10874 }, { 216,10874 }, { 217,10874 }, { 218,10874 }, { 219,10874 }, + { 220,10874 }, { 221,10874 }, { 222,10874 }, { 223,10874 }, { 224,10874 }, + { 225,10874 }, { 226,10874 }, { 227,10874 }, { 228,10874 }, { 229,10874 }, + { 230,10874 }, { 231,10874 }, { 232,10874 }, { 233,10874 }, { 234,10874 }, + + { 235,10874 }, { 236,10874 }, { 237,10874 }, { 238,10874 }, { 239,10874 }, + { 240,10874 }, { 241,10874 }, { 242,10874 }, { 243,10874 }, { 244,10874 }, + { 245,10874 }, { 246,10874 }, { 247,10874 }, { 248,10874 }, { 249,10874 }, + { 250,10874 }, { 251,10874 }, { 252,10874 }, { 253,10874 }, { 254,10874 }, + { 255,10874 }, { 256,10616 }, { 0, 0 }, { 0,105166 }, { 1,10358 }, + { 2,10358 }, { 3,10358 }, { 4,10358 }, { 5,10358 }, { 6,10358 }, + { 7,10358 }, { 8,10358 }, { 9,10358 }, { 10,3420 }, { 11,10358 }, + { 12,10358 }, { 13,3422 }, { 14,10358 }, { 15,10358 }, { 16,10358 }, + { 17,10358 }, { 18,10358 }, { 19,10358 }, { 20,10358 }, { 21,10358 }, + { 22,10358 }, { 23,10358 }, { 24,10358 }, { 25,10358 }, { 26,10358 }, + + { 27,10358 }, { 28,10358 }, { 29,10358 }, { 30,10358 }, { 31,10358 }, + { 32,10358 }, { 33,10358 }, { 34,10358 }, { 35,10358 }, { 36,10358 }, + { 37,10358 }, { 38,10358 }, { 39,10358 }, { 40,10358 }, { 41,10358 }, + { 42,10358 }, { 43,10358 }, { 44,10358 }, { 45,10358 }, { 46,10358 }, + { 47,10358 }, { 48,10358 }, { 49,10358 }, { 50,10358 }, { 51,10358 }, + { 52,10358 }, { 53,10358 }, { 54,10358 }, { 55,10358 }, { 56,10358 }, + { 57,10358 }, { 58,10358 }, { 59,10358 }, { 60,10358 }, { 61,10358 }, + { 62,10358 }, { 63,10358 }, { 64,10358 }, { 65,10616 }, { 66,10616 }, + { 67,10616 }, { 68,10616 }, { 69,10616 }, { 70,10616 }, { 71,10616 }, + { 72,10616 }, { 73,10616 }, { 74,10616 }, { 75,10616 }, { 76,10616 }, + + { 77,10616 }, { 78,10616 }, { 79,10616 }, { 80,10616 }, { 81,10616 }, + { 82,10616 }, { 83,10616 }, { 84,10616 }, { 85,10616 }, { 86,10616 }, + { 87,10616 }, { 88,10616 }, { 89,10616 }, { 90,10616 }, { 91,10358 }, + { 92,10358 }, { 93,10358 }, { 94,10358 }, { 95,10616 }, { 96,10358 }, + { 97,10616 }, { 98,10616 }, { 99,10616 }, { 100,10616 }, { 101,10616 }, + { 102,10616 }, { 103,10616 }, { 104,10616 }, { 105,10616 }, { 106,10616 }, + { 107,10616 }, { 108,10616 }, { 109,10616 }, { 110,10616 }, { 111,10616 }, + { 112,10616 }, { 113,10616 }, { 114,10616 }, { 115,10616 }, { 116,10616 }, + { 117,10616 }, { 118,10616 }, { 119,10616 }, { 120,10616 }, { 121,10616 }, + { 122,10616 }, { 123,10358 }, { 124,10358 }, { 125,10358 }, { 126,10358 }, + + { 127,10616 }, { 128,10616 }, { 129,10616 }, { 130,10616 }, { 131,10616 }, + { 132,10616 }, { 133,10616 }, { 134,10616 }, { 135,10616 }, { 136,10616 }, + { 137,10616 }, { 138,10616 }, { 139,10616 }, { 140,10616 }, { 141,10616 }, + { 142,10616 }, { 143,10616 }, { 144,10616 }, { 145,10616 }, { 146,10616 }, + { 147,10616 }, { 148,10616 }, { 149,10616 }, { 150,10616 }, { 151,10616 }, + { 152,10616 }, { 153,10616 }, { 154,10616 }, { 155,10616 }, { 156,10616 }, + { 157,10616 }, { 158,10616 }, { 159,10616 }, { 160,10616 }, { 161,10616 }, + { 162,10616 }, { 163,10616 }, { 164,10616 }, { 165,10616 }, { 166,10616 }, + { 167,10616 }, { 168,10616 }, { 169,10616 }, { 170,10616 }, { 171,10616 }, + { 172,10616 }, { 173,10616 }, { 174,10616 }, { 175,10616 }, { 176,10616 }, + + { 177,10616 }, { 178,10616 }, { 179,10616 }, { 180,10616 }, { 181,10616 }, + { 182,10616 }, { 183,10616 }, { 184,10616 }, { 185,10616 }, { 186,10616 }, + { 187,10616 }, { 188,10616 }, { 189,10616 }, { 190,10616 }, { 191,10616 }, + { 192,10616 }, { 193,10616 }, { 194,10616 }, { 195,10616 }, { 196,10616 }, + { 197,10616 }, { 198,10616 }, { 199,10616 }, { 200,10616 }, { 201,10616 }, + { 202,10616 }, { 203,10616 }, { 204,10616 }, { 205,10616 }, { 206,10616 }, + { 207,10616 }, { 208,10616 }, { 209,10616 }, { 210,10616 }, { 211,10616 }, + { 212,10616 }, { 213,10616 }, { 214,10616 }, { 215,10616 }, { 216,10616 }, + { 217,10616 }, { 218,10616 }, { 219,10616 }, { 220,10616 }, { 221,10616 }, + { 222,10616 }, { 223,10616 }, { 224,10616 }, { 225,10616 }, { 226,10616 }, + + { 227,10616 }, { 228,10616 }, { 229,10616 }, { 230,10616 }, { 231,10616 }, + { 232,10616 }, { 233,10616 }, { 234,10616 }, { 235,10616 }, { 236,10616 }, + { 237,10616 }, { 238,10616 }, { 239,10616 }, { 240,10616 }, { 241,10616 }, + { 242,10616 }, { 243,10616 }, { 244,10616 }, { 245,10616 }, { 246,10616 }, + { 247,10616 }, { 248,10616 }, { 249,10616 }, { 250,10616 }, { 251,10616 }, + { 252,10616 }, { 253,10616 }, { 254,10616 }, { 255,10616 }, { 256,10358 }, + { 0, 0 }, { 0,104908 }, { 1,1808 }, { 2,1808 }, { 3,1808 }, + { 4,1808 }, { 5,1808 }, { 6,1808 }, { 7,1808 }, { 8,1808 }, + { 9,1810 }, { 10,1810 }, { 11,1808 }, { 12,1808 }, { 13,1810 }, + { 14,1808 }, { 15,1808 }, { 16,1808 }, { 17,1808 }, { 18,1808 }, + + { 19,1808 }, { 20,1808 }, { 21,1808 }, { 22,1808 }, { 23,1808 }, + { 24,1808 }, { 25,1808 }, { 26,1808 }, { 27,1808 }, { 28,1808 }, + { 29,1808 }, { 30,1808 }, { 31,1808 }, { 32,1810 }, { 33,1812 }, + { 34,1875 }, { 35,1814 }, { 36,2133 }, { 37,2135 }, { 38,2390 }, + { 39,2453 }, { 40,2711 }, { 41,1808 }, { 42,2713 }, { 43,2717 }, + { 44,1808 }, { 45,2724 }, { 46,2749 }, { 47,2726 }, { 48,2783 }, + { 49,2842 }, { 50,2842 }, { 51,2842 }, { 52,2842 }, { 53,2842 }, + { 54,2842 }, { 55,2842 }, { 56,2842 }, { 57,2842 }, { 58,2730 }, + { 59,1808 }, { 60,2815 }, { 61,2818 }, { 62,2821 }, { 63,2824 }, + { 64,1808 }, { 65,4700 }, { 66,10616 }, { 67,4700 }, { 68,4700 }, + + { 69,4700 }, { 70,4700 }, { 71,4700 }, { 72,4700 }, { 73,4700 }, + { 74,4700 }, { 75,4700 }, { 76,4700 }, { 77,4700 }, { 78,4700 }, + { 79,4700 }, { 80,4700 }, { 81,4700 }, { 82,4700 }, { 83,4700 }, + { 84,4700 }, { 85,4700 }, { 86,4700 }, { 87,4700 }, { 88,4700 }, + { 89,4700 }, { 90,4700 }, { 91,1808 }, { 92,2844 }, { 93,1808 }, + { 94,2846 }, { 95,4700 }, { 96,8555 }, { 97,4700 }, { 98,10616 }, + { 99,4700 }, { 100,4700 }, { 101,4700 }, { 102,4700 }, { 103,4700 }, + { 104,4700 }, { 105,4700 }, { 106,4700 }, { 107,4700 }, { 108,4700 }, + { 109,4700 }, { 110,4700 }, { 111,4700 }, { 112,4700 }, { 113,4700 }, + { 114,4700 }, { 115,4700 }, { 116,4700 }, { 117,4700 }, { 118,4700 }, + + { 119,4700 }, { 120,4700 }, { 121,4700 }, { 122,4700 }, { 123,1808 }, + { 124,2868 }, { 125,1808 }, { 126,1808 }, { 127,4700 }, { 128,4700 }, + { 129,4700 }, { 130,4700 }, { 131,4700 }, { 132,4700 }, { 133,4700 }, + { 134,4700 }, { 135,4700 }, { 136,4700 }, { 137,4700 }, { 138,4700 }, + { 139,4700 }, { 140,4700 }, { 141,4700 }, { 142,4700 }, { 143,4700 }, + { 144,4700 }, { 145,4700 }, { 146,4700 }, { 147,4700 }, { 148,4700 }, + { 149,4700 }, { 150,4700 }, { 151,4700 }, { 152,4700 }, { 153,4700 }, + { 154,4700 }, { 155,4700 }, { 156,4700 }, { 157,4700 }, { 158,4700 }, + { 159,4700 }, { 160,4700 }, { 161,4700 }, { 162,4700 }, { 163,4700 }, + { 164,4700 }, { 165,4700 }, { 166,4700 }, { 167,4700 }, { 168,4700 }, + + { 169,4700 }, { 170,4700 }, { 171,4700 }, { 172,4700 }, { 173,4700 }, + { 174,4700 }, { 175,4700 }, { 176,4700 }, { 177,4700 }, { 178,4700 }, + { 179,4700 }, { 180,4700 }, { 181,4700 }, { 182,4700 }, { 183,4700 }, + { 184,4700 }, { 185,4700 }, { 186,4700 }, { 187,4700 }, { 188,4700 }, + { 189,4700 }, { 190,4700 }, { 191,4700 }, { 192,4700 }, { 193,4700 }, + { 194,4700 }, { 195,4700 }, { 196,4700 }, { 197,4700 }, { 198,4700 }, + { 199,4700 }, { 200,4700 }, { 201,4700 }, { 202,4700 }, { 203,4700 }, + { 204,4700 }, { 205,4700 }, { 206,4700 }, { 207,4700 }, { 208,4700 }, + { 209,4700 }, { 210,4700 }, { 211,4700 }, { 212,4700 }, { 213,4700 }, + { 214,4700 }, { 215,4700 }, { 216,4700 }, { 217,4700 }, { 218,4700 }, + + { 219,4700 }, { 220,4700 }, { 221,4700 }, { 222,4700 }, { 223,4700 }, + { 224,4700 }, { 225,4700 }, { 226,4700 }, { 227,4700 }, { 228,4700 }, + { 229,4700 }, { 230,4700 }, { 231,4700 }, { 232,4700 }, { 233,4700 }, + { 234,4700 }, { 235,4700 }, { 236,4700 }, { 237,4700 }, { 238,4700 }, + { 239,4700 }, { 240,4700 }, { 241,4700 }, { 242,4700 }, { 243,4700 }, + { 244,4700 }, { 245,4700 }, { 246,4700 }, { 247,4700 }, { 248,4700 }, + { 249,4700 }, { 250,4700 }, { 251,4700 }, { 252,4700 }, { 253,4700 }, + { 254,4700 }, { 255,4700 }, { 256,1808 }, { 0, 0 }, { 0,104650 }, + { 1,1550 }, { 2,1550 }, { 3,1550 }, { 4,1550 }, { 5,1550 }, + { 6,1550 }, { 7,1550 }, { 8,1550 }, { 9,1552 }, { 10,1552 }, + + { 11,1550 }, { 12,1550 }, { 13,1552 }, { 14,1550 }, { 15,1550 }, + { 16,1550 }, { 17,1550 }, { 18,1550 }, { 19,1550 }, { 20,1550 }, + { 21,1550 }, { 22,1550 }, { 23,1550 }, { 24,1550 }, { 25,1550 }, + { 26,1550 }, { 27,1550 }, { 28,1550 }, { 29,1550 }, { 30,1550 }, + { 31,1550 }, { 32,1552 }, { 33,1554 }, { 34,1617 }, { 35,1556 }, + { 36,1875 }, { 37,1877 }, { 38,2132 }, { 39,2195 }, { 40,2453 }, + { 41,1550 }, { 42,2455 }, { 43,2459 }, { 44,1550 }, { 45,2466 }, + { 46,2491 }, { 47,2468 }, { 48,2525 }, { 49,2584 }, { 50,2584 }, + { 51,2584 }, { 52,2584 }, { 53,2584 }, { 54,2584 }, { 55,2584 }, + { 56,2584 }, { 57,2584 }, { 58,2472 }, { 59,1550 }, { 60,2557 }, + + { 61,2560 }, { 62,2563 }, { 63,2566 }, { 64,1550 }, { 65,4442 }, + { 66,10358 }, { 67,4442 }, { 68,4442 }, { 69,4442 }, { 70,4442 }, + { 71,4442 }, { 72,4442 }, { 73,4442 }, { 74,4442 }, { 75,4442 }, + { 76,4442 }, { 77,4442 }, { 78,4442 }, { 79,4442 }, { 80,4442 }, + { 81,4442 }, { 82,4442 }, { 83,4442 }, { 84,4442 }, { 85,4442 }, + { 86,4442 }, { 87,4442 }, { 88,4442 }, { 89,4442 }, { 90,4442 }, + { 91,1550 }, { 92,2586 }, { 93,1550 }, { 94,2588 }, { 95,4442 }, + { 96,8297 }, { 97,4442 }, { 98,10358 }, { 99,4442 }, { 100,4442 }, + { 101,4442 }, { 102,4442 }, { 103,4442 }, { 104,4442 }, { 105,4442 }, + { 106,4442 }, { 107,4442 }, { 108,4442 }, { 109,4442 }, { 110,4442 }, + + { 111,4442 }, { 112,4442 }, { 113,4442 }, { 114,4442 }, { 115,4442 }, + { 116,4442 }, { 117,4442 }, { 118,4442 }, { 119,4442 }, { 120,4442 }, + { 121,4442 }, { 122,4442 }, { 123,1550 }, { 124,2610 }, { 125,1550 }, + { 126,1550 }, { 127,4442 }, { 128,4442 }, { 129,4442 }, { 130,4442 }, + { 131,4442 }, { 132,4442 }, { 133,4442 }, { 134,4442 }, { 135,4442 }, + { 136,4442 }, { 137,4442 }, { 138,4442 }, { 139,4442 }, { 140,4442 }, + { 141,4442 }, { 142,4442 }, { 143,4442 }, { 144,4442 }, { 145,4442 }, + { 146,4442 }, { 147,4442 }, { 148,4442 }, { 149,4442 }, { 150,4442 }, + { 151,4442 }, { 152,4442 }, { 153,4442 }, { 154,4442 }, { 155,4442 }, + { 156,4442 }, { 157,4442 }, { 158,4442 }, { 159,4442 }, { 160,4442 }, + + { 161,4442 }, { 162,4442 }, { 163,4442 }, { 164,4442 }, { 165,4442 }, + { 166,4442 }, { 167,4442 }, { 168,4442 }, { 169,4442 }, { 170,4442 }, + { 171,4442 }, { 172,4442 }, { 173,4442 }, { 174,4442 }, { 175,4442 }, + { 176,4442 }, { 177,4442 }, { 178,4442 }, { 179,4442 }, { 180,4442 }, + { 181,4442 }, { 182,4442 }, { 183,4442 }, { 184,4442 }, { 185,4442 }, + { 186,4442 }, { 187,4442 }, { 188,4442 }, { 189,4442 }, { 190,4442 }, + { 191,4442 }, { 192,4442 }, { 193,4442 }, { 194,4442 }, { 195,4442 }, + { 196,4442 }, { 197,4442 }, { 198,4442 }, { 199,4442 }, { 200,4442 }, + { 201,4442 }, { 202,4442 }, { 203,4442 }, { 204,4442 }, { 205,4442 }, + { 206,4442 }, { 207,4442 }, { 208,4442 }, { 209,4442 }, { 210,4442 }, + + { 211,4442 }, { 212,4442 }, { 213,4442 }, { 214,4442 }, { 215,4442 }, + { 216,4442 }, { 217,4442 }, { 218,4442 }, { 219,4442 }, { 220,4442 }, + { 221,4442 }, { 222,4442 }, { 223,4442 }, { 224,4442 }, { 225,4442 }, + { 226,4442 }, { 227,4442 }, { 228,4442 }, { 229,4442 }, { 230,4442 }, + { 231,4442 }, { 232,4442 }, { 233,4442 }, { 234,4442 }, { 235,4442 }, + { 236,4442 }, { 237,4442 }, { 238,4442 }, { 239,4442 }, { 240,4442 }, + { 241,4442 }, { 242,4442 }, { 243,4442 }, { 244,4442 }, { 245,4442 }, + { 246,4442 }, { 247,4442 }, { 248,4442 }, { 249,4442 }, { 250,4442 }, + { 251,4442 }, { 252,4442 }, { 253,4442 }, { 254,4442 }, { 255,4442 }, + { 256,1550 }, { 0, 0 }, { 0,104392 }, { 1,1292 }, { 2,1292 }, + + { 3,1292 }, { 4,1292 }, { 5,1292 }, { 6,1292 }, { 7,1292 }, + { 8,1292 }, { 9,1294 }, { 10,1294 }, { 11,1292 }, { 12,1292 }, + { 13,1294 }, { 14,1292 }, { 15,1292 }, { 16,1292 }, { 17,1292 }, + { 18,1292 }, { 19,1292 }, { 20,1292 }, { 21,1292 }, { 22,1292 }, + { 23,1292 }, { 24,1292 }, { 25,1292 }, { 26,1292 }, { 27,1292 }, + { 28,1292 }, { 29,1292 }, { 30,1292 }, { 31,1292 }, { 32,1294 }, + { 33,1296 }, { 34,1359 }, { 35,1298 }, { 36,1617 }, { 37,1619 }, + { 38,1874 }, { 39,1937 }, { 40,2195 }, { 41,1292 }, { 42,2197 }, + { 43,2201 }, { 44,1292 }, { 45,2208 }, { 46,2233 }, { 47,2210 }, + { 48,2267 }, { 49,2326 }, { 50,2326 }, { 51,2326 }, { 52,2326 }, + + { 53,2326 }, { 54,2326 }, { 55,2326 }, { 56,2326 }, { 57,2326 }, + { 58,2214 }, { 59,1292 }, { 60,2299 }, { 61,2302 }, { 62,2305 }, + { 63,2308 }, { 64,1292 }, { 65,4184 }, { 66,10100 }, { 67,4184 }, + { 68,4184 }, { 69,4184 }, { 70,4184 }, { 71,4184 }, { 72,4184 }, + { 73,4184 }, { 74,4184 }, { 75,4184 }, { 76,4184 }, { 77,4184 }, + { 78,4184 }, { 79,4184 }, { 80,4184 }, { 81,4184 }, { 82,4184 }, + { 83,4184 }, { 84,4184 }, { 85,4184 }, { 86,4184 }, { 87,4184 }, + { 88,4184 }, { 89,4184 }, { 90,4184 }, { 91,1292 }, { 92,2328 }, + { 93,1292 }, { 94,2330 }, { 95,4184 }, { 96,8039 }, { 97,4184 }, + { 98,10100 }, { 99,4184 }, { 100,4184 }, { 101,4184 }, { 102,4184 }, + + { 103,4184 }, { 104,4184 }, { 105,4184 }, { 106,4184 }, { 107,4184 }, + { 108,4184 }, { 109,4184 }, { 110,4184 }, { 111,4184 }, { 112,4184 }, + { 113,4184 }, { 114,4184 }, { 115,4184 }, { 116,4184 }, { 117,4184 }, + { 118,4184 }, { 119,4184 }, { 120,4184 }, { 121,4184 }, { 122,4184 }, + { 123,1292 }, { 124,2352 }, { 125,1292 }, { 126,1292 }, { 127,4184 }, + { 128,4184 }, { 129,4184 }, { 130,4184 }, { 131,4184 }, { 132,4184 }, + { 133,4184 }, { 134,4184 }, { 135,4184 }, { 136,4184 }, { 137,4184 }, + { 138,4184 }, { 139,4184 }, { 140,4184 }, { 141,4184 }, { 142,4184 }, + { 143,4184 }, { 144,4184 }, { 145,4184 }, { 146,4184 }, { 147,4184 }, + { 148,4184 }, { 149,4184 }, { 150,4184 }, { 151,4184 }, { 152,4184 }, + + { 153,4184 }, { 154,4184 }, { 155,4184 }, { 156,4184 }, { 157,4184 }, + { 158,4184 }, { 159,4184 }, { 160,4184 }, { 161,4184 }, { 162,4184 }, + { 163,4184 }, { 164,4184 }, { 165,4184 }, { 166,4184 }, { 167,4184 }, + { 168,4184 }, { 169,4184 }, { 170,4184 }, { 171,4184 }, { 172,4184 }, + { 173,4184 }, { 174,4184 }, { 175,4184 }, { 176,4184 }, { 177,4184 }, + { 178,4184 }, { 179,4184 }, { 180,4184 }, { 181,4184 }, { 182,4184 }, + { 183,4184 }, { 184,4184 }, { 185,4184 }, { 186,4184 }, { 187,4184 }, + { 188,4184 }, { 189,4184 }, { 190,4184 }, { 191,4184 }, { 192,4184 }, + { 193,4184 }, { 194,4184 }, { 195,4184 }, { 196,4184 }, { 197,4184 }, + { 198,4184 }, { 199,4184 }, { 200,4184 }, { 201,4184 }, { 202,4184 }, + + { 203,4184 }, { 204,4184 }, { 205,4184 }, { 206,4184 }, { 207,4184 }, + { 208,4184 }, { 209,4184 }, { 210,4184 }, { 211,4184 }, { 212,4184 }, + { 213,4184 }, { 214,4184 }, { 215,4184 }, { 216,4184 }, { 217,4184 }, + { 218,4184 }, { 219,4184 }, { 220,4184 }, { 221,4184 }, { 222,4184 }, + { 223,4184 }, { 224,4184 }, { 225,4184 }, { 226,4184 }, { 227,4184 }, + { 228,4184 }, { 229,4184 }, { 230,4184 }, { 231,4184 }, { 232,4184 }, + { 233,4184 }, { 234,4184 }, { 235,4184 }, { 236,4184 }, { 237,4184 }, + { 238,4184 }, { 239,4184 }, { 240,4184 }, { 241,4184 }, { 242,4184 }, + { 243,4184 }, { 244,4184 }, { 245,4184 }, { 246,4184 }, { 247,4184 }, + { 248,4184 }, { 249,4184 }, { 250,4184 }, { 251,4184 }, { 252,4184 }, + + { 253,4184 }, { 254,4184 }, { 255,4184 }, { 256,1292 }, { 0, 0 }, + { 0,104134 }, { 1,1034 }, { 2,1034 }, { 3,1034 }, { 4,1034 }, + { 5,1034 }, { 6,1034 }, { 7,1034 }, { 8,1034 }, { 9,1036 }, + { 10,1036 }, { 11,1034 }, { 12,1034 }, { 13,1036 }, { 14,1034 }, + { 15,1034 }, { 16,1034 }, { 17,1034 }, { 18,1034 }, { 19,1034 }, + { 20,1034 }, { 21,1034 }, { 22,1034 }, { 23,1034 }, { 24,1034 }, + { 25,1034 }, { 26,1034 }, { 27,1034 }, { 28,1034 }, { 29,1034 }, + { 30,1034 }, { 31,1034 }, { 32,1036 }, { 33,1038 }, { 34,1101 }, + { 35,1040 }, { 36,1359 }, { 37,1361 }, { 38,1616 }, { 39,1679 }, + { 40,1937 }, { 41,1034 }, { 42,1939 }, { 43,1943 }, { 44,1034 }, + + { 45,1950 }, { 46,1975 }, { 47,1952 }, { 48,2009 }, { 49,2068 }, + { 50,2068 }, { 51,2068 }, { 52,2068 }, { 53,2068 }, { 54,2068 }, + { 55,2068 }, { 56,2068 }, { 57,2068 }, { 58,1956 }, { 59,1034 }, + { 60,2041 }, { 61,2044 }, { 62,2047 }, { 63,2050 }, { 64,1034 }, + { 65,3926 }, { 66,9842 }, { 67,3926 }, { 68,3926 }, { 69,3926 }, + { 70,3926 }, { 71,3926 }, { 72,3926 }, { 73,3926 }, { 74,3926 }, + { 75,3926 }, { 76,3926 }, { 77,3926 }, { 78,3926 }, { 79,3926 }, + { 80,3926 }, { 81,3926 }, { 82,3926 }, { 83,3926 }, { 84,3926 }, + { 85,3926 }, { 86,3926 }, { 87,3926 }, { 88,3926 }, { 89,3926 }, + { 90,3926 }, { 91,1034 }, { 92,2070 }, { 93,1034 }, { 94,2072 }, + + { 95,3926 }, { 96,7781 }, { 97,3926 }, { 98,9842 }, { 99,3926 }, + { 100,3926 }, { 101,3926 }, { 102,3926 }, { 103,3926 }, { 104,3926 }, + { 105,3926 }, { 106,3926 }, { 107,3926 }, { 108,3926 }, { 109,3926 }, + { 110,3926 }, { 111,3926 }, { 112,3926 }, { 113,3926 }, { 114,3926 }, + { 115,3926 }, { 116,3926 }, { 117,3926 }, { 118,3926 }, { 119,3926 }, + { 120,3926 }, { 121,3926 }, { 122,3926 }, { 123,1034 }, { 124,2094 }, + { 125,1034 }, { 126,1034 }, { 127,3926 }, { 128,3926 }, { 129,3926 }, + { 130,3926 }, { 131,3926 }, { 132,3926 }, { 133,3926 }, { 134,3926 }, + { 135,3926 }, { 136,3926 }, { 137,3926 }, { 138,3926 }, { 139,3926 }, + { 140,3926 }, { 141,3926 }, { 142,3926 }, { 143,3926 }, { 144,3926 }, + + { 145,3926 }, { 146,3926 }, { 147,3926 }, { 148,3926 }, { 149,3926 }, + { 150,3926 }, { 151,3926 }, { 152,3926 }, { 153,3926 }, { 154,3926 }, + { 155,3926 }, { 156,3926 }, { 157,3926 }, { 158,3926 }, { 159,3926 }, + { 160,3926 }, { 161,3926 }, { 162,3926 }, { 163,3926 }, { 164,3926 }, + { 165,3926 }, { 166,3926 }, { 167,3926 }, { 168,3926 }, { 169,3926 }, + { 170,3926 }, { 171,3926 }, { 172,3926 }, { 173,3926 }, { 174,3926 }, + { 175,3926 }, { 176,3926 }, { 177,3926 }, { 178,3926 }, { 179,3926 }, + { 180,3926 }, { 181,3926 }, { 182,3926 }, { 183,3926 }, { 184,3926 }, + { 185,3926 }, { 186,3926 }, { 187,3926 }, { 188,3926 }, { 189,3926 }, + { 190,3926 }, { 191,3926 }, { 192,3926 }, { 193,3926 }, { 194,3926 }, + + { 195,3926 }, { 196,3926 }, { 197,3926 }, { 198,3926 }, { 199,3926 }, + { 200,3926 }, { 201,3926 }, { 202,3926 }, { 203,3926 }, { 204,3926 }, + { 205,3926 }, { 206,3926 }, { 207,3926 }, { 208,3926 }, { 209,3926 }, + { 210,3926 }, { 211,3926 }, { 212,3926 }, { 213,3926 }, { 214,3926 }, + { 215,3926 }, { 216,3926 }, { 217,3926 }, { 218,3926 }, { 219,3926 }, + { 220,3926 }, { 221,3926 }, { 222,3926 }, { 223,3926 }, { 224,3926 }, + { 225,3926 }, { 226,3926 }, { 227,3926 }, { 228,3926 }, { 229,3926 }, + { 230,3926 }, { 231,3926 }, { 232,3926 }, { 233,3926 }, { 234,3926 }, + { 235,3926 }, { 236,3926 }, { 237,3926 }, { 238,3926 }, { 239,3926 }, + { 240,3926 }, { 241,3926 }, { 242,3926 }, { 243,3926 }, { 244,3926 }, + + { 245,3926 }, { 246,3926 }, { 247,3926 }, { 248,3926 }, { 249,3926 }, + { 250,3926 }, { 251,3926 }, { 252,3926 }, { 253,3926 }, { 254,3926 }, + { 255,3926 }, { 256,1034 }, { 0, 0 }, { 0,103876 }, { 1, 776 }, + { 2, 776 }, { 3, 776 }, { 4, 776 }, { 5, 776 }, { 6, 776 }, + { 7, 776 }, { 8, 776 }, { 9, 776 }, { 10, 776 }, { 11, 776 }, + { 12, 776 }, { 13, 776 }, { 14, 776 }, { 15, 776 }, { 16, 776 }, + { 17, 776 }, { 18, 776 }, { 19, 776 }, { 20, 776 }, { 21, 776 }, + { 22, 776 }, { 23, 776 }, { 24, 776 }, { 25, 776 }, { 26, 776 }, + { 27, 776 }, { 28, 776 }, { 29, 776 }, { 30, 776 }, { 31, 776 }, + { 32, 776 }, { 33, 776 }, { 34, 776 }, { 35, 776 }, { 36, 776 }, + + { 37, 776 }, { 38, 776 }, { 39, 776 }, { 40, 776 }, { 41, 776 }, + { 42, 776 }, { 43, 776 }, { 44, 776 }, { 45, 776 }, { 46, 776 }, + { 47, 776 }, { 48, 776 }, { 49, 776 }, { 50, 776 }, { 51, 776 }, + { 52, 776 }, { 53, 776 }, { 54, 776 }, { 55, 776 }, { 56, 776 }, + { 57, 776 }, { 58, 776 }, { 59, 776 }, { 60, 776 }, { 61, 776 }, + { 62, 776 }, { 63, 776 }, { 64, 776 }, { 65, 776 }, { 66, 776 }, + { 67, 776 }, { 68, 776 }, { 69, 776 }, { 70, 776 }, { 71, 776 }, + { 72, 776 }, { 73, 776 }, { 74, 776 }, { 75, 776 }, { 76, 776 }, + { 77, 776 }, { 78, 776 }, { 79, 776 }, { 80, 776 }, { 81, 776 }, + { 82, 776 }, { 83, 776 }, { 84, 776 }, { 85, 776 }, { 86, 776 }, + + { 87, 776 }, { 88, 776 }, { 89, 776 }, { 90, 776 }, { 91, 776 }, + { 92, 776 }, { 93, 776 }, { 94, 776 }, { 95, 776 }, { 96, 776 }, + { 97, 776 }, { 98, 776 }, { 99, 776 }, { 100, 776 }, { 101, 776 }, + { 102, 776 }, { 103, 776 }, { 104, 776 }, { 105, 776 }, { 106, 776 }, + { 107, 776 }, { 108, 776 }, { 109, 776 }, { 110, 776 }, { 111, 776 }, + { 112, 776 }, { 113, 776 }, { 114, 776 }, { 115, 776 }, { 116, 776 }, + { 117, 776 }, { 118, 776 }, { 119, 776 }, { 120, 776 }, { 121, 776 }, + { 122, 776 }, { 123, 776 }, { 124, 776 }, { 125, 776 }, { 126, 776 }, + { 127, 776 }, { 128, 776 }, { 129, 776 }, { 130, 776 }, { 131, 776 }, + { 132, 776 }, { 133, 776 }, { 134, 776 }, { 135, 776 }, { 136, 776 }, + + { 137, 776 }, { 138, 776 }, { 139, 776 }, { 140, 776 }, { 141, 776 }, + { 142, 776 }, { 143, 776 }, { 144, 776 }, { 145, 776 }, { 146, 776 }, + { 147, 776 }, { 148, 776 }, { 149, 776 }, { 150, 776 }, { 151, 776 }, + { 152, 776 }, { 153, 776 }, { 154, 776 }, { 155, 776 }, { 156, 776 }, + { 157, 776 }, { 158, 776 }, { 159, 776 }, { 160, 776 }, { 161, 776 }, + { 162, 776 }, { 163, 776 }, { 164, 776 }, { 165, 776 }, { 166, 776 }, + { 167, 776 }, { 168, 776 }, { 169, 776 }, { 170, 776 }, { 171, 776 }, + { 172, 776 }, { 173, 776 }, { 174, 776 }, { 175, 776 }, { 176, 776 }, + { 177, 776 }, { 178, 776 }, { 179, 776 }, { 180, 776 }, { 181, 776 }, + { 182, 776 }, { 183, 776 }, { 184, 776 }, { 185, 776 }, { 186, 776 }, + + { 187, 776 }, { 188, 776 }, { 189, 776 }, { 190, 776 }, { 191, 776 }, + { 192, 776 }, { 193, 776 }, { 194, 776 }, { 195, 776 }, { 196, 776 }, + { 197, 776 }, { 198, 776 }, { 199, 776 }, { 200, 776 }, { 201, 776 }, + { 202, 776 }, { 203, 776 }, { 204, 776 }, { 205, 776 }, { 206, 776 }, + { 207, 776 }, { 208, 776 }, { 209, 776 }, { 210, 776 }, { 211, 776 }, + { 212, 776 }, { 213, 776 }, { 214, 776 }, { 215, 776 }, { 216, 776 }, + { 217, 776 }, { 218, 776 }, { 219, 776 }, { 220, 776 }, { 221, 776 }, + { 222, 776 }, { 223, 776 }, { 224, 776 }, { 225, 776 }, { 226, 776 }, + { 227, 776 }, { 228, 776 }, { 229, 776 }, { 230, 776 }, { 231, 776 }, + { 232, 776 }, { 233, 776 }, { 234, 776 }, { 235, 776 }, { 236, 776 }, + + { 237, 776 }, { 238, 776 }, { 239, 776 }, { 240, 776 }, { 241, 776 }, + { 242, 776 }, { 243, 776 }, { 244, 776 }, { 245, 776 }, { 246, 776 }, + { 247, 776 }, { 248, 776 }, { 249, 776 }, { 250, 776 }, { 251, 776 }, + { 252, 776 }, { 253, 776 }, { 254, 776 }, { 255, 776 }, { 256, 776 }, + { 0, 0 }, { 0,103618 }, { 1, 518 }, { 2, 518 }, { 3, 518 }, + { 4, 518 }, { 5, 518 }, { 6, 518 }, { 7, 518 }, { 8, 518 }, + { 9, 518 }, { 10, 518 }, { 11, 518 }, { 12, 518 }, { 13, 518 }, + { 14, 518 }, { 15, 518 }, { 16, 518 }, { 17, 518 }, { 18, 518 }, + { 19, 518 }, { 20, 518 }, { 21, 518 }, { 22, 518 }, { 23, 518 }, + { 24, 518 }, { 25, 518 }, { 26, 518 }, { 27, 518 }, { 28, 518 }, + + { 29, 518 }, { 30, 518 }, { 31, 518 }, { 32, 518 }, { 33, 518 }, + { 34, 518 }, { 35, 518 }, { 36, 518 }, { 37, 518 }, { 38, 518 }, + { 39, 518 }, { 40, 518 }, { 41, 518 }, { 42, 518 }, { 43, 518 }, + { 44, 518 }, { 45, 518 }, { 46, 518 }, { 47, 518 }, { 48, 518 }, + { 49, 518 }, { 50, 518 }, { 51, 518 }, { 52, 518 }, { 53, 518 }, + { 54, 518 }, { 55, 518 }, { 56, 518 }, { 57, 518 }, { 58, 518 }, + { 59, 518 }, { 60, 518 }, { 61, 518 }, { 62, 518 }, { 63, 518 }, + { 64, 518 }, { 65, 518 }, { 66, 518 }, { 67, 518 }, { 68, 518 }, + { 69, 518 }, { 70, 518 }, { 71, 518 }, { 72, 518 }, { 73, 518 }, + { 74, 518 }, { 75, 518 }, { 76, 518 }, { 77, 518 }, { 78, 518 }, + + { 79, 518 }, { 80, 518 }, { 81, 518 }, { 82, 518 }, { 83, 518 }, + { 84, 518 }, { 85, 518 }, { 86, 518 }, { 87, 518 }, { 88, 518 }, + { 89, 518 }, { 90, 518 }, { 91, 518 }, { 92, 518 }, { 93, 518 }, + { 94, 518 }, { 95, 518 }, { 96, 518 }, { 97, 518 }, { 98, 518 }, + { 99, 518 }, { 100, 518 }, { 101, 518 }, { 102, 518 }, { 103, 518 }, + { 104, 518 }, { 105, 518 }, { 106, 518 }, { 107, 518 }, { 108, 518 }, + { 109, 518 }, { 110, 518 }, { 111, 518 }, { 112, 518 }, { 113, 518 }, + { 114, 518 }, { 115, 518 }, { 116, 518 }, { 117, 518 }, { 118, 518 }, + { 119, 518 }, { 120, 518 }, { 121, 518 }, { 122, 518 }, { 123, 518 }, + { 124, 518 }, { 125, 518 }, { 126, 518 }, { 127, 518 }, { 128, 518 }, + + { 129, 518 }, { 130, 518 }, { 131, 518 }, { 132, 518 }, { 133, 518 }, + { 134, 518 }, { 135, 518 }, { 136, 518 }, { 137, 518 }, { 138, 518 }, + { 139, 518 }, { 140, 518 }, { 141, 518 }, { 142, 518 }, { 143, 518 }, + { 144, 518 }, { 145, 518 }, { 146, 518 }, { 147, 518 }, { 148, 518 }, + { 149, 518 }, { 150, 518 }, { 151, 518 }, { 152, 518 }, { 153, 518 }, + { 154, 518 }, { 155, 518 }, { 156, 518 }, { 157, 518 }, { 158, 518 }, + { 159, 518 }, { 160, 518 }, { 161, 518 }, { 162, 518 }, { 163, 518 }, + { 164, 518 }, { 165, 518 }, { 166, 518 }, { 167, 518 }, { 168, 518 }, + { 169, 518 }, { 170, 518 }, { 171, 518 }, { 172, 518 }, { 173, 518 }, + { 174, 518 }, { 175, 518 }, { 176, 518 }, { 177, 518 }, { 178, 518 }, + + { 179, 518 }, { 180, 518 }, { 181, 518 }, { 182, 518 }, { 183, 518 }, + { 184, 518 }, { 185, 518 }, { 186, 518 }, { 187, 518 }, { 188, 518 }, + { 189, 518 }, { 190, 518 }, { 191, 518 }, { 192, 518 }, { 193, 518 }, + { 194, 518 }, { 195, 518 }, { 196, 518 }, { 197, 518 }, { 198, 518 }, + { 199, 518 }, { 200, 518 }, { 201, 518 }, { 202, 518 }, { 203, 518 }, + { 204, 518 }, { 205, 518 }, { 206, 518 }, { 207, 518 }, { 208, 518 }, + { 209, 518 }, { 210, 518 }, { 211, 518 }, { 212, 518 }, { 213, 518 }, + { 214, 518 }, { 215, 518 }, { 216, 518 }, { 217, 518 }, { 218, 518 }, + { 219, 518 }, { 220, 518 }, { 221, 518 }, { 222, 518 }, { 223, 518 }, + { 224, 518 }, { 225, 518 }, { 226, 518 }, { 227, 518 }, { 228, 518 }, + + { 229, 518 }, { 230, 518 }, { 231, 518 }, { 232, 518 }, { 233, 518 }, + { 234, 518 }, { 235, 518 }, { 236, 518 }, { 237, 518 }, { 238, 518 }, + { 239, 518 }, { 240, 518 }, { 241, 518 }, { 242, 518 }, { 243, 518 }, + { 244, 518 }, { 245, 518 }, { 246, 518 }, { 247, 518 }, { 248, 518 }, + { 249, 518 }, { 250, 518 }, { 251, 518 }, { 252, 518 }, { 253, 518 }, + { 254, 518 }, { 255, 518 }, { 256, 518 }, { 0, 4 }, { 0,103360 }, + { 1,9325 }, { 2,9325 }, { 3,9325 }, { 4,9325 }, { 5,9325 }, + { 6,9325 }, { 7,9325 }, { 8,9325 }, { 9,9325 }, { 10,9325 }, + { 11,9325 }, { 12,9325 }, { 13,9325 }, { 14,9325 }, { 15,9325 }, + { 16,9325 }, { 17,9325 }, { 18,9325 }, { 19,9325 }, { 20,9325 }, + + { 21,9325 }, { 22,9325 }, { 23,9325 }, { 24,9325 }, { 25,9325 }, + { 26,9325 }, { 27,9325 }, { 28,9325 }, { 29,9325 }, { 30,9325 }, + { 31,9325 }, { 32,9325 }, { 33,9325 }, { 34,9325 }, { 35,9325 }, + { 36,9325 }, { 37,9325 }, { 38,9325 }, { 39,9325 }, { 40,9325 }, + { 41,9325 }, { 42,9325 }, { 43,9325 }, { 44,9325 }, { 45,9325 }, + { 46,9325 }, { 47,9325 }, { 48,9325 }, { 49,9325 }, { 50,9325 }, + { 51,9325 }, { 52,9325 }, { 53,9325 }, { 54,9325 }, { 55,9325 }, + { 56,9325 }, { 57,9325 }, { 58,9325 }, { 59,9325 }, { 0, 0 }, + { 61,9325 }, { 62,9325 }, { 63,9325 }, { 64,9325 }, { 65,9325 }, + { 66,9325 }, { 67,9325 }, { 68,9325 }, { 69,9325 }, { 70,9325 }, + + { 71,9325 }, { 72,9325 }, { 73,9325 }, { 74,9325 }, { 75,9325 }, + { 76,9325 }, { 77,9325 }, { 78,9325 }, { 79,9325 }, { 80,9325 }, + { 81,9325 }, { 82,9325 }, { 83,9325 }, { 84,9325 }, { 85,9325 }, + { 86,9325 }, { 87,9325 }, { 88,9325 }, { 89,9325 }, { 90,9325 }, + { 91,9325 }, { 92,9325 }, { 93,9325 }, { 94,9325 }, { 95,9325 }, + { 96,9325 }, { 97,9325 }, { 98,9325 }, { 99,9325 }, { 100,9325 }, + { 101,9325 }, { 102,9325 }, { 103,9325 }, { 104,9325 }, { 105,9325 }, + { 106,9325 }, { 107,9325 }, { 108,9325 }, { 109,9325 }, { 110,9325 }, + { 111,9325 }, { 112,9325 }, { 113,9325 }, { 114,9325 }, { 115,9325 }, + { 116,9325 }, { 117,9325 }, { 118,9325 }, { 119,9325 }, { 120,9325 }, + + { 121,9325 }, { 122,9325 }, { 123,9325 }, { 124,9325 }, { 125,9325 }, + { 126,9325 }, { 127,9325 }, { 128,9325 }, { 129,9325 }, { 130,9325 }, + { 131,9325 }, { 132,9325 }, { 133,9325 }, { 134,9325 }, { 135,9325 }, + { 136,9325 }, { 137,9325 }, { 138,9325 }, { 139,9325 }, { 140,9325 }, + { 141,9325 }, { 142,9325 }, { 143,9325 }, { 144,9325 }, { 145,9325 }, + { 146,9325 }, { 147,9325 }, { 148,9325 }, { 149,9325 }, { 150,9325 }, + { 151,9325 }, { 152,9325 }, { 153,9325 }, { 154,9325 }, { 155,9325 }, + { 156,9325 }, { 157,9325 }, { 158,9325 }, { 159,9325 }, { 160,9325 }, + { 161,9325 }, { 162,9325 }, { 163,9325 }, { 164,9325 }, { 165,9325 }, + { 166,9325 }, { 167,9325 }, { 168,9325 }, { 169,9325 }, { 170,9325 }, + + { 171,9325 }, { 172,9325 }, { 173,9325 }, { 174,9325 }, { 175,9325 }, + { 176,9325 }, { 177,9325 }, { 178,9325 }, { 179,9325 }, { 180,9325 }, + { 181,9325 }, { 182,9325 }, { 183,9325 }, { 184,9325 }, { 185,9325 }, + { 186,9325 }, { 187,9325 }, { 188,9325 }, { 189,9325 }, { 190,9325 }, + { 191,9325 }, { 192,9325 }, { 193,9325 }, { 194,9325 }, { 195,9325 }, + { 196,9325 }, { 197,9325 }, { 198,9325 }, { 199,9325 }, { 200,9325 }, + { 201,9325 }, { 202,9325 }, { 203,9325 }, { 204,9325 }, { 205,9325 }, + { 206,9325 }, { 207,9325 }, { 208,9325 }, { 209,9325 }, { 210,9325 }, + { 211,9325 }, { 212,9325 }, { 213,9325 }, { 214,9325 }, { 215,9325 }, + { 216,9325 }, { 217,9325 }, { 218,9325 }, { 219,9325 }, { 220,9325 }, + + { 221,9325 }, { 222,9325 }, { 223,9325 }, { 224,9325 }, { 225,9325 }, + { 226,9325 }, { 227,9325 }, { 228,9325 }, { 229,9325 }, { 230,9325 }, + { 231,9325 }, { 232,9325 }, { 233,9325 }, { 234,9325 }, { 235,9325 }, + { 236,9325 }, { 237,9325 }, { 238,9325 }, { 239,9325 }, { 240,9325 }, + { 241,9325 }, { 242,9325 }, { 243,9325 }, { 244,9325 }, { 245,9325 }, + { 246,9325 }, { 247,9325 }, { 248,9325 }, { 249,9325 }, { 250,9325 }, + { 251,9325 }, { 252,9325 }, { 253,9325 }, { 254,9325 }, { 255,9325 }, + { 256,9325 }, { 0, 4 }, { 0,103102 }, { 0, 142 }, { 0,103100 }, + { 0, 9 }, { 0,103098 }, { 0, 142 }, { 0,103096 }, { 0, 6 }, + { 0,103094 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 9,9323 }, { 10,9323 }, { 0, 0 }, { 0, 0 }, { 13,9323 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32,9323 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 63,9325 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 61,9323 }, + { 0, 142 }, { 0,103033 }, { 1,9370 }, { 2,9370 }, { 3,9370 }, + { 4,9370 }, { 5,9370 }, { 6,9370 }, { 7,9370 }, { 8,9370 }, + { 9,9370 }, { 10,9370 }, { 11,9370 }, { 12,9370 }, { 13,9370 }, + { 14,9370 }, { 15,9370 }, { 16,9370 }, { 17,9370 }, { 18,9370 }, + { 19,9370 }, { 20,9370 }, { 21,9370 }, { 22,9370 }, { 23,9370 }, + { 24,9370 }, { 25,9370 }, { 26,9370 }, { 27,9370 }, { 28,9370 }, + { 29,9370 }, { 30,9370 }, { 31,9370 }, { 32,9370 }, { 33,9370 }, + { 34,9262 }, { 35,9370 }, { 36,9370 }, { 37,9370 }, { 38,9370 }, + { 39,9370 }, { 40,9370 }, { 41,9370 }, { 42,9370 }, { 43,9370 }, + + { 44,9370 }, { 45,9370 }, { 46,9370 }, { 47,9370 }, { 48,9370 }, + { 49,9370 }, { 50,9370 }, { 51,9370 }, { 52,9370 }, { 53,9370 }, + { 54,9370 }, { 55,9370 }, { 56,9370 }, { 57,9370 }, { 58,9370 }, + { 59,9370 }, { 60,9370 }, { 61,9370 }, { 62,9370 }, { 63,9370 }, + { 64,9370 }, { 65,9370 }, { 66,9370 }, { 67,9370 }, { 68,9370 }, + { 69,9370 }, { 70,9370 }, { 71,9370 }, { 72,9370 }, { 73,9370 }, + { 74,9370 }, { 75,9370 }, { 76,9370 }, { 77,9370 }, { 78,9370 }, + { 79,9370 }, { 80,9370 }, { 81,9370 }, { 82,9370 }, { 83,9370 }, + { 84,9370 }, { 85,9370 }, { 86,9370 }, { 87,9370 }, { 88,9370 }, + { 89,9370 }, { 90,9370 }, { 91,9370 }, { 92,9628 }, { 93,9370 }, + + { 94,9370 }, { 95,9370 }, { 96,9370 }, { 97,9370 }, { 98,9370 }, + { 99,9370 }, { 100,9370 }, { 101,9370 }, { 102,9370 }, { 103,9370 }, + { 104,9370 }, { 105,9370 }, { 106,9370 }, { 107,9370 }, { 108,9370 }, + { 109,9370 }, { 110,9370 }, { 111,9370 }, { 112,9370 }, { 113,9370 }, + { 114,9370 }, { 115,9370 }, { 116,9370 }, { 117,9370 }, { 118,9370 }, + { 119,9370 }, { 120,9370 }, { 121,9370 }, { 122,9370 }, { 123,9370 }, + { 124,9370 }, { 125,9370 }, { 126,9370 }, { 127,9370 }, { 128,9370 }, + { 129,9370 }, { 130,9370 }, { 131,9370 }, { 132,9370 }, { 133,9370 }, + { 134,9370 }, { 135,9370 }, { 136,9370 }, { 137,9370 }, { 138,9370 }, + { 139,9370 }, { 140,9370 }, { 141,9370 }, { 142,9370 }, { 143,9370 }, + + { 144,9370 }, { 145,9370 }, { 146,9370 }, { 147,9370 }, { 148,9370 }, + { 149,9370 }, { 150,9370 }, { 151,9370 }, { 152,9370 }, { 153,9370 }, + { 154,9370 }, { 155,9370 }, { 156,9370 }, { 157,9370 }, { 158,9370 }, + { 159,9370 }, { 160,9370 }, { 161,9370 }, { 162,9370 }, { 163,9370 }, + { 164,9370 }, { 165,9370 }, { 166,9370 }, { 167,9370 }, { 168,9370 }, + { 169,9370 }, { 170,9370 }, { 171,9370 }, { 172,9370 }, { 173,9370 }, + { 174,9370 }, { 175,9370 }, { 176,9370 }, { 177,9370 }, { 178,9370 }, + { 179,9370 }, { 180,9370 }, { 181,9370 }, { 182,9370 }, { 183,9370 }, + { 184,9370 }, { 185,9370 }, { 186,9370 }, { 187,9370 }, { 188,9370 }, + { 189,9370 }, { 190,9370 }, { 191,9370 }, { 192,9370 }, { 193,9370 }, + + { 194,9370 }, { 195,9370 }, { 196,9370 }, { 197,9370 }, { 198,9370 }, + { 199,9370 }, { 200,9370 }, { 201,9370 }, { 202,9370 }, { 203,9370 }, + { 204,9370 }, { 205,9370 }, { 206,9370 }, { 207,9370 }, { 208,9370 }, + { 209,9370 }, { 210,9370 }, { 211,9370 }, { 212,9370 }, { 213,9370 }, + { 214,9370 }, { 215,9370 }, { 216,9370 }, { 217,9370 }, { 218,9370 }, + { 219,9370 }, { 220,9370 }, { 221,9370 }, { 222,9370 }, { 223,9370 }, + { 224,9370 }, { 225,9370 }, { 226,9370 }, { 227,9370 }, { 228,9370 }, + { 229,9370 }, { 230,9370 }, { 231,9370 }, { 232,9370 }, { 233,9370 }, + { 234,9370 }, { 235,9370 }, { 236,9370 }, { 237,9370 }, { 238,9370 }, + { 239,9370 }, { 240,9370 }, { 241,9370 }, { 242,9370 }, { 243,9370 }, + + { 244,9370 }, { 245,9370 }, { 246,9370 }, { 247,9370 }, { 248,9370 }, + { 249,9370 }, { 250,9370 }, { 251,9370 }, { 252,9370 }, { 253,9370 }, + { 254,9370 }, { 255,9370 }, { 256,9370 }, { 0, 142 }, { 0,102775 }, + { 0, 142 }, { 0,102773 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 61,9004 }, { 0, 0 }, { 65,9628 }, + { 66,9628 }, { 67,9628 }, { 68,9628 }, { 69,9628 }, { 70,9628 }, + { 71,9628 }, { 72,9628 }, { 73,9628 }, { 74,9628 }, { 75,9628 }, + { 76,9628 }, { 77,9628 }, { 78,9628 }, { 79,9628 }, { 80,9628 }, + { 81,9628 }, { 82,9628 }, { 83,9628 }, { 84,9628 }, { 85,9628 }, + + { 86,9628 }, { 87,9628 }, { 88,9628 }, { 89,9628 }, { 90,9628 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,9628 }, + { 0, 0 }, { 97,9628 }, { 98,9628 }, { 99,9628 }, { 100,9628 }, + { 101,9628 }, { 102,9628 }, { 103,9628 }, { 104,9628 }, { 105,9628 }, + { 106,9628 }, { 107,9628 }, { 108,9628 }, { 109,9628 }, { 110,9628 }, + { 111,9628 }, { 112,9628 }, { 113,9628 }, { 114,9628 }, { 115,9628 }, + { 116,9628 }, { 117,9628 }, { 118,9628 }, { 119,9628 }, { 120,9628 }, + { 121,9628 }, { 122,9628 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,9628 }, { 128,9628 }, { 129,9628 }, { 130,9628 }, + { 131,9628 }, { 132,9628 }, { 133,9628 }, { 134,9628 }, { 135,9628 }, + + { 136,9628 }, { 137,9628 }, { 138,9628 }, { 139,9628 }, { 140,9628 }, + { 141,9628 }, { 142,9628 }, { 143,9628 }, { 144,9628 }, { 145,9628 }, + { 146,9628 }, { 147,9628 }, { 148,9628 }, { 149,9628 }, { 150,9628 }, + { 151,9628 }, { 152,9628 }, { 153,9628 }, { 154,9628 }, { 155,9628 }, + { 156,9628 }, { 157,9628 }, { 158,9628 }, { 159,9628 }, { 160,9628 }, + { 161,9628 }, { 162,9628 }, { 163,9628 }, { 164,9628 }, { 165,9628 }, + { 166,9628 }, { 167,9628 }, { 168,9628 }, { 169,9628 }, { 170,9628 }, + { 171,9628 }, { 172,9628 }, { 173,9628 }, { 174,9628 }, { 175,9628 }, + { 176,9628 }, { 177,9628 }, { 178,9628 }, { 179,9628 }, { 180,9628 }, + { 181,9628 }, { 182,9628 }, { 183,9628 }, { 184,9628 }, { 185,9628 }, + + { 186,9628 }, { 187,9628 }, { 188,9628 }, { 189,9628 }, { 190,9628 }, + { 191,9628 }, { 192,9628 }, { 193,9628 }, { 194,9628 }, { 195,9628 }, + { 196,9628 }, { 197,9628 }, { 198,9628 }, { 199,9628 }, { 200,9628 }, + { 201,9628 }, { 202,9628 }, { 203,9628 }, { 204,9628 }, { 205,9628 }, + { 206,9628 }, { 207,9628 }, { 208,9628 }, { 209,9628 }, { 210,9628 }, + { 211,9628 }, { 212,9628 }, { 213,9628 }, { 214,9628 }, { 215,9628 }, + { 216,9628 }, { 217,9628 }, { 218,9628 }, { 219,9628 }, { 220,9628 }, + { 221,9628 }, { 222,9628 }, { 223,9628 }, { 224,9628 }, { 225,9628 }, + { 226,9628 }, { 227,9628 }, { 228,9628 }, { 229,9628 }, { 230,9628 }, + { 231,9628 }, { 232,9628 }, { 233,9628 }, { 234,9628 }, { 235,9628 }, + + { 236,9628 }, { 237,9628 }, { 238,9628 }, { 239,9628 }, { 240,9628 }, + { 241,9628 }, { 242,9628 }, { 243,9628 }, { 244,9628 }, { 245,9628 }, + { 246,9628 }, { 247,9628 }, { 248,9628 }, { 249,9628 }, { 250,9628 }, + { 251,9628 }, { 252,9628 }, { 253,9628 }, { 254,9628 }, { 255,9628 }, + { 0, 142 }, { 0,102518 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 38,8751 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 61,8755 }, { 0, 142 }, { 0,102455 }, + { 1,9565 }, { 2,9565 }, { 3,9565 }, { 4,9565 }, { 5,9565 }, + { 6,9565 }, { 7,9565 }, { 8,9565 }, { 9,9565 }, { 10,9565 }, + { 11,9565 }, { 12,9565 }, { 13,9565 }, { 14,9565 }, { 15,9565 }, + + { 16,9565 }, { 17,9565 }, { 18,9565 }, { 19,9565 }, { 20,9565 }, + { 21,9565 }, { 22,9565 }, { 23,9565 }, { 24,9565 }, { 25,9565 }, + { 26,9565 }, { 27,9565 }, { 28,9565 }, { 29,9565 }, { 30,9565 }, + { 31,9565 }, { 32,9565 }, { 33,9565 }, { 34,9565 }, { 35,9565 }, + { 36,9565 }, { 37,9565 }, { 38,9565 }, { 39,8684 }, { 40,9565 }, + { 41,9565 }, { 42,9565 }, { 43,9565 }, { 44,9565 }, { 45,9565 }, + { 46,9565 }, { 47,9565 }, { 48,9565 }, { 49,9565 }, { 50,9565 }, + { 51,9565 }, { 52,9565 }, { 53,9565 }, { 54,9565 }, { 55,9565 }, + { 56,9565 }, { 57,9565 }, { 58,9565 }, { 59,9565 }, { 60,9565 }, + { 61,9565 }, { 62,9565 }, { 63,9565 }, { 64,9565 }, { 65,9565 }, + + { 66,9565 }, { 67,9565 }, { 68,9565 }, { 69,9565 }, { 70,9565 }, + { 71,9565 }, { 72,9565 }, { 73,9565 }, { 74,9565 }, { 75,9565 }, + { 76,9565 }, { 77,9565 }, { 78,9565 }, { 79,9565 }, { 80,9565 }, + { 81,9565 }, { 82,9565 }, { 83,9565 }, { 84,9565 }, { 85,9565 }, + { 86,9565 }, { 87,9565 }, { 88,9565 }, { 89,9565 }, { 90,9565 }, + { 91,9565 }, { 92,9823 }, { 93,9565 }, { 94,9565 }, { 95,9565 }, + { 96,9565 }, { 97,9565 }, { 98,9565 }, { 99,9565 }, { 100,9565 }, + { 101,9565 }, { 102,9565 }, { 103,9565 }, { 104,9565 }, { 105,9565 }, + { 106,9565 }, { 107,9565 }, { 108,9565 }, { 109,9565 }, { 110,9565 }, + { 111,9565 }, { 112,9565 }, { 113,9565 }, { 114,9565 }, { 115,9565 }, + + { 116,9565 }, { 117,9565 }, { 118,9565 }, { 119,9565 }, { 120,9565 }, + { 121,9565 }, { 122,9565 }, { 123,9565 }, { 124,9565 }, { 125,9565 }, + { 126,9565 }, { 127,9565 }, { 128,9565 }, { 129,9565 }, { 130,9565 }, + { 131,9565 }, { 132,9565 }, { 133,9565 }, { 134,9565 }, { 135,9565 }, + { 136,9565 }, { 137,9565 }, { 138,9565 }, { 139,9565 }, { 140,9565 }, + { 141,9565 }, { 142,9565 }, { 143,9565 }, { 144,9565 }, { 145,9565 }, + { 146,9565 }, { 147,9565 }, { 148,9565 }, { 149,9565 }, { 150,9565 }, + { 151,9565 }, { 152,9565 }, { 153,9565 }, { 154,9565 }, { 155,9565 }, + { 156,9565 }, { 157,9565 }, { 158,9565 }, { 159,9565 }, { 160,9565 }, + { 161,9565 }, { 162,9565 }, { 163,9565 }, { 164,9565 }, { 165,9565 }, + + { 166,9565 }, { 167,9565 }, { 168,9565 }, { 169,9565 }, { 170,9565 }, + { 171,9565 }, { 172,9565 }, { 173,9565 }, { 174,9565 }, { 175,9565 }, + { 176,9565 }, { 177,9565 }, { 178,9565 }, { 179,9565 }, { 180,9565 }, + { 181,9565 }, { 182,9565 }, { 183,9565 }, { 184,9565 }, { 185,9565 }, + { 186,9565 }, { 187,9565 }, { 188,9565 }, { 189,9565 }, { 190,9565 }, + { 191,9565 }, { 192,9565 }, { 193,9565 }, { 194,9565 }, { 195,9565 }, + { 196,9565 }, { 197,9565 }, { 198,9565 }, { 199,9565 }, { 200,9565 }, + { 201,9565 }, { 202,9565 }, { 203,9565 }, { 204,9565 }, { 205,9565 }, + { 206,9565 }, { 207,9565 }, { 208,9565 }, { 209,9565 }, { 210,9565 }, + { 211,9565 }, { 212,9565 }, { 213,9565 }, { 214,9565 }, { 215,9565 }, + + { 216,9565 }, { 217,9565 }, { 218,9565 }, { 219,9565 }, { 220,9565 }, + { 221,9565 }, { 222,9565 }, { 223,9565 }, { 224,9565 }, { 225,9565 }, + { 226,9565 }, { 227,9565 }, { 228,9565 }, { 229,9565 }, { 230,9565 }, + { 231,9565 }, { 232,9565 }, { 233,9565 }, { 234,9565 }, { 235,9565 }, + { 236,9565 }, { 237,9565 }, { 238,9565 }, { 239,9565 }, { 240,9565 }, + { 241,9565 }, { 242,9565 }, { 243,9565 }, { 244,9565 }, { 245,9565 }, + { 246,9565 }, { 247,9565 }, { 248,9565 }, { 249,9565 }, { 250,9565 }, + { 251,9565 }, { 252,9565 }, { 253,9565 }, { 254,9565 }, { 255,9565 }, + { 256,9565 }, { 0, 142 }, { 0,102197 }, { 0, 142 }, { 0,102195 }, + { 0, 0 }, { 0, 0 }, { 0, 142 }, { 0,102191 }, { 0, 0 }, + + { 0, 0 }, { 9,9823 }, { 0, 0 }, { 0, 0 }, { 0, 142 }, + { 0,102184 }, { 0, 142 }, { 0,102182 }, { 0, 0 }, { 0, 0 }, + { 0, 142 }, { 0,102178 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32,9823 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 142 }, + { 0,102159 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 43,9851 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 42,9859 }, + + { 45,9848 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 47,9861 }, + { 61,9851 }, { 0, 0 }, { 65,9059 }, { 66,9825 }, { 61,9853 }, + { 68,9828 }, { 0, 0 }, { 70,9834 }, { 0, 129 }, { 0,102125 }, + { 73,9836 }, { 61,9850 }, { 62,9852 }, { 61,9863 }, { 58,9893 }, + { 0, 0 }, { 79,9843 }, { 0, 0 }, { 0, 0 }, { 82,9846 }, + { 83,9848 }, { 46,9829 }, { 85,9851 }, { 48,9862 }, { 49,9862 }, + { 50,9862 }, { 51,9862 }, { 52,9862 }, { 53,9862 }, { 54,9862 }, + { 55,9862 }, { 56,9862 }, { 57,9862 }, { 0, 0 }, { 97,9059 }, + { 98,9825 }, { 61,9831 }, { 100,9828 }, { 0, 0 }, { 102,9834 }, + { 0, 142 }, { 0,102093 }, { 105,9836 }, { 0, 142 }, { 0,102090 }, + + { 0, 0 }, { 0, 142 }, { 0,102087 }, { 111,9843 }, { 0, 142 }, + { 0,102084 }, { 114,9846 }, { 115,9848 }, { 0, 0 }, { 117,9851 }, + { 46,9855 }, { 0, 0 }, { 48,9888 }, { 49,9888 }, { 50,9888 }, + { 51,9888 }, { 52,9888 }, { 53,9888 }, { 54,9888 }, { 55,9888 }, + { 56,9888 }, { 57,9888 }, { 0, 129 }, { 0,102066 }, { 0, 118 }, + { 0,102064 }, { 0, 142 }, { 0,102062 }, { 0, 0 }, { 0, 0 }, + { 66,9823 }, { 0, 0 }, { 0, 0 }, { 69,9915 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 47,9815 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 142 }, { 0,102040 }, + + { 0, 14 }, { 0,102038 }, { 88,9926 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 60,9859 }, { 61,9867 }, { 62,9869 }, { 0, 0 }, + { 61,9888 }, { 62,9893 }, { 98,9823 }, { 61,9894 }, { 62,9909 }, + { 101,9915 }, { 0, 0 }, { 62,9946 }, { 63,9958 }, { 46,9796 }, + { 0, 0 }, { 48,9829 }, { 49,9829 }, { 50,9829 }, { 51,9829 }, + { 52,9829 }, { 53,9829 }, { 54,9829 }, { 55,9829 }, { 56,9829 }, + { 57,9829 }, { 0, 131 }, { 0,102007 }, { 0, 0 }, { 120,9926 }, + { 0, 14 }, { 0,102003 }, { 0, 0 }, { 61,9943 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 69,9856 }, { 0, 15 }, { 0,101995 }, + { 0, 0 }, { 10,9894 }, { 0, 10 }, { 0,101991 }, { 0, 0 }, + + { 0, 10 }, { 0,101988 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 61,9927 }, { 10,9883 }, { 0, 13 }, { 0,101976 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 101,9856 }, + { 0, 0 }, { 0, 15 }, { 0,101962 }, { 0, 138 }, { 0,101960 }, + { 48,9884 }, { 49,9884 }, { 50,9884 }, { 51,9884 }, { 52,9884 }, + { 53,9884 }, { 54,9884 }, { 55,9884 }, { 56,9884 }, { 57,9884 }, + { 0, 0 }, { 47,9888 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,9884 }, { 66,10141 }, { 67,9884 }, + + { 68,9884 }, { 69,9884 }, { 70,9884 }, { 71,9884 }, { 72,9884 }, + { 73,9884 }, { 74,9884 }, { 75,9884 }, { 76,9884 }, { 77,9884 }, + { 78,10398 }, { 79,9884 }, { 80,9884 }, { 81,9884 }, { 82,10655 }, + { 83,10912 }, { 84,9884 }, { 85,9884 }, { 86,9884 }, { 87,9884 }, + { 88,9884 }, { 89,9884 }, { 90,9884 }, { 124,9929 }, { 47,9867 }, + { 62,9873 }, { 0, 0 }, { 95,9884 }, { 0, 0 }, { 97,9884 }, + { 98,10141 }, { 99,9884 }, { 100,9884 }, { 101,9884 }, { 102,9884 }, + { 103,9884 }, { 104,9884 }, { 105,9884 }, { 106,9884 }, { 107,9884 }, + { 108,9884 }, { 109,9884 }, { 110,10398 }, { 111,9884 }, { 112,9884 }, + { 113,9884 }, { 114,10655 }, { 115,10912 }, { 116,9884 }, { 117,9884 }, + + { 118,9884 }, { 119,9884 }, { 120,9884 }, { 121,9884 }, { 122,9884 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,9884 }, + { 128,9884 }, { 129,9884 }, { 130,9884 }, { 131,9884 }, { 132,9884 }, + { 133,9884 }, { 134,9884 }, { 135,9884 }, { 136,9884 }, { 137,9884 }, + { 138,9884 }, { 139,9884 }, { 140,9884 }, { 141,9884 }, { 142,9884 }, + { 143,9884 }, { 144,9884 }, { 145,9884 }, { 146,9884 }, { 147,9884 }, + { 148,9884 }, { 149,9884 }, { 150,9884 }, { 151,9884 }, { 152,9884 }, + { 153,9884 }, { 154,9884 }, { 155,9884 }, { 156,9884 }, { 157,9884 }, + { 158,9884 }, { 159,9884 }, { 160,9884 }, { 161,9884 }, { 162,9884 }, + { 163,9884 }, { 164,9884 }, { 165,9884 }, { 166,9884 }, { 167,9884 }, + + { 168,9884 }, { 169,9884 }, { 170,9884 }, { 171,9884 }, { 172,9884 }, + { 173,9884 }, { 174,9884 }, { 175,9884 }, { 176,9884 }, { 177,9884 }, + { 178,9884 }, { 179,9884 }, { 180,9884 }, { 181,9884 }, { 182,9884 }, + { 183,9884 }, { 184,9884 }, { 185,9884 }, { 186,9884 }, { 187,9884 }, + { 188,9884 }, { 189,9884 }, { 190,9884 }, { 191,9884 }, { 192,9884 }, + { 193,9884 }, { 194,9884 }, { 195,9884 }, { 196,9884 }, { 197,9884 }, + { 198,9884 }, { 199,9884 }, { 200,9884 }, { 201,9884 }, { 202,9884 }, + { 203,9884 }, { 204,9884 }, { 205,9884 }, { 206,9884 }, { 207,9884 }, + { 208,9884 }, { 209,9884 }, { 210,9884 }, { 211,9884 }, { 212,9884 }, + { 213,9884 }, { 214,9884 }, { 215,9884 }, { 216,9884 }, { 217,9884 }, + + { 218,9884 }, { 219,9884 }, { 220,9884 }, { 221,9884 }, { 222,9884 }, + { 223,9884 }, { 224,9884 }, { 225,9884 }, { 226,9884 }, { 227,9884 }, + { 228,9884 }, { 229,9884 }, { 230,9884 }, { 231,9884 }, { 232,9884 }, + { 233,9884 }, { 234,9884 }, { 235,9884 }, { 236,9884 }, { 237,9884 }, + { 238,9884 }, { 239,9884 }, { 240,9884 }, { 241,9884 }, { 242,9884 }, + { 243,9884 }, { 244,9884 }, { 245,9884 }, { 246,9884 }, { 247,9884 }, + { 248,9884 }, { 249,9884 }, { 250,9884 }, { 251,9884 }, { 252,9884 }, + { 253,9884 }, { 254,9884 }, { 255,9884 }, { 0, 131 }, { 0,101750 }, + { 0, 138 }, { 0,101748 }, { 0, 141 }, { 0,101746 }, { 0, 141 }, + { 0,101744 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 10,9655 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 10,9653 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 34,10912 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 39,11170 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,9627 }, { 49,9627 }, { 50,9627 }, + { 51,9627 }, { 52,9627 }, { 53,9627 }, { 54,9627 }, { 55,9627 }, + { 56,9627 }, { 57,9627 }, { 0, 0 }, { 0, 0 }, { 60,9629 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,9627 }, + { 66,9627 }, { 67,9627 }, { 68,9627 }, { 69,9627 }, { 70,9627 }, + { 71,9627 }, { 72,9627 }, { 73,9627 }, { 74,9627 }, { 75,9627 }, + { 76,9627 }, { 77,9627 }, { 78,9627 }, { 79,9627 }, { 80,9627 }, + { 81,9627 }, { 82,11428 }, { 83,9627 }, { 84,9627 }, { 85,9627 }, + { 86,9627 }, { 87,9627 }, { 88,9627 }, { 89,9627 }, { 90,9627 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,9627 }, + { 0, 0 }, { 97,9627 }, { 98,9627 }, { 99,9627 }, { 100,9627 }, + { 101,9627 }, { 102,9627 }, { 103,9627 }, { 104,9627 }, { 105,9627 }, + { 106,9627 }, { 107,9627 }, { 108,9627 }, { 109,9627 }, { 110,9627 }, + + { 111,9627 }, { 112,9627 }, { 113,9627 }, { 114,11428 }, { 115,9627 }, + { 116,9627 }, { 117,9627 }, { 118,9627 }, { 119,9627 }, { 120,9627 }, + { 121,9627 }, { 122,9627 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,9627 }, { 128,9627 }, { 129,9627 }, { 130,9627 }, + { 131,9627 }, { 132,9627 }, { 133,9627 }, { 134,9627 }, { 135,9627 }, + { 136,9627 }, { 137,9627 }, { 138,9627 }, { 139,9627 }, { 140,9627 }, + { 141,9627 }, { 142,9627 }, { 143,9627 }, { 144,9627 }, { 145,9627 }, + { 146,9627 }, { 147,9627 }, { 148,9627 }, { 149,9627 }, { 150,9627 }, + { 151,9627 }, { 152,9627 }, { 153,9627 }, { 154,9627 }, { 155,9627 }, + { 156,9627 }, { 157,9627 }, { 158,9627 }, { 159,9627 }, { 160,9627 }, + + { 161,9627 }, { 162,9627 }, { 163,9627 }, { 164,9627 }, { 165,9627 }, + { 166,9627 }, { 167,9627 }, { 168,9627 }, { 169,9627 }, { 170,9627 }, + { 171,9627 }, { 172,9627 }, { 173,9627 }, { 174,9627 }, { 175,9627 }, + { 176,9627 }, { 177,9627 }, { 178,9627 }, { 179,9627 }, { 180,9627 }, + { 181,9627 }, { 182,9627 }, { 183,9627 }, { 184,9627 }, { 185,9627 }, + { 186,9627 }, { 187,9627 }, { 188,9627 }, { 189,9627 }, { 190,9627 }, + { 191,9627 }, { 192,9627 }, { 193,9627 }, { 194,9627 }, { 195,9627 }, + { 196,9627 }, { 197,9627 }, { 198,9627 }, { 199,9627 }, { 200,9627 }, + { 201,9627 }, { 202,9627 }, { 203,9627 }, { 204,9627 }, { 205,9627 }, + { 206,9627 }, { 207,9627 }, { 208,9627 }, { 209,9627 }, { 210,9627 }, + + { 211,9627 }, { 212,9627 }, { 213,9627 }, { 214,9627 }, { 215,9627 }, + { 216,9627 }, { 217,9627 }, { 218,9627 }, { 219,9627 }, { 220,9627 }, + { 221,9627 }, { 222,9627 }, { 223,9627 }, { 224,9627 }, { 225,9627 }, + { 226,9627 }, { 227,9627 }, { 228,9627 }, { 229,9627 }, { 230,9627 }, + { 231,9627 }, { 232,9627 }, { 233,9627 }, { 234,9627 }, { 235,9627 }, + { 236,9627 }, { 237,9627 }, { 238,9627 }, { 239,9627 }, { 240,9627 }, + { 241,9627 }, { 242,9627 }, { 243,9627 }, { 244,9627 }, { 245,9627 }, + { 246,9627 }, { 247,9627 }, { 248,9627 }, { 249,9627 }, { 250,9627 }, + { 251,9627 }, { 252,9627 }, { 253,9627 }, { 254,9627 }, { 255,9627 }, + { 0, 131 }, { 0,101493 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,9370 }, + { 49,9370 }, { 50,9370 }, { 51,9370 }, { 52,9370 }, { 53,9370 }, + + { 54,9370 }, { 55,9370 }, { 56,9370 }, { 57,9370 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,11428 }, { 66,9370 }, { 67,9370 }, { 68,9370 }, + { 69,9370 }, { 70,9370 }, { 71,9370 }, { 72,9370 }, { 73,9370 }, + { 74,9370 }, { 75,9370 }, { 76,11685 }, { 77,9370 }, { 78,9370 }, + { 79,11942 }, { 80,9370 }, { 81,9370 }, { 82,9370 }, { 83,9370 }, + { 84,9370 }, { 85,9370 }, { 86,9370 }, { 87,9370 }, { 88,9370 }, + { 89,9370 }, { 90,9370 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,9370 }, { 0, 0 }, { 97,11428 }, { 98,9370 }, + { 99,9370 }, { 100,9370 }, { 101,9370 }, { 102,9370 }, { 103,9370 }, + + { 104,9370 }, { 105,9370 }, { 106,9370 }, { 107,9370 }, { 108,11685 }, + { 109,9370 }, { 110,9370 }, { 111,11942 }, { 112,9370 }, { 113,9370 }, + { 114,9370 }, { 115,9370 }, { 116,9370 }, { 117,9370 }, { 118,9370 }, + { 119,9370 }, { 120,9370 }, { 121,9370 }, { 122,9370 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,9370 }, { 128,9370 }, + { 129,9370 }, { 130,9370 }, { 131,9370 }, { 132,9370 }, { 133,9370 }, + { 134,9370 }, { 135,9370 }, { 136,9370 }, { 137,9370 }, { 138,9370 }, + { 139,9370 }, { 140,9370 }, { 141,9370 }, { 142,9370 }, { 143,9370 }, + { 144,9370 }, { 145,9370 }, { 146,9370 }, { 147,9370 }, { 148,9370 }, + { 149,9370 }, { 150,9370 }, { 151,9370 }, { 152,9370 }, { 153,9370 }, + + { 154,9370 }, { 155,9370 }, { 156,9370 }, { 157,9370 }, { 158,9370 }, + { 159,9370 }, { 160,9370 }, { 161,9370 }, { 162,9370 }, { 163,9370 }, + { 164,9370 }, { 165,9370 }, { 166,9370 }, { 167,9370 }, { 168,9370 }, + { 169,9370 }, { 170,9370 }, { 171,9370 }, { 172,9370 }, { 173,9370 }, + { 174,9370 }, { 175,9370 }, { 176,9370 }, { 177,9370 }, { 178,9370 }, + { 179,9370 }, { 180,9370 }, { 181,9370 }, { 182,9370 }, { 183,9370 }, + { 184,9370 }, { 185,9370 }, { 186,9370 }, { 187,9370 }, { 188,9370 }, + { 189,9370 }, { 190,9370 }, { 191,9370 }, { 192,9370 }, { 193,9370 }, + { 194,9370 }, { 195,9370 }, { 196,9370 }, { 197,9370 }, { 198,9370 }, + { 199,9370 }, { 200,9370 }, { 201,9370 }, { 202,9370 }, { 203,9370 }, + + { 204,9370 }, { 205,9370 }, { 206,9370 }, { 207,9370 }, { 208,9370 }, + { 209,9370 }, { 210,9370 }, { 211,9370 }, { 212,9370 }, { 213,9370 }, + { 214,9370 }, { 215,9370 }, { 216,9370 }, { 217,9370 }, { 218,9370 }, + { 219,9370 }, { 220,9370 }, { 221,9370 }, { 222,9370 }, { 223,9370 }, + { 224,9370 }, { 225,9370 }, { 226,9370 }, { 227,9370 }, { 228,9370 }, + { 229,9370 }, { 230,9370 }, { 231,9370 }, { 232,9370 }, { 233,9370 }, + { 234,9370 }, { 235,9370 }, { 236,9370 }, { 237,9370 }, { 238,9370 }, + { 239,9370 }, { 240,9370 }, { 241,9370 }, { 242,9370 }, { 243,9370 }, + { 244,9370 }, { 245,9370 }, { 246,9370 }, { 247,9370 }, { 248,9370 }, + { 249,9370 }, { 250,9370 }, { 251,9370 }, { 252,9370 }, { 253,9370 }, + + { 254,9370 }, { 255,9370 }, { 0, 131 }, { 0,101236 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 48,9113 }, { 49,9113 }, { 50,9113 }, { 51,9113 }, + { 52,9113 }, { 53,9113 }, { 54,9113 }, { 55,9113 }, { 56,9113 }, + { 57,9113 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,9113 }, { 66,9113 }, + { 67,9113 }, { 68,9113 }, { 69,11942 }, { 70,9113 }, { 71,9113 }, + { 72,9113 }, { 73,9113 }, { 74,9113 }, { 75,9113 }, { 76,9113 }, + { 77,9113 }, { 78,9113 }, { 79,12199 }, { 80,9113 }, { 81,9113 }, + { 82,9113 }, { 83,9113 }, { 84,9113 }, { 85,9113 }, { 86,9113 }, + { 87,9113 }, { 88,9113 }, { 89,9113 }, { 90,9113 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,9113 }, { 0, 0 }, + + { 97,9113 }, { 98,9113 }, { 99,9113 }, { 100,9113 }, { 101,11942 }, + { 102,9113 }, { 103,9113 }, { 104,9113 }, { 105,9113 }, { 106,9113 }, + { 107,9113 }, { 108,9113 }, { 109,9113 }, { 110,9113 }, { 111,12199 }, + { 112,9113 }, { 113,9113 }, { 114,9113 }, { 115,9113 }, { 116,9113 }, + { 117,9113 }, { 118,9113 }, { 119,9113 }, { 120,9113 }, { 121,9113 }, + { 122,9113 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,9113 }, { 128,9113 }, { 129,9113 }, { 130,9113 }, { 131,9113 }, + { 132,9113 }, { 133,9113 }, { 134,9113 }, { 135,9113 }, { 136,9113 }, + { 137,9113 }, { 138,9113 }, { 139,9113 }, { 140,9113 }, { 141,9113 }, + { 142,9113 }, { 143,9113 }, { 144,9113 }, { 145,9113 }, { 146,9113 }, + + { 147,9113 }, { 148,9113 }, { 149,9113 }, { 150,9113 }, { 151,9113 }, + { 152,9113 }, { 153,9113 }, { 154,9113 }, { 155,9113 }, { 156,9113 }, + { 157,9113 }, { 158,9113 }, { 159,9113 }, { 160,9113 }, { 161,9113 }, + { 162,9113 }, { 163,9113 }, { 164,9113 }, { 165,9113 }, { 166,9113 }, + { 167,9113 }, { 168,9113 }, { 169,9113 }, { 170,9113 }, { 171,9113 }, + { 172,9113 }, { 173,9113 }, { 174,9113 }, { 175,9113 }, { 176,9113 }, + { 177,9113 }, { 178,9113 }, { 179,9113 }, { 180,9113 }, { 181,9113 }, + { 182,9113 }, { 183,9113 }, { 184,9113 }, { 185,9113 }, { 186,9113 }, + { 187,9113 }, { 188,9113 }, { 189,9113 }, { 190,9113 }, { 191,9113 }, + { 192,9113 }, { 193,9113 }, { 194,9113 }, { 195,9113 }, { 196,9113 }, + + { 197,9113 }, { 198,9113 }, { 199,9113 }, { 200,9113 }, { 201,9113 }, + { 202,9113 }, { 203,9113 }, { 204,9113 }, { 205,9113 }, { 206,9113 }, + { 207,9113 }, { 208,9113 }, { 209,9113 }, { 210,9113 }, { 211,9113 }, + { 212,9113 }, { 213,9113 }, { 214,9113 }, { 215,9113 }, { 216,9113 }, + { 217,9113 }, { 218,9113 }, { 219,9113 }, { 220,9113 }, { 221,9113 }, + { 222,9113 }, { 223,9113 }, { 224,9113 }, { 225,9113 }, { 226,9113 }, + { 227,9113 }, { 228,9113 }, { 229,9113 }, { 230,9113 }, { 231,9113 }, + { 232,9113 }, { 233,9113 }, { 234,9113 }, { 235,9113 }, { 236,9113 }, + { 237,9113 }, { 238,9113 }, { 239,9113 }, { 240,9113 }, { 241,9113 }, + { 242,9113 }, { 243,9113 }, { 244,9113 }, { 245,9113 }, { 246,9113 }, + + { 247,9113 }, { 248,9113 }, { 249,9113 }, { 250,9113 }, { 251,9113 }, + { 252,9113 }, { 253,9113 }, { 254,9113 }, { 255,9113 }, { 0, 131 }, + { 0,100979 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,8856 }, { 49,8856 }, + { 50,8856 }, { 51,8856 }, { 52,8856 }, { 53,8856 }, { 54,8856 }, + { 55,8856 }, { 56,8856 }, { 57,8856 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,8856 }, { 66,8856 }, { 67,12199 }, { 68,8856 }, { 69,8856 }, + { 70,8856 }, { 71,8856 }, { 72,8856 }, { 73,8856 }, { 74,8856 }, + { 75,8856 }, { 76,12456 }, { 77,12713 }, { 78,12970 }, { 79,8856 }, + { 80,8856 }, { 81,8856 }, { 82,8856 }, { 83,8856 }, { 84,8856 }, + { 85,8856 }, { 86,13227 }, { 87,8856 }, { 88,13484 }, { 89,8856 }, + + { 90,8856 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,8856 }, { 0, 0 }, { 97,8856 }, { 98,8856 }, { 99,12199 }, + { 100,8856 }, { 101,8856 }, { 102,8856 }, { 103,8856 }, { 104,8856 }, + { 105,8856 }, { 106,8856 }, { 107,8856 }, { 108,12456 }, { 109,12713 }, + { 110,12970 }, { 111,8856 }, { 112,8856 }, { 113,8856 }, { 114,8856 }, + { 115,8856 }, { 116,8856 }, { 117,8856 }, { 118,13227 }, { 119,8856 }, + { 120,13484 }, { 121,8856 }, { 122,8856 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,8856 }, { 128,8856 }, { 129,8856 }, + { 130,8856 }, { 131,8856 }, { 132,8856 }, { 133,8856 }, { 134,8856 }, + { 135,8856 }, { 136,8856 }, { 137,8856 }, { 138,8856 }, { 139,8856 }, + + { 140,8856 }, { 141,8856 }, { 142,8856 }, { 143,8856 }, { 144,8856 }, + { 145,8856 }, { 146,8856 }, { 147,8856 }, { 148,8856 }, { 149,8856 }, + { 150,8856 }, { 151,8856 }, { 152,8856 }, { 153,8856 }, { 154,8856 }, + { 155,8856 }, { 156,8856 }, { 157,8856 }, { 158,8856 }, { 159,8856 }, + { 160,8856 }, { 161,8856 }, { 162,8856 }, { 163,8856 }, { 164,8856 }, + { 165,8856 }, { 166,8856 }, { 167,8856 }, { 168,8856 }, { 169,8856 }, + { 170,8856 }, { 171,8856 }, { 172,8856 }, { 173,8856 }, { 174,8856 }, + { 175,8856 }, { 176,8856 }, { 177,8856 }, { 178,8856 }, { 179,8856 }, + { 180,8856 }, { 181,8856 }, { 182,8856 }, { 183,8856 }, { 184,8856 }, + { 185,8856 }, { 186,8856 }, { 187,8856 }, { 188,8856 }, { 189,8856 }, + + { 190,8856 }, { 191,8856 }, { 192,8856 }, { 193,8856 }, { 194,8856 }, + { 195,8856 }, { 196,8856 }, { 197,8856 }, { 198,8856 }, { 199,8856 }, + { 200,8856 }, { 201,8856 }, { 202,8856 }, { 203,8856 }, { 204,8856 }, + { 205,8856 }, { 206,8856 }, { 207,8856 }, { 208,8856 }, { 209,8856 }, + { 210,8856 }, { 211,8856 }, { 212,8856 }, { 213,8856 }, { 214,8856 }, + { 215,8856 }, { 216,8856 }, { 217,8856 }, { 218,8856 }, { 219,8856 }, + { 220,8856 }, { 221,8856 }, { 222,8856 }, { 223,8856 }, { 224,8856 }, + { 225,8856 }, { 226,8856 }, { 227,8856 }, { 228,8856 }, { 229,8856 }, + { 230,8856 }, { 231,8856 }, { 232,8856 }, { 233,8856 }, { 234,8856 }, + { 235,8856 }, { 236,8856 }, { 237,8856 }, { 238,8856 }, { 239,8856 }, + + { 240,8856 }, { 241,8856 }, { 242,8856 }, { 243,8856 }, { 244,8856 }, + { 245,8856 }, { 246,8856 }, { 247,8856 }, { 248,8856 }, { 249,8856 }, + { 250,8856 }, { 251,8856 }, { 252,8856 }, { 253,8856 }, { 254,8856 }, + { 255,8856 }, { 0, 131 }, { 0,100722 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,8599 }, { 49,8599 }, { 50,8599 }, { 51,8599 }, { 52,8599 }, + { 53,8599 }, { 54,8599 }, { 55,8599 }, { 56,8599 }, { 57,8599 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,8599 }, { 66,8599 }, { 67,8599 }, + { 68,8599 }, { 69,8599 }, { 70,8599 }, { 71,8599 }, { 72,8599 }, + { 73,13484 }, { 74,8599 }, { 75,8599 }, { 76,8599 }, { 77,8599 }, + { 78,8599 }, { 79,13741 }, { 80,8599 }, { 81,8599 }, { 82,8599 }, + + { 83,8599 }, { 84,8599 }, { 85,13998 }, { 86,8599 }, { 87,8599 }, + { 88,8599 }, { 89,8599 }, { 90,8599 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,8599 }, { 0, 0 }, { 97,8599 }, + { 98,8599 }, { 99,8599 }, { 100,8599 }, { 101,8599 }, { 102,8599 }, + { 103,8599 }, { 104,8599 }, { 105,13484 }, { 106,8599 }, { 107,8599 }, + { 108,8599 }, { 109,8599 }, { 110,8599 }, { 111,13741 }, { 112,8599 }, + { 113,8599 }, { 114,8599 }, { 115,8599 }, { 116,8599 }, { 117,13998 }, + { 118,8599 }, { 119,8599 }, { 120,8599 }, { 121,8599 }, { 122,8599 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,8599 }, + { 128,8599 }, { 129,8599 }, { 130,8599 }, { 131,8599 }, { 132,8599 }, + + { 133,8599 }, { 134,8599 }, { 135,8599 }, { 136,8599 }, { 137,8599 }, + { 138,8599 }, { 139,8599 }, { 140,8599 }, { 141,8599 }, { 142,8599 }, + { 143,8599 }, { 144,8599 }, { 145,8599 }, { 146,8599 }, { 147,8599 }, + { 148,8599 }, { 149,8599 }, { 150,8599 }, { 151,8599 }, { 152,8599 }, + { 153,8599 }, { 154,8599 }, { 155,8599 }, { 156,8599 }, { 157,8599 }, + { 158,8599 }, { 159,8599 }, { 160,8599 }, { 161,8599 }, { 162,8599 }, + { 163,8599 }, { 164,8599 }, { 165,8599 }, { 166,8599 }, { 167,8599 }, + { 168,8599 }, { 169,8599 }, { 170,8599 }, { 171,8599 }, { 172,8599 }, + { 173,8599 }, { 174,8599 }, { 175,8599 }, { 176,8599 }, { 177,8599 }, + { 178,8599 }, { 179,8599 }, { 180,8599 }, { 181,8599 }, { 182,8599 }, + + { 183,8599 }, { 184,8599 }, { 185,8599 }, { 186,8599 }, { 187,8599 }, + { 188,8599 }, { 189,8599 }, { 190,8599 }, { 191,8599 }, { 192,8599 }, + { 193,8599 }, { 194,8599 }, { 195,8599 }, { 196,8599 }, { 197,8599 }, + { 198,8599 }, { 199,8599 }, { 200,8599 }, { 201,8599 }, { 202,8599 }, + { 203,8599 }, { 204,8599 }, { 205,8599 }, { 206,8599 }, { 207,8599 }, + { 208,8599 }, { 209,8599 }, { 210,8599 }, { 211,8599 }, { 212,8599 }, + { 213,8599 }, { 214,8599 }, { 215,8599 }, { 216,8599 }, { 217,8599 }, + { 218,8599 }, { 219,8599 }, { 220,8599 }, { 221,8599 }, { 222,8599 }, + { 223,8599 }, { 224,8599 }, { 225,8599 }, { 226,8599 }, { 227,8599 }, + { 228,8599 }, { 229,8599 }, { 230,8599 }, { 231,8599 }, { 232,8599 }, + + { 233,8599 }, { 234,8599 }, { 235,8599 }, { 236,8599 }, { 237,8599 }, + { 238,8599 }, { 239,8599 }, { 240,8599 }, { 241,8599 }, { 242,8599 }, + { 243,8599 }, { 244,8599 }, { 245,8599 }, { 246,8599 }, { 247,8599 }, + { 248,8599 }, { 249,8599 }, { 250,8599 }, { 251,8599 }, { 252,8599 }, + { 253,8599 }, { 254,8599 }, { 255,8599 }, { 0, 131 }, { 0,100465 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,8342 }, { 49,8342 }, { 50,8342 }, + { 51,8342 }, { 52,8342 }, { 53,8342 }, { 54,8342 }, { 55,8342 }, + { 56,8342 }, { 57,8342 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,8342 }, + { 66,8342 }, { 67,8342 }, { 68,8342 }, { 69,8342 }, { 70,8342 }, + { 71,8342 }, { 72,8342 }, { 73,8342 }, { 74,8342 }, { 75,8342 }, + + { 76,13998 }, { 77,8342 }, { 78,8342 }, { 79,14255 }, { 80,8342 }, + { 81,8342 }, { 82,8342 }, { 83,8342 }, { 84,8342 }, { 85,8342 }, + { 86,8342 }, { 87,8342 }, { 88,8342 }, { 89,8342 }, { 90,8342 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,8342 }, + { 0, 0 }, { 97,8342 }, { 98,8342 }, { 99,8342 }, { 100,8342 }, + { 101,8342 }, { 102,8342 }, { 103,8342 }, { 104,8342 }, { 105,8342 }, + { 106,8342 }, { 107,8342 }, { 108,13998 }, { 109,8342 }, { 110,8342 }, + { 111,14255 }, { 112,8342 }, { 113,8342 }, { 114,8342 }, { 115,8342 }, + { 116,8342 }, { 117,8342 }, { 118,8342 }, { 119,8342 }, { 120,8342 }, + { 121,8342 }, { 122,8342 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 127,8342 }, { 128,8342 }, { 129,8342 }, { 130,8342 }, + { 131,8342 }, { 132,8342 }, { 133,8342 }, { 134,8342 }, { 135,8342 }, + { 136,8342 }, { 137,8342 }, { 138,8342 }, { 139,8342 }, { 140,8342 }, + { 141,8342 }, { 142,8342 }, { 143,8342 }, { 144,8342 }, { 145,8342 }, + { 146,8342 }, { 147,8342 }, { 148,8342 }, { 149,8342 }, { 150,8342 }, + { 151,8342 }, { 152,8342 }, { 153,8342 }, { 154,8342 }, { 155,8342 }, + { 156,8342 }, { 157,8342 }, { 158,8342 }, { 159,8342 }, { 160,8342 }, + { 161,8342 }, { 162,8342 }, { 163,8342 }, { 164,8342 }, { 165,8342 }, + { 166,8342 }, { 167,8342 }, { 168,8342 }, { 169,8342 }, { 170,8342 }, + { 171,8342 }, { 172,8342 }, { 173,8342 }, { 174,8342 }, { 175,8342 }, + + { 176,8342 }, { 177,8342 }, { 178,8342 }, { 179,8342 }, { 180,8342 }, + { 181,8342 }, { 182,8342 }, { 183,8342 }, { 184,8342 }, { 185,8342 }, + { 186,8342 }, { 187,8342 }, { 188,8342 }, { 189,8342 }, { 190,8342 }, + { 191,8342 }, { 192,8342 }, { 193,8342 }, { 194,8342 }, { 195,8342 }, + { 196,8342 }, { 197,8342 }, { 198,8342 }, { 199,8342 }, { 200,8342 }, + { 201,8342 }, { 202,8342 }, { 203,8342 }, { 204,8342 }, { 205,8342 }, + { 206,8342 }, { 207,8342 }, { 208,8342 }, { 209,8342 }, { 210,8342 }, + { 211,8342 }, { 212,8342 }, { 213,8342 }, { 214,8342 }, { 215,8342 }, + { 216,8342 }, { 217,8342 }, { 218,8342 }, { 219,8342 }, { 220,8342 }, + { 221,8342 }, { 222,8342 }, { 223,8342 }, { 224,8342 }, { 225,8342 }, + + { 226,8342 }, { 227,8342 }, { 228,8342 }, { 229,8342 }, { 230,8342 }, + { 231,8342 }, { 232,8342 }, { 233,8342 }, { 234,8342 }, { 235,8342 }, + { 236,8342 }, { 237,8342 }, { 238,8342 }, { 239,8342 }, { 240,8342 }, + { 241,8342 }, { 242,8342 }, { 243,8342 }, { 244,8342 }, { 245,8342 }, + { 246,8342 }, { 247,8342 }, { 248,8342 }, { 249,8342 }, { 250,8342 }, + { 251,8342 }, { 252,8342 }, { 253,8342 }, { 254,8342 }, { 255,8342 }, + { 0, 131 }, { 0,100208 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,8085 }, + { 49,8085 }, { 50,8085 }, { 51,8085 }, { 52,8085 }, { 53,8085 }, + { 54,8085 }, { 55,8085 }, { 56,8085 }, { 57,8085 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,8085 }, { 66,8085 }, { 67,8085 }, { 68,8085 }, + + { 69,8085 }, { 70,8085 }, { 71,8085 }, { 72,8085 }, { 73,8085 }, + { 74,8085 }, { 75,8085 }, { 76,8085 }, { 77,8085 }, { 78,8085 }, + { 79,8085 }, { 80,8085 }, { 81,8085 }, { 82,8085 }, { 83,8085 }, + { 84,8085 }, { 85,8085 }, { 86,8085 }, { 87,8085 }, { 88,8085 }, + { 89,8085 }, { 90,8085 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,8085 }, { 0, 0 }, { 97,8085 }, { 98,8085 }, + { 99,8085 }, { 100,8085 }, { 101,8085 }, { 102,8085 }, { 103,8085 }, + { 104,8085 }, { 105,8085 }, { 106,8085 }, { 107,8085 }, { 108,8085 }, + { 109,8085 }, { 110,8085 }, { 111,8085 }, { 112,8085 }, { 113,8085 }, + { 114,8085 }, { 115,8085 }, { 116,8085 }, { 117,8085 }, { 118,8085 }, + + { 119,8085 }, { 120,8085 }, { 121,8085 }, { 122,8085 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,8085 }, { 128,8085 }, + { 129,8085 }, { 130,8085 }, { 131,8085 }, { 132,8085 }, { 133,8085 }, + { 134,8085 }, { 135,8085 }, { 136,8085 }, { 137,8085 }, { 138,8085 }, + { 139,8085 }, { 140,8085 }, { 141,8085 }, { 142,8085 }, { 143,8085 }, + { 144,8085 }, { 145,8085 }, { 146,8085 }, { 147,8085 }, { 148,8085 }, + { 149,8085 }, { 150,8085 }, { 151,8085 }, { 152,8085 }, { 153,8085 }, + { 154,8085 }, { 155,8085 }, { 156,8085 }, { 157,8085 }, { 158,8085 }, + { 159,8085 }, { 160,8085 }, { 161,8085 }, { 162,8085 }, { 163,8085 }, + { 164,8085 }, { 165,8085 }, { 166,8085 }, { 167,8085 }, { 168,8085 }, + + { 169,8085 }, { 170,8085 }, { 171,8085 }, { 172,8085 }, { 173,8085 }, + { 174,8085 }, { 175,8085 }, { 176,8085 }, { 177,8085 }, { 178,8085 }, + { 179,8085 }, { 180,8085 }, { 181,8085 }, { 182,8085 }, { 183,8085 }, + { 184,8085 }, { 185,8085 }, { 186,8085 }, { 187,8085 }, { 188,8085 }, + { 189,8085 }, { 190,8085 }, { 191,8085 }, { 192,8085 }, { 193,8085 }, + { 194,8085 }, { 195,8085 }, { 196,8085 }, { 197,8085 }, { 198,8085 }, + { 199,8085 }, { 200,8085 }, { 201,8085 }, { 202,8085 }, { 203,8085 }, + { 204,8085 }, { 205,8085 }, { 206,8085 }, { 207,8085 }, { 208,8085 }, + { 209,8085 }, { 210,8085 }, { 211,8085 }, { 212,8085 }, { 213,8085 }, + { 214,8085 }, { 215,8085 }, { 216,8085 }, { 217,8085 }, { 218,8085 }, + + { 219,8085 }, { 220,8085 }, { 221,8085 }, { 222,8085 }, { 223,8085 }, + { 224,8085 }, { 225,8085 }, { 226,8085 }, { 227,8085 }, { 228,8085 }, + { 229,8085 }, { 230,8085 }, { 231,8085 }, { 232,8085 }, { 233,8085 }, + { 234,8085 }, { 235,8085 }, { 236,8085 }, { 237,8085 }, { 238,8085 }, + { 239,8085 }, { 240,8085 }, { 241,8085 }, { 242,8085 }, { 243,8085 }, + { 244,8085 }, { 245,8085 }, { 246,8085 }, { 247,8085 }, { 248,8085 }, + { 249,8085 }, { 250,8085 }, { 251,8085 }, { 252,8085 }, { 253,8085 }, + { 254,8085 }, { 255,8085 }, { 0, 131 }, { 0,99951 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,7828 }, { 49,7828 }, { 50,7828 }, { 51,7828 }, + { 52,7828 }, { 53,7828 }, { 54,7828 }, { 55,7828 }, { 56,7828 }, + { 57,7828 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,7828 }, { 66,7828 }, + { 67,7828 }, { 68,7828 }, { 69,7828 }, { 70,13998 }, { 71,7828 }, + { 72,7828 }, { 73,7828 }, { 74,7828 }, { 75,7828 }, { 76,7828 }, + { 77,14255 }, { 78,14512 }, { 79,7828 }, { 80,7828 }, { 81,7828 }, + { 82,7828 }, { 83,14769 }, { 84,7828 }, { 85,7828 }, { 86,7828 }, + { 87,7828 }, { 88,7828 }, { 89,7828 }, { 90,7828 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,7828 }, { 0, 0 }, + { 97,7828 }, { 98,7828 }, { 99,7828 }, { 100,7828 }, { 101,7828 }, + { 102,13998 }, { 103,7828 }, { 104,7828 }, { 105,7828 }, { 106,7828 }, + { 107,7828 }, { 108,7828 }, { 109,14255 }, { 110,14512 }, { 111,7828 }, + + { 112,7828 }, { 113,7828 }, { 114,7828 }, { 115,14769 }, { 116,7828 }, + { 117,7828 }, { 118,7828 }, { 119,7828 }, { 120,7828 }, { 121,7828 }, + { 122,7828 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,7828 }, { 128,7828 }, { 129,7828 }, { 130,7828 }, { 131,7828 }, + { 132,7828 }, { 133,7828 }, { 134,7828 }, { 135,7828 }, { 136,7828 }, + { 137,7828 }, { 138,7828 }, { 139,7828 }, { 140,7828 }, { 141,7828 }, + { 142,7828 }, { 143,7828 }, { 144,7828 }, { 145,7828 }, { 146,7828 }, + { 147,7828 }, { 148,7828 }, { 149,7828 }, { 150,7828 }, { 151,7828 }, + { 152,7828 }, { 153,7828 }, { 154,7828 }, { 155,7828 }, { 156,7828 }, + { 157,7828 }, { 158,7828 }, { 159,7828 }, { 160,7828 }, { 161,7828 }, + + { 162,7828 }, { 163,7828 }, { 164,7828 }, { 165,7828 }, { 166,7828 }, + { 167,7828 }, { 168,7828 }, { 169,7828 }, { 170,7828 }, { 171,7828 }, + { 172,7828 }, { 173,7828 }, { 174,7828 }, { 175,7828 }, { 176,7828 }, + { 177,7828 }, { 178,7828 }, { 179,7828 }, { 180,7828 }, { 181,7828 }, + { 182,7828 }, { 183,7828 }, { 184,7828 }, { 185,7828 }, { 186,7828 }, + { 187,7828 }, { 188,7828 }, { 189,7828 }, { 190,7828 }, { 191,7828 }, + { 192,7828 }, { 193,7828 }, { 194,7828 }, { 195,7828 }, { 196,7828 }, + { 197,7828 }, { 198,7828 }, { 199,7828 }, { 200,7828 }, { 201,7828 }, + { 202,7828 }, { 203,7828 }, { 204,7828 }, { 205,7828 }, { 206,7828 }, + { 207,7828 }, { 208,7828 }, { 209,7828 }, { 210,7828 }, { 211,7828 }, + + { 212,7828 }, { 213,7828 }, { 214,7828 }, { 215,7828 }, { 216,7828 }, + { 217,7828 }, { 218,7828 }, { 219,7828 }, { 220,7828 }, { 221,7828 }, + { 222,7828 }, { 223,7828 }, { 224,7828 }, { 225,7828 }, { 226,7828 }, + { 227,7828 }, { 228,7828 }, { 229,7828 }, { 230,7828 }, { 231,7828 }, + { 232,7828 }, { 233,7828 }, { 234,7828 }, { 235,7828 }, { 236,7828 }, + { 237,7828 }, { 238,7828 }, { 239,7828 }, { 240,7828 }, { 241,7828 }, + { 242,7828 }, { 243,7828 }, { 244,7828 }, { 245,7828 }, { 246,7828 }, + { 247,7828 }, { 248,7828 }, { 249,7828 }, { 250,7828 }, { 251,7828 }, + { 252,7828 }, { 253,7828 }, { 254,7828 }, { 255,7828 }, { 0, 131 }, + { 0,99694 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,7571 }, { 49,7571 }, + { 50,7571 }, { 51,7571 }, { 52,7571 }, { 53,7571 }, { 54,7571 }, + + { 55,7571 }, { 56,7571 }, { 57,7571 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,7571 }, { 66,7571 }, { 67,7571 }, { 68,7571 }, { 69,7571 }, + { 70,7571 }, { 71,7571 }, { 72,7571 }, { 73,14769 }, { 74,7571 }, + { 75,7571 }, { 76,7571 }, { 77,7571 }, { 78,7571 }, { 79,7571 }, + { 80,7571 }, { 81,7571 }, { 82,7571 }, { 83,7571 }, { 84,7571 }, + { 85,7571 }, { 86,7571 }, { 87,7571 }, { 88,7571 }, { 89,7571 }, + { 90,7571 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,7571 }, { 0, 0 }, { 97,7571 }, { 98,7571 }, { 99,7571 }, + { 100,7571 }, { 101,7571 }, { 102,7571 }, { 103,7571 }, { 104,7571 }, + + { 105,14769 }, { 106,7571 }, { 107,7571 }, { 108,7571 }, { 109,7571 }, + { 110,7571 }, { 111,7571 }, { 112,7571 }, { 113,7571 }, { 114,7571 }, + { 115,7571 }, { 116,7571 }, { 117,7571 }, { 118,7571 }, { 119,7571 }, + { 120,7571 }, { 121,7571 }, { 122,7571 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,7571 }, { 128,7571 }, { 129,7571 }, + { 130,7571 }, { 131,7571 }, { 132,7571 }, { 133,7571 }, { 134,7571 }, + { 135,7571 }, { 136,7571 }, { 137,7571 }, { 138,7571 }, { 139,7571 }, + { 140,7571 }, { 141,7571 }, { 142,7571 }, { 143,7571 }, { 144,7571 }, + { 145,7571 }, { 146,7571 }, { 147,7571 }, { 148,7571 }, { 149,7571 }, + { 150,7571 }, { 151,7571 }, { 152,7571 }, { 153,7571 }, { 154,7571 }, + + { 155,7571 }, { 156,7571 }, { 157,7571 }, { 158,7571 }, { 159,7571 }, + { 160,7571 }, { 161,7571 }, { 162,7571 }, { 163,7571 }, { 164,7571 }, + { 165,7571 }, { 166,7571 }, { 167,7571 }, { 168,7571 }, { 169,7571 }, + { 170,7571 }, { 171,7571 }, { 172,7571 }, { 173,7571 }, { 174,7571 }, + { 175,7571 }, { 176,7571 }, { 177,7571 }, { 178,7571 }, { 179,7571 }, + { 180,7571 }, { 181,7571 }, { 182,7571 }, { 183,7571 }, { 184,7571 }, + { 185,7571 }, { 186,7571 }, { 187,7571 }, { 188,7571 }, { 189,7571 }, + { 190,7571 }, { 191,7571 }, { 192,7571 }, { 193,7571 }, { 194,7571 }, + { 195,7571 }, { 196,7571 }, { 197,7571 }, { 198,7571 }, { 199,7571 }, + { 200,7571 }, { 201,7571 }, { 202,7571 }, { 203,7571 }, { 204,7571 }, + + { 205,7571 }, { 206,7571 }, { 207,7571 }, { 208,7571 }, { 209,7571 }, + { 210,7571 }, { 211,7571 }, { 212,7571 }, { 213,7571 }, { 214,7571 }, + { 215,7571 }, { 216,7571 }, { 217,7571 }, { 218,7571 }, { 219,7571 }, + { 220,7571 }, { 221,7571 }, { 222,7571 }, { 223,7571 }, { 224,7571 }, + { 225,7571 }, { 226,7571 }, { 227,7571 }, { 228,7571 }, { 229,7571 }, + { 230,7571 }, { 231,7571 }, { 232,7571 }, { 233,7571 }, { 234,7571 }, + { 235,7571 }, { 236,7571 }, { 237,7571 }, { 238,7571 }, { 239,7571 }, + { 240,7571 }, { 241,7571 }, { 242,7571 }, { 243,7571 }, { 244,7571 }, + { 245,7571 }, { 246,7571 }, { 247,7571 }, { 248,7571 }, { 249,7571 }, + { 250,7571 }, { 251,7571 }, { 252,7571 }, { 253,7571 }, { 254,7571 }, + + { 255,7571 }, { 0, 131 }, { 0,99437 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 48,7314 }, { 49,7314 }, { 50,7314 }, { 51,7314 }, { 52,7314 }, + { 53,7314 }, { 54,7314 }, { 55,7314 }, { 56,7314 }, { 57,7314 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,14769 }, { 66,7314 }, { 67,7314 }, + { 68,7314 }, { 69,15026 }, { 70,7314 }, { 71,7314 }, { 72,7314 }, + { 73,7314 }, { 74,7314 }, { 75,7314 }, { 76,7314 }, { 77,7314 }, + { 78,7314 }, { 79,7314 }, { 80,7314 }, { 81,7314 }, { 82,7314 }, + { 83,7314 }, { 84,7314 }, { 85,7314 }, { 86,7314 }, { 87,7314 }, + { 88,7314 }, { 89,7314 }, { 90,7314 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,7314 }, { 0, 0 }, { 97,14769 }, + + { 98,7314 }, { 99,7314 }, { 100,7314 }, { 101,15026 }, { 102,7314 }, + { 103,7314 }, { 104,7314 }, { 105,7314 }, { 106,7314 }, { 107,7314 }, + { 108,7314 }, { 109,7314 }, { 110,7314 }, { 111,7314 }, { 112,7314 }, + { 113,7314 }, { 114,7314 }, { 115,7314 }, { 116,7314 }, { 117,7314 }, + { 118,7314 }, { 119,7314 }, { 120,7314 }, { 121,7314 }, { 122,7314 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,7314 }, + { 128,7314 }, { 129,7314 }, { 130,7314 }, { 131,7314 }, { 132,7314 }, + { 133,7314 }, { 134,7314 }, { 135,7314 }, { 136,7314 }, { 137,7314 }, + { 138,7314 }, { 139,7314 }, { 140,7314 }, { 141,7314 }, { 142,7314 }, + { 143,7314 }, { 144,7314 }, { 145,7314 }, { 146,7314 }, { 147,7314 }, + + { 148,7314 }, { 149,7314 }, { 150,7314 }, { 151,7314 }, { 152,7314 }, + { 153,7314 }, { 154,7314 }, { 155,7314 }, { 156,7314 }, { 157,7314 }, + { 158,7314 }, { 159,7314 }, { 160,7314 }, { 161,7314 }, { 162,7314 }, + { 163,7314 }, { 164,7314 }, { 165,7314 }, { 166,7314 }, { 167,7314 }, + { 168,7314 }, { 169,7314 }, { 170,7314 }, { 171,7314 }, { 172,7314 }, + { 173,7314 }, { 174,7314 }, { 175,7314 }, { 176,7314 }, { 177,7314 }, + { 178,7314 }, { 179,7314 }, { 180,7314 }, { 181,7314 }, { 182,7314 }, + { 183,7314 }, { 184,7314 }, { 185,7314 }, { 186,7314 }, { 187,7314 }, + { 188,7314 }, { 189,7314 }, { 190,7314 }, { 191,7314 }, { 192,7314 }, + { 193,7314 }, { 194,7314 }, { 195,7314 }, { 196,7314 }, { 197,7314 }, + + { 198,7314 }, { 199,7314 }, { 200,7314 }, { 201,7314 }, { 202,7314 }, + { 203,7314 }, { 204,7314 }, { 205,7314 }, { 206,7314 }, { 207,7314 }, + { 208,7314 }, { 209,7314 }, { 210,7314 }, { 211,7314 }, { 212,7314 }, + { 213,7314 }, { 214,7314 }, { 215,7314 }, { 216,7314 }, { 217,7314 }, + { 218,7314 }, { 219,7314 }, { 220,7314 }, { 221,7314 }, { 222,7314 }, + { 223,7314 }, { 224,7314 }, { 225,7314 }, { 226,7314 }, { 227,7314 }, + { 228,7314 }, { 229,7314 }, { 230,7314 }, { 231,7314 }, { 232,7314 }, + { 233,7314 }, { 234,7314 }, { 235,7314 }, { 236,7314 }, { 237,7314 }, + { 238,7314 }, { 239,7314 }, { 240,7314 }, { 241,7314 }, { 242,7314 }, + { 243,7314 }, { 244,7314 }, { 245,7314 }, { 246,7314 }, { 247,7314 }, + + { 248,7314 }, { 249,7314 }, { 250,7314 }, { 251,7314 }, { 252,7314 }, + { 253,7314 }, { 254,7314 }, { 255,7314 }, { 0, 131 }, { 0,99180 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,7057 }, { 49,7057 }, { 50,7057 }, + { 51,7057 }, { 52,7057 }, { 53,7057 }, { 54,7057 }, { 55,7057 }, + { 56,7057 }, { 57,7057 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,7057 }, + { 66,7057 }, { 67,7057 }, { 68,7057 }, { 69,7057 }, { 70,7057 }, + { 71,7057 }, { 72,7057 }, { 73,7057 }, { 74,7057 }, { 75,7057 }, + { 76,7057 }, { 77,7057 }, { 78,7057 }, { 79,7057 }, { 80,7057 }, + { 81,7057 }, { 82,15026 }, { 83,7057 }, { 84,7057 }, { 85,7057 }, + { 86,7057 }, { 87,7057 }, { 88,7057 }, { 89,7057 }, { 90,7057 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,7057 }, + { 0, 0 }, { 97,7057 }, { 98,7057 }, { 99,7057 }, { 100,7057 }, + { 101,7057 }, { 102,7057 }, { 103,7057 }, { 104,7057 }, { 105,7057 }, + { 106,7057 }, { 107,7057 }, { 108,7057 }, { 109,7057 }, { 110,7057 }, + { 111,7057 }, { 112,7057 }, { 113,7057 }, { 114,15026 }, { 115,7057 }, + { 116,7057 }, { 117,7057 }, { 118,7057 }, { 119,7057 }, { 120,7057 }, + { 121,7057 }, { 122,7057 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,7057 }, { 128,7057 }, { 129,7057 }, { 130,7057 }, + { 131,7057 }, { 132,7057 }, { 133,7057 }, { 134,7057 }, { 135,7057 }, + { 136,7057 }, { 137,7057 }, { 138,7057 }, { 139,7057 }, { 140,7057 }, + + { 141,7057 }, { 142,7057 }, { 143,7057 }, { 144,7057 }, { 145,7057 }, + { 146,7057 }, { 147,7057 }, { 148,7057 }, { 149,7057 }, { 150,7057 }, + { 151,7057 }, { 152,7057 }, { 153,7057 }, { 154,7057 }, { 155,7057 }, + { 156,7057 }, { 157,7057 }, { 158,7057 }, { 159,7057 }, { 160,7057 }, + { 161,7057 }, { 162,7057 }, { 163,7057 }, { 164,7057 }, { 165,7057 }, + { 166,7057 }, { 167,7057 }, { 168,7057 }, { 169,7057 }, { 170,7057 }, + { 171,7057 }, { 172,7057 }, { 173,7057 }, { 174,7057 }, { 175,7057 }, + { 176,7057 }, { 177,7057 }, { 178,7057 }, { 179,7057 }, { 180,7057 }, + { 181,7057 }, { 182,7057 }, { 183,7057 }, { 184,7057 }, { 185,7057 }, + { 186,7057 }, { 187,7057 }, { 188,7057 }, { 189,7057 }, { 190,7057 }, + + { 191,7057 }, { 192,7057 }, { 193,7057 }, { 194,7057 }, { 195,7057 }, + { 196,7057 }, { 197,7057 }, { 198,7057 }, { 199,7057 }, { 200,7057 }, + { 201,7057 }, { 202,7057 }, { 203,7057 }, { 204,7057 }, { 205,7057 }, + { 206,7057 }, { 207,7057 }, { 208,7057 }, { 209,7057 }, { 210,7057 }, + { 211,7057 }, { 212,7057 }, { 213,7057 }, { 214,7057 }, { 215,7057 }, + { 216,7057 }, { 217,7057 }, { 218,7057 }, { 219,7057 }, { 220,7057 }, + { 221,7057 }, { 222,7057 }, { 223,7057 }, { 224,7057 }, { 225,7057 }, + { 226,7057 }, { 227,7057 }, { 228,7057 }, { 229,7057 }, { 230,7057 }, + { 231,7057 }, { 232,7057 }, { 233,7057 }, { 234,7057 }, { 235,7057 }, + { 236,7057 }, { 237,7057 }, { 238,7057 }, { 239,7057 }, { 240,7057 }, + + { 241,7057 }, { 242,7057 }, { 243,7057 }, { 244,7057 }, { 245,7057 }, + { 246,7057 }, { 247,7057 }, { 248,7057 }, { 249,7057 }, { 250,7057 }, + { 251,7057 }, { 252,7057 }, { 253,7057 }, { 254,7057 }, { 255,7057 }, + { 0, 131 }, { 0,98923 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,6800 }, + { 49,6800 }, { 50,6800 }, { 51,6800 }, { 52,6800 }, { 53,6800 }, + { 54,6800 }, { 55,6800 }, { 56,6800 }, { 57,6800 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,6800 }, { 66,6800 }, { 67,6800 }, { 68,6800 }, + { 69,6800 }, { 70,6800 }, { 71,6800 }, { 72,6800 }, { 73,6800 }, + { 74,6800 }, { 75,6800 }, { 76,6800 }, { 77,6800 }, { 78,6800 }, + { 79,6800 }, { 80,6800 }, { 81,6800 }, { 82,15026 }, { 83,6800 }, + + { 84,6800 }, { 85,15283 }, { 86,6800 }, { 87,6800 }, { 88,6800 }, + { 89,6800 }, { 90,6800 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,6800 }, { 0, 0 }, { 97,6800 }, { 98,6800 }, + { 99,6800 }, { 100,6800 }, { 101,6800 }, { 102,6800 }, { 103,6800 }, + { 104,6800 }, { 105,6800 }, { 106,6800 }, { 107,6800 }, { 108,6800 }, + { 109,6800 }, { 110,6800 }, { 111,6800 }, { 112,6800 }, { 113,6800 }, + { 114,15026 }, { 115,6800 }, { 116,6800 }, { 117,15283 }, { 118,6800 }, + { 119,6800 }, { 120,6800 }, { 121,6800 }, { 122,6800 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,6800 }, { 128,6800 }, + { 129,6800 }, { 130,6800 }, { 131,6800 }, { 132,6800 }, { 133,6800 }, + + { 134,6800 }, { 135,6800 }, { 136,6800 }, { 137,6800 }, { 138,6800 }, + { 139,6800 }, { 140,6800 }, { 141,6800 }, { 142,6800 }, { 143,6800 }, + { 144,6800 }, { 145,6800 }, { 146,6800 }, { 147,6800 }, { 148,6800 }, + { 149,6800 }, { 150,6800 }, { 151,6800 }, { 152,6800 }, { 153,6800 }, + { 154,6800 }, { 155,6800 }, { 156,6800 }, { 157,6800 }, { 158,6800 }, + { 159,6800 }, { 160,6800 }, { 161,6800 }, { 162,6800 }, { 163,6800 }, + { 164,6800 }, { 165,6800 }, { 166,6800 }, { 167,6800 }, { 168,6800 }, + { 169,6800 }, { 170,6800 }, { 171,6800 }, { 172,6800 }, { 173,6800 }, + { 174,6800 }, { 175,6800 }, { 176,6800 }, { 177,6800 }, { 178,6800 }, + { 179,6800 }, { 180,6800 }, { 181,6800 }, { 182,6800 }, { 183,6800 }, + + { 184,6800 }, { 185,6800 }, { 186,6800 }, { 187,6800 }, { 188,6800 }, + { 189,6800 }, { 190,6800 }, { 191,6800 }, { 192,6800 }, { 193,6800 }, + { 194,6800 }, { 195,6800 }, { 196,6800 }, { 197,6800 }, { 198,6800 }, + { 199,6800 }, { 200,6800 }, { 201,6800 }, { 202,6800 }, { 203,6800 }, + { 204,6800 }, { 205,6800 }, { 206,6800 }, { 207,6800 }, { 208,6800 }, + { 209,6800 }, { 210,6800 }, { 211,6800 }, { 212,6800 }, { 213,6800 }, + { 214,6800 }, { 215,6800 }, { 216,6800 }, { 217,6800 }, { 218,6800 }, + { 219,6800 }, { 220,6800 }, { 221,6800 }, { 222,6800 }, { 223,6800 }, + { 224,6800 }, { 225,6800 }, { 226,6800 }, { 227,6800 }, { 228,6800 }, + { 229,6800 }, { 230,6800 }, { 231,6800 }, { 232,6800 }, { 233,6800 }, + + { 234,6800 }, { 235,6800 }, { 236,6800 }, { 237,6800 }, { 238,6800 }, + { 239,6800 }, { 240,6800 }, { 241,6800 }, { 242,6800 }, { 243,6800 }, + { 244,6800 }, { 245,6800 }, { 246,6800 }, { 247,6800 }, { 248,6800 }, + { 249,6800 }, { 250,6800 }, { 251,6800 }, { 252,6800 }, { 253,6800 }, + { 254,6800 }, { 255,6800 }, { 0, 131 }, { 0,98666 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,6543 }, { 49,6543 }, { 50,6543 }, { 51,6543 }, + { 52,6543 }, { 53,6543 }, { 54,6543 }, { 55,6543 }, { 56,6543 }, + { 57,6543 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,6543 }, { 66,6543 }, + { 67,6543 }, { 68,6543 }, { 69,15283 }, { 70,6543 }, { 71,6543 }, + { 72,6543 }, { 73,6543 }, { 74,6543 }, { 75,6543 }, { 76,6543 }, + + { 77,6543 }, { 78,6543 }, { 79,6543 }, { 80,6543 }, { 81,6543 }, + { 82,6543 }, { 83,6543 }, { 84,6543 }, { 85,6543 }, { 86,6543 }, + { 87,6543 }, { 88,6543 }, { 89,6543 }, { 90,6543 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,6543 }, { 0, 0 }, + { 97,6543 }, { 98,6543 }, { 99,6543 }, { 100,6543 }, { 101,15283 }, + { 102,6543 }, { 103,6543 }, { 104,6543 }, { 105,6543 }, { 106,6543 }, + { 107,6543 }, { 108,6543 }, { 109,6543 }, { 110,6543 }, { 111,6543 }, + { 112,6543 }, { 113,6543 }, { 114,6543 }, { 115,6543 }, { 116,6543 }, + { 117,6543 }, { 118,6543 }, { 119,6543 }, { 120,6543 }, { 121,6543 }, + { 122,6543 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 127,6543 }, { 128,6543 }, { 129,6543 }, { 130,6543 }, { 131,6543 }, + { 132,6543 }, { 133,6543 }, { 134,6543 }, { 135,6543 }, { 136,6543 }, + { 137,6543 }, { 138,6543 }, { 139,6543 }, { 140,6543 }, { 141,6543 }, + { 142,6543 }, { 143,6543 }, { 144,6543 }, { 145,6543 }, { 146,6543 }, + { 147,6543 }, { 148,6543 }, { 149,6543 }, { 150,6543 }, { 151,6543 }, + { 152,6543 }, { 153,6543 }, { 154,6543 }, { 155,6543 }, { 156,6543 }, + { 157,6543 }, { 158,6543 }, { 159,6543 }, { 160,6543 }, { 161,6543 }, + { 162,6543 }, { 163,6543 }, { 164,6543 }, { 165,6543 }, { 166,6543 }, + { 167,6543 }, { 168,6543 }, { 169,6543 }, { 170,6543 }, { 171,6543 }, + { 172,6543 }, { 173,6543 }, { 174,6543 }, { 175,6543 }, { 176,6543 }, + + { 177,6543 }, { 178,6543 }, { 179,6543 }, { 180,6543 }, { 181,6543 }, + { 182,6543 }, { 183,6543 }, { 184,6543 }, { 185,6543 }, { 186,6543 }, + { 187,6543 }, { 188,6543 }, { 189,6543 }, { 190,6543 }, { 191,6543 }, + { 192,6543 }, { 193,6543 }, { 194,6543 }, { 195,6543 }, { 196,6543 }, + { 197,6543 }, { 198,6543 }, { 199,6543 }, { 200,6543 }, { 201,6543 }, + { 202,6543 }, { 203,6543 }, { 204,6543 }, { 205,6543 }, { 206,6543 }, + { 207,6543 }, { 208,6543 }, { 209,6543 }, { 210,6543 }, { 211,6543 }, + { 212,6543 }, { 213,6543 }, { 214,6543 }, { 215,6543 }, { 216,6543 }, + { 217,6543 }, { 218,6543 }, { 219,6543 }, { 220,6543 }, { 221,6543 }, + { 222,6543 }, { 223,6543 }, { 224,6543 }, { 225,6543 }, { 226,6543 }, + + { 227,6543 }, { 228,6543 }, { 229,6543 }, { 230,6543 }, { 231,6543 }, + { 232,6543 }, { 233,6543 }, { 234,6543 }, { 235,6543 }, { 236,6543 }, + { 237,6543 }, { 238,6543 }, { 239,6543 }, { 240,6543 }, { 241,6543 }, + { 242,6543 }, { 243,6543 }, { 244,6543 }, { 245,6543 }, { 246,6543 }, + { 247,6543 }, { 248,6543 }, { 249,6543 }, { 250,6543 }, { 251,6543 }, + { 252,6543 }, { 253,6543 }, { 254,6543 }, { 255,6543 }, { 0, 131 }, + { 0,98409 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,6286 }, { 49,6286 }, + { 50,6286 }, { 51,6286 }, { 52,6286 }, { 53,6286 }, { 54,6286 }, + { 55,6286 }, { 56,6286 }, { 57,6286 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,6286 }, { 66,6286 }, { 67,6286 }, { 68,6286 }, { 69,6286 }, + + { 70,6286 }, { 71,6286 }, { 72,6286 }, { 73,6286 }, { 74,6286 }, + { 75,6286 }, { 76,6286 }, { 77,6286 }, { 78,6286 }, { 79,6286 }, + { 80,6286 }, { 81,6286 }, { 82,6286 }, { 83,6286 }, { 84,15283 }, + { 85,6286 }, { 86,6286 }, { 87,15540 }, { 88,6286 }, { 89,6286 }, + { 90,6286 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,6286 }, { 0, 0 }, { 97,6286 }, { 98,6286 }, { 99,6286 }, + { 100,6286 }, { 101,6286 }, { 102,6286 }, { 103,6286 }, { 104,6286 }, + { 105,6286 }, { 106,6286 }, { 107,6286 }, { 108,6286 }, { 109,6286 }, + { 110,6286 }, { 111,6286 }, { 112,6286 }, { 113,6286 }, { 114,6286 }, + { 115,6286 }, { 116,15283 }, { 117,6286 }, { 118,6286 }, { 119,15540 }, + + { 120,6286 }, { 121,6286 }, { 122,6286 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,6286 }, { 128,6286 }, { 129,6286 }, + { 130,6286 }, { 131,6286 }, { 132,6286 }, { 133,6286 }, { 134,6286 }, + { 135,6286 }, { 136,6286 }, { 137,6286 }, { 138,6286 }, { 139,6286 }, + { 140,6286 }, { 141,6286 }, { 142,6286 }, { 143,6286 }, { 144,6286 }, + { 145,6286 }, { 146,6286 }, { 147,6286 }, { 148,6286 }, { 149,6286 }, + { 150,6286 }, { 151,6286 }, { 152,6286 }, { 153,6286 }, { 154,6286 }, + { 155,6286 }, { 156,6286 }, { 157,6286 }, { 158,6286 }, { 159,6286 }, + { 160,6286 }, { 161,6286 }, { 162,6286 }, { 163,6286 }, { 164,6286 }, + { 165,6286 }, { 166,6286 }, { 167,6286 }, { 168,6286 }, { 169,6286 }, + + { 170,6286 }, { 171,6286 }, { 172,6286 }, { 173,6286 }, { 174,6286 }, + { 175,6286 }, { 176,6286 }, { 177,6286 }, { 178,6286 }, { 179,6286 }, + { 180,6286 }, { 181,6286 }, { 182,6286 }, { 183,6286 }, { 184,6286 }, + { 185,6286 }, { 186,6286 }, { 187,6286 }, { 188,6286 }, { 189,6286 }, + { 190,6286 }, { 191,6286 }, { 192,6286 }, { 193,6286 }, { 194,6286 }, + { 195,6286 }, { 196,6286 }, { 197,6286 }, { 198,6286 }, { 199,6286 }, + { 200,6286 }, { 201,6286 }, { 202,6286 }, { 203,6286 }, { 204,6286 }, + { 205,6286 }, { 206,6286 }, { 207,6286 }, { 208,6286 }, { 209,6286 }, + { 210,6286 }, { 211,6286 }, { 212,6286 }, { 213,6286 }, { 214,6286 }, + { 215,6286 }, { 216,6286 }, { 217,6286 }, { 218,6286 }, { 219,6286 }, + + { 220,6286 }, { 221,6286 }, { 222,6286 }, { 223,6286 }, { 224,6286 }, + { 225,6286 }, { 226,6286 }, { 227,6286 }, { 228,6286 }, { 229,6286 }, + { 230,6286 }, { 231,6286 }, { 232,6286 }, { 233,6286 }, { 234,6286 }, + { 235,6286 }, { 236,6286 }, { 237,6286 }, { 238,6286 }, { 239,6286 }, + { 240,6286 }, { 241,6286 }, { 242,6286 }, { 243,6286 }, { 244,6286 }, + { 245,6286 }, { 246,6286 }, { 247,6286 }, { 248,6286 }, { 249,6286 }, + { 250,6286 }, { 251,6286 }, { 252,6286 }, { 253,6286 }, { 254,6286 }, + { 255,6286 }, { 0, 131 }, { 0,98152 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,6029 }, { 49,6029 }, { 50,6029 }, { 51,6029 }, { 52,6029 }, + { 53,6029 }, { 54,6029 }, { 55,6029 }, { 56,6029 }, { 57,6029 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 65,6029 }, { 66,6029 }, { 67,6029 }, + { 68,6029 }, { 69,6029 }, { 70,6029 }, { 71,6029 }, { 72,15540 }, + { 73,6029 }, { 74,6029 }, { 75,6029 }, { 76,6029 }, { 77,6029 }, + { 78,6029 }, { 79,6029 }, { 80,6029 }, { 81,6029 }, { 82,15797 }, + { 83,6029 }, { 84,6029 }, { 85,6029 }, { 86,6029 }, { 87,6029 }, + { 88,6029 }, { 89,6029 }, { 90,6029 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,6029 }, { 0, 0 }, { 97,6029 }, + { 98,6029 }, { 99,6029 }, { 100,6029 }, { 101,6029 }, { 102,6029 }, + { 103,6029 }, { 104,15540 }, { 105,6029 }, { 106,6029 }, { 107,6029 }, + { 108,6029 }, { 109,6029 }, { 110,6029 }, { 111,6029 }, { 112,6029 }, + + { 113,6029 }, { 114,15797 }, { 115,6029 }, { 116,6029 }, { 117,6029 }, + { 118,6029 }, { 119,6029 }, { 120,6029 }, { 121,6029 }, { 122,6029 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,6029 }, + { 128,6029 }, { 129,6029 }, { 130,6029 }, { 131,6029 }, { 132,6029 }, + { 133,6029 }, { 134,6029 }, { 135,6029 }, { 136,6029 }, { 137,6029 }, + { 138,6029 }, { 139,6029 }, { 140,6029 }, { 141,6029 }, { 142,6029 }, + { 143,6029 }, { 144,6029 }, { 145,6029 }, { 146,6029 }, { 147,6029 }, + { 148,6029 }, { 149,6029 }, { 150,6029 }, { 151,6029 }, { 152,6029 }, + { 153,6029 }, { 154,6029 }, { 155,6029 }, { 156,6029 }, { 157,6029 }, + { 158,6029 }, { 159,6029 }, { 160,6029 }, { 161,6029 }, { 162,6029 }, + + { 163,6029 }, { 164,6029 }, { 165,6029 }, { 166,6029 }, { 167,6029 }, + { 168,6029 }, { 169,6029 }, { 170,6029 }, { 171,6029 }, { 172,6029 }, + { 173,6029 }, { 174,6029 }, { 175,6029 }, { 176,6029 }, { 177,6029 }, + { 178,6029 }, { 179,6029 }, { 180,6029 }, { 181,6029 }, { 182,6029 }, + { 183,6029 }, { 184,6029 }, { 185,6029 }, { 186,6029 }, { 187,6029 }, + { 188,6029 }, { 189,6029 }, { 190,6029 }, { 191,6029 }, { 192,6029 }, + { 193,6029 }, { 194,6029 }, { 195,6029 }, { 196,6029 }, { 197,6029 }, + { 198,6029 }, { 199,6029 }, { 200,6029 }, { 201,6029 }, { 202,6029 }, + { 203,6029 }, { 204,6029 }, { 205,6029 }, { 206,6029 }, { 207,6029 }, + { 208,6029 }, { 209,6029 }, { 210,6029 }, { 211,6029 }, { 212,6029 }, + + { 213,6029 }, { 214,6029 }, { 215,6029 }, { 216,6029 }, { 217,6029 }, + { 218,6029 }, { 219,6029 }, { 220,6029 }, { 221,6029 }, { 222,6029 }, + { 223,6029 }, { 224,6029 }, { 225,6029 }, { 226,6029 }, { 227,6029 }, + { 228,6029 }, { 229,6029 }, { 230,6029 }, { 231,6029 }, { 232,6029 }, + { 233,6029 }, { 234,6029 }, { 235,6029 }, { 236,6029 }, { 237,6029 }, + { 238,6029 }, { 239,6029 }, { 240,6029 }, { 241,6029 }, { 242,6029 }, + { 243,6029 }, { 244,6029 }, { 245,6029 }, { 246,6029 }, { 247,6029 }, + { 248,6029 }, { 249,6029 }, { 250,6029 }, { 251,6029 }, { 252,6029 }, + { 253,6029 }, { 254,6029 }, { 255,6029 }, { 0, 131 }, { 0,97895 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,5772 }, { 49,5772 }, { 50,5772 }, + { 51,5772 }, { 52,5772 }, { 53,5772 }, { 54,5772 }, { 55,5772 }, + + { 56,5772 }, { 57,5772 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,5772 }, + { 66,5772 }, { 67,5772 }, { 68,5772 }, { 69,5772 }, { 70,5772 }, + { 71,5772 }, { 72,5772 }, { 73,5772 }, { 74,5772 }, { 75,5772 }, + { 76,5772 }, { 77,5772 }, { 78,15797 }, { 79,5772 }, { 80,5772 }, + { 81,5772 }, { 82,5772 }, { 83,16054 }, { 84,5772 }, { 85,5772 }, + { 86,5772 }, { 87,5772 }, { 88,5772 }, { 89,5772 }, { 90,5772 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,5772 }, + { 0, 0 }, { 97,5772 }, { 98,5772 }, { 99,5772 }, { 100,5772 }, + { 101,5772 }, { 102,5772 }, { 103,5772 }, { 104,5772 }, { 105,5772 }, + + { 106,5772 }, { 107,5772 }, { 108,5772 }, { 109,5772 }, { 110,15797 }, + { 111,5772 }, { 112,5772 }, { 113,5772 }, { 114,5772 }, { 115,16054 }, + { 116,5772 }, { 117,5772 }, { 118,5772 }, { 119,5772 }, { 120,5772 }, + { 121,5772 }, { 122,5772 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,5772 }, { 128,5772 }, { 129,5772 }, { 130,5772 }, + { 131,5772 }, { 132,5772 }, { 133,5772 }, { 134,5772 }, { 135,5772 }, + { 136,5772 }, { 137,5772 }, { 138,5772 }, { 139,5772 }, { 140,5772 }, + { 141,5772 }, { 142,5772 }, { 143,5772 }, { 144,5772 }, { 145,5772 }, + { 146,5772 }, { 147,5772 }, { 148,5772 }, { 149,5772 }, { 150,5772 }, + { 151,5772 }, { 152,5772 }, { 153,5772 }, { 154,5772 }, { 155,5772 }, + + { 156,5772 }, { 157,5772 }, { 158,5772 }, { 159,5772 }, { 160,5772 }, + { 161,5772 }, { 162,5772 }, { 163,5772 }, { 164,5772 }, { 165,5772 }, + { 166,5772 }, { 167,5772 }, { 168,5772 }, { 169,5772 }, { 170,5772 }, + { 171,5772 }, { 172,5772 }, { 173,5772 }, { 174,5772 }, { 175,5772 }, + { 176,5772 }, { 177,5772 }, { 178,5772 }, { 179,5772 }, { 180,5772 }, + { 181,5772 }, { 182,5772 }, { 183,5772 }, { 184,5772 }, { 185,5772 }, + { 186,5772 }, { 187,5772 }, { 188,5772 }, { 189,5772 }, { 190,5772 }, + { 191,5772 }, { 192,5772 }, { 193,5772 }, { 194,5772 }, { 195,5772 }, + { 196,5772 }, { 197,5772 }, { 198,5772 }, { 199,5772 }, { 200,5772 }, + { 201,5772 }, { 202,5772 }, { 203,5772 }, { 204,5772 }, { 205,5772 }, + + { 206,5772 }, { 207,5772 }, { 208,5772 }, { 209,5772 }, { 210,5772 }, + { 211,5772 }, { 212,5772 }, { 213,5772 }, { 214,5772 }, { 215,5772 }, + { 216,5772 }, { 217,5772 }, { 218,5772 }, { 219,5772 }, { 220,5772 }, + { 221,5772 }, { 222,5772 }, { 223,5772 }, { 224,5772 }, { 225,5772 }, + { 226,5772 }, { 227,5772 }, { 228,5772 }, { 229,5772 }, { 230,5772 }, + { 231,5772 }, { 232,5772 }, { 233,5772 }, { 234,5772 }, { 235,5772 }, + { 236,5772 }, { 237,5772 }, { 238,5772 }, { 239,5772 }, { 240,5772 }, + { 241,5772 }, { 242,5772 }, { 243,5772 }, { 244,5772 }, { 245,5772 }, + { 246,5772 }, { 247,5772 }, { 248,5772 }, { 249,5772 }, { 250,5772 }, + { 251,5772 }, { 252,5772 }, { 253,5772 }, { 254,5772 }, { 255,5772 }, + + { 0, 131 }, { 0,97638 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,5515 }, + + { 49,5515 }, { 50,5515 }, { 51,5515 }, { 52,5515 }, { 53,5515 }, + { 54,5515 }, { 55,5515 }, { 56,5515 }, { 57,5515 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,16054 }, { 66,5515 }, { 67,5515 }, { 68,5515 }, + { 69,5515 }, { 70,5515 }, { 71,5515 }, { 72,5515 }, { 73,5515 }, + { 74,5515 }, { 75,5515 }, { 76,5515 }, { 77,5515 }, { 78,5515 }, + { 79,5515 }, { 80,5515 }, { 81,5515 }, { 82,5515 }, { 83,5515 }, + { 84,5515 }, { 85,5515 }, { 86,5515 }, { 87,5515 }, { 88,5515 }, + { 89,5515 }, { 90,5515 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,5515 }, { 0, 0 }, { 97,16054 }, { 98,5515 }, + + { 99,5515 }, { 100,5515 }, { 101,5515 }, { 102,5515 }, { 103,5515 }, + { 104,5515 }, { 105,5515 }, { 106,5515 }, { 107,5515 }, { 108,5515 }, + { 109,5515 }, { 110,5515 }, { 111,5515 }, { 112,5515 }, { 113,5515 }, + { 114,5515 }, { 115,5515 }, { 116,5515 }, { 117,5515 }, { 118,5515 }, + { 119,5515 }, { 120,5515 }, { 121,5515 }, { 122,5515 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,5515 }, { 128,5515 }, + { 129,5515 }, { 130,5515 }, { 131,5515 }, { 132,5515 }, { 133,5515 }, + { 134,5515 }, { 135,5515 }, { 136,5515 }, { 137,5515 }, { 138,5515 }, + { 139,5515 }, { 140,5515 }, { 141,5515 }, { 142,5515 }, { 143,5515 }, + { 144,5515 }, { 145,5515 }, { 146,5515 }, { 147,5515 }, { 148,5515 }, + + { 149,5515 }, { 150,5515 }, { 151,5515 }, { 152,5515 }, { 153,5515 }, + { 154,5515 }, { 155,5515 }, { 156,5515 }, { 157,5515 }, { 158,5515 }, + { 159,5515 }, { 160,5515 }, { 161,5515 }, { 162,5515 }, { 163,5515 }, + { 164,5515 }, { 165,5515 }, { 166,5515 }, { 167,5515 }, { 168,5515 }, + { 169,5515 }, { 170,5515 }, { 171,5515 }, { 172,5515 }, { 173,5515 }, + { 174,5515 }, { 175,5515 }, { 176,5515 }, { 177,5515 }, { 178,5515 }, + { 179,5515 }, { 180,5515 }, { 181,5515 }, { 182,5515 }, { 183,5515 }, + { 184,5515 }, { 185,5515 }, { 186,5515 }, { 187,5515 }, { 188,5515 }, + { 189,5515 }, { 190,5515 }, { 191,5515 }, { 192,5515 }, { 193,5515 }, + { 194,5515 }, { 195,5515 }, { 196,5515 }, { 197,5515 }, { 198,5515 }, + + { 199,5515 }, { 200,5515 }, { 201,5515 }, { 202,5515 }, { 203,5515 }, + { 204,5515 }, { 205,5515 }, { 206,5515 }, { 207,5515 }, { 208,5515 }, + { 209,5515 }, { 210,5515 }, { 211,5515 }, { 212,5515 }, { 213,5515 }, + { 214,5515 }, { 215,5515 }, { 216,5515 }, { 217,5515 }, { 218,5515 }, + { 219,5515 }, { 220,5515 }, { 221,5515 }, { 222,5515 }, { 223,5515 }, + { 224,5515 }, { 225,5515 }, { 226,5515 }, { 227,5515 }, { 228,5515 }, + { 229,5515 }, { 230,5515 }, { 231,5515 }, { 232,5515 }, { 233,5515 }, + { 234,5515 }, { 235,5515 }, { 236,5515 }, { 237,5515 }, { 238,5515 }, + { 239,5515 }, { 240,5515 }, { 241,5515 }, { 242,5515 }, { 243,5515 }, + { 244,5515 }, { 245,5515 }, { 246,5515 }, { 247,5515 }, { 248,5515 }, + + { 249,5515 }, { 250,5515 }, { 251,5515 }, { 252,5515 }, { 253,5515 }, + { 254,5515 }, { 255,5515 }, { 0, 131 }, { 0,97381 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,5258 }, { 49,5258 }, { 50,5258 }, { 51,5258 }, + { 52,5258 }, { 53,5258 }, { 54,5258 }, { 55,5258 }, { 56,5258 }, + { 57,5258 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,5258 }, { 66,5258 }, + { 67,5258 }, { 68,5258 }, { 69,5258 }, { 70,5258 }, { 71,5258 }, + { 72,16054 }, { 73,5258 }, { 74,5258 }, { 75,5258 }, { 76,5258 }, + { 77,5258 }, { 78,5258 }, { 79,5258 }, { 80,5258 }, { 81,5258 }, + { 82,5258 }, { 83,5258 }, { 84,5258 }, { 85,5258 }, { 86,5258 }, + { 87,5258 }, { 88,5258 }, { 89,5258 }, { 90,5258 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,5258 }, { 0, 0 }, + { 97,5258 }, { 98,5258 }, { 99,5258 }, { 100,5258 }, { 101,5258 }, + { 102,5258 }, { 103,5258 }, { 104,16054 }, { 105,5258 }, { 106,5258 }, + { 107,5258 }, { 108,5258 }, { 109,5258 }, { 110,5258 }, { 111,5258 }, + { 112,5258 }, { 113,5258 }, { 114,5258 }, { 115,5258 }, { 116,5258 }, + { 117,5258 }, { 118,5258 }, { 119,5258 }, { 120,5258 }, { 121,5258 }, + { 122,5258 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,5258 }, { 128,5258 }, { 129,5258 }, { 130,5258 }, { 131,5258 }, + { 132,5258 }, { 133,5258 }, { 134,5258 }, { 135,5258 }, { 136,5258 }, + { 137,5258 }, { 138,5258 }, { 139,5258 }, { 140,5258 }, { 141,5258 }, + + { 142,5258 }, { 143,5258 }, { 144,5258 }, { 145,5258 }, { 146,5258 }, + { 147,5258 }, { 148,5258 }, { 149,5258 }, { 150,5258 }, { 151,5258 }, + { 152,5258 }, { 153,5258 }, { 154,5258 }, { 155,5258 }, { 156,5258 }, + { 157,5258 }, { 158,5258 }, { 159,5258 }, { 160,5258 }, { 161,5258 }, + { 162,5258 }, { 163,5258 }, { 164,5258 }, { 165,5258 }, { 166,5258 }, + { 167,5258 }, { 168,5258 }, { 169,5258 }, { 170,5258 }, { 171,5258 }, + { 172,5258 }, { 173,5258 }, { 174,5258 }, { 175,5258 }, { 176,5258 }, + { 177,5258 }, { 178,5258 }, { 179,5258 }, { 180,5258 }, { 181,5258 }, + { 182,5258 }, { 183,5258 }, { 184,5258 }, { 185,5258 }, { 186,5258 }, + { 187,5258 }, { 188,5258 }, { 189,5258 }, { 190,5258 }, { 191,5258 }, + + { 192,5258 }, { 193,5258 }, { 194,5258 }, { 195,5258 }, { 196,5258 }, + { 197,5258 }, { 198,5258 }, { 199,5258 }, { 200,5258 }, { 201,5258 }, + { 202,5258 }, { 203,5258 }, { 204,5258 }, { 205,5258 }, { 206,5258 }, + { 207,5258 }, { 208,5258 }, { 209,5258 }, { 210,5258 }, { 211,5258 }, + { 212,5258 }, { 213,5258 }, { 214,5258 }, { 215,5258 }, { 216,5258 }, + { 217,5258 }, { 218,5258 }, { 219,5258 }, { 220,5258 }, { 221,5258 }, + { 222,5258 }, { 223,5258 }, { 224,5258 }, { 225,5258 }, { 226,5258 }, + { 227,5258 }, { 228,5258 }, { 229,5258 }, { 230,5258 }, { 231,5258 }, + { 232,5258 }, { 233,5258 }, { 234,5258 }, { 235,5258 }, { 236,5258 }, + { 237,5258 }, { 238,5258 }, { 239,5258 }, { 240,5258 }, { 241,5258 }, + + { 242,5258 }, { 243,5258 }, { 244,5258 }, { 245,5258 }, { 246,5258 }, + { 247,5258 }, { 248,5258 }, { 249,5258 }, { 250,5258 }, { 251,5258 }, + { 252,5258 }, { 253,5258 }, { 254,5258 }, { 255,5258 }, { 0, 131 }, + { 0,97124 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,5001 }, { 49,5001 }, + { 50,5001 }, { 51,5001 }, { 52,5001 }, { 53,5001 }, { 54,5001 }, + { 55,5001 }, { 56,5001 }, { 57,5001 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,5001 }, { 66,5001 }, { 67,5001 }, { 68,5001 }, { 69,5001 }, + { 70,5001 }, { 71,5001 }, { 72,5001 }, { 73,5001 }, { 74,5001 }, + { 75,5001 }, { 76,5001 }, { 77,5001 }, { 78,5001 }, { 79,16054 }, + { 80,5001 }, { 81,5001 }, { 82,5001 }, { 83,5001 }, { 84,5001 }, + + { 85,5001 }, { 86,5001 }, { 87,5001 }, { 88,5001 }, { 89,5001 }, + { 90,5001 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,5001 }, { 0, 0 }, { 97,5001 }, { 98,5001 }, { 99,5001 }, + { 100,5001 }, { 101,5001 }, { 102,5001 }, { 103,5001 }, { 104,5001 }, + { 105,5001 }, { 106,5001 }, { 107,5001 }, { 108,5001 }, { 109,5001 }, + { 110,5001 }, { 111,16054 }, { 112,5001 }, { 113,5001 }, { 114,5001 }, + { 115,5001 }, { 116,5001 }, { 117,5001 }, { 118,5001 }, { 119,5001 }, + { 120,5001 }, { 121,5001 }, { 122,5001 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,5001 }, { 128,5001 }, { 129,5001 }, + { 130,5001 }, { 131,5001 }, { 132,5001 }, { 133,5001 }, { 134,5001 }, + + { 135,5001 }, { 136,5001 }, { 137,5001 }, { 138,5001 }, { 139,5001 }, + { 140,5001 }, { 141,5001 }, { 142,5001 }, { 143,5001 }, { 144,5001 }, + { 145,5001 }, { 146,5001 }, { 147,5001 }, { 148,5001 }, { 149,5001 }, + { 150,5001 }, { 151,5001 }, { 152,5001 }, { 153,5001 }, { 154,5001 }, + { 155,5001 }, { 156,5001 }, { 157,5001 }, { 158,5001 }, { 159,5001 }, + { 160,5001 }, { 161,5001 }, { 162,5001 }, { 163,5001 }, { 164,5001 }, + { 165,5001 }, { 166,5001 }, { 167,5001 }, { 168,5001 }, { 169,5001 }, + { 170,5001 }, { 171,5001 }, { 172,5001 }, { 173,5001 }, { 174,5001 }, + { 175,5001 }, { 176,5001 }, { 177,5001 }, { 178,5001 }, { 179,5001 }, + { 180,5001 }, { 181,5001 }, { 182,5001 }, { 183,5001 }, { 184,5001 }, + + { 185,5001 }, { 186,5001 }, { 187,5001 }, { 188,5001 }, { 189,5001 }, + { 190,5001 }, { 191,5001 }, { 192,5001 }, { 193,5001 }, { 194,5001 }, + { 195,5001 }, { 196,5001 }, { 197,5001 }, { 198,5001 }, { 199,5001 }, + { 200,5001 }, { 201,5001 }, { 202,5001 }, { 203,5001 }, { 204,5001 }, + { 205,5001 }, { 206,5001 }, { 207,5001 }, { 208,5001 }, { 209,5001 }, + { 210,5001 }, { 211,5001 }, { 212,5001 }, { 213,5001 }, { 214,5001 }, + { 215,5001 }, { 216,5001 }, { 217,5001 }, { 218,5001 }, { 219,5001 }, + { 220,5001 }, { 221,5001 }, { 222,5001 }, { 223,5001 }, { 224,5001 }, + { 225,5001 }, { 226,5001 }, { 227,5001 }, { 228,5001 }, { 229,5001 }, + { 230,5001 }, { 231,5001 }, { 232,5001 }, { 233,5001 }, { 234,5001 }, + + { 235,5001 }, { 236,5001 }, { 237,5001 }, { 238,5001 }, { 239,5001 }, + { 240,5001 }, { 241,5001 }, { 242,5001 }, { 243,5001 }, { 244,5001 }, + { 245,5001 }, { 246,5001 }, { 247,5001 }, { 248,5001 }, { 249,5001 }, + { 250,5001 }, { 251,5001 }, { 252,5001 }, { 253,5001 }, { 254,5001 }, + { 255,5001 }, { 0, 131 }, { 0,96867 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,4744 }, { 49,4744 }, { 50,4744 }, { 51,4744 }, { 52,4744 }, + { 53,4744 }, { 54,4744 }, { 55,4744 }, { 56,4744 }, { 57,4744 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,4744 }, { 66,4744 }, { 67,4744 }, + { 68,4744 }, { 69,4744 }, { 70,4744 }, { 71,4744 }, { 72,4744 }, + { 73,16054 }, { 74,4744 }, { 75,4744 }, { 76,4744 }, { 77,4744 }, + + { 78,4744 }, { 79,4744 }, { 80,4744 }, { 81,4744 }, { 82,4744 }, + { 83,4744 }, { 84,4744 }, { 85,4744 }, { 86,4744 }, { 87,4744 }, + { 88,4744 }, { 89,4744 }, { 90,4744 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,4744 }, { 0, 0 }, { 97,4744 }, + { 98,4744 }, { 99,4744 }, { 100,4744 }, { 101,4744 }, { 102,4744 }, + { 103,4744 }, { 104,4744 }, { 105,16054 }, { 106,4744 }, { 107,4744 }, + { 108,4744 }, { 109,4744 }, { 110,4744 }, { 111,4744 }, { 112,4744 }, + { 113,4744 }, { 114,4744 }, { 115,4744 }, { 116,4744 }, { 117,4744 }, + { 118,4744 }, { 119,4744 }, { 120,4744 }, { 121,4744 }, { 122,4744 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,4744 }, + + { 128,4744 }, { 129,4744 }, { 130,4744 }, { 131,4744 }, { 132,4744 }, + { 133,4744 }, { 134,4744 }, { 135,4744 }, { 136,4744 }, { 137,4744 }, + { 138,4744 }, { 139,4744 }, { 140,4744 }, { 141,4744 }, { 142,4744 }, + { 143,4744 }, { 144,4744 }, { 145,4744 }, { 146,4744 }, { 147,4744 }, + { 148,4744 }, { 149,4744 }, { 150,4744 }, { 151,4744 }, { 152,4744 }, + { 153,4744 }, { 154,4744 }, { 155,4744 }, { 156,4744 }, { 157,4744 }, + { 158,4744 }, { 159,4744 }, { 160,4744 }, { 161,4744 }, { 162,4744 }, + { 163,4744 }, { 164,4744 }, { 165,4744 }, { 166,4744 }, { 167,4744 }, + { 168,4744 }, { 169,4744 }, { 170,4744 }, { 171,4744 }, { 172,4744 }, + { 173,4744 }, { 174,4744 }, { 175,4744 }, { 176,4744 }, { 177,4744 }, + + { 178,4744 }, { 179,4744 }, { 180,4744 }, { 181,4744 }, { 182,4744 }, + { 183,4744 }, { 184,4744 }, { 185,4744 }, { 186,4744 }, { 187,4744 }, + { 188,4744 }, { 189,4744 }, { 190,4744 }, { 191,4744 }, { 192,4744 }, + { 193,4744 }, { 194,4744 }, { 195,4744 }, { 196,4744 }, { 197,4744 }, + { 198,4744 }, { 199,4744 }, { 200,4744 }, { 201,4744 }, { 202,4744 }, + { 203,4744 }, { 204,4744 }, { 205,4744 }, { 206,4744 }, { 207,4744 }, + { 208,4744 }, { 209,4744 }, { 210,4744 }, { 211,4744 }, { 212,4744 }, + { 213,4744 }, { 214,4744 }, { 215,4744 }, { 216,4744 }, { 217,4744 }, + { 218,4744 }, { 219,4744 }, { 220,4744 }, { 221,4744 }, { 222,4744 }, + { 223,4744 }, { 224,4744 }, { 225,4744 }, { 226,4744 }, { 227,4744 }, + + { 228,4744 }, { 229,4744 }, { 230,4744 }, { 231,4744 }, { 232,4744 }, + { 233,4744 }, { 234,4744 }, { 235,4744 }, { 236,4744 }, { 237,4744 }, + { 238,4744 }, { 239,4744 }, { 240,4744 }, { 241,4744 }, { 242,4744 }, + { 243,4744 }, { 244,4744 }, { 245,4744 }, { 246,4744 }, { 247,4744 }, + { 248,4744 }, { 249,4744 }, { 250,4744 }, { 251,4744 }, { 252,4744 }, + { 253,4744 }, { 254,4744 }, { 255,4744 }, { 0, 131 }, { 0,96610 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,4487 }, { 49,4487 }, { 50,4487 }, + { 51,4487 }, { 52,4487 }, { 53,4487 }, { 54,4487 }, { 55,4487 }, + { 56,4487 }, { 57,4487 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,4487 }, + { 66,4487 }, { 67,4487 }, { 68,4487 }, { 69,4487 }, { 70,4487 }, + + { 71,4487 }, { 72,4487 }, { 73,4487 }, { 74,4487 }, { 75,4487 }, + { 76,4487 }, { 77,4487 }, { 78,4487 }, { 79,4487 }, { 80,4487 }, + { 81,4487 }, { 82,4487 }, { 83,4487 }, { 84,4487 }, { 85,4487 }, + { 86,4487 }, { 87,4487 }, { 88,4487 }, { 89,4487 }, { 90,4487 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,16054 }, + { 0, 0 }, { 97,4487 }, { 98,4487 }, { 99,4487 }, { 100,4487 }, + { 101,4487 }, { 102,4487 }, { 103,4487 }, { 104,4487 }, { 105,4487 }, + { 106,4487 }, { 107,4487 }, { 108,4487 }, { 109,4487 }, { 110,4487 }, + { 111,4487 }, { 112,4487 }, { 113,4487 }, { 114,4487 }, { 115,4487 }, + { 116,4487 }, { 117,4487 }, { 118,4487 }, { 119,4487 }, { 120,4487 }, + + { 121,4487 }, { 122,4487 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,4487 }, { 128,4487 }, { 129,4487 }, { 130,4487 }, + { 131,4487 }, { 132,4487 }, { 133,4487 }, { 134,4487 }, { 135,4487 }, + { 136,4487 }, { 137,4487 }, { 138,4487 }, { 139,4487 }, { 140,4487 }, + { 141,4487 }, { 142,4487 }, { 143,4487 }, { 144,4487 }, { 145,4487 }, + { 146,4487 }, { 147,4487 }, { 148,4487 }, { 149,4487 }, { 150,4487 }, + { 151,4487 }, { 152,4487 }, { 153,4487 }, { 154,4487 }, { 155,4487 }, + { 156,4487 }, { 157,4487 }, { 158,4487 }, { 159,4487 }, { 160,4487 }, + { 161,4487 }, { 162,4487 }, { 163,4487 }, { 164,4487 }, { 165,4487 }, + { 166,4487 }, { 167,4487 }, { 168,4487 }, { 169,4487 }, { 170,4487 }, + + { 171,4487 }, { 172,4487 }, { 173,4487 }, { 174,4487 }, { 175,4487 }, + { 176,4487 }, { 177,4487 }, { 178,4487 }, { 179,4487 }, { 180,4487 }, + { 181,4487 }, { 182,4487 }, { 183,4487 }, { 184,4487 }, { 185,4487 }, + { 186,4487 }, { 187,4487 }, { 188,4487 }, { 189,4487 }, { 190,4487 }, + { 191,4487 }, { 192,4487 }, { 193,4487 }, { 194,4487 }, { 195,4487 }, + { 196,4487 }, { 197,4487 }, { 198,4487 }, { 199,4487 }, { 200,4487 }, + { 201,4487 }, { 202,4487 }, { 203,4487 }, { 204,4487 }, { 205,4487 }, + { 206,4487 }, { 207,4487 }, { 208,4487 }, { 209,4487 }, { 210,4487 }, + { 211,4487 }, { 212,4487 }, { 213,4487 }, { 214,4487 }, { 215,4487 }, + { 216,4487 }, { 217,4487 }, { 218,4487 }, { 219,4487 }, { 220,4487 }, + + { 221,4487 }, { 222,4487 }, { 223,4487 }, { 224,4487 }, { 225,4487 }, + { 226,4487 }, { 227,4487 }, { 228,4487 }, { 229,4487 }, { 230,4487 }, + { 231,4487 }, { 232,4487 }, { 233,4487 }, { 234,4487 }, { 235,4487 }, + { 236,4487 }, { 237,4487 }, { 238,4487 }, { 239,4487 }, { 240,4487 }, + { 241,4487 }, { 242,4487 }, { 243,4487 }, { 244,4487 }, { 245,4487 }, + { 246,4487 }, { 247,4487 }, { 248,4487 }, { 249,4487 }, { 250,4487 }, + { 251,4487 }, { 252,4487 }, { 253,4487 }, { 254,4487 }, { 255,4487 }, + { 0, 142 }, { 0,96353 }, { 1,16054 }, { 2,16054 }, { 3,16054 }, + { 4,16054 }, { 5,16054 }, { 6,16054 }, { 7,16054 }, { 8,16054 }, + { 9,16054 }, { 10,16054 }, { 11,16054 }, { 12,16054 }, { 13,16054 }, + + { 14,16054 }, { 15,16054 }, { 16,16054 }, { 17,16054 }, { 18,16054 }, + { 19,16054 }, { 20,16054 }, { 21,16054 }, { 22,16054 }, { 23,16054 }, + { 24,16054 }, { 25,16054 }, { 26,16054 }, { 27,16054 }, { 28,16054 }, + { 29,16054 }, { 30,16054 }, { 31,16054 }, { 32,16054 }, { 33,16054 }, + { 34,16054 }, { 35,16054 }, { 36,16054 }, { 37,16054 }, { 38,16054 }, + { 39,16054 }, { 40,16054 }, { 41,16054 }, { 42,16054 }, { 43,16054 }, + { 44,16054 }, { 45,16054 }, { 46,16054 }, { 47,16054 }, { 48,16054 }, + { 49,16054 }, { 50,16054 }, { 51,16054 }, { 52,16054 }, { 53,16054 }, + { 54,16054 }, { 55,16054 }, { 56,16054 }, { 57,16054 }, { 58,16054 }, + { 59,16054 }, { 60,16054 }, { 61,16054 }, { 62,16054 }, { 63,16054 }, + + { 64,16054 }, { 65,16054 }, { 66,16054 }, { 67,16054 }, { 68,16054 }, + { 69,16054 }, { 70,16054 }, { 71,16054 }, { 72,16054 }, { 73,16054 }, + { 74,16054 }, { 75,16054 }, { 76,16054 }, { 77,16054 }, { 78,16054 }, + { 79,16054 }, { 80,16054 }, { 81,16054 }, { 82,16054 }, { 83,16054 }, + { 84,16054 }, { 85,16054 }, { 86,16054 }, { 87,16054 }, { 88,16054 }, + { 89,16054 }, { 90,16054 }, { 91,16054 }, { 92,16054 }, { 93,16054 }, + { 94,16054 }, { 95,16054 }, { 96,4238 }, { 97,16054 }, { 98,16054 }, + { 99,16054 }, { 100,16054 }, { 101,16054 }, { 102,16054 }, { 103,16054 }, + { 104,16054 }, { 105,16054 }, { 106,16054 }, { 107,16054 }, { 108,16054 }, + { 109,16054 }, { 110,16054 }, { 111,16054 }, { 112,16054 }, { 113,16054 }, + + { 114,16054 }, { 115,16054 }, { 116,16054 }, { 117,16054 }, { 118,16054 }, + { 119,16054 }, { 120,16054 }, { 121,16054 }, { 122,16054 }, { 123,16054 }, + { 124,16054 }, { 125,16054 }, { 126,16054 }, { 127,16054 }, { 128,16054 }, + { 129,16054 }, { 130,16054 }, { 131,16054 }, { 132,16054 }, { 133,16054 }, + { 134,16054 }, { 135,16054 }, { 136,16054 }, { 137,16054 }, { 138,16054 }, + { 139,16054 }, { 140,16054 }, { 141,16054 }, { 142,16054 }, { 143,16054 }, + { 144,16054 }, { 145,16054 }, { 146,16054 }, { 147,16054 }, { 148,16054 }, + { 149,16054 }, { 150,16054 }, { 151,16054 }, { 152,16054 }, { 153,16054 }, + { 154,16054 }, { 155,16054 }, { 156,16054 }, { 157,16054 }, { 158,16054 }, + { 159,16054 }, { 160,16054 }, { 161,16054 }, { 162,16054 }, { 163,16054 }, + + { 164,16054 }, { 165,16054 }, { 166,16054 }, { 167,16054 }, { 168,16054 }, + { 169,16054 }, { 170,16054 }, { 171,16054 }, { 172,16054 }, { 173,16054 }, + { 174,16054 }, { 175,16054 }, { 176,16054 }, { 177,16054 }, { 178,16054 }, + { 179,16054 }, { 180,16054 }, { 181,16054 }, { 182,16054 }, { 183,16054 }, + { 184,16054 }, { 185,16054 }, { 186,16054 }, { 187,16054 }, { 188,16054 }, + { 189,16054 }, { 190,16054 }, { 191,16054 }, { 192,16054 }, { 193,16054 }, + { 194,16054 }, { 195,16054 }, { 196,16054 }, { 197,16054 }, { 198,16054 }, + { 199,16054 }, { 200,16054 }, { 201,16054 }, { 202,16054 }, { 203,16054 }, + { 204,16054 }, { 205,16054 }, { 206,16054 }, { 207,16054 }, { 208,16054 }, + { 209,16054 }, { 210,16054 }, { 211,16054 }, { 212,16054 }, { 213,16054 }, + + { 214,16054 }, { 215,16054 }, { 216,16054 }, { 217,16054 }, { 218,16054 }, + { 219,16054 }, { 220,16054 }, { 221,16054 }, { 222,16054 }, { 223,16054 }, + { 224,16054 }, { 225,16054 }, { 226,16054 }, { 227,16054 }, { 228,16054 }, + { 229,16054 }, { 230,16054 }, { 231,16054 }, { 232,16054 }, { 233,16054 }, + { 234,16054 }, { 235,16054 }, { 236,16054 }, { 237,16054 }, { 238,16054 }, + { 239,16054 }, { 240,16054 }, { 241,16054 }, { 242,16054 }, { 243,16054 }, + { 244,16054 }, { 245,16054 }, { 246,16054 }, { 247,16054 }, { 248,16054 }, + { 249,16054 }, { 250,16054 }, { 251,16054 }, { 252,16054 }, { 253,16054 }, + { 254,16054 }, { 255,16054 }, { 256,16054 }, { 0, 15 }, { 0,96095 }, + { 1,16054 }, { 2,16054 }, { 3,16054 }, { 4,16054 }, { 5,16054 }, + + { 6,16054 }, { 7,16054 }, { 8,16054 }, { 9,16054 }, { 0, 0 }, + { 11,16054 }, { 12,16054 }, { 0, 0 }, { 14,16054 }, { 15,16054 }, + { 16,16054 }, { 17,16054 }, { 18,16054 }, { 19,16054 }, { 20,16054 }, + { 21,16054 }, { 22,16054 }, { 23,16054 }, { 24,16054 }, { 25,16054 }, + { 26,16054 }, { 27,16054 }, { 28,16054 }, { 29,16054 }, { 30,16054 }, + { 31,16054 }, { 32,16054 }, { 33,16054 }, { 34,16054 }, { 35,16054 }, + { 36,16054 }, { 37,16054 }, { 38,16054 }, { 39,16054 }, { 40,16054 }, + { 41,16054 }, { 0, 0 }, { 43,16054 }, { 44,16054 }, { 45,16054 }, + { 46,16054 }, { 47,16054 }, { 48,16054 }, { 49,16054 }, { 50,16054 }, + { 51,16054 }, { 52,16054 }, { 53,16054 }, { 54,16054 }, { 55,16054 }, + + { 56,16054 }, { 57,16054 }, { 58,16054 }, { 59,16054 }, { 60,16054 }, + { 61,16054 }, { 62,16054 }, { 63,16054 }, { 64,16054 }, { 65,16054 }, + { 66,16054 }, { 67,16054 }, { 68,16054 }, { 69,16054 }, { 70,16054 }, + { 71,16054 }, { 72,16054 }, { 73,16054 }, { 74,16054 }, { 75,16054 }, + { 76,16054 }, { 77,16054 }, { 78,16054 }, { 79,16054 }, { 80,16054 }, + { 81,16054 }, { 82,16054 }, { 83,16054 }, { 84,16054 }, { 85,16054 }, + { 86,16054 }, { 87,16054 }, { 88,16054 }, { 89,16054 }, { 90,16054 }, + { 91,16054 }, { 92,16054 }, { 93,16054 }, { 94,16054 }, { 95,16054 }, + { 96,16054 }, { 97,16054 }, { 98,16054 }, { 99,16054 }, { 100,16054 }, + { 101,16054 }, { 102,16054 }, { 103,16054 }, { 104,16054 }, { 105,16054 }, + + { 106,16054 }, { 107,16054 }, { 108,16054 }, { 109,16054 }, { 110,16054 }, + { 111,16054 }, { 112,16054 }, { 113,16054 }, { 114,16054 }, { 115,16054 }, + { 116,16054 }, { 117,16054 }, { 118,16054 }, { 119,16054 }, { 120,16054 }, + { 121,16054 }, { 122,16054 }, { 123,16054 }, { 124,16054 }, { 125,16054 }, + { 126,16054 }, { 127,16054 }, { 128,16054 }, { 129,16054 }, { 130,16054 }, + { 131,16054 }, { 132,16054 }, { 133,16054 }, { 134,16054 }, { 135,16054 }, + { 136,16054 }, { 137,16054 }, { 138,16054 }, { 139,16054 }, { 140,16054 }, + { 141,16054 }, { 142,16054 }, { 143,16054 }, { 144,16054 }, { 145,16054 }, + { 146,16054 }, { 147,16054 }, { 148,16054 }, { 149,16054 }, { 150,16054 }, + { 151,16054 }, { 152,16054 }, { 153,16054 }, { 154,16054 }, { 155,16054 }, + + { 156,16054 }, { 157,16054 }, { 158,16054 }, { 159,16054 }, { 160,16054 }, + { 161,16054 }, { 162,16054 }, { 163,16054 }, { 164,16054 }, { 165,16054 }, + { 166,16054 }, { 167,16054 }, { 168,16054 }, { 169,16054 }, { 170,16054 }, + { 171,16054 }, { 172,16054 }, { 173,16054 }, { 174,16054 }, { 175,16054 }, + { 176,16054 }, { 177,16054 }, { 178,16054 }, { 179,16054 }, { 180,16054 }, + { 181,16054 }, { 182,16054 }, { 183,16054 }, { 184,16054 }, { 185,16054 }, + { 186,16054 }, { 187,16054 }, { 188,16054 }, { 189,16054 }, { 190,16054 }, + { 191,16054 }, { 192,16054 }, { 193,16054 }, { 194,16054 }, { 195,16054 }, + { 196,16054 }, { 197,16054 }, { 198,16054 }, { 199,16054 }, { 200,16054 }, + { 201,16054 }, { 202,16054 }, { 203,16054 }, { 204,16054 }, { 205,16054 }, + + { 206,16054 }, { 207,16054 }, { 208,16054 }, { 209,16054 }, { 210,16054 }, + { 211,16054 }, { 212,16054 }, { 213,16054 }, { 214,16054 }, { 215,16054 }, + { 216,16054 }, { 217,16054 }, { 218,16054 }, { 219,16054 }, { 220,16054 }, + { 221,16054 }, { 222,16054 }, { 223,16054 }, { 224,16054 }, { 225,16054 }, + { 226,16054 }, { 227,16054 }, { 228,16054 }, { 229,16054 }, { 230,16054 }, + { 231,16054 }, { 232,16054 }, { 233,16054 }, { 234,16054 }, { 235,16054 }, + { 236,16054 }, { 237,16054 }, { 238,16054 }, { 239,16054 }, { 240,16054 }, + { 241,16054 }, { 242,16054 }, { 243,16054 }, { 244,16054 }, { 245,16054 }, + { 246,16054 }, { 247,16054 }, { 248,16054 }, { 249,16054 }, { 250,16054 }, + { 251,16054 }, { 252,16054 }, { 253,16054 }, { 254,16054 }, { 255,16054 }, + + { 256,16054 }, { 0, 11 }, { 0,95837 }, { 1,16054 }, { 2,16054 }, + { 3,16054 }, { 4,16054 }, { 5,16054 }, { 6,16054 }, { 7,16054 }, + { 8,16054 }, { 9,16054 }, { 0, 0 }, { 11,16054 }, { 12,16054 }, + { 0, 0 }, { 14,16054 }, { 15,16054 }, { 16,16054 }, { 17,16054 }, + { 18,16054 }, { 19,16054 }, { 20,16054 }, { 21,16054 }, { 22,16054 }, + { 23,16054 }, { 24,16054 }, { 25,16054 }, { 26,16054 }, { 27,16054 }, + { 28,16054 }, { 29,16054 }, { 30,16054 }, { 31,16054 }, { 32,16054 }, + { 33,16054 }, { 34,16054 }, { 35,16054 }, { 36,16054 }, { 37,16054 }, + { 38,16054 }, { 39,16054 }, { 40,16054 }, { 41,16054 }, { 42,16054 }, + { 43,16054 }, { 44,16054 }, { 45,16054 }, { 46,16054 }, { 47,16054 }, + + { 48,16054 }, { 49,16054 }, { 50,16054 }, { 51,16054 }, { 52,16054 }, + { 53,16054 }, { 54,16054 }, { 55,16054 }, { 56,16054 }, { 57,16054 }, + { 58,16054 }, { 59,16054 }, { 60,16054 }, { 61,16054 }, { 62,16054 }, + { 0, 0 }, { 64,16054 }, { 65,16054 }, { 66,16054 }, { 67,16054 }, + { 68,16054 }, { 69,16054 }, { 70,16054 }, { 71,16054 }, { 72,16054 }, + { 73,16054 }, { 74,16054 }, { 75,16054 }, { 76,16054 }, { 77,16054 }, + { 78,16054 }, { 79,16054 }, { 80,16054 }, { 81,16054 }, { 82,16054 }, + { 83,16054 }, { 84,16054 }, { 85,16054 }, { 86,16054 }, { 87,16054 }, + { 88,16054 }, { 89,16054 }, { 90,16054 }, { 91,16054 }, { 92,16054 }, + { 93,16054 }, { 94,16054 }, { 95,16054 }, { 96,16054 }, { 97,16054 }, + + { 98,16054 }, { 99,16054 }, { 100,16054 }, { 101,16054 }, { 102,16054 }, + { 103,16054 }, { 104,16054 }, { 105,16054 }, { 106,16054 }, { 107,16054 }, + { 108,16054 }, { 109,16054 }, { 110,16054 }, { 111,16054 }, { 112,16054 }, + { 113,16054 }, { 114,16054 }, { 115,16054 }, { 116,16054 }, { 117,16054 }, + { 118,16054 }, { 119,16054 }, { 120,16054 }, { 121,16054 }, { 122,16054 }, + { 123,16054 }, { 124,16054 }, { 125,16054 }, { 126,16054 }, { 127,16054 }, + { 128,16054 }, { 129,16054 }, { 130,16054 }, { 131,16054 }, { 132,16054 }, + { 133,16054 }, { 134,16054 }, { 135,16054 }, { 136,16054 }, { 137,16054 }, + { 138,16054 }, { 139,16054 }, { 140,16054 }, { 141,16054 }, { 142,16054 }, + { 143,16054 }, { 144,16054 }, { 145,16054 }, { 146,16054 }, { 147,16054 }, + + { 148,16054 }, { 149,16054 }, { 150,16054 }, { 151,16054 }, { 152,16054 }, + { 153,16054 }, { 154,16054 }, { 155,16054 }, { 156,16054 }, { 157,16054 }, + { 158,16054 }, { 159,16054 }, { 160,16054 }, { 161,16054 }, { 162,16054 }, + { 163,16054 }, { 164,16054 }, { 165,16054 }, { 166,16054 }, { 167,16054 }, + { 168,16054 }, { 169,16054 }, { 170,16054 }, { 171,16054 }, { 172,16054 }, + { 173,16054 }, { 174,16054 }, { 175,16054 }, { 176,16054 }, { 177,16054 }, + { 178,16054 }, { 179,16054 }, { 180,16054 }, { 181,16054 }, { 182,16054 }, + { 183,16054 }, { 184,16054 }, { 185,16054 }, { 186,16054 }, { 187,16054 }, + { 188,16054 }, { 189,16054 }, { 190,16054 }, { 191,16054 }, { 192,16054 }, + { 193,16054 }, { 194,16054 }, { 195,16054 }, { 196,16054 }, { 197,16054 }, + + { 198,16054 }, { 199,16054 }, { 200,16054 }, { 201,16054 }, { 202,16054 }, + { 203,16054 }, { 204,16054 }, { 205,16054 }, { 206,16054 }, { 207,16054 }, + { 208,16054 }, { 209,16054 }, { 210,16054 }, { 211,16054 }, { 212,16054 }, + { 213,16054 }, { 214,16054 }, { 215,16054 }, { 216,16054 }, { 217,16054 }, + { 218,16054 }, { 219,16054 }, { 220,16054 }, { 221,16054 }, { 222,16054 }, + { 223,16054 }, { 224,16054 }, { 225,16054 }, { 226,16054 }, { 227,16054 }, + { 228,16054 }, { 229,16054 }, { 230,16054 }, { 231,16054 }, { 232,16054 }, + { 233,16054 }, { 234,16054 }, { 235,16054 }, { 236,16054 }, { 237,16054 }, + { 238,16054 }, { 239,16054 }, { 240,16054 }, { 241,16054 }, { 242,16054 }, + { 243,16054 }, { 244,16054 }, { 245,16054 }, { 246,16054 }, { 247,16054 }, + + { 248,16054 }, { 249,16054 }, { 250,16054 }, { 251,16054 }, { 252,16054 }, + { 253,16054 }, { 254,16054 }, { 255,16054 }, { 256,16054 }, { 0, 142 }, + { 0,95579 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,16054 }, { 66,16054 }, { 67,16054 }, { 68,16054 }, { 69,16054 }, + { 70,16054 }, { 71,16054 }, { 72,16054 }, { 73,16054 }, { 74,16054 }, + { 75,16054 }, { 76,16054 }, { 77,16054 }, { 78,16054 }, { 79,16054 }, + { 80,16054 }, { 81,16054 }, { 82,16054 }, { 83,16054 }, { 84,16054 }, + { 85,16054 }, { 86,16054 }, { 87,16054 }, { 88,16054 }, { 89,16054 }, + + { 90,16054 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,16054 }, { 0, 0 }, { 97,16054 }, { 98,16054 }, { 99,16054 }, + { 100,16054 }, { 101,16054 }, { 102,16054 }, { 103,16054 }, { 104,16054 }, + { 105,16054 }, { 106,16054 }, { 107,16054 }, { 108,16054 }, { 109,16054 }, + { 110,16054 }, { 111,16054 }, { 112,16054 }, { 113,16054 }, { 114,16054 }, + { 115,16054 }, { 116,16054 }, { 117,16054 }, { 118,16054 }, { 119,16054 }, + { 120,16054 }, { 121,16054 }, { 122,16054 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,16054 }, { 128,16054 }, { 129,16054 }, + { 130,16054 }, { 131,16054 }, { 132,16054 }, { 133,16054 }, { 134,16054 }, + { 135,16054 }, { 136,16054 }, { 137,16054 }, { 138,16054 }, { 139,16054 }, + + { 140,16054 }, { 141,16054 }, { 142,16054 }, { 143,16054 }, { 144,16054 }, + { 145,16054 }, { 146,16054 }, { 147,16054 }, { 148,16054 }, { 149,16054 }, + { 150,16054 }, { 151,16054 }, { 152,16054 }, { 153,16054 }, { 154,16054 }, + { 155,16054 }, { 156,16054 }, { 157,16054 }, { 158,16054 }, { 159,16054 }, + { 160,16054 }, { 161,16054 }, { 162,16054 }, { 163,16054 }, { 164,16054 }, + { 165,16054 }, { 166,16054 }, { 167,16054 }, { 168,16054 }, { 169,16054 }, + { 170,16054 }, { 171,16054 }, { 172,16054 }, { 173,16054 }, { 174,16054 }, + { 175,16054 }, { 176,16054 }, { 177,16054 }, { 178,16054 }, { 179,16054 }, + { 180,16054 }, { 181,16054 }, { 182,16054 }, { 183,16054 }, { 184,16054 }, + { 185,16054 }, { 186,16054 }, { 187,16054 }, { 188,16054 }, { 189,16054 }, + + { 190,16054 }, { 191,16054 }, { 192,16054 }, { 193,16054 }, { 194,16054 }, + { 195,16054 }, { 196,16054 }, { 197,16054 }, { 198,16054 }, { 199,16054 }, + { 200,16054 }, { 201,16054 }, { 202,16054 }, { 203,16054 }, { 204,16054 }, + { 205,16054 }, { 206,16054 }, { 207,16054 }, { 208,16054 }, { 209,16054 }, + { 210,16054 }, { 211,16054 }, { 212,16054 }, { 213,16054 }, { 214,16054 }, + { 215,16054 }, { 216,16054 }, { 217,16054 }, { 218,16054 }, { 219,16054 }, + { 220,16054 }, { 221,16054 }, { 222,16054 }, { 223,16054 }, { 224,16054 }, + { 225,16054 }, { 226,16054 }, { 227,16054 }, { 228,16054 }, { 229,16054 }, + { 230,16054 }, { 231,16054 }, { 232,16054 }, { 233,16054 }, { 234,16054 }, + { 235,16054 }, { 236,16054 }, { 237,16054 }, { 238,16054 }, { 239,16054 }, + + { 240,16054 }, { 241,16054 }, { 242,16054 }, { 243,16054 }, { 244,16054 }, + { 245,16054 }, { 246,16054 }, { 247,16054 }, { 248,16054 }, { 249,16054 }, + { 250,16054 }, { 251,16054 }, { 252,16054 }, { 253,16054 }, { 254,16054 }, + { 255,16054 }, { 0, 142 }, { 0,95322 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,16054 }, { 66,16054 }, { 67,16054 }, + { 68,16054 }, { 69,16054 }, { 70,16054 }, { 71,16054 }, { 72,16054 }, + { 73,16054 }, { 74,16054 }, { 75,16054 }, { 76,16054 }, { 77,16054 }, + { 78,16054 }, { 79,16054 }, { 80,16054 }, { 81,16054 }, { 82,16054 }, + + { 83,16054 }, { 84,16054 }, { 85,16054 }, { 86,16054 }, { 87,16054 }, + { 88,16054 }, { 89,16054 }, { 90,16054 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,16054 }, { 0, 0 }, { 97,16054 }, + { 98,16054 }, { 99,16054 }, { 100,16054 }, { 101,16054 }, { 102,16054 }, + { 103,16054 }, { 104,16054 }, { 105,16054 }, { 106,16054 }, { 107,16054 }, + { 108,16054 }, { 109,16054 }, { 110,16054 }, { 111,16054 }, { 112,16054 }, + { 113,16054 }, { 114,16054 }, { 115,16054 }, { 116,16054 }, { 117,16054 }, + { 118,16054 }, { 119,16054 }, { 120,16054 }, { 121,16054 }, { 122,16054 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,16054 }, + { 128,16054 }, { 129,16054 }, { 130,16054 }, { 131,16054 }, { 132,16054 }, + + { 133,16054 }, { 134,16054 }, { 135,16054 }, { 136,16054 }, { 137,16054 }, + { 138,16054 }, { 139,16054 }, { 140,16054 }, { 141,16054 }, { 142,16054 }, + { 143,16054 }, { 144,16054 }, { 145,16054 }, { 146,16054 }, { 147,16054 }, + { 148,16054 }, { 149,16054 }, { 150,16054 }, { 151,16054 }, { 152,16054 }, + { 153,16054 }, { 154,16054 }, { 155,16054 }, { 156,16054 }, { 157,16054 }, + { 158,16054 }, { 159,16054 }, { 160,16054 }, { 161,16054 }, { 162,16054 }, + { 163,16054 }, { 164,16054 }, { 165,16054 }, { 166,16054 }, { 167,16054 }, + { 168,16054 }, { 169,16054 }, { 170,16054 }, { 171,16054 }, { 172,16054 }, + { 173,16054 }, { 174,16054 }, { 175,16054 }, { 176,16054 }, { 177,16054 }, + { 178,16054 }, { 179,16054 }, { 180,16054 }, { 181,16054 }, { 182,16054 }, + + { 183,16054 }, { 184,16054 }, { 185,16054 }, { 186,16054 }, { 187,16054 }, + { 188,16054 }, { 189,16054 }, { 190,16054 }, { 191,16054 }, { 192,16054 }, + { 193,16054 }, { 194,16054 }, { 195,16054 }, { 196,16054 }, { 197,16054 }, + { 198,16054 }, { 199,16054 }, { 200,16054 }, { 201,16054 }, { 202,16054 }, + { 203,16054 }, { 204,16054 }, { 205,16054 }, { 206,16054 }, { 207,16054 }, + { 208,16054 }, { 209,16054 }, { 210,16054 }, { 211,16054 }, { 212,16054 }, + { 213,16054 }, { 214,16054 }, { 215,16054 }, { 216,16054 }, { 217,16054 }, + { 218,16054 }, { 219,16054 }, { 220,16054 }, { 221,16054 }, { 222,16054 }, + { 223,16054 }, { 224,16054 }, { 225,16054 }, { 226,16054 }, { 227,16054 }, + { 228,16054 }, { 229,16054 }, { 230,16054 }, { 231,16054 }, { 232,16054 }, + + { 233,16054 }, { 234,16054 }, { 235,16054 }, { 236,16054 }, { 237,16054 }, + { 238,16054 }, { 239,16054 }, { 240,16054 }, { 241,16054 }, { 242,16054 }, + { 243,16054 }, { 244,16054 }, { 245,16054 }, { 246,16054 }, { 247,16054 }, + { 248,16054 }, { 249,16054 }, { 250,16054 }, { 251,16054 }, { 252,16054 }, + { 253,16054 }, { 254,16054 }, { 255,16054 }, { 0, 137 }, { 0,95065 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,16054 }, { 49,16054 }, { 50,16054 }, + { 51,16054 }, { 52,16054 }, { 53,16054 }, { 54,16054 }, { 55,16054 }, + { 56,16054 }, { 57,16054 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,16054 }, + { 66,16054 }, { 67,16054 }, { 68,16054 }, { 69,16054 }, { 70,16054 }, + { 71,16054 }, { 72,16054 }, { 73,16054 }, { 74,16054 }, { 75,16054 }, + + { 76,16054 }, { 77,16054 }, { 78,16054 }, { 79,16054 }, { 80,16054 }, + { 81,16054 }, { 82,16054 }, { 83,16054 }, { 84,16054 }, { 85,16054 }, + { 86,16054 }, { 87,16054 }, { 88,16054 }, { 89,16054 }, { 90,16054 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,16054 }, + { 0, 0 }, { 97,16054 }, { 98,16054 }, { 99,16054 }, { 100,16054 }, + { 101,16054 }, { 102,16054 }, { 103,16054 }, { 104,16054 }, { 105,16054 }, + { 106,16054 }, { 107,16054 }, { 108,16054 }, { 109,16054 }, { 110,16054 }, + { 111,16054 }, { 112,16054 }, { 113,16054 }, { 114,16054 }, { 115,16054 }, + { 116,16054 }, { 117,16054 }, { 118,16054 }, { 119,16054 }, { 120,16054 }, + { 121,16054 }, { 122,16054 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 127,16054 }, { 128,16054 }, { 129,16054 }, { 130,16054 }, + { 131,16054 }, { 132,16054 }, { 133,16054 }, { 134,16054 }, { 135,16054 }, + { 136,16054 }, { 137,16054 }, { 138,16054 }, { 139,16054 }, { 140,16054 }, + { 141,16054 }, { 142,16054 }, { 143,16054 }, { 144,16054 }, { 145,16054 }, + { 146,16054 }, { 147,16054 }, { 148,16054 }, { 149,16054 }, { 150,16054 }, + { 151,16054 }, { 152,16054 }, { 153,16054 }, { 154,16054 }, { 155,16054 }, + { 156,16054 }, { 157,16054 }, { 158,16054 }, { 159,16054 }, { 160,16054 }, + { 161,16054 }, { 162,16054 }, { 163,16054 }, { 164,16054 }, { 165,16054 }, + { 166,16054 }, { 167,16054 }, { 168,16054 }, { 169,16054 }, { 170,16054 }, + { 171,16054 }, { 172,16054 }, { 173,16054 }, { 174,16054 }, { 175,16054 }, + + { 176,16054 }, { 177,16054 }, { 178,16054 }, { 179,16054 }, { 180,16054 }, + { 181,16054 }, { 182,16054 }, { 183,16054 }, { 184,16054 }, { 185,16054 }, + { 186,16054 }, { 187,16054 }, { 188,16054 }, { 189,16054 }, { 190,16054 }, + { 191,16054 }, { 192,16054 }, { 193,16054 }, { 194,16054 }, { 195,16054 }, + { 196,16054 }, { 197,16054 }, { 198,16054 }, { 199,16054 }, { 200,16054 }, + { 201,16054 }, { 202,16054 }, { 203,16054 }, { 204,16054 }, { 205,16054 }, + { 206,16054 }, { 207,16054 }, { 208,16054 }, { 209,16054 }, { 210,16054 }, + { 211,16054 }, { 212,16054 }, { 213,16054 }, { 214,16054 }, { 215,16054 }, + { 216,16054 }, { 217,16054 }, { 218,16054 }, { 219,16054 }, { 220,16054 }, + { 221,16054 }, { 222,16054 }, { 223,16054 }, { 224,16054 }, { 225,16054 }, + + { 226,16054 }, { 227,16054 }, { 228,16054 }, { 229,16054 }, { 230,16054 }, + { 231,16054 }, { 232,16054 }, { 233,16054 }, { 234,16054 }, { 235,16054 }, + { 236,16054 }, { 237,16054 }, { 238,16054 }, { 239,16054 }, { 240,16054 }, + { 241,16054 }, { 242,16054 }, { 243,16054 }, { 244,16054 }, { 245,16054 }, + { 246,16054 }, { 247,16054 }, { 248,16054 }, { 249,16054 }, { 250,16054 }, + { 251,16054 }, { 252,16054 }, { 253,16054 }, { 254,16054 }, { 255,16054 }, + { 0, 140 }, { 0,94808 }, { 1,16054 }, { 2,16054 }, { 3,16054 }, + { 4,16054 }, { 5,16054 }, { 6,16054 }, { 7,16054 }, { 8,16054 }, + { 9,16054 }, { 0, 0 }, { 11,16054 }, { 12,16054 }, { 0, 0 }, + { 14,16054 }, { 15,16054 }, { 16,16054 }, { 17,16054 }, { 18,16054 }, + + { 19,16054 }, { 20,16054 }, { 21,16054 }, { 22,16054 }, { 23,16054 }, + { 24,16054 }, { 25,16054 }, { 26,16054 }, { 27,16054 }, { 28,16054 }, + { 29,16054 }, { 30,16054 }, { 31,16054 }, { 32,16054 }, { 33,16054 }, + { 34,16054 }, { 35,16054 }, { 36,16054 }, { 37,16054 }, { 38,16054 }, + { 39,16054 }, { 40,16054 }, { 41,16054 }, { 42,16054 }, { 43,16054 }, + { 44,16054 }, { 45,16054 }, { 46,16054 }, { 47,16054 }, { 48,16054 }, + { 49,16054 }, { 50,16054 }, { 51,16054 }, { 52,16054 }, { 53,16054 }, + { 54,16054 }, { 55,16054 }, { 56,16054 }, { 57,16054 }, { 58,16054 }, + { 59,16054 }, { 60,16054 }, { 61,16054 }, { 62,16054 }, { 63,16054 }, + { 64,16054 }, { 65,16054 }, { 66,16054 }, { 67,16054 }, { 68,16054 }, + + { 69,16054 }, { 70,16054 }, { 71,16054 }, { 72,16054 }, { 73,16054 }, + { 74,16054 }, { 75,16054 }, { 76,16054 }, { 77,16054 }, { 78,16054 }, + { 79,16054 }, { 80,16054 }, { 81,16054 }, { 82,16054 }, { 83,16054 }, + { 84,16054 }, { 85,16054 }, { 86,16054 }, { 87,16054 }, { 88,16054 }, + { 89,16054 }, { 90,16054 }, { 91,16054 }, { 92,16054 }, { 93,16054 }, + { 94,16054 }, { 95,16054 }, { 96,16054 }, { 97,16054 }, { 98,16054 }, + { 99,16054 }, { 100,16054 }, { 101,16054 }, { 102,16054 }, { 103,16054 }, + { 104,16054 }, { 105,16054 }, { 106,16054 }, { 107,16054 }, { 108,16054 }, + { 109,16054 }, { 110,16054 }, { 111,16054 }, { 112,16054 }, { 113,16054 }, + { 114,16054 }, { 115,16054 }, { 116,16054 }, { 117,16054 }, { 118,16054 }, + + { 119,16054 }, { 120,16054 }, { 121,16054 }, { 122,16054 }, { 123,16054 }, + { 124,16054 }, { 125,16054 }, { 126,16054 }, { 127,16054 }, { 128,16054 }, + { 129,16054 }, { 130,16054 }, { 131,16054 }, { 132,16054 }, { 133,16054 }, + { 134,16054 }, { 135,16054 }, { 136,16054 }, { 137,16054 }, { 138,16054 }, + { 139,16054 }, { 140,16054 }, { 141,16054 }, { 142,16054 }, { 143,16054 }, + { 144,16054 }, { 145,16054 }, { 146,16054 }, { 147,16054 }, { 148,16054 }, + { 149,16054 }, { 150,16054 }, { 151,16054 }, { 152,16054 }, { 153,16054 }, + { 154,16054 }, { 155,16054 }, { 156,16054 }, { 157,16054 }, { 158,16054 }, + { 159,16054 }, { 160,16054 }, { 161,16054 }, { 162,16054 }, { 163,16054 }, + { 164,16054 }, { 165,16054 }, { 166,16054 }, { 167,16054 }, { 168,16054 }, + + { 169,16054 }, { 170,16054 }, { 171,16054 }, { 172,16054 }, { 173,16054 }, + { 174,16054 }, { 175,16054 }, { 176,16054 }, { 177,16054 }, { 178,16054 }, + { 179,16054 }, { 180,16054 }, { 181,16054 }, { 182,16054 }, { 183,16054 }, + { 184,16054 }, { 185,16054 }, { 186,16054 }, { 187,16054 }, { 188,16054 }, + { 189,16054 }, { 190,16054 }, { 191,16054 }, { 192,16054 }, { 193,16054 }, + { 194,16054 }, { 195,16054 }, { 196,16054 }, { 197,16054 }, { 198,16054 }, + { 199,16054 }, { 200,16054 }, { 201,16054 }, { 202,16054 }, { 203,16054 }, + { 204,16054 }, { 205,16054 }, { 206,16054 }, { 207,16054 }, { 208,16054 }, + { 209,16054 }, { 210,16054 }, { 211,16054 }, { 212,16054 }, { 213,16054 }, + { 214,16054 }, { 215,16054 }, { 216,16054 }, { 217,16054 }, { 218,16054 }, + + { 219,16054 }, { 220,16054 }, { 221,16054 }, { 222,16054 }, { 223,16054 }, + { 224,16054 }, { 225,16054 }, { 226,16054 }, { 227,16054 }, { 228,16054 }, + { 229,16054 }, { 230,16054 }, { 231,16054 }, { 232,16054 }, { 233,16054 }, + { 234,16054 }, { 235,16054 }, { 236,16054 }, { 237,16054 }, { 238,16054 }, + { 239,16054 }, { 240,16054 }, { 241,16054 }, { 242,16054 }, { 243,16054 }, + { 244,16054 }, { 245,16054 }, { 246,16054 }, { 247,16054 }, { 248,16054 }, + { 249,16054 }, { 250,16054 }, { 251,16054 }, { 252,16054 }, { 253,16054 }, + { 254,16054 }, { 255,16054 }, { 256,16054 }, { 0, 140 }, { 0,94550 }, + { 1,15796 }, { 2,15796 }, { 3,15796 }, { 4,15796 }, { 5,15796 }, + { 6,15796 }, { 7,15796 }, { 8,15796 }, { 9,15796 }, { 10,2461 }, + + { 11,15796 }, { 12,15796 }, { 13,2463 }, { 14,15796 }, { 15,15796 }, + { 16,15796 }, { 17,15796 }, { 18,15796 }, { 19,15796 }, { 20,15796 }, + { 21,15796 }, { 22,15796 }, { 23,15796 }, { 24,15796 }, { 25,15796 }, + { 26,15796 }, { 27,15796 }, { 28,15796 }, { 29,15796 }, { 30,15796 }, + { 31,15796 }, { 32,15796 }, { 33,15796 }, { 34,15796 }, { 35,15796 }, + { 36,15796 }, { 37,15796 }, { 38,15796 }, { 39,15796 }, { 40,15796 }, + { 41,15796 }, { 42,15796 }, { 43,15796 }, { 44,15796 }, { 45,15796 }, + { 46,15796 }, { 47,15796 }, { 48,16054 }, { 49,16054 }, { 50,16054 }, + { 51,16054 }, { 52,16054 }, { 53,16054 }, { 54,16054 }, { 55,16054 }, + { 56,16054 }, { 57,16054 }, { 58,15796 }, { 59,16312 }, { 60,15796 }, + + { 61,15796 }, { 62,15796 }, { 63,15796 }, { 64,15796 }, { 65,16054 }, + { 66,16054 }, { 67,16054 }, { 68,16054 }, { 69,16054 }, { 70,16054 }, + { 71,16054 }, { 72,16054 }, { 73,16054 }, { 74,16054 }, { 75,16054 }, + { 76,16054 }, { 77,16054 }, { 78,16054 }, { 79,16054 }, { 80,16054 }, + { 81,16054 }, { 82,16054 }, { 83,16054 }, { 84,16054 }, { 85,16054 }, + { 86,16054 }, { 87,16054 }, { 88,16054 }, { 89,16054 }, { 90,16054 }, + { 91,15796 }, { 92,15796 }, { 93,15796 }, { 94,15796 }, { 95,16054 }, + { 96,15796 }, { 97,16054 }, { 98,16054 }, { 99,16054 }, { 100,16054 }, + { 101,16054 }, { 102,16054 }, { 103,16054 }, { 104,16054 }, { 105,16054 }, + { 106,16054 }, { 107,16054 }, { 108,16054 }, { 109,16054 }, { 110,16054 }, + + { 111,16054 }, { 112,16054 }, { 113,16054 }, { 114,16054 }, { 115,16054 }, + { 116,16054 }, { 117,16054 }, { 118,16054 }, { 119,16054 }, { 120,16054 }, + { 121,16054 }, { 122,16054 }, { 123,15796 }, { 124,15796 }, { 125,15796 }, + { 126,15796 }, { 127,16054 }, { 128,16054 }, { 129,16054 }, { 130,16054 }, + { 131,16054 }, { 132,16054 }, { 133,16054 }, { 134,16054 }, { 135,16054 }, + { 136,16054 }, { 137,16054 }, { 138,16054 }, { 139,16054 }, { 140,16054 }, + { 141,16054 }, { 142,16054 }, { 143,16054 }, { 144,16054 }, { 145,16054 }, + { 146,16054 }, { 147,16054 }, { 148,16054 }, { 149,16054 }, { 150,16054 }, + { 151,16054 }, { 152,16054 }, { 153,16054 }, { 154,16054 }, { 155,16054 }, + { 156,16054 }, { 157,16054 }, { 158,16054 }, { 159,16054 }, { 160,16054 }, + + { 161,16054 }, { 162,16054 }, { 163,16054 }, { 164,16054 }, { 165,16054 }, + { 166,16054 }, { 167,16054 }, { 168,16054 }, { 169,16054 }, { 170,16054 }, + { 171,16054 }, { 172,16054 }, { 173,16054 }, { 174,16054 }, { 175,16054 }, + { 176,16054 }, { 177,16054 }, { 178,16054 }, { 179,16054 }, { 180,16054 }, + { 181,16054 }, { 182,16054 }, { 183,16054 }, { 184,16054 }, { 185,16054 }, + { 186,16054 }, { 187,16054 }, { 188,16054 }, { 189,16054 }, { 190,16054 }, + { 191,16054 }, { 192,16054 }, { 193,16054 }, { 194,16054 }, { 195,16054 }, + { 196,16054 }, { 197,16054 }, { 198,16054 }, { 199,16054 }, { 200,16054 }, + { 201,16054 }, { 202,16054 }, { 203,16054 }, { 204,16054 }, { 205,16054 }, + { 206,16054 }, { 207,16054 }, { 208,16054 }, { 209,16054 }, { 210,16054 }, + + { 211,16054 }, { 212,16054 }, { 213,16054 }, { 214,16054 }, { 215,16054 }, + { 216,16054 }, { 217,16054 }, { 218,16054 }, { 219,16054 }, { 220,16054 }, + { 221,16054 }, { 222,16054 }, { 223,16054 }, { 224,16054 }, { 225,16054 }, + { 226,16054 }, { 227,16054 }, { 228,16054 }, { 229,16054 }, { 230,16054 }, + { 231,16054 }, { 232,16054 }, { 233,16054 }, { 234,16054 }, { 235,16054 }, + { 236,16054 }, { 237,16054 }, { 238,16054 }, { 239,16054 }, { 240,16054 }, + { 241,16054 }, { 242,16054 }, { 243,16054 }, { 244,16054 }, { 245,16054 }, + { 246,16054 }, { 247,16054 }, { 248,16054 }, { 249,16054 }, { 250,16054 }, + { 251,16054 }, { 252,16054 }, { 253,16054 }, { 254,16054 }, { 255,16054 }, + { 256,15796 }, { 0, 131 }, { 0,94292 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 34,3454 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 39,3712 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,2169 }, { 49,2169 }, { 50,2169 }, { 51,2169 }, { 52,2169 }, + + { 53,2169 }, { 54,2169 }, { 55,2169 }, { 56,2169 }, { 57,2169 }, + { 0, 0 }, { 0, 0 }, { 60,2171 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,2169 }, { 66,2169 }, { 67,2169 }, + { 68,2169 }, { 69,2169 }, { 70,2169 }, { 71,2169 }, { 72,2169 }, + { 73,2169 }, { 74,2169 }, { 75,2169 }, { 76,2169 }, { 77,2169 }, + { 78,2169 }, { 79,2169 }, { 80,2169 }, { 81,2169 }, { 82,2169 }, + { 83,2169 }, { 84,2169 }, { 85,2169 }, { 86,2169 }, { 87,2169 }, + { 88,2169 }, { 89,2169 }, { 90,2169 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,2169 }, { 0, 0 }, { 97,2169 }, + { 98,2169 }, { 99,2169 }, { 100,2169 }, { 101,2169 }, { 102,2169 }, + + { 103,2169 }, { 104,2169 }, { 105,2169 }, { 106,2169 }, { 107,2169 }, + { 108,2169 }, { 109,2169 }, { 110,2169 }, { 111,2169 }, { 112,2169 }, + { 113,2169 }, { 114,2169 }, { 115,2169 }, { 116,2169 }, { 117,2169 }, + { 118,2169 }, { 119,2169 }, { 120,2169 }, { 121,2169 }, { 122,2169 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,2169 }, + { 128,2169 }, { 129,2169 }, { 130,2169 }, { 131,2169 }, { 132,2169 }, + { 133,2169 }, { 134,2169 }, { 135,2169 }, { 136,2169 }, { 137,2169 }, + { 138,2169 }, { 139,2169 }, { 140,2169 }, { 141,2169 }, { 142,2169 }, + { 143,2169 }, { 144,2169 }, { 145,2169 }, { 146,2169 }, { 147,2169 }, + { 148,2169 }, { 149,2169 }, { 150,2169 }, { 151,2169 }, { 152,2169 }, + + { 153,2169 }, { 154,2169 }, { 155,2169 }, { 156,2169 }, { 157,2169 }, + { 158,2169 }, { 159,2169 }, { 160,2169 }, { 161,2169 }, { 162,2169 }, + { 163,2169 }, { 164,2169 }, { 165,2169 }, { 166,2169 }, { 167,2169 }, + { 168,2169 }, { 169,2169 }, { 170,2169 }, { 171,2169 }, { 172,2169 }, + { 173,2169 }, { 174,2169 }, { 175,2169 }, { 176,2169 }, { 177,2169 }, + { 178,2169 }, { 179,2169 }, { 180,2169 }, { 181,2169 }, { 182,2169 }, + { 183,2169 }, { 184,2169 }, { 185,2169 }, { 186,2169 }, { 187,2169 }, + { 188,2169 }, { 189,2169 }, { 190,2169 }, { 191,2169 }, { 192,2169 }, + { 193,2169 }, { 194,2169 }, { 195,2169 }, { 196,2169 }, { 197,2169 }, + { 198,2169 }, { 199,2169 }, { 200,2169 }, { 201,2169 }, { 202,2169 }, + + { 203,2169 }, { 204,2169 }, { 205,2169 }, { 206,2169 }, { 207,2169 }, + { 208,2169 }, { 209,2169 }, { 210,2169 }, { 211,2169 }, { 212,2169 }, + { 213,2169 }, { 214,2169 }, { 215,2169 }, { 216,2169 }, { 217,2169 }, + { 218,2169 }, { 219,2169 }, { 220,2169 }, { 221,2169 }, { 222,2169 }, + { 223,2169 }, { 224,2169 }, { 225,2169 }, { 226,2169 }, { 227,2169 }, + { 228,2169 }, { 229,2169 }, { 230,2169 }, { 231,2169 }, { 232,2169 }, + { 233,2169 }, { 234,2169 }, { 235,2169 }, { 236,2169 }, { 237,2169 }, + { 238,2169 }, { 239,2169 }, { 240,2169 }, { 241,2169 }, { 242,2169 }, + { 243,2169 }, { 244,2169 }, { 245,2169 }, { 246,2169 }, { 247,2169 }, + { 248,2169 }, { 249,2169 }, { 250,2169 }, { 251,2169 }, { 252,2169 }, + + { 253,2169 }, { 254,2169 }, { 255,2169 }, { 0, 4 }, { 0,94035 }, + { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 }, + { 6, 0 }, { 7, 0 }, { 8, 0 }, { 9, 0 }, { 10, 0 }, + { 11, 0 }, { 12, 0 }, { 13, 0 }, { 14, 0 }, { 15, 0 }, + { 16, 0 }, { 17, 0 }, { 18, 0 }, { 19, 0 }, { 20, 0 }, + { 21, 0 }, { 22, 0 }, { 23, 0 }, { 24, 0 }, { 25, 0 }, + { 26, 0 }, { 27, 0 }, { 28, 0 }, { 29, 0 }, { 30, 0 }, + { 31, 0 }, { 32, 0 }, { 33, 0 }, { 34, 0 }, { 35, 0 }, + { 36, 0 }, { 37, 0 }, { 38, 0 }, { 39, 0 }, { 40, 0 }, + { 41, 0 }, { 42, 0 }, { 43, 0 }, { 44, 0 }, { 45, 0 }, + + { 46, 0 }, { 47, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 }, + { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 }, + { 56, 0 }, { 57, 0 }, { 58, 0 }, { 59, 0 }, { 0, 0 }, + { 61, 0 }, { 62, 0 }, { 63, 0 }, { 64, 0 }, { 65, 0 }, + { 66, 0 }, { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 }, + { 71, 0 }, { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 }, + { 76, 0 }, { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 }, + { 81, 0 }, { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 }, + { 86, 0 }, { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 }, + { 91, 0 }, { 92, 0 }, { 93, 0 }, { 94, 0 }, { 95, 0 }, + + { 96, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 }, + { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 }, + { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 }, + { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 }, + { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 }, + { 121, 0 }, { 122, 0 }, { 123, 0 }, { 124, 0 }, { 125, 0 }, + { 126, 0 }, { 127, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 }, + { 131, 0 }, { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 }, + { 136, 0 }, { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 }, + { 141, 0 }, { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 }, + + { 146, 0 }, { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 }, + { 151, 0 }, { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 }, + { 156, 0 }, { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 }, + { 161, 0 }, { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 }, + { 166, 0 }, { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 }, + { 171, 0 }, { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 }, + { 176, 0 }, { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 }, + { 181, 0 }, { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 }, + { 186, 0 }, { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 }, + { 191, 0 }, { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 }, + + { 196, 0 }, { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 }, + { 201, 0 }, { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 }, + { 206, 0 }, { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 }, + { 211, 0 }, { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 }, + { 216, 0 }, { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 }, + { 221, 0 }, { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 }, + { 226, 0 }, { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 }, + { 231, 0 }, { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 }, + { 236, 0 }, { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 }, + { 241, 0 }, { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 }, + + { 246, 0 }, { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 }, + { 251, 0 }, { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 }, + { 256, 0 }, { 0, 2 }, { 0,93777 }, { 0, 9 }, { 0,93775 }, + { 0, 106 }, { 0,93773 }, { 0, 133 }, { 0,93771 }, { 0, 97 }, + { 0,93769 }, { 0, 104 }, { 0,93767 }, { 9, 0 }, { 10, 0 }, + { 0, 98 }, { 0,93763 }, { 13, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 32, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 61,1692 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 61,1928 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 80,1930 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 112,1930 }, + { 0, 0 }, { 0,93663 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, + { 4, 0 }, { 5, 0 }, { 6, 0 }, { 7, 0 }, { 8, 0 }, + { 9, 0 }, { 10, 0 }, { 11, 0 }, { 12, 0 }, { 13, 0 }, + { 14, 0 }, { 15, 0 }, { 16, 0 }, { 17, 0 }, { 18, 0 }, + { 19, 0 }, { 20, 0 }, { 21, 0 }, { 22, 0 }, { 23, 0 }, + + { 24, 0 }, { 25, 0 }, { 26, 0 }, { 27, 0 }, { 28, 0 }, + { 29, 0 }, { 30, 0 }, { 31, 0 }, { 32, 0 }, { 33, 0 }, + { 34,-108 }, { 35, 0 }, { 36, 0 }, { 37, 0 }, { 38, 0 }, + { 39, 0 }, { 40, 0 }, { 41, 0 }, { 42, 0 }, { 43, 0 }, + { 44, 0 }, { 45, 0 }, { 46, 0 }, { 47, 0 }, { 48, 0 }, + { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 }, + { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 }, { 58, 0 }, + { 59, 0 }, { 60, 0 }, { 61, 0 }, { 62, 0 }, { 63, 0 }, + { 64, 0 }, { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 }, + { 69, 0 }, { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 }, + + { 74, 0 }, { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 }, + { 79, 0 }, { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 }, + { 84, 0 }, { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 }, + { 89, 0 }, { 90, 0 }, { 91, 0 }, { 92, 258 }, { 93, 0 }, + { 94, 0 }, { 95, 0 }, { 96, 0 }, { 97, 0 }, { 98, 0 }, + { 99, 0 }, { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 }, + { 104, 0 }, { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 }, + { 109, 0 }, { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 }, + { 114, 0 }, { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 }, + { 119, 0 }, { 120, 0 }, { 121, 0 }, { 122, 0 }, { 123, 0 }, + + { 124, 0 }, { 125, 0 }, { 126, 0 }, { 127, 0 }, { 128, 0 }, + { 129, 0 }, { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 }, + { 134, 0 }, { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 }, + { 139, 0 }, { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 }, + { 144, 0 }, { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 }, + { 149, 0 }, { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 }, + { 154, 0 }, { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 }, + { 159, 0 }, { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 }, + { 164, 0 }, { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 }, + { 169, 0 }, { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 }, + + { 174, 0 }, { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 }, + { 179, 0 }, { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 }, + { 184, 0 }, { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 }, + { 189, 0 }, { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 }, + { 194, 0 }, { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 }, + { 199, 0 }, { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 }, + { 204, 0 }, { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 }, + { 209, 0 }, { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 }, + { 214, 0 }, { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 }, + { 219, 0 }, { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 }, + + { 224, 0 }, { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 }, + { 229, 0 }, { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 }, + { 234, 0 }, { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 }, + { 239, 0 }, { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 }, + { 244, 0 }, { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 }, + { 249, 0 }, { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 }, + { 254, 0 }, { 255, 0 }, { 256, 0 }, { 0, 0 }, { 0,93405 }, + { 1,15425 }, { 2,15425 }, { 3,15425 }, { 4,15425 }, { 5,15425 }, + { 6,15425 }, { 7,15425 }, { 8,15425 }, { 9,15425 }, { 10,15425 }, + { 11,15425 }, { 12,15425 }, { 13,15425 }, { 14,15425 }, { 15,15425 }, + + { 16,15425 }, { 17,15425 }, { 18,15425 }, { 19,15425 }, { 20,15425 }, + { 21,15425 }, { 22,15425 }, { 23,15425 }, { 24,15425 }, { 25,15425 }, + { 26,15425 }, { 27,15425 }, { 28,15425 }, { 29,15425 }, { 30,15425 }, + { 31,15425 }, { 32,15425 }, { 33,15425 }, { 34,15425 }, { 35,15425 }, + { 36,15425 }, { 37,15425 }, { 38,15425 }, { 39,15425 }, { 40,15425 }, + { 41,15425 }, { 42,15425 }, { 43,15425 }, { 44,15425 }, { 45,15425 }, + { 46,15425 }, { 47,15425 }, { 48,15425 }, { 49,15425 }, { 50,15425 }, + { 51,15425 }, { 52,15425 }, { 53,15425 }, { 54,15425 }, { 55,15425 }, + { 56,15425 }, { 57,15425 }, { 58,15425 }, { 59,15425 }, { 60,15425 }, + { 61,15425 }, { 62,15425 }, { 63,15425 }, { 64,15425 }, { 65,15425 }, + + { 66,15425 }, { 67,15425 }, { 68,15425 }, { 69,15425 }, { 70,15425 }, + { 71,15425 }, { 72,15425 }, { 73,15425 }, { 74,15425 }, { 75,15425 }, + { 76,15425 }, { 77,15425 }, { 78,15425 }, { 79,15425 }, { 80,15425 }, + { 81,15425 }, { 82,15425 }, { 83,15425 }, { 84,15425 }, { 85,15425 }, + { 86,15425 }, { 87,15425 }, { 88,15425 }, { 89,15425 }, { 90,15425 }, + { 91,15425 }, { 92,15425 }, { 93,15425 }, { 94,15425 }, { 95,15425 }, + { 96,15425 }, { 97,15425 }, { 98,15425 }, { 99,15425 }, { 100,15425 }, + { 101,15425 }, { 102,15425 }, { 103,15425 }, { 104,15425 }, { 105,15425 }, + { 106,15425 }, { 107,15425 }, { 108,15425 }, { 109,15425 }, { 110,15425 }, + { 111,15425 }, { 112,15425 }, { 113,15425 }, { 114,15425 }, { 115,15425 }, + + { 116,15425 }, { 117,15425 }, { 118,15425 }, { 119,15425 }, { 120,15425 }, + { 121,15425 }, { 122,15425 }, { 123,15425 }, { 124,15425 }, { 125,15425 }, + { 126,15425 }, { 127,15425 }, { 128,15425 }, { 129,15425 }, { 130,15425 }, + { 131,15425 }, { 132,15425 }, { 133,15425 }, { 134,15425 }, { 135,15425 }, + { 136,15425 }, { 137,15425 }, { 138,15425 }, { 139,15425 }, { 140,15425 }, + { 141,15425 }, { 142,15425 }, { 143,15425 }, { 144,15425 }, { 145,15425 }, + { 146,15425 }, { 147,15425 }, { 148,15425 }, { 149,15425 }, { 150,15425 }, + { 151,15425 }, { 152,15425 }, { 153,15425 }, { 154,15425 }, { 155,15425 }, + { 156,15425 }, { 157,15425 }, { 158,15425 }, { 159,15425 }, { 160,15425 }, + { 161,15425 }, { 162,15425 }, { 163,15425 }, { 164,15425 }, { 165,15425 }, + + { 166,15425 }, { 167,15425 }, { 168,15425 }, { 169,15425 }, { 170,15425 }, + { 171,15425 }, { 172,15425 }, { 173,15425 }, { 174,15425 }, { 175,15425 }, + { 176,15425 }, { 177,15425 }, { 178,15425 }, { 179,15425 }, { 180,15425 }, + { 181,15425 }, { 182,15425 }, { 183,15425 }, { 184,15425 }, { 185,15425 }, + { 186,15425 }, { 187,15425 }, { 188,15425 }, { 189,15425 }, { 190,15425 }, + { 191,15425 }, { 192,15425 }, { 193,15425 }, { 194,15425 }, { 195,15425 }, + { 196,15425 }, { 197,15425 }, { 198,15425 }, { 199,15425 }, { 200,15425 }, + { 201,15425 }, { 202,15425 }, { 203,15425 }, { 204,15425 }, { 205,15425 }, + { 206,15425 }, { 207,15425 }, { 208,15425 }, { 209,15425 }, { 210,15425 }, + { 211,15425 }, { 212,15425 }, { 213,15425 }, { 214,15425 }, { 215,15425 }, + + { 216,15425 }, { 217,15425 }, { 218,15425 }, { 219,15425 }, { 220,15425 }, + { 221,15425 }, { 222,15425 }, { 223,15425 }, { 224,15425 }, { 225,15425 }, + { 226,15425 }, { 227,15425 }, { 228,15425 }, { 229,15425 }, { 230,15425 }, + { 231,15425 }, { 232,15425 }, { 233,15425 }, { 234,15425 }, { 235,15425 }, + { 236,15425 }, { 237,15425 }, { 238,15425 }, { 239,15425 }, { 240,15425 }, + { 241,15425 }, { 242,15425 }, { 243,15425 }, { 244,15425 }, { 245,15425 }, + { 246,15425 }, { 247,15425 }, { 248,15425 }, { 249,15425 }, { 250,15425 }, + { 251,15425 }, { 252,15425 }, { 253,15425 }, { 254,15425 }, { 255,15425 }, + { 256,15425 }, { 0, 132 }, { 0,93147 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0,93138 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,15425 }, { 49,15425 }, { 50,15425 }, { 51,15425 }, { 52,15425 }, + { 53,15425 }, { 54,15425 }, { 55,15425 }, { 56,15425 }, { 57,15425 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,15425 }, { 66,15425 }, { 67,15425 }, + { 68,15425 }, { 69,15425 }, { 70,15425 }, { 71,15425 }, { 72,15425 }, + { 73,15425 }, { 74,15425 }, { 75,15425 }, { 76,15425 }, { 77,15425 }, + { 78,15425 }, { 79,15425 }, { 80,15425 }, { 81,15425 }, { 82,15425 }, + { 83,15425 }, { 84,15425 }, { 85,15425 }, { 86,15425 }, { 87,15425 }, + { 88,15425 }, { 89,15425 }, { 90,15425 }, { 82,1538 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,15425 }, { 0, 0 }, { 97,15425 }, + { 98,15425 }, { 99,15425 }, { 100,15425 }, { 101,15425 }, { 102,15425 }, + { 103,15425 }, { 104,15425 }, { 105,15425 }, { 106,15425 }, { 107,15425 }, + + { 108,15425 }, { 109,15425 }, { 110,15425 }, { 111,15425 }, { 112,15425 }, + { 113,15425 }, { 114,15425 }, { 115,15425 }, { 116,15425 }, { 117,15425 }, + { 118,15425 }, { 119,15425 }, { 120,15425 }, { 121,15425 }, { 122,15425 }, + { 114,1538 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,15425 }, + { 128,15425 }, { 129,15425 }, { 130,15425 }, { 131,15425 }, { 132,15425 }, + { 133,15425 }, { 134,15425 }, { 135,15425 }, { 136,15425 }, { 137,15425 }, + { 138,15425 }, { 139,15425 }, { 140,15425 }, { 141,15425 }, { 142,15425 }, + { 143,15425 }, { 144,15425 }, { 145,15425 }, { 146,15425 }, { 147,15425 }, + { 148,15425 }, { 149,15425 }, { 150,15425 }, { 151,15425 }, { 152,15425 }, + { 153,15425 }, { 154,15425 }, { 155,15425 }, { 156,15425 }, { 157,15425 }, + + { 158,15425 }, { 159,15425 }, { 160,15425 }, { 161,15425 }, { 162,15425 }, + { 163,15425 }, { 164,15425 }, { 165,15425 }, { 166,15425 }, { 167,15425 }, + { 168,15425 }, { 169,15425 }, { 170,15425 }, { 171,15425 }, { 172,15425 }, + { 173,15425 }, { 174,15425 }, { 175,15425 }, { 176,15425 }, { 177,15425 }, + { 178,15425 }, { 179,15425 }, { 180,15425 }, { 181,15425 }, { 182,15425 }, + { 183,15425 }, { 184,15425 }, { 185,15425 }, { 186,15425 }, { 187,15425 }, + { 188,15425 }, { 189,15425 }, { 190,15425 }, { 191,15425 }, { 192,15425 }, + { 193,15425 }, { 194,15425 }, { 195,15425 }, { 196,15425 }, { 197,15425 }, + { 198,15425 }, { 199,15425 }, { 200,15425 }, { 201,15425 }, { 202,15425 }, + { 203,15425 }, { 204,15425 }, { 205,15425 }, { 206,15425 }, { 207,15425 }, + + { 208,15425 }, { 209,15425 }, { 210,15425 }, { 211,15425 }, { 212,15425 }, + { 213,15425 }, { 214,15425 }, { 215,15425 }, { 216,15425 }, { 217,15425 }, + { 218,15425 }, { 219,15425 }, { 220,15425 }, { 221,15425 }, { 222,15425 }, + { 223,15425 }, { 224,15425 }, { 225,15425 }, { 226,15425 }, { 227,15425 }, + { 228,15425 }, { 229,15425 }, { 230,15425 }, { 231,15425 }, { 232,15425 }, + { 233,15425 }, { 234,15425 }, { 235,15425 }, { 236,15425 }, { 237,15425 }, + { 238,15425 }, { 239,15425 }, { 240,15425 }, { 241,15425 }, { 242,15425 }, + { 243,15425 }, { 244,15425 }, { 245,15425 }, { 246,15425 }, { 247,15425 }, + { 248,15425 }, { 249,15425 }, { 250,15425 }, { 251,15425 }, { 252,15425 }, + { 253,15425 }, { 254,15425 }, { 255,15425 }, { 0, 0 }, { 0,92890 }, + + { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 }, + { 6, 0 }, { 7, 0 }, { 8, 0 }, { 9, 0 }, { 10, 0 }, + { 11, 0 }, { 12, 0 }, { 13, 0 }, { 14, 0 }, { 15, 0 }, + { 16, 0 }, { 17, 0 }, { 18, 0 }, { 19, 0 }, { 20, 0 }, + { 21, 0 }, { 22, 0 }, { 23, 0 }, { 24, 0 }, { 25, 0 }, + { 26, 0 }, { 27, 0 }, { 28, 0 }, { 29, 0 }, { 30, 0 }, + { 31, 0 }, { 32, 0 }, { 33, 0 }, { 34, 0 }, { 35, 0 }, + { 36, 0 }, { 37, 0 }, { 38, 0 }, { 39,-881 }, { 40, 0 }, + { 41, 0 }, { 42, 0 }, { 43, 0 }, { 44, 0 }, { 45, 0 }, + { 46, 0 }, { 47, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 }, + + { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 }, + { 56, 0 }, { 57, 0 }, { 58, 0 }, { 59, 0 }, { 60, 0 }, + { 61, 0 }, { 62, 0 }, { 63, 0 }, { 64, 0 }, { 65, 0 }, + { 66, 0 }, { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 }, + { 71, 0 }, { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 }, + { 76, 0 }, { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 }, + { 81, 0 }, { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 }, + { 86, 0 }, { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 }, + { 91, 0 }, { 92, 258 }, { 93, 0 }, { 94, 0 }, { 95, 0 }, + { 96, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 }, + + { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 }, + { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 }, + { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 }, + { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 }, + { 121, 0 }, { 122, 0 }, { 123, 0 }, { 124, 0 }, { 125, 0 }, + { 126, 0 }, { 127, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 }, + { 131, 0 }, { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 }, + { 136, 0 }, { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 }, + { 141, 0 }, { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 }, + { 146, 0 }, { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 }, + + { 151, 0 }, { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 }, + { 156, 0 }, { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 }, + { 161, 0 }, { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 }, + { 166, 0 }, { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 }, + { 171, 0 }, { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 }, + { 176, 0 }, { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 }, + { 181, 0 }, { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 }, + { 186, 0 }, { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 }, + { 191, 0 }, { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 }, + { 196, 0 }, { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 }, + + { 201, 0 }, { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 }, + { 206, 0 }, { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 }, + { 211, 0 }, { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 }, + { 216, 0 }, { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 }, + { 221, 0 }, { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 }, + { 226, 0 }, { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 }, + { 231, 0 }, { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 }, + { 236, 0 }, { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 }, + { 241, 0 }, { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 }, + { 246, 0 }, { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 }, + + { 251, 0 }, { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 }, + { 256, 0 }, { 0, 0 }, { 0,92632 }, { 1,15167 }, { 2,15167 }, + { 3,15167 }, { 4,15167 }, { 5,15167 }, { 6,15167 }, { 7,15167 }, + { 8,15167 }, { 9,15167 }, { 10,15167 }, { 11,15167 }, { 12,15167 }, + { 13,15167 }, { 14,15167 }, { 15,15167 }, { 16,15167 }, { 17,15167 }, + { 18,15167 }, { 19,15167 }, { 20,15167 }, { 21,15167 }, { 22,15167 }, + { 23,15167 }, { 24,15167 }, { 25,15167 }, { 26,15167 }, { 27,15167 }, + { 28,15167 }, { 29,15167 }, { 30,15167 }, { 31,15167 }, { 32,15167 }, + { 33,15167 }, { 34,15167 }, { 35,15167 }, { 36,15167 }, { 37,15167 }, + { 38,15167 }, { 39,15167 }, { 40,15167 }, { 41,15167 }, { 42,15167 }, + + { 43,15167 }, { 44,15167 }, { 45,15167 }, { 46,15167 }, { 47,15167 }, + { 48,15167 }, { 49,15167 }, { 50,15167 }, { 51,15167 }, { 52,15167 }, + { 53,15167 }, { 54,15167 }, { 55,15167 }, { 56,15167 }, { 57,15167 }, + { 58,15167 }, { 59,15167 }, { 60,15167 }, { 61,15167 }, { 62,15167 }, + { 63,15167 }, { 64,15167 }, { 65,15167 }, { 66,15167 }, { 67,15167 }, + { 68,15167 }, { 69,15167 }, { 70,15167 }, { 71,15167 }, { 72,15167 }, + { 73,15167 }, { 74,15167 }, { 75,15167 }, { 76,15167 }, { 77,15167 }, + { 78,15167 }, { 79,15167 }, { 80,15167 }, { 81,15167 }, { 82,15167 }, + { 83,15167 }, { 84,15167 }, { 85,15167 }, { 86,15167 }, { 87,15167 }, + { 88,15167 }, { 89,15167 }, { 90,15167 }, { 91,15167 }, { 92,15167 }, + + { 93,15167 }, { 94,15167 }, { 95,15167 }, { 96,15167 }, { 97,15167 }, + { 98,15167 }, { 99,15167 }, { 100,15167 }, { 101,15167 }, { 102,15167 }, + { 103,15167 }, { 104,15167 }, { 105,15167 }, { 106,15167 }, { 107,15167 }, + { 108,15167 }, { 109,15167 }, { 110,15167 }, { 111,15167 }, { 112,15167 }, + { 113,15167 }, { 114,15167 }, { 115,15167 }, { 116,15167 }, { 117,15167 }, + { 118,15167 }, { 119,15167 }, { 120,15167 }, { 121,15167 }, { 122,15167 }, + { 123,15167 }, { 124,15167 }, { 125,15167 }, { 126,15167 }, { 127,15167 }, + { 128,15167 }, { 129,15167 }, { 130,15167 }, { 131,15167 }, { 132,15167 }, + { 133,15167 }, { 134,15167 }, { 135,15167 }, { 136,15167 }, { 137,15167 }, + { 138,15167 }, { 139,15167 }, { 140,15167 }, { 141,15167 }, { 142,15167 }, + + { 143,15167 }, { 144,15167 }, { 145,15167 }, { 146,15167 }, { 147,15167 }, + { 148,15167 }, { 149,15167 }, { 150,15167 }, { 151,15167 }, { 152,15167 }, + { 153,15167 }, { 154,15167 }, { 155,15167 }, { 156,15167 }, { 157,15167 }, + { 158,15167 }, { 159,15167 }, { 160,15167 }, { 161,15167 }, { 162,15167 }, + { 163,15167 }, { 164,15167 }, { 165,15167 }, { 166,15167 }, { 167,15167 }, + { 168,15167 }, { 169,15167 }, { 170,15167 }, { 171,15167 }, { 172,15167 }, + { 173,15167 }, { 174,15167 }, { 175,15167 }, { 176,15167 }, { 177,15167 }, + { 178,15167 }, { 179,15167 }, { 180,15167 }, { 181,15167 }, { 182,15167 }, + { 183,15167 }, { 184,15167 }, { 185,15167 }, { 186,15167 }, { 187,15167 }, + { 188,15167 }, { 189,15167 }, { 190,15167 }, { 191,15167 }, { 192,15167 }, + + { 193,15167 }, { 194,15167 }, { 195,15167 }, { 196,15167 }, { 197,15167 }, + { 198,15167 }, { 199,15167 }, { 200,15167 }, { 201,15167 }, { 202,15167 }, + { 203,15167 }, { 204,15167 }, { 205,15167 }, { 206,15167 }, { 207,15167 }, + { 208,15167 }, { 209,15167 }, { 210,15167 }, { 211,15167 }, { 212,15167 }, + { 213,15167 }, { 214,15167 }, { 215,15167 }, { 216,15167 }, { 217,15167 }, + { 218,15167 }, { 219,15167 }, { 220,15167 }, { 221,15167 }, { 222,15167 }, + { 223,15167 }, { 224,15167 }, { 225,15167 }, { 226,15167 }, { 227,15167 }, + { 228,15167 }, { 229,15167 }, { 230,15167 }, { 231,15167 }, { 232,15167 }, + { 233,15167 }, { 234,15167 }, { 235,15167 }, { 236,15167 }, { 237,15167 }, + { 238,15167 }, { 239,15167 }, { 240,15167 }, { 241,15167 }, { 242,15167 }, + + { 243,15167 }, { 244,15167 }, { 245,15167 }, { 246,15167 }, { 247,15167 }, + { 248,15167 }, { 249,15167 }, { 250,15167 }, { 251,15167 }, { 252,15167 }, + { 253,15167 }, { 254,15167 }, { 255,15167 }, { 256,15167 }, { 0, 0 }, + { 0,92374 }, { 0, 0 }, { 0,92372 }, { 0, 0 }, { 0, 0 }, + { 0,92369 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 9, 0 }, + { 0, 0 }, { 0,92363 }, { 0, 0 }, { 0,92361 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0,92354 }, { 0, 0 }, { 0, 0 }, { 0,92351 }, { 0, 0 }, + { 0,92349 }, { 0, 0 }, { 0, 0 }, { 0,92346 }, { 0, 94 }, + { 0,92344 }, { 0, 0 }, { 32, 0 }, { 0, 113 }, { 0,92340 }, + + { 0, 92 }, { 0,92338 }, { 0, 114 }, { 0,92336 }, { 0, 93 }, + { 0,92334 }, { 0, 115 }, { 0,92332 }, { 0, 0 }, { 0,92330 }, + { 0, 96 }, { 0,92328 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 8 }, { 0,92323 }, { 0, 6 }, { 0,92321 }, { 0, 95 }, + { 0,92319 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-764 }, { 66, 2 }, { 0, 0 }, { 68, 5 }, { 0, 0 }, + { 70, 11 }, { 0, 0 }, { 0,92302 }, { 73, 13 }, { 0, 0 }, + { 73, 777 }, { 0, 130 }, { 0,92297 }, { 0, 0 }, { 79, 20 }, + { 0, 0 }, { 79,1032 }, { 82, 23 }, { 83, 25 }, { 79,1280 }, + + { 85, 28 }, { 66,2050 }, { 76,1281 }, { 0, 117 }, { 0,92285 }, + { 46,2278 }, { 78,2046 }, { 69,2057 }, { 42,2273 }, { 0, 0 }, + { 0, 0 }, { 0,92278 }, { 97,-764 }, { 98, 2 }, { 0, 0 }, + { 100, 5 }, { 0, 0 }, { 102, 11 }, { 0, 130 }, { 0,92270 }, + { 105, 13 }, { 78,2292 }, { 105, 777 }, { 0, 0 }, { 84,2293 }, + { 0, 0 }, { 111, 20 }, { 0, 0 }, { 111,1032 }, { 114, 23 }, + { 115, 25 }, { 111,1280 }, { 117, 28 }, { 98,2050 }, { 108,1281 }, + { 48,2281 }, { 49,2281 }, { 0, 0 }, { 110,2046 }, { 101,2057 }, + { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 }, + { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 }, + + { 0, 0 }, { 0, 129 }, { 0,92237 }, { 110,2292 }, { 0, 111 }, + { 0,92234 }, { 116,2293 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 69, 87 }, { 0, 109 }, { 0,92226 }, { 0, 106 }, + { 0,92224 }, { 0, 0 }, { 48,15063 }, { 49,15063 }, { 50,15063 }, + { 51,15063 }, { 52,15063 }, { 53,15063 }, { 54,15063 }, { 55,15063 }, + { 56,15063 }, { 57,15063 }, { 0, 0 }, { 0, 0 }, { 0,92210 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 105 }, { 0,92202 }, { 69, 60 }, { 0, 0 }, + { 0,92199 }, { 0, 116 }, { 0,92197 }, { 101, 87 }, { 83,2494 }, + { 0, 110 }, { 0,92193 }, { 0, 0 }, { 46, -33 }, { 0, 0 }, + + { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 }, + { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 }, + { 0, 112 }, { 0,92178 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 60,2452 }, { 61,2454 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 101, 60 }, { 69, 27 }, { 43,15013 }, { 0, 0 }, { 45,15013 }, + { 62,2448 }, { 115,2494 }, { 48,15025 }, { 49,15025 }, { 50,15025 }, + { 51,15025 }, { 52,15025 }, { 53,15025 }, { 54,15025 }, { 55,15025 }, + { 56,15025 }, { 57,15025 }, { 0, 0 }, { 48,15029 }, { 49,15029 }, + { 50,15029 }, { 51,15029 }, { 52,15029 }, { 53,15029 }, { 54,15029 }, + { 55,15029 }, { 56,15029 }, { 57,15029 }, { 61,2426 }, { 0, 0 }, + + { 0, 5 }, { 0,92138 }, { 0, 0 }, { 101, 27 }, { 0, 0 }, + { 65,15029 }, { 66,15029 }, { 67,15029 }, { 68,15029 }, { 69,15029 }, + { 70,15029 }, { 10,2367 }, { 0, 120 }, { 0,92126 }, { 13,2589 }, + { 0, 131 }, { 0,92123 }, { 0, 0 }, { 0,92121 }, { 0, 100 }, + { 0,92119 }, { 0, 0 }, { 61,2404 }, { 0, 134 }, { 0,92115 }, + { 0, 99 }, { 0,92113 }, { 0, 103 }, { 0,92111 }, { 0, 14 }, + { 0,92109 }, { 0, 17 }, { 0,92107 }, { 0, 10 }, { 0,92105 }, + { 0, 12 }, { 0,92103 }, { 97,15029 }, { 98,15029 }, { 99,15029 }, + { 100,15029 }, { 101,15029 }, { 102,15029 }, { 0, 16 }, { 0,92095 }, + { 0, 138 }, { 0,92093 }, { 0, 141 }, { 0,92091 }, { 0, 139 }, + + { 0,92089 }, { 0, 139 }, { 0,92087 }, { 0, 3 }, { 0,92085 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 10, -2 }, { 0, 0 }, { 48, 0 }, + { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 }, + { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 60,2574 }, { 0, 0 }, + { 0, 0 }, { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 }, + { 69, 0 }, { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 }, + { 74, 0 }, { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 }, + { 79, 0 }, { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 }, + + { 84, 0 }, { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 }, + { 89, 0 }, { 90, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95, 0 }, { 0, 0 }, { 97, 0 }, { 98, 0 }, + { 99, 0 }, { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 }, + { 104, 0 }, { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 }, + { 109, 0 }, { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 }, + { 114, 0 }, { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 }, + { 119, 0 }, { 120, 0 }, { 121, 0 }, { 122, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127, 0 }, { 128, 0 }, + { 129, 0 }, { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 }, + + { 134, 0 }, { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 }, + { 139, 0 }, { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 }, + { 144, 0 }, { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 }, + { 149, 0 }, { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 }, + { 154, 0 }, { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 }, + { 159, 0 }, { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 }, + { 164, 0 }, { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 }, + { 169, 0 }, { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 }, + { 174, 0 }, { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 }, + { 179, 0 }, { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 }, + + { 184, 0 }, { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 }, + { 189, 0 }, { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 }, + { 194, 0 }, { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 }, + { 199, 0 }, { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 }, + { 204, 0 }, { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 }, + { 209, 0 }, { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 }, + { 214, 0 }, { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 }, + { 219, 0 }, { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 }, + { 224, 0 }, { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 }, + { 229, 0 }, { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 }, + + { 234, 0 }, { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 }, + { 239, 0 }, { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 }, + { 244, 0 }, { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 }, + { 249, 0 }, { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 }, + { 254, 0 }, { 255, 0 }, { 0, 131 }, { 0,91866 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0,91847 }, { 0, 108 }, { 0,91845 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-257 }, { 49,-257 }, { 50,-257 }, { 51,-257 }, + { 52,-257 }, { 53,-257 }, { 54,-257 }, { 55,-257 }, { 56,-257 }, + { 57,-257 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-257 }, { 66,-257 }, + { 67,-257 }, { 68,-257 }, { 69,-257 }, { 70,-257 }, { 71,-257 }, + { 72,-257 }, { 73,-257 }, { 74,-257 }, { 75,-257 }, { 76,-257 }, + + { 77,-257 }, { 78,-257 }, { 79,-257 }, { 80,-257 }, { 81,-257 }, + { 82,-257 }, { 83,14755 }, { 84,-257 }, { 85,-257 }, { 86,-257 }, + { 87,-257 }, { 88,-257 }, { 89,-257 }, { 90,-257 }, { 72,2307 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-257 }, { 0, 0 }, + { 97,-257 }, { 98,-257 }, { 99,-257 }, { 100,-257 }, { 101,-257 }, + { 102,-257 }, { 103,-257 }, { 104,-257 }, { 105,-257 }, { 106,-257 }, + { 107,-257 }, { 108,-257 }, { 109,-257 }, { 110,-257 }, { 111,-257 }, + { 112,-257 }, { 113,-257 }, { 114,-257 }, { 115,14755 }, { 116,-257 }, + { 117,-257 }, { 118,-257 }, { 119,-257 }, { 120,-257 }, { 121,-257 }, + { 122,-257 }, { 104,2307 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 127,-257 }, { 128,-257 }, { 129,-257 }, { 130,-257 }, { 131,-257 }, + { 132,-257 }, { 133,-257 }, { 134,-257 }, { 135,-257 }, { 136,-257 }, + { 137,-257 }, { 138,-257 }, { 139,-257 }, { 140,-257 }, { 141,-257 }, + { 142,-257 }, { 143,-257 }, { 144,-257 }, { 145,-257 }, { 146,-257 }, + { 147,-257 }, { 148,-257 }, { 149,-257 }, { 150,-257 }, { 151,-257 }, + { 152,-257 }, { 153,-257 }, { 154,-257 }, { 155,-257 }, { 156,-257 }, + { 157,-257 }, { 158,-257 }, { 159,-257 }, { 160,-257 }, { 161,-257 }, + { 162,-257 }, { 163,-257 }, { 164,-257 }, { 165,-257 }, { 166,-257 }, + { 167,-257 }, { 168,-257 }, { 169,-257 }, { 170,-257 }, { 171,-257 }, + { 172,-257 }, { 173,-257 }, { 174,-257 }, { 175,-257 }, { 176,-257 }, + + { 177,-257 }, { 178,-257 }, { 179,-257 }, { 180,-257 }, { 181,-257 }, + { 182,-257 }, { 183,-257 }, { 184,-257 }, { 185,-257 }, { 186,-257 }, + { 187,-257 }, { 188,-257 }, { 189,-257 }, { 190,-257 }, { 191,-257 }, + { 192,-257 }, { 193,-257 }, { 194,-257 }, { 195,-257 }, { 196,-257 }, + { 197,-257 }, { 198,-257 }, { 199,-257 }, { 200,-257 }, { 201,-257 }, + { 202,-257 }, { 203,-257 }, { 204,-257 }, { 205,-257 }, { 206,-257 }, + { 207,-257 }, { 208,-257 }, { 209,-257 }, { 210,-257 }, { 211,-257 }, + { 212,-257 }, { 213,-257 }, { 214,-257 }, { 215,-257 }, { 216,-257 }, + { 217,-257 }, { 218,-257 }, { 219,-257 }, { 220,-257 }, { 221,-257 }, + { 222,-257 }, { 223,-257 }, { 224,-257 }, { 225,-257 }, { 226,-257 }, + + { 227,-257 }, { 228,-257 }, { 229,-257 }, { 230,-257 }, { 231,-257 }, + { 232,-257 }, { 233,-257 }, { 234,-257 }, { 235,-257 }, { 236,-257 }, + { 237,-257 }, { 238,-257 }, { 239,-257 }, { 240,-257 }, { 241,-257 }, + { 242,-257 }, { 243,-257 }, { 244,-257 }, { 245,-257 }, { 246,-257 }, + { 247,-257 }, { 248,-257 }, { 249,-257 }, { 250,-257 }, { 251,-257 }, + { 252,-257 }, { 253,-257 }, { 254,-257 }, { 255,-257 }, { 0, 131 }, + { 0,91609 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0,91600 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0,91595 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-514 }, { 49,-514 }, + { 50,-514 }, { 51,-514 }, { 52,-514 }, { 53,-514 }, { 54,-514 }, + { 55,-514 }, { 56,-514 }, { 57,-514 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-514 }, { 66,-514 }, { 67,-514 }, { 68,14755 }, { 69,-514 }, + + { 70,-514 }, { 71,-514 }, { 72,-514 }, { 73,-514 }, { 74,-514 }, + { 75,-514 }, { 76,-514 }, { 77,-514 }, { 78,-514 }, { 79,-514 }, + { 80,-514 }, { 81,-514 }, { 82,-514 }, { 83,-514 }, { 84,-514 }, + { 85,-514 }, { 86,-514 }, { 87,-514 }, { 88,-514 }, { 89,-514 }, + { 90,-514 }, { 82,2076 }, { 78,2073 }, { 0, 0 }, { 0, 0 }, + { 95,-514 }, { 0, 0 }, { 97,-514 }, { 98,-514 }, { 99,-514 }, + { 100,14755 }, { 101,-514 }, { 102,-514 }, { 103,-514 }, { 104,-514 }, + { 105,-514 }, { 106,-514 }, { 107,-514 }, { 108,-514 }, { 109,-514 }, + { 110,-514 }, { 111,-514 }, { 112,-514 }, { 113,-514 }, { 114,-514 }, + { 115,-514 }, { 116,-514 }, { 117,-514 }, { 118,-514 }, { 119,-514 }, + + { 120,-514 }, { 121,-514 }, { 122,-514 }, { 114,2076 }, { 110,2073 }, + { 0, 0 }, { 0, 0 }, { 127,-514 }, { 128,-514 }, { 129,-514 }, + { 130,-514 }, { 131,-514 }, { 132,-514 }, { 133,-514 }, { 134,-514 }, + { 135,-514 }, { 136,-514 }, { 137,-514 }, { 138,-514 }, { 139,-514 }, + { 140,-514 }, { 141,-514 }, { 142,-514 }, { 143,-514 }, { 144,-514 }, + { 145,-514 }, { 146,-514 }, { 147,-514 }, { 148,-514 }, { 149,-514 }, + { 150,-514 }, { 151,-514 }, { 152,-514 }, { 153,-514 }, { 154,-514 }, + { 155,-514 }, { 156,-514 }, { 157,-514 }, { 158,-514 }, { 159,-514 }, + { 160,-514 }, { 161,-514 }, { 162,-514 }, { 163,-514 }, { 164,-514 }, + { 165,-514 }, { 166,-514 }, { 167,-514 }, { 168,-514 }, { 169,-514 }, + + { 170,-514 }, { 171,-514 }, { 172,-514 }, { 173,-514 }, { 174,-514 }, + { 175,-514 }, { 176,-514 }, { 177,-514 }, { 178,-514 }, { 179,-514 }, + { 180,-514 }, { 181,-514 }, { 182,-514 }, { 183,-514 }, { 184,-514 }, + { 185,-514 }, { 186,-514 }, { 187,-514 }, { 188,-514 }, { 189,-514 }, + { 190,-514 }, { 191,-514 }, { 192,-514 }, { 193,-514 }, { 194,-514 }, + { 195,-514 }, { 196,-514 }, { 197,-514 }, { 198,-514 }, { 199,-514 }, + { 200,-514 }, { 201,-514 }, { 202,-514 }, { 203,-514 }, { 204,-514 }, + { 205,-514 }, { 206,-514 }, { 207,-514 }, { 208,-514 }, { 209,-514 }, + { 210,-514 }, { 211,-514 }, { 212,-514 }, { 213,-514 }, { 214,-514 }, + { 215,-514 }, { 216,-514 }, { 217,-514 }, { 218,-514 }, { 219,-514 }, + + { 220,-514 }, { 221,-514 }, { 222,-514 }, { 223,-514 }, { 224,-514 }, + { 225,-514 }, { 226,-514 }, { 227,-514 }, { 228,-514 }, { 229,-514 }, + { 230,-514 }, { 231,-514 }, { 232,-514 }, { 233,-514 }, { 234,-514 }, + { 235,-514 }, { 236,-514 }, { 237,-514 }, { 238,-514 }, { 239,-514 }, + { 240,-514 }, { 241,-514 }, { 242,-514 }, { 243,-514 }, { 244,-514 }, + { 245,-514 }, { 246,-514 }, { 247,-514 }, { 248,-514 }, { 249,-514 }, + { 250,-514 }, { 251,-514 }, { 252,-514 }, { 253,-514 }, { 254,-514 }, + { 255,-514 }, { 0, 131 }, { 0,91352 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0,91340 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-771 }, { 49,-771 }, { 50,-771 }, { 51,-771 }, { 52,-771 }, + { 53,-771 }, { 54,-771 }, { 55,-771 }, { 56,-771 }, { 57,-771 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 65,-771 }, { 66,-771 }, { 67,-771 }, + { 68,-771 }, { 69,-771 }, { 70,-771 }, { 71,-771 }, { 72,-771 }, + { 73,-771 }, { 74,-771 }, { 75,-771 }, { 76,-771 }, { 77,-771 }, + { 78,-771 }, { 79,-771 }, { 80,-771 }, { 81,-771 }, { 82,14755 }, + { 83,-771 }, { 84,-771 }, { 85,-771 }, { 86,-771 }, { 87,-771 }, + { 88,-771 }, { 89,-771 }, { 90,-771 }, { 79,2061 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-771 }, { 0, 0 }, { 97,-771 }, + { 98,-771 }, { 99,-771 }, { 100,-771 }, { 101,-771 }, { 102,-771 }, + { 103,-771 }, { 104,-771 }, { 105,-771 }, { 106,-771 }, { 107,-771 }, + { 108,-771 }, { 109,-771 }, { 110,-771 }, { 111,-771 }, { 112,-771 }, + + { 113,-771 }, { 114,14755 }, { 115,-771 }, { 116,-771 }, { 117,-771 }, + { 118,-771 }, { 119,-771 }, { 120,-771 }, { 121,-771 }, { 122,-771 }, + { 111,2061 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-771 }, + { 128,-771 }, { 129,-771 }, { 130,-771 }, { 131,-771 }, { 132,-771 }, + { 133,-771 }, { 134,-771 }, { 135,-771 }, { 136,-771 }, { 137,-771 }, + { 138,-771 }, { 139,-771 }, { 140,-771 }, { 141,-771 }, { 142,-771 }, + { 143,-771 }, { 144,-771 }, { 145,-771 }, { 146,-771 }, { 147,-771 }, + { 148,-771 }, { 149,-771 }, { 150,-771 }, { 151,-771 }, { 152,-771 }, + { 153,-771 }, { 154,-771 }, { 155,-771 }, { 156,-771 }, { 157,-771 }, + { 158,-771 }, { 159,-771 }, { 160,-771 }, { 161,-771 }, { 162,-771 }, + + { 163,-771 }, { 164,-771 }, { 165,-771 }, { 166,-771 }, { 167,-771 }, + { 168,-771 }, { 169,-771 }, { 170,-771 }, { 171,-771 }, { 172,-771 }, + { 173,-771 }, { 174,-771 }, { 175,-771 }, { 176,-771 }, { 177,-771 }, + { 178,-771 }, { 179,-771 }, { 180,-771 }, { 181,-771 }, { 182,-771 }, + { 183,-771 }, { 184,-771 }, { 185,-771 }, { 186,-771 }, { 187,-771 }, + { 188,-771 }, { 189,-771 }, { 190,-771 }, { 191,-771 }, { 192,-771 }, + { 193,-771 }, { 194,-771 }, { 195,-771 }, { 196,-771 }, { 197,-771 }, + { 198,-771 }, { 199,-771 }, { 200,-771 }, { 201,-771 }, { 202,-771 }, + { 203,-771 }, { 204,-771 }, { 205,-771 }, { 206,-771 }, { 207,-771 }, + { 208,-771 }, { 209,-771 }, { 210,-771 }, { 211,-771 }, { 212,-771 }, + + { 213,-771 }, { 214,-771 }, { 215,-771 }, { 216,-771 }, { 217,-771 }, + { 218,-771 }, { 219,-771 }, { 220,-771 }, { 221,-771 }, { 222,-771 }, + { 223,-771 }, { 224,-771 }, { 225,-771 }, { 226,-771 }, { 227,-771 }, + { 228,-771 }, { 229,-771 }, { 230,-771 }, { 231,-771 }, { 232,-771 }, + { 233,-771 }, { 234,-771 }, { 235,-771 }, { 236,-771 }, { 237,-771 }, + { 238,-771 }, { 239,-771 }, { 240,-771 }, { 241,-771 }, { 242,-771 }, + { 243,-771 }, { 244,-771 }, { 245,-771 }, { 246,-771 }, { 247,-771 }, + { 248,-771 }, { 249,-771 }, { 250,-771 }, { 251,-771 }, { 252,-771 }, + { 253,-771 }, { 254,-771 }, { 255,-771 }, { 0, 45 }, { 0,91095 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0,91089 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0,91082 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-1028 }, { 49,-1028 }, { 50,-1028 }, + { 51,-1028 }, { 52,-1028 }, { 53,-1028 }, { 54,-1028 }, { 55,-1028 }, + + { 56,-1028 }, { 57,-1028 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-1028 }, + { 66,-1028 }, { 67,-1028 }, { 68,-1028 }, { 69,-1028 }, { 70,-1028 }, + { 71,-1028 }, { 72,-1028 }, { 73,-1028 }, { 74,-1028 }, { 75,-1028 }, + { 76,-1028 }, { 77,-1028 }, { 78,-1028 }, { 79,-1028 }, { 80,-1028 }, + { 81,-1028 }, { 82,-1028 }, { 83,-1028 }, { 84,-1028 }, { 85,-1028 }, + { 86,-1028 }, { 87,-1028 }, { 88,-1028 }, { 89,-1028 }, { 90,-1028 }, + { 85,1821 }, { 79,1816 }, { 0, 0 }, { 0, 0 }, { 95,-1028 }, + { 0, 0 }, { 97,-1028 }, { 98,-1028 }, { 99,-1028 }, { 100,-1028 }, + { 101,-1028 }, { 102,-1028 }, { 103,-1028 }, { 104,-1028 }, { 105,-1028 }, + + { 106,-1028 }, { 107,-1028 }, { 108,-1028 }, { 109,-1028 }, { 110,-1028 }, + { 111,-1028 }, { 112,-1028 }, { 113,-1028 }, { 114,-1028 }, { 115,-1028 }, + { 116,-1028 }, { 117,-1028 }, { 118,-1028 }, { 119,-1028 }, { 120,-1028 }, + { 121,-1028 }, { 122,-1028 }, { 117,1821 }, { 111,1816 }, { 0, 0 }, + { 0, 0 }, { 127,-1028 }, { 128,-1028 }, { 129,-1028 }, { 130,-1028 }, + { 131,-1028 }, { 132,-1028 }, { 133,-1028 }, { 134,-1028 }, { 135,-1028 }, + { 136,-1028 }, { 137,-1028 }, { 138,-1028 }, { 139,-1028 }, { 140,-1028 }, + { 141,-1028 }, { 142,-1028 }, { 143,-1028 }, { 144,-1028 }, { 145,-1028 }, + { 146,-1028 }, { 147,-1028 }, { 148,-1028 }, { 149,-1028 }, { 150,-1028 }, + { 151,-1028 }, { 152,-1028 }, { 153,-1028 }, { 154,-1028 }, { 155,-1028 }, + + { 156,-1028 }, { 157,-1028 }, { 158,-1028 }, { 159,-1028 }, { 160,-1028 }, + { 161,-1028 }, { 162,-1028 }, { 163,-1028 }, { 164,-1028 }, { 165,-1028 }, + { 166,-1028 }, { 167,-1028 }, { 168,-1028 }, { 169,-1028 }, { 170,-1028 }, + { 171,-1028 }, { 172,-1028 }, { 173,-1028 }, { 174,-1028 }, { 175,-1028 }, + { 176,-1028 }, { 177,-1028 }, { 178,-1028 }, { 179,-1028 }, { 180,-1028 }, + { 181,-1028 }, { 182,-1028 }, { 183,-1028 }, { 184,-1028 }, { 185,-1028 }, + { 186,-1028 }, { 187,-1028 }, { 188,-1028 }, { 189,-1028 }, { 190,-1028 }, + { 191,-1028 }, { 192,-1028 }, { 193,-1028 }, { 194,-1028 }, { 195,-1028 }, + { 196,-1028 }, { 197,-1028 }, { 198,-1028 }, { 199,-1028 }, { 200,-1028 }, + { 201,-1028 }, { 202,-1028 }, { 203,-1028 }, { 204,-1028 }, { 205,-1028 }, + + { 206,-1028 }, { 207,-1028 }, { 208,-1028 }, { 209,-1028 }, { 210,-1028 }, + { 211,-1028 }, { 212,-1028 }, { 213,-1028 }, { 214,-1028 }, { 215,-1028 }, + { 216,-1028 }, { 217,-1028 }, { 218,-1028 }, { 219,-1028 }, { 220,-1028 }, + { 221,-1028 }, { 222,-1028 }, { 223,-1028 }, { 224,-1028 }, { 225,-1028 }, + { 226,-1028 }, { 227,-1028 }, { 228,-1028 }, { 229,-1028 }, { 230,-1028 }, + { 231,-1028 }, { 232,-1028 }, { 233,-1028 }, { 234,-1028 }, { 235,-1028 }, + { 236,-1028 }, { 237,-1028 }, { 238,-1028 }, { 239,-1028 }, { 240,-1028 }, + { 241,-1028 }, { 242,-1028 }, { 243,-1028 }, { 244,-1028 }, { 245,-1028 }, + { 246,-1028 }, { 247,-1028 }, { 248,-1028 }, { 249,-1028 }, { 250,-1028 }, + { 251,-1028 }, { 252,-1028 }, { 253,-1028 }, { 254,-1028 }, { 255,-1028 }, + + { 0, 0 }, { 0,90838 }, { 1,-2825 }, { 2,-2825 }, { 3,-2825 }, + { 4,-2825 }, { 5,-2825 }, { 6,-2825 }, { 7,-2825 }, { 8,-2825 }, + { 9,-2825 }, { 10,-2825 }, { 11,-2825 }, { 12,-2825 }, { 13,-2825 }, + { 14,-2825 }, { 15,-2825 }, { 16,-2825 }, { 17,-2825 }, { 18,-2825 }, + { 19,-2825 }, { 20,-2825 }, { 21,-2825 }, { 22,-2825 }, { 23,-2825 }, + { 24,-2825 }, { 25,-2825 }, { 26,-2825 }, { 27,-2825 }, { 28,-2825 }, + { 29,-2825 }, { 30,-2825 }, { 31,-2825 }, { 32,-2825 }, { 33,-2825 }, + { 34,-2933 }, { 35,-2825 }, { 36,-2825 }, { 37,-2825 }, { 38,-2825 }, + { 39,-2825 }, { 40,-2825 }, { 41,-2825 }, { 42,-2825 }, { 43,-2825 }, + { 44,-2825 }, { 45,-2825 }, { 46,-2825 }, { 47,-2825 }, { 48,-2825 }, + + { 49,-2825 }, { 50,-2825 }, { 51,-2825 }, { 52,-2825 }, { 53,-2825 }, + { 54,-2825 }, { 55,-2825 }, { 56,-2825 }, { 57,-2825 }, { 58,-2825 }, + { 59,-2825 }, { 60,-2825 }, { 61,-2825 }, { 62,-2825 }, { 63,-2825 }, + { 64,-2825 }, { 65,-2825 }, { 66,-2825 }, { 67,-2825 }, { 68,-2825 }, + { 69,-2825 }, { 70,-2825 }, { 71,-2825 }, { 72,-2825 }, { 73,-2825 }, + { 74,-2825 }, { 75,-2825 }, { 76,-2825 }, { 77,-2825 }, { 78,-2825 }, + { 79,-2825 }, { 80,-2825 }, { 81,-2825 }, { 82,-2825 }, { 83,-2825 }, + { 84,-2825 }, { 85,-2825 }, { 86,-2825 }, { 87,-2825 }, { 88,-2825 }, + { 89,-2825 }, { 90,-2825 }, { 91,-2825 }, { 92,-2567 }, { 93,-2825 }, + { 94,-2825 }, { 95,-2825 }, { 96,-2825 }, { 97,-2825 }, { 98,-2825 }, + + { 99,-2825 }, { 100,-2825 }, { 101,-2825 }, { 102,-2825 }, { 103,-2825 }, + { 104,-2825 }, { 105,-2825 }, { 106,-2825 }, { 107,-2825 }, { 108,-2825 }, + { 109,-2825 }, { 110,-2825 }, { 111,-2825 }, { 112,-2825 }, { 113,-2825 }, + { 114,-2825 }, { 115,-2825 }, { 116,-2825 }, { 117,-2825 }, { 118,-2825 }, + { 119,-2825 }, { 120,-2825 }, { 121,-2825 }, { 122,-2825 }, { 123,-2825 }, + { 124,-2825 }, { 125,-2825 }, { 126,-2825 }, { 127,-2825 }, { 128,-2825 }, + { 129,-2825 }, { 130,-2825 }, { 131,-2825 }, { 132,-2825 }, { 133,-2825 }, + { 134,-2825 }, { 135,-2825 }, { 136,-2825 }, { 137,-2825 }, { 138,-2825 }, + { 139,-2825 }, { 140,-2825 }, { 141,-2825 }, { 142,-2825 }, { 143,-2825 }, + { 144,-2825 }, { 145,-2825 }, { 146,-2825 }, { 147,-2825 }, { 148,-2825 }, + + { 149,-2825 }, { 150,-2825 }, { 151,-2825 }, { 152,-2825 }, { 153,-2825 }, + { 154,-2825 }, { 155,-2825 }, { 156,-2825 }, { 157,-2825 }, { 158,-2825 }, + { 159,-2825 }, { 160,-2825 }, { 161,-2825 }, { 162,-2825 }, { 163,-2825 }, + { 164,-2825 }, { 165,-2825 }, { 166,-2825 }, { 167,-2825 }, { 168,-2825 }, + { 169,-2825 }, { 170,-2825 }, { 171,-2825 }, { 172,-2825 }, { 173,-2825 }, + { 174,-2825 }, { 175,-2825 }, { 176,-2825 }, { 177,-2825 }, { 178,-2825 }, + { 179,-2825 }, { 180,-2825 }, { 181,-2825 }, { 182,-2825 }, { 183,-2825 }, + { 184,-2825 }, { 185,-2825 }, { 186,-2825 }, { 187,-2825 }, { 188,-2825 }, + { 189,-2825 }, { 190,-2825 }, { 191,-2825 }, { 192,-2825 }, { 193,-2825 }, + { 194,-2825 }, { 195,-2825 }, { 196,-2825 }, { 197,-2825 }, { 198,-2825 }, + + { 199,-2825 }, { 200,-2825 }, { 201,-2825 }, { 202,-2825 }, { 203,-2825 }, + { 204,-2825 }, { 205,-2825 }, { 206,-2825 }, { 207,-2825 }, { 208,-2825 }, + { 209,-2825 }, { 210,-2825 }, { 211,-2825 }, { 212,-2825 }, { 213,-2825 }, + { 214,-2825 }, { 215,-2825 }, { 216,-2825 }, { 217,-2825 }, { 218,-2825 }, + { 219,-2825 }, { 220,-2825 }, { 221,-2825 }, { 222,-2825 }, { 223,-2825 }, + { 224,-2825 }, { 225,-2825 }, { 226,-2825 }, { 227,-2825 }, { 228,-2825 }, + { 229,-2825 }, { 230,-2825 }, { 231,-2825 }, { 232,-2825 }, { 233,-2825 }, + { 234,-2825 }, { 235,-2825 }, { 236,-2825 }, { 237,-2825 }, { 238,-2825 }, + { 239,-2825 }, { 240,-2825 }, { 241,-2825 }, { 242,-2825 }, { 243,-2825 }, + { 244,-2825 }, { 245,-2825 }, { 246,-2825 }, { 247,-2825 }, { 248,-2825 }, + + { 249,-2825 }, { 250,-2825 }, { 251,-2825 }, { 252,-2825 }, { 253,-2825 }, + { 254,-2825 }, { 255,-2825 }, { 256,-2825 }, { 0, 0 }, { 0,90580 }, + { 1,-2310 }, { 2,-2310 }, { 3,-2310 }, { 4,-2310 }, { 5,-2310 }, + { 6,-2310 }, { 7,-2310 }, { 8,-2310 }, { 9,-2310 }, { 10,-2310 }, + { 11,-2310 }, { 12,-2310 }, { 13,-2310 }, { 14,-2310 }, { 15,-2310 }, + { 16,-2310 }, { 17,-2310 }, { 18,-2310 }, { 19,-2310 }, { 20,-2310 }, + { 21,-2310 }, { 22,-2310 }, { 23,-2310 }, { 24,-2310 }, { 25,-2310 }, + { 26,-2310 }, { 27,-2310 }, { 28,-2310 }, { 29,-2310 }, { 30,-2310 }, + { 31,-2310 }, { 32,-2310 }, { 33,-2310 }, { 34,-2310 }, { 35,-2310 }, + { 36,-2310 }, { 37,-2310 }, { 38,-2310 }, { 39,-3191 }, { 40,-2310 }, + + { 41,-2310 }, { 42,-2310 }, { 43,-2310 }, { 44,-2310 }, { 45,-2310 }, + { 46,-2310 }, { 47,-2310 }, { 48,-2310 }, { 49,-2310 }, { 50,-2310 }, + { 51,-2310 }, { 52,-2310 }, { 53,-2310 }, { 54,-2310 }, { 55,-2310 }, + { 56,-2310 }, { 57,-2310 }, { 58,-2310 }, { 59,-2310 }, { 60,-2310 }, + { 61,-2310 }, { 62,-2310 }, { 63,-2310 }, { 64,-2310 }, { 65,-2310 }, + { 66,-2310 }, { 67,-2310 }, { 68,-2310 }, { 69,-2310 }, { 70,-2310 }, + { 71,-2310 }, { 72,-2310 }, { 73,-2310 }, { 74,-2310 }, { 75,-2310 }, + { 76,-2310 }, { 77,-2310 }, { 78,-2310 }, { 79,-2310 }, { 80,-2310 }, + { 81,-2310 }, { 82,-2310 }, { 83,-2310 }, { 84,-2310 }, { 85,-2310 }, + { 86,-2310 }, { 87,-2310 }, { 88,-2310 }, { 89,-2310 }, { 90,-2310 }, + + { 91,-2310 }, { 92,-2052 }, { 93,-2310 }, { 94,-2310 }, { 95,-2310 }, + { 96,-2310 }, { 97,-2310 }, { 98,-2310 }, { 99,-2310 }, { 100,-2310 }, + { 101,-2310 }, { 102,-2310 }, { 103,-2310 }, { 104,-2310 }, { 105,-2310 }, + { 106,-2310 }, { 107,-2310 }, { 108,-2310 }, { 109,-2310 }, { 110,-2310 }, + { 111,-2310 }, { 112,-2310 }, { 113,-2310 }, { 114,-2310 }, { 115,-2310 }, + { 116,-2310 }, { 117,-2310 }, { 118,-2310 }, { 119,-2310 }, { 120,-2310 }, + { 121,-2310 }, { 122,-2310 }, { 123,-2310 }, { 124,-2310 }, { 125,-2310 }, + { 126,-2310 }, { 127,-2310 }, { 128,-2310 }, { 129,-2310 }, { 130,-2310 }, + { 131,-2310 }, { 132,-2310 }, { 133,-2310 }, { 134,-2310 }, { 135,-2310 }, + { 136,-2310 }, { 137,-2310 }, { 138,-2310 }, { 139,-2310 }, { 140,-2310 }, + + { 141,-2310 }, { 142,-2310 }, { 143,-2310 }, { 144,-2310 }, { 145,-2310 }, + { 146,-2310 }, { 147,-2310 }, { 148,-2310 }, { 149,-2310 }, { 150,-2310 }, + { 151,-2310 }, { 152,-2310 }, { 153,-2310 }, { 154,-2310 }, { 155,-2310 }, + { 156,-2310 }, { 157,-2310 }, { 158,-2310 }, { 159,-2310 }, { 160,-2310 }, + { 161,-2310 }, { 162,-2310 }, { 163,-2310 }, { 164,-2310 }, { 165,-2310 }, + { 166,-2310 }, { 167,-2310 }, { 168,-2310 }, { 169,-2310 }, { 170,-2310 }, + { 171,-2310 }, { 172,-2310 }, { 173,-2310 }, { 174,-2310 }, { 175,-2310 }, + { 176,-2310 }, { 177,-2310 }, { 178,-2310 }, { 179,-2310 }, { 180,-2310 }, + { 181,-2310 }, { 182,-2310 }, { 183,-2310 }, { 184,-2310 }, { 185,-2310 }, + { 186,-2310 }, { 187,-2310 }, { 188,-2310 }, { 189,-2310 }, { 190,-2310 }, + + { 191,-2310 }, { 192,-2310 }, { 193,-2310 }, { 194,-2310 }, { 195,-2310 }, + { 196,-2310 }, { 197,-2310 }, { 198,-2310 }, { 199,-2310 }, { 200,-2310 }, + { 201,-2310 }, { 202,-2310 }, { 203,-2310 }, { 204,-2310 }, { 205,-2310 }, + { 206,-2310 }, { 207,-2310 }, { 208,-2310 }, { 209,-2310 }, { 210,-2310 }, + { 211,-2310 }, { 212,-2310 }, { 213,-2310 }, { 214,-2310 }, { 215,-2310 }, + { 216,-2310 }, { 217,-2310 }, { 218,-2310 }, { 219,-2310 }, { 220,-2310 }, + { 221,-2310 }, { 222,-2310 }, { 223,-2310 }, { 224,-2310 }, { 225,-2310 }, + { 226,-2310 }, { 227,-2310 }, { 228,-2310 }, { 229,-2310 }, { 230,-2310 }, + { 231,-2310 }, { 232,-2310 }, { 233,-2310 }, { 234,-2310 }, { 235,-2310 }, + { 236,-2310 }, { 237,-2310 }, { 238,-2310 }, { 239,-2310 }, { 240,-2310 }, + + { 241,-2310 }, { 242,-2310 }, { 243,-2310 }, { 244,-2310 }, { 245,-2310 }, + { 246,-2310 }, { 247,-2310 }, { 248,-2310 }, { 249,-2310 }, { 250,-2310 }, + { 251,-2310 }, { 252,-2310 }, { 253,-2310 }, { 254,-2310 }, { 255,-2310 }, + { 256,-2310 }, { 0, 131 }, { 0,90322 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0,90315 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0,90304 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0,90294 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-1801 }, { 49,-1801 }, { 50,-1801 }, { 51,-1801 }, { 52,-1801 }, + { 53,-1801 }, { 54,-1801 }, { 55,-1801 }, { 56,-1801 }, { 57,-1801 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-1801 }, { 66,-1801 }, { 67,-1801 }, + { 68,-1801 }, { 69,13982 }, { 70,-1801 }, { 71,-1801 }, { 72,-1801 }, + { 73,-1801 }, { 74,-1801 }, { 75,-1801 }, { 76,-1801 }, { 77,-1801 }, + { 78,-1801 }, { 79,-1801 }, { 80,-1801 }, { 81,-1801 }, { 82,-1801 }, + + { 83,-1801 }, { 84,-1801 }, { 85,-1801 }, { 86,-1801 }, { 87,-1801 }, + { 88,-1801 }, { 89,-1801 }, { 90,-1801 }, { 84,28110 }, { 74,1289 }, + { 65,1529 }, { 0, 0 }, { 95,-1801 }, { 0, 0 }, { 97,-1801 }, + { 98,-1801 }, { 99,-1801 }, { 100,-1801 }, { 101,13982 }, { 102,-1801 }, + { 103,-1801 }, { 104,-1801 }, { 105,-1801 }, { 106,-1801 }, { 107,-1801 }, + { 108,-1801 }, { 109,-1801 }, { 110,-1801 }, { 111,-1801 }, { 112,-1801 }, + { 113,-1801 }, { 114,-1801 }, { 115,-1801 }, { 116,-1801 }, { 117,-1801 }, + { 118,-1801 }, { 119,-1801 }, { 120,-1801 }, { 121,-1801 }, { 122,-1801 }, + { 116,28110 }, { 106,1289 }, { 97,1529 }, { 0, 0 }, { 127,-1801 }, + { 128,-1801 }, { 129,-1801 }, { 130,-1801 }, { 131,-1801 }, { 132,-1801 }, + + { 133,-1801 }, { 134,-1801 }, { 135,-1801 }, { 136,-1801 }, { 137,-1801 }, + { 138,-1801 }, { 139,-1801 }, { 140,-1801 }, { 141,-1801 }, { 142,-1801 }, + { 143,-1801 }, { 144,-1801 }, { 145,-1801 }, { 146,-1801 }, { 147,-1801 }, + { 148,-1801 }, { 149,-1801 }, { 150,-1801 }, { 151,-1801 }, { 152,-1801 }, + { 153,-1801 }, { 154,-1801 }, { 155,-1801 }, { 156,-1801 }, { 157,-1801 }, + { 158,-1801 }, { 159,-1801 }, { 160,-1801 }, { 161,-1801 }, { 162,-1801 }, + { 163,-1801 }, { 164,-1801 }, { 165,-1801 }, { 166,-1801 }, { 167,-1801 }, + { 168,-1801 }, { 169,-1801 }, { 170,-1801 }, { 171,-1801 }, { 172,-1801 }, + { 173,-1801 }, { 174,-1801 }, { 175,-1801 }, { 176,-1801 }, { 177,-1801 }, + { 178,-1801 }, { 179,-1801 }, { 180,-1801 }, { 181,-1801 }, { 182,-1801 }, + + { 183,-1801 }, { 184,-1801 }, { 185,-1801 }, { 186,-1801 }, { 187,-1801 }, + { 188,-1801 }, { 189,-1801 }, { 190,-1801 }, { 191,-1801 }, { 192,-1801 }, + { 193,-1801 }, { 194,-1801 }, { 195,-1801 }, { 196,-1801 }, { 197,-1801 }, + { 198,-1801 }, { 199,-1801 }, { 200,-1801 }, { 201,-1801 }, { 202,-1801 }, + { 203,-1801 }, { 204,-1801 }, { 205,-1801 }, { 206,-1801 }, { 207,-1801 }, + { 208,-1801 }, { 209,-1801 }, { 210,-1801 }, { 211,-1801 }, { 212,-1801 }, + { 213,-1801 }, { 214,-1801 }, { 215,-1801 }, { 216,-1801 }, { 217,-1801 }, + { 218,-1801 }, { 219,-1801 }, { 220,-1801 }, { 221,-1801 }, { 222,-1801 }, + { 223,-1801 }, { 224,-1801 }, { 225,-1801 }, { 226,-1801 }, { 227,-1801 }, + { 228,-1801 }, { 229,-1801 }, { 230,-1801 }, { 231,-1801 }, { 232,-1801 }, + + { 233,-1801 }, { 234,-1801 }, { 235,-1801 }, { 236,-1801 }, { 237,-1801 }, + { 238,-1801 }, { 239,-1801 }, { 240,-1801 }, { 241,-1801 }, { 242,-1801 }, + { 243,-1801 }, { 244,-1801 }, { 245,-1801 }, { 246,-1801 }, { 247,-1801 }, + { 248,-1801 }, { 249,-1801 }, { 250,-1801 }, { 251,-1801 }, { 252,-1801 }, + { 253,-1801 }, { 254,-1801 }, { 255,-1801 }, { 0, 131 }, { 0,90065 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0,90056 }, { 0, 0 }, + { 0,90054 }, { 0, 119 }, { 0,90052 }, { 0, 0 }, { 0,90050 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 9,1296 }, { 10,1296 }, + + { 0, 0 }, { 0, 0 }, { 13,1296 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 129 }, { 0,90021 }, { 0, 0 }, + { 0, 0 }, { 32,1296 }, { 48,-2058 }, { 49,-2058 }, { 50,-2058 }, + { 51,-2058 }, { 52,-2058 }, { 53,-2058 }, { 54,-2058 }, { 55,-2058 }, + { 56,-2058 }, { 57,-2058 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-2058 }, + { 66,-2058 }, { 67,-2058 }, { 68,-2058 }, { 69,-2058 }, { 70,-2058 }, + { 71,-2058 }, { 72,-2058 }, { 73,-2058 }, { 74,-2058 }, { 75,-2058 }, + + { 76,13982 }, { 77,-2058 }, { 78,-2058 }, { 79,-2058 }, { 80,-2058 }, + { 81,-2058 }, { 82,-2058 }, { 83,14239 }, { 84,14496 }, { 85,-2058 }, + { 86,-2058 }, { 87,-2058 }, { 88,-2058 }, { 89,-2058 }, { 90,-2058 }, + { 82,1295 }, { 48, 0 }, { 49, 0 }, { 83,1298 }, { 95,-2058 }, + { 0, 0 }, { 97,-2058 }, { 98,-2058 }, { 99,-2058 }, { 100,-2058 }, + { 101,-2058 }, { 102,-2058 }, { 103,-2058 }, { 104,-2058 }, { 105,-2058 }, + { 106,-2058 }, { 107,-2058 }, { 108,13982 }, { 109,-2058 }, { 110,-2058 }, + { 111,-2058 }, { 112,-2058 }, { 113,-2058 }, { 114,-2058 }, { 115,14239 }, + { 116,14496 }, { 117,-2058 }, { 118,-2058 }, { 119,-2058 }, { 120,-2058 }, + { 121,-2058 }, { 122,-2058 }, { 114,1295 }, { 0, 0 }, { 0, 0 }, + + { 115,1298 }, { 127,-2058 }, { 128,-2058 }, { 129,-2058 }, { 130,-2058 }, + { 131,-2058 }, { 132,-2058 }, { 133,-2058 }, { 134,-2058 }, { 135,-2058 }, + { 136,-2058 }, { 137,-2058 }, { 138,-2058 }, { 139,-2058 }, { 140,-2058 }, + { 141,-2058 }, { 142,-2058 }, { 143,-2058 }, { 144,-2058 }, { 145,-2058 }, + { 146,-2058 }, { 147,-2058 }, { 148,-2058 }, { 149,-2058 }, { 150,-2058 }, + { 151,-2058 }, { 152,-2058 }, { 153,-2058 }, { 154,-2058 }, { 155,-2058 }, + { 156,-2058 }, { 157,-2058 }, { 158,-2058 }, { 159,-2058 }, { 160,-2058 }, + { 161,-2058 }, { 162,-2058 }, { 163,-2058 }, { 164,-2058 }, { 165,-2058 }, + { 166,-2058 }, { 167,-2058 }, { 168,-2058 }, { 169,-2058 }, { 170,-2058 }, + { 171,-2058 }, { 172,-2058 }, { 173,-2058 }, { 174,-2058 }, { 175,-2058 }, + + { 176,-2058 }, { 177,-2058 }, { 178,-2058 }, { 179,-2058 }, { 180,-2058 }, + { 181,-2058 }, { 182,-2058 }, { 183,-2058 }, { 184,-2058 }, { 185,-2058 }, + { 186,-2058 }, { 187,-2058 }, { 188,-2058 }, { 189,-2058 }, { 190,-2058 }, + { 191,-2058 }, { 192,-2058 }, { 193,-2058 }, { 194,-2058 }, { 195,-2058 }, + { 196,-2058 }, { 197,-2058 }, { 198,-2058 }, { 199,-2058 }, { 200,-2058 }, + { 201,-2058 }, { 202,-2058 }, { 203,-2058 }, { 204,-2058 }, { 205,-2058 }, + { 206,-2058 }, { 207,-2058 }, { 208,-2058 }, { 209,-2058 }, { 210,-2058 }, + { 211,-2058 }, { 212,-2058 }, { 213,-2058 }, { 214,-2058 }, { 215,-2058 }, + { 216,-2058 }, { 217,-2058 }, { 218,-2058 }, { 219,-2058 }, { 220,-2058 }, + { 221,-2058 }, { 222,-2058 }, { 223,-2058 }, { 224,-2058 }, { 225,-2058 }, + + { 226,-2058 }, { 227,-2058 }, { 228,-2058 }, { 229,-2058 }, { 230,-2058 }, + { 231,-2058 }, { 232,-2058 }, { 233,-2058 }, { 234,-2058 }, { 235,-2058 }, + { 236,-2058 }, { 237,-2058 }, { 238,-2058 }, { 239,-2058 }, { 240,-2058 }, + { 241,-2058 }, { 242,-2058 }, { 243,-2058 }, { 244,-2058 }, { 245,-2058 }, + { 246,-2058 }, { 247,-2058 }, { 248,-2058 }, { 249,-2058 }, { 250,-2058 }, + { 251,-2058 }, { 252,-2058 }, { 253,-2058 }, { 254,-2058 }, { 255,-2058 }, + { 0, 131 }, { 0,89808 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0,89784 }, { 0, 135 }, { 0,89782 }, { 0, 101 }, { 0,89780 }, + { 0, 121 }, { 0,89778 }, { 0, 107 }, { 0,89776 }, { 0, 102 }, + { 0,89774 }, { 9,1270 }, { 0, 5 }, { 0,89771 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-2315 }, + { 49,-2315 }, { 50,-2315 }, { 51,-2315 }, { 52,-2315 }, { 53,-2315 }, + { 54,-2315 }, { 55,-2315 }, { 56,-2315 }, { 57,-2315 }, { 32,1270 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,14496 }, { 66,-2315 }, { 67,-2315 }, { 68,-2315 }, + + { 69,-2315 }, { 70,-2315 }, { 71,-2315 }, { 72,-2315 }, { 73,-2315 }, + { 74,-2315 }, { 75,-2315 }, { 76,-2315 }, { 77,-2315 }, { 78,-2315 }, + { 79,14753 }, { 80,-2315 }, { 81,-2315 }, { 82,-2315 }, { 83,-2315 }, + { 84,-2315 }, { 85,-2315 }, { 86,-2315 }, { 87,-2315 }, { 88,-2315 }, + { 89,-2315 }, { 90,-2315 }, { 67,1270 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-2315 }, { 0, 0 }, { 97,14496 }, { 98,-2315 }, + { 99,-2315 }, { 100,-2315 }, { 101,-2315 }, { 102,-2315 }, { 103,-2315 }, + { 104,-2315 }, { 105,-2315 }, { 106,-2315 }, { 107,-2315 }, { 108,-2315 }, + { 109,-2315 }, { 110,-2315 }, { 111,14753 }, { 112,-2315 }, { 113,-2315 }, + { 114,-2315 }, { 115,-2315 }, { 116,-2315 }, { 117,-2315 }, { 118,-2315 }, + + { 119,-2315 }, { 120,-2315 }, { 121,-2315 }, { 122,-2315 }, { 99,1270 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-2315 }, { 128,-2315 }, + { 129,-2315 }, { 130,-2315 }, { 131,-2315 }, { 132,-2315 }, { 133,-2315 }, + { 134,-2315 }, { 135,-2315 }, { 136,-2315 }, { 137,-2315 }, { 138,-2315 }, + { 139,-2315 }, { 140,-2315 }, { 141,-2315 }, { 142,-2315 }, { 143,-2315 }, + { 144,-2315 }, { 145,-2315 }, { 146,-2315 }, { 147,-2315 }, { 148,-2315 }, + { 149,-2315 }, { 150,-2315 }, { 151,-2315 }, { 152,-2315 }, { 153,-2315 }, + { 154,-2315 }, { 155,-2315 }, { 156,-2315 }, { 157,-2315 }, { 158,-2315 }, + { 159,-2315 }, { 160,-2315 }, { 161,-2315 }, { 162,-2315 }, { 163,-2315 }, + { 164,-2315 }, { 165,-2315 }, { 166,-2315 }, { 167,-2315 }, { 168,-2315 }, + + { 169,-2315 }, { 170,-2315 }, { 171,-2315 }, { 172,-2315 }, { 173,-2315 }, + { 174,-2315 }, { 175,-2315 }, { 176,-2315 }, { 177,-2315 }, { 178,-2315 }, + { 179,-2315 }, { 180,-2315 }, { 181,-2315 }, { 182,-2315 }, { 183,-2315 }, + { 184,-2315 }, { 185,-2315 }, { 186,-2315 }, { 187,-2315 }, { 188,-2315 }, + { 189,-2315 }, { 190,-2315 }, { 191,-2315 }, { 192,-2315 }, { 193,-2315 }, + { 194,-2315 }, { 195,-2315 }, { 196,-2315 }, { 197,-2315 }, { 198,-2315 }, + { 199,-2315 }, { 200,-2315 }, { 201,-2315 }, { 202,-2315 }, { 203,-2315 }, + { 204,-2315 }, { 205,-2315 }, { 206,-2315 }, { 207,-2315 }, { 208,-2315 }, + { 209,-2315 }, { 210,-2315 }, { 211,-2315 }, { 212,-2315 }, { 213,-2315 }, + { 214,-2315 }, { 215,-2315 }, { 216,-2315 }, { 217,-2315 }, { 218,-2315 }, + + { 219,-2315 }, { 220,-2315 }, { 221,-2315 }, { 222,-2315 }, { 223,-2315 }, + { 224,-2315 }, { 225,-2315 }, { 226,-2315 }, { 227,-2315 }, { 228,-2315 }, + { 229,-2315 }, { 230,-2315 }, { 231,-2315 }, { 232,-2315 }, { 233,-2315 }, + { 234,-2315 }, { 235,-2315 }, { 236,-2315 }, { 237,-2315 }, { 238,-2315 }, + { 239,-2315 }, { 240,-2315 }, { 241,-2315 }, { 242,-2315 }, { 243,-2315 }, + { 244,-2315 }, { 245,-2315 }, { 246,-2315 }, { 247,-2315 }, { 248,-2315 }, + { 249,-2315 }, { 250,-2315 }, { 251,-2315 }, { 252,-2315 }, { 253,-2315 }, + { 254,-2315 }, { 255,-2315 }, { 0, 131 }, { 0,89551 }, { 0, 5 }, + { 0,89549 }, { 0, 0 }, { 0,89547 }, { 0, 136 }, { 0,89545 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0,89540 }, + + { 10,-222 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0,89524 }, { 0, 0 }, { 0,89522 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-2572 }, { 49,-2572 }, { 50,-2572 }, { 51,-2572 }, + { 52,-2572 }, { 53,-2572 }, { 54,-2572 }, { 55,-2572 }, { 56,-2572 }, + { 57,-2572 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 60,-235 }, { 65,-2572 }, { 66,-2572 }, + { 67,-2572 }, { 68,-2572 }, { 69,-2572 }, { 70,-2572 }, { 71,-2572 }, + { 72,-2572 }, { 73,-2572 }, { 74,-2572 }, { 75,-2572 }, { 76,-2572 }, + { 77,-2572 }, { 78,14753 }, { 79,-2572 }, { 80,-2572 }, { 81,-2572 }, + { 82,-2572 }, { 83,-2572 }, { 84,-2572 }, { 85,-2572 }, { 86,-2572 }, + { 87,-2572 }, { 88,-2572 }, { 89,-2572 }, { 90,-2572 }, { 80,1030 }, + { 65,1260 }, { 0, 0 }, { 65,1266 }, { 95,-2572 }, { 0, 0 }, + { 97,-2572 }, { 98,-2572 }, { 99,-2572 }, { 100,-2572 }, { 101,-2572 }, + { 102,-2572 }, { 103,-2572 }, { 104,-2572 }, { 105,-2572 }, { 106,-2572 }, + { 107,-2572 }, { 108,-2572 }, { 109,-2572 }, { 110,14753 }, { 111,-2572 }, + + { 112,-2572 }, { 113,-2572 }, { 114,-2572 }, { 115,-2572 }, { 116,-2572 }, + { 117,-2572 }, { 118,-2572 }, { 119,-2572 }, { 120,-2572 }, { 121,-2572 }, + { 122,-2572 }, { 112,1030 }, { 97,1260 }, { 0, 0 }, { 97,1266 }, + { 127,-2572 }, { 128,-2572 }, { 129,-2572 }, { 130,-2572 }, { 131,-2572 }, + { 132,-2572 }, { 133,-2572 }, { 134,-2572 }, { 135,-2572 }, { 136,-2572 }, + { 137,-2572 }, { 138,-2572 }, { 139,-2572 }, { 140,-2572 }, { 141,-2572 }, + { 142,-2572 }, { 143,-2572 }, { 144,-2572 }, { 145,-2572 }, { 146,-2572 }, + { 147,-2572 }, { 148,-2572 }, { 149,-2572 }, { 150,-2572 }, { 151,-2572 }, + { 152,-2572 }, { 153,-2572 }, { 154,-2572 }, { 155,-2572 }, { 156,-2572 }, + { 157,-2572 }, { 158,-2572 }, { 159,-2572 }, { 160,-2572 }, { 161,-2572 }, + + { 162,-2572 }, { 163,-2572 }, { 164,-2572 }, { 165,-2572 }, { 166,-2572 }, + { 167,-2572 }, { 168,-2572 }, { 169,-2572 }, { 170,-2572 }, { 171,-2572 }, + { 172,-2572 }, { 173,-2572 }, { 174,-2572 }, { 175,-2572 }, { 176,-2572 }, + { 177,-2572 }, { 178,-2572 }, { 179,-2572 }, { 180,-2572 }, { 181,-2572 }, + { 182,-2572 }, { 183,-2572 }, { 184,-2572 }, { 185,-2572 }, { 186,-2572 }, + { 187,-2572 }, { 188,-2572 }, { 189,-2572 }, { 190,-2572 }, { 191,-2572 }, + { 192,-2572 }, { 193,-2572 }, { 194,-2572 }, { 195,-2572 }, { 196,-2572 }, + { 197,-2572 }, { 198,-2572 }, { 199,-2572 }, { 200,-2572 }, { 201,-2572 }, + { 202,-2572 }, { 203,-2572 }, { 204,-2572 }, { 205,-2572 }, { 206,-2572 }, + { 207,-2572 }, { 208,-2572 }, { 209,-2572 }, { 210,-2572 }, { 211,-2572 }, + + { 212,-2572 }, { 213,-2572 }, { 214,-2572 }, { 215,-2572 }, { 216,-2572 }, + { 217,-2572 }, { 218,-2572 }, { 219,-2572 }, { 220,-2572 }, { 221,-2572 }, + { 222,-2572 }, { 223,-2572 }, { 224,-2572 }, { 225,-2572 }, { 226,-2572 }, + { 227,-2572 }, { 228,-2572 }, { 229,-2572 }, { 230,-2572 }, { 231,-2572 }, + { 232,-2572 }, { 233,-2572 }, { 234,-2572 }, { 235,-2572 }, { 236,-2572 }, + { 237,-2572 }, { 238,-2572 }, { 239,-2572 }, { 240,-2572 }, { 241,-2572 }, + { 242,-2572 }, { 243,-2572 }, { 244,-2572 }, { 245,-2572 }, { 246,-2572 }, + { 247,-2572 }, { 248,-2572 }, { 249,-2572 }, { 250,-2572 }, { 251,-2572 }, + { 252,-2572 }, { 253,-2572 }, { 254,-2572 }, { 255,-2572 }, { 0, 131 }, + { 0,89294 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0,89279 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0,89268 }, { 0, 0 }, { 0,89266 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-2829 }, { 49,-2829 }, + { 50,-2829 }, { 51,-2829 }, { 52,-2829 }, { 53,-2829 }, { 54,-2829 }, + + { 55,-2829 }, { 56,-2829 }, { 57,-2829 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-2829 }, { 66,-2829 }, { 67,14753 }, { 68,-2829 }, { 69,-2829 }, + { 70,15010 }, { 71,-2829 }, { 72,-2829 }, { 73,-2829 }, { 74,-2829 }, + { 75,-2829 }, { 76,-2829 }, { 77,-2829 }, { 78,-2829 }, { 79,-2829 }, + { 80,-2829 }, { 81,-2829 }, { 82,-2829 }, { 83,-2829 }, { 84,-2829 }, + { 85,-2829 }, { 86,-2829 }, { 87,-2829 }, { 88,-2829 }, { 89,-2829 }, + { 90,-2829 }, { 76,41728 }, { 66,1019 }, { 65,1264 }, { 0, 0 }, + { 95,-2829 }, { 0, 0 }, { 97,-2829 }, { 98,-2829 }, { 99,14753 }, + { 100,-2829 }, { 101,-2829 }, { 102,15010 }, { 103,-2829 }, { 104,-2829 }, + + { 105,-2829 }, { 106,-2829 }, { 107,-2829 }, { 108,-2829 }, { 109,-2829 }, + { 110,-2829 }, { 111,-2829 }, { 112,-2829 }, { 113,-2829 }, { 114,-2829 }, + { 115,-2829 }, { 116,-2829 }, { 117,-2829 }, { 118,-2829 }, { 119,-2829 }, + { 120,-2829 }, { 121,-2829 }, { 122,-2829 }, { 108,41728 }, { 98,1019 }, + { 97,1264 }, { 0, 0 }, { 127,-2829 }, { 128,-2829 }, { 129,-2829 }, + { 130,-2829 }, { 131,-2829 }, { 132,-2829 }, { 133,-2829 }, { 134,-2829 }, + { 135,-2829 }, { 136,-2829 }, { 137,-2829 }, { 138,-2829 }, { 139,-2829 }, + { 140,-2829 }, { 141,-2829 }, { 142,-2829 }, { 143,-2829 }, { 144,-2829 }, + { 145,-2829 }, { 146,-2829 }, { 147,-2829 }, { 148,-2829 }, { 149,-2829 }, + { 150,-2829 }, { 151,-2829 }, { 152,-2829 }, { 153,-2829 }, { 154,-2829 }, + + { 155,-2829 }, { 156,-2829 }, { 157,-2829 }, { 158,-2829 }, { 159,-2829 }, + { 160,-2829 }, { 161,-2829 }, { 162,-2829 }, { 163,-2829 }, { 164,-2829 }, + { 165,-2829 }, { 166,-2829 }, { 167,-2829 }, { 168,-2829 }, { 169,-2829 }, + { 170,-2829 }, { 171,-2829 }, { 172,-2829 }, { 173,-2829 }, { 174,-2829 }, + { 175,-2829 }, { 176,-2829 }, { 177,-2829 }, { 178,-2829 }, { 179,-2829 }, + { 180,-2829 }, { 181,-2829 }, { 182,-2829 }, { 183,-2829 }, { 184,-2829 }, + { 185,-2829 }, { 186,-2829 }, { 187,-2829 }, { 188,-2829 }, { 189,-2829 }, + { 190,-2829 }, { 191,-2829 }, { 192,-2829 }, { 193,-2829 }, { 194,-2829 }, + { 195,-2829 }, { 196,-2829 }, { 197,-2829 }, { 198,-2829 }, { 199,-2829 }, + { 200,-2829 }, { 201,-2829 }, { 202,-2829 }, { 203,-2829 }, { 204,-2829 }, + + { 205,-2829 }, { 206,-2829 }, { 207,-2829 }, { 208,-2829 }, { 209,-2829 }, + { 210,-2829 }, { 211,-2829 }, { 212,-2829 }, { 213,-2829 }, { 214,-2829 }, + { 215,-2829 }, { 216,-2829 }, { 217,-2829 }, { 218,-2829 }, { 219,-2829 }, + { 220,-2829 }, { 221,-2829 }, { 222,-2829 }, { 223,-2829 }, { 224,-2829 }, + { 225,-2829 }, { 226,-2829 }, { 227,-2829 }, { 228,-2829 }, { 229,-2829 }, + { 230,-2829 }, { 231,-2829 }, { 232,-2829 }, { 233,-2829 }, { 234,-2829 }, + { 235,-2829 }, { 236,-2829 }, { 237,-2829 }, { 238,-2829 }, { 239,-2829 }, + { 240,-2829 }, { 241,-2829 }, { 242,-2829 }, { 243,-2829 }, { 244,-2829 }, + { 245,-2829 }, { 246,-2829 }, { 247,-2829 }, { 248,-2829 }, { 249,-2829 }, + { 250,-2829 }, { 251,-2829 }, { 252,-2829 }, { 253,-2829 }, { 254,-2829 }, + + { 255,-2829 }, { 0, 36 }, { 0,89037 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0,89015 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 48,-3086 }, { 49,-3086 }, { 50,-3086 }, { 51,-3086 }, { 52,-3086 }, + { 53,-3086 }, { 54,-3086 }, { 55,-3086 }, { 56,-3086 }, { 57,-3086 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-3086 }, { 66,-3086 }, { 67,-3086 }, + { 68,-3086 }, { 69,-3086 }, { 70,-3086 }, { 71,-3086 }, { 72,-3086 }, + { 73,-3086 }, { 74,-3086 }, { 75,-3086 }, { 76,-3086 }, { 77,-3086 }, + { 78,-3086 }, { 79,-3086 }, { 80,-3086 }, { 81,-3086 }, { 82,-3086 }, + { 83,-3086 }, { 84,-3086 }, { 85,-3086 }, { 86,-3086 }, { 87,-3086 }, + { 88,-3086 }, { 89,-3086 }, { 90,-3086 }, { 69,1288 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-3086 }, { 0, 0 }, { 97,-3086 }, + + { 98,-3086 }, { 99,-3086 }, { 100,-3086 }, { 101,-3086 }, { 102,-3086 }, + { 103,-3086 }, { 104,-3086 }, { 105,-3086 }, { 106,-3086 }, { 107,-3086 }, + { 108,-3086 }, { 109,-3086 }, { 110,-3086 }, { 111,-3086 }, { 112,-3086 }, + { 113,-3086 }, { 114,-3086 }, { 115,-3086 }, { 116,-3086 }, { 117,-3086 }, + { 118,-3086 }, { 119,-3086 }, { 120,-3086 }, { 121,-3086 }, { 122,-3086 }, + { 101,1288 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-3086 }, + { 128,-3086 }, { 129,-3086 }, { 130,-3086 }, { 131,-3086 }, { 132,-3086 }, + { 133,-3086 }, { 134,-3086 }, { 135,-3086 }, { 136,-3086 }, { 137,-3086 }, + { 138,-3086 }, { 139,-3086 }, { 140,-3086 }, { 141,-3086 }, { 142,-3086 }, + { 143,-3086 }, { 144,-3086 }, { 145,-3086 }, { 146,-3086 }, { 147,-3086 }, + + { 148,-3086 }, { 149,-3086 }, { 150,-3086 }, { 151,-3086 }, { 152,-3086 }, + { 153,-3086 }, { 154,-3086 }, { 155,-3086 }, { 156,-3086 }, { 157,-3086 }, + { 158,-3086 }, { 159,-3086 }, { 160,-3086 }, { 161,-3086 }, { 162,-3086 }, + { 163,-3086 }, { 164,-3086 }, { 165,-3086 }, { 166,-3086 }, { 167,-3086 }, + { 168,-3086 }, { 169,-3086 }, { 170,-3086 }, { 171,-3086 }, { 172,-3086 }, + { 173,-3086 }, { 174,-3086 }, { 175,-3086 }, { 176,-3086 }, { 177,-3086 }, + { 178,-3086 }, { 179,-3086 }, { 180,-3086 }, { 181,-3086 }, { 182,-3086 }, + { 183,-3086 }, { 184,-3086 }, { 185,-3086 }, { 186,-3086 }, { 187,-3086 }, + { 188,-3086 }, { 189,-3086 }, { 190,-3086 }, { 191,-3086 }, { 192,-3086 }, + { 193,-3086 }, { 194,-3086 }, { 195,-3086 }, { 196,-3086 }, { 197,-3086 }, + + { 198,-3086 }, { 199,-3086 }, { 200,-3086 }, { 201,-3086 }, { 202,-3086 }, + { 203,-3086 }, { 204,-3086 }, { 205,-3086 }, { 206,-3086 }, { 207,-3086 }, + { 208,-3086 }, { 209,-3086 }, { 210,-3086 }, { 211,-3086 }, { 212,-3086 }, + { 213,-3086 }, { 214,-3086 }, { 215,-3086 }, { 216,-3086 }, { 217,-3086 }, + { 218,-3086 }, { 219,-3086 }, { 220,-3086 }, { 221,-3086 }, { 222,-3086 }, + { 223,-3086 }, { 224,-3086 }, { 225,-3086 }, { 226,-3086 }, { 227,-3086 }, + { 228,-3086 }, { 229,-3086 }, { 230,-3086 }, { 231,-3086 }, { 232,-3086 }, + { 233,-3086 }, { 234,-3086 }, { 235,-3086 }, { 236,-3086 }, { 237,-3086 }, + { 238,-3086 }, { 239,-3086 }, { 240,-3086 }, { 241,-3086 }, { 242,-3086 }, + { 243,-3086 }, { 244,-3086 }, { 245,-3086 }, { 246,-3086 }, { 247,-3086 }, + + { 248,-3086 }, { 249,-3086 }, { 250,-3086 }, { 251,-3086 }, { 252,-3086 }, + { 253,-3086 }, { 254,-3086 }, { 255,-3086 }, { 0, 131 }, { 0,88780 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0,88765 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0,88761 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0,88756 }, { 0, 7 }, + { 0,88754 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 9, 0 }, + { 10, 0 }, { 0, 0 }, { 0, 0 }, { 13, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-3343 }, { 49,-3343 }, { 50,-3343 }, + { 51,-3343 }, { 52,-3343 }, { 53,-3343 }, { 54,-3343 }, { 55,-3343 }, + { 56,-3343 }, { 57,-3343 }, { 32, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-3343 }, + { 66,-3343 }, { 67,-3343 }, { 68,-3343 }, { 69,-3343 }, { 70,-3343 }, + { 71,-3343 }, { 72,14753 }, { 73,-3343 }, { 74,-3343 }, { 75,-3343 }, + { 76,-3343 }, { 77,-3343 }, { 78,-3343 }, { 79,-3343 }, { 80,-3343 }, + { 81,-3343 }, { 82,-3343 }, { 83,-3343 }, { 84,-3343 }, { 85,-3343 }, + { 86,-3343 }, { 87,-3343 }, { 88,-3343 }, { 89,-3343 }, { 90,-3343 }, + + { 76,1272 }, { 73,1279 }, { 69,1525 }, { 0, 0 }, { 95,-3343 }, + { 0, 0 }, { 97,-3343 }, { 98,-3343 }, { 99,-3343 }, { 100,-3343 }, + { 101,-3343 }, { 102,-3343 }, { 103,-3343 }, { 104,14753 }, { 105,-3343 }, + { 106,-3343 }, { 107,-3343 }, { 108,-3343 }, { 109,-3343 }, { 110,-3343 }, + { 111,-3343 }, { 112,-3343 }, { 113,-3343 }, { 114,-3343 }, { 115,-3343 }, + { 116,-3343 }, { 117,-3343 }, { 118,-3343 }, { 119,-3343 }, { 120,-3343 }, + { 121,-3343 }, { 122,-3343 }, { 108,1272 }, { 105,1279 }, { 101,1525 }, + { 0, 0 }, { 127,-3343 }, { 128,-3343 }, { 129,-3343 }, { 130,-3343 }, + { 131,-3343 }, { 132,-3343 }, { 133,-3343 }, { 134,-3343 }, { 135,-3343 }, + { 136,-3343 }, { 137,-3343 }, { 138,-3343 }, { 139,-3343 }, { 140,-3343 }, + + { 141,-3343 }, { 142,-3343 }, { 143,-3343 }, { 144,-3343 }, { 145,-3343 }, + { 146,-3343 }, { 147,-3343 }, { 148,-3343 }, { 149,-3343 }, { 150,-3343 }, + { 151,-3343 }, { 152,-3343 }, { 153,-3343 }, { 154,-3343 }, { 155,-3343 }, + { 156,-3343 }, { 157,-3343 }, { 158,-3343 }, { 159,-3343 }, { 160,-3343 }, + { 161,-3343 }, { 162,-3343 }, { 163,-3343 }, { 164,-3343 }, { 165,-3343 }, + { 166,-3343 }, { 167,-3343 }, { 168,-3343 }, { 169,-3343 }, { 170,-3343 }, + { 171,-3343 }, { 172,-3343 }, { 173,-3343 }, { 174,-3343 }, { 175,-3343 }, + { 176,-3343 }, { 177,-3343 }, { 178,-3343 }, { 179,-3343 }, { 180,-3343 }, + { 181,-3343 }, { 182,-3343 }, { 183,-3343 }, { 184,-3343 }, { 185,-3343 }, + { 186,-3343 }, { 187,-3343 }, { 188,-3343 }, { 189,-3343 }, { 190,-3343 }, + + { 191,-3343 }, { 192,-3343 }, { 193,-3343 }, { 194,-3343 }, { 195,-3343 }, + { 196,-3343 }, { 197,-3343 }, { 198,-3343 }, { 199,-3343 }, { 200,-3343 }, + { 201,-3343 }, { 202,-3343 }, { 203,-3343 }, { 204,-3343 }, { 205,-3343 }, + { 206,-3343 }, { 207,-3343 }, { 208,-3343 }, { 209,-3343 }, { 210,-3343 }, + { 211,-3343 }, { 212,-3343 }, { 213,-3343 }, { 214,-3343 }, { 215,-3343 }, + { 216,-3343 }, { 217,-3343 }, { 218,-3343 }, { 219,-3343 }, { 220,-3343 }, + { 221,-3343 }, { 222,-3343 }, { 223,-3343 }, { 224,-3343 }, { 225,-3343 }, + { 226,-3343 }, { 227,-3343 }, { 228,-3343 }, { 229,-3343 }, { 230,-3343 }, + { 231,-3343 }, { 232,-3343 }, { 233,-3343 }, { 234,-3343 }, { 235,-3343 }, + { 236,-3343 }, { 237,-3343 }, { 238,-3343 }, { 239,-3343 }, { 240,-3343 }, + + { 241,-3343 }, { 242,-3343 }, { 243,-3343 }, { 244,-3343 }, { 245,-3343 }, + { 246,-3343 }, { 247,-3343 }, { 248,-3343 }, { 249,-3343 }, { 250,-3343 }, + { 251,-3343 }, { 252,-3343 }, { 253,-3343 }, { 254,-3343 }, { 255,-3343 }, + { 0, 131 }, { 0,88523 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0,88514 }, { 0, 135 }, { 0,88512 }, { 0, 0 }, { 0,88510 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 9, 0 }, { 0, 0 }, { 9,1293 }, { 10,1293 }, + { 0, 0 }, { 0, 0 }, { 13,1295 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32, 0 }, + { 0, 0 }, { 32,1293 }, { 0, 0 }, { 0, 0 }, { 48,-3600 }, + { 49,-3600 }, { 50,-3600 }, { 51,-3600 }, { 52,-3600 }, { 53,-3600 }, + { 54,-3600 }, { 55,-3600 }, { 56,-3600 }, { 57,-3600 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-3600 }, { 66,-3600 }, { 67,-3600 }, { 68,-3600 }, + { 69,-3600 }, { 70,-3600 }, { 71,-3600 }, { 72,-3600 }, { 73,-3600 }, + { 74,-3600 }, { 75,-3600 }, { 76,-3600 }, { 77,-3600 }, { 78,-3600 }, + { 79,-3600 }, { 80,-3600 }, { 81,-3600 }, { 82,-3600 }, { 83,14753 }, + + { 84,-3600 }, { 85,-3600 }, { 86,-3600 }, { 87,-3600 }, { 88,-3600 }, + { 89,-3600 }, { 90,-3600 }, { 82,1295 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-3600 }, { 0, 0 }, { 97,-3600 }, { 98,-3600 }, + { 99,-3600 }, { 100,-3600 }, { 101,-3600 }, { 102,-3600 }, { 103,-3600 }, + { 104,-3600 }, { 105,-3600 }, { 106,-3600 }, { 107,-3600 }, { 108,-3600 }, + { 109,-3600 }, { 110,-3600 }, { 111,-3600 }, { 112,-3600 }, { 113,-3600 }, + { 114,-3600 }, { 115,14753 }, { 116,-3600 }, { 117,-3600 }, { 118,-3600 }, + { 119,-3600 }, { 120,-3600 }, { 121,-3600 }, { 122,-3600 }, { 114,1295 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-3600 }, { 128,-3600 }, + { 129,-3600 }, { 130,-3600 }, { 131,-3600 }, { 132,-3600 }, { 133,-3600 }, + + { 134,-3600 }, { 135,-3600 }, { 136,-3600 }, { 137,-3600 }, { 138,-3600 }, + { 139,-3600 }, { 140,-3600 }, { 141,-3600 }, { 142,-3600 }, { 143,-3600 }, + { 144,-3600 }, { 145,-3600 }, { 146,-3600 }, { 147,-3600 }, { 148,-3600 }, + { 149,-3600 }, { 150,-3600 }, { 151,-3600 }, { 152,-3600 }, { 153,-3600 }, + { 154,-3600 }, { 155,-3600 }, { 156,-3600 }, { 157,-3600 }, { 158,-3600 }, + { 159,-3600 }, { 160,-3600 }, { 161,-3600 }, { 162,-3600 }, { 163,-3600 }, + { 164,-3600 }, { 165,-3600 }, { 166,-3600 }, { 167,-3600 }, { 168,-3600 }, + { 169,-3600 }, { 170,-3600 }, { 171,-3600 }, { 172,-3600 }, { 173,-3600 }, + { 174,-3600 }, { 175,-3600 }, { 176,-3600 }, { 177,-3600 }, { 178,-3600 }, + { 179,-3600 }, { 180,-3600 }, { 181,-3600 }, { 182,-3600 }, { 183,-3600 }, + + { 184,-3600 }, { 185,-3600 }, { 186,-3600 }, { 187,-3600 }, { 188,-3600 }, + { 189,-3600 }, { 190,-3600 }, { 191,-3600 }, { 192,-3600 }, { 193,-3600 }, + { 194,-3600 }, { 195,-3600 }, { 196,-3600 }, { 197,-3600 }, { 198,-3600 }, + { 199,-3600 }, { 200,-3600 }, { 201,-3600 }, { 202,-3600 }, { 203,-3600 }, + { 204,-3600 }, { 205,-3600 }, { 206,-3600 }, { 207,-3600 }, { 208,-3600 }, + { 209,-3600 }, { 210,-3600 }, { 211,-3600 }, { 212,-3600 }, { 213,-3600 }, + { 214,-3600 }, { 215,-3600 }, { 216,-3600 }, { 217,-3600 }, { 218,-3600 }, + { 219,-3600 }, { 220,-3600 }, { 221,-3600 }, { 222,-3600 }, { 223,-3600 }, + { 224,-3600 }, { 225,-3600 }, { 226,-3600 }, { 227,-3600 }, { 228,-3600 }, + { 229,-3600 }, { 230,-3600 }, { 231,-3600 }, { 232,-3600 }, { 233,-3600 }, + + { 234,-3600 }, { 235,-3600 }, { 236,-3600 }, { 237,-3600 }, { 238,-3600 }, + { 239,-3600 }, { 240,-3600 }, { 241,-3600 }, { 242,-3600 }, { 243,-3600 }, + { 244,-3600 }, { 245,-3600 }, { 246,-3600 }, { 247,-3600 }, { 248,-3600 }, + { 249,-3600 }, { 250,-3600 }, { 251,-3600 }, { 252,-3600 }, { 253,-3600 }, + { 254,-3600 }, { 255,-3600 }, { 0, 131 }, { 0,88266 }, { 0, 0 }, + { 0,88264 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0,88256 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0,88249 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-3857 }, { 49,-3857 }, { 50,-3857 }, { 51,-3857 }, + { 52,-3857 }, { 53,-3857 }, { 54,-3857 }, { 55,-3857 }, { 56,-3857 }, + { 57,-3857 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-3857 }, { 66,-3857 }, + { 67,-3857 }, { 68,-3857 }, { 69,-3857 }, { 70,-3857 }, { 71,-3857 }, + { 72,-3857 }, { 73,-3857 }, { 74,-3857 }, { 75,-3857 }, { 76,-3857 }, + + { 77,-3857 }, { 78,-3857 }, { 79,-3857 }, { 80,14753 }, { 81,-3857 }, + { 82,-3857 }, { 83,-3857 }, { 84,-3857 }, { 85,-3857 }, { 86,-3857 }, + { 87,-3857 }, { 88,-3857 }, { 89,-3857 }, { 90,-3857 }, { 89,1285 }, + { 82,1279 }, { 76,1547 }, { 0, 0 }, { 95,-3857 }, { 0, 0 }, + { 97,-3857 }, { 98,-3857 }, { 99,-3857 }, { 100,-3857 }, { 101,-3857 }, + { 102,-3857 }, { 103,-3857 }, { 104,-3857 }, { 105,-3857 }, { 106,-3857 }, + { 107,-3857 }, { 108,-3857 }, { 109,-3857 }, { 110,-3857 }, { 111,-3857 }, + { 112,14753 }, { 113,-3857 }, { 114,-3857 }, { 115,-3857 }, { 116,-3857 }, + { 117,-3857 }, { 118,-3857 }, { 119,-3857 }, { 120,-3857 }, { 121,-3857 }, + { 122,-3857 }, { 121,1285 }, { 114,1279 }, { 108,1547 }, { 0, 0 }, + + { 127,-3857 }, { 128,-3857 }, { 129,-3857 }, { 130,-3857 }, { 131,-3857 }, + { 132,-3857 }, { 133,-3857 }, { 134,-3857 }, { 135,-3857 }, { 136,-3857 }, + { 137,-3857 }, { 138,-3857 }, { 139,-3857 }, { 140,-3857 }, { 141,-3857 }, + { 142,-3857 }, { 143,-3857 }, { 144,-3857 }, { 145,-3857 }, { 146,-3857 }, + { 147,-3857 }, { 148,-3857 }, { 149,-3857 }, { 150,-3857 }, { 151,-3857 }, + { 152,-3857 }, { 153,-3857 }, { 154,-3857 }, { 155,-3857 }, { 156,-3857 }, + { 157,-3857 }, { 158,-3857 }, { 159,-3857 }, { 160,-3857 }, { 161,-3857 }, + { 162,-3857 }, { 163,-3857 }, { 164,-3857 }, { 165,-3857 }, { 166,-3857 }, + { 167,-3857 }, { 168,-3857 }, { 169,-3857 }, { 170,-3857 }, { 171,-3857 }, + { 172,-3857 }, { 173,-3857 }, { 174,-3857 }, { 175,-3857 }, { 176,-3857 }, + + { 177,-3857 }, { 178,-3857 }, { 179,-3857 }, { 180,-3857 }, { 181,-3857 }, + { 182,-3857 }, { 183,-3857 }, { 184,-3857 }, { 185,-3857 }, { 186,-3857 }, + { 187,-3857 }, { 188,-3857 }, { 189,-3857 }, { 190,-3857 }, { 191,-3857 }, + { 192,-3857 }, { 193,-3857 }, { 194,-3857 }, { 195,-3857 }, { 196,-3857 }, + { 197,-3857 }, { 198,-3857 }, { 199,-3857 }, { 200,-3857 }, { 201,-3857 }, + { 202,-3857 }, { 203,-3857 }, { 204,-3857 }, { 205,-3857 }, { 206,-3857 }, + { 207,-3857 }, { 208,-3857 }, { 209,-3857 }, { 210,-3857 }, { 211,-3857 }, + { 212,-3857 }, { 213,-3857 }, { 214,-3857 }, { 215,-3857 }, { 216,-3857 }, + { 217,-3857 }, { 218,-3857 }, { 219,-3857 }, { 220,-3857 }, { 221,-3857 }, + { 222,-3857 }, { 223,-3857 }, { 224,-3857 }, { 225,-3857 }, { 226,-3857 }, + + { 227,-3857 }, { 228,-3857 }, { 229,-3857 }, { 230,-3857 }, { 231,-3857 }, + { 232,-3857 }, { 233,-3857 }, { 234,-3857 }, { 235,-3857 }, { 236,-3857 }, + { 237,-3857 }, { 238,-3857 }, { 239,-3857 }, { 240,-3857 }, { 241,-3857 }, + { 242,-3857 }, { 243,-3857 }, { 244,-3857 }, { 245,-3857 }, { 246,-3857 }, + { 247,-3857 }, { 248,-3857 }, { 249,-3857 }, { 250,-3857 }, { 251,-3857 }, + { 252,-3857 }, { 253,-3857 }, { 254,-3857 }, { 255,-3857 }, { 0, 131 }, + { 0,88009 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0,88002 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-4114 }, { 49,-4114 }, + { 50,-4114 }, { 51,-4114 }, { 52,-4114 }, { 53,-4114 }, { 54,-4114 }, + { 55,-4114 }, { 56,-4114 }, { 57,-4114 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-4114 }, { 66,-4114 }, { 67,-4114 }, { 68,14753 }, { 69,-4114 }, + + { 70,-4114 }, { 71,-4114 }, { 72,-4114 }, { 73,-4114 }, { 74,-4114 }, + { 75,-4114 }, { 76,-4114 }, { 77,-4114 }, { 78,-4114 }, { 79,-4114 }, + { 80,-4114 }, { 81,-4114 }, { 82,-4114 }, { 83,-4114 }, { 84,-4114 }, + { 85,-4114 }, { 86,-4114 }, { 87,-4114 }, { 88,-4114 }, { 89,-4114 }, + { 90,-4114 }, { 84,1537 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-4114 }, { 0, 0 }, { 97,-4114 }, { 98,-4114 }, { 99,-4114 }, + { 100,14753 }, { 101,-4114 }, { 102,-4114 }, { 103,-4114 }, { 104,-4114 }, + { 105,-4114 }, { 106,-4114 }, { 107,-4114 }, { 108,-4114 }, { 109,-4114 }, + { 110,-4114 }, { 111,-4114 }, { 112,-4114 }, { 113,-4114 }, { 114,-4114 }, + { 115,-4114 }, { 116,-4114 }, { 117,-4114 }, { 118,-4114 }, { 119,-4114 }, + + { 120,-4114 }, { 121,-4114 }, { 122,-4114 }, { 116,1537 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-4114 }, { 128,-4114 }, { 129,-4114 }, + { 130,-4114 }, { 131,-4114 }, { 132,-4114 }, { 133,-4114 }, { 134,-4114 }, + { 135,-4114 }, { 136,-4114 }, { 137,-4114 }, { 138,-4114 }, { 139,-4114 }, + { 140,-4114 }, { 141,-4114 }, { 142,-4114 }, { 143,-4114 }, { 144,-4114 }, + { 145,-4114 }, { 146,-4114 }, { 147,-4114 }, { 148,-4114 }, { 149,-4114 }, + { 150,-4114 }, { 151,-4114 }, { 152,-4114 }, { 153,-4114 }, { 154,-4114 }, + { 155,-4114 }, { 156,-4114 }, { 157,-4114 }, { 158,-4114 }, { 159,-4114 }, + { 160,-4114 }, { 161,-4114 }, { 162,-4114 }, { 163,-4114 }, { 164,-4114 }, + { 165,-4114 }, { 166,-4114 }, { 167,-4114 }, { 168,-4114 }, { 169,-4114 }, + + { 170,-4114 }, { 171,-4114 }, { 172,-4114 }, { 173,-4114 }, { 174,-4114 }, + { 175,-4114 }, { 176,-4114 }, { 177,-4114 }, { 178,-4114 }, { 179,-4114 }, + { 180,-4114 }, { 181,-4114 }, { 182,-4114 }, { 183,-4114 }, { 184,-4114 }, + { 185,-4114 }, { 186,-4114 }, { 187,-4114 }, { 188,-4114 }, { 189,-4114 }, + { 190,-4114 }, { 191,-4114 }, { 192,-4114 }, { 193,-4114 }, { 194,-4114 }, + { 195,-4114 }, { 196,-4114 }, { 197,-4114 }, { 198,-4114 }, { 199,-4114 }, + { 200,-4114 }, { 201,-4114 }, { 202,-4114 }, { 203,-4114 }, { 204,-4114 }, + { 205,-4114 }, { 206,-4114 }, { 207,-4114 }, { 208,-4114 }, { 209,-4114 }, + { 210,-4114 }, { 211,-4114 }, { 212,-4114 }, { 213,-4114 }, { 214,-4114 }, + { 215,-4114 }, { 216,-4114 }, { 217,-4114 }, { 218,-4114 }, { 219,-4114 }, + + { 220,-4114 }, { 221,-4114 }, { 222,-4114 }, { 223,-4114 }, { 224,-4114 }, + { 225,-4114 }, { 226,-4114 }, { 227,-4114 }, { 228,-4114 }, { 229,-4114 }, + { 230,-4114 }, { 231,-4114 }, { 232,-4114 }, { 233,-4114 }, { 234,-4114 }, + { 235,-4114 }, { 236,-4114 }, { 237,-4114 }, { 238,-4114 }, { 239,-4114 }, + { 240,-4114 }, { 241,-4114 }, { 242,-4114 }, { 243,-4114 }, { 244,-4114 }, + { 245,-4114 }, { 246,-4114 }, { 247,-4114 }, { 248,-4114 }, { 249,-4114 }, + { 250,-4114 }, { 251,-4114 }, { 252,-4114 }, { 253,-4114 }, { 254,-4114 }, + { 255,-4114 }, { 0, 131 }, { 0,87752 }, { 0, 0 }, { 0,87750 }, + { 0, 122 }, { 0,87748 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 9, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0,87732 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0,87727 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 32, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 41, 2 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-4371 }, { 49,-4371 }, { 50,-4371 }, { 51,-4371 }, { 52,-4371 }, + { 53,-4371 }, { 54,-4371 }, { 55,-4371 }, { 56,-4371 }, { 57,-4371 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 65,14753 }, { 66,-4371 }, { 67,-4371 }, + { 68,-4371 }, { 69,-4371 }, { 70,-4371 }, { 71,-4371 }, { 72,-4371 }, + { 73,-4371 }, { 74,-4371 }, { 75,-4371 }, { 76,-4371 }, { 77,-4371 }, + { 78,-4371 }, { 79,-4371 }, { 80,-4371 }, { 81,-4371 }, { 82,-4371 }, + { 83,-4371 }, { 84,-4371 }, { 85,-4371 }, { 86,-4371 }, { 87,-4371 }, + { 88,-4371 }, { 89,-4371 }, { 90,-4371 }, { 71,1287 }, { 67,1524 }, + { 0, 0 }, { 0, 0 }, { 95,-4371 }, { 0, 0 }, { 97,14753 }, + { 98,-4371 }, { 99,-4371 }, { 100,-4371 }, { 101,-4371 }, { 102,-4371 }, + { 103,-4371 }, { 104,-4371 }, { 105,-4371 }, { 106,-4371 }, { 107,-4371 }, + { 108,-4371 }, { 109,-4371 }, { 110,-4371 }, { 111,-4371 }, { 112,-4371 }, + + { 113,-4371 }, { 114,-4371 }, { 115,-4371 }, { 116,-4371 }, { 117,-4371 }, + { 118,-4371 }, { 119,-4371 }, { 120,-4371 }, { 121,-4371 }, { 122,-4371 }, + { 103,1287 }, { 99,1524 }, { 0, 0 }, { 0, 0 }, { 127,-4371 }, + { 128,-4371 }, { 129,-4371 }, { 130,-4371 }, { 131,-4371 }, { 132,-4371 }, + { 133,-4371 }, { 134,-4371 }, { 135,-4371 }, { 136,-4371 }, { 137,-4371 }, + { 138,-4371 }, { 139,-4371 }, { 140,-4371 }, { 141,-4371 }, { 142,-4371 }, + { 143,-4371 }, { 144,-4371 }, { 145,-4371 }, { 146,-4371 }, { 147,-4371 }, + { 148,-4371 }, { 149,-4371 }, { 150,-4371 }, { 151,-4371 }, { 152,-4371 }, + { 153,-4371 }, { 154,-4371 }, { 155,-4371 }, { 156,-4371 }, { 157,-4371 }, + { 158,-4371 }, { 159,-4371 }, { 160,-4371 }, { 161,-4371 }, { 162,-4371 }, + + { 163,-4371 }, { 164,-4371 }, { 165,-4371 }, { 166,-4371 }, { 167,-4371 }, + { 168,-4371 }, { 169,-4371 }, { 170,-4371 }, { 171,-4371 }, { 172,-4371 }, + { 173,-4371 }, { 174,-4371 }, { 175,-4371 }, { 176,-4371 }, { 177,-4371 }, + { 178,-4371 }, { 179,-4371 }, { 180,-4371 }, { 181,-4371 }, { 182,-4371 }, + { 183,-4371 }, { 184,-4371 }, { 185,-4371 }, { 186,-4371 }, { 187,-4371 }, + { 188,-4371 }, { 189,-4371 }, { 190,-4371 }, { 191,-4371 }, { 192,-4371 }, + { 193,-4371 }, { 194,-4371 }, { 195,-4371 }, { 196,-4371 }, { 197,-4371 }, + { 198,-4371 }, { 199,-4371 }, { 200,-4371 }, { 201,-4371 }, { 202,-4371 }, + { 203,-4371 }, { 204,-4371 }, { 205,-4371 }, { 206,-4371 }, { 207,-4371 }, + { 208,-4371 }, { 209,-4371 }, { 210,-4371 }, { 211,-4371 }, { 212,-4371 }, + + { 213,-4371 }, { 214,-4371 }, { 215,-4371 }, { 216,-4371 }, { 217,-4371 }, + { 218,-4371 }, { 219,-4371 }, { 220,-4371 }, { 221,-4371 }, { 222,-4371 }, + { 223,-4371 }, { 224,-4371 }, { 225,-4371 }, { 226,-4371 }, { 227,-4371 }, + { 228,-4371 }, { 229,-4371 }, { 230,-4371 }, { 231,-4371 }, { 232,-4371 }, + { 233,-4371 }, { 234,-4371 }, { 235,-4371 }, { 236,-4371 }, { 237,-4371 }, + { 238,-4371 }, { 239,-4371 }, { 240,-4371 }, { 241,-4371 }, { 242,-4371 }, + { 243,-4371 }, { 244,-4371 }, { 245,-4371 }, { 246,-4371 }, { 247,-4371 }, + { 248,-4371 }, { 249,-4371 }, { 250,-4371 }, { 251,-4371 }, { 252,-4371 }, + { 253,-4371 }, { 254,-4371 }, { 255,-4371 }, { 0, 131 }, { 0,87495 }, + { 0, 0 }, { 0,87493 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 9,1542 }, { 0, 0 }, { 0,87482 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32,1542 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 41,1544 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-4628 }, { 49,-4628 }, { 50,-4628 }, + { 51,-4628 }, { 52,-4628 }, { 53,-4628 }, { 54,-4628 }, { 55,-4628 }, + + { 56,-4628 }, { 57,-4628 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-4628 }, + { 66,-4628 }, { 67,-4628 }, { 68,-4628 }, { 69,-4628 }, { 70,-4628 }, + { 71,-4628 }, { 72,-4628 }, { 73,14753 }, { 74,-4628 }, { 75,-4628 }, + { 76,-4628 }, { 77,-4628 }, { 78,-4628 }, { 79,-4628 }, { 80,-4628 }, + { 81,-4628 }, { 82,-4628 }, { 83,-4628 }, { 84,15010 }, { 85,-4628 }, + { 86,-4628 }, { 87,-4628 }, { 88,-4628 }, { 89,-4628 }, { 90,-4628 }, + { 78,1549 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-4628 }, + { 0, 0 }, { 97,-4628 }, { 98,-4628 }, { 99,-4628 }, { 100,-4628 }, + { 101,-4628 }, { 102,-4628 }, { 103,-4628 }, { 104,-4628 }, { 105,14753 }, + + { 106,-4628 }, { 107,-4628 }, { 108,-4628 }, { 109,-4628 }, { 110,-4628 }, + { 111,-4628 }, { 112,-4628 }, { 113,-4628 }, { 114,-4628 }, { 115,-4628 }, + { 116,15010 }, { 117,-4628 }, { 118,-4628 }, { 119,-4628 }, { 120,-4628 }, + { 121,-4628 }, { 122,-4628 }, { 110,1549 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-4628 }, { 128,-4628 }, { 129,-4628 }, { 130,-4628 }, + { 131,-4628 }, { 132,-4628 }, { 133,-4628 }, { 134,-4628 }, { 135,-4628 }, + { 136,-4628 }, { 137,-4628 }, { 138,-4628 }, { 139,-4628 }, { 140,-4628 }, + { 141,-4628 }, { 142,-4628 }, { 143,-4628 }, { 144,-4628 }, { 145,-4628 }, + { 146,-4628 }, { 147,-4628 }, { 148,-4628 }, { 149,-4628 }, { 150,-4628 }, + { 151,-4628 }, { 152,-4628 }, { 153,-4628 }, { 154,-4628 }, { 155,-4628 }, + + { 156,-4628 }, { 157,-4628 }, { 158,-4628 }, { 159,-4628 }, { 160,-4628 }, + { 161,-4628 }, { 162,-4628 }, { 163,-4628 }, { 164,-4628 }, { 165,-4628 }, + { 166,-4628 }, { 167,-4628 }, { 168,-4628 }, { 169,-4628 }, { 170,-4628 }, + { 171,-4628 }, { 172,-4628 }, { 173,-4628 }, { 174,-4628 }, { 175,-4628 }, + { 176,-4628 }, { 177,-4628 }, { 178,-4628 }, { 179,-4628 }, { 180,-4628 }, + { 181,-4628 }, { 182,-4628 }, { 183,-4628 }, { 184,-4628 }, { 185,-4628 }, + { 186,-4628 }, { 187,-4628 }, { 188,-4628 }, { 189,-4628 }, { 190,-4628 }, + { 191,-4628 }, { 192,-4628 }, { 193,-4628 }, { 194,-4628 }, { 195,-4628 }, + { 196,-4628 }, { 197,-4628 }, { 198,-4628 }, { 199,-4628 }, { 200,-4628 }, + { 201,-4628 }, { 202,-4628 }, { 203,-4628 }, { 204,-4628 }, { 205,-4628 }, + + { 206,-4628 }, { 207,-4628 }, { 208,-4628 }, { 209,-4628 }, { 210,-4628 }, + { 211,-4628 }, { 212,-4628 }, { 213,-4628 }, { 214,-4628 }, { 215,-4628 }, + { 216,-4628 }, { 217,-4628 }, { 218,-4628 }, { 219,-4628 }, { 220,-4628 }, + { 221,-4628 }, { 222,-4628 }, { 223,-4628 }, { 224,-4628 }, { 225,-4628 }, + { 226,-4628 }, { 227,-4628 }, { 228,-4628 }, { 229,-4628 }, { 230,-4628 }, + { 231,-4628 }, { 232,-4628 }, { 233,-4628 }, { 234,-4628 }, { 235,-4628 }, + { 236,-4628 }, { 237,-4628 }, { 238,-4628 }, { 239,-4628 }, { 240,-4628 }, + { 241,-4628 }, { 242,-4628 }, { 243,-4628 }, { 244,-4628 }, { 245,-4628 }, + { 246,-4628 }, { 247,-4628 }, { 248,-4628 }, { 249,-4628 }, { 250,-4628 }, + { 251,-4628 }, { 252,-4628 }, { 253,-4628 }, { 254,-4628 }, { 255,-4628 }, + + { 0, 131 }, { 0,87238 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0,87231 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0,87219 }, { 0, 1 }, { 0,87217 }, { 0, 1 }, { 0,87215 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 10, -2 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-4885 }, + + { 49,-4885 }, { 50,-4885 }, { 51,-4885 }, { 52,-4885 }, { 53,-4885 }, + { 54,-4885 }, { 55,-4885 }, { 56,-4885 }, { 57,-4885 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-4885 }, { 66,-4885 }, { 67,-4885 }, { 68,-4885 }, + { 69,-4885 }, { 70,-4885 }, { 71,-4885 }, { 72,-4885 }, { 73,-4885 }, + { 74,-4885 }, { 75,-4885 }, { 76,-4885 }, { 77,-4885 }, { 78,15010 }, + { 79,-4885 }, { 80,-4885 }, { 81,-4885 }, { 82,-4885 }, { 83,-4885 }, + { 84,-4885 }, { 85,-4885 }, { 86,-4885 }, { 87,-4885 }, { 88,-4885 }, + { 89,-4885 }, { 90,-4885 }, { 84,1537 }, { 73,1536 }, { 0, 0 }, + { 0, 0 }, { 95,-4885 }, { 0, 0 }, { 97,-4885 }, { 98,-4885 }, + + { 99,-4885 }, { 100,-4885 }, { 101,-4885 }, { 102,-4885 }, { 103,-4885 }, + { 104,-4885 }, { 105,-4885 }, { 106,-4885 }, { 107,-4885 }, { 108,-4885 }, + { 109,-4885 }, { 110,15010 }, { 111,-4885 }, { 112,-4885 }, { 113,-4885 }, + { 114,-4885 }, { 115,-4885 }, { 116,-4885 }, { 117,-4885 }, { 118,-4885 }, + { 119,-4885 }, { 120,-4885 }, { 121,-4885 }, { 122,-4885 }, { 116,1537 }, + { 105,1536 }, { 0, 0 }, { 0, 0 }, { 127,-4885 }, { 128,-4885 }, + { 129,-4885 }, { 130,-4885 }, { 131,-4885 }, { 132,-4885 }, { 133,-4885 }, + { 134,-4885 }, { 135,-4885 }, { 136,-4885 }, { 137,-4885 }, { 138,-4885 }, + { 139,-4885 }, { 140,-4885 }, { 141,-4885 }, { 142,-4885 }, { 143,-4885 }, + { 144,-4885 }, { 145,-4885 }, { 146,-4885 }, { 147,-4885 }, { 148,-4885 }, + + { 149,-4885 }, { 150,-4885 }, { 151,-4885 }, { 152,-4885 }, { 153,-4885 }, + { 154,-4885 }, { 155,-4885 }, { 156,-4885 }, { 157,-4885 }, { 158,-4885 }, + { 159,-4885 }, { 160,-4885 }, { 161,-4885 }, { 162,-4885 }, { 163,-4885 }, + { 164,-4885 }, { 165,-4885 }, { 166,-4885 }, { 167,-4885 }, { 168,-4885 }, + { 169,-4885 }, { 170,-4885 }, { 171,-4885 }, { 172,-4885 }, { 173,-4885 }, + { 174,-4885 }, { 175,-4885 }, { 176,-4885 }, { 177,-4885 }, { 178,-4885 }, + { 179,-4885 }, { 180,-4885 }, { 181,-4885 }, { 182,-4885 }, { 183,-4885 }, + { 184,-4885 }, { 185,-4885 }, { 186,-4885 }, { 187,-4885 }, { 188,-4885 }, + { 189,-4885 }, { 190,-4885 }, { 191,-4885 }, { 192,-4885 }, { 193,-4885 }, + { 194,-4885 }, { 195,-4885 }, { 196,-4885 }, { 197,-4885 }, { 198,-4885 }, + + { 199,-4885 }, { 200,-4885 }, { 201,-4885 }, { 202,-4885 }, { 203,-4885 }, + { 204,-4885 }, { 205,-4885 }, { 206,-4885 }, { 207,-4885 }, { 208,-4885 }, + { 209,-4885 }, { 210,-4885 }, { 211,-4885 }, { 212,-4885 }, { 213,-4885 }, + { 214,-4885 }, { 215,-4885 }, { 216,-4885 }, { 217,-4885 }, { 218,-4885 }, + { 219,-4885 }, { 220,-4885 }, { 221,-4885 }, { 222,-4885 }, { 223,-4885 }, + { 224,-4885 }, { 225,-4885 }, { 226,-4885 }, { 227,-4885 }, { 228,-4885 }, + { 229,-4885 }, { 230,-4885 }, { 231,-4885 }, { 232,-4885 }, { 233,-4885 }, + { 234,-4885 }, { 235,-4885 }, { 236,-4885 }, { 237,-4885 }, { 238,-4885 }, + { 239,-4885 }, { 240,-4885 }, { 241,-4885 }, { 242,-4885 }, { 243,-4885 }, + { 244,-4885 }, { 245,-4885 }, { 246,-4885 }, { 247,-4885 }, { 248,-4885 }, + + { 249,-4885 }, { 250,-4885 }, { 251,-4885 }, { 252,-4885 }, { 253,-4885 }, + { 254,-4885 }, { 255,-4885 }, { 0, 131 }, { 0,86981 }, { 0, 0 }, + { 0,86979 }, { 0, 0 }, { 0,86977 }, { 0, 0 }, { 0,86975 }, + { 0, 127 }, { 0,86973 }, { 0, 0 }, { 0, 0 }, { 9,1542 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 9, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0,86955 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 32,1542 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 32, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 41,1544 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 41, 2 }, { 48,-5142 }, { 49,-5142 }, { 50,-5142 }, { 51,-5142 }, + { 52,-5142 }, { 53,-5142 }, { 54,-5142 }, { 55,-5142 }, { 56,-5142 }, + { 57,-5142 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-5142 }, { 66,-5142 }, + { 67,-5142 }, { 68,-5142 }, { 69,-5142 }, { 70,-5142 }, { 71,-5142 }, + { 72,-5142 }, { 73,-5142 }, { 74,-5142 }, { 75,-5142 }, { 76,-5142 }, + { 77,-5142 }, { 78,-5142 }, { 79,-5142 }, { 80,-5142 }, { 81,-5142 }, + { 82,15010 }, { 83,-5142 }, { 84,-5142 }, { 85,-5142 }, { 86,-5142 }, + { 87,-5142 }, { 88,-5142 }, { 89,-5142 }, { 90,-5142 }, { 65,1529 }, + + { 0, 0 }, { 89,1544 }, { 0, 0 }, { 95,-5142 }, { 0, 0 }, + { 97,-5142 }, { 98,-5142 }, { 99,-5142 }, { 100,-5142 }, { 101,-5142 }, + { 102,-5142 }, { 103,-5142 }, { 104,-5142 }, { 105,-5142 }, { 106,-5142 }, + { 107,-5142 }, { 108,-5142 }, { 109,-5142 }, { 110,-5142 }, { 111,-5142 }, + { 112,-5142 }, { 113,-5142 }, { 114,15010 }, { 115,-5142 }, { 116,-5142 }, + { 117,-5142 }, { 118,-5142 }, { 119,-5142 }, { 120,-5142 }, { 121,-5142 }, + { 122,-5142 }, { 97,1529 }, { 0, 0 }, { 121,1544 }, { 0, 0 }, + { 127,-5142 }, { 128,-5142 }, { 129,-5142 }, { 130,-5142 }, { 131,-5142 }, + { 132,-5142 }, { 133,-5142 }, { 134,-5142 }, { 135,-5142 }, { 136,-5142 }, + { 137,-5142 }, { 138,-5142 }, { 139,-5142 }, { 140,-5142 }, { 141,-5142 }, + + { 142,-5142 }, { 143,-5142 }, { 144,-5142 }, { 145,-5142 }, { 146,-5142 }, + { 147,-5142 }, { 148,-5142 }, { 149,-5142 }, { 150,-5142 }, { 151,-5142 }, + { 152,-5142 }, { 153,-5142 }, { 154,-5142 }, { 155,-5142 }, { 156,-5142 }, + { 157,-5142 }, { 158,-5142 }, { 159,-5142 }, { 160,-5142 }, { 161,-5142 }, + { 162,-5142 }, { 163,-5142 }, { 164,-5142 }, { 165,-5142 }, { 166,-5142 }, + { 167,-5142 }, { 168,-5142 }, { 169,-5142 }, { 170,-5142 }, { 171,-5142 }, + { 172,-5142 }, { 173,-5142 }, { 174,-5142 }, { 175,-5142 }, { 176,-5142 }, + { 177,-5142 }, { 178,-5142 }, { 179,-5142 }, { 180,-5142 }, { 181,-5142 }, + { 182,-5142 }, { 183,-5142 }, { 184,-5142 }, { 185,-5142 }, { 186,-5142 }, + { 187,-5142 }, { 188,-5142 }, { 189,-5142 }, { 190,-5142 }, { 191,-5142 }, + + { 192,-5142 }, { 193,-5142 }, { 194,-5142 }, { 195,-5142 }, { 196,-5142 }, + { 197,-5142 }, { 198,-5142 }, { 199,-5142 }, { 200,-5142 }, { 201,-5142 }, + { 202,-5142 }, { 203,-5142 }, { 204,-5142 }, { 205,-5142 }, { 206,-5142 }, + { 207,-5142 }, { 208,-5142 }, { 209,-5142 }, { 210,-5142 }, { 211,-5142 }, + { 212,-5142 }, { 213,-5142 }, { 214,-5142 }, { 215,-5142 }, { 216,-5142 }, + { 217,-5142 }, { 218,-5142 }, { 219,-5142 }, { 220,-5142 }, { 221,-5142 }, + { 222,-5142 }, { 223,-5142 }, { 224,-5142 }, { 225,-5142 }, { 226,-5142 }, + { 227,-5142 }, { 228,-5142 }, { 229,-5142 }, { 230,-5142 }, { 231,-5142 }, + { 232,-5142 }, { 233,-5142 }, { 234,-5142 }, { 235,-5142 }, { 236,-5142 }, + { 237,-5142 }, { 238,-5142 }, { 239,-5142 }, { 240,-5142 }, { 241,-5142 }, + + { 242,-5142 }, { 243,-5142 }, { 244,-5142 }, { 245,-5142 }, { 246,-5142 }, + { 247,-5142 }, { 248,-5142 }, { 249,-5142 }, { 250,-5142 }, { 251,-5142 }, + { 252,-5142 }, { 253,-5142 }, { 254,-5142 }, { 255,-5142 }, { 0, 131 }, + { 0,86724 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0,86702 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-5399 }, { 49,-5399 }, + { 50,-5399 }, { 51,-5399 }, { 52,-5399 }, { 53,-5399 }, { 54,-5399 }, + { 55,-5399 }, { 56,-5399 }, { 57,-5399 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-5399 }, { 66,-5399 }, { 67,-5399 }, { 68,-5399 }, { 69,-5399 }, + { 70,-5399 }, { 71,-5399 }, { 72,-5399 }, { 73,-5399 }, { 74,-5399 }, + { 75,-5399 }, { 76,-5399 }, { 77,-5399 }, { 78,15010 }, { 79,-5399 }, + { 80,-5399 }, { 81,-5399 }, { 82,-5399 }, { 83,-5399 }, { 84,-5399 }, + + { 85,-5399 }, { 86,-5399 }, { 87,-5399 }, { 88,-5399 }, { 89,-5399 }, + { 90,-5399 }, { 69,1522 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-5399 }, { 0, 0 }, { 97,-5399 }, { 98,-5399 }, { 99,-5399 }, + { 100,-5399 }, { 101,-5399 }, { 102,-5399 }, { 103,-5399 }, { 104,-5399 }, + { 105,-5399 }, { 106,-5399 }, { 107,-5399 }, { 108,-5399 }, { 109,-5399 }, + { 110,15010 }, { 111,-5399 }, { 112,-5399 }, { 113,-5399 }, { 114,-5399 }, + { 115,-5399 }, { 116,-5399 }, { 117,-5399 }, { 118,-5399 }, { 119,-5399 }, + { 120,-5399 }, { 121,-5399 }, { 122,-5399 }, { 101,1522 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-5399 }, { 128,-5399 }, { 129,-5399 }, + { 130,-5399 }, { 131,-5399 }, { 132,-5399 }, { 133,-5399 }, { 134,-5399 }, + + { 135,-5399 }, { 136,-5399 }, { 137,-5399 }, { 138,-5399 }, { 139,-5399 }, + { 140,-5399 }, { 141,-5399 }, { 142,-5399 }, { 143,-5399 }, { 144,-5399 }, + { 145,-5399 }, { 146,-5399 }, { 147,-5399 }, { 148,-5399 }, { 149,-5399 }, + { 150,-5399 }, { 151,-5399 }, { 152,-5399 }, { 153,-5399 }, { 154,-5399 }, + { 155,-5399 }, { 156,-5399 }, { 157,-5399 }, { 158,-5399 }, { 159,-5399 }, + { 160,-5399 }, { 161,-5399 }, { 162,-5399 }, { 163,-5399 }, { 164,-5399 }, + { 165,-5399 }, { 166,-5399 }, { 167,-5399 }, { 168,-5399 }, { 169,-5399 }, + { 170,-5399 }, { 171,-5399 }, { 172,-5399 }, { 173,-5399 }, { 174,-5399 }, + { 175,-5399 }, { 176,-5399 }, { 177,-5399 }, { 178,-5399 }, { 179,-5399 }, + { 180,-5399 }, { 181,-5399 }, { 182,-5399 }, { 183,-5399 }, { 184,-5399 }, + + { 185,-5399 }, { 186,-5399 }, { 187,-5399 }, { 188,-5399 }, { 189,-5399 }, + { 190,-5399 }, { 191,-5399 }, { 192,-5399 }, { 193,-5399 }, { 194,-5399 }, + { 195,-5399 }, { 196,-5399 }, { 197,-5399 }, { 198,-5399 }, { 199,-5399 }, + { 200,-5399 }, { 201,-5399 }, { 202,-5399 }, { 203,-5399 }, { 204,-5399 }, + { 205,-5399 }, { 206,-5399 }, { 207,-5399 }, { 208,-5399 }, { 209,-5399 }, + { 210,-5399 }, { 211,-5399 }, { 212,-5399 }, { 213,-5399 }, { 214,-5399 }, + { 215,-5399 }, { 216,-5399 }, { 217,-5399 }, { 218,-5399 }, { 219,-5399 }, + { 220,-5399 }, { 221,-5399 }, { 222,-5399 }, { 223,-5399 }, { 224,-5399 }, + { 225,-5399 }, { 226,-5399 }, { 227,-5399 }, { 228,-5399 }, { 229,-5399 }, + { 230,-5399 }, { 231,-5399 }, { 232,-5399 }, { 233,-5399 }, { 234,-5399 }, + + { 235,-5399 }, { 236,-5399 }, { 237,-5399 }, { 238,-5399 }, { 239,-5399 }, + { 240,-5399 }, { 241,-5399 }, { 242,-5399 }, { 243,-5399 }, { 244,-5399 }, + { 245,-5399 }, { 246,-5399 }, { 247,-5399 }, { 248,-5399 }, { 249,-5399 }, + { 250,-5399 }, { 251,-5399 }, { 252,-5399 }, { 253,-5399 }, { 254,-5399 }, + { 255,-5399 }, { 0, 131 }, { 0,86467 }, { 0, 0 }, { 0,86465 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 9, 514 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0,86445 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 32, 514 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 41, 516 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-5656 }, { 49,-5656 }, { 50,-5656 }, { 51,-5656 }, { 52,-5656 }, + { 53,-5656 }, { 54,-5656 }, { 55,-5656 }, { 56,-5656 }, { 57,-5656 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-5656 }, { 66,-5656 }, { 67,-5656 }, + { 68,-5656 }, { 69,-5656 }, { 70,-5656 }, { 71,-5656 }, { 72,-5656 }, + { 73,-5656 }, { 74,-5656 }, { 75,-5656 }, { 76,-5656 }, { 77,-5656 }, + + { 78,-5656 }, { 79,15010 }, { 80,-5656 }, { 81,-5656 }, { 82,-5656 }, + { 83,-5656 }, { 84,-5656 }, { 85,-5656 }, { 86,-5656 }, { 87,-5656 }, + { 88,-5656 }, { 89,-5656 }, { 90,-5656 }, { 69,1272 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-5656 }, { 0, 0 }, { 97,-5656 }, + { 98,-5656 }, { 99,-5656 }, { 100,-5656 }, { 101,-5656 }, { 102,-5656 }, + { 103,-5656 }, { 104,-5656 }, { 105,-5656 }, { 106,-5656 }, { 107,-5656 }, + { 108,-5656 }, { 109,-5656 }, { 110,-5656 }, { 111,15010 }, { 112,-5656 }, + { 113,-5656 }, { 114,-5656 }, { 115,-5656 }, { 116,-5656 }, { 117,-5656 }, + { 118,-5656 }, { 119,-5656 }, { 120,-5656 }, { 121,-5656 }, { 122,-5656 }, + { 101,1272 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-5656 }, + + { 128,-5656 }, { 129,-5656 }, { 130,-5656 }, { 131,-5656 }, { 132,-5656 }, + { 133,-5656 }, { 134,-5656 }, { 135,-5656 }, { 136,-5656 }, { 137,-5656 }, + { 138,-5656 }, { 139,-5656 }, { 140,-5656 }, { 141,-5656 }, { 142,-5656 }, + { 143,-5656 }, { 144,-5656 }, { 145,-5656 }, { 146,-5656 }, { 147,-5656 }, + { 148,-5656 }, { 149,-5656 }, { 150,-5656 }, { 151,-5656 }, { 152,-5656 }, + { 153,-5656 }, { 154,-5656 }, { 155,-5656 }, { 156,-5656 }, { 157,-5656 }, + { 158,-5656 }, { 159,-5656 }, { 160,-5656 }, { 161,-5656 }, { 162,-5656 }, + { 163,-5656 }, { 164,-5656 }, { 165,-5656 }, { 166,-5656 }, { 167,-5656 }, + { 168,-5656 }, { 169,-5656 }, { 170,-5656 }, { 171,-5656 }, { 172,-5656 }, + { 173,-5656 }, { 174,-5656 }, { 175,-5656 }, { 176,-5656 }, { 177,-5656 }, + + { 178,-5656 }, { 179,-5656 }, { 180,-5656 }, { 181,-5656 }, { 182,-5656 }, + { 183,-5656 }, { 184,-5656 }, { 185,-5656 }, { 186,-5656 }, { 187,-5656 }, + { 188,-5656 }, { 189,-5656 }, { 190,-5656 }, { 191,-5656 }, { 192,-5656 }, + { 193,-5656 }, { 194,-5656 }, { 195,-5656 }, { 196,-5656 }, { 197,-5656 }, + { 198,-5656 }, { 199,-5656 }, { 200,-5656 }, { 201,-5656 }, { 202,-5656 }, + { 203,-5656 }, { 204,-5656 }, { 205,-5656 }, { 206,-5656 }, { 207,-5656 }, + { 208,-5656 }, { 209,-5656 }, { 210,-5656 }, { 211,-5656 }, { 212,-5656 }, + { 213,-5656 }, { 214,-5656 }, { 215,-5656 }, { 216,-5656 }, { 217,-5656 }, + { 218,-5656 }, { 219,-5656 }, { 220,-5656 }, { 221,-5656 }, { 222,-5656 }, + { 223,-5656 }, { 224,-5656 }, { 225,-5656 }, { 226,-5656 }, { 227,-5656 }, + + { 228,-5656 }, { 229,-5656 }, { 230,-5656 }, { 231,-5656 }, { 232,-5656 }, + { 233,-5656 }, { 234,-5656 }, { 235,-5656 }, { 236,-5656 }, { 237,-5656 }, + { 238,-5656 }, { 239,-5656 }, { 240,-5656 }, { 241,-5656 }, { 242,-5656 }, + { 243,-5656 }, { 244,-5656 }, { 245,-5656 }, { 246,-5656 }, { 247,-5656 }, + { 248,-5656 }, { 249,-5656 }, { 250,-5656 }, { 251,-5656 }, { 252,-5656 }, + { 253,-5656 }, { 254,-5656 }, { 255,-5656 }, { 0, 131 }, { 0,86210 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0,86203 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-5913 }, { 49,-5913 }, { 50,-5913 }, + { 51,-5913 }, { 52,-5913 }, { 53,-5913 }, { 54,-5913 }, { 55,-5913 }, + { 56,-5913 }, { 57,-5913 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-5913 }, + { 66,-5913 }, { 67,-5913 }, { 68,-5913 }, { 69,-5913 }, { 70,-5913 }, + + { 71,-5913 }, { 72,-5913 }, { 73,-5913 }, { 74,-5913 }, { 75,-5913 }, + { 76,-5913 }, { 77,-5913 }, { 78,-5913 }, { 79,-5913 }, { 80,-5913 }, + { 81,-5913 }, { 82,-5913 }, { 83,-5913 }, { 84,15010 }, { 85,-5913 }, + { 86,-5913 }, { 87,-5913 }, { 88,-5913 }, { 89,-5913 }, { 90,-5913 }, + { 84,1280 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-5913 }, + { 0, 0 }, { 97,-5913 }, { 98,-5913 }, { 99,-5913 }, { 100,-5913 }, + { 101,-5913 }, { 102,-5913 }, { 103,-5913 }, { 104,-5913 }, { 105,-5913 }, + { 106,-5913 }, { 107,-5913 }, { 108,-5913 }, { 109,-5913 }, { 110,-5913 }, + { 111,-5913 }, { 112,-5913 }, { 113,-5913 }, { 114,-5913 }, { 115,-5913 }, + { 116,15010 }, { 117,-5913 }, { 118,-5913 }, { 119,-5913 }, { 120,-5913 }, + + { 121,-5913 }, { 122,-5913 }, { 116,1280 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-5913 }, { 128,-5913 }, { 129,-5913 }, { 130,-5913 }, + { 131,-5913 }, { 132,-5913 }, { 133,-5913 }, { 134,-5913 }, { 135,-5913 }, + { 136,-5913 }, { 137,-5913 }, { 138,-5913 }, { 139,-5913 }, { 140,-5913 }, + { 141,-5913 }, { 142,-5913 }, { 143,-5913 }, { 144,-5913 }, { 145,-5913 }, + { 146,-5913 }, { 147,-5913 }, { 148,-5913 }, { 149,-5913 }, { 150,-5913 }, + { 151,-5913 }, { 152,-5913 }, { 153,-5913 }, { 154,-5913 }, { 155,-5913 }, + { 156,-5913 }, { 157,-5913 }, { 158,-5913 }, { 159,-5913 }, { 160,-5913 }, + { 161,-5913 }, { 162,-5913 }, { 163,-5913 }, { 164,-5913 }, { 165,-5913 }, + { 166,-5913 }, { 167,-5913 }, { 168,-5913 }, { 169,-5913 }, { 170,-5913 }, + + { 171,-5913 }, { 172,-5913 }, { 173,-5913 }, { 174,-5913 }, { 175,-5913 }, + { 176,-5913 }, { 177,-5913 }, { 178,-5913 }, { 179,-5913 }, { 180,-5913 }, + { 181,-5913 }, { 182,-5913 }, { 183,-5913 }, { 184,-5913 }, { 185,-5913 }, + { 186,-5913 }, { 187,-5913 }, { 188,-5913 }, { 189,-5913 }, { 190,-5913 }, + { 191,-5913 }, { 192,-5913 }, { 193,-5913 }, { 194,-5913 }, { 195,-5913 }, + { 196,-5913 }, { 197,-5913 }, { 198,-5913 }, { 199,-5913 }, { 200,-5913 }, + { 201,-5913 }, { 202,-5913 }, { 203,-5913 }, { 204,-5913 }, { 205,-5913 }, + { 206,-5913 }, { 207,-5913 }, { 208,-5913 }, { 209,-5913 }, { 210,-5913 }, + { 211,-5913 }, { 212,-5913 }, { 213,-5913 }, { 214,-5913 }, { 215,-5913 }, + { 216,-5913 }, { 217,-5913 }, { 218,-5913 }, { 219,-5913 }, { 220,-5913 }, + + { 221,-5913 }, { 222,-5913 }, { 223,-5913 }, { 224,-5913 }, { 225,-5913 }, + { 226,-5913 }, { 227,-5913 }, { 228,-5913 }, { 229,-5913 }, { 230,-5913 }, + { 231,-5913 }, { 232,-5913 }, { 233,-5913 }, { 234,-5913 }, { 235,-5913 }, + { 236,-5913 }, { 237,-5913 }, { 238,-5913 }, { 239,-5913 }, { 240,-5913 }, + { 241,-5913 }, { 242,-5913 }, { 243,-5913 }, { 244,-5913 }, { 245,-5913 }, + { 246,-5913 }, { 247,-5913 }, { 248,-5913 }, { 249,-5913 }, { 250,-5913 }, + { 251,-5913 }, { 252,-5913 }, { 253,-5913 }, { 254,-5913 }, { 255,-5913 }, + { 0, 31 }, { 0,85953 }, { 0, 0 }, { 0,85951 }, { 0, 123 }, + { 0,85949 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 9, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0,85933 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 32, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 41, 2 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-6170 }, + { 49,-6170 }, { 50,-6170 }, { 51,-6170 }, { 52,-6170 }, { 53,-6170 }, + { 54,-6170 }, { 55,-6170 }, { 56,-6170 }, { 57,-6170 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 65,-6170 }, { 66,-6170 }, { 67,-6170 }, { 68,-6170 }, + { 69,-6170 }, { 70,-6170 }, { 71,-6170 }, { 72,-6170 }, { 73,-6170 }, + { 74,-6170 }, { 75,-6170 }, { 76,-6170 }, { 77,-6170 }, { 78,-6170 }, + { 79,-6170 }, { 80,-6170 }, { 81,-6170 }, { 82,-6170 }, { 83,-6170 }, + { 84,-6170 }, { 85,-6170 }, { 86,-6170 }, { 87,-6170 }, { 88,-6170 }, + { 89,-6170 }, { 90,-6170 }, { 71,1012 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-6170 }, { 0, 0 }, { 97,-6170 }, { 98,-6170 }, + { 99,-6170 }, { 100,-6170 }, { 101,-6170 }, { 102,-6170 }, { 103,-6170 }, + { 104,-6170 }, { 105,-6170 }, { 106,-6170 }, { 107,-6170 }, { 108,-6170 }, + { 109,-6170 }, { 110,-6170 }, { 111,-6170 }, { 112,-6170 }, { 113,-6170 }, + + { 114,-6170 }, { 115,-6170 }, { 116,-6170 }, { 117,-6170 }, { 118,-6170 }, + { 119,-6170 }, { 120,-6170 }, { 121,-6170 }, { 122,-6170 }, { 103,1012 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-6170 }, { 128,-6170 }, + { 129,-6170 }, { 130,-6170 }, { 131,-6170 }, { 132,-6170 }, { 133,-6170 }, + { 134,-6170 }, { 135,-6170 }, { 136,-6170 }, { 137,-6170 }, { 138,-6170 }, + { 139,-6170 }, { 140,-6170 }, { 141,-6170 }, { 142,-6170 }, { 143,-6170 }, + { 144,-6170 }, { 145,-6170 }, { 146,-6170 }, { 147,-6170 }, { 148,-6170 }, + { 149,-6170 }, { 150,-6170 }, { 151,-6170 }, { 152,-6170 }, { 153,-6170 }, + { 154,-6170 }, { 155,-6170 }, { 156,-6170 }, { 157,-6170 }, { 158,-6170 }, + { 159,-6170 }, { 160,-6170 }, { 161,-6170 }, { 162,-6170 }, { 163,-6170 }, + + { 164,-6170 }, { 165,-6170 }, { 166,-6170 }, { 167,-6170 }, { 168,-6170 }, + { 169,-6170 }, { 170,-6170 }, { 171,-6170 }, { 172,-6170 }, { 173,-6170 }, + { 174,-6170 }, { 175,-6170 }, { 176,-6170 }, { 177,-6170 }, { 178,-6170 }, + { 179,-6170 }, { 180,-6170 }, { 181,-6170 }, { 182,-6170 }, { 183,-6170 }, + { 184,-6170 }, { 185,-6170 }, { 186,-6170 }, { 187,-6170 }, { 188,-6170 }, + { 189,-6170 }, { 190,-6170 }, { 191,-6170 }, { 192,-6170 }, { 193,-6170 }, + { 194,-6170 }, { 195,-6170 }, { 196,-6170 }, { 197,-6170 }, { 198,-6170 }, + { 199,-6170 }, { 200,-6170 }, { 201,-6170 }, { 202,-6170 }, { 203,-6170 }, + { 204,-6170 }, { 205,-6170 }, { 206,-6170 }, { 207,-6170 }, { 208,-6170 }, + { 209,-6170 }, { 210,-6170 }, { 211,-6170 }, { 212,-6170 }, { 213,-6170 }, + + { 214,-6170 }, { 215,-6170 }, { 216,-6170 }, { 217,-6170 }, { 218,-6170 }, + { 219,-6170 }, { 220,-6170 }, { 221,-6170 }, { 222,-6170 }, { 223,-6170 }, + { 224,-6170 }, { 225,-6170 }, { 226,-6170 }, { 227,-6170 }, { 228,-6170 }, + { 229,-6170 }, { 230,-6170 }, { 231,-6170 }, { 232,-6170 }, { 233,-6170 }, + { 234,-6170 }, { 235,-6170 }, { 236,-6170 }, { 237,-6170 }, { 238,-6170 }, + { 239,-6170 }, { 240,-6170 }, { 241,-6170 }, { 242,-6170 }, { 243,-6170 }, + { 244,-6170 }, { 245,-6170 }, { 246,-6170 }, { 247,-6170 }, { 248,-6170 }, + { 249,-6170 }, { 250,-6170 }, { 251,-6170 }, { 252,-6170 }, { 253,-6170 }, + { 254,-6170 }, { 255,-6170 }, { 0, 131 }, { 0,85696 }, { 0, 0 }, + { 0,85694 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 9, 775 }, + { 0, 0 }, { 0,85683 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 32, 775 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 41, 777 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-6427 }, { 49,-6427 }, { 50,-6427 }, { 51,-6427 }, + { 52,-6427 }, { 53,-6427 }, { 54,-6427 }, { 55,-6427 }, { 56,-6427 }, + + { 57,-6427 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-6427 }, { 66,-6427 }, + { 67,-6427 }, { 68,-6427 }, { 69,-6427 }, { 70,-6427 }, { 71,-6427 }, + { 72,-6427 }, { 73,-6427 }, { 74,-6427 }, { 75,-6427 }, { 76,-6427 }, + { 77,-6427 }, { 78,-6427 }, { 79,-6427 }, { 80,14753 }, { 81,-6427 }, + { 82,-6427 }, { 83,-6427 }, { 84,-6427 }, { 85,-6427 }, { 86,-6427 }, + { 87,-6427 }, { 88,-6427 }, { 89,-6427 }, { 90,-6427 }, { 0, 0 }, + { 0, 0 }, { 80, 768 }, { 0, 0 }, { 95,-6427 }, { 0, 0 }, + { 97,-6427 }, { 98,-6427 }, { 99,-6427 }, { 100,-6427 }, { 101,-6427 }, + { 102,-6427 }, { 103,-6427 }, { 104,-6427 }, { 105,-6427 }, { 106,-6427 }, + + { 107,-6427 }, { 108,-6427 }, { 109,-6427 }, { 110,-6427 }, { 111,-6427 }, + { 112,14753 }, { 113,-6427 }, { 114,-6427 }, { 115,-6427 }, { 116,-6427 }, + { 117,-6427 }, { 118,-6427 }, { 119,-6427 }, { 120,-6427 }, { 121,-6427 }, + { 122,-6427 }, { 0, 0 }, { 0, 0 }, { 112, 768 }, { 0, 0 }, + { 127,-6427 }, { 128,-6427 }, { 129,-6427 }, { 130,-6427 }, { 131,-6427 }, + { 132,-6427 }, { 133,-6427 }, { 134,-6427 }, { 135,-6427 }, { 136,-6427 }, + { 137,-6427 }, { 138,-6427 }, { 139,-6427 }, { 140,-6427 }, { 141,-6427 }, + { 142,-6427 }, { 143,-6427 }, { 144,-6427 }, { 145,-6427 }, { 146,-6427 }, + { 147,-6427 }, { 148,-6427 }, { 149,-6427 }, { 150,-6427 }, { 151,-6427 }, + { 152,-6427 }, { 153,-6427 }, { 154,-6427 }, { 155,-6427 }, { 156,-6427 }, + + { 157,-6427 }, { 158,-6427 }, { 159,-6427 }, { 160,-6427 }, { 161,-6427 }, + { 162,-6427 }, { 163,-6427 }, { 164,-6427 }, { 165,-6427 }, { 166,-6427 }, + { 167,-6427 }, { 168,-6427 }, { 169,-6427 }, { 170,-6427 }, { 171,-6427 }, + { 172,-6427 }, { 173,-6427 }, { 174,-6427 }, { 175,-6427 }, { 176,-6427 }, + { 177,-6427 }, { 178,-6427 }, { 179,-6427 }, { 180,-6427 }, { 181,-6427 }, + { 182,-6427 }, { 183,-6427 }, { 184,-6427 }, { 185,-6427 }, { 186,-6427 }, + { 187,-6427 }, { 188,-6427 }, { 189,-6427 }, { 190,-6427 }, { 191,-6427 }, + { 192,-6427 }, { 193,-6427 }, { 194,-6427 }, { 195,-6427 }, { 196,-6427 }, + { 197,-6427 }, { 198,-6427 }, { 199,-6427 }, { 200,-6427 }, { 201,-6427 }, + { 202,-6427 }, { 203,-6427 }, { 204,-6427 }, { 205,-6427 }, { 206,-6427 }, + + { 207,-6427 }, { 208,-6427 }, { 209,-6427 }, { 210,-6427 }, { 211,-6427 }, + { 212,-6427 }, { 213,-6427 }, { 214,-6427 }, { 215,-6427 }, { 216,-6427 }, + { 217,-6427 }, { 218,-6427 }, { 219,-6427 }, { 220,-6427 }, { 221,-6427 }, + { 222,-6427 }, { 223,-6427 }, { 224,-6427 }, { 225,-6427 }, { 226,-6427 }, + { 227,-6427 }, { 228,-6427 }, { 229,-6427 }, { 230,-6427 }, { 231,-6427 }, + { 232,-6427 }, { 233,-6427 }, { 234,-6427 }, { 235,-6427 }, { 236,-6427 }, + { 237,-6427 }, { 238,-6427 }, { 239,-6427 }, { 240,-6427 }, { 241,-6427 }, + { 242,-6427 }, { 243,-6427 }, { 244,-6427 }, { 245,-6427 }, { 246,-6427 }, + { 247,-6427 }, { 248,-6427 }, { 249,-6427 }, { 250,-6427 }, { 251,-6427 }, + { 252,-6427 }, { 253,-6427 }, { 254,-6427 }, { 255,-6427 }, { 0, 131 }, + + { 0,85439 }, { 0, 0 }, { 0,85437 }, { 0, 125 }, { 0,85435 }, + { 0, 0 }, { 0,85433 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 9, 0 }, { 0, 0 }, { 0,85426 }, { 0, 0 }, + { 9, 767 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32, 767 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 41, 2 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 41, 769 }, { 48,-6684 }, { 49,-6684 }, + + { 50,-6684 }, { 51,-6684 }, { 52,-6684 }, { 53,-6684 }, { 54,-6684 }, + { 55,-6684 }, { 56,-6684 }, { 57,-6684 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-6684 }, { 66,-6684 }, { 67,14753 }, { 68,-6684 }, { 69,-6684 }, + { 70,-6684 }, { 71,-6684 }, { 72,-6684 }, { 73,-6684 }, { 74,-6684 }, + { 75,-6684 }, { 76,-6684 }, { 77,-6684 }, { 78,-6684 }, { 79,-6684 }, + { 80,-6684 }, { 81,-6684 }, { 82,-6684 }, { 83,15010 }, { 84,15267 }, + { 85,-6684 }, { 86,-6684 }, { 87,-6684 }, { 88,-6684 }, { 89,-6684 }, + { 90,-6684 }, { 78, 764 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-6684 }, { 0, 0 }, { 97,-6684 }, { 98,-6684 }, { 99,14753 }, + + { 100,-6684 }, { 101,-6684 }, { 102,-6684 }, { 103,-6684 }, { 104,-6684 }, + { 105,-6684 }, { 106,-6684 }, { 107,-6684 }, { 108,-6684 }, { 109,-6684 }, + { 110,-6684 }, { 111,-6684 }, { 112,-6684 }, { 113,-6684 }, { 114,-6684 }, + { 115,15010 }, { 116,15267 }, { 117,-6684 }, { 118,-6684 }, { 119,-6684 }, + { 120,-6684 }, { 121,-6684 }, { 122,-6684 }, { 110, 764 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-6684 }, { 128,-6684 }, { 129,-6684 }, + { 130,-6684 }, { 131,-6684 }, { 132,-6684 }, { 133,-6684 }, { 134,-6684 }, + { 135,-6684 }, { 136,-6684 }, { 137,-6684 }, { 138,-6684 }, { 139,-6684 }, + { 140,-6684 }, { 141,-6684 }, { 142,-6684 }, { 143,-6684 }, { 144,-6684 }, + { 145,-6684 }, { 146,-6684 }, { 147,-6684 }, { 148,-6684 }, { 149,-6684 }, + + { 150,-6684 }, { 151,-6684 }, { 152,-6684 }, { 153,-6684 }, { 154,-6684 }, + { 155,-6684 }, { 156,-6684 }, { 157,-6684 }, { 158,-6684 }, { 159,-6684 }, + { 160,-6684 }, { 161,-6684 }, { 162,-6684 }, { 163,-6684 }, { 164,-6684 }, + { 165,-6684 }, { 166,-6684 }, { 167,-6684 }, { 168,-6684 }, { 169,-6684 }, + { 170,-6684 }, { 171,-6684 }, { 172,-6684 }, { 173,-6684 }, { 174,-6684 }, + { 175,-6684 }, { 176,-6684 }, { 177,-6684 }, { 178,-6684 }, { 179,-6684 }, + { 180,-6684 }, { 181,-6684 }, { 182,-6684 }, { 183,-6684 }, { 184,-6684 }, + { 185,-6684 }, { 186,-6684 }, { 187,-6684 }, { 188,-6684 }, { 189,-6684 }, + { 190,-6684 }, { 191,-6684 }, { 192,-6684 }, { 193,-6684 }, { 194,-6684 }, + { 195,-6684 }, { 196,-6684 }, { 197,-6684 }, { 198,-6684 }, { 199,-6684 }, + + { 200,-6684 }, { 201,-6684 }, { 202,-6684 }, { 203,-6684 }, { 204,-6684 }, + { 205,-6684 }, { 206,-6684 }, { 207,-6684 }, { 208,-6684 }, { 209,-6684 }, + { 210,-6684 }, { 211,-6684 }, { 212,-6684 }, { 213,-6684 }, { 214,-6684 }, + { 215,-6684 }, { 216,-6684 }, { 217,-6684 }, { 218,-6684 }, { 219,-6684 }, + { 220,-6684 }, { 221,-6684 }, { 222,-6684 }, { 223,-6684 }, { 224,-6684 }, + { 225,-6684 }, { 226,-6684 }, { 227,-6684 }, { 228,-6684 }, { 229,-6684 }, + { 230,-6684 }, { 231,-6684 }, { 232,-6684 }, { 233,-6684 }, { 234,-6684 }, + { 235,-6684 }, { 236,-6684 }, { 237,-6684 }, { 238,-6684 }, { 239,-6684 }, + { 240,-6684 }, { 241,-6684 }, { 242,-6684 }, { 243,-6684 }, { 244,-6684 }, + { 245,-6684 }, { 246,-6684 }, { 247,-6684 }, { 248,-6684 }, { 249,-6684 }, + + { 250,-6684 }, { 251,-6684 }, { 252,-6684 }, { 253,-6684 }, { 254,-6684 }, + { 255,-6684 }, { 0, 131 }, { 0,85182 }, { 0, 0 }, { 0,85180 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0,85173 }, { 0, 0 }, { 9,-771 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 32,-771 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 41,-769 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-6941 }, { 49,-6941 }, { 50,-6941 }, { 51,-6941 }, { 52,-6941 }, + { 53,-6941 }, { 54,-6941 }, { 55,-6941 }, { 56,-6941 }, { 57,-6941 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-6941 }, { 66,-6941 }, { 67,-6941 }, + { 68,-6941 }, { 69,-6941 }, { 70,-6941 }, { 71,-6941 }, { 72,-6941 }, + { 73,-6941 }, { 74,-6941 }, { 75,-6941 }, { 76,-6941 }, { 77,-6941 }, + { 78,-6941 }, { 79,-6941 }, { 80,-6941 }, { 81,-6941 }, { 82,-6941 }, + { 83,15267 }, { 84,-6941 }, { 85,-6941 }, { 86,-6941 }, { 87,-6941 }, + { 88,-6941 }, { 89,-6941 }, { 90,-6941 }, { 82, 764 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 95,-6941 }, { 0, 0 }, { 97,-6941 }, + { 98,-6941 }, { 99,-6941 }, { 100,-6941 }, { 101,-6941 }, { 102,-6941 }, + { 103,-6941 }, { 104,-6941 }, { 105,-6941 }, { 106,-6941 }, { 107,-6941 }, + { 108,-6941 }, { 109,-6941 }, { 110,-6941 }, { 111,-6941 }, { 112,-6941 }, + { 113,-6941 }, { 114,-6941 }, { 115,15267 }, { 116,-6941 }, { 117,-6941 }, + { 118,-6941 }, { 119,-6941 }, { 120,-6941 }, { 121,-6941 }, { 122,-6941 }, + { 114, 764 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-6941 }, + { 128,-6941 }, { 129,-6941 }, { 130,-6941 }, { 131,-6941 }, { 132,-6941 }, + { 133,-6941 }, { 134,-6941 }, { 135,-6941 }, { 136,-6941 }, { 137,-6941 }, + { 138,-6941 }, { 139,-6941 }, { 140,-6941 }, { 141,-6941 }, { 142,-6941 }, + + { 143,-6941 }, { 144,-6941 }, { 145,-6941 }, { 146,-6941 }, { 147,-6941 }, + { 148,-6941 }, { 149,-6941 }, { 150,-6941 }, { 151,-6941 }, { 152,-6941 }, + { 153,-6941 }, { 154,-6941 }, { 155,-6941 }, { 156,-6941 }, { 157,-6941 }, + { 158,-6941 }, { 159,-6941 }, { 160,-6941 }, { 161,-6941 }, { 162,-6941 }, + { 163,-6941 }, { 164,-6941 }, { 165,-6941 }, { 166,-6941 }, { 167,-6941 }, + { 168,-6941 }, { 169,-6941 }, { 170,-6941 }, { 171,-6941 }, { 172,-6941 }, + { 173,-6941 }, { 174,-6941 }, { 175,-6941 }, { 176,-6941 }, { 177,-6941 }, + { 178,-6941 }, { 179,-6941 }, { 180,-6941 }, { 181,-6941 }, { 182,-6941 }, + { 183,-6941 }, { 184,-6941 }, { 185,-6941 }, { 186,-6941 }, { 187,-6941 }, + { 188,-6941 }, { 189,-6941 }, { 190,-6941 }, { 191,-6941 }, { 192,-6941 }, + + { 193,-6941 }, { 194,-6941 }, { 195,-6941 }, { 196,-6941 }, { 197,-6941 }, + { 198,-6941 }, { 199,-6941 }, { 200,-6941 }, { 201,-6941 }, { 202,-6941 }, + { 203,-6941 }, { 204,-6941 }, { 205,-6941 }, { 206,-6941 }, { 207,-6941 }, + { 208,-6941 }, { 209,-6941 }, { 210,-6941 }, { 211,-6941 }, { 212,-6941 }, + { 213,-6941 }, { 214,-6941 }, { 215,-6941 }, { 216,-6941 }, { 217,-6941 }, + { 218,-6941 }, { 219,-6941 }, { 220,-6941 }, { 221,-6941 }, { 222,-6941 }, + { 223,-6941 }, { 224,-6941 }, { 225,-6941 }, { 226,-6941 }, { 227,-6941 }, + { 228,-6941 }, { 229,-6941 }, { 230,-6941 }, { 231,-6941 }, { 232,-6941 }, + { 233,-6941 }, { 234,-6941 }, { 235,-6941 }, { 236,-6941 }, { 237,-6941 }, + { 238,-6941 }, { 239,-6941 }, { 240,-6941 }, { 241,-6941 }, { 242,-6941 }, + + { 243,-6941 }, { 244,-6941 }, { 245,-6941 }, { 246,-6941 }, { 247,-6941 }, + { 248,-6941 }, { 249,-6941 }, { 250,-6941 }, { 251,-6941 }, { 252,-6941 }, + { 253,-6941 }, { 254,-6941 }, { 255,-6941 }, { 0, 131 }, { 0,84925 }, + { 0, 0 }, { 0,84923 }, { 0, 0 }, { 0,84921 }, { 0, 0 }, + { 0,84919 }, { 0, 128 }, { 0,84917 }, { 0, 0 }, { 0,84915 }, + { 9, 516 }, { 0, 0 }, { 9, 255 }, { 0, 0 }, { 9, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32, 516 }, { 0, 0 }, + + { 32, 255 }, { 0, 0 }, { 32, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 41, 518 }, { 0, 0 }, { 41, 257 }, + { 0, 0 }, { 41, 2 }, { 48,-7198 }, { 49,-7198 }, { 50,-7198 }, + { 51,-7198 }, { 52,-7198 }, { 53,-7198 }, { 54,-7198 }, { 55,-7198 }, + { 56,-7198 }, { 57,-7198 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-7198 }, + { 66,-7198 }, { 67,-7198 }, { 68,-7198 }, { 69,-7198 }, { 70,-7198 }, + { 71,-7198 }, { 72,-7198 }, { 73,-7198 }, { 74,-7198 }, { 75,-7198 }, + { 76,-7198 }, { 77,-7198 }, { 78,-7198 }, { 79,-7198 }, { 80,-7198 }, + { 81,-7198 }, { 82,-7198 }, { 83,15267 }, { 84,-7198 }, { 85,-7198 }, + + { 86,-7198 }, { 87,-7198 }, { 88,-7198 }, { 89,-7198 }, { 90,-7198 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 84,67954 }, { 95,-7198 }, + { 0, 0 }, { 97,-7198 }, { 98,-7198 }, { 99,-7198 }, { 100,-7198 }, + { 101,-7198 }, { 102,-7198 }, { 103,-7198 }, { 104,-7198 }, { 105,-7198 }, + { 106,-7198 }, { 107,-7198 }, { 108,-7198 }, { 109,-7198 }, { 110,-7198 }, + { 111,-7198 }, { 112,-7198 }, { 113,-7198 }, { 114,-7198 }, { 115,15267 }, + { 116,-7198 }, { 117,-7198 }, { 118,-7198 }, { 119,-7198 }, { 120,-7198 }, + { 121,-7198 }, { 122,-7198 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 116,67954 }, { 127,-7198 }, { 128,-7198 }, { 129,-7198 }, { 130,-7198 }, + { 131,-7198 }, { 132,-7198 }, { 133,-7198 }, { 134,-7198 }, { 135,-7198 }, + + { 136,-7198 }, { 137,-7198 }, { 138,-7198 }, { 139,-7198 }, { 140,-7198 }, + { 141,-7198 }, { 142,-7198 }, { 143,-7198 }, { 144,-7198 }, { 145,-7198 }, + { 146,-7198 }, { 147,-7198 }, { 148,-7198 }, { 149,-7198 }, { 150,-7198 }, + { 151,-7198 }, { 152,-7198 }, { 153,-7198 }, { 154,-7198 }, { 155,-7198 }, + { 156,-7198 }, { 157,-7198 }, { 158,-7198 }, { 159,-7198 }, { 160,-7198 }, + { 161,-7198 }, { 162,-7198 }, { 163,-7198 }, { 164,-7198 }, { 165,-7198 }, + { 166,-7198 }, { 167,-7198 }, { 168,-7198 }, { 169,-7198 }, { 170,-7198 }, + { 171,-7198 }, { 172,-7198 }, { 173,-7198 }, { 174,-7198 }, { 175,-7198 }, + { 176,-7198 }, { 177,-7198 }, { 178,-7198 }, { 179,-7198 }, { 180,-7198 }, + { 181,-7198 }, { 182,-7198 }, { 183,-7198 }, { 184,-7198 }, { 185,-7198 }, + + { 186,-7198 }, { 187,-7198 }, { 188,-7198 }, { 189,-7198 }, { 190,-7198 }, + { 191,-7198 }, { 192,-7198 }, { 193,-7198 }, { 194,-7198 }, { 195,-7198 }, + { 196,-7198 }, { 197,-7198 }, { 198,-7198 }, { 199,-7198 }, { 200,-7198 }, + { 201,-7198 }, { 202,-7198 }, { 203,-7198 }, { 204,-7198 }, { 205,-7198 }, + { 206,-7198 }, { 207,-7198 }, { 208,-7198 }, { 209,-7198 }, { 210,-7198 }, + { 211,-7198 }, { 212,-7198 }, { 213,-7198 }, { 214,-7198 }, { 215,-7198 }, + { 216,-7198 }, { 217,-7198 }, { 218,-7198 }, { 219,-7198 }, { 220,-7198 }, + { 221,-7198 }, { 222,-7198 }, { 223,-7198 }, { 224,-7198 }, { 225,-7198 }, + { 226,-7198 }, { 227,-7198 }, { 228,-7198 }, { 229,-7198 }, { 230,-7198 }, + { 231,-7198 }, { 232,-7198 }, { 233,-7198 }, { 234,-7198 }, { 235,-7198 }, + + { 236,-7198 }, { 237,-7198 }, { 238,-7198 }, { 239,-7198 }, { 240,-7198 }, + { 241,-7198 }, { 242,-7198 }, { 243,-7198 }, { 244,-7198 }, { 245,-7198 }, + { 246,-7198 }, { 247,-7198 }, { 248,-7198 }, { 249,-7198 }, { 250,-7198 }, + { 251,-7198 }, { 252,-7198 }, { 253,-7198 }, { 254,-7198 }, { 255,-7198 }, + { 0, 131 }, { 0,84668 }, { 0, 0 }, { 0,84666 }, { 0, 124 }, + { 0,84664 }, { 0, 0 }, { 0,84662 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 9, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 9,-2313 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 32, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32,-2313 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 41, 2 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 41,-2311 }, { 48,-7455 }, + { 49,-7455 }, { 50,-7455 }, { 51,-7455 }, { 52,-7455 }, { 53,-7455 }, + { 54,-7455 }, { 55,-7455 }, { 56,-7455 }, { 57,-7455 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-7455 }, { 66,-7455 }, { 67,-7455 }, { 68,-7455 }, + { 69,-7455 }, { 70,-7455 }, { 71,-7455 }, { 72,-7455 }, { 73,-7455 }, + { 74,-7455 }, { 75,-7455 }, { 76,-7455 }, { 77,15267 }, { 78,-7455 }, + + { 79,-7455 }, { 80,-7455 }, { 81,-7455 }, { 82,-7455 }, { 83,-7455 }, + { 84,-7455 }, { 85,-7455 }, { 86,-7455 }, { 87,-7455 }, { 88,-7455 }, + { 89,-7455 }, { 90,-7455 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-7455 }, { 0, 0 }, { 97,-7455 }, { 98,-7455 }, + { 99,-7455 }, { 100,-7455 }, { 101,-7455 }, { 102,-7455 }, { 103,-7455 }, + { 104,-7455 }, { 105,-7455 }, { 106,-7455 }, { 107,-7455 }, { 108,-7455 }, + { 109,15267 }, { 110,-7455 }, { 111,-7455 }, { 112,-7455 }, { 113,-7455 }, + { 114,-7455 }, { 115,-7455 }, { 116,-7455 }, { 117,-7455 }, { 118,-7455 }, + { 119,-7455 }, { 120,-7455 }, { 121,-7455 }, { 122,-7455 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-7455 }, { 128,-7455 }, + + { 129,-7455 }, { 130,-7455 }, { 131,-7455 }, { 132,-7455 }, { 133,-7455 }, + { 134,-7455 }, { 135,-7455 }, { 136,-7455 }, { 137,-7455 }, { 138,-7455 }, + { 139,-7455 }, { 140,-7455 }, { 141,-7455 }, { 142,-7455 }, { 143,-7455 }, + { 144,-7455 }, { 145,-7455 }, { 146,-7455 }, { 147,-7455 }, { 148,-7455 }, + { 149,-7455 }, { 150,-7455 }, { 151,-7455 }, { 152,-7455 }, { 153,-7455 }, + { 154,-7455 }, { 155,-7455 }, { 156,-7455 }, { 157,-7455 }, { 158,-7455 }, + { 159,-7455 }, { 160,-7455 }, { 161,-7455 }, { 162,-7455 }, { 163,-7455 }, + { 164,-7455 }, { 165,-7455 }, { 166,-7455 }, { 167,-7455 }, { 168,-7455 }, + { 169,-7455 }, { 170,-7455 }, { 171,-7455 }, { 172,-7455 }, { 173,-7455 }, + { 174,-7455 }, { 175,-7455 }, { 176,-7455 }, { 177,-7455 }, { 178,-7455 }, + + { 179,-7455 }, { 180,-7455 }, { 181,-7455 }, { 182,-7455 }, { 183,-7455 }, + { 184,-7455 }, { 185,-7455 }, { 186,-7455 }, { 187,-7455 }, { 188,-7455 }, + { 189,-7455 }, { 190,-7455 }, { 191,-7455 }, { 192,-7455 }, { 193,-7455 }, + { 194,-7455 }, { 195,-7455 }, { 196,-7455 }, { 197,-7455 }, { 198,-7455 }, + { 199,-7455 }, { 200,-7455 }, { 201,-7455 }, { 202,-7455 }, { 203,-7455 }, + { 204,-7455 }, { 205,-7455 }, { 206,-7455 }, { 207,-7455 }, { 208,-7455 }, + { 209,-7455 }, { 210,-7455 }, { 211,-7455 }, { 212,-7455 }, { 213,-7455 }, + { 214,-7455 }, { 215,-7455 }, { 216,-7455 }, { 217,-7455 }, { 218,-7455 }, + { 219,-7455 }, { 220,-7455 }, { 221,-7455 }, { 222,-7455 }, { 223,-7455 }, + { 224,-7455 }, { 225,-7455 }, { 226,-7455 }, { 227,-7455 }, { 228,-7455 }, + + { 229,-7455 }, { 230,-7455 }, { 231,-7455 }, { 232,-7455 }, { 233,-7455 }, + { 234,-7455 }, { 235,-7455 }, { 236,-7455 }, { 237,-7455 }, { 238,-7455 }, + { 239,-7455 }, { 240,-7455 }, { 241,-7455 }, { 242,-7455 }, { 243,-7455 }, + { 244,-7455 }, { 245,-7455 }, { 246,-7455 }, { 247,-7455 }, { 248,-7455 }, + { 249,-7455 }, { 250,-7455 }, { 251,-7455 }, { 252,-7455 }, { 253,-7455 }, + { 254,-7455 }, { 255,-7455 }, { 0, 131 }, { 0,84411 }, { 0, 0 }, + { 0,84409 }, { 0, 0 }, { 0,84407 }, { 0, 126 }, { 0,84405 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 9,-3341 }, + { 0, 0 }, { 9, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 32,-3341 }, { 0, 0 }, { 32, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 41,-3339 }, { 0, 0 }, { 41, 2 }, { 0, 0 }, + { 0, 0 }, { 48,-7712 }, { 49,-7712 }, { 50,-7712 }, { 51,-7712 }, + { 52,-7712 }, { 53,-7712 }, { 54,-7712 }, { 55,-7712 }, { 56,-7712 }, + { 57,-7712 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-7712 }, { 66,-7712 }, + { 67,-7712 }, { 68,-7712 }, { 69,-7712 }, { 70,-7712 }, { 71,-7712 }, + + { 72,-7712 }, { 73,-7712 }, { 74,-7712 }, { 75,-7712 }, { 76,-7712 }, + { 77,-7712 }, { 78,-7712 }, { 79,-7712 }, { 80,-7712 }, { 81,-7712 }, + { 82,-7712 }, { 83,-7712 }, { 84,-7712 }, { 85,-7712 }, { 86,-7712 }, + { 87,15267 }, { 88,-7712 }, { 89,-7712 }, { 90,-7712 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-7712 }, { 0, 0 }, + { 97,-7712 }, { 98,-7712 }, { 99,-7712 }, { 100,-7712 }, { 101,-7712 }, + { 102,-7712 }, { 103,-7712 }, { 104,-7712 }, { 105,-7712 }, { 106,-7712 }, + { 107,-7712 }, { 108,-7712 }, { 109,-7712 }, { 110,-7712 }, { 111,-7712 }, + { 112,-7712 }, { 113,-7712 }, { 114,-7712 }, { 115,-7712 }, { 116,-7712 }, + { 117,-7712 }, { 118,-7712 }, { 119,15267 }, { 120,-7712 }, { 121,-7712 }, + + { 122,-7712 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-7712 }, { 128,-7712 }, { 129,-7712 }, { 130,-7712 }, { 131,-7712 }, + { 132,-7712 }, { 133,-7712 }, { 134,-7712 }, { 135,-7712 }, { 136,-7712 }, + { 137,-7712 }, { 138,-7712 }, { 139,-7712 }, { 140,-7712 }, { 141,-7712 }, + { 142,-7712 }, { 143,-7712 }, { 144,-7712 }, { 145,-7712 }, { 146,-7712 }, + { 147,-7712 }, { 148,-7712 }, { 149,-7712 }, { 150,-7712 }, { 151,-7712 }, + { 152,-7712 }, { 153,-7712 }, { 154,-7712 }, { 155,-7712 }, { 156,-7712 }, + { 157,-7712 }, { 158,-7712 }, { 159,-7712 }, { 160,-7712 }, { 161,-7712 }, + { 162,-7712 }, { 163,-7712 }, { 164,-7712 }, { 165,-7712 }, { 166,-7712 }, + { 167,-7712 }, { 168,-7712 }, { 169,-7712 }, { 170,-7712 }, { 171,-7712 }, + + { 172,-7712 }, { 173,-7712 }, { 174,-7712 }, { 175,-7712 }, { 176,-7712 }, + { 177,-7712 }, { 178,-7712 }, { 179,-7712 }, { 180,-7712 }, { 181,-7712 }, + { 182,-7712 }, { 183,-7712 }, { 184,-7712 }, { 185,-7712 }, { 186,-7712 }, + { 187,-7712 }, { 188,-7712 }, { 189,-7712 }, { 190,-7712 }, { 191,-7712 }, + { 192,-7712 }, { 193,-7712 }, { 194,-7712 }, { 195,-7712 }, { 196,-7712 }, + { 197,-7712 }, { 198,-7712 }, { 199,-7712 }, { 200,-7712 }, { 201,-7712 }, + { 202,-7712 }, { 203,-7712 }, { 204,-7712 }, { 205,-7712 }, { 206,-7712 }, + { 207,-7712 }, { 208,-7712 }, { 209,-7712 }, { 210,-7712 }, { 211,-7712 }, + { 212,-7712 }, { 213,-7712 }, { 214,-7712 }, { 215,-7712 }, { 216,-7712 }, + { 217,-7712 }, { 218,-7712 }, { 219,-7712 }, { 220,-7712 }, { 221,-7712 }, + + { 222,-7712 }, { 223,-7712 }, { 224,-7712 }, { 225,-7712 }, { 226,-7712 }, + { 227,-7712 }, { 228,-7712 }, { 229,-7712 }, { 230,-7712 }, { 231,-7712 }, + { 232,-7712 }, { 233,-7712 }, { 234,-7712 }, { 235,-7712 }, { 236,-7712 }, + { 237,-7712 }, { 238,-7712 }, { 239,-7712 }, { 240,-7712 }, { 241,-7712 }, + { 242,-7712 }, { 243,-7712 }, { 244,-7712 }, { 245,-7712 }, { 246,-7712 }, + { 247,-7712 }, { 248,-7712 }, { 249,-7712 }, { 250,-7712 }, { 251,-7712 }, + { 252,-7712 }, { 253,-7712 }, { 254,-7712 }, { 255,-7712 }, { 0, 23 }, + { 0,84154 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-7969 }, { 49,-7969 }, + { 50,-7969 }, { 51,-7969 }, { 52,-7969 }, { 53,-7969 }, { 54,-7969 }, + { 55,-7969 }, { 56,-7969 }, { 57,-7969 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 65,-7969 }, { 66,-7969 }, { 67,-7969 }, { 68,-7969 }, { 69,-7969 }, + { 70,-7969 }, { 71,-7969 }, { 72,-7969 }, { 73,-7969 }, { 74,-7969 }, + { 75,-7969 }, { 76,-7969 }, { 77,-7969 }, { 78,-7969 }, { 79,-7969 }, + { 80,-7969 }, { 81,-7969 }, { 82,-7969 }, { 83,-7969 }, { 84,-7969 }, + { 85,-7969 }, { 86,-7969 }, { 87,-7969 }, { 88,-7969 }, { 89,-7969 }, + { 90,-7969 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-7969 }, { 0, 0 }, { 97,-7969 }, { 98,-7969 }, { 99,-7969 }, + { 100,-7969 }, { 101,-7969 }, { 102,-7969 }, { 103,-7969 }, { 104,-7969 }, + { 105,-7969 }, { 106,-7969 }, { 107,-7969 }, { 108,-7969 }, { 109,-7969 }, + { 110,-7969 }, { 111,-7969 }, { 112,-7969 }, { 113,-7969 }, { 114,-7969 }, + + { 115,-7969 }, { 116,-7969 }, { 117,-7969 }, { 118,-7969 }, { 119,-7969 }, + { 120,-7969 }, { 121,-7969 }, { 122,-7969 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-7969 }, { 128,-7969 }, { 129,-7969 }, + { 130,-7969 }, { 131,-7969 }, { 132,-7969 }, { 133,-7969 }, { 134,-7969 }, + { 135,-7969 }, { 136,-7969 }, { 137,-7969 }, { 138,-7969 }, { 139,-7969 }, + { 140,-7969 }, { 141,-7969 }, { 142,-7969 }, { 143,-7969 }, { 144,-7969 }, + { 145,-7969 }, { 146,-7969 }, { 147,-7969 }, { 148,-7969 }, { 149,-7969 }, + { 150,-7969 }, { 151,-7969 }, { 152,-7969 }, { 153,-7969 }, { 154,-7969 }, + { 155,-7969 }, { 156,-7969 }, { 157,-7969 }, { 158,-7969 }, { 159,-7969 }, + { 160,-7969 }, { 161,-7969 }, { 162,-7969 }, { 163,-7969 }, { 164,-7969 }, + + { 165,-7969 }, { 166,-7969 }, { 167,-7969 }, { 168,-7969 }, { 169,-7969 }, + { 170,-7969 }, { 171,-7969 }, { 172,-7969 }, { 173,-7969 }, { 174,-7969 }, + { 175,-7969 }, { 176,-7969 }, { 177,-7969 }, { 178,-7969 }, { 179,-7969 }, + { 180,-7969 }, { 181,-7969 }, { 182,-7969 }, { 183,-7969 }, { 184,-7969 }, + { 185,-7969 }, { 186,-7969 }, { 187,-7969 }, { 188,-7969 }, { 189,-7969 }, + { 190,-7969 }, { 191,-7969 }, { 192,-7969 }, { 193,-7969 }, { 194,-7969 }, + { 195,-7969 }, { 196,-7969 }, { 197,-7969 }, { 198,-7969 }, { 199,-7969 }, + { 200,-7969 }, { 201,-7969 }, { 202,-7969 }, { 203,-7969 }, { 204,-7969 }, + { 205,-7969 }, { 206,-7969 }, { 207,-7969 }, { 208,-7969 }, { 209,-7969 }, + { 210,-7969 }, { 211,-7969 }, { 212,-7969 }, { 213,-7969 }, { 214,-7969 }, + + { 215,-7969 }, { 216,-7969 }, { 217,-7969 }, { 218,-7969 }, { 219,-7969 }, + { 220,-7969 }, { 221,-7969 }, { 222,-7969 }, { 223,-7969 }, { 224,-7969 }, + { 225,-7969 }, { 226,-7969 }, { 227,-7969 }, { 228,-7969 }, { 229,-7969 }, + { 230,-7969 }, { 231,-7969 }, { 232,-7969 }, { 233,-7969 }, { 234,-7969 }, + { 235,-7969 }, { 236,-7969 }, { 237,-7969 }, { 238,-7969 }, { 239,-7969 }, + { 240,-7969 }, { 241,-7969 }, { 242,-7969 }, { 243,-7969 }, { 244,-7969 }, + { 245,-7969 }, { 246,-7969 }, { 247,-7969 }, { 248,-7969 }, { 249,-7969 }, + { 250,-7969 }, { 251,-7969 }, { 252,-7969 }, { 253,-7969 }, { 254,-7969 }, + { 255,-7969 }, { 0, 131 }, { 0,83897 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-8226 }, { 49,-8226 }, { 50,-8226 }, { 51,-8226 }, { 52,-8226 }, + { 53,-8226 }, { 54,-8226 }, { 55,-8226 }, { 56,-8226 }, { 57,-8226 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-8226 }, { 66,-8226 }, { 67,-8226 }, + { 68,-8226 }, { 69,-8226 }, { 70,-8226 }, { 71,-8226 }, { 72,-8226 }, + { 73,15010 }, { 74,-8226 }, { 75,-8226 }, { 76,-8226 }, { 77,-8226 }, + { 78,-8226 }, { 79,15267 }, { 80,-8226 }, { 81,-8226 }, { 82,-8226 }, + { 83,-8226 }, { 84,-8226 }, { 85,-8226 }, { 86,-8226 }, { 87,-8226 }, + { 88,-8226 }, { 89,-8226 }, { 90,-8226 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-8226 }, { 0, 0 }, { 97,-8226 }, + { 98,-8226 }, { 99,-8226 }, { 100,-8226 }, { 101,-8226 }, { 102,-8226 }, + { 103,-8226 }, { 104,-8226 }, { 105,15010 }, { 106,-8226 }, { 107,-8226 }, + + { 108,-8226 }, { 109,-8226 }, { 110,-8226 }, { 111,15267 }, { 112,-8226 }, + { 113,-8226 }, { 114,-8226 }, { 115,-8226 }, { 116,-8226 }, { 117,-8226 }, + { 118,-8226 }, { 119,-8226 }, { 120,-8226 }, { 121,-8226 }, { 122,-8226 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-8226 }, + { 128,-8226 }, { 129,-8226 }, { 130,-8226 }, { 131,-8226 }, { 132,-8226 }, + { 133,-8226 }, { 134,-8226 }, { 135,-8226 }, { 136,-8226 }, { 137,-8226 }, + { 138,-8226 }, { 139,-8226 }, { 140,-8226 }, { 141,-8226 }, { 142,-8226 }, + { 143,-8226 }, { 144,-8226 }, { 145,-8226 }, { 146,-8226 }, { 147,-8226 }, + { 148,-8226 }, { 149,-8226 }, { 150,-8226 }, { 151,-8226 }, { 152,-8226 }, + { 153,-8226 }, { 154,-8226 }, { 155,-8226 }, { 156,-8226 }, { 157,-8226 }, + + { 158,-8226 }, { 159,-8226 }, { 160,-8226 }, { 161,-8226 }, { 162,-8226 }, + { 163,-8226 }, { 164,-8226 }, { 165,-8226 }, { 166,-8226 }, { 167,-8226 }, + { 168,-8226 }, { 169,-8226 }, { 170,-8226 }, { 171,-8226 }, { 172,-8226 }, + { 173,-8226 }, { 174,-8226 }, { 175,-8226 }, { 176,-8226 }, { 177,-8226 }, + { 178,-8226 }, { 179,-8226 }, { 180,-8226 }, { 181,-8226 }, { 182,-8226 }, + { 183,-8226 }, { 184,-8226 }, { 185,-8226 }, { 186,-8226 }, { 187,-8226 }, + { 188,-8226 }, { 189,-8226 }, { 190,-8226 }, { 191,-8226 }, { 192,-8226 }, + { 193,-8226 }, { 194,-8226 }, { 195,-8226 }, { 196,-8226 }, { 197,-8226 }, + { 198,-8226 }, { 199,-8226 }, { 200,-8226 }, { 201,-8226 }, { 202,-8226 }, + { 203,-8226 }, { 204,-8226 }, { 205,-8226 }, { 206,-8226 }, { 207,-8226 }, + + { 208,-8226 }, { 209,-8226 }, { 210,-8226 }, { 211,-8226 }, { 212,-8226 }, + { 213,-8226 }, { 214,-8226 }, { 215,-8226 }, { 216,-8226 }, { 217,-8226 }, + { 218,-8226 }, { 219,-8226 }, { 220,-8226 }, { 221,-8226 }, { 222,-8226 }, + { 223,-8226 }, { 224,-8226 }, { 225,-8226 }, { 226,-8226 }, { 227,-8226 }, + { 228,-8226 }, { 229,-8226 }, { 230,-8226 }, { 231,-8226 }, { 232,-8226 }, + { 233,-8226 }, { 234,-8226 }, { 235,-8226 }, { 236,-8226 }, { 237,-8226 }, + { 238,-8226 }, { 239,-8226 }, { 240,-8226 }, { 241,-8226 }, { 242,-8226 }, + { 243,-8226 }, { 244,-8226 }, { 245,-8226 }, { 246,-8226 }, { 247,-8226 }, + { 248,-8226 }, { 249,-8226 }, { 250,-8226 }, { 251,-8226 }, { 252,-8226 }, + { 253,-8226 }, { 254,-8226 }, { 255,-8226 }, { 0, 131 }, { 0,83640 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-8483 }, { 49,-8483 }, { 50,-8483 }, + + { 51,-8483 }, { 52,-8483 }, { 53,-8483 }, { 54,-8483 }, { 55,-8483 }, + { 56,-8483 }, { 57,-8483 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-8483 }, + { 66,15267 }, { 67,-8483 }, { 68,-8483 }, { 69,-8483 }, { 70,-8483 }, + { 71,-8483 }, { 72,-8483 }, { 73,-8483 }, { 74,-8483 }, { 75,-8483 }, + { 76,-8483 }, { 77,-8483 }, { 78,-8483 }, { 79,-8483 }, { 80,-8483 }, + { 81,-8483 }, { 82,-8483 }, { 83,-8483 }, { 84,-8483 }, { 85,-8483 }, + { 86,-8483 }, { 87,-8483 }, { 88,-8483 }, { 89,-8483 }, { 90,-8483 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-8483 }, + { 0, 0 }, { 97,-8483 }, { 98,15267 }, { 99,-8483 }, { 100,-8483 }, + + { 101,-8483 }, { 102,-8483 }, { 103,-8483 }, { 104,-8483 }, { 105,-8483 }, + { 106,-8483 }, { 107,-8483 }, { 108,-8483 }, { 109,-8483 }, { 110,-8483 }, + { 111,-8483 }, { 112,-8483 }, { 113,-8483 }, { 114,-8483 }, { 115,-8483 }, + { 116,-8483 }, { 117,-8483 }, { 118,-8483 }, { 119,-8483 }, { 120,-8483 }, + { 121,-8483 }, { 122,-8483 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-8483 }, { 128,-8483 }, { 129,-8483 }, { 130,-8483 }, + { 131,-8483 }, { 132,-8483 }, { 133,-8483 }, { 134,-8483 }, { 135,-8483 }, + { 136,-8483 }, { 137,-8483 }, { 138,-8483 }, { 139,-8483 }, { 140,-8483 }, + { 141,-8483 }, { 142,-8483 }, { 143,-8483 }, { 144,-8483 }, { 145,-8483 }, + { 146,-8483 }, { 147,-8483 }, { 148,-8483 }, { 149,-8483 }, { 150,-8483 }, + + { 151,-8483 }, { 152,-8483 }, { 153,-8483 }, { 154,-8483 }, { 155,-8483 }, + { 156,-8483 }, { 157,-8483 }, { 158,-8483 }, { 159,-8483 }, { 160,-8483 }, + { 161,-8483 }, { 162,-8483 }, { 163,-8483 }, { 164,-8483 }, { 165,-8483 }, + { 166,-8483 }, { 167,-8483 }, { 168,-8483 }, { 169,-8483 }, { 170,-8483 }, + { 171,-8483 }, { 172,-8483 }, { 173,-8483 }, { 174,-8483 }, { 175,-8483 }, + { 176,-8483 }, { 177,-8483 }, { 178,-8483 }, { 179,-8483 }, { 180,-8483 }, + { 181,-8483 }, { 182,-8483 }, { 183,-8483 }, { 184,-8483 }, { 185,-8483 }, + { 186,-8483 }, { 187,-8483 }, { 188,-8483 }, { 189,-8483 }, { 190,-8483 }, + { 191,-8483 }, { 192,-8483 }, { 193,-8483 }, { 194,-8483 }, { 195,-8483 }, + { 196,-8483 }, { 197,-8483 }, { 198,-8483 }, { 199,-8483 }, { 200,-8483 }, + + { 201,-8483 }, { 202,-8483 }, { 203,-8483 }, { 204,-8483 }, { 205,-8483 }, + { 206,-8483 }, { 207,-8483 }, { 208,-8483 }, { 209,-8483 }, { 210,-8483 }, + { 211,-8483 }, { 212,-8483 }, { 213,-8483 }, { 214,-8483 }, { 215,-8483 }, + { 216,-8483 }, { 217,-8483 }, { 218,-8483 }, { 219,-8483 }, { 220,-8483 }, + { 221,-8483 }, { 222,-8483 }, { 223,-8483 }, { 224,-8483 }, { 225,-8483 }, + { 226,-8483 }, { 227,-8483 }, { 228,-8483 }, { 229,-8483 }, { 230,-8483 }, + { 231,-8483 }, { 232,-8483 }, { 233,-8483 }, { 234,-8483 }, { 235,-8483 }, + { 236,-8483 }, { 237,-8483 }, { 238,-8483 }, { 239,-8483 }, { 240,-8483 }, + { 241,-8483 }, { 242,-8483 }, { 243,-8483 }, { 244,-8483 }, { 245,-8483 }, + { 246,-8483 }, { 247,-8483 }, { 248,-8483 }, { 249,-8483 }, { 250,-8483 }, + + { 251,-8483 }, { 252,-8483 }, { 253,-8483 }, { 254,-8483 }, { 255,-8483 }, + { 0, 131 }, { 0,83383 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-8740 }, + { 49,-8740 }, { 50,-8740 }, { 51,-8740 }, { 52,-8740 }, { 53,-8740 }, + { 54,-8740 }, { 55,-8740 }, { 56,-8740 }, { 57,-8740 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-8740 }, { 66,-8740 }, { 67,-8740 }, { 68,-8740 }, + { 69,-8740 }, { 70,-8740 }, { 71,-8740 }, { 72,-8740 }, { 73,-8740 }, + { 74,-8740 }, { 75,-8740 }, { 76,-8740 }, { 77,-8740 }, { 78,-8740 }, + { 79,-8740 }, { 80,-8740 }, { 81,15267 }, { 82,-8740 }, { 83,-8740 }, + { 84,15524 }, { 85,-8740 }, { 86,-8740 }, { 87,-8740 }, { 88,-8740 }, + { 89,-8740 }, { 90,-8740 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 95,-8740 }, { 0, 0 }, { 97,-8740 }, { 98,-8740 }, + { 99,-8740 }, { 100,-8740 }, { 101,-8740 }, { 102,-8740 }, { 103,-8740 }, + { 104,-8740 }, { 105,-8740 }, { 106,-8740 }, { 107,-8740 }, { 108,-8740 }, + { 109,-8740 }, { 110,-8740 }, { 111,-8740 }, { 112,-8740 }, { 113,15267 }, + { 114,-8740 }, { 115,-8740 }, { 116,15524 }, { 117,-8740 }, { 118,-8740 }, + { 119,-8740 }, { 120,-8740 }, { 121,-8740 }, { 122,-8740 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-8740 }, { 128,-8740 }, + { 129,-8740 }, { 130,-8740 }, { 131,-8740 }, { 132,-8740 }, { 133,-8740 }, + { 134,-8740 }, { 135,-8740 }, { 136,-8740 }, { 137,-8740 }, { 138,-8740 }, + { 139,-8740 }, { 140,-8740 }, { 141,-8740 }, { 142,-8740 }, { 143,-8740 }, + + { 144,-8740 }, { 145,-8740 }, { 146,-8740 }, { 147,-8740 }, { 148,-8740 }, + { 149,-8740 }, { 150,-8740 }, { 151,-8740 }, { 152,-8740 }, { 153,-8740 }, + { 154,-8740 }, { 155,-8740 }, { 156,-8740 }, { 157,-8740 }, { 158,-8740 }, + { 159,-8740 }, { 160,-8740 }, { 161,-8740 }, { 162,-8740 }, { 163,-8740 }, + { 164,-8740 }, { 165,-8740 }, { 166,-8740 }, { 167,-8740 }, { 168,-8740 }, + { 169,-8740 }, { 170,-8740 }, { 171,-8740 }, { 172,-8740 }, { 173,-8740 }, + { 174,-8740 }, { 175,-8740 }, { 176,-8740 }, { 177,-8740 }, { 178,-8740 }, + { 179,-8740 }, { 180,-8740 }, { 181,-8740 }, { 182,-8740 }, { 183,-8740 }, + { 184,-8740 }, { 185,-8740 }, { 186,-8740 }, { 187,-8740 }, { 188,-8740 }, + { 189,-8740 }, { 190,-8740 }, { 191,-8740 }, { 192,-8740 }, { 193,-8740 }, + + { 194,-8740 }, { 195,-8740 }, { 196,-8740 }, { 197,-8740 }, { 198,-8740 }, + { 199,-8740 }, { 200,-8740 }, { 201,-8740 }, { 202,-8740 }, { 203,-8740 }, + { 204,-8740 }, { 205,-8740 }, { 206,-8740 }, { 207,-8740 }, { 208,-8740 }, + { 209,-8740 }, { 210,-8740 }, { 211,-8740 }, { 212,-8740 }, { 213,-8740 }, + { 214,-8740 }, { 215,-8740 }, { 216,-8740 }, { 217,-8740 }, { 218,-8740 }, + { 219,-8740 }, { 220,-8740 }, { 221,-8740 }, { 222,-8740 }, { 223,-8740 }, + { 224,-8740 }, { 225,-8740 }, { 226,-8740 }, { 227,-8740 }, { 228,-8740 }, + { 229,-8740 }, { 230,-8740 }, { 231,-8740 }, { 232,-8740 }, { 233,-8740 }, + { 234,-8740 }, { 235,-8740 }, { 236,-8740 }, { 237,-8740 }, { 238,-8740 }, + { 239,-8740 }, { 240,-8740 }, { 241,-8740 }, { 242,-8740 }, { 243,-8740 }, + + { 244,-8740 }, { 245,-8740 }, { 246,-8740 }, { 247,-8740 }, { 248,-8740 }, + { 249,-8740 }, { 250,-8740 }, { 251,-8740 }, { 252,-8740 }, { 253,-8740 }, + { 254,-8740 }, { 255,-8740 }, { 0, 131 }, { 0,83126 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-8997 }, { 49,-8997 }, { 50,-8997 }, { 51,-8997 }, + { 52,-8997 }, { 53,-8997 }, { 54,-8997 }, { 55,-8997 }, { 56,-8997 }, + { 57,-8997 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,15524 }, { 66,-8997 }, + { 67,-8997 }, { 68,-8997 }, { 69,-8997 }, { 70,-8997 }, { 71,-8997 }, + { 72,-8997 }, { 73,-8997 }, { 74,-8997 }, { 75,-8997 }, { 76,-8997 }, + { 77,-8997 }, { 78,-8997 }, { 79,-8997 }, { 80,-8997 }, { 81,-8997 }, + { 82,-8997 }, { 83,-8997 }, { 84,-8997 }, { 85,-8997 }, { 86,-8997 }, + + { 87,-8997 }, { 88,-8997 }, { 89,-8997 }, { 90,-8997 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-8997 }, { 0, 0 }, + { 97,15524 }, { 98,-8997 }, { 99,-8997 }, { 100,-8997 }, { 101,-8997 }, + { 102,-8997 }, { 103,-8997 }, { 104,-8997 }, { 105,-8997 }, { 106,-8997 }, + { 107,-8997 }, { 108,-8997 }, { 109,-8997 }, { 110,-8997 }, { 111,-8997 }, + { 112,-8997 }, { 113,-8997 }, { 114,-8997 }, { 115,-8997 }, { 116,-8997 }, + { 117,-8997 }, { 118,-8997 }, { 119,-8997 }, { 120,-8997 }, { 121,-8997 }, + { 122,-8997 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-8997 }, { 128,-8997 }, { 129,-8997 }, { 130,-8997 }, { 131,-8997 }, + { 132,-8997 }, { 133,-8997 }, { 134,-8997 }, { 135,-8997 }, { 136,-8997 }, + + { 137,-8997 }, { 138,-8997 }, { 139,-8997 }, { 140,-8997 }, { 141,-8997 }, + { 142,-8997 }, { 143,-8997 }, { 144,-8997 }, { 145,-8997 }, { 146,-8997 }, + { 147,-8997 }, { 148,-8997 }, { 149,-8997 }, { 150,-8997 }, { 151,-8997 }, + { 152,-8997 }, { 153,-8997 }, { 154,-8997 }, { 155,-8997 }, { 156,-8997 }, + { 157,-8997 }, { 158,-8997 }, { 159,-8997 }, { 160,-8997 }, { 161,-8997 }, + { 162,-8997 }, { 163,-8997 }, { 164,-8997 }, { 165,-8997 }, { 166,-8997 }, + { 167,-8997 }, { 168,-8997 }, { 169,-8997 }, { 170,-8997 }, { 171,-8997 }, + { 172,-8997 }, { 173,-8997 }, { 174,-8997 }, { 175,-8997 }, { 176,-8997 }, + { 177,-8997 }, { 178,-8997 }, { 179,-8997 }, { 180,-8997 }, { 181,-8997 }, + { 182,-8997 }, { 183,-8997 }, { 184,-8997 }, { 185,-8997 }, { 186,-8997 }, + + { 187,-8997 }, { 188,-8997 }, { 189,-8997 }, { 190,-8997 }, { 191,-8997 }, + { 192,-8997 }, { 193,-8997 }, { 194,-8997 }, { 195,-8997 }, { 196,-8997 }, + { 197,-8997 }, { 198,-8997 }, { 199,-8997 }, { 200,-8997 }, { 201,-8997 }, + { 202,-8997 }, { 203,-8997 }, { 204,-8997 }, { 205,-8997 }, { 206,-8997 }, + { 207,-8997 }, { 208,-8997 }, { 209,-8997 }, { 210,-8997 }, { 211,-8997 }, + { 212,-8997 }, { 213,-8997 }, { 214,-8997 }, { 215,-8997 }, { 216,-8997 }, + { 217,-8997 }, { 218,-8997 }, { 219,-8997 }, { 220,-8997 }, { 221,-8997 }, + { 222,-8997 }, { 223,-8997 }, { 224,-8997 }, { 225,-8997 }, { 226,-8997 }, + { 227,-8997 }, { 228,-8997 }, { 229,-8997 }, { 230,-8997 }, { 231,-8997 }, + { 232,-8997 }, { 233,-8997 }, { 234,-8997 }, { 235,-8997 }, { 236,-8997 }, + + { 237,-8997 }, { 238,-8997 }, { 239,-8997 }, { 240,-8997 }, { 241,-8997 }, + { 242,-8997 }, { 243,-8997 }, { 244,-8997 }, { 245,-8997 }, { 246,-8997 }, + { 247,-8997 }, { 248,-8997 }, { 249,-8997 }, { 250,-8997 }, { 251,-8997 }, + { 252,-8997 }, { 253,-8997 }, { 254,-8997 }, { 255,-8997 }, { 0, 131 }, + { 0,82869 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-9254 }, { 49,-9254 }, + { 50,-9254 }, { 51,-9254 }, { 52,-9254 }, { 53,-9254 }, { 54,-9254 }, + { 55,-9254 }, { 56,-9254 }, { 57,-9254 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-9254 }, { 66,-9254 }, { 67,-9254 }, { 68,-9254 }, { 69,-9254 }, + { 70,-9254 }, { 71,-9254 }, { 72,-9254 }, { 73,15524 }, { 74,-9254 }, + { 75,-9254 }, { 76,-9254 }, { 77,-9254 }, { 78,-9254 }, { 79,-9254 }, + + { 80,-9254 }, { 81,-9254 }, { 82,-9254 }, { 83,-9254 }, { 84,-9254 }, + { 85,-9254 }, { 86,-9254 }, { 87,-9254 }, { 88,-9254 }, { 89,-9254 }, + { 90,-9254 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-9254 }, { 0, 0 }, { 97,-9254 }, { 98,-9254 }, { 99,-9254 }, + { 100,-9254 }, { 101,-9254 }, { 102,-9254 }, { 103,-9254 }, { 104,-9254 }, + { 105,15524 }, { 106,-9254 }, { 107,-9254 }, { 108,-9254 }, { 109,-9254 }, + { 110,-9254 }, { 111,-9254 }, { 112,-9254 }, { 113,-9254 }, { 114,-9254 }, + { 115,-9254 }, { 116,-9254 }, { 117,-9254 }, { 118,-9254 }, { 119,-9254 }, + { 120,-9254 }, { 121,-9254 }, { 122,-9254 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-9254 }, { 128,-9254 }, { 129,-9254 }, + + { 130,-9254 }, { 131,-9254 }, { 132,-9254 }, { 133,-9254 }, { 134,-9254 }, + { 135,-9254 }, { 136,-9254 }, { 137,-9254 }, { 138,-9254 }, { 139,-9254 }, + { 140,-9254 }, { 141,-9254 }, { 142,-9254 }, { 143,-9254 }, { 144,-9254 }, + { 145,-9254 }, { 146,-9254 }, { 147,-9254 }, { 148,-9254 }, { 149,-9254 }, + { 150,-9254 }, { 151,-9254 }, { 152,-9254 }, { 153,-9254 }, { 154,-9254 }, + { 155,-9254 }, { 156,-9254 }, { 157,-9254 }, { 158,-9254 }, { 159,-9254 }, + { 160,-9254 }, { 161,-9254 }, { 162,-9254 }, { 163,-9254 }, { 164,-9254 }, + { 165,-9254 }, { 166,-9254 }, { 167,-9254 }, { 168,-9254 }, { 169,-9254 }, + { 170,-9254 }, { 171,-9254 }, { 172,-9254 }, { 173,-9254 }, { 174,-9254 }, + { 175,-9254 }, { 176,-9254 }, { 177,-9254 }, { 178,-9254 }, { 179,-9254 }, + + { 180,-9254 }, { 181,-9254 }, { 182,-9254 }, { 183,-9254 }, { 184,-9254 }, + { 185,-9254 }, { 186,-9254 }, { 187,-9254 }, { 188,-9254 }, { 189,-9254 }, + { 190,-9254 }, { 191,-9254 }, { 192,-9254 }, { 193,-9254 }, { 194,-9254 }, + { 195,-9254 }, { 196,-9254 }, { 197,-9254 }, { 198,-9254 }, { 199,-9254 }, + { 200,-9254 }, { 201,-9254 }, { 202,-9254 }, { 203,-9254 }, { 204,-9254 }, + { 205,-9254 }, { 206,-9254 }, { 207,-9254 }, { 208,-9254 }, { 209,-9254 }, + { 210,-9254 }, { 211,-9254 }, { 212,-9254 }, { 213,-9254 }, { 214,-9254 }, + { 215,-9254 }, { 216,-9254 }, { 217,-9254 }, { 218,-9254 }, { 219,-9254 }, + { 220,-9254 }, { 221,-9254 }, { 222,-9254 }, { 223,-9254 }, { 224,-9254 }, + { 225,-9254 }, { 226,-9254 }, { 227,-9254 }, { 228,-9254 }, { 229,-9254 }, + + { 230,-9254 }, { 231,-9254 }, { 232,-9254 }, { 233,-9254 }, { 234,-9254 }, + { 235,-9254 }, { 236,-9254 }, { 237,-9254 }, { 238,-9254 }, { 239,-9254 }, + { 240,-9254 }, { 241,-9254 }, { 242,-9254 }, { 243,-9254 }, { 244,-9254 }, + { 245,-9254 }, { 246,-9254 }, { 247,-9254 }, { 248,-9254 }, { 249,-9254 }, + { 250,-9254 }, { 251,-9254 }, { 252,-9254 }, { 253,-9254 }, { 254,-9254 }, + { 255,-9254 }, { 0, 131 }, { 0,82612 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-9511 }, { 49,-9511 }, { 50,-9511 }, { 51,-9511 }, { 52,-9511 }, + { 53,-9511 }, { 54,-9511 }, { 55,-9511 }, { 56,-9511 }, { 57,-9511 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-9511 }, { 66,-9511 }, { 67,-9511 }, + { 68,-9511 }, { 69,-9511 }, { 70,-9511 }, { 71,-9511 }, { 72,-9511 }, + + { 73,-9511 }, { 74,-9511 }, { 75,-9511 }, { 76,-9511 }, { 77,-9511 }, + { 78,-9511 }, { 79,-9511 }, { 80,-9511 }, { 81,-9511 }, { 82,15524 }, + { 83,-9511 }, { 84,-9511 }, { 85,-9511 }, { 86,-9511 }, { 87,-9511 }, + { 88,-9511 }, { 89,-9511 }, { 90,-9511 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-9511 }, { 0, 0 }, { 97,-9511 }, + { 98,-9511 }, { 99,-9511 }, { 100,-9511 }, { 101,-9511 }, { 102,-9511 }, + { 103,-9511 }, { 104,-9511 }, { 105,-9511 }, { 106,-9511 }, { 107,-9511 }, + { 108,-9511 }, { 109,-9511 }, { 110,-9511 }, { 111,-9511 }, { 112,-9511 }, + { 113,-9511 }, { 114,15524 }, { 115,-9511 }, { 116,-9511 }, { 117,-9511 }, + { 118,-9511 }, { 119,-9511 }, { 120,-9511 }, { 121,-9511 }, { 122,-9511 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-9511 }, + { 128,-9511 }, { 129,-9511 }, { 130,-9511 }, { 131,-9511 }, { 132,-9511 }, + { 133,-9511 }, { 134,-9511 }, { 135,-9511 }, { 136,-9511 }, { 137,-9511 }, + { 138,-9511 }, { 139,-9511 }, { 140,-9511 }, { 141,-9511 }, { 142,-9511 }, + { 143,-9511 }, { 144,-9511 }, { 145,-9511 }, { 146,-9511 }, { 147,-9511 }, + { 148,-9511 }, { 149,-9511 }, { 150,-9511 }, { 151,-9511 }, { 152,-9511 }, + { 153,-9511 }, { 154,-9511 }, { 155,-9511 }, { 156,-9511 }, { 157,-9511 }, + { 158,-9511 }, { 159,-9511 }, { 160,-9511 }, { 161,-9511 }, { 162,-9511 }, + { 163,-9511 }, { 164,-9511 }, { 165,-9511 }, { 166,-9511 }, { 167,-9511 }, + { 168,-9511 }, { 169,-9511 }, { 170,-9511 }, { 171,-9511 }, { 172,-9511 }, + + { 173,-9511 }, { 174,-9511 }, { 175,-9511 }, { 176,-9511 }, { 177,-9511 }, + { 178,-9511 }, { 179,-9511 }, { 180,-9511 }, { 181,-9511 }, { 182,-9511 }, + { 183,-9511 }, { 184,-9511 }, { 185,-9511 }, { 186,-9511 }, { 187,-9511 }, + { 188,-9511 }, { 189,-9511 }, { 190,-9511 }, { 191,-9511 }, { 192,-9511 }, + { 193,-9511 }, { 194,-9511 }, { 195,-9511 }, { 196,-9511 }, { 197,-9511 }, + { 198,-9511 }, { 199,-9511 }, { 200,-9511 }, { 201,-9511 }, { 202,-9511 }, + { 203,-9511 }, { 204,-9511 }, { 205,-9511 }, { 206,-9511 }, { 207,-9511 }, + { 208,-9511 }, { 209,-9511 }, { 210,-9511 }, { 211,-9511 }, { 212,-9511 }, + { 213,-9511 }, { 214,-9511 }, { 215,-9511 }, { 216,-9511 }, { 217,-9511 }, + { 218,-9511 }, { 219,-9511 }, { 220,-9511 }, { 221,-9511 }, { 222,-9511 }, + + { 223,-9511 }, { 224,-9511 }, { 225,-9511 }, { 226,-9511 }, { 227,-9511 }, + { 228,-9511 }, { 229,-9511 }, { 230,-9511 }, { 231,-9511 }, { 232,-9511 }, + { 233,-9511 }, { 234,-9511 }, { 235,-9511 }, { 236,-9511 }, { 237,-9511 }, + { 238,-9511 }, { 239,-9511 }, { 240,-9511 }, { 241,-9511 }, { 242,-9511 }, + { 243,-9511 }, { 244,-9511 }, { 245,-9511 }, { 246,-9511 }, { 247,-9511 }, + { 248,-9511 }, { 249,-9511 }, { 250,-9511 }, { 251,-9511 }, { 252,-9511 }, + { 253,-9511 }, { 254,-9511 }, { 255,-9511 }, { 0, 131 }, { 0,82355 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-9768 }, { 49,-9768 }, { 50,-9768 }, + { 51,-9768 }, { 52,-9768 }, { 53,-9768 }, { 54,-9768 }, { 55,-9768 }, + { 56,-9768 }, { 57,-9768 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,15524 }, + + { 66,-9768 }, { 67,-9768 }, { 68,-9768 }, { 69,-9768 }, { 70,-9768 }, + { 71,-9768 }, { 72,-9768 }, { 73,-9768 }, { 74,-9768 }, { 75,-9768 }, + { 76,-9768 }, { 77,-9768 }, { 78,-9768 }, { 79,-9768 }, { 80,-9768 }, + { 81,-9768 }, { 82,-9768 }, { 83,-9768 }, { 84,-9768 }, { 85,-9768 }, + { 86,-9768 }, { 87,-9768 }, { 88,-9768 }, { 89,15781 }, { 90,-9768 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-9768 }, + { 0, 0 }, { 97,15524 }, { 98,-9768 }, { 99,-9768 }, { 100,-9768 }, + { 101,-9768 }, { 102,-9768 }, { 103,-9768 }, { 104,-9768 }, { 105,-9768 }, + { 106,-9768 }, { 107,-9768 }, { 108,-9768 }, { 109,-9768 }, { 110,-9768 }, + { 111,-9768 }, { 112,-9768 }, { 113,-9768 }, { 114,-9768 }, { 115,-9768 }, + + { 116,-9768 }, { 117,-9768 }, { 118,-9768 }, { 119,-9768 }, { 120,-9768 }, + { 121,15781 }, { 122,-9768 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-9768 }, { 128,-9768 }, { 129,-9768 }, { 130,-9768 }, + { 131,-9768 }, { 132,-9768 }, { 133,-9768 }, { 134,-9768 }, { 135,-9768 }, + { 136,-9768 }, { 137,-9768 }, { 138,-9768 }, { 139,-9768 }, { 140,-9768 }, + { 141,-9768 }, { 142,-9768 }, { 143,-9768 }, { 144,-9768 }, { 145,-9768 }, + { 146,-9768 }, { 147,-9768 }, { 148,-9768 }, { 149,-9768 }, { 150,-9768 }, + { 151,-9768 }, { 152,-9768 }, { 153,-9768 }, { 154,-9768 }, { 155,-9768 }, + { 156,-9768 }, { 157,-9768 }, { 158,-9768 }, { 159,-9768 }, { 160,-9768 }, + { 161,-9768 }, { 162,-9768 }, { 163,-9768 }, { 164,-9768 }, { 165,-9768 }, + + { 166,-9768 }, { 167,-9768 }, { 168,-9768 }, { 169,-9768 }, { 170,-9768 }, + { 171,-9768 }, { 172,-9768 }, { 173,-9768 }, { 174,-9768 }, { 175,-9768 }, + { 176,-9768 }, { 177,-9768 }, { 178,-9768 }, { 179,-9768 }, { 180,-9768 }, + { 181,-9768 }, { 182,-9768 }, { 183,-9768 }, { 184,-9768 }, { 185,-9768 }, + { 186,-9768 }, { 187,-9768 }, { 188,-9768 }, { 189,-9768 }, { 190,-9768 }, + { 191,-9768 }, { 192,-9768 }, { 193,-9768 }, { 194,-9768 }, { 195,-9768 }, + { 196,-9768 }, { 197,-9768 }, { 198,-9768 }, { 199,-9768 }, { 200,-9768 }, + { 201,-9768 }, { 202,-9768 }, { 203,-9768 }, { 204,-9768 }, { 205,-9768 }, + { 206,-9768 }, { 207,-9768 }, { 208,-9768 }, { 209,-9768 }, { 210,-9768 }, + { 211,-9768 }, { 212,-9768 }, { 213,-9768 }, { 214,-9768 }, { 215,-9768 }, + + { 216,-9768 }, { 217,-9768 }, { 218,-9768 }, { 219,-9768 }, { 220,-9768 }, + { 221,-9768 }, { 222,-9768 }, { 223,-9768 }, { 224,-9768 }, { 225,-9768 }, + { 226,-9768 }, { 227,-9768 }, { 228,-9768 }, { 229,-9768 }, { 230,-9768 }, + { 231,-9768 }, { 232,-9768 }, { 233,-9768 }, { 234,-9768 }, { 235,-9768 }, + { 236,-9768 }, { 237,-9768 }, { 238,-9768 }, { 239,-9768 }, { 240,-9768 }, + { 241,-9768 }, { 242,-9768 }, { 243,-9768 }, { 244,-9768 }, { 245,-9768 }, + { 246,-9768 }, { 247,-9768 }, { 248,-9768 }, { 249,-9768 }, { 250,-9768 }, + { 251,-9768 }, { 252,-9768 }, { 253,-9768 }, { 254,-9768 }, { 255,-9768 }, + { 0, 131 }, { 0,82098 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-10025 }, + { 49,-10025 }, { 50,-10025 }, { 51,-10025 }, { 52,-10025 }, { 53,-10025 }, + { 54,-10025 }, { 55,-10025 }, { 56,-10025 }, { 57,-10025 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-10025 }, { 66,-10025 }, { 67,-10025 }, { 68,-10025 }, + { 69,-10025 }, { 70,-10025 }, { 71,-10025 }, { 72,-10025 }, { 73,-10025 }, + { 74,-10025 }, { 75,-10025 }, { 76,-10025 }, { 77,-10025 }, { 78,-10025 }, + { 79,-10025 }, { 80,-10025 }, { 81,-10025 }, { 82,-10025 }, { 83,15781 }, + { 84,-10025 }, { 85,-10025 }, { 86,-10025 }, { 87,-10025 }, { 88,-10025 }, + { 89,-10025 }, { 90,-10025 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-10025 }, { 0, 0 }, { 97,-10025 }, { 98,-10025 }, + { 99,-10025 }, { 100,-10025 }, { 101,-10025 }, { 102,-10025 }, { 103,-10025 }, + { 104,-10025 }, { 105,-10025 }, { 106,-10025 }, { 107,-10025 }, { 108,-10025 }, + + { 109,-10025 }, { 110,-10025 }, { 111,-10025 }, { 112,-10025 }, { 113,-10025 }, + { 114,-10025 }, { 115,15781 }, { 116,-10025 }, { 117,-10025 }, { 118,-10025 }, + { 119,-10025 }, { 120,-10025 }, { 121,-10025 }, { 122,-10025 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-10025 }, { 128,-10025 }, + { 129,-10025 }, { 130,-10025 }, { 131,-10025 }, { 132,-10025 }, { 133,-10025 }, + { 134,-10025 }, { 135,-10025 }, { 136,-10025 }, { 137,-10025 }, { 138,-10025 }, + { 139,-10025 }, { 140,-10025 }, { 141,-10025 }, { 142,-10025 }, { 143,-10025 }, + { 144,-10025 }, { 145,-10025 }, { 146,-10025 }, { 147,-10025 }, { 148,-10025 }, + { 149,-10025 }, { 150,-10025 }, { 151,-10025 }, { 152,-10025 }, { 153,-10025 }, + { 154,-10025 }, { 155,-10025 }, { 156,-10025 }, { 157,-10025 }, { 158,-10025 }, + + { 159,-10025 }, { 160,-10025 }, { 161,-10025 }, { 162,-10025 }, { 163,-10025 }, + { 164,-10025 }, { 165,-10025 }, { 166,-10025 }, { 167,-10025 }, { 168,-10025 }, + { 169,-10025 }, { 170,-10025 }, { 171,-10025 }, { 172,-10025 }, { 173,-10025 }, + { 174,-10025 }, { 175,-10025 }, { 176,-10025 }, { 177,-10025 }, { 178,-10025 }, + { 179,-10025 }, { 180,-10025 }, { 181,-10025 }, { 182,-10025 }, { 183,-10025 }, + { 184,-10025 }, { 185,-10025 }, { 186,-10025 }, { 187,-10025 }, { 188,-10025 }, + { 189,-10025 }, { 190,-10025 }, { 191,-10025 }, { 192,-10025 }, { 193,-10025 }, + { 194,-10025 }, { 195,-10025 }, { 196,-10025 }, { 197,-10025 }, { 198,-10025 }, + { 199,-10025 }, { 200,-10025 }, { 201,-10025 }, { 202,-10025 }, { 203,-10025 }, + { 204,-10025 }, { 205,-10025 }, { 206,-10025 }, { 207,-10025 }, { 208,-10025 }, + + { 209,-10025 }, { 210,-10025 }, { 211,-10025 }, { 212,-10025 }, { 213,-10025 }, + { 214,-10025 }, { 215,-10025 }, { 216,-10025 }, { 217,-10025 }, { 218,-10025 }, + { 219,-10025 }, { 220,-10025 }, { 221,-10025 }, { 222,-10025 }, { 223,-10025 }, + { 224,-10025 }, { 225,-10025 }, { 226,-10025 }, { 227,-10025 }, { 228,-10025 }, + { 229,-10025 }, { 230,-10025 }, { 231,-10025 }, { 232,-10025 }, { 233,-10025 }, + { 234,-10025 }, { 235,-10025 }, { 236,-10025 }, { 237,-10025 }, { 238,-10025 }, + { 239,-10025 }, { 240,-10025 }, { 241,-10025 }, { 242,-10025 }, { 243,-10025 }, + { 244,-10025 }, { 245,-10025 }, { 246,-10025 }, { 247,-10025 }, { 248,-10025 }, + { 249,-10025 }, { 250,-10025 }, { 251,-10025 }, { 252,-10025 }, { 253,-10025 }, + { 254,-10025 }, { 255,-10025 }, { 0, 131 }, { 0,81841 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-10282 }, { 49,-10282 }, { 50,-10282 }, { 51,-10282 }, + + { 52,-10282 }, { 53,-10282 }, { 54,-10282 }, { 55,-10282 }, { 56,-10282 }, + { 57,-10282 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-10282 }, { 66,-10282 }, + { 67,-10282 }, { 68,-10282 }, { 69,15781 }, { 70,-10282 }, { 71,-10282 }, + { 72,-10282 }, { 73,-10282 }, { 74,-10282 }, { 75,-10282 }, { 76,-10282 }, + { 77,-10282 }, { 78,-10282 }, { 79,-10282 }, { 80,-10282 }, { 81,-10282 }, + { 82,-10282 }, { 83,-10282 }, { 84,-10282 }, { 85,-10282 }, { 86,-10282 }, + { 87,-10282 }, { 88,-10282 }, { 89,-10282 }, { 90,-10282 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-10282 }, { 0, 0 }, + { 97,-10282 }, { 98,-10282 }, { 99,-10282 }, { 100,-10282 }, { 101,15781 }, + + { 102,-10282 }, { 103,-10282 }, { 104,-10282 }, { 105,-10282 }, { 106,-10282 }, + { 107,-10282 }, { 108,-10282 }, { 109,-10282 }, { 110,-10282 }, { 111,-10282 }, + { 112,-10282 }, { 113,-10282 }, { 114,-10282 }, { 115,-10282 }, { 116,-10282 }, + { 117,-10282 }, { 118,-10282 }, { 119,-10282 }, { 120,-10282 }, { 121,-10282 }, + { 122,-10282 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-10282 }, { 128,-10282 }, { 129,-10282 }, { 130,-10282 }, { 131,-10282 }, + { 132,-10282 }, { 133,-10282 }, { 134,-10282 }, { 135,-10282 }, { 136,-10282 }, + { 137,-10282 }, { 138,-10282 }, { 139,-10282 }, { 140,-10282 }, { 141,-10282 }, + { 142,-10282 }, { 143,-10282 }, { 144,-10282 }, { 145,-10282 }, { 146,-10282 }, + { 147,-10282 }, { 148,-10282 }, { 149,-10282 }, { 150,-10282 }, { 151,-10282 }, + + { 152,-10282 }, { 153,-10282 }, { 154,-10282 }, { 155,-10282 }, { 156,-10282 }, + { 157,-10282 }, { 158,-10282 }, { 159,-10282 }, { 160,-10282 }, { 161,-10282 }, + { 162,-10282 }, { 163,-10282 }, { 164,-10282 }, { 165,-10282 }, { 166,-10282 }, + { 167,-10282 }, { 168,-10282 }, { 169,-10282 }, { 170,-10282 }, { 171,-10282 }, + { 172,-10282 }, { 173,-10282 }, { 174,-10282 }, { 175,-10282 }, { 176,-10282 }, + { 177,-10282 }, { 178,-10282 }, { 179,-10282 }, { 180,-10282 }, { 181,-10282 }, + { 182,-10282 }, { 183,-10282 }, { 184,-10282 }, { 185,-10282 }, { 186,-10282 }, + { 187,-10282 }, { 188,-10282 }, { 189,-10282 }, { 190,-10282 }, { 191,-10282 }, + { 192,-10282 }, { 193,-10282 }, { 194,-10282 }, { 195,-10282 }, { 196,-10282 }, + { 197,-10282 }, { 198,-10282 }, { 199,-10282 }, { 200,-10282 }, { 201,-10282 }, + + { 202,-10282 }, { 203,-10282 }, { 204,-10282 }, { 205,-10282 }, { 206,-10282 }, + { 207,-10282 }, { 208,-10282 }, { 209,-10282 }, { 210,-10282 }, { 211,-10282 }, + { 212,-10282 }, { 213,-10282 }, { 214,-10282 }, { 215,-10282 }, { 216,-10282 }, + { 217,-10282 }, { 218,-10282 }, { 219,-10282 }, { 220,-10282 }, { 221,-10282 }, + { 222,-10282 }, { 223,-10282 }, { 224,-10282 }, { 225,-10282 }, { 226,-10282 }, + { 227,-10282 }, { 228,-10282 }, { 229,-10282 }, { 230,-10282 }, { 231,-10282 }, + { 232,-10282 }, { 233,-10282 }, { 234,-10282 }, { 235,-10282 }, { 236,-10282 }, + { 237,-10282 }, { 238,-10282 }, { 239,-10282 }, { 240,-10282 }, { 241,-10282 }, + { 242,-10282 }, { 243,-10282 }, { 244,-10282 }, { 245,-10282 }, { 246,-10282 }, + { 247,-10282 }, { 248,-10282 }, { 249,-10282 }, { 250,-10282 }, { 251,-10282 }, + + { 252,-10282 }, { 253,-10282 }, { 254,-10282 }, { 255,-10282 }, { 0, 131 }, + { 0,81584 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-10539 }, { 49,-10539 }, + { 50,-10539 }, { 51,-10539 }, { 52,-10539 }, { 53,-10539 }, { 54,-10539 }, + { 55,-10539 }, { 56,-10539 }, { 57,-10539 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-10539 }, { 66,-10539 }, { 67,-10539 }, { 68,-10539 }, { 69,-10539 }, + { 70,-10539 }, { 71,-10539 }, { 72,-10539 }, { 73,-10539 }, { 74,-10539 }, + { 75,-10539 }, { 76,-10539 }, { 77,-10539 }, { 78,-10539 }, { 79,-10539 }, + { 80,-10539 }, { 81,-10539 }, { 82,15781 }, { 83,-10539 }, { 84,-10539 }, + { 85,-10539 }, { 86,-10539 }, { 87,-10539 }, { 88,-10539 }, { 89,-10539 }, + { 90,-10539 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 95,-10539 }, { 0, 0 }, { 97,-10539 }, { 98,-10539 }, { 99,-10539 }, + { 100,-10539 }, { 101,-10539 }, { 102,-10539 }, { 103,-10539 }, { 104,-10539 }, + { 105,-10539 }, { 106,-10539 }, { 107,-10539 }, { 108,-10539 }, { 109,-10539 }, + { 110,-10539 }, { 111,-10539 }, { 112,-10539 }, { 113,-10539 }, { 114,15781 }, + { 115,-10539 }, { 116,-10539 }, { 117,-10539 }, { 118,-10539 }, { 119,-10539 }, + { 120,-10539 }, { 121,-10539 }, { 122,-10539 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-10539 }, { 128,-10539 }, { 129,-10539 }, + { 130,-10539 }, { 131,-10539 }, { 132,-10539 }, { 133,-10539 }, { 134,-10539 }, + { 135,-10539 }, { 136,-10539 }, { 137,-10539 }, { 138,-10539 }, { 139,-10539 }, + { 140,-10539 }, { 141,-10539 }, { 142,-10539 }, { 143,-10539 }, { 144,-10539 }, + + { 145,-10539 }, { 146,-10539 }, { 147,-10539 }, { 148,-10539 }, { 149,-10539 }, + { 150,-10539 }, { 151,-10539 }, { 152,-10539 }, { 153,-10539 }, { 154,-10539 }, + { 155,-10539 }, { 156,-10539 }, { 157,-10539 }, { 158,-10539 }, { 159,-10539 }, + { 160,-10539 }, { 161,-10539 }, { 162,-10539 }, { 163,-10539 }, { 164,-10539 }, + { 165,-10539 }, { 166,-10539 }, { 167,-10539 }, { 168,-10539 }, { 169,-10539 }, + { 170,-10539 }, { 171,-10539 }, { 172,-10539 }, { 173,-10539 }, { 174,-10539 }, + { 175,-10539 }, { 176,-10539 }, { 177,-10539 }, { 178,-10539 }, { 179,-10539 }, + { 180,-10539 }, { 181,-10539 }, { 182,-10539 }, { 183,-10539 }, { 184,-10539 }, + { 185,-10539 }, { 186,-10539 }, { 187,-10539 }, { 188,-10539 }, { 189,-10539 }, + { 190,-10539 }, { 191,-10539 }, { 192,-10539 }, { 193,-10539 }, { 194,-10539 }, + + { 195,-10539 }, { 196,-10539 }, { 197,-10539 }, { 198,-10539 }, { 199,-10539 }, + { 200,-10539 }, { 201,-10539 }, { 202,-10539 }, { 203,-10539 }, { 204,-10539 }, + { 205,-10539 }, { 206,-10539 }, { 207,-10539 }, { 208,-10539 }, { 209,-10539 }, + { 210,-10539 }, { 211,-10539 }, { 212,-10539 }, { 213,-10539 }, { 214,-10539 }, + { 215,-10539 }, { 216,-10539 }, { 217,-10539 }, { 218,-10539 }, { 219,-10539 }, + { 220,-10539 }, { 221,-10539 }, { 222,-10539 }, { 223,-10539 }, { 224,-10539 }, + { 225,-10539 }, { 226,-10539 }, { 227,-10539 }, { 228,-10539 }, { 229,-10539 }, + { 230,-10539 }, { 231,-10539 }, { 232,-10539 }, { 233,-10539 }, { 234,-10539 }, + { 235,-10539 }, { 236,-10539 }, { 237,-10539 }, { 238,-10539 }, { 239,-10539 }, + { 240,-10539 }, { 241,-10539 }, { 242,-10539 }, { 243,-10539 }, { 244,-10539 }, + + { 245,-10539 }, { 246,-10539 }, { 247,-10539 }, { 248,-10539 }, { 249,-10539 }, + { 250,-10539 }, { 251,-10539 }, { 252,-10539 }, { 253,-10539 }, { 254,-10539 }, + { 255,-10539 }, { 0, 131 }, { 0,81327 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-10796 }, { 49,-10796 }, { 50,-10796 }, { 51,-10796 }, { 52,-10796 }, + { 53,-10796 }, { 54,-10796 }, { 55,-10796 }, { 56,-10796 }, { 57,-10796 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-10796 }, { 66,-10796 }, { 67,-10796 }, + { 68,-10796 }, { 69,-10796 }, { 70,-10796 }, { 71,-10796 }, { 72,-10796 }, + { 73,15781 }, { 74,-10796 }, { 75,-10796 }, { 76,-10796 }, { 77,-10796 }, + { 78,-10796 }, { 79,-10796 }, { 80,-10796 }, { 81,-10796 }, { 82,-10796 }, + { 83,-10796 }, { 84,-10796 }, { 85,-10796 }, { 86,-10796 }, { 87,-10796 }, + + { 88,-10796 }, { 89,-10796 }, { 90,-10796 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-10796 }, { 0, 0 }, { 97,-10796 }, + { 98,-10796 }, { 99,-10796 }, { 100,-10796 }, { 101,-10796 }, { 102,-10796 }, + { 103,-10796 }, { 104,-10796 }, { 105,15781 }, { 106,-10796 }, { 107,-10796 }, + { 108,-10796 }, { 109,-10796 }, { 110,-10796 }, { 111,-10796 }, { 112,-10796 }, + { 113,-10796 }, { 114,-10796 }, { 115,-10796 }, { 116,-10796 }, { 117,-10796 }, + { 118,-10796 }, { 119,-10796 }, { 120,-10796 }, { 121,-10796 }, { 122,-10796 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-10796 }, + { 128,-10796 }, { 129,-10796 }, { 130,-10796 }, { 131,-10796 }, { 132,-10796 }, + { 133,-10796 }, { 134,-10796 }, { 135,-10796 }, { 136,-10796 }, { 137,-10796 }, + + { 138,-10796 }, { 139,-10796 }, { 140,-10796 }, { 141,-10796 }, { 142,-10796 }, + { 143,-10796 }, { 144,-10796 }, { 145,-10796 }, { 146,-10796 }, { 147,-10796 }, + { 148,-10796 }, { 149,-10796 }, { 150,-10796 }, { 151,-10796 }, { 152,-10796 }, + { 153,-10796 }, { 154,-10796 }, { 155,-10796 }, { 156,-10796 }, { 157,-10796 }, + { 158,-10796 }, { 159,-10796 }, { 160,-10796 }, { 161,-10796 }, { 162,-10796 }, + { 163,-10796 }, { 164,-10796 }, { 165,-10796 }, { 166,-10796 }, { 167,-10796 }, + { 168,-10796 }, { 169,-10796 }, { 170,-10796 }, { 171,-10796 }, { 172,-10796 }, + { 173,-10796 }, { 174,-10796 }, { 175,-10796 }, { 176,-10796 }, { 177,-10796 }, + { 178,-10796 }, { 179,-10796 }, { 180,-10796 }, { 181,-10796 }, { 182,-10796 }, + { 183,-10796 }, { 184,-10796 }, { 185,-10796 }, { 186,-10796 }, { 187,-10796 }, + + { 188,-10796 }, { 189,-10796 }, { 190,-10796 }, { 191,-10796 }, { 192,-10796 }, + { 193,-10796 }, { 194,-10796 }, { 195,-10796 }, { 196,-10796 }, { 197,-10796 }, + { 198,-10796 }, { 199,-10796 }, { 200,-10796 }, { 201,-10796 }, { 202,-10796 }, + { 203,-10796 }, { 204,-10796 }, { 205,-10796 }, { 206,-10796 }, { 207,-10796 }, + { 208,-10796 }, { 209,-10796 }, { 210,-10796 }, { 211,-10796 }, { 212,-10796 }, + { 213,-10796 }, { 214,-10796 }, { 215,-10796 }, { 216,-10796 }, { 217,-10796 }, + { 218,-10796 }, { 219,-10796 }, { 220,-10796 }, { 221,-10796 }, { 222,-10796 }, + { 223,-10796 }, { 224,-10796 }, { 225,-10796 }, { 226,-10796 }, { 227,-10796 }, + { 228,-10796 }, { 229,-10796 }, { 230,-10796 }, { 231,-10796 }, { 232,-10796 }, + { 233,-10796 }, { 234,-10796 }, { 235,-10796 }, { 236,-10796 }, { 237,-10796 }, + + { 238,-10796 }, { 239,-10796 }, { 240,-10796 }, { 241,-10796 }, { 242,-10796 }, + { 243,-10796 }, { 244,-10796 }, { 245,-10796 }, { 246,-10796 }, { 247,-10796 }, + { 248,-10796 }, { 249,-10796 }, { 250,-10796 }, { 251,-10796 }, { 252,-10796 }, + { 253,-10796 }, { 254,-10796 }, { 255,-10796 }, { 0, 131 }, { 0,81070 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-11053 }, { 49,-11053 }, { 50,-11053 }, + { 51,-11053 }, { 52,-11053 }, { 53,-11053 }, { 54,-11053 }, { 55,-11053 }, + { 56,-11053 }, { 57,-11053 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-11053 }, + { 66,-11053 }, { 67,-11053 }, { 68,-11053 }, { 69,-11053 }, { 70,-11053 }, + { 71,-11053 }, { 72,-11053 }, { 73,-11053 }, { 74,-11053 }, { 75,-11053 }, + { 76,-11053 }, { 77,-11053 }, { 78,-11053 }, { 79,-11053 }, { 80,-11053 }, + + { 81,-11053 }, { 82,15781 }, { 83,-11053 }, { 84,-11053 }, { 85,-11053 }, + { 86,-11053 }, { 87,-11053 }, { 88,-11053 }, { 89,-11053 }, { 90,-11053 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-11053 }, + { 0, 0 }, { 97,-11053 }, { 98,-11053 }, { 99,-11053 }, { 100,-11053 }, + { 101,-11053 }, { 102,-11053 }, { 103,-11053 }, { 104,-11053 }, { 105,-11053 }, + { 106,-11053 }, { 107,-11053 }, { 108,-11053 }, { 109,-11053 }, { 110,-11053 }, + { 111,-11053 }, { 112,-11053 }, { 113,-11053 }, { 114,15781 }, { 115,-11053 }, + { 116,-11053 }, { 117,-11053 }, { 118,-11053 }, { 119,-11053 }, { 120,-11053 }, + { 121,-11053 }, { 122,-11053 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-11053 }, { 128,-11053 }, { 129,-11053 }, { 130,-11053 }, + + { 131,-11053 }, { 132,-11053 }, { 133,-11053 }, { 134,-11053 }, { 135,-11053 }, + { 136,-11053 }, { 137,-11053 }, { 138,-11053 }, { 139,-11053 }, { 140,-11053 }, + { 141,-11053 }, { 142,-11053 }, { 143,-11053 }, { 144,-11053 }, { 145,-11053 }, + { 146,-11053 }, { 147,-11053 }, { 148,-11053 }, { 149,-11053 }, { 150,-11053 }, + { 151,-11053 }, { 152,-11053 }, { 153,-11053 }, { 154,-11053 }, { 155,-11053 }, + { 156,-11053 }, { 157,-11053 }, { 158,-11053 }, { 159,-11053 }, { 160,-11053 }, + { 161,-11053 }, { 162,-11053 }, { 163,-11053 }, { 164,-11053 }, { 165,-11053 }, + { 166,-11053 }, { 167,-11053 }, { 168,-11053 }, { 169,-11053 }, { 170,-11053 }, + { 171,-11053 }, { 172,-11053 }, { 173,-11053 }, { 174,-11053 }, { 175,-11053 }, + { 176,-11053 }, { 177,-11053 }, { 178,-11053 }, { 179,-11053 }, { 180,-11053 }, + + { 181,-11053 }, { 182,-11053 }, { 183,-11053 }, { 184,-11053 }, { 185,-11053 }, + { 186,-11053 }, { 187,-11053 }, { 188,-11053 }, { 189,-11053 }, { 190,-11053 }, + { 191,-11053 }, { 192,-11053 }, { 193,-11053 }, { 194,-11053 }, { 195,-11053 }, + { 196,-11053 }, { 197,-11053 }, { 198,-11053 }, { 199,-11053 }, { 200,-11053 }, + { 201,-11053 }, { 202,-11053 }, { 203,-11053 }, { 204,-11053 }, { 205,-11053 }, + { 206,-11053 }, { 207,-11053 }, { 208,-11053 }, { 209,-11053 }, { 210,-11053 }, + { 211,-11053 }, { 212,-11053 }, { 213,-11053 }, { 214,-11053 }, { 215,-11053 }, + { 216,-11053 }, { 217,-11053 }, { 218,-11053 }, { 219,-11053 }, { 220,-11053 }, + { 221,-11053 }, { 222,-11053 }, { 223,-11053 }, { 224,-11053 }, { 225,-11053 }, + { 226,-11053 }, { 227,-11053 }, { 228,-11053 }, { 229,-11053 }, { 230,-11053 }, + + { 231,-11053 }, { 232,-11053 }, { 233,-11053 }, { 234,-11053 }, { 235,-11053 }, + { 236,-11053 }, { 237,-11053 }, { 238,-11053 }, { 239,-11053 }, { 240,-11053 }, + { 241,-11053 }, { 242,-11053 }, { 243,-11053 }, { 244,-11053 }, { 245,-11053 }, + { 246,-11053 }, { 247,-11053 }, { 248,-11053 }, { 249,-11053 }, { 250,-11053 }, + { 251,-11053 }, { 252,-11053 }, { 253,-11053 }, { 254,-11053 }, { 255,-11053 }, + { 0, 131 }, { 0,80813 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-11310 }, + { 49,-11310 }, { 50,-11310 }, { 51,-11310 }, { 52,-11310 }, { 53,-11310 }, + { 54,-11310 }, { 55,-11310 }, { 56,-11310 }, { 57,-11310 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-11310 }, { 66,-11310 }, { 67,-11310 }, { 68,-11310 }, + { 69,15781 }, { 70,-11310 }, { 71,-11310 }, { 72,-11310 }, { 73,-11310 }, + + { 74,-11310 }, { 75,-11310 }, { 76,-11310 }, { 77,-11310 }, { 78,-11310 }, + { 79,-11310 }, { 80,-11310 }, { 81,-11310 }, { 82,-11310 }, { 83,-11310 }, + { 84,-11310 }, { 85,-11310 }, { 86,-11310 }, { 87,-11310 }, { 88,-11310 }, + { 89,-11310 }, { 90,-11310 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-11310 }, { 0, 0 }, { 97,-11310 }, { 98,-11310 }, + { 99,-11310 }, { 100,-11310 }, { 101,15781 }, { 102,-11310 }, { 103,-11310 }, + { 104,-11310 }, { 105,-11310 }, { 106,-11310 }, { 107,-11310 }, { 108,-11310 }, + { 109,-11310 }, { 110,-11310 }, { 111,-11310 }, { 112,-11310 }, { 113,-11310 }, + { 114,-11310 }, { 115,-11310 }, { 116,-11310 }, { 117,-11310 }, { 118,-11310 }, + { 119,-11310 }, { 120,-11310 }, { 121,-11310 }, { 122,-11310 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-11310 }, { 128,-11310 }, + { 129,-11310 }, { 130,-11310 }, { 131,-11310 }, { 132,-11310 }, { 133,-11310 }, + { 134,-11310 }, { 135,-11310 }, { 136,-11310 }, { 137,-11310 }, { 138,-11310 }, + { 139,-11310 }, { 140,-11310 }, { 141,-11310 }, { 142,-11310 }, { 143,-11310 }, + { 144,-11310 }, { 145,-11310 }, { 146,-11310 }, { 147,-11310 }, { 148,-11310 }, + { 149,-11310 }, { 150,-11310 }, { 151,-11310 }, { 152,-11310 }, { 153,-11310 }, + { 154,-11310 }, { 155,-11310 }, { 156,-11310 }, { 157,-11310 }, { 158,-11310 }, + { 159,-11310 }, { 160,-11310 }, { 161,-11310 }, { 162,-11310 }, { 163,-11310 }, + { 164,-11310 }, { 165,-11310 }, { 166,-11310 }, { 167,-11310 }, { 168,-11310 }, + { 169,-11310 }, { 170,-11310 }, { 171,-11310 }, { 172,-11310 }, { 173,-11310 }, + + { 174,-11310 }, { 175,-11310 }, { 176,-11310 }, { 177,-11310 }, { 178,-11310 }, + { 179,-11310 }, { 180,-11310 }, { 181,-11310 }, { 182,-11310 }, { 183,-11310 }, + { 184,-11310 }, { 185,-11310 }, { 186,-11310 }, { 187,-11310 }, { 188,-11310 }, + { 189,-11310 }, { 190,-11310 }, { 191,-11310 }, { 192,-11310 }, { 193,-11310 }, + { 194,-11310 }, { 195,-11310 }, { 196,-11310 }, { 197,-11310 }, { 198,-11310 }, + { 199,-11310 }, { 200,-11310 }, { 201,-11310 }, { 202,-11310 }, { 203,-11310 }, + { 204,-11310 }, { 205,-11310 }, { 206,-11310 }, { 207,-11310 }, { 208,-11310 }, + { 209,-11310 }, { 210,-11310 }, { 211,-11310 }, { 212,-11310 }, { 213,-11310 }, + { 214,-11310 }, { 215,-11310 }, { 216,-11310 }, { 217,-11310 }, { 218,-11310 }, + { 219,-11310 }, { 220,-11310 }, { 221,-11310 }, { 222,-11310 }, { 223,-11310 }, + + { 224,-11310 }, { 225,-11310 }, { 226,-11310 }, { 227,-11310 }, { 228,-11310 }, + { 229,-11310 }, { 230,-11310 }, { 231,-11310 }, { 232,-11310 }, { 233,-11310 }, + { 234,-11310 }, { 235,-11310 }, { 236,-11310 }, { 237,-11310 }, { 238,-11310 }, + { 239,-11310 }, { 240,-11310 }, { 241,-11310 }, { 242,-11310 }, { 243,-11310 }, + { 244,-11310 }, { 245,-11310 }, { 246,-11310 }, { 247,-11310 }, { 248,-11310 }, + { 249,-11310 }, { 250,-11310 }, { 251,-11310 }, { 252,-11310 }, { 253,-11310 }, + { 254,-11310 }, { 255,-11310 }, { 0, 131 }, { 0,80556 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-11567 }, { 49,-11567 }, { 50,-11567 }, { 51,-11567 }, + { 52,-11567 }, { 53,-11567 }, { 54,-11567 }, { 55,-11567 }, { 56,-11567 }, + { 57,-11567 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-11567 }, { 66,-11567 }, + + { 67,15781 }, { 68,16038 }, { 69,-11567 }, { 70,16295 }, { 71,-11567 }, + { 72,16552 }, { 73,-11567 }, { 74,-11567 }, { 75,-11567 }, { 76,16809 }, + { 77,17066 }, { 78,17323 }, { 79,-11567 }, { 80,-11567 }, { 81,-11567 }, + { 82,-11567 }, { 83,-11567 }, { 84,17580 }, { 85,-11567 }, { 86,-11567 }, + { 87,-11567 }, { 88,-11567 }, { 89,-11567 }, { 90,-11567 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-11567 }, { 0, 0 }, + { 97,-11567 }, { 98,-11567 }, { 99,15781 }, { 100,16038 }, { 101,-11567 }, + { 102,16295 }, { 103,-11567 }, { 104,16552 }, { 105,-11567 }, { 106,-11567 }, + { 107,-11567 }, { 108,16809 }, { 109,17066 }, { 110,17323 }, { 111,-11567 }, + { 112,-11567 }, { 113,-11567 }, { 114,-11567 }, { 115,-11567 }, { 116,17580 }, + + { 117,-11567 }, { 118,-11567 }, { 119,-11567 }, { 120,-11567 }, { 121,-11567 }, + { 122,-11567 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-11567 }, { 128,-11567 }, { 129,-11567 }, { 130,-11567 }, { 131,-11567 }, + { 132,-11567 }, { 133,-11567 }, { 134,-11567 }, { 135,-11567 }, { 136,-11567 }, + { 137,-11567 }, { 138,-11567 }, { 139,-11567 }, { 140,-11567 }, { 141,-11567 }, + { 142,-11567 }, { 143,-11567 }, { 144,-11567 }, { 145,-11567 }, { 146,-11567 }, + { 147,-11567 }, { 148,-11567 }, { 149,-11567 }, { 150,-11567 }, { 151,-11567 }, + { 152,-11567 }, { 153,-11567 }, { 154,-11567 }, { 155,-11567 }, { 156,-11567 }, + { 157,-11567 }, { 158,-11567 }, { 159,-11567 }, { 160,-11567 }, { 161,-11567 }, + { 162,-11567 }, { 163,-11567 }, { 164,-11567 }, { 165,-11567 }, { 166,-11567 }, + + { 167,-11567 }, { 168,-11567 }, { 169,-11567 }, { 170,-11567 }, { 171,-11567 }, + { 172,-11567 }, { 173,-11567 }, { 174,-11567 }, { 175,-11567 }, { 176,-11567 }, + { 177,-11567 }, { 178,-11567 }, { 179,-11567 }, { 180,-11567 }, { 181,-11567 }, + { 182,-11567 }, { 183,-11567 }, { 184,-11567 }, { 185,-11567 }, { 186,-11567 }, + { 187,-11567 }, { 188,-11567 }, { 189,-11567 }, { 190,-11567 }, { 191,-11567 }, + { 192,-11567 }, { 193,-11567 }, { 194,-11567 }, { 195,-11567 }, { 196,-11567 }, + { 197,-11567 }, { 198,-11567 }, { 199,-11567 }, { 200,-11567 }, { 201,-11567 }, + { 202,-11567 }, { 203,-11567 }, { 204,-11567 }, { 205,-11567 }, { 206,-11567 }, + { 207,-11567 }, { 208,-11567 }, { 209,-11567 }, { 210,-11567 }, { 211,-11567 }, + { 212,-11567 }, { 213,-11567 }, { 214,-11567 }, { 215,-11567 }, { 216,-11567 }, + + { 217,-11567 }, { 218,-11567 }, { 219,-11567 }, { 220,-11567 }, { 221,-11567 }, + { 222,-11567 }, { 223,-11567 }, { 224,-11567 }, { 225,-11567 }, { 226,-11567 }, + { 227,-11567 }, { 228,-11567 }, { 229,-11567 }, { 230,-11567 }, { 231,-11567 }, + { 232,-11567 }, { 233,-11567 }, { 234,-11567 }, { 235,-11567 }, { 236,-11567 }, + { 237,-11567 }, { 238,-11567 }, { 239,-11567 }, { 240,-11567 }, { 241,-11567 }, + { 242,-11567 }, { 243,-11567 }, { 244,-11567 }, { 245,-11567 }, { 246,-11567 }, + { 247,-11567 }, { 248,-11567 }, { 249,-11567 }, { 250,-11567 }, { 251,-11567 }, + { 252,-11567 }, { 253,-11567 }, { 254,-11567 }, { 255,-11567 }, { 0, 0 }, + { 0,80299 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 }, + { 5, 0 }, { 6, 0 }, { 7, 0 }, { 8, 0 }, { 9, 0 }, + + { 10, 0 }, { 11, 0 }, { 12, 0 }, { 13, 0 }, { 14, 0 }, + { 15, 0 }, { 16, 0 }, { 17, 0 }, { 18, 0 }, { 19, 0 }, + { 20, 0 }, { 21, 0 }, { 22, 0 }, { 23, 0 }, { 24, 0 }, + { 25, 0 }, { 26, 0 }, { 27, 0 }, { 28, 0 }, { 29, 0 }, + { 30, 0 }, { 31, 0 }, { 32, 0 }, { 33, 0 }, { 34, 0 }, + { 35, 0 }, { 36, 0 }, { 37, 0 }, { 38, 0 }, { 39, 0 }, + { 40, 0 }, { 41, 0 }, { 42, 0 }, { 43, 0 }, { 44, 0 }, + { 45, 0 }, { 46, 0 }, { 47, 0 }, { 48, 0 }, { 49, 0 }, + { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 }, + { 55, 0 }, { 56, 0 }, { 57, 0 }, { 58, 0 }, { 59, 0 }, + + { 60, 0 }, { 61, 0 }, { 62, 0 }, { 63, 0 }, { 64, 0 }, + { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 }, { 69, 0 }, + { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 }, { 74, 0 }, + { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 }, { 79, 0 }, + { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 }, { 84, 0 }, + { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 }, { 89, 0 }, + { 90, 0 }, { 91, 0 }, { 92, 0 }, { 93, 0 }, { 94, 0 }, + { 95, 0 }, { 96,-11816 }, { 97, 0 }, { 98, 0 }, { 99, 0 }, + { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 }, + { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 }, + + { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 }, + { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 }, + { 120, 0 }, { 121, 0 }, { 122, 0 }, { 123, 0 }, { 124, 0 }, + { 125, 0 }, { 126, 0 }, { 127, 0 }, { 128, 0 }, { 129, 0 }, + { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 }, { 134, 0 }, + { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 }, { 139, 0 }, + { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 }, { 144, 0 }, + { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 }, { 149, 0 }, + { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 }, { 154, 0 }, + { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 }, { 159, 0 }, + + { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 }, { 164, 0 }, + { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 }, { 169, 0 }, + { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 }, { 174, 0 }, + { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 }, { 179, 0 }, + { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 }, { 184, 0 }, + { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 }, { 189, 0 }, + { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 }, { 194, 0 }, + { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 }, { 199, 0 }, + { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 }, { 204, 0 }, + { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 }, { 209, 0 }, + + { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 }, { 214, 0 }, + { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 }, { 219, 0 }, + { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 }, { 224, 0 }, + { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 }, { 229, 0 }, + { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 }, { 234, 0 }, + { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 }, { 239, 0 }, + { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 }, { 244, 0 }, + { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 }, { 249, 0 }, + { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 }, { 254, 0 }, + { 255, 0 }, { 256, 0 }, { 0, 15 }, { 0,80041 }, { 1, 0 }, + + { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 }, { 6, 0 }, + { 7, 0 }, { 8, 0 }, { 9, 0 }, { 0, 0 }, { 11, 0 }, + { 12, 0 }, { 0, 0 }, { 14, 0 }, { 15, 0 }, { 16, 0 }, + { 17, 0 }, { 18, 0 }, { 19, 0 }, { 20, 0 }, { 21, 0 }, + { 22, 0 }, { 23, 0 }, { 24, 0 }, { 25, 0 }, { 26, 0 }, + { 27, 0 }, { 28, 0 }, { 29, 0 }, { 30, 0 }, { 31, 0 }, + { 32, 0 }, { 33, 0 }, { 34, 0 }, { 35, 0 }, { 36, 0 }, + { 37, 0 }, { 38, 0 }, { 39, 0 }, { 40, 0 }, { 41, 0 }, + { 0, 0 }, { 43, 0 }, { 44, 0 }, { 45, 0 }, { 46, 0 }, + { 47, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 }, + + { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 }, + { 57, 0 }, { 58, 0 }, { 59, 0 }, { 60, 0 }, { 61, 0 }, + { 62, 0 }, { 63, 0 }, { 64, 0 }, { 65, 0 }, { 66, 0 }, + { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 }, { 71, 0 }, + { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 }, { 76, 0 }, + { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 }, { 81, 0 }, + { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 }, { 86, 0 }, + { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 }, { 91, 0 }, + { 92, 0 }, { 93, 0 }, { 94, 0 }, { 95, 0 }, { 96, 0 }, + { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 }, + + { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 }, + { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 }, + { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 }, + { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 }, + { 122, 0 }, { 123, 0 }, { 124, 0 }, { 125, 0 }, { 126, 0 }, + { 127, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 }, { 131, 0 }, + { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 }, { 136, 0 }, + { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 }, { 141, 0 }, + { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 }, { 146, 0 }, + { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 }, { 151, 0 }, + + { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 }, { 156, 0 }, + { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 }, { 161, 0 }, + { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 }, { 166, 0 }, + { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 }, { 171, 0 }, + { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 }, { 176, 0 }, + { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 }, { 181, 0 }, + { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 }, { 186, 0 }, + { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 }, { 191, 0 }, + { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 }, { 196, 0 }, + { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 }, { 201, 0 }, + + { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 }, { 206, 0 }, + { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 }, { 211, 0 }, + { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 }, { 216, 0 }, + { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 }, { 221, 0 }, + { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 }, { 226, 0 }, + { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 }, { 231, 0 }, + { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 }, { 236, 0 }, + { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 }, { 241, 0 }, + { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 }, { 246, 0 }, + { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 }, { 251, 0 }, + + { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 }, { 256, 0 }, + { 0, 11 }, { 0,79783 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, + { 4, 0 }, { 5, 0 }, { 6, 0 }, { 7, 0 }, { 8, 0 }, + { 9, 0 }, { 0, 0 }, { 11, 0 }, { 12, 0 }, { 0, 0 }, + { 14, 0 }, { 15, 0 }, { 16, 0 }, { 17, 0 }, { 18, 0 }, + { 19, 0 }, { 20, 0 }, { 21, 0 }, { 22, 0 }, { 23, 0 }, + { 24, 0 }, { 25, 0 }, { 26, 0 }, { 27, 0 }, { 28, 0 }, + { 29, 0 }, { 30, 0 }, { 31, 0 }, { 32, 0 }, { 33, 0 }, + { 34, 0 }, { 35, 0 }, { 36, 0 }, { 37, 0 }, { 38, 0 }, + { 39, 0 }, { 40, 0 }, { 41, 0 }, { 42, 0 }, { 43, 0 }, + + { 44, 0 }, { 45, 0 }, { 46, 0 }, { 47, 0 }, { 48, 0 }, + { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 }, + { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 }, { 58, 0 }, + { 59, 0 }, { 60, 0 }, { 61, 0 }, { 62, 0 }, { 0, 0 }, + { 64, 0 }, { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 }, + { 69, 0 }, { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 }, + { 74, 0 }, { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 }, + { 79, 0 }, { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 }, + { 84, 0 }, { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 }, + { 89, 0 }, { 90, 0 }, { 91, 0 }, { 92, 0 }, { 93, 0 }, + + { 94, 0 }, { 95, 0 }, { 96, 0 }, { 97, 0 }, { 98, 0 }, + { 99, 0 }, { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 }, + { 104, 0 }, { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 }, + { 109, 0 }, { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 }, + { 114, 0 }, { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 }, + { 119, 0 }, { 120, 0 }, { 121, 0 }, { 122, 0 }, { 123, 0 }, + { 124, 0 }, { 125, 0 }, { 126, 0 }, { 127, 0 }, { 128, 0 }, + { 129, 0 }, { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 }, + { 134, 0 }, { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 }, + { 139, 0 }, { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 }, + + { 144, 0 }, { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 }, + { 149, 0 }, { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 }, + { 154, 0 }, { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 }, + { 159, 0 }, { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 }, + { 164, 0 }, { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 }, + { 169, 0 }, { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 }, + { 174, 0 }, { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 }, + { 179, 0 }, { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 }, + { 184, 0 }, { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 }, + { 189, 0 }, { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 }, + + { 194, 0 }, { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 }, + { 199, 0 }, { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 }, + { 204, 0 }, { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 }, + { 209, 0 }, { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 }, + { 214, 0 }, { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 }, + { 219, 0 }, { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 }, + { 224, 0 }, { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 }, + { 229, 0 }, { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 }, + { 234, 0 }, { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 }, + { 239, 0 }, { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 }, + + { 244, 0 }, { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 }, + { 249, 0 }, { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 }, + { 254, 0 }, { 255, 0 }, { 256, 0 }, { 0, 0 }, { 0,79525 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 34,-10020 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,16806 }, { 49,16806 }, { 50,16806 }, + { 51,16806 }, { 52,16806 }, { 53,16806 }, { 54,16806 }, { 55,16806 }, + { 56,16806 }, { 57,16806 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,16806 }, + { 66,16806 }, { 67,16806 }, { 68,16806 }, { 69,16806 }, { 70,16806 }, + { 71,16806 }, { 72,16806 }, { 73,16806 }, { 74,16806 }, { 75,16806 }, + { 76,16806 }, { 77,16806 }, { 78,16806 }, { 79,16806 }, { 80,16806 }, + { 81,16806 }, { 82,16806 }, { 83,16806 }, { 84,16806 }, { 85,16806 }, + + { 86,16806 }, { 87,16806 }, { 88,16806 }, { 89,16806 }, { 90,16806 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,16806 }, + { 0, 0 }, { 97,16806 }, { 98,16806 }, { 99,16806 }, { 100,16806 }, + { 101,16806 }, { 102,16806 }, { 103,16806 }, { 104,16806 }, { 105,16806 }, + { 106,16806 }, { 107,16806 }, { 108,16806 }, { 109,16806 }, { 110,16806 }, + { 111,16806 }, { 112,16806 }, { 113,16806 }, { 114,16806 }, { 115,16806 }, + { 116,16806 }, { 117,16806 }, { 118,16806 }, { 119,16806 }, { 120,16806 }, + { 121,16806 }, { 122,16806 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,16806 }, { 128,16806 }, { 129,16806 }, { 130,16806 }, + { 131,16806 }, { 132,16806 }, { 133,16806 }, { 134,16806 }, { 135,16806 }, + + { 136,16806 }, { 137,16806 }, { 138,16806 }, { 139,16806 }, { 140,16806 }, + { 141,16806 }, { 142,16806 }, { 143,16806 }, { 144,16806 }, { 145,16806 }, + { 146,16806 }, { 147,16806 }, { 148,16806 }, { 149,16806 }, { 150,16806 }, + { 151,16806 }, { 152,16806 }, { 153,16806 }, { 154,16806 }, { 155,16806 }, + { 156,16806 }, { 157,16806 }, { 158,16806 }, { 159,16806 }, { 160,16806 }, + { 161,16806 }, { 162,16806 }, { 163,16806 }, { 164,16806 }, { 165,16806 }, + { 166,16806 }, { 167,16806 }, { 168,16806 }, { 169,16806 }, { 170,16806 }, + { 171,16806 }, { 172,16806 }, { 173,16806 }, { 174,16806 }, { 175,16806 }, + { 176,16806 }, { 177,16806 }, { 178,16806 }, { 179,16806 }, { 180,16806 }, + { 181,16806 }, { 182,16806 }, { 183,16806 }, { 184,16806 }, { 185,16806 }, + + { 186,16806 }, { 187,16806 }, { 188,16806 }, { 189,16806 }, { 190,16806 }, + { 191,16806 }, { 192,16806 }, { 193,16806 }, { 194,16806 }, { 195,16806 }, + { 196,16806 }, { 197,16806 }, { 198,16806 }, { 199,16806 }, { 200,16806 }, + { 201,16806 }, { 202,16806 }, { 203,16806 }, { 204,16806 }, { 205,16806 }, + { 206,16806 }, { 207,16806 }, { 208,16806 }, { 209,16806 }, { 210,16806 }, + { 211,16806 }, { 212,16806 }, { 213,16806 }, { 214,16806 }, { 215,16806 }, + { 216,16806 }, { 217,16806 }, { 218,16806 }, { 219,16806 }, { 220,16806 }, + { 221,16806 }, { 222,16806 }, { 223,16806 }, { 224,16806 }, { 225,16806 }, + { 226,16806 }, { 227,16806 }, { 228,16806 }, { 229,16806 }, { 230,16806 }, + { 231,16806 }, { 232,16806 }, { 233,16806 }, { 234,16806 }, { 235,16806 }, + + { 236,16806 }, { 237,16806 }, { 238,16806 }, { 239,16806 }, { 240,16806 }, + { 241,16806 }, { 242,16806 }, { 243,16806 }, { 244,16806 }, { 245,16806 }, + { 246,16806 }, { 247,16806 }, { 248,16806 }, { 249,16806 }, { 250,16806 }, + { 251,16806 }, { 252,16806 }, { 253,16806 }, { 254,16806 }, { 255,16806 }, + { 0, 0 }, { 0,79268 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 39,-10277 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,16806 }, + { 49,16806 }, { 50,16806 }, { 51,16806 }, { 52,16806 }, { 53,16806 }, + { 54,16806 }, { 55,16806 }, { 56,16806 }, { 57,16806 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,16806 }, { 66,16806 }, { 67,16806 }, { 68,16806 }, + { 69,16806 }, { 70,16806 }, { 71,16806 }, { 72,16806 }, { 73,16806 }, + { 74,16806 }, { 75,16806 }, { 76,16806 }, { 77,16806 }, { 78,16806 }, + + { 79,16806 }, { 80,16806 }, { 81,16806 }, { 82,16806 }, { 83,16806 }, + { 84,16806 }, { 85,16806 }, { 86,16806 }, { 87,16806 }, { 88,16806 }, + { 89,16806 }, { 90,16806 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,16806 }, { 0, 0 }, { 97,16806 }, { 98,16806 }, + { 99,16806 }, { 100,16806 }, { 101,16806 }, { 102,16806 }, { 103,16806 }, + { 104,16806 }, { 105,16806 }, { 106,16806 }, { 107,16806 }, { 108,16806 }, + { 109,16806 }, { 110,16806 }, { 111,16806 }, { 112,16806 }, { 113,16806 }, + { 114,16806 }, { 115,16806 }, { 116,16806 }, { 117,16806 }, { 118,16806 }, + { 119,16806 }, { 120,16806 }, { 121,16806 }, { 122,16806 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,16806 }, { 128,16806 }, + + { 129,16806 }, { 130,16806 }, { 131,16806 }, { 132,16806 }, { 133,16806 }, + { 134,16806 }, { 135,16806 }, { 136,16806 }, { 137,16806 }, { 138,16806 }, + { 139,16806 }, { 140,16806 }, { 141,16806 }, { 142,16806 }, { 143,16806 }, + { 144,16806 }, { 145,16806 }, { 146,16806 }, { 147,16806 }, { 148,16806 }, + { 149,16806 }, { 150,16806 }, { 151,16806 }, { 152,16806 }, { 153,16806 }, + { 154,16806 }, { 155,16806 }, { 156,16806 }, { 157,16806 }, { 158,16806 }, + { 159,16806 }, { 160,16806 }, { 161,16806 }, { 162,16806 }, { 163,16806 }, + { 164,16806 }, { 165,16806 }, { 166,16806 }, { 167,16806 }, { 168,16806 }, + { 169,16806 }, { 170,16806 }, { 171,16806 }, { 172,16806 }, { 173,16806 }, + { 174,16806 }, { 175,16806 }, { 176,16806 }, { 177,16806 }, { 178,16806 }, + + { 179,16806 }, { 180,16806 }, { 181,16806 }, { 182,16806 }, { 183,16806 }, + { 184,16806 }, { 185,16806 }, { 186,16806 }, { 187,16806 }, { 188,16806 }, + { 189,16806 }, { 190,16806 }, { 191,16806 }, { 192,16806 }, { 193,16806 }, + { 194,16806 }, { 195,16806 }, { 196,16806 }, { 197,16806 }, { 198,16806 }, + { 199,16806 }, { 200,16806 }, { 201,16806 }, { 202,16806 }, { 203,16806 }, + { 204,16806 }, { 205,16806 }, { 206,16806 }, { 207,16806 }, { 208,16806 }, + { 209,16806 }, { 210,16806 }, { 211,16806 }, { 212,16806 }, { 213,16806 }, + { 214,16806 }, { 215,16806 }, { 216,16806 }, { 217,16806 }, { 218,16806 }, + { 219,16806 }, { 220,16806 }, { 221,16806 }, { 222,16806 }, { 223,16806 }, + { 224,16806 }, { 225,16806 }, { 226,16806 }, { 227,16806 }, { 228,16806 }, + + { 229,16806 }, { 230,16806 }, { 231,16806 }, { 232,16806 }, { 233,16806 }, + { 234,16806 }, { 235,16806 }, { 236,16806 }, { 237,16806 }, { 238,16806 }, + { 239,16806 }, { 240,16806 }, { 241,16806 }, { 242,16806 }, { 243,16806 }, + { 244,16806 }, { 245,16806 }, { 246,16806 }, { 247,16806 }, { 248,16806 }, + { 249,16806 }, { 250,16806 }, { 251,16806 }, { 252,16806 }, { 253,16806 }, + { 254,16806 }, { 255,16806 }, { 0, 137 }, { 0,79011 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 }, + { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 }, + { 57, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65, 0 }, { 66, 0 }, + { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 }, { 71, 0 }, + + { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 }, { 76, 0 }, + { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 }, { 81, 0 }, + { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 }, { 86, 0 }, + { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95, 0 }, { 0, 0 }, + { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 }, + { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 }, + { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 }, + { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 }, + { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 }, + + { 122, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 }, { 131, 0 }, + { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 }, { 136, 0 }, + { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 }, { 141, 0 }, + { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 }, { 146, 0 }, + { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 }, { 151, 0 }, + { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 }, { 156, 0 }, + { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 }, { 161, 0 }, + { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 }, { 166, 0 }, + { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 }, { 171, 0 }, + + { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 }, { 176, 0 }, + { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 }, { 181, 0 }, + { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 }, { 186, 0 }, + { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 }, { 191, 0 }, + { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 }, { 196, 0 }, + { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 }, { 201, 0 }, + { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 }, { 206, 0 }, + { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 }, { 211, 0 }, + { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 }, { 216, 0 }, + { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 }, { 221, 0 }, + + { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 }, { 226, 0 }, + { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 }, { 231, 0 }, + { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 }, { 236, 0 }, + { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 }, { 241, 0 }, + { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 }, { 246, 0 }, + { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 }, { 251, 0 }, + { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 }, { 0, 140 }, + { 0,78754 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 }, + { 5, 0 }, { 6, 0 }, { 7, 0 }, { 8, 0 }, { 9, 0 }, + { 0, 0 }, { 11, 0 }, { 12, 0 }, { 0, 0 }, { 14, 0 }, + + { 15, 0 }, { 16, 0 }, { 17, 0 }, { 18, 0 }, { 19, 0 }, + { 20, 0 }, { 21, 0 }, { 22, 0 }, { 23, 0 }, { 24, 0 }, + { 25, 0 }, { 26, 0 }, { 27, 0 }, { 28, 0 }, { 29, 0 }, + { 30, 0 }, { 31, 0 }, { 32, 0 }, { 33, 0 }, { 34, 0 }, + { 35, 0 }, { 36, 0 }, { 37, 0 }, { 38, 0 }, { 39, 0 }, + { 40, 0 }, { 41, 0 }, { 42, 0 }, { 43, 0 }, { 44, 0 }, + { 45, 0 }, { 46, 0 }, { 47, 0 }, { 48, 0 }, { 49, 0 }, + { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 }, + { 55, 0 }, { 56, 0 }, { 57, 0 }, { 58, 0 }, { 59, 0 }, + { 60, 0 }, { 61, 0 }, { 62, 0 }, { 63, 0 }, { 64, 0 }, + + { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 }, { 69, 0 }, + { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 }, { 74, 0 }, + { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 }, { 79, 0 }, + { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 }, { 84, 0 }, + { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 }, { 89, 0 }, + { 90, 0 }, { 91, 0 }, { 92, 0 }, { 93, 0 }, { 94, 0 }, + { 95, 0 }, { 96, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 }, + { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 }, + { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 }, + { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 }, + + { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 }, + { 120, 0 }, { 121, 0 }, { 122, 0 }, { 123, 0 }, { 124, 0 }, + { 125, 0 }, { 126, 0 }, { 127, 0 }, { 128, 0 }, { 129, 0 }, + { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 }, { 134, 0 }, + { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 }, { 139, 0 }, + { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 }, { 144, 0 }, + { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 }, { 149, 0 }, + { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 }, { 154, 0 }, + { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 }, { 159, 0 }, + { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 }, { 164, 0 }, + + { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 }, { 169, 0 }, + { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 }, { 174, 0 }, + { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 }, { 179, 0 }, + { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 }, { 184, 0 }, + { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 }, { 189, 0 }, + { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 }, { 194, 0 }, + { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 }, { 199, 0 }, + { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 }, { 204, 0 }, + { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 }, { 209, 0 }, + { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 }, { 214, 0 }, + + { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 }, { 219, 0 }, + { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 }, { 224, 0 }, + { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 }, { 229, 0 }, + { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 }, { 234, 0 }, + { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 }, { 239, 0 }, + { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 }, { 244, 0 }, + { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 }, { 249, 0 }, + { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 }, { 254, 0 }, + { 255, 0 }, { 256, 0 }, { 0, 140 }, { 0,78496 }, { 1,-258 }, + { 2,-258 }, { 3,-258 }, { 4,-258 }, { 5,-258 }, { 6,-258 }, + + { 7,-258 }, { 8,-258 }, { 9,-258 }, { 10,-13593 }, { 11,-258 }, + { 12,-258 }, { 13,-13591 }, { 14,-258 }, { 15,-258 }, { 16,-258 }, + { 17,-258 }, { 18,-258 }, { 19,-258 }, { 20,-258 }, { 21,-258 }, + { 22,-258 }, { 23,-258 }, { 24,-258 }, { 25,-258 }, { 26,-258 }, + { 27,-258 }, { 28,-258 }, { 29,-258 }, { 30,-258 }, { 31,-258 }, + { 32,-258 }, { 33,-258 }, { 34,-258 }, { 35,-258 }, { 36,-258 }, + { 37,-258 }, { 38,-258 }, { 39,-258 }, { 40,-258 }, { 41,-258 }, + { 42,-258 }, { 43,-258 }, { 44,-258 }, { 45,-258 }, { 46,-258 }, + { 47,-258 }, { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 }, + { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 }, + + { 57, 0 }, { 58,-258 }, { 59, 258 }, { 60,-258 }, { 61,-258 }, + { 62,-258 }, { 63,-258 }, { 64,-258 }, { 65, 0 }, { 66, 0 }, + { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 }, { 71, 0 }, + { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 }, { 76, 0 }, + { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 }, { 81, 0 }, + { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 }, { 86, 0 }, + { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 }, { 91,-258 }, + { 92,-258 }, { 93,-258 }, { 94,-258 }, { 95, 0 }, { 96,-258 }, + { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 }, + { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 }, + + { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 }, + { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 }, + { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 }, + { 122, 0 }, { 123,-258 }, { 124,-258 }, { 125,-258 }, { 126,-258 }, + { 127, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 }, { 131, 0 }, + { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 }, { 136, 0 }, + { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 }, { 141, 0 }, + { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 }, { 146, 0 }, + { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 }, { 151, 0 }, + { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 }, { 156, 0 }, + + { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 }, { 161, 0 }, + { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 }, { 166, 0 }, + { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 }, { 171, 0 }, + { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 }, { 176, 0 }, + { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 }, { 181, 0 }, + { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 }, { 186, 0 }, + { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 }, { 191, 0 }, + { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 }, { 196, 0 }, + { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 }, { 201, 0 }, + { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 }, { 206, 0 }, + + { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 }, { 211, 0 }, + { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 }, { 216, 0 }, + { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 }, { 221, 0 }, + { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 }, { 226, 0 }, + { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 }, { 231, 0 }, + { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 }, { 236, 0 }, + { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 }, { 241, 0 }, + { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 }, { 246, 0 }, + { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 }, { 251, 0 }, + { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 }, { 256,-258 }, + + { 0, 140 }, { 0,78238 }, { 1,-516 }, { 2,-516 }, { 3,-516 }, + { 4,-516 }, { 5,-516 }, { 6,-516 }, { 7,-516 }, { 8,-516 }, + { 9,-516 }, { 10,-13851 }, { 11,-516 }, { 12,-516 }, { 13,-13849 }, + { 14,-516 }, { 15,-516 }, { 16,-516 }, { 17,-516 }, { 18,-516 }, + { 19,-516 }, { 20,-516 }, { 21,-516 }, { 22,-516 }, { 23,-516 }, + { 24,-516 }, { 25,-516 }, { 26,-516 }, { 27,-516 }, { 28,-516 }, + { 29,-516 }, { 30,-516 }, { 31,-516 }, { 32,-516 }, { 33,-516 }, + { 34,-516 }, { 35,-516 }, { 36,-516 }, { 37,-516 }, { 38,-516 }, + { 39,-516 }, { 40,-516 }, { 41,-516 }, { 42,-516 }, { 43,-516 }, + { 44,-516 }, { 45,-516 }, { 46,-516 }, { 47,-516 }, { 48,-516 }, + + { 49,-516 }, { 50,-516 }, { 51,-516 }, { 52,-516 }, { 53,-516 }, + { 54,-516 }, { 55,-516 }, { 56,-516 }, { 57,-516 }, { 58,-516 }, + { 59,-516 }, { 60,-516 }, { 61,-516 }, { 62,-516 }, { 63,-516 }, + { 64,-516 }, { 65,-516 }, { 66,-516 }, { 67,-516 }, { 68,-516 }, + { 69,-516 }, { 70,-516 }, { 71,-516 }, { 72,-516 }, { 73,-516 }, + { 74,-516 }, { 75,-516 }, { 76,-516 }, { 77,-516 }, { 78,-516 }, + { 79,-516 }, { 80,-516 }, { 81,-516 }, { 82,-516 }, { 83,-516 }, + { 84,-516 }, { 85,-516 }, { 86,-516 }, { 87,-516 }, { 88,-516 }, + { 89,-516 }, { 90,-516 }, { 91,-516 }, { 92,-516 }, { 93,-516 }, + { 94,-516 }, { 95,-516 }, { 96,-516 }, { 97,-516 }, { 98,-516 }, + + { 99,-516 }, { 100,-516 }, { 101,-516 }, { 102,-516 }, { 103,-516 }, + { 104,-516 }, { 105,-516 }, { 106,-516 }, { 107,-516 }, { 108,-516 }, + { 109,-516 }, { 110,-516 }, { 111,-516 }, { 112,-516 }, { 113,-516 }, + { 114,-516 }, { 115,-516 }, { 116,-516 }, { 117,-516 }, { 118,-516 }, + { 119,-516 }, { 120,-516 }, { 121,-516 }, { 122,-516 }, { 123,-516 }, + { 124,-516 }, { 125,-516 }, { 126,-516 }, { 127,-516 }, { 128,-516 }, + { 129,-516 }, { 130,-516 }, { 131,-516 }, { 132,-516 }, { 133,-516 }, + { 134,-516 }, { 135,-516 }, { 136,-516 }, { 137,-516 }, { 138,-516 }, + { 139,-516 }, { 140,-516 }, { 141,-516 }, { 142,-516 }, { 143,-516 }, + { 144,-516 }, { 145,-516 }, { 146,-516 }, { 147,-516 }, { 148,-516 }, + + { 149,-516 }, { 150,-516 }, { 151,-516 }, { 152,-516 }, { 153,-516 }, + { 154,-516 }, { 155,-516 }, { 156,-516 }, { 157,-516 }, { 158,-516 }, + { 159,-516 }, { 160,-516 }, { 161,-516 }, { 162,-516 }, { 163,-516 }, + { 164,-516 }, { 165,-516 }, { 166,-516 }, { 167,-516 }, { 168,-516 }, + { 169,-516 }, { 170,-516 }, { 171,-516 }, { 172,-516 }, { 173,-516 }, + { 174,-516 }, { 175,-516 }, { 176,-516 }, { 177,-516 }, { 178,-516 }, + { 179,-516 }, { 180,-516 }, { 181,-516 }, { 182,-516 }, { 183,-516 }, + { 184,-516 }, { 185,-516 }, { 186,-516 }, { 187,-516 }, { 188,-516 }, + { 189,-516 }, { 190,-516 }, { 191,-516 }, { 192,-516 }, { 193,-516 }, + { 194,-516 }, { 195,-516 }, { 196,-516 }, { 197,-516 }, { 198,-516 }, + + { 199,-516 }, { 200,-516 }, { 201,-516 }, { 202,-516 }, { 203,-516 }, + { 204,-516 }, { 205,-516 }, { 206,-516 }, { 207,-516 }, { 208,-516 }, + { 209,-516 }, { 210,-516 }, { 211,-516 }, { 212,-516 }, { 213,-516 }, + { 214,-516 }, { 215,-516 }, { 216,-516 }, { 217,-516 }, { 218,-516 }, + { 219,-516 }, { 220,-516 }, { 221,-516 }, { 222,-516 }, { 223,-516 }, + { 224,-516 }, { 225,-516 }, { 226,-516 }, { 227,-516 }, { 228,-516 }, + { 229,-516 }, { 230,-516 }, { 231,-516 }, { 232,-516 }, { 233,-516 }, + { 234,-516 }, { 235,-516 }, { 236,-516 }, { 237,-516 }, { 238,-516 }, + { 239,-516 }, { 240,-516 }, { 241,-516 }, { 242,-516 }, { 243,-516 }, + { 244,-516 }, { 245,-516 }, { 246,-516 }, { 247,-516 }, { 248,-516 }, + + { 249,-516 }, { 250,-516 }, { 251,-516 }, { 252,-516 }, { 253,-516 }, + { 254,-516 }, { 255,-516 }, { 256,-516 }, { 0, 0 }, { 0,77980 }, + { 1,-15683 }, { 2,-15683 }, { 3,-15683 }, { 4,-15683 }, { 5,-15683 }, + { 6,-15683 }, { 7,-15683 }, { 8,-15683 }, { 9,-15683 }, { 10,-15683 }, + { 11,-15683 }, { 12,-15683 }, { 13,-15683 }, { 14,-15683 }, { 15,-15683 }, + { 16,-15683 }, { 17,-15683 }, { 18,-15683 }, { 19,-15683 }, { 20,-15683 }, + { 21,-15683 }, { 22,-15683 }, { 23,-15683 }, { 24,-15683 }, { 25,-15683 }, + { 26,-15683 }, { 27,-15683 }, { 28,-15683 }, { 29,-15683 }, { 30,-15683 }, + { 31,-15683 }, { 32,-15683 }, { 33,-15683 }, { 34,-15791 }, { 35,-15683 }, + { 36,-15683 }, { 37,-15683 }, { 38,-15683 }, { 39,-15683 }, { 40,-15683 }, + + { 41,-15683 }, { 42,-15683 }, { 43,-15683 }, { 44,-15683 }, { 45,-15683 }, + { 46,-15683 }, { 47,-15683 }, { 48,-15683 }, { 49,-15683 }, { 50,-15683 }, + { 51,-15683 }, { 52,-15683 }, { 53,-15683 }, { 54,-15683 }, { 55,-15683 }, + { 56,-15683 }, { 57,-15683 }, { 58,-15683 }, { 59,-15683 }, { 60,-15683 }, + { 61,-15683 }, { 62,-15683 }, { 63,-15683 }, { 64,-15683 }, { 65,-15683 }, + { 66,-15683 }, { 67,-15683 }, { 68,-15683 }, { 69,-15683 }, { 70,-15683 }, + { 71,-15683 }, { 72,-15683 }, { 73,-15683 }, { 74,-15683 }, { 75,-15683 }, + { 76,-15683 }, { 77,-15683 }, { 78,-15683 }, { 79,-15683 }, { 80,-15683 }, + { 81,-15683 }, { 82,-15683 }, { 83,-15683 }, { 84,-15683 }, { 85,-15683 }, + { 86,-15683 }, { 87,-15683 }, { 88,-15683 }, { 89,-15683 }, { 90,-15683 }, + + { 91,-15683 }, { 92,-15425 }, { 93,-15683 }, { 94,-15683 }, { 95,-15683 }, + { 96,-15683 }, { 97,-15683 }, { 98,-15683 }, { 99,-15683 }, { 100,-15683 }, + { 101,-15683 }, { 102,-15683 }, { 103,-15683 }, { 104,-15683 }, { 105,-15683 }, + { 106,-15683 }, { 107,-15683 }, { 108,-15683 }, { 109,-15683 }, { 110,-15683 }, + { 111,-15683 }, { 112,-15683 }, { 113,-15683 }, { 114,-15683 }, { 115,-15683 }, + { 116,-15683 }, { 117,-15683 }, { 118,-15683 }, { 119,-15683 }, { 120,-15683 }, + { 121,-15683 }, { 122,-15683 }, { 123,-15683 }, { 124,-15683 }, { 125,-15683 }, + { 126,-15683 }, { 127,-15683 }, { 128,-15683 }, { 129,-15683 }, { 130,-15683 }, + { 131,-15683 }, { 132,-15683 }, { 133,-15683 }, { 134,-15683 }, { 135,-15683 }, + { 136,-15683 }, { 137,-15683 }, { 138,-15683 }, { 139,-15683 }, { 140,-15683 }, + + { 141,-15683 }, { 142,-15683 }, { 143,-15683 }, { 144,-15683 }, { 145,-15683 }, + { 146,-15683 }, { 147,-15683 }, { 148,-15683 }, { 149,-15683 }, { 150,-15683 }, + { 151,-15683 }, { 152,-15683 }, { 153,-15683 }, { 154,-15683 }, { 155,-15683 }, + { 156,-15683 }, { 157,-15683 }, { 158,-15683 }, { 159,-15683 }, { 160,-15683 }, + { 161,-15683 }, { 162,-15683 }, { 163,-15683 }, { 164,-15683 }, { 165,-15683 }, + { 166,-15683 }, { 167,-15683 }, { 168,-15683 }, { 169,-15683 }, { 170,-15683 }, + { 171,-15683 }, { 172,-15683 }, { 173,-15683 }, { 174,-15683 }, { 175,-15683 }, + { 176,-15683 }, { 177,-15683 }, { 178,-15683 }, { 179,-15683 }, { 180,-15683 }, + { 181,-15683 }, { 182,-15683 }, { 183,-15683 }, { 184,-15683 }, { 185,-15683 }, + { 186,-15683 }, { 187,-15683 }, { 188,-15683 }, { 189,-15683 }, { 190,-15683 }, + + { 191,-15683 }, { 192,-15683 }, { 193,-15683 }, { 194,-15683 }, { 195,-15683 }, + { 196,-15683 }, { 197,-15683 }, { 198,-15683 }, { 199,-15683 }, { 200,-15683 }, + { 201,-15683 }, { 202,-15683 }, { 203,-15683 }, { 204,-15683 }, { 205,-15683 }, + { 206,-15683 }, { 207,-15683 }, { 208,-15683 }, { 209,-15683 }, { 210,-15683 }, + { 211,-15683 }, { 212,-15683 }, { 213,-15683 }, { 214,-15683 }, { 215,-15683 }, + { 216,-15683 }, { 217,-15683 }, { 218,-15683 }, { 219,-15683 }, { 220,-15683 }, + { 221,-15683 }, { 222,-15683 }, { 223,-15683 }, { 224,-15683 }, { 225,-15683 }, + { 226,-15683 }, { 227,-15683 }, { 228,-15683 }, { 229,-15683 }, { 230,-15683 }, + { 231,-15683 }, { 232,-15683 }, { 233,-15683 }, { 234,-15683 }, { 235,-15683 }, + { 236,-15683 }, { 237,-15683 }, { 238,-15683 }, { 239,-15683 }, { 240,-15683 }, + + { 241,-15683 }, { 242,-15683 }, { 243,-15683 }, { 244,-15683 }, { 245,-15683 }, + { 246,-15683 }, { 247,-15683 }, { 248,-15683 }, { 249,-15683 }, { 250,-15683 }, + { 251,-15683 }, { 252,-15683 }, { 253,-15683 }, { 254,-15683 }, { 255,-15683 }, + { 256,-15683 }, { 0, 132 }, { 0,77722 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 }, + { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65, 0 }, { 66, 0 }, { 67, 0 }, + { 68, 0 }, { 69, 0 }, { 70, 0 }, { 71, 0 }, { 72, 0 }, + { 73, 0 }, { 74, 0 }, { 75, 0 }, { 76, 0 }, { 77, 0 }, + { 78, 0 }, { 79, 0 }, { 80, 0 }, { 81, 0 }, { 82, 0 }, + + { 83, 0 }, { 84, 0 }, { 85, 0 }, { 86, 0 }, { 87, 0 }, + { 88, 0 }, { 89, 0 }, { 90, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95, 0 }, { 0, 0 }, { 97, 0 }, + { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 }, { 102, 0 }, + { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 }, { 107, 0 }, + { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 }, { 112, 0 }, + { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 }, { 117, 0 }, + { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 }, { 122, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127, 0 }, + { 128, 0 }, { 129, 0 }, { 130, 0 }, { 131, 0 }, { 132, 0 }, + + { 133, 0 }, { 134, 0 }, { 135, 0 }, { 136, 0 }, { 137, 0 }, + { 138, 0 }, { 139, 0 }, { 140, 0 }, { 141, 0 }, { 142, 0 }, + { 143, 0 }, { 144, 0 }, { 145, 0 }, { 146, 0 }, { 147, 0 }, + { 148, 0 }, { 149, 0 }, { 150, 0 }, { 151, 0 }, { 152, 0 }, + { 153, 0 }, { 154, 0 }, { 155, 0 }, { 156, 0 }, { 157, 0 }, + { 158, 0 }, { 159, 0 }, { 160, 0 }, { 161, 0 }, { 162, 0 }, + { 163, 0 }, { 164, 0 }, { 165, 0 }, { 166, 0 }, { 167, 0 }, + { 168, 0 }, { 169, 0 }, { 170, 0 }, { 171, 0 }, { 172, 0 }, + { 173, 0 }, { 174, 0 }, { 175, 0 }, { 176, 0 }, { 177, 0 }, + { 178, 0 }, { 179, 0 }, { 180, 0 }, { 181, 0 }, { 182, 0 }, + + { 183, 0 }, { 184, 0 }, { 185, 0 }, { 186, 0 }, { 187, 0 }, + { 188, 0 }, { 189, 0 }, { 190, 0 }, { 191, 0 }, { 192, 0 }, + { 193, 0 }, { 194, 0 }, { 195, 0 }, { 196, 0 }, { 197, 0 }, + { 198, 0 }, { 199, 0 }, { 200, 0 }, { 201, 0 }, { 202, 0 }, + { 203, 0 }, { 204, 0 }, { 205, 0 }, { 206, 0 }, { 207, 0 }, + { 208, 0 }, { 209, 0 }, { 210, 0 }, { 211, 0 }, { 212, 0 }, + { 213, 0 }, { 214, 0 }, { 215, 0 }, { 216, 0 }, { 217, 0 }, + { 218, 0 }, { 219, 0 }, { 220, 0 }, { 221, 0 }, { 222, 0 }, + { 223, 0 }, { 224, 0 }, { 225, 0 }, { 226, 0 }, { 227, 0 }, + { 228, 0 }, { 229, 0 }, { 230, 0 }, { 231, 0 }, { 232, 0 }, + + { 233, 0 }, { 234, 0 }, { 235, 0 }, { 236, 0 }, { 237, 0 }, + { 238, 0 }, { 239, 0 }, { 240, 0 }, { 241, 0 }, { 242, 0 }, + { 243, 0 }, { 244, 0 }, { 245, 0 }, { 246, 0 }, { 247, 0 }, + { 248, 0 }, { 249, 0 }, { 250, 0 }, { 251, 0 }, { 252, 0 }, + { 253, 0 }, { 254, 0 }, { 255, 0 }, { 0, 0 }, { 0,77465 }, + { 1,-15425 }, { 2,-15425 }, { 3,-15425 }, { 4,-15425 }, { 5,-15425 }, + { 6,-15425 }, { 7,-15425 }, { 8,-15425 }, { 9,-15425 }, { 10,-15425 }, + { 11,-15425 }, { 12,-15425 }, { 13,-15425 }, { 14,-15425 }, { 15,-15425 }, + { 16,-15425 }, { 17,-15425 }, { 18,-15425 }, { 19,-15425 }, { 20,-15425 }, + { 21,-15425 }, { 22,-15425 }, { 23,-15425 }, { 24,-15425 }, { 25,-15425 }, + + { 26,-15425 }, { 27,-15425 }, { 28,-15425 }, { 29,-15425 }, { 30,-15425 }, + { 31,-15425 }, { 32,-15425 }, { 33,-15425 }, { 34,-15425 }, { 35,-15425 }, + { 36,-15425 }, { 37,-15425 }, { 38,-15425 }, { 39,-16306 }, { 40,-15425 }, + { 41,-15425 }, { 42,-15425 }, { 43,-15425 }, { 44,-15425 }, { 45,-15425 }, + { 46,-15425 }, { 47,-15425 }, { 48,-15425 }, { 49,-15425 }, { 50,-15425 }, + { 51,-15425 }, { 52,-15425 }, { 53,-15425 }, { 54,-15425 }, { 55,-15425 }, + { 56,-15425 }, { 57,-15425 }, { 58,-15425 }, { 59,-15425 }, { 60,-15425 }, + { 61,-15425 }, { 62,-15425 }, { 63,-15425 }, { 64,-15425 }, { 65,-15425 }, + { 66,-15425 }, { 67,-15425 }, { 68,-15425 }, { 69,-15425 }, { 70,-15425 }, + { 71,-15425 }, { 72,-15425 }, { 73,-15425 }, { 74,-15425 }, { 75,-15425 }, + + { 76,-15425 }, { 77,-15425 }, { 78,-15425 }, { 79,-15425 }, { 80,-15425 }, + { 81,-15425 }, { 82,-15425 }, { 83,-15425 }, { 84,-15425 }, { 85,-15425 }, + { 86,-15425 }, { 87,-15425 }, { 88,-15425 }, { 89,-15425 }, { 90,-15425 }, + { 91,-15425 }, { 92,-15167 }, { 93,-15425 }, { 94,-15425 }, { 95,-15425 }, + { 96,-15425 }, { 97,-15425 }, { 98,-15425 }, { 99,-15425 }, { 100,-15425 }, + { 101,-15425 }, { 102,-15425 }, { 103,-15425 }, { 104,-15425 }, { 105,-15425 }, + { 106,-15425 }, { 107,-15425 }, { 108,-15425 }, { 109,-15425 }, { 110,-15425 }, + { 111,-15425 }, { 112,-15425 }, { 113,-15425 }, { 114,-15425 }, { 115,-15425 }, + { 116,-15425 }, { 117,-15425 }, { 118,-15425 }, { 119,-15425 }, { 120,-15425 }, + { 121,-15425 }, { 122,-15425 }, { 123,-15425 }, { 124,-15425 }, { 125,-15425 }, + + { 126,-15425 }, { 127,-15425 }, { 128,-15425 }, { 129,-15425 }, { 130,-15425 }, + { 131,-15425 }, { 132,-15425 }, { 133,-15425 }, { 134,-15425 }, { 135,-15425 }, + { 136,-15425 }, { 137,-15425 }, { 138,-15425 }, { 139,-15425 }, { 140,-15425 }, + { 141,-15425 }, { 142,-15425 }, { 143,-15425 }, { 144,-15425 }, { 145,-15425 }, + { 146,-15425 }, { 147,-15425 }, { 148,-15425 }, { 149,-15425 }, { 150,-15425 }, + { 151,-15425 }, { 152,-15425 }, { 153,-15425 }, { 154,-15425 }, { 155,-15425 }, + { 156,-15425 }, { 157,-15425 }, { 158,-15425 }, { 159,-15425 }, { 160,-15425 }, + { 161,-15425 }, { 162,-15425 }, { 163,-15425 }, { 164,-15425 }, { 165,-15425 }, + { 166,-15425 }, { 167,-15425 }, { 168,-15425 }, { 169,-15425 }, { 170,-15425 }, + { 171,-15425 }, { 172,-15425 }, { 173,-15425 }, { 174,-15425 }, { 175,-15425 }, + + { 176,-15425 }, { 177,-15425 }, { 178,-15425 }, { 179,-15425 }, { 180,-15425 }, + { 181,-15425 }, { 182,-15425 }, { 183,-15425 }, { 184,-15425 }, { 185,-15425 }, + { 186,-15425 }, { 187,-15425 }, { 188,-15425 }, { 189,-15425 }, { 190,-15425 }, + { 191,-15425 }, { 192,-15425 }, { 193,-15425 }, { 194,-15425 }, { 195,-15425 }, + { 196,-15425 }, { 197,-15425 }, { 198,-15425 }, { 199,-15425 }, { 200,-15425 }, + { 201,-15425 }, { 202,-15425 }, { 203,-15425 }, { 204,-15425 }, { 205,-15425 }, + { 206,-15425 }, { 207,-15425 }, { 208,-15425 }, { 209,-15425 }, { 210,-15425 }, + { 211,-15425 }, { 212,-15425 }, { 213,-15425 }, { 214,-15425 }, { 215,-15425 }, + { 216,-15425 }, { 217,-15425 }, { 218,-15425 }, { 219,-15425 }, { 220,-15425 }, + { 221,-15425 }, { 222,-15425 }, { 223,-15425 }, { 224,-15425 }, { 225,-15425 }, + + { 226,-15425 }, { 227,-15425 }, { 228,-15425 }, { 229,-15425 }, { 230,-15425 }, + { 231,-15425 }, { 232,-15425 }, { 233,-15425 }, { 234,-15425 }, { 235,-15425 }, + { 236,-15425 }, { 237,-15425 }, { 238,-15425 }, { 239,-15425 }, { 240,-15425 }, + { 241,-15425 }, { 242,-15425 }, { 243,-15425 }, { 244,-15425 }, { 245,-15425 }, + { 246,-15425 }, { 247,-15425 }, { 248,-15425 }, { 249,-15425 }, { 250,-15425 }, + { 251,-15425 }, { 252,-15425 }, { 253,-15425 }, { 254,-15425 }, { 255,-15425 }, + { 256,-15425 }, { 0, 130 }, { 0,77207 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0,77197 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 130 }, { 0,77185 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 129 }, { 0,77170 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 }, + { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 }, + { 48, 12 }, { 49, 12 }, { 50, 12 }, { 51, 12 }, { 52, 12 }, + { 53, 12 }, { 54, 12 }, { 55, 12 }, { 56, 12 }, { 57, 12 }, + + { 0, 0 }, { 69,-15003 }, { 48, 0 }, { 49, 0 }, { 50, 0 }, + { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 }, + { 56, 0 }, { 57, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 }, + { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 }, + { 56, 0 }, { 57, 0 }, { 0, 131 }, { 0,77111 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 101,-15003 }, { 65, 0 }, + { 66, 0 }, { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 }, + { 101, 0 }, { 102, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-15012 }, { 49,-15012 }, { 50,-15012 }, { 51,-15012 }, + { 52,-15012 }, { 53,-15012 }, { 54,-15012 }, { 55,-15012 }, { 56,-15012 }, + { 57,-15012 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-15012 }, { 66,-15012 }, + { 67,-15012 }, { 68,-15012 }, { 69,-15012 }, { 70,-15012 }, { 71,-15012 }, + + { 72,-15012 }, { 73,-15012 }, { 74,-15012 }, { 75,-15012 }, { 76,-15012 }, + { 77,-15012 }, { 78,-15012 }, { 79,-15012 }, { 80,-15012 }, { 81,-15012 }, + { 82,-15012 }, { 83,-15012 }, { 84,14911 }, { 85,-15012 }, { 86,-15012 }, + { 87,-15012 }, { 88,-15012 }, { 89,-15012 }, { 90,-15012 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-15012 }, { 0, 0 }, + { 97,-15012 }, { 98,-15012 }, { 99,-15012 }, { 100,-15012 }, { 101,-15012 }, + { 102,-15012 }, { 103,-15012 }, { 104,-15012 }, { 105,-15012 }, { 106,-15012 }, + { 107,-15012 }, { 108,-15012 }, { 109,-15012 }, { 110,-15012 }, { 111,-15012 }, + { 112,-15012 }, { 113,-15012 }, { 114,-15012 }, { 115,-15012 }, { 116,14911 }, + { 117,-15012 }, { 118,-15012 }, { 119,-15012 }, { 120,-15012 }, { 121,-15012 }, + + { 122,-15012 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-15012 }, { 128,-15012 }, { 129,-15012 }, { 130,-15012 }, { 131,-15012 }, + { 132,-15012 }, { 133,-15012 }, { 134,-15012 }, { 135,-15012 }, { 136,-15012 }, + { 137,-15012 }, { 138,-15012 }, { 139,-15012 }, { 140,-15012 }, { 141,-15012 }, + { 142,-15012 }, { 143,-15012 }, { 144,-15012 }, { 145,-15012 }, { 146,-15012 }, + { 147,-15012 }, { 148,-15012 }, { 149,-15012 }, { 150,-15012 }, { 151,-15012 }, + { 152,-15012 }, { 153,-15012 }, { 154,-15012 }, { 155,-15012 }, { 156,-15012 }, + { 157,-15012 }, { 158,-15012 }, { 159,-15012 }, { 160,-15012 }, { 161,-15012 }, + { 162,-15012 }, { 163,-15012 }, { 164,-15012 }, { 165,-15012 }, { 166,-15012 }, + { 167,-15012 }, { 168,-15012 }, { 169,-15012 }, { 170,-15012 }, { 171,-15012 }, + + { 172,-15012 }, { 173,-15012 }, { 174,-15012 }, { 175,-15012 }, { 176,-15012 }, + { 177,-15012 }, { 178,-15012 }, { 179,-15012 }, { 180,-15012 }, { 181,-15012 }, + { 182,-15012 }, { 183,-15012 }, { 184,-15012 }, { 185,-15012 }, { 186,-15012 }, + { 187,-15012 }, { 188,-15012 }, { 189,-15012 }, { 190,-15012 }, { 191,-15012 }, + { 192,-15012 }, { 193,-15012 }, { 194,-15012 }, { 195,-15012 }, { 196,-15012 }, + { 197,-15012 }, { 198,-15012 }, { 199,-15012 }, { 200,-15012 }, { 201,-15012 }, + { 202,-15012 }, { 203,-15012 }, { 204,-15012 }, { 205,-15012 }, { 206,-15012 }, + { 207,-15012 }, { 208,-15012 }, { 209,-15012 }, { 210,-15012 }, { 211,-15012 }, + { 212,-15012 }, { 213,-15012 }, { 214,-15012 }, { 215,-15012 }, { 216,-15012 }, + { 217,-15012 }, { 218,-15012 }, { 219,-15012 }, { 220,-15012 }, { 221,-15012 }, + + { 222,-15012 }, { 223,-15012 }, { 224,-15012 }, { 225,-15012 }, { 226,-15012 }, + { 227,-15012 }, { 228,-15012 }, { 229,-15012 }, { 230,-15012 }, { 231,-15012 }, + { 232,-15012 }, { 233,-15012 }, { 234,-15012 }, { 235,-15012 }, { 236,-15012 }, + { 237,-15012 }, { 238,-15012 }, { 239,-15012 }, { 240,-15012 }, { 241,-15012 }, + { 242,-15012 }, { 243,-15012 }, { 244,-15012 }, { 245,-15012 }, { 246,-15012 }, + { 247,-15012 }, { 248,-15012 }, { 249,-15012 }, { 250,-15012 }, { 251,-15012 }, + { 252,-15012 }, { 253,-15012 }, { 254,-15012 }, { 255,-15012 }, { 0, 25 }, + { 0,76854 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-15269 }, { 49,-15269 }, + { 50,-15269 }, { 51,-15269 }, { 52,-15269 }, { 53,-15269 }, { 54,-15269 }, + { 55,-15269 }, { 56,-15269 }, { 57,-15269 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 65,-15269 }, { 66,-15269 }, { 67,-15269 }, { 68,-15269 }, { 69,-15269 }, + { 70,-15269 }, { 71,-15269 }, { 72,-15269 }, { 73,-15269 }, { 74,-15269 }, + { 75,-15269 }, { 76,-15269 }, { 77,-15269 }, { 78,-15269 }, { 79,-15269 }, + { 80,-15269 }, { 81,-15269 }, { 82,-15269 }, { 83,-15269 }, { 84,-15269 }, + { 85,-15269 }, { 86,-15269 }, { 87,-15269 }, { 88,-15269 }, { 89,-15269 }, + { 90,-15269 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-15269 }, { 0, 0 }, { 97,-15269 }, { 98,-15269 }, { 99,-15269 }, + { 100,-15269 }, { 101,-15269 }, { 102,-15269 }, { 103,-15269 }, { 104,-15269 }, + { 105,-15269 }, { 106,-15269 }, { 107,-15269 }, { 108,-15269 }, { 109,-15269 }, + { 110,-15269 }, { 111,-15269 }, { 112,-15269 }, { 113,-15269 }, { 114,-15269 }, + + { 115,-15269 }, { 116,-15269 }, { 117,-15269 }, { 118,-15269 }, { 119,-15269 }, + { 120,-15269 }, { 121,-15269 }, { 122,-15269 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-15269 }, { 128,-15269 }, { 129,-15269 }, + { 130,-15269 }, { 131,-15269 }, { 132,-15269 }, { 133,-15269 }, { 134,-15269 }, + { 135,-15269 }, { 136,-15269 }, { 137,-15269 }, { 138,-15269 }, { 139,-15269 }, + { 140,-15269 }, { 141,-15269 }, { 142,-15269 }, { 143,-15269 }, { 144,-15269 }, + { 145,-15269 }, { 146,-15269 }, { 147,-15269 }, { 148,-15269 }, { 149,-15269 }, + { 150,-15269 }, { 151,-15269 }, { 152,-15269 }, { 153,-15269 }, { 154,-15269 }, + { 155,-15269 }, { 156,-15269 }, { 157,-15269 }, { 158,-15269 }, { 159,-15269 }, + { 160,-15269 }, { 161,-15269 }, { 162,-15269 }, { 163,-15269 }, { 164,-15269 }, + + { 165,-15269 }, { 166,-15269 }, { 167,-15269 }, { 168,-15269 }, { 169,-15269 }, + { 170,-15269 }, { 171,-15269 }, { 172,-15269 }, { 173,-15269 }, { 174,-15269 }, + { 175,-15269 }, { 176,-15269 }, { 177,-15269 }, { 178,-15269 }, { 179,-15269 }, + { 180,-15269 }, { 181,-15269 }, { 182,-15269 }, { 183,-15269 }, { 184,-15269 }, + { 185,-15269 }, { 186,-15269 }, { 187,-15269 }, { 188,-15269 }, { 189,-15269 }, + { 190,-15269 }, { 191,-15269 }, { 192,-15269 }, { 193,-15269 }, { 194,-15269 }, + { 195,-15269 }, { 196,-15269 }, { 197,-15269 }, { 198,-15269 }, { 199,-15269 }, + { 200,-15269 }, { 201,-15269 }, { 202,-15269 }, { 203,-15269 }, { 204,-15269 }, + { 205,-15269 }, { 206,-15269 }, { 207,-15269 }, { 208,-15269 }, { 209,-15269 }, + { 210,-15269 }, { 211,-15269 }, { 212,-15269 }, { 213,-15269 }, { 214,-15269 }, + + { 215,-15269 }, { 216,-15269 }, { 217,-15269 }, { 218,-15269 }, { 219,-15269 }, + { 220,-15269 }, { 221,-15269 }, { 222,-15269 }, { 223,-15269 }, { 224,-15269 }, + { 225,-15269 }, { 226,-15269 }, { 227,-15269 }, { 228,-15269 }, { 229,-15269 }, + { 230,-15269 }, { 231,-15269 }, { 232,-15269 }, { 233,-15269 }, { 234,-15269 }, + { 235,-15269 }, { 236,-15269 }, { 237,-15269 }, { 238,-15269 }, { 239,-15269 }, + { 240,-15269 }, { 241,-15269 }, { 242,-15269 }, { 243,-15269 }, { 244,-15269 }, + { 245,-15269 }, { 246,-15269 }, { 247,-15269 }, { 248,-15269 }, { 249,-15269 }, + { 250,-15269 }, { 251,-15269 }, { 252,-15269 }, { 253,-15269 }, { 254,-15269 }, + { 255,-15269 }, { 0, 131 }, { 0,76597 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-15526 }, { 49,-15526 }, { 50,-15526 }, { 51,-15526 }, { 52,-15526 }, + { 53,-15526 }, { 54,-15526 }, { 55,-15526 }, { 56,-15526 }, { 57,-15526 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,14654 }, { 66,-15526 }, { 67,-15526 }, + { 68,-15526 }, { 69,-15526 }, { 70,-15526 }, { 71,-15526 }, { 72,-15526 }, + { 73,-15526 }, { 74,-15526 }, { 75,-15526 }, { 76,-15526 }, { 77,-15526 }, + { 78,-15526 }, { 79,-15526 }, { 80,-15526 }, { 81,-15526 }, { 82,-15526 }, + { 83,-15526 }, { 84,-15526 }, { 85,-15526 }, { 86,-15526 }, { 87,-15526 }, + { 88,-15526 }, { 89,-15526 }, { 90,-15526 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-15526 }, { 0, 0 }, { 97,14654 }, + { 98,-15526 }, { 99,-15526 }, { 100,-15526 }, { 101,-15526 }, { 102,-15526 }, + { 103,-15526 }, { 104,-15526 }, { 105,-15526 }, { 106,-15526 }, { 107,-15526 }, + + { 108,-15526 }, { 109,-15526 }, { 110,-15526 }, { 111,-15526 }, { 112,-15526 }, + { 113,-15526 }, { 114,-15526 }, { 115,-15526 }, { 116,-15526 }, { 117,-15526 }, + { 118,-15526 }, { 119,-15526 }, { 120,-15526 }, { 121,-15526 }, { 122,-15526 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-15526 }, + { 128,-15526 }, { 129,-15526 }, { 130,-15526 }, { 131,-15526 }, { 132,-15526 }, + { 133,-15526 }, { 134,-15526 }, { 135,-15526 }, { 136,-15526 }, { 137,-15526 }, + { 138,-15526 }, { 139,-15526 }, { 140,-15526 }, { 141,-15526 }, { 142,-15526 }, + { 143,-15526 }, { 144,-15526 }, { 145,-15526 }, { 146,-15526 }, { 147,-15526 }, + { 148,-15526 }, { 149,-15526 }, { 150,-15526 }, { 151,-15526 }, { 152,-15526 }, + { 153,-15526 }, { 154,-15526 }, { 155,-15526 }, { 156,-15526 }, { 157,-15526 }, + + { 158,-15526 }, { 159,-15526 }, { 160,-15526 }, { 161,-15526 }, { 162,-15526 }, + { 163,-15526 }, { 164,-15526 }, { 165,-15526 }, { 166,-15526 }, { 167,-15526 }, + { 168,-15526 }, { 169,-15526 }, { 170,-15526 }, { 171,-15526 }, { 172,-15526 }, + { 173,-15526 }, { 174,-15526 }, { 175,-15526 }, { 176,-15526 }, { 177,-15526 }, + { 178,-15526 }, { 179,-15526 }, { 180,-15526 }, { 181,-15526 }, { 182,-15526 }, + { 183,-15526 }, { 184,-15526 }, { 185,-15526 }, { 186,-15526 }, { 187,-15526 }, + { 188,-15526 }, { 189,-15526 }, { 190,-15526 }, { 191,-15526 }, { 192,-15526 }, + { 193,-15526 }, { 194,-15526 }, { 195,-15526 }, { 196,-15526 }, { 197,-15526 }, + { 198,-15526 }, { 199,-15526 }, { 200,-15526 }, { 201,-15526 }, { 202,-15526 }, + { 203,-15526 }, { 204,-15526 }, { 205,-15526 }, { 206,-15526 }, { 207,-15526 }, + + { 208,-15526 }, { 209,-15526 }, { 210,-15526 }, { 211,-15526 }, { 212,-15526 }, + { 213,-15526 }, { 214,-15526 }, { 215,-15526 }, { 216,-15526 }, { 217,-15526 }, + { 218,-15526 }, { 219,-15526 }, { 220,-15526 }, { 221,-15526 }, { 222,-15526 }, + { 223,-15526 }, { 224,-15526 }, { 225,-15526 }, { 226,-15526 }, { 227,-15526 }, + { 228,-15526 }, { 229,-15526 }, { 230,-15526 }, { 231,-15526 }, { 232,-15526 }, + { 233,-15526 }, { 234,-15526 }, { 235,-15526 }, { 236,-15526 }, { 237,-15526 }, + { 238,-15526 }, { 239,-15526 }, { 240,-15526 }, { 241,-15526 }, { 242,-15526 }, + { 243,-15526 }, { 244,-15526 }, { 245,-15526 }, { 246,-15526 }, { 247,-15526 }, + { 248,-15526 }, { 249,-15526 }, { 250,-15526 }, { 251,-15526 }, { 252,-15526 }, + { 253,-15526 }, { 254,-15526 }, { 255,-15526 }, { 0, 131 }, { 0,76340 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-15783 }, { 49,-15783 }, { 50,-15783 }, + + { 51,-15783 }, { 52,-15783 }, { 53,-15783 }, { 54,-15783 }, { 55,-15783 }, + { 56,-15783 }, { 57,-15783 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,14654 }, + { 66,-15783 }, { 67,-15783 }, { 68,-15783 }, { 69,-15783 }, { 70,-15783 }, + { 71,-15783 }, { 72,-15783 }, { 73,-15783 }, { 74,-15783 }, { 75,-15783 }, + { 76,-15783 }, { 77,-15783 }, { 78,-15783 }, { 79,-15783 }, { 80,-15783 }, + { 81,-15783 }, { 82,-15783 }, { 83,-15783 }, { 84,-15783 }, { 85,-15783 }, + { 86,-15783 }, { 87,-15783 }, { 88,-15783 }, { 89,-15783 }, { 90,-15783 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-15783 }, + { 0, 0 }, { 97,14654 }, { 98,-15783 }, { 99,-15783 }, { 100,-15783 }, + + { 101,-15783 }, { 102,-15783 }, { 103,-15783 }, { 104,-15783 }, { 105,-15783 }, + { 106,-15783 }, { 107,-15783 }, { 108,-15783 }, { 109,-15783 }, { 110,-15783 }, + { 111,-15783 }, { 112,-15783 }, { 113,-15783 }, { 114,-15783 }, { 115,-15783 }, + { 116,-15783 }, { 117,-15783 }, { 118,-15783 }, { 119,-15783 }, { 120,-15783 }, + { 121,-15783 }, { 122,-15783 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-15783 }, { 128,-15783 }, { 129,-15783 }, { 130,-15783 }, + { 131,-15783 }, { 132,-15783 }, { 133,-15783 }, { 134,-15783 }, { 135,-15783 }, + { 136,-15783 }, { 137,-15783 }, { 138,-15783 }, { 139,-15783 }, { 140,-15783 }, + { 141,-15783 }, { 142,-15783 }, { 143,-15783 }, { 144,-15783 }, { 145,-15783 }, + { 146,-15783 }, { 147,-15783 }, { 148,-15783 }, { 149,-15783 }, { 150,-15783 }, + + { 151,-15783 }, { 152,-15783 }, { 153,-15783 }, { 154,-15783 }, { 155,-15783 }, + { 156,-15783 }, { 157,-15783 }, { 158,-15783 }, { 159,-15783 }, { 160,-15783 }, + { 161,-15783 }, { 162,-15783 }, { 163,-15783 }, { 164,-15783 }, { 165,-15783 }, + { 166,-15783 }, { 167,-15783 }, { 168,-15783 }, { 169,-15783 }, { 170,-15783 }, + { 171,-15783 }, { 172,-15783 }, { 173,-15783 }, { 174,-15783 }, { 175,-15783 }, + { 176,-15783 }, { 177,-15783 }, { 178,-15783 }, { 179,-15783 }, { 180,-15783 }, + { 181,-15783 }, { 182,-15783 }, { 183,-15783 }, { 184,-15783 }, { 185,-15783 }, + { 186,-15783 }, { 187,-15783 }, { 188,-15783 }, { 189,-15783 }, { 190,-15783 }, + { 191,-15783 }, { 192,-15783 }, { 193,-15783 }, { 194,-15783 }, { 195,-15783 }, + { 196,-15783 }, { 197,-15783 }, { 198,-15783 }, { 199,-15783 }, { 200,-15783 }, + + { 201,-15783 }, { 202,-15783 }, { 203,-15783 }, { 204,-15783 }, { 205,-15783 }, + { 206,-15783 }, { 207,-15783 }, { 208,-15783 }, { 209,-15783 }, { 210,-15783 }, + { 211,-15783 }, { 212,-15783 }, { 213,-15783 }, { 214,-15783 }, { 215,-15783 }, + { 216,-15783 }, { 217,-15783 }, { 218,-15783 }, { 219,-15783 }, { 220,-15783 }, + { 221,-15783 }, { 222,-15783 }, { 223,-15783 }, { 224,-15783 }, { 225,-15783 }, + { 226,-15783 }, { 227,-15783 }, { 228,-15783 }, { 229,-15783 }, { 230,-15783 }, + { 231,-15783 }, { 232,-15783 }, { 233,-15783 }, { 234,-15783 }, { 235,-15783 }, + { 236,-15783 }, { 237,-15783 }, { 238,-15783 }, { 239,-15783 }, { 240,-15783 }, + { 241,-15783 }, { 242,-15783 }, { 243,-15783 }, { 244,-15783 }, { 245,-15783 }, + { 246,-15783 }, { 247,-15783 }, { 248,-15783 }, { 249,-15783 }, { 250,-15783 }, + + { 251,-15783 }, { 252,-15783 }, { 253,-15783 }, { 254,-15783 }, { 255,-15783 }, + { 0, 131 }, { 0,76083 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-16040 }, + { 49,-16040 }, { 50,-16040 }, { 51,-16040 }, { 52,-16040 }, { 53,-16040 }, + { 54,-16040 }, { 55,-16040 }, { 56,-16040 }, { 57,-16040 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-16040 }, { 66,-16040 }, { 67,-16040 }, { 68,-16040 }, + { 69,-16040 }, { 70,-16040 }, { 71,-16040 }, { 72,-16040 }, { 73,-16040 }, + { 74,-16040 }, { 75,-16040 }, { 76,14654 }, { 77,-16040 }, { 78,-16040 }, + { 79,-16040 }, { 80,-16040 }, { 81,-16040 }, { 82,-16040 }, { 83,-16040 }, + { 84,-16040 }, { 85,-16040 }, { 86,-16040 }, { 87,-16040 }, { 88,-16040 }, + { 89,-16040 }, { 90,-16040 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 95,-16040 }, { 0, 0 }, { 97,-16040 }, { 98,-16040 }, + { 99,-16040 }, { 100,-16040 }, { 101,-16040 }, { 102,-16040 }, { 103,-16040 }, + { 104,-16040 }, { 105,-16040 }, { 106,-16040 }, { 107,-16040 }, { 108,14654 }, + { 109,-16040 }, { 110,-16040 }, { 111,-16040 }, { 112,-16040 }, { 113,-16040 }, + { 114,-16040 }, { 115,-16040 }, { 116,-16040 }, { 117,-16040 }, { 118,-16040 }, + { 119,-16040 }, { 120,-16040 }, { 121,-16040 }, { 122,-16040 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-16040 }, { 128,-16040 }, + { 129,-16040 }, { 130,-16040 }, { 131,-16040 }, { 132,-16040 }, { 133,-16040 }, + { 134,-16040 }, { 135,-16040 }, { 136,-16040 }, { 137,-16040 }, { 138,-16040 }, + { 139,-16040 }, { 140,-16040 }, { 141,-16040 }, { 142,-16040 }, { 143,-16040 }, + + { 144,-16040 }, { 145,-16040 }, { 146,-16040 }, { 147,-16040 }, { 148,-16040 }, + { 149,-16040 }, { 150,-16040 }, { 151,-16040 }, { 152,-16040 }, { 153,-16040 }, + { 154,-16040 }, { 155,-16040 }, { 156,-16040 }, { 157,-16040 }, { 158,-16040 }, + { 159,-16040 }, { 160,-16040 }, { 161,-16040 }, { 162,-16040 }, { 163,-16040 }, + { 164,-16040 }, { 165,-16040 }, { 166,-16040 }, { 167,-16040 }, { 168,-16040 }, + { 169,-16040 }, { 170,-16040 }, { 171,-16040 }, { 172,-16040 }, { 173,-16040 }, + { 174,-16040 }, { 175,-16040 }, { 176,-16040 }, { 177,-16040 }, { 178,-16040 }, + { 179,-16040 }, { 180,-16040 }, { 181,-16040 }, { 182,-16040 }, { 183,-16040 }, + { 184,-16040 }, { 185,-16040 }, { 186,-16040 }, { 187,-16040 }, { 188,-16040 }, + { 189,-16040 }, { 190,-16040 }, { 191,-16040 }, { 192,-16040 }, { 193,-16040 }, + + { 194,-16040 }, { 195,-16040 }, { 196,-16040 }, { 197,-16040 }, { 198,-16040 }, + { 199,-16040 }, { 200,-16040 }, { 201,-16040 }, { 202,-16040 }, { 203,-16040 }, + { 204,-16040 }, { 205,-16040 }, { 206,-16040 }, { 207,-16040 }, { 208,-16040 }, + { 209,-16040 }, { 210,-16040 }, { 211,-16040 }, { 212,-16040 }, { 213,-16040 }, + { 214,-16040 }, { 215,-16040 }, { 216,-16040 }, { 217,-16040 }, { 218,-16040 }, + { 219,-16040 }, { 220,-16040 }, { 221,-16040 }, { 222,-16040 }, { 223,-16040 }, + { 224,-16040 }, { 225,-16040 }, { 226,-16040 }, { 227,-16040 }, { 228,-16040 }, + { 229,-16040 }, { 230,-16040 }, { 231,-16040 }, { 232,-16040 }, { 233,-16040 }, + { 234,-16040 }, { 235,-16040 }, { 236,-16040 }, { 237,-16040 }, { 238,-16040 }, + { 239,-16040 }, { 240,-16040 }, { 241,-16040 }, { 242,-16040 }, { 243,-16040 }, + + { 244,-16040 }, { 245,-16040 }, { 246,-16040 }, { 247,-16040 }, { 248,-16040 }, + { 249,-16040 }, { 250,-16040 }, { 251,-16040 }, { 252,-16040 }, { 253,-16040 }, + { 254,-16040 }, { 255,-16040 }, { 0, 131 }, { 0,75826 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-16297 }, { 49,-16297 }, { 50,-16297 }, { 51,-16297 }, + { 52,-16297 }, { 53,-16297 }, { 54,-16297 }, { 55,-16297 }, { 56,-16297 }, + { 57,-16297 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-16297 }, { 66,-16297 }, + { 67,-16297 }, { 68,-16297 }, { 69,14654 }, { 70,-16297 }, { 71,-16297 }, + { 72,-16297 }, { 73,-16297 }, { 74,-16297 }, { 75,-16297 }, { 76,-16297 }, + { 77,-16297 }, { 78,-16297 }, { 79,-16297 }, { 80,-16297 }, { 81,-16297 }, + { 82,-16297 }, { 83,-16297 }, { 84,-16297 }, { 85,-16297 }, { 86,-16297 }, + + { 87,-16297 }, { 88,-16297 }, { 89,-16297 }, { 90,-16297 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-16297 }, { 0, 0 }, + { 97,-16297 }, { 98,-16297 }, { 99,-16297 }, { 100,-16297 }, { 101,14654 }, + { 102,-16297 }, { 103,-16297 }, { 104,-16297 }, { 105,-16297 }, { 106,-16297 }, + { 107,-16297 }, { 108,-16297 }, { 109,-16297 }, { 110,-16297 }, { 111,-16297 }, + { 112,-16297 }, { 113,-16297 }, { 114,-16297 }, { 115,-16297 }, { 116,-16297 }, + { 117,-16297 }, { 118,-16297 }, { 119,-16297 }, { 120,-16297 }, { 121,-16297 }, + { 122,-16297 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-16297 }, { 128,-16297 }, { 129,-16297 }, { 130,-16297 }, { 131,-16297 }, + { 132,-16297 }, { 133,-16297 }, { 134,-16297 }, { 135,-16297 }, { 136,-16297 }, + + { 137,-16297 }, { 138,-16297 }, { 139,-16297 }, { 140,-16297 }, { 141,-16297 }, + { 142,-16297 }, { 143,-16297 }, { 144,-16297 }, { 145,-16297 }, { 146,-16297 }, + { 147,-16297 }, { 148,-16297 }, { 149,-16297 }, { 150,-16297 }, { 151,-16297 }, + { 152,-16297 }, { 153,-16297 }, { 154,-16297 }, { 155,-16297 }, { 156,-16297 }, + { 157,-16297 }, { 158,-16297 }, { 159,-16297 }, { 160,-16297 }, { 161,-16297 }, + { 162,-16297 }, { 163,-16297 }, { 164,-16297 }, { 165,-16297 }, { 166,-16297 }, + { 167,-16297 }, { 168,-16297 }, { 169,-16297 }, { 170,-16297 }, { 171,-16297 }, + { 172,-16297 }, { 173,-16297 }, { 174,-16297 }, { 175,-16297 }, { 176,-16297 }, + { 177,-16297 }, { 178,-16297 }, { 179,-16297 }, { 180,-16297 }, { 181,-16297 }, + { 182,-16297 }, { 183,-16297 }, { 184,-16297 }, { 185,-16297 }, { 186,-16297 }, + + { 187,-16297 }, { 188,-16297 }, { 189,-16297 }, { 190,-16297 }, { 191,-16297 }, + { 192,-16297 }, { 193,-16297 }, { 194,-16297 }, { 195,-16297 }, { 196,-16297 }, + { 197,-16297 }, { 198,-16297 }, { 199,-16297 }, { 200,-16297 }, { 201,-16297 }, + { 202,-16297 }, { 203,-16297 }, { 204,-16297 }, { 205,-16297 }, { 206,-16297 }, + { 207,-16297 }, { 208,-16297 }, { 209,-16297 }, { 210,-16297 }, { 211,-16297 }, + { 212,-16297 }, { 213,-16297 }, { 214,-16297 }, { 215,-16297 }, { 216,-16297 }, + { 217,-16297 }, { 218,-16297 }, { 219,-16297 }, { 220,-16297 }, { 221,-16297 }, + { 222,-16297 }, { 223,-16297 }, { 224,-16297 }, { 225,-16297 }, { 226,-16297 }, + { 227,-16297 }, { 228,-16297 }, { 229,-16297 }, { 230,-16297 }, { 231,-16297 }, + { 232,-16297 }, { 233,-16297 }, { 234,-16297 }, { 235,-16297 }, { 236,-16297 }, + + { 237,-16297 }, { 238,-16297 }, { 239,-16297 }, { 240,-16297 }, { 241,-16297 }, + { 242,-16297 }, { 243,-16297 }, { 244,-16297 }, { 245,-16297 }, { 246,-16297 }, + { 247,-16297 }, { 248,-16297 }, { 249,-16297 }, { 250,-16297 }, { 251,-16297 }, + { 252,-16297 }, { 253,-16297 }, { 254,-16297 }, { 255,-16297 }, { 0, 131 }, + { 0,75569 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-16554 }, { 49,-16554 }, + { 50,-16554 }, { 51,-16554 }, { 52,-16554 }, { 53,-16554 }, { 54,-16554 }, + { 55,-16554 }, { 56,-16554 }, { 57,-16554 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-16554 }, { 66,-16554 }, { 67,14654 }, { 68,-16554 }, { 69,-16554 }, + { 70,-16554 }, { 71,-16554 }, { 72,-16554 }, { 73,-16554 }, { 74,-16554 }, + { 75,-16554 }, { 76,-16554 }, { 77,-16554 }, { 78,-16554 }, { 79,-16554 }, + + { 80,-16554 }, { 81,-16554 }, { 82,-16554 }, { 83,-16554 }, { 84,-16554 }, + { 85,-16554 }, { 86,-16554 }, { 87,-16554 }, { 88,-16554 }, { 89,-16554 }, + { 90,-16554 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-16554 }, { 0, 0 }, { 97,-16554 }, { 98,-16554 }, { 99,14654 }, + { 100,-16554 }, { 101,-16554 }, { 102,-16554 }, { 103,-16554 }, { 104,-16554 }, + { 105,-16554 }, { 106,-16554 }, { 107,-16554 }, { 108,-16554 }, { 109,-16554 }, + { 110,-16554 }, { 111,-16554 }, { 112,-16554 }, { 113,-16554 }, { 114,-16554 }, + { 115,-16554 }, { 116,-16554 }, { 117,-16554 }, { 118,-16554 }, { 119,-16554 }, + { 120,-16554 }, { 121,-16554 }, { 122,-16554 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-16554 }, { 128,-16554 }, { 129,-16554 }, + + { 130,-16554 }, { 131,-16554 }, { 132,-16554 }, { 133,-16554 }, { 134,-16554 }, + { 135,-16554 }, { 136,-16554 }, { 137,-16554 }, { 138,-16554 }, { 139,-16554 }, + { 140,-16554 }, { 141,-16554 }, { 142,-16554 }, { 143,-16554 }, { 144,-16554 }, + { 145,-16554 }, { 146,-16554 }, { 147,-16554 }, { 148,-16554 }, { 149,-16554 }, + { 150,-16554 }, { 151,-16554 }, { 152,-16554 }, { 153,-16554 }, { 154,-16554 }, + { 155,-16554 }, { 156,-16554 }, { 157,-16554 }, { 158,-16554 }, { 159,-16554 }, + { 160,-16554 }, { 161,-16554 }, { 162,-16554 }, { 163,-16554 }, { 164,-16554 }, + { 165,-16554 }, { 166,-16554 }, { 167,-16554 }, { 168,-16554 }, { 169,-16554 }, + { 170,-16554 }, { 171,-16554 }, { 172,-16554 }, { 173,-16554 }, { 174,-16554 }, + { 175,-16554 }, { 176,-16554 }, { 177,-16554 }, { 178,-16554 }, { 179,-16554 }, + + { 180,-16554 }, { 181,-16554 }, { 182,-16554 }, { 183,-16554 }, { 184,-16554 }, + { 185,-16554 }, { 186,-16554 }, { 187,-16554 }, { 188,-16554 }, { 189,-16554 }, + { 190,-16554 }, { 191,-16554 }, { 192,-16554 }, { 193,-16554 }, { 194,-16554 }, + { 195,-16554 }, { 196,-16554 }, { 197,-16554 }, { 198,-16554 }, { 199,-16554 }, + { 200,-16554 }, { 201,-16554 }, { 202,-16554 }, { 203,-16554 }, { 204,-16554 }, + { 205,-16554 }, { 206,-16554 }, { 207,-16554 }, { 208,-16554 }, { 209,-16554 }, + { 210,-16554 }, { 211,-16554 }, { 212,-16554 }, { 213,-16554 }, { 214,-16554 }, + { 215,-16554 }, { 216,-16554 }, { 217,-16554 }, { 218,-16554 }, { 219,-16554 }, + { 220,-16554 }, { 221,-16554 }, { 222,-16554 }, { 223,-16554 }, { 224,-16554 }, + { 225,-16554 }, { 226,-16554 }, { 227,-16554 }, { 228,-16554 }, { 229,-16554 }, + + { 230,-16554 }, { 231,-16554 }, { 232,-16554 }, { 233,-16554 }, { 234,-16554 }, + { 235,-16554 }, { 236,-16554 }, { 237,-16554 }, { 238,-16554 }, { 239,-16554 }, + { 240,-16554 }, { 241,-16554 }, { 242,-16554 }, { 243,-16554 }, { 244,-16554 }, + { 245,-16554 }, { 246,-16554 }, { 247,-16554 }, { 248,-16554 }, { 249,-16554 }, + { 250,-16554 }, { 251,-16554 }, { 252,-16554 }, { 253,-16554 }, { 254,-16554 }, + { 255,-16554 }, { 0, 131 }, { 0,75312 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-16811 }, { 49,-16811 }, { 50,-16811 }, { 51,-16811 }, { 52,-16811 }, + { 53,-16811 }, { 54,-16811 }, { 55,-16811 }, { 56,-16811 }, { 57,-16811 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-16811 }, { 66,-16811 }, { 67,-16811 }, + { 68,-16811 }, { 69,-16811 }, { 70,-16811 }, { 71,-16811 }, { 72,-16811 }, + + { 73,-16811 }, { 74,-16811 }, { 75,-16811 }, { 76,-16811 }, { 77,-16811 }, + { 78,-16811 }, { 79,-16811 }, { 80,-16811 }, { 81,-16811 }, { 82,-16811 }, + { 83,14654 }, { 84,-16811 }, { 85,-16811 }, { 86,-16811 }, { 87,-16811 }, + { 88,-16811 }, { 89,-16811 }, { 90,-16811 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-16811 }, { 0, 0 }, { 97,-16811 }, + { 98,-16811 }, { 99,-16811 }, { 100,-16811 }, { 101,-16811 }, { 102,-16811 }, + { 103,-16811 }, { 104,-16811 }, { 105,-16811 }, { 106,-16811 }, { 107,-16811 }, + { 108,-16811 }, { 109,-16811 }, { 110,-16811 }, { 111,-16811 }, { 112,-16811 }, + { 113,-16811 }, { 114,-16811 }, { 115,14654 }, { 116,-16811 }, { 117,-16811 }, + { 118,-16811 }, { 119,-16811 }, { 120,-16811 }, { 121,-16811 }, { 122,-16811 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-16811 }, + { 128,-16811 }, { 129,-16811 }, { 130,-16811 }, { 131,-16811 }, { 132,-16811 }, + { 133,-16811 }, { 134,-16811 }, { 135,-16811 }, { 136,-16811 }, { 137,-16811 }, + { 138,-16811 }, { 139,-16811 }, { 140,-16811 }, { 141,-16811 }, { 142,-16811 }, + { 143,-16811 }, { 144,-16811 }, { 145,-16811 }, { 146,-16811 }, { 147,-16811 }, + { 148,-16811 }, { 149,-16811 }, { 150,-16811 }, { 151,-16811 }, { 152,-16811 }, + { 153,-16811 }, { 154,-16811 }, { 155,-16811 }, { 156,-16811 }, { 157,-16811 }, + { 158,-16811 }, { 159,-16811 }, { 160,-16811 }, { 161,-16811 }, { 162,-16811 }, + { 163,-16811 }, { 164,-16811 }, { 165,-16811 }, { 166,-16811 }, { 167,-16811 }, + { 168,-16811 }, { 169,-16811 }, { 170,-16811 }, { 171,-16811 }, { 172,-16811 }, + + { 173,-16811 }, { 174,-16811 }, { 175,-16811 }, { 176,-16811 }, { 177,-16811 }, + { 178,-16811 }, { 179,-16811 }, { 180,-16811 }, { 181,-16811 }, { 182,-16811 }, + { 183,-16811 }, { 184,-16811 }, { 185,-16811 }, { 186,-16811 }, { 187,-16811 }, + { 188,-16811 }, { 189,-16811 }, { 190,-16811 }, { 191,-16811 }, { 192,-16811 }, + { 193,-16811 }, { 194,-16811 }, { 195,-16811 }, { 196,-16811 }, { 197,-16811 }, + { 198,-16811 }, { 199,-16811 }, { 200,-16811 }, { 201,-16811 }, { 202,-16811 }, + { 203,-16811 }, { 204,-16811 }, { 205,-16811 }, { 206,-16811 }, { 207,-16811 }, + { 208,-16811 }, { 209,-16811 }, { 210,-16811 }, { 211,-16811 }, { 212,-16811 }, + { 213,-16811 }, { 214,-16811 }, { 215,-16811 }, { 216,-16811 }, { 217,-16811 }, + { 218,-16811 }, { 219,-16811 }, { 220,-16811 }, { 221,-16811 }, { 222,-16811 }, + + { 223,-16811 }, { 224,-16811 }, { 225,-16811 }, { 226,-16811 }, { 227,-16811 }, + { 228,-16811 }, { 229,-16811 }, { 230,-16811 }, { 231,-16811 }, { 232,-16811 }, + { 233,-16811 }, { 234,-16811 }, { 235,-16811 }, { 236,-16811 }, { 237,-16811 }, + { 238,-16811 }, { 239,-16811 }, { 240,-16811 }, { 241,-16811 }, { 242,-16811 }, + { 243,-16811 }, { 244,-16811 }, { 245,-16811 }, { 246,-16811 }, { 247,-16811 }, + { 248,-16811 }, { 249,-16811 }, { 250,-16811 }, { 251,-16811 }, { 252,-16811 }, + { 253,-16811 }, { 254,-16811 }, { 255,-16811 }, { 0, 131 }, { 0,75055 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-17068 }, { 49,-17068 }, { 50,-17068 }, + { 51,-17068 }, { 52,-17068 }, { 53,-17068 }, { 54,-17068 }, { 55,-17068 }, + { 56,-17068 }, { 57,-17068 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-17068 }, + + { 66,-17068 }, { 67,-17068 }, { 68,-17068 }, { 69,-17068 }, { 70,-17068 }, + { 71,-17068 }, { 72,-17068 }, { 73,-17068 }, { 74,-17068 }, { 75,-17068 }, + { 76,-17068 }, { 77,-17068 }, { 78,14654 }, { 79,-17068 }, { 80,-17068 }, + { 81,-17068 }, { 82,-17068 }, { 83,-17068 }, { 84,-17068 }, { 85,-17068 }, + { 86,-17068 }, { 87,-17068 }, { 88,-17068 }, { 89,-17068 }, { 90,-17068 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-17068 }, + { 0, 0 }, { 97,-17068 }, { 98,-17068 }, { 99,-17068 }, { 100,-17068 }, + { 101,-17068 }, { 102,-17068 }, { 103,-17068 }, { 104,-17068 }, { 105,-17068 }, + { 106,-17068 }, { 107,-17068 }, { 108,-17068 }, { 109,-17068 }, { 110,14654 }, + { 111,-17068 }, { 112,-17068 }, { 113,-17068 }, { 114,-17068 }, { 115,-17068 }, + + { 116,-17068 }, { 117,-17068 }, { 118,-17068 }, { 119,-17068 }, { 120,-17068 }, + { 121,-17068 }, { 122,-17068 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-17068 }, { 128,-17068 }, { 129,-17068 }, { 130,-17068 }, + { 131,-17068 }, { 132,-17068 }, { 133,-17068 }, { 134,-17068 }, { 135,-17068 }, + { 136,-17068 }, { 137,-17068 }, { 138,-17068 }, { 139,-17068 }, { 140,-17068 }, + { 141,-17068 }, { 142,-17068 }, { 143,-17068 }, { 144,-17068 }, { 145,-17068 }, + { 146,-17068 }, { 147,-17068 }, { 148,-17068 }, { 149,-17068 }, { 150,-17068 }, + { 151,-17068 }, { 152,-17068 }, { 153,-17068 }, { 154,-17068 }, { 155,-17068 }, + { 156,-17068 }, { 157,-17068 }, { 158,-17068 }, { 159,-17068 }, { 160,-17068 }, + { 161,-17068 }, { 162,-17068 }, { 163,-17068 }, { 164,-17068 }, { 165,-17068 }, + + { 166,-17068 }, { 167,-17068 }, { 168,-17068 }, { 169,-17068 }, { 170,-17068 }, + { 171,-17068 }, { 172,-17068 }, { 173,-17068 }, { 174,-17068 }, { 175,-17068 }, + { 176,-17068 }, { 177,-17068 }, { 178,-17068 }, { 179,-17068 }, { 180,-17068 }, + { 181,-17068 }, { 182,-17068 }, { 183,-17068 }, { 184,-17068 }, { 185,-17068 }, + { 186,-17068 }, { 187,-17068 }, { 188,-17068 }, { 189,-17068 }, { 190,-17068 }, + { 191,-17068 }, { 192,-17068 }, { 193,-17068 }, { 194,-17068 }, { 195,-17068 }, + { 196,-17068 }, { 197,-17068 }, { 198,-17068 }, { 199,-17068 }, { 200,-17068 }, + { 201,-17068 }, { 202,-17068 }, { 203,-17068 }, { 204,-17068 }, { 205,-17068 }, + { 206,-17068 }, { 207,-17068 }, { 208,-17068 }, { 209,-17068 }, { 210,-17068 }, + { 211,-17068 }, { 212,-17068 }, { 213,-17068 }, { 214,-17068 }, { 215,-17068 }, + + { 216,-17068 }, { 217,-17068 }, { 218,-17068 }, { 219,-17068 }, { 220,-17068 }, + { 221,-17068 }, { 222,-17068 }, { 223,-17068 }, { 224,-17068 }, { 225,-17068 }, + { 226,-17068 }, { 227,-17068 }, { 228,-17068 }, { 229,-17068 }, { 230,-17068 }, + { 231,-17068 }, { 232,-17068 }, { 233,-17068 }, { 234,-17068 }, { 235,-17068 }, + { 236,-17068 }, { 237,-17068 }, { 238,-17068 }, { 239,-17068 }, { 240,-17068 }, + { 241,-17068 }, { 242,-17068 }, { 243,-17068 }, { 244,-17068 }, { 245,-17068 }, + { 246,-17068 }, { 247,-17068 }, { 248,-17068 }, { 249,-17068 }, { 250,-17068 }, + { 251,-17068 }, { 252,-17068 }, { 253,-17068 }, { 254,-17068 }, { 255,-17068 }, + { 0, 131 }, { 0,74798 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-17325 }, + { 49,-17325 }, { 50,-17325 }, { 51,-17325 }, { 52,-17325 }, { 53,-17325 }, + { 54,-17325 }, { 55,-17325 }, { 56,-17325 }, { 57,-17325 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-17325 }, { 66,-17325 }, { 67,-17325 }, { 68,-17325 }, + { 69,-17325 }, { 70,-17325 }, { 71,-17325 }, { 72,-17325 }, { 73,-17325 }, + { 74,-17325 }, { 75,-17325 }, { 76,-17325 }, { 77,-17325 }, { 78,-17325 }, + { 79,-17325 }, { 80,-17325 }, { 81,-17325 }, { 82,-17325 }, { 83,14654 }, + { 84,14911 }, { 85,-17325 }, { 86,-17325 }, { 87,-17325 }, { 88,-17325 }, + { 89,-17325 }, { 90,-17325 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-17325 }, { 0, 0 }, { 97,-17325 }, { 98,-17325 }, + { 99,-17325 }, { 100,-17325 }, { 101,-17325 }, { 102,-17325 }, { 103,-17325 }, + { 104,-17325 }, { 105,-17325 }, { 106,-17325 }, { 107,-17325 }, { 108,-17325 }, + + { 109,-17325 }, { 110,-17325 }, { 111,-17325 }, { 112,-17325 }, { 113,-17325 }, + { 114,-17325 }, { 115,14654 }, { 116,14911 }, { 117,-17325 }, { 118,-17325 }, + { 119,-17325 }, { 120,-17325 }, { 121,-17325 }, { 122,-17325 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-17325 }, { 128,-17325 }, + { 129,-17325 }, { 130,-17325 }, { 131,-17325 }, { 132,-17325 }, { 133,-17325 }, + { 134,-17325 }, { 135,-17325 }, { 136,-17325 }, { 137,-17325 }, { 138,-17325 }, + { 139,-17325 }, { 140,-17325 }, { 141,-17325 }, { 142,-17325 }, { 143,-17325 }, + { 144,-17325 }, { 145,-17325 }, { 146,-17325 }, { 147,-17325 }, { 148,-17325 }, + { 149,-17325 }, { 150,-17325 }, { 151,-17325 }, { 152,-17325 }, { 153,-17325 }, + { 154,-17325 }, { 155,-17325 }, { 156,-17325 }, { 157,-17325 }, { 158,-17325 }, + + { 159,-17325 }, { 160,-17325 }, { 161,-17325 }, { 162,-17325 }, { 163,-17325 }, + { 164,-17325 }, { 165,-17325 }, { 166,-17325 }, { 167,-17325 }, { 168,-17325 }, + { 169,-17325 }, { 170,-17325 }, { 171,-17325 }, { 172,-17325 }, { 173,-17325 }, + { 174,-17325 }, { 175,-17325 }, { 176,-17325 }, { 177,-17325 }, { 178,-17325 }, + { 179,-17325 }, { 180,-17325 }, { 181,-17325 }, { 182,-17325 }, { 183,-17325 }, + { 184,-17325 }, { 185,-17325 }, { 186,-17325 }, { 187,-17325 }, { 188,-17325 }, + { 189,-17325 }, { 190,-17325 }, { 191,-17325 }, { 192,-17325 }, { 193,-17325 }, + { 194,-17325 }, { 195,-17325 }, { 196,-17325 }, { 197,-17325 }, { 198,-17325 }, + { 199,-17325 }, { 200,-17325 }, { 201,-17325 }, { 202,-17325 }, { 203,-17325 }, + { 204,-17325 }, { 205,-17325 }, { 206,-17325 }, { 207,-17325 }, { 208,-17325 }, + + { 209,-17325 }, { 210,-17325 }, { 211,-17325 }, { 212,-17325 }, { 213,-17325 }, + { 214,-17325 }, { 215,-17325 }, { 216,-17325 }, { 217,-17325 }, { 218,-17325 }, + { 219,-17325 }, { 220,-17325 }, { 221,-17325 }, { 222,-17325 }, { 223,-17325 }, + { 224,-17325 }, { 225,-17325 }, { 226,-17325 }, { 227,-17325 }, { 228,-17325 }, + { 229,-17325 }, { 230,-17325 }, { 231,-17325 }, { 232,-17325 }, { 233,-17325 }, + { 234,-17325 }, { 235,-17325 }, { 236,-17325 }, { 237,-17325 }, { 238,-17325 }, + { 239,-17325 }, { 240,-17325 }, { 241,-17325 }, { 242,-17325 }, { 243,-17325 }, + { 244,-17325 }, { 245,-17325 }, { 246,-17325 }, { 247,-17325 }, { 248,-17325 }, + { 249,-17325 }, { 250,-17325 }, { 251,-17325 }, { 252,-17325 }, { 253,-17325 }, + { 254,-17325 }, { 255,-17325 }, { 0, 131 }, { 0,74541 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-17582 }, { 49,-17582 }, { 50,-17582 }, { 51,-17582 }, + + { 52,-17582 }, { 53,-17582 }, { 54,-17582 }, { 55,-17582 }, { 56,-17582 }, + { 57,-17582 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-17582 }, { 66,-17582 }, + { 67,-17582 }, { 68,-17582 }, { 69,-17582 }, { 70,-17582 }, { 71,-17582 }, + { 72,-17582 }, { 73,-17582 }, { 74,-17582 }, { 75,-17582 }, { 76,14911 }, + { 77,-17582 }, { 78,-17582 }, { 79,-17582 }, { 80,-17582 }, { 81,-17582 }, + { 82,-17582 }, { 83,-17582 }, { 84,-17582 }, { 85,-17582 }, { 86,-17582 }, + { 87,-17582 }, { 88,-17582 }, { 89,-17582 }, { 90,-17582 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-17582 }, { 0, 0 }, + { 97,-17582 }, { 98,-17582 }, { 99,-17582 }, { 100,-17582 }, { 101,-17582 }, + + { 102,-17582 }, { 103,-17582 }, { 104,-17582 }, { 105,-17582 }, { 106,-17582 }, + { 107,-17582 }, { 108,14911 }, { 109,-17582 }, { 110,-17582 }, { 111,-17582 }, + { 112,-17582 }, { 113,-17582 }, { 114,-17582 }, { 115,-17582 }, { 116,-17582 }, + { 117,-17582 }, { 118,-17582 }, { 119,-17582 }, { 120,-17582 }, { 121,-17582 }, + { 122,-17582 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-17582 }, { 128,-17582 }, { 129,-17582 }, { 130,-17582 }, { 131,-17582 }, + { 132,-17582 }, { 133,-17582 }, { 134,-17582 }, { 135,-17582 }, { 136,-17582 }, + { 137,-17582 }, { 138,-17582 }, { 139,-17582 }, { 140,-17582 }, { 141,-17582 }, + { 142,-17582 }, { 143,-17582 }, { 144,-17582 }, { 145,-17582 }, { 146,-17582 }, + { 147,-17582 }, { 148,-17582 }, { 149,-17582 }, { 150,-17582 }, { 151,-17582 }, + + { 152,-17582 }, { 153,-17582 }, { 154,-17582 }, { 155,-17582 }, { 156,-17582 }, + { 157,-17582 }, { 158,-17582 }, { 159,-17582 }, { 160,-17582 }, { 161,-17582 }, + { 162,-17582 }, { 163,-17582 }, { 164,-17582 }, { 165,-17582 }, { 166,-17582 }, + { 167,-17582 }, { 168,-17582 }, { 169,-17582 }, { 170,-17582 }, { 171,-17582 }, + { 172,-17582 }, { 173,-17582 }, { 174,-17582 }, { 175,-17582 }, { 176,-17582 }, + { 177,-17582 }, { 178,-17582 }, { 179,-17582 }, { 180,-17582 }, { 181,-17582 }, + { 182,-17582 }, { 183,-17582 }, { 184,-17582 }, { 185,-17582 }, { 186,-17582 }, + { 187,-17582 }, { 188,-17582 }, { 189,-17582 }, { 190,-17582 }, { 191,-17582 }, + { 192,-17582 }, { 193,-17582 }, { 194,-17582 }, { 195,-17582 }, { 196,-17582 }, + { 197,-17582 }, { 198,-17582 }, { 199,-17582 }, { 200,-17582 }, { 201,-17582 }, + + { 202,-17582 }, { 203,-17582 }, { 204,-17582 }, { 205,-17582 }, { 206,-17582 }, + { 207,-17582 }, { 208,-17582 }, { 209,-17582 }, { 210,-17582 }, { 211,-17582 }, + { 212,-17582 }, { 213,-17582 }, { 214,-17582 }, { 215,-17582 }, { 216,-17582 }, + { 217,-17582 }, { 218,-17582 }, { 219,-17582 }, { 220,-17582 }, { 221,-17582 }, + { 222,-17582 }, { 223,-17582 }, { 224,-17582 }, { 225,-17582 }, { 226,-17582 }, + { 227,-17582 }, { 228,-17582 }, { 229,-17582 }, { 230,-17582 }, { 231,-17582 }, + { 232,-17582 }, { 233,-17582 }, { 234,-17582 }, { 235,-17582 }, { 236,-17582 }, + { 237,-17582 }, { 238,-17582 }, { 239,-17582 }, { 240,-17582 }, { 241,-17582 }, + { 242,-17582 }, { 243,-17582 }, { 244,-17582 }, { 245,-17582 }, { 246,-17582 }, + { 247,-17582 }, { 248,-17582 }, { 249,-17582 }, { 250,-17582 }, { 251,-17582 }, + + { 252,-17582 }, { 253,-17582 }, { 254,-17582 }, { 255,-17582 }, { 0, 131 }, + { 0,74284 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-17839 }, { 49,-17839 }, + { 50,-17839 }, { 51,-17839 }, { 52,-17839 }, { 53,-17839 }, { 54,-17839 }, + { 55,-17839 }, { 56,-17839 }, { 57,-17839 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,14911 }, { 66,-17839 }, { 67,-17839 }, { 68,-17839 }, { 69,-17839 }, + { 70,-17839 }, { 71,-17839 }, { 72,-17839 }, { 73,-17839 }, { 74,-17839 }, + { 75,-17839 }, { 76,-17839 }, { 77,-17839 }, { 78,-17839 }, { 79,-17839 }, + { 80,-17839 }, { 81,-17839 }, { 82,-17839 }, { 83,-17839 }, { 84,-17839 }, + { 85,-17839 }, { 86,-17839 }, { 87,-17839 }, { 88,-17839 }, { 89,-17839 }, + { 90,-17839 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 95,-17839 }, { 0, 0 }, { 97,14911 }, { 98,-17839 }, { 99,-17839 }, + { 100,-17839 }, { 101,-17839 }, { 102,-17839 }, { 103,-17839 }, { 104,-17839 }, + { 105,-17839 }, { 106,-17839 }, { 107,-17839 }, { 108,-17839 }, { 109,-17839 }, + { 110,-17839 }, { 111,-17839 }, { 112,-17839 }, { 113,-17839 }, { 114,-17839 }, + { 115,-17839 }, { 116,-17839 }, { 117,-17839 }, { 118,-17839 }, { 119,-17839 }, + { 120,-17839 }, { 121,-17839 }, { 122,-17839 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-17839 }, { 128,-17839 }, { 129,-17839 }, + { 130,-17839 }, { 131,-17839 }, { 132,-17839 }, { 133,-17839 }, { 134,-17839 }, + { 135,-17839 }, { 136,-17839 }, { 137,-17839 }, { 138,-17839 }, { 139,-17839 }, + { 140,-17839 }, { 141,-17839 }, { 142,-17839 }, { 143,-17839 }, { 144,-17839 }, + + { 145,-17839 }, { 146,-17839 }, { 147,-17839 }, { 148,-17839 }, { 149,-17839 }, + { 150,-17839 }, { 151,-17839 }, { 152,-17839 }, { 153,-17839 }, { 154,-17839 }, + { 155,-17839 }, { 156,-17839 }, { 157,-17839 }, { 158,-17839 }, { 159,-17839 }, + { 160,-17839 }, { 161,-17839 }, { 162,-17839 }, { 163,-17839 }, { 164,-17839 }, + { 165,-17839 }, { 166,-17839 }, { 167,-17839 }, { 168,-17839 }, { 169,-17839 }, + { 170,-17839 }, { 171,-17839 }, { 172,-17839 }, { 173,-17839 }, { 174,-17839 }, + { 175,-17839 }, { 176,-17839 }, { 177,-17839 }, { 178,-17839 }, { 179,-17839 }, + { 180,-17839 }, { 181,-17839 }, { 182,-17839 }, { 183,-17839 }, { 184,-17839 }, + { 185,-17839 }, { 186,-17839 }, { 187,-17839 }, { 188,-17839 }, { 189,-17839 }, + { 190,-17839 }, { 191,-17839 }, { 192,-17839 }, { 193,-17839 }, { 194,-17839 }, + + { 195,-17839 }, { 196,-17839 }, { 197,-17839 }, { 198,-17839 }, { 199,-17839 }, + { 200,-17839 }, { 201,-17839 }, { 202,-17839 }, { 203,-17839 }, { 204,-17839 }, + { 205,-17839 }, { 206,-17839 }, { 207,-17839 }, { 208,-17839 }, { 209,-17839 }, + { 210,-17839 }, { 211,-17839 }, { 212,-17839 }, { 213,-17839 }, { 214,-17839 }, + { 215,-17839 }, { 216,-17839 }, { 217,-17839 }, { 218,-17839 }, { 219,-17839 }, + { 220,-17839 }, { 221,-17839 }, { 222,-17839 }, { 223,-17839 }, { 224,-17839 }, + { 225,-17839 }, { 226,-17839 }, { 227,-17839 }, { 228,-17839 }, { 229,-17839 }, + { 230,-17839 }, { 231,-17839 }, { 232,-17839 }, { 233,-17839 }, { 234,-17839 }, + { 235,-17839 }, { 236,-17839 }, { 237,-17839 }, { 238,-17839 }, { 239,-17839 }, + { 240,-17839 }, { 241,-17839 }, { 242,-17839 }, { 243,-17839 }, { 244,-17839 }, + + { 245,-17839 }, { 246,-17839 }, { 247,-17839 }, { 248,-17839 }, { 249,-17839 }, + { 250,-17839 }, { 251,-17839 }, { 252,-17839 }, { 253,-17839 }, { 254,-17839 }, + { 255,-17839 }, { 0, 131 }, { 0,74027 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-18096 }, { 49,-18096 }, { 50,-18096 }, { 51,-18096 }, { 52,-18096 }, + { 53,-18096 }, { 54,-18096 }, { 55,-18096 }, { 56,-18096 }, { 57,-18096 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-18096 }, { 66,-18096 }, { 67,-18096 }, + { 68,-18096 }, { 69,-18096 }, { 70,-18096 }, { 71,-18096 }, { 72,-18096 }, + { 73,-18096 }, { 74,-18096 }, { 75,-18096 }, { 76,-18096 }, { 77,-18096 }, + { 78,-18096 }, { 79,14911 }, { 80,-18096 }, { 81,-18096 }, { 82,-18096 }, + { 83,-18096 }, { 84,-18096 }, { 85,-18096 }, { 86,-18096 }, { 87,-18096 }, + + { 88,-18096 }, { 89,-18096 }, { 90,-18096 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-18096 }, { 0, 0 }, { 97,-18096 }, + { 98,-18096 }, { 99,-18096 }, { 100,-18096 }, { 101,-18096 }, { 102,-18096 }, + { 103,-18096 }, { 104,-18096 }, { 105,-18096 }, { 106,-18096 }, { 107,-18096 }, + { 108,-18096 }, { 109,-18096 }, { 110,-18096 }, { 111,14911 }, { 112,-18096 }, + { 113,-18096 }, { 114,-18096 }, { 115,-18096 }, { 116,-18096 }, { 117,-18096 }, + { 118,-18096 }, { 119,-18096 }, { 120,-18096 }, { 121,-18096 }, { 122,-18096 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-18096 }, + { 128,-18096 }, { 129,-18096 }, { 130,-18096 }, { 131,-18096 }, { 132,-18096 }, + { 133,-18096 }, { 134,-18096 }, { 135,-18096 }, { 136,-18096 }, { 137,-18096 }, + + { 138,-18096 }, { 139,-18096 }, { 140,-18096 }, { 141,-18096 }, { 142,-18096 }, + { 143,-18096 }, { 144,-18096 }, { 145,-18096 }, { 146,-18096 }, { 147,-18096 }, + { 148,-18096 }, { 149,-18096 }, { 150,-18096 }, { 151,-18096 }, { 152,-18096 }, + { 153,-18096 }, { 154,-18096 }, { 155,-18096 }, { 156,-18096 }, { 157,-18096 }, + { 158,-18096 }, { 159,-18096 }, { 160,-18096 }, { 161,-18096 }, { 162,-18096 }, + { 163,-18096 }, { 164,-18096 }, { 165,-18096 }, { 166,-18096 }, { 167,-18096 }, + { 168,-18096 }, { 169,-18096 }, { 170,-18096 }, { 171,-18096 }, { 172,-18096 }, + { 173,-18096 }, { 174,-18096 }, { 175,-18096 }, { 176,-18096 }, { 177,-18096 }, + { 178,-18096 }, { 179,-18096 }, { 180,-18096 }, { 181,-18096 }, { 182,-18096 }, + { 183,-18096 }, { 184,-18096 }, { 185,-18096 }, { 186,-18096 }, { 187,-18096 }, + + { 188,-18096 }, { 189,-18096 }, { 190,-18096 }, { 191,-18096 }, { 192,-18096 }, + { 193,-18096 }, { 194,-18096 }, { 195,-18096 }, { 196,-18096 }, { 197,-18096 }, + { 198,-18096 }, { 199,-18096 }, { 200,-18096 }, { 201,-18096 }, { 202,-18096 }, + { 203,-18096 }, { 204,-18096 }, { 205,-18096 }, { 206,-18096 }, { 207,-18096 }, + { 208,-18096 }, { 209,-18096 }, { 210,-18096 }, { 211,-18096 }, { 212,-18096 }, + { 213,-18096 }, { 214,-18096 }, { 215,-18096 }, { 216,-18096 }, { 217,-18096 }, + { 218,-18096 }, { 219,-18096 }, { 220,-18096 }, { 221,-18096 }, { 222,-18096 }, + { 223,-18096 }, { 224,-18096 }, { 225,-18096 }, { 226,-18096 }, { 227,-18096 }, + { 228,-18096 }, { 229,-18096 }, { 230,-18096 }, { 231,-18096 }, { 232,-18096 }, + { 233,-18096 }, { 234,-18096 }, { 235,-18096 }, { 236,-18096 }, { 237,-18096 }, + + { 238,-18096 }, { 239,-18096 }, { 240,-18096 }, { 241,-18096 }, { 242,-18096 }, + { 243,-18096 }, { 244,-18096 }, { 245,-18096 }, { 246,-18096 }, { 247,-18096 }, + { 248,-18096 }, { 249,-18096 }, { 250,-18096 }, { 251,-18096 }, { 252,-18096 }, + { 253,-18096 }, { 254,-18096 }, { 255,-18096 }, { 0, 131 }, { 0,73770 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-18353 }, { 49,-18353 }, { 50,-18353 }, + { 51,-18353 }, { 52,-18353 }, { 53,-18353 }, { 54,-18353 }, { 55,-18353 }, + { 56,-18353 }, { 57,-18353 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-18353 }, + { 66,-18353 }, { 67,-18353 }, { 68,-18353 }, { 69,14911 }, { 70,-18353 }, + { 71,-18353 }, { 72,-18353 }, { 73,-18353 }, { 74,-18353 }, { 75,-18353 }, + { 76,-18353 }, { 77,-18353 }, { 78,-18353 }, { 79,-18353 }, { 80,-18353 }, + + { 81,-18353 }, { 82,-18353 }, { 83,-18353 }, { 84,-18353 }, { 85,-18353 }, + { 86,-18353 }, { 87,-18353 }, { 88,-18353 }, { 89,-18353 }, { 90,-18353 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-18353 }, + { 0, 0 }, { 97,-18353 }, { 98,-18353 }, { 99,-18353 }, { 100,-18353 }, + { 101,14911 }, { 102,-18353 }, { 103,-18353 }, { 104,-18353 }, { 105,-18353 }, + { 106,-18353 }, { 107,-18353 }, { 108,-18353 }, { 109,-18353 }, { 110,-18353 }, + { 111,-18353 }, { 112,-18353 }, { 113,-18353 }, { 114,-18353 }, { 115,-18353 }, + { 116,-18353 }, { 117,-18353 }, { 118,-18353 }, { 119,-18353 }, { 120,-18353 }, + { 121,-18353 }, { 122,-18353 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-18353 }, { 128,-18353 }, { 129,-18353 }, { 130,-18353 }, + + { 131,-18353 }, { 132,-18353 }, { 133,-18353 }, { 134,-18353 }, { 135,-18353 }, + { 136,-18353 }, { 137,-18353 }, { 138,-18353 }, { 139,-18353 }, { 140,-18353 }, + { 141,-18353 }, { 142,-18353 }, { 143,-18353 }, { 144,-18353 }, { 145,-18353 }, + { 146,-18353 }, { 147,-18353 }, { 148,-18353 }, { 149,-18353 }, { 150,-18353 }, + { 151,-18353 }, { 152,-18353 }, { 153,-18353 }, { 154,-18353 }, { 155,-18353 }, + { 156,-18353 }, { 157,-18353 }, { 158,-18353 }, { 159,-18353 }, { 160,-18353 }, + { 161,-18353 }, { 162,-18353 }, { 163,-18353 }, { 164,-18353 }, { 165,-18353 }, + { 166,-18353 }, { 167,-18353 }, { 168,-18353 }, { 169,-18353 }, { 170,-18353 }, + { 171,-18353 }, { 172,-18353 }, { 173,-18353 }, { 174,-18353 }, { 175,-18353 }, + { 176,-18353 }, { 177,-18353 }, { 178,-18353 }, { 179,-18353 }, { 180,-18353 }, + + { 181,-18353 }, { 182,-18353 }, { 183,-18353 }, { 184,-18353 }, { 185,-18353 }, + { 186,-18353 }, { 187,-18353 }, { 188,-18353 }, { 189,-18353 }, { 190,-18353 }, + { 191,-18353 }, { 192,-18353 }, { 193,-18353 }, { 194,-18353 }, { 195,-18353 }, + { 196,-18353 }, { 197,-18353 }, { 198,-18353 }, { 199,-18353 }, { 200,-18353 }, + { 201,-18353 }, { 202,-18353 }, { 203,-18353 }, { 204,-18353 }, { 205,-18353 }, + { 206,-18353 }, { 207,-18353 }, { 208,-18353 }, { 209,-18353 }, { 210,-18353 }, + { 211,-18353 }, { 212,-18353 }, { 213,-18353 }, { 214,-18353 }, { 215,-18353 }, + { 216,-18353 }, { 217,-18353 }, { 218,-18353 }, { 219,-18353 }, { 220,-18353 }, + { 221,-18353 }, { 222,-18353 }, { 223,-18353 }, { 224,-18353 }, { 225,-18353 }, + { 226,-18353 }, { 227,-18353 }, { 228,-18353 }, { 229,-18353 }, { 230,-18353 }, + + { 231,-18353 }, { 232,-18353 }, { 233,-18353 }, { 234,-18353 }, { 235,-18353 }, + { 236,-18353 }, { 237,-18353 }, { 238,-18353 }, { 239,-18353 }, { 240,-18353 }, + { 241,-18353 }, { 242,-18353 }, { 243,-18353 }, { 244,-18353 }, { 245,-18353 }, + { 246,-18353 }, { 247,-18353 }, { 248,-18353 }, { 249,-18353 }, { 250,-18353 }, + { 251,-18353 }, { 252,-18353 }, { 253,-18353 }, { 254,-18353 }, { 255,-18353 }, + { 0, 131 }, { 0,73513 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-18610 }, + { 49,-18610 }, { 50,-18610 }, { 51,-18610 }, { 52,-18610 }, { 53,-18610 }, + { 54,-18610 }, { 55,-18610 }, { 56,-18610 }, { 57,-18610 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-18610 }, { 66,-18610 }, { 67,-18610 }, { 68,-18610 }, + { 69,-18610 }, { 70,-18610 }, { 71,-18610 }, { 72,-18610 }, { 73,-18610 }, + + { 74,-18610 }, { 75,-18610 }, { 76,-18610 }, { 77,-18610 }, { 78,-18610 }, + { 79,-18610 }, { 80,-18610 }, { 81,-18610 }, { 82,-18610 }, { 83,-18610 }, + { 84,14911 }, { 85,-18610 }, { 86,-18610 }, { 87,-18610 }, { 88,-18610 }, + { 89,-18610 }, { 90,-18610 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-18610 }, { 0, 0 }, { 97,-18610 }, { 98,-18610 }, + { 99,-18610 }, { 100,-18610 }, { 101,-18610 }, { 102,-18610 }, { 103,-18610 }, + { 104,-18610 }, { 105,-18610 }, { 106,-18610 }, { 107,-18610 }, { 108,-18610 }, + { 109,-18610 }, { 110,-18610 }, { 111,-18610 }, { 112,-18610 }, { 113,-18610 }, + { 114,-18610 }, { 115,-18610 }, { 116,14911 }, { 117,-18610 }, { 118,-18610 }, + { 119,-18610 }, { 120,-18610 }, { 121,-18610 }, { 122,-18610 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-18610 }, { 128,-18610 }, + { 129,-18610 }, { 130,-18610 }, { 131,-18610 }, { 132,-18610 }, { 133,-18610 }, + { 134,-18610 }, { 135,-18610 }, { 136,-18610 }, { 137,-18610 }, { 138,-18610 }, + { 139,-18610 }, { 140,-18610 }, { 141,-18610 }, { 142,-18610 }, { 143,-18610 }, + { 144,-18610 }, { 145,-18610 }, { 146,-18610 }, { 147,-18610 }, { 148,-18610 }, + { 149,-18610 }, { 150,-18610 }, { 151,-18610 }, { 152,-18610 }, { 153,-18610 }, + { 154,-18610 }, { 155,-18610 }, { 156,-18610 }, { 157,-18610 }, { 158,-18610 }, + { 159,-18610 }, { 160,-18610 }, { 161,-18610 }, { 162,-18610 }, { 163,-18610 }, + { 164,-18610 }, { 165,-18610 }, { 166,-18610 }, { 167,-18610 }, { 168,-18610 }, + { 169,-18610 }, { 170,-18610 }, { 171,-18610 }, { 172,-18610 }, { 173,-18610 }, + + { 174,-18610 }, { 175,-18610 }, { 176,-18610 }, { 177,-18610 }, { 178,-18610 }, + { 179,-18610 }, { 180,-18610 }, { 181,-18610 }, { 182,-18610 }, { 183,-18610 }, + { 184,-18610 }, { 185,-18610 }, { 186,-18610 }, { 187,-18610 }, { 188,-18610 }, + { 189,-18610 }, { 190,-18610 }, { 191,-18610 }, { 192,-18610 }, { 193,-18610 }, + { 194,-18610 }, { 195,-18610 }, { 196,-18610 }, { 197,-18610 }, { 198,-18610 }, + { 199,-18610 }, { 200,-18610 }, { 201,-18610 }, { 202,-18610 }, { 203,-18610 }, + { 204,-18610 }, { 205,-18610 }, { 206,-18610 }, { 207,-18610 }, { 208,-18610 }, + { 209,-18610 }, { 210,-18610 }, { 211,-18610 }, { 212,-18610 }, { 213,-18610 }, + { 214,-18610 }, { 215,-18610 }, { 216,-18610 }, { 217,-18610 }, { 218,-18610 }, + { 219,-18610 }, { 220,-18610 }, { 221,-18610 }, { 222,-18610 }, { 223,-18610 }, + + { 224,-18610 }, { 225,-18610 }, { 226,-18610 }, { 227,-18610 }, { 228,-18610 }, + { 229,-18610 }, { 230,-18610 }, { 231,-18610 }, { 232,-18610 }, { 233,-18610 }, + { 234,-18610 }, { 235,-18610 }, { 236,-18610 }, { 237,-18610 }, { 238,-18610 }, + { 239,-18610 }, { 240,-18610 }, { 241,-18610 }, { 242,-18610 }, { 243,-18610 }, + { 244,-18610 }, { 245,-18610 }, { 246,-18610 }, { 247,-18610 }, { 248,-18610 }, + { 249,-18610 }, { 250,-18610 }, { 251,-18610 }, { 252,-18610 }, { 253,-18610 }, + { 254,-18610 }, { 255,-18610 }, { 0, 131 }, { 0,73256 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-18867 }, { 49,-18867 }, { 50,-18867 }, { 51,-18867 }, + { 52,-18867 }, { 53,-18867 }, { 54,-18867 }, { 55,-18867 }, { 56,-18867 }, + { 57,-18867 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-18867 }, { 66,-18867 }, + + { 67,-18867 }, { 68,14911 }, { 69,-18867 }, { 70,15168 }, { 71,-18867 }, + { 72,-18867 }, { 73,15425 }, { 74,-18867 }, { 75,-18867 }, { 76,-18867 }, + { 77,-18867 }, { 78,-18867 }, { 79,-18867 }, { 80,-18867 }, { 81,-18867 }, + { 82,-18867 }, { 83,15682 }, { 84,-18867 }, { 85,-18867 }, { 86,-18867 }, + { 87,15939 }, { 88,-18867 }, { 89,-18867 }, { 90,-18867 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-18867 }, { 0, 0 }, + { 97,-18867 }, { 98,-18867 }, { 99,-18867 }, { 100,14911 }, { 101,-18867 }, + { 102,15168 }, { 103,-18867 }, { 104,-18867 }, { 105,15425 }, { 106,-18867 }, + { 107,-18867 }, { 108,-18867 }, { 109,-18867 }, { 110,-18867 }, { 111,-18867 }, + { 112,-18867 }, { 113,-18867 }, { 114,-18867 }, { 115,15682 }, { 116,-18867 }, + + { 117,-18867 }, { 118,-18867 }, { 119,15939 }, { 120,-18867 }, { 121,-18867 }, + { 122,-18867 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-18867 }, { 128,-18867 }, { 129,-18867 }, { 130,-18867 }, { 131,-18867 }, + { 132,-18867 }, { 133,-18867 }, { 134,-18867 }, { 135,-18867 }, { 136,-18867 }, + { 137,-18867 }, { 138,-18867 }, { 139,-18867 }, { 140,-18867 }, { 141,-18867 }, + { 142,-18867 }, { 143,-18867 }, { 144,-18867 }, { 145,-18867 }, { 146,-18867 }, + { 147,-18867 }, { 148,-18867 }, { 149,-18867 }, { 150,-18867 }, { 151,-18867 }, + { 152,-18867 }, { 153,-18867 }, { 154,-18867 }, { 155,-18867 }, { 156,-18867 }, + { 157,-18867 }, { 158,-18867 }, { 159,-18867 }, { 160,-18867 }, { 161,-18867 }, + { 162,-18867 }, { 163,-18867 }, { 164,-18867 }, { 165,-18867 }, { 166,-18867 }, + + { 167,-18867 }, { 168,-18867 }, { 169,-18867 }, { 170,-18867 }, { 171,-18867 }, + { 172,-18867 }, { 173,-18867 }, { 174,-18867 }, { 175,-18867 }, { 176,-18867 }, + { 177,-18867 }, { 178,-18867 }, { 179,-18867 }, { 180,-18867 }, { 181,-18867 }, + { 182,-18867 }, { 183,-18867 }, { 184,-18867 }, { 185,-18867 }, { 186,-18867 }, + { 187,-18867 }, { 188,-18867 }, { 189,-18867 }, { 190,-18867 }, { 191,-18867 }, + { 192,-18867 }, { 193,-18867 }, { 194,-18867 }, { 195,-18867 }, { 196,-18867 }, + { 197,-18867 }, { 198,-18867 }, { 199,-18867 }, { 200,-18867 }, { 201,-18867 }, + { 202,-18867 }, { 203,-18867 }, { 204,-18867 }, { 205,-18867 }, { 206,-18867 }, + { 207,-18867 }, { 208,-18867 }, { 209,-18867 }, { 210,-18867 }, { 211,-18867 }, + { 212,-18867 }, { 213,-18867 }, { 214,-18867 }, { 215,-18867 }, { 216,-18867 }, + + { 217,-18867 }, { 218,-18867 }, { 219,-18867 }, { 220,-18867 }, { 221,-18867 }, + { 222,-18867 }, { 223,-18867 }, { 224,-18867 }, { 225,-18867 }, { 226,-18867 }, + { 227,-18867 }, { 228,-18867 }, { 229,-18867 }, { 230,-18867 }, { 231,-18867 }, + { 232,-18867 }, { 233,-18867 }, { 234,-18867 }, { 235,-18867 }, { 236,-18867 }, + { 237,-18867 }, { 238,-18867 }, { 239,-18867 }, { 240,-18867 }, { 241,-18867 }, + { 242,-18867 }, { 243,-18867 }, { 244,-18867 }, { 245,-18867 }, { 246,-18867 }, + { 247,-18867 }, { 248,-18867 }, { 249,-18867 }, { 250,-18867 }, { 251,-18867 }, + { 252,-18867 }, { 253,-18867 }, { 254,-18867 }, { 255,-18867 }, { 0, 131 }, + { 0,72999 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-19124 }, { 49,-19124 }, + { 50,-19124 }, { 51,-19124 }, { 52,-19124 }, { 53,-19124 }, { 54,-19124 }, + { 55,-19124 }, { 56,-19124 }, { 57,-19124 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-19124 }, { 66,-19124 }, { 67,-19124 }, { 68,-19124 }, { 69,-19124 }, + { 70,-19124 }, { 71,-19124 }, { 72,-19124 }, { 73,-19124 }, { 74,-19124 }, + { 75,-19124 }, { 76,15939 }, { 77,-19124 }, { 78,-19124 }, { 79,-19124 }, + { 80,-19124 }, { 81,-19124 }, { 82,-19124 }, { 83,-19124 }, { 84,-19124 }, + { 85,-19124 }, { 86,-19124 }, { 87,-19124 }, { 88,-19124 }, { 89,-19124 }, + { 90,-19124 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-19124 }, { 0, 0 }, { 97,-19124 }, { 98,-19124 }, { 99,-19124 }, + { 100,-19124 }, { 101,-19124 }, { 102,-19124 }, { 103,-19124 }, { 104,-19124 }, + { 105,-19124 }, { 106,-19124 }, { 107,-19124 }, { 108,15939 }, { 109,-19124 }, + + { 110,-19124 }, { 111,-19124 }, { 112,-19124 }, { 113,-19124 }, { 114,-19124 }, + { 115,-19124 }, { 116,-19124 }, { 117,-19124 }, { 118,-19124 }, { 119,-19124 }, + { 120,-19124 }, { 121,-19124 }, { 122,-19124 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-19124 }, { 128,-19124 }, { 129,-19124 }, + { 130,-19124 }, { 131,-19124 }, { 132,-19124 }, { 133,-19124 }, { 134,-19124 }, + { 135,-19124 }, { 136,-19124 }, { 137,-19124 }, { 138,-19124 }, { 139,-19124 }, + { 140,-19124 }, { 141,-19124 }, { 142,-19124 }, { 143,-19124 }, { 144,-19124 }, + { 145,-19124 }, { 146,-19124 }, { 147,-19124 }, { 148,-19124 }, { 149,-19124 }, + { 150,-19124 }, { 151,-19124 }, { 152,-19124 }, { 153,-19124 }, { 154,-19124 }, + { 155,-19124 }, { 156,-19124 }, { 157,-19124 }, { 158,-19124 }, { 159,-19124 }, + + { 160,-19124 }, { 161,-19124 }, { 162,-19124 }, { 163,-19124 }, { 164,-19124 }, + { 165,-19124 }, { 166,-19124 }, { 167,-19124 }, { 168,-19124 }, { 169,-19124 }, + { 170,-19124 }, { 171,-19124 }, { 172,-19124 }, { 173,-19124 }, { 174,-19124 }, + { 175,-19124 }, { 176,-19124 }, { 177,-19124 }, { 178,-19124 }, { 179,-19124 }, + { 180,-19124 }, { 181,-19124 }, { 182,-19124 }, { 183,-19124 }, { 184,-19124 }, + { 185,-19124 }, { 186,-19124 }, { 187,-19124 }, { 188,-19124 }, { 189,-19124 }, + { 190,-19124 }, { 191,-19124 }, { 192,-19124 }, { 193,-19124 }, { 194,-19124 }, + { 195,-19124 }, { 196,-19124 }, { 197,-19124 }, { 198,-19124 }, { 199,-19124 }, + { 200,-19124 }, { 201,-19124 }, { 202,-19124 }, { 203,-19124 }, { 204,-19124 }, + { 205,-19124 }, { 206,-19124 }, { 207,-19124 }, { 208,-19124 }, { 209,-19124 }, + + { 210,-19124 }, { 211,-19124 }, { 212,-19124 }, { 213,-19124 }, { 214,-19124 }, + { 215,-19124 }, { 216,-19124 }, { 217,-19124 }, { 218,-19124 }, { 219,-19124 }, + { 220,-19124 }, { 221,-19124 }, { 222,-19124 }, { 223,-19124 }, { 224,-19124 }, + { 225,-19124 }, { 226,-19124 }, { 227,-19124 }, { 228,-19124 }, { 229,-19124 }, + { 230,-19124 }, { 231,-19124 }, { 232,-19124 }, { 233,-19124 }, { 234,-19124 }, + { 235,-19124 }, { 236,-19124 }, { 237,-19124 }, { 238,-19124 }, { 239,-19124 }, + { 240,-19124 }, { 241,-19124 }, { 242,-19124 }, { 243,-19124 }, { 244,-19124 }, + { 245,-19124 }, { 246,-19124 }, { 247,-19124 }, { 248,-19124 }, { 249,-19124 }, + { 250,-19124 }, { 251,-19124 }, { 252,-19124 }, { 253,-19124 }, { 254,-19124 }, + { 255,-19124 }, { 0, 131 }, { 0,72742 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-19381 }, { 49,-19381 }, { 50,-19381 }, { 51,-19381 }, { 52,-19381 }, + + { 53,-19381 }, { 54,-19381 }, { 55,-19381 }, { 56,-19381 }, { 57,-19381 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-19381 }, { 66,-19381 }, { 67,-19381 }, + { 68,-19381 }, { 69,-19381 }, { 70,-19381 }, { 71,-19381 }, { 72,-19381 }, + { 73,-19381 }, { 74,-19381 }, { 75,-19381 }, { 76,-19381 }, { 77,-19381 }, + { 78,-19381 }, { 79,-19381 }, { 80,-19381 }, { 81,-19381 }, { 82,-19381 }, + { 83,-19381 }, { 84,15939 }, { 85,-19381 }, { 86,-19381 }, { 87,-19381 }, + { 88,-19381 }, { 89,-19381 }, { 90,-19381 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-19381 }, { 0, 0 }, { 97,-19381 }, + { 98,-19381 }, { 99,-19381 }, { 100,-19381 }, { 101,-19381 }, { 102,-19381 }, + + { 103,-19381 }, { 104,-19381 }, { 105,-19381 }, { 106,-19381 }, { 107,-19381 }, + { 108,-19381 }, { 109,-19381 }, { 110,-19381 }, { 111,-19381 }, { 112,-19381 }, + { 113,-19381 }, { 114,-19381 }, { 115,-19381 }, { 116,15939 }, { 117,-19381 }, + { 118,-19381 }, { 119,-19381 }, { 120,-19381 }, { 121,-19381 }, { 122,-19381 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-19381 }, + { 128,-19381 }, { 129,-19381 }, { 130,-19381 }, { 131,-19381 }, { 132,-19381 }, + { 133,-19381 }, { 134,-19381 }, { 135,-19381 }, { 136,-19381 }, { 137,-19381 }, + { 138,-19381 }, { 139,-19381 }, { 140,-19381 }, { 141,-19381 }, { 142,-19381 }, + { 143,-19381 }, { 144,-19381 }, { 145,-19381 }, { 146,-19381 }, { 147,-19381 }, + { 148,-19381 }, { 149,-19381 }, { 150,-19381 }, { 151,-19381 }, { 152,-19381 }, + + { 153,-19381 }, { 154,-19381 }, { 155,-19381 }, { 156,-19381 }, { 157,-19381 }, + { 158,-19381 }, { 159,-19381 }, { 160,-19381 }, { 161,-19381 }, { 162,-19381 }, + { 163,-19381 }, { 164,-19381 }, { 165,-19381 }, { 166,-19381 }, { 167,-19381 }, + { 168,-19381 }, { 169,-19381 }, { 170,-19381 }, { 171,-19381 }, { 172,-19381 }, + { 173,-19381 }, { 174,-19381 }, { 175,-19381 }, { 176,-19381 }, { 177,-19381 }, + { 178,-19381 }, { 179,-19381 }, { 180,-19381 }, { 181,-19381 }, { 182,-19381 }, + { 183,-19381 }, { 184,-19381 }, { 185,-19381 }, { 186,-19381 }, { 187,-19381 }, + { 188,-19381 }, { 189,-19381 }, { 190,-19381 }, { 191,-19381 }, { 192,-19381 }, + { 193,-19381 }, { 194,-19381 }, { 195,-19381 }, { 196,-19381 }, { 197,-19381 }, + { 198,-19381 }, { 199,-19381 }, { 200,-19381 }, { 201,-19381 }, { 202,-19381 }, + + { 203,-19381 }, { 204,-19381 }, { 205,-19381 }, { 206,-19381 }, { 207,-19381 }, + { 208,-19381 }, { 209,-19381 }, { 210,-19381 }, { 211,-19381 }, { 212,-19381 }, + { 213,-19381 }, { 214,-19381 }, { 215,-19381 }, { 216,-19381 }, { 217,-19381 }, + { 218,-19381 }, { 219,-19381 }, { 220,-19381 }, { 221,-19381 }, { 222,-19381 }, + { 223,-19381 }, { 224,-19381 }, { 225,-19381 }, { 226,-19381 }, { 227,-19381 }, + { 228,-19381 }, { 229,-19381 }, { 230,-19381 }, { 231,-19381 }, { 232,-19381 }, + { 233,-19381 }, { 234,-19381 }, { 235,-19381 }, { 236,-19381 }, { 237,-19381 }, + { 238,-19381 }, { 239,-19381 }, { 240,-19381 }, { 241,-19381 }, { 242,-19381 }, + { 243,-19381 }, { 244,-19381 }, { 245,-19381 }, { 246,-19381 }, { 247,-19381 }, + { 248,-19381 }, { 249,-19381 }, { 250,-19381 }, { 251,-19381 }, { 252,-19381 }, + + { 253,-19381 }, { 254,-19381 }, { 255,-19381 }, { 0, 131 }, { 0,72485 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 48,-19638 }, { 49,-19638 }, { 50,-19638 }, + { 51,-19638 }, { 52,-19638 }, { 53,-19638 }, { 54,-19638 }, { 55,-19638 }, + { 56,-19638 }, { 57,-19638 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-19638 }, + { 66,-19638 }, { 67,-19638 }, { 68,-19638 }, { 69,15939 }, { 70,-19638 }, + { 71,-19638 }, { 72,-19638 }, { 73,-19638 }, { 74,-19638 }, { 75,-19638 }, + { 76,-19638 }, { 77,-19638 }, { 78,-19638 }, { 79,-19638 }, { 80,-19638 }, + { 81,-19638 }, { 82,-19638 }, { 83,-19638 }, { 84,-19638 }, { 85,-19638 }, + { 86,-19638 }, { 87,-19638 }, { 88,-19638 }, { 89,-19638 }, { 90,-19638 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-19638 }, + + { 0, 0 }, { 97,-19638 }, { 98,-19638 }, { 99,-19638 }, { 100,-19638 }, + { 101,15939 }, { 102,-19638 }, { 103,-19638 }, { 104,-19638 }, { 105,-19638 }, + { 106,-19638 }, { 107,-19638 }, { 108,-19638 }, { 109,-19638 }, { 110,-19638 }, + { 111,-19638 }, { 112,-19638 }, { 113,-19638 }, { 114,-19638 }, { 115,-19638 }, + { 116,-19638 }, { 117,-19638 }, { 118,-19638 }, { 119,-19638 }, { 120,-19638 }, + { 121,-19638 }, { 122,-19638 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-19638 }, { 128,-19638 }, { 129,-19638 }, { 130,-19638 }, + { 131,-19638 }, { 132,-19638 }, { 133,-19638 }, { 134,-19638 }, { 135,-19638 }, + { 136,-19638 }, { 137,-19638 }, { 138,-19638 }, { 139,-19638 }, { 140,-19638 }, + { 141,-19638 }, { 142,-19638 }, { 143,-19638 }, { 144,-19638 }, { 145,-19638 }, + + { 146,-19638 }, { 147,-19638 }, { 148,-19638 }, { 149,-19638 }, { 150,-19638 }, + { 151,-19638 }, { 152,-19638 }, { 153,-19638 }, { 154,-19638 }, { 155,-19638 }, + { 156,-19638 }, { 157,-19638 }, { 158,-19638 }, { 159,-19638 }, { 160,-19638 }, + { 161,-19638 }, { 162,-19638 }, { 163,-19638 }, { 164,-19638 }, { 165,-19638 }, + { 166,-19638 }, { 167,-19638 }, { 168,-19638 }, { 169,-19638 }, { 170,-19638 }, + { 171,-19638 }, { 172,-19638 }, { 173,-19638 }, { 174,-19638 }, { 175,-19638 }, + { 176,-19638 }, { 177,-19638 }, { 178,-19638 }, { 179,-19638 }, { 180,-19638 }, + { 181,-19638 }, { 182,-19638 }, { 183,-19638 }, { 184,-19638 }, { 185,-19638 }, + { 186,-19638 }, { 187,-19638 }, { 188,-19638 }, { 189,-19638 }, { 190,-19638 }, + { 191,-19638 }, { 192,-19638 }, { 193,-19638 }, { 194,-19638 }, { 195,-19638 }, + + { 196,-19638 }, { 197,-19638 }, { 198,-19638 }, { 199,-19638 }, { 200,-19638 }, + { 201,-19638 }, { 202,-19638 }, { 203,-19638 }, { 204,-19638 }, { 205,-19638 }, + { 206,-19638 }, { 207,-19638 }, { 208,-19638 }, { 209,-19638 }, { 210,-19638 }, + { 211,-19638 }, { 212,-19638 }, { 213,-19638 }, { 214,-19638 }, { 215,-19638 }, + { 216,-19638 }, { 217,-19638 }, { 218,-19638 }, { 219,-19638 }, { 220,-19638 }, + { 221,-19638 }, { 222,-19638 }, { 223,-19638 }, { 224,-19638 }, { 225,-19638 }, + { 226,-19638 }, { 227,-19638 }, { 228,-19638 }, { 229,-19638 }, { 230,-19638 }, + { 231,-19638 }, { 232,-19638 }, { 233,-19638 }, { 234,-19638 }, { 235,-19638 }, + { 236,-19638 }, { 237,-19638 }, { 238,-19638 }, { 239,-19638 }, { 240,-19638 }, + { 241,-19638 }, { 242,-19638 }, { 243,-19638 }, { 244,-19638 }, { 245,-19638 }, + + { 246,-19638 }, { 247,-19638 }, { 248,-19638 }, { 249,-19638 }, { 250,-19638 }, + { 251,-19638 }, { 252,-19638 }, { 253,-19638 }, { 254,-19638 }, { 255,-19638 }, + { 0, 131 }, { 0,72228 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-19895 }, + { 49,-19895 }, { 50,-19895 }, { 51,-19895 }, { 52,-19895 }, { 53,-19895 }, + { 54,-19895 }, { 55,-19895 }, { 56,-19895 }, { 57,-19895 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,15939 }, { 66,-19895 }, { 67,-19895 }, { 68,-19895 }, + { 69,-19895 }, { 70,-19895 }, { 71,-19895 }, { 72,-19895 }, { 73,-19895 }, + { 74,-19895 }, { 75,-19895 }, { 76,-19895 }, { 77,-19895 }, { 78,-19895 }, + { 79,-19895 }, { 80,-19895 }, { 81,-19895 }, { 82,-19895 }, { 83,-19895 }, + { 84,-19895 }, { 85,-19895 }, { 86,-19895 }, { 87,-19895 }, { 88,-19895 }, + + { 89,-19895 }, { 90,-19895 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-19895 }, { 0, 0 }, { 97,15939 }, { 98,-19895 }, + { 99,-19895 }, { 100,-19895 }, { 101,-19895 }, { 102,-19895 }, { 103,-19895 }, + { 104,-19895 }, { 105,-19895 }, { 106,-19895 }, { 107,-19895 }, { 108,-19895 }, + { 109,-19895 }, { 110,-19895 }, { 111,-19895 }, { 112,-19895 }, { 113,-19895 }, + { 114,-19895 }, { 115,-19895 }, { 116,-19895 }, { 117,-19895 }, { 118,-19895 }, + { 119,-19895 }, { 120,-19895 }, { 121,-19895 }, { 122,-19895 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-19895 }, { 128,-19895 }, + { 129,-19895 }, { 130,-19895 }, { 131,-19895 }, { 132,-19895 }, { 133,-19895 }, + { 134,-19895 }, { 135,-19895 }, { 136,-19895 }, { 137,-19895 }, { 138,-19895 }, + + { 139,-19895 }, { 140,-19895 }, { 141,-19895 }, { 142,-19895 }, { 143,-19895 }, + { 144,-19895 }, { 145,-19895 }, { 146,-19895 }, { 147,-19895 }, { 148,-19895 }, + { 149,-19895 }, { 150,-19895 }, { 151,-19895 }, { 152,-19895 }, { 153,-19895 }, + { 154,-19895 }, { 155,-19895 }, { 156,-19895 }, { 157,-19895 }, { 158,-19895 }, + { 159,-19895 }, { 160,-19895 }, { 161,-19895 }, { 162,-19895 }, { 163,-19895 }, + { 164,-19895 }, { 165,-19895 }, { 166,-19895 }, { 167,-19895 }, { 168,-19895 }, + { 169,-19895 }, { 170,-19895 }, { 171,-19895 }, { 172,-19895 }, { 173,-19895 }, + { 174,-19895 }, { 175,-19895 }, { 176,-19895 }, { 177,-19895 }, { 178,-19895 }, + { 179,-19895 }, { 180,-19895 }, { 181,-19895 }, { 182,-19895 }, { 183,-19895 }, + { 184,-19895 }, { 185,-19895 }, { 186,-19895 }, { 187,-19895 }, { 188,-19895 }, + + { 189,-19895 }, { 190,-19895 }, { 191,-19895 }, { 192,-19895 }, { 193,-19895 }, + { 194,-19895 }, { 195,-19895 }, { 196,-19895 }, { 197,-19895 }, { 198,-19895 }, + { 199,-19895 }, { 200,-19895 }, { 201,-19895 }, { 202,-19895 }, { 203,-19895 }, + { 204,-19895 }, { 205,-19895 }, { 206,-19895 }, { 207,-19895 }, { 208,-19895 }, + { 209,-19895 }, { 210,-19895 }, { 211,-19895 }, { 212,-19895 }, { 213,-19895 }, + { 214,-19895 }, { 215,-19895 }, { 216,-19895 }, { 217,-19895 }, { 218,-19895 }, + { 219,-19895 }, { 220,-19895 }, { 221,-19895 }, { 222,-19895 }, { 223,-19895 }, + { 224,-19895 }, { 225,-19895 }, { 226,-19895 }, { 227,-19895 }, { 228,-19895 }, + { 229,-19895 }, { 230,-19895 }, { 231,-19895 }, { 232,-19895 }, { 233,-19895 }, + { 234,-19895 }, { 235,-19895 }, { 236,-19895 }, { 237,-19895 }, { 238,-19895 }, + + { 239,-19895 }, { 240,-19895 }, { 241,-19895 }, { 242,-19895 }, { 243,-19895 }, + { 244,-19895 }, { 245,-19895 }, { 246,-19895 }, { 247,-19895 }, { 248,-19895 }, + { 249,-19895 }, { 250,-19895 }, { 251,-19895 }, { 252,-19895 }, { 253,-19895 }, + { 254,-19895 }, { 255,-19895 }, { 0, 39 }, { 0,71971 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-20152 }, { 49,-20152 }, { 50,-20152 }, { 51,-20152 }, + { 52,-20152 }, { 53,-20152 }, { 54,-20152 }, { 55,-20152 }, { 56,-20152 }, + { 57,-20152 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-20152 }, { 66,-20152 }, + { 67,-20152 }, { 68,-20152 }, { 69,15939 }, { 70,-20152 }, { 71,-20152 }, + { 72,-20152 }, { 73,-20152 }, { 74,-20152 }, { 75,-20152 }, { 76,-20152 }, + { 77,-20152 }, { 78,-20152 }, { 79,-20152 }, { 80,-20152 }, { 81,-20152 }, + + { 82,-20152 }, { 83,-20152 }, { 84,-20152 }, { 85,-20152 }, { 86,-20152 }, + { 87,-20152 }, { 88,-20152 }, { 89,-20152 }, { 90,-20152 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-20152 }, { 0, 0 }, + { 97,-20152 }, { 98,-20152 }, { 99,-20152 }, { 100,-20152 }, { 101,15939 }, + { 102,-20152 }, { 103,-20152 }, { 104,-20152 }, { 105,-20152 }, { 106,-20152 }, + { 107,-20152 }, { 108,-20152 }, { 109,-20152 }, { 110,-20152 }, { 111,-20152 }, + { 112,-20152 }, { 113,-20152 }, { 114,-20152 }, { 115,-20152 }, { 116,-20152 }, + { 117,-20152 }, { 118,-20152 }, { 119,-20152 }, { 120,-20152 }, { 121,-20152 }, + { 122,-20152 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-20152 }, { 128,-20152 }, { 129,-20152 }, { 130,-20152 }, { 131,-20152 }, + + { 132,-20152 }, { 133,-20152 }, { 134,-20152 }, { 135,-20152 }, { 136,-20152 }, + { 137,-20152 }, { 138,-20152 }, { 139,-20152 }, { 140,-20152 }, { 141,-20152 }, + { 142,-20152 }, { 143,-20152 }, { 144,-20152 }, { 145,-20152 }, { 146,-20152 }, + { 147,-20152 }, { 148,-20152 }, { 149,-20152 }, { 150,-20152 }, { 151,-20152 }, + { 152,-20152 }, { 153,-20152 }, { 154,-20152 }, { 155,-20152 }, { 156,-20152 }, + { 157,-20152 }, { 158,-20152 }, { 159,-20152 }, { 160,-20152 }, { 161,-20152 }, + { 162,-20152 }, { 163,-20152 }, { 164,-20152 }, { 165,-20152 }, { 166,-20152 }, + { 167,-20152 }, { 168,-20152 }, { 169,-20152 }, { 170,-20152 }, { 171,-20152 }, + { 172,-20152 }, { 173,-20152 }, { 174,-20152 }, { 175,-20152 }, { 176,-20152 }, + { 177,-20152 }, { 178,-20152 }, { 179,-20152 }, { 180,-20152 }, { 181,-20152 }, + + { 182,-20152 }, { 183,-20152 }, { 184,-20152 }, { 185,-20152 }, { 186,-20152 }, + { 187,-20152 }, { 188,-20152 }, { 189,-20152 }, { 190,-20152 }, { 191,-20152 }, + { 192,-20152 }, { 193,-20152 }, { 194,-20152 }, { 195,-20152 }, { 196,-20152 }, + { 197,-20152 }, { 198,-20152 }, { 199,-20152 }, { 200,-20152 }, { 201,-20152 }, + { 202,-20152 }, { 203,-20152 }, { 204,-20152 }, { 205,-20152 }, { 206,-20152 }, + { 207,-20152 }, { 208,-20152 }, { 209,-20152 }, { 210,-20152 }, { 211,-20152 }, + { 212,-20152 }, { 213,-20152 }, { 214,-20152 }, { 215,-20152 }, { 216,-20152 }, + { 217,-20152 }, { 218,-20152 }, { 219,-20152 }, { 220,-20152 }, { 221,-20152 }, + { 222,-20152 }, { 223,-20152 }, { 224,-20152 }, { 225,-20152 }, { 226,-20152 }, + { 227,-20152 }, { 228,-20152 }, { 229,-20152 }, { 230,-20152 }, { 231,-20152 }, + + { 232,-20152 }, { 233,-20152 }, { 234,-20152 }, { 235,-20152 }, { 236,-20152 }, + { 237,-20152 }, { 238,-20152 }, { 239,-20152 }, { 240,-20152 }, { 241,-20152 }, + { 242,-20152 }, { 243,-20152 }, { 244,-20152 }, { 245,-20152 }, { 246,-20152 }, + { 247,-20152 }, { 248,-20152 }, { 249,-20152 }, { 250,-20152 }, { 251,-20152 }, + { 252,-20152 }, { 253,-20152 }, { 254,-20152 }, { 255,-20152 }, { 0, 131 }, + { 0,71714 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-20409 }, { 49,-20409 }, + { 50,-20409 }, { 51,-20409 }, { 52,-20409 }, { 53,-20409 }, { 54,-20409 }, + { 55,-20409 }, { 56,-20409 }, { 57,-20409 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-20409 }, { 66,-20409 }, { 67,15939 }, { 68,-20409 }, { 69,-20409 }, + { 70,-20409 }, { 71,-20409 }, { 72,-20409 }, { 73,-20409 }, { 74,-20409 }, + + { 75,-20409 }, { 76,-20409 }, { 77,-20409 }, { 78,-20409 }, { 79,-20409 }, + { 80,-20409 }, { 81,-20409 }, { 82,-20409 }, { 83,-20409 }, { 84,-20409 }, + { 85,-20409 }, { 86,-20409 }, { 87,-20409 }, { 88,-20409 }, { 89,-20409 }, + { 90,-20409 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-20409 }, { 0, 0 }, { 97,-20409 }, { 98,-20409 }, { 99,15939 }, + { 100,-20409 }, { 101,-20409 }, { 102,-20409 }, { 103,-20409 }, { 104,-20409 }, + { 105,-20409 }, { 106,-20409 }, { 107,-20409 }, { 108,-20409 }, { 109,-20409 }, + { 110,-20409 }, { 111,-20409 }, { 112,-20409 }, { 113,-20409 }, { 114,-20409 }, + { 115,-20409 }, { 116,-20409 }, { 117,-20409 }, { 118,-20409 }, { 119,-20409 }, + { 120,-20409 }, { 121,-20409 }, { 122,-20409 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 127,-20409 }, { 128,-20409 }, { 129,-20409 }, + { 130,-20409 }, { 131,-20409 }, { 132,-20409 }, { 133,-20409 }, { 134,-20409 }, + { 135,-20409 }, { 136,-20409 }, { 137,-20409 }, { 138,-20409 }, { 139,-20409 }, + { 140,-20409 }, { 141,-20409 }, { 142,-20409 }, { 143,-20409 }, { 144,-20409 }, + { 145,-20409 }, { 146,-20409 }, { 147,-20409 }, { 148,-20409 }, { 149,-20409 }, + { 150,-20409 }, { 151,-20409 }, { 152,-20409 }, { 153,-20409 }, { 154,-20409 }, + { 155,-20409 }, { 156,-20409 }, { 157,-20409 }, { 158,-20409 }, { 159,-20409 }, + { 160,-20409 }, { 161,-20409 }, { 162,-20409 }, { 163,-20409 }, { 164,-20409 }, + { 165,-20409 }, { 166,-20409 }, { 167,-20409 }, { 168,-20409 }, { 169,-20409 }, + { 170,-20409 }, { 171,-20409 }, { 172,-20409 }, { 173,-20409 }, { 174,-20409 }, + + { 175,-20409 }, { 176,-20409 }, { 177,-20409 }, { 178,-20409 }, { 179,-20409 }, + { 180,-20409 }, { 181,-20409 }, { 182,-20409 }, { 183,-20409 }, { 184,-20409 }, + { 185,-20409 }, { 186,-20409 }, { 187,-20409 }, { 188,-20409 }, { 189,-20409 }, + { 190,-20409 }, { 191,-20409 }, { 192,-20409 }, { 193,-20409 }, { 194,-20409 }, + { 195,-20409 }, { 196,-20409 }, { 197,-20409 }, { 198,-20409 }, { 199,-20409 }, + { 200,-20409 }, { 201,-20409 }, { 202,-20409 }, { 203,-20409 }, { 204,-20409 }, + { 205,-20409 }, { 206,-20409 }, { 207,-20409 }, { 208,-20409 }, { 209,-20409 }, + { 210,-20409 }, { 211,-20409 }, { 212,-20409 }, { 213,-20409 }, { 214,-20409 }, + { 215,-20409 }, { 216,-20409 }, { 217,-20409 }, { 218,-20409 }, { 219,-20409 }, + { 220,-20409 }, { 221,-20409 }, { 222,-20409 }, { 223,-20409 }, { 224,-20409 }, + + { 225,-20409 }, { 226,-20409 }, { 227,-20409 }, { 228,-20409 }, { 229,-20409 }, + { 230,-20409 }, { 231,-20409 }, { 232,-20409 }, { 233,-20409 }, { 234,-20409 }, + { 235,-20409 }, { 236,-20409 }, { 237,-20409 }, { 238,-20409 }, { 239,-20409 }, + { 240,-20409 }, { 241,-20409 }, { 242,-20409 }, { 243,-20409 }, { 244,-20409 }, + { 245,-20409 }, { 246,-20409 }, { 247,-20409 }, { 248,-20409 }, { 249,-20409 }, + { 250,-20409 }, { 251,-20409 }, { 252,-20409 }, { 253,-20409 }, { 254,-20409 }, + { 255,-20409 }, { 0, 131 }, { 0,71457 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-20666 }, { 49,-20666 }, { 50,-20666 }, { 51,-20666 }, { 52,-20666 }, + { 53,-20666 }, { 54,-20666 }, { 55,-20666 }, { 56,-20666 }, { 57,-20666 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-20666 }, { 66,15939 }, { 67,-20666 }, + + { 68,-20666 }, { 69,-20666 }, { 70,-20666 }, { 71,-20666 }, { 72,-20666 }, + { 73,-20666 }, { 74,-20666 }, { 75,-20666 }, { 76,-20666 }, { 77,-20666 }, + { 78,-20666 }, { 79,-20666 }, { 80,-20666 }, { 81,-20666 }, { 82,-20666 }, + { 83,-20666 }, { 84,-20666 }, { 85,-20666 }, { 86,-20666 }, { 87,-20666 }, + { 88,-20666 }, { 89,-20666 }, { 90,-20666 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-20666 }, { 0, 0 }, { 97,-20666 }, + { 98,15939 }, { 99,-20666 }, { 100,-20666 }, { 101,-20666 }, { 102,-20666 }, + { 103,-20666 }, { 104,-20666 }, { 105,-20666 }, { 106,-20666 }, { 107,-20666 }, + { 108,-20666 }, { 109,-20666 }, { 110,-20666 }, { 111,-20666 }, { 112,-20666 }, + { 113,-20666 }, { 114,-20666 }, { 115,-20666 }, { 116,-20666 }, { 117,-20666 }, + + { 118,-20666 }, { 119,-20666 }, { 120,-20666 }, { 121,-20666 }, { 122,-20666 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-20666 }, + { 128,-20666 }, { 129,-20666 }, { 130,-20666 }, { 131,-20666 }, { 132,-20666 }, + { 133,-20666 }, { 134,-20666 }, { 135,-20666 }, { 136,-20666 }, { 137,-20666 }, + { 138,-20666 }, { 139,-20666 }, { 140,-20666 }, { 141,-20666 }, { 142,-20666 }, + { 143,-20666 }, { 144,-20666 }, { 145,-20666 }, { 146,-20666 }, { 147,-20666 }, + { 148,-20666 }, { 149,-20666 }, { 150,-20666 }, { 151,-20666 }, { 152,-20666 }, + { 153,-20666 }, { 154,-20666 }, { 155,-20666 }, { 156,-20666 }, { 157,-20666 }, + { 158,-20666 }, { 159,-20666 }, { 160,-20666 }, { 161,-20666 }, { 162,-20666 }, + { 163,-20666 }, { 164,-20666 }, { 165,-20666 }, { 166,-20666 }, { 167,-20666 }, + + { 168,-20666 }, { 169,-20666 }, { 170,-20666 }, { 171,-20666 }, { 172,-20666 }, + { 173,-20666 }, { 174,-20666 }, { 175,-20666 }, { 176,-20666 }, { 177,-20666 }, + { 178,-20666 }, { 179,-20666 }, { 180,-20666 }, { 181,-20666 }, { 182,-20666 }, + { 183,-20666 }, { 184,-20666 }, { 185,-20666 }, { 186,-20666 }, { 187,-20666 }, + { 188,-20666 }, { 189,-20666 }, { 190,-20666 }, { 191,-20666 }, { 192,-20666 }, + { 193,-20666 }, { 194,-20666 }, { 195,-20666 }, { 196,-20666 }, { 197,-20666 }, + { 198,-20666 }, { 199,-20666 }, { 200,-20666 }, { 201,-20666 }, { 202,-20666 }, + { 203,-20666 }, { 204,-20666 }, { 205,-20666 }, { 206,-20666 }, { 207,-20666 }, + { 208,-20666 }, { 209,-20666 }, { 210,-20666 }, { 211,-20666 }, { 212,-20666 }, + { 213,-20666 }, { 214,-20666 }, { 215,-20666 }, { 216,-20666 }, { 217,-20666 }, + + { 218,-20666 }, { 219,-20666 }, { 220,-20666 }, { 221,-20666 }, { 222,-20666 }, + { 223,-20666 }, { 224,-20666 }, { 225,-20666 }, { 226,-20666 }, { 227,-20666 }, + { 228,-20666 }, { 229,-20666 }, { 230,-20666 }, { 231,-20666 }, { 232,-20666 }, + { 233,-20666 }, { 234,-20666 }, { 235,-20666 }, { 236,-20666 }, { 237,-20666 }, + { 238,-20666 }, { 239,-20666 }, { 240,-20666 }, { 241,-20666 }, { 242,-20666 }, + { 243,-20666 }, { 244,-20666 }, { 245,-20666 }, { 246,-20666 }, { 247,-20666 }, + { 248,-20666 }, { 249,-20666 }, { 250,-20666 }, { 251,-20666 }, { 252,-20666 }, + { 253,-20666 }, { 254,-20666 }, { 255,-20666 }, { 0, 131 }, { 0,71200 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-20923 }, { 49,-20923 }, { 50,-20923 }, + { 51,-20923 }, { 52,-20923 }, { 53,-20923 }, { 54,-20923 }, { 55,-20923 }, + { 56,-20923 }, { 57,-20923 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-20923 }, + { 66,-20923 }, { 67,-20923 }, { 68,-20923 }, { 69,-20923 }, { 70,-20923 }, + { 71,-20923 }, { 72,-20923 }, { 73,-20923 }, { 74,-20923 }, { 75,-20923 }, + { 76,-20923 }, { 77,-20923 }, { 78,-20923 }, { 79,15939 }, { 80,-20923 }, + { 81,-20923 }, { 82,-20923 }, { 83,-20923 }, { 84,-20923 }, { 85,-20923 }, + { 86,-20923 }, { 87,-20923 }, { 88,-20923 }, { 89,-20923 }, { 90,-20923 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-20923 }, + { 0, 0 }, { 97,-20923 }, { 98,-20923 }, { 99,-20923 }, { 100,-20923 }, + { 101,-20923 }, { 102,-20923 }, { 103,-20923 }, { 104,-20923 }, { 105,-20923 }, + { 106,-20923 }, { 107,-20923 }, { 108,-20923 }, { 109,-20923 }, { 110,-20923 }, + + { 111,15939 }, { 112,-20923 }, { 113,-20923 }, { 114,-20923 }, { 115,-20923 }, + { 116,-20923 }, { 117,-20923 }, { 118,-20923 }, { 119,-20923 }, { 120,-20923 }, + { 121,-20923 }, { 122,-20923 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-20923 }, { 128,-20923 }, { 129,-20923 }, { 130,-20923 }, + { 131,-20923 }, { 132,-20923 }, { 133,-20923 }, { 134,-20923 }, { 135,-20923 }, + { 136,-20923 }, { 137,-20923 }, { 138,-20923 }, { 139,-20923 }, { 140,-20923 }, + { 141,-20923 }, { 142,-20923 }, { 143,-20923 }, { 144,-20923 }, { 145,-20923 }, + { 146,-20923 }, { 147,-20923 }, { 148,-20923 }, { 149,-20923 }, { 150,-20923 }, + { 151,-20923 }, { 152,-20923 }, { 153,-20923 }, { 154,-20923 }, { 155,-20923 }, + { 156,-20923 }, { 157,-20923 }, { 158,-20923 }, { 159,-20923 }, { 160,-20923 }, + + { 161,-20923 }, { 162,-20923 }, { 163,-20923 }, { 164,-20923 }, { 165,-20923 }, + { 166,-20923 }, { 167,-20923 }, { 168,-20923 }, { 169,-20923 }, { 170,-20923 }, + { 171,-20923 }, { 172,-20923 }, { 173,-20923 }, { 174,-20923 }, { 175,-20923 }, + { 176,-20923 }, { 177,-20923 }, { 178,-20923 }, { 179,-20923 }, { 180,-20923 }, + { 181,-20923 }, { 182,-20923 }, { 183,-20923 }, { 184,-20923 }, { 185,-20923 }, + { 186,-20923 }, { 187,-20923 }, { 188,-20923 }, { 189,-20923 }, { 190,-20923 }, + { 191,-20923 }, { 192,-20923 }, { 193,-20923 }, { 194,-20923 }, { 195,-20923 }, + { 196,-20923 }, { 197,-20923 }, { 198,-20923 }, { 199,-20923 }, { 200,-20923 }, + { 201,-20923 }, { 202,-20923 }, { 203,-20923 }, { 204,-20923 }, { 205,-20923 }, + { 206,-20923 }, { 207,-20923 }, { 208,-20923 }, { 209,-20923 }, { 210,-20923 }, + + { 211,-20923 }, { 212,-20923 }, { 213,-20923 }, { 214,-20923 }, { 215,-20923 }, + { 216,-20923 }, { 217,-20923 }, { 218,-20923 }, { 219,-20923 }, { 220,-20923 }, + { 221,-20923 }, { 222,-20923 }, { 223,-20923 }, { 224,-20923 }, { 225,-20923 }, + { 226,-20923 }, { 227,-20923 }, { 228,-20923 }, { 229,-20923 }, { 230,-20923 }, + { 231,-20923 }, { 232,-20923 }, { 233,-20923 }, { 234,-20923 }, { 235,-20923 }, + { 236,-20923 }, { 237,-20923 }, { 238,-20923 }, { 239,-20923 }, { 240,-20923 }, + { 241,-20923 }, { 242,-20923 }, { 243,-20923 }, { 244,-20923 }, { 245,-20923 }, + { 246,-20923 }, { 247,-20923 }, { 248,-20923 }, { 249,-20923 }, { 250,-20923 }, + { 251,-20923 }, { 252,-20923 }, { 253,-20923 }, { 254,-20923 }, { 255,-20923 }, + { 0, 131 }, { 0,70943 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-21180 }, + { 49,-21180 }, { 50,-21180 }, { 51,-21180 }, { 52,-21180 }, { 53,-21180 }, + + { 54,-21180 }, { 55,-21180 }, { 56,-21180 }, { 57,-21180 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-21180 }, { 66,-21180 }, { 67,-21180 }, { 68,-21180 }, + { 69,-21180 }, { 70,-21180 }, { 71,-21180 }, { 72,-21180 }, { 73,-21180 }, + { 74,-21180 }, { 75,-21180 }, { 76,15939 }, { 77,-21180 }, { 78,-21180 }, + { 79,-21180 }, { 80,-21180 }, { 81,-21180 }, { 82,-21180 }, { 83,-21180 }, + { 84,-21180 }, { 85,-21180 }, { 86,-21180 }, { 87,-21180 }, { 88,-21180 }, + { 89,-21180 }, { 90,-21180 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-21180 }, { 0, 0 }, { 97,-21180 }, { 98,-21180 }, + { 99,-21180 }, { 100,-21180 }, { 101,-21180 }, { 102,-21180 }, { 103,-21180 }, + + { 104,-21180 }, { 105,-21180 }, { 106,-21180 }, { 107,-21180 }, { 108,15939 }, + { 109,-21180 }, { 110,-21180 }, { 111,-21180 }, { 112,-21180 }, { 113,-21180 }, + { 114,-21180 }, { 115,-21180 }, { 116,-21180 }, { 117,-21180 }, { 118,-21180 }, + { 119,-21180 }, { 120,-21180 }, { 121,-21180 }, { 122,-21180 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-21180 }, { 128,-21180 }, + { 129,-21180 }, { 130,-21180 }, { 131,-21180 }, { 132,-21180 }, { 133,-21180 }, + { 134,-21180 }, { 135,-21180 }, { 136,-21180 }, { 137,-21180 }, { 138,-21180 }, + { 139,-21180 }, { 140,-21180 }, { 141,-21180 }, { 142,-21180 }, { 143,-21180 }, + { 144,-21180 }, { 145,-21180 }, { 146,-21180 }, { 147,-21180 }, { 148,-21180 }, + { 149,-21180 }, { 150,-21180 }, { 151,-21180 }, { 152,-21180 }, { 153,-21180 }, + + { 154,-21180 }, { 155,-21180 }, { 156,-21180 }, { 157,-21180 }, { 158,-21180 }, + { 159,-21180 }, { 160,-21180 }, { 161,-21180 }, { 162,-21180 }, { 163,-21180 }, + { 164,-21180 }, { 165,-21180 }, { 166,-21180 }, { 167,-21180 }, { 168,-21180 }, + { 169,-21180 }, { 170,-21180 }, { 171,-21180 }, { 172,-21180 }, { 173,-21180 }, + { 174,-21180 }, { 175,-21180 }, { 176,-21180 }, { 177,-21180 }, { 178,-21180 }, + { 179,-21180 }, { 180,-21180 }, { 181,-21180 }, { 182,-21180 }, { 183,-21180 }, + { 184,-21180 }, { 185,-21180 }, { 186,-21180 }, { 187,-21180 }, { 188,-21180 }, + { 189,-21180 }, { 190,-21180 }, { 191,-21180 }, { 192,-21180 }, { 193,-21180 }, + { 194,-21180 }, { 195,-21180 }, { 196,-21180 }, { 197,-21180 }, { 198,-21180 }, + { 199,-21180 }, { 200,-21180 }, { 201,-21180 }, { 202,-21180 }, { 203,-21180 }, + + { 204,-21180 }, { 205,-21180 }, { 206,-21180 }, { 207,-21180 }, { 208,-21180 }, + { 209,-21180 }, { 210,-21180 }, { 211,-21180 }, { 212,-21180 }, { 213,-21180 }, + { 214,-21180 }, { 215,-21180 }, { 216,-21180 }, { 217,-21180 }, { 218,-21180 }, + { 219,-21180 }, { 220,-21180 }, { 221,-21180 }, { 222,-21180 }, { 223,-21180 }, + { 224,-21180 }, { 225,-21180 }, { 226,-21180 }, { 227,-21180 }, { 228,-21180 }, + { 229,-21180 }, { 230,-21180 }, { 231,-21180 }, { 232,-21180 }, { 233,-21180 }, + { 234,-21180 }, { 235,-21180 }, { 236,-21180 }, { 237,-21180 }, { 238,-21180 }, + { 239,-21180 }, { 240,-21180 }, { 241,-21180 }, { 242,-21180 }, { 243,-21180 }, + { 244,-21180 }, { 245,-21180 }, { 246,-21180 }, { 247,-21180 }, { 248,-21180 }, + { 249,-21180 }, { 250,-21180 }, { 251,-21180 }, { 252,-21180 }, { 253,-21180 }, + + { 254,-21180 }, { 255,-21180 }, { 0, 131 }, { 0,70686 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 48,-21437 }, { 49,-21437 }, { 50,-21437 }, { 51,-21437 }, + { 52,-21437 }, { 53,-21437 }, { 54,-21437 }, { 55,-21437 }, { 56,-21437 }, + { 57,-21437 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-21437 }, { 66,-21437 }, + { 67,-21437 }, { 68,-21437 }, { 69,-21437 }, { 70,-21437 }, { 71,-21437 }, + { 72,-21437 }, { 73,-21437 }, { 74,-21437 }, { 75,-21437 }, { 76,15939 }, + { 77,-21437 }, { 78,-21437 }, { 79,-21437 }, { 80,-21437 }, { 81,-21437 }, + { 82,-21437 }, { 83,-21437 }, { 84,-21437 }, { 85,-21437 }, { 86,-21437 }, + { 87,-21437 }, { 88,-21437 }, { 89,-21437 }, { 90,-21437 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-21437 }, { 0, 0 }, + + { 97,-21437 }, { 98,-21437 }, { 99,-21437 }, { 100,-21437 }, { 101,-21437 }, + { 102,-21437 }, { 103,-21437 }, { 104,-21437 }, { 105,-21437 }, { 106,-21437 }, + { 107,-21437 }, { 108,15939 }, { 109,-21437 }, { 110,-21437 }, { 111,-21437 }, + { 112,-21437 }, { 113,-21437 }, { 114,-21437 }, { 115,-21437 }, { 116,-21437 }, + { 117,-21437 }, { 118,-21437 }, { 119,-21437 }, { 120,-21437 }, { 121,-21437 }, + { 122,-21437 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-21437 }, { 128,-21437 }, { 129,-21437 }, { 130,-21437 }, { 131,-21437 }, + { 132,-21437 }, { 133,-21437 }, { 134,-21437 }, { 135,-21437 }, { 136,-21437 }, + { 137,-21437 }, { 138,-21437 }, { 139,-21437 }, { 140,-21437 }, { 141,-21437 }, + { 142,-21437 }, { 143,-21437 }, { 144,-21437 }, { 145,-21437 }, { 146,-21437 }, + + { 147,-21437 }, { 148,-21437 }, { 149,-21437 }, { 150,-21437 }, { 151,-21437 }, + { 152,-21437 }, { 153,-21437 }, { 154,-21437 }, { 155,-21437 }, { 156,-21437 }, + { 157,-21437 }, { 158,-21437 }, { 159,-21437 }, { 160,-21437 }, { 161,-21437 }, + { 162,-21437 }, { 163,-21437 }, { 164,-21437 }, { 165,-21437 }, { 166,-21437 }, + { 167,-21437 }, { 168,-21437 }, { 169,-21437 }, { 170,-21437 }, { 171,-21437 }, + { 172,-21437 }, { 173,-21437 }, { 174,-21437 }, { 175,-21437 }, { 176,-21437 }, + { 177,-21437 }, { 178,-21437 }, { 179,-21437 }, { 180,-21437 }, { 181,-21437 }, + { 182,-21437 }, { 183,-21437 }, { 184,-21437 }, { 185,-21437 }, { 186,-21437 }, + { 187,-21437 }, { 188,-21437 }, { 189,-21437 }, { 190,-21437 }, { 191,-21437 }, + { 192,-21437 }, { 193,-21437 }, { 194,-21437 }, { 195,-21437 }, { 196,-21437 }, + + { 197,-21437 }, { 198,-21437 }, { 199,-21437 }, { 200,-21437 }, { 201,-21437 }, + { 202,-21437 }, { 203,-21437 }, { 204,-21437 }, { 205,-21437 }, { 206,-21437 }, + { 207,-21437 }, { 208,-21437 }, { 209,-21437 }, { 210,-21437 }, { 211,-21437 }, + { 212,-21437 }, { 213,-21437 }, { 214,-21437 }, { 215,-21437 }, { 216,-21437 }, + { 217,-21437 }, { 218,-21437 }, { 219,-21437 }, { 220,-21437 }, { 221,-21437 }, + { 222,-21437 }, { 223,-21437 }, { 224,-21437 }, { 225,-21437 }, { 226,-21437 }, + { 227,-21437 }, { 228,-21437 }, { 229,-21437 }, { 230,-21437 }, { 231,-21437 }, + { 232,-21437 }, { 233,-21437 }, { 234,-21437 }, { 235,-21437 }, { 236,-21437 }, + { 237,-21437 }, { 238,-21437 }, { 239,-21437 }, { 240,-21437 }, { 241,-21437 }, + { 242,-21437 }, { 243,-21437 }, { 244,-21437 }, { 245,-21437 }, { 246,-21437 }, + + { 247,-21437 }, { 248,-21437 }, { 249,-21437 }, { 250,-21437 }, { 251,-21437 }, + { 252,-21437 }, { 253,-21437 }, { 254,-21437 }, { 255,-21437 }, { 0, 131 }, + { 0,70429 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-21694 }, { 49,-21694 }, + { 50,-21694 }, { 51,-21694 }, { 52,-21694 }, { 53,-21694 }, { 54,-21694 }, + { 55,-21694 }, { 56,-21694 }, { 57,-21694 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-21694 }, { 66,-21694 }, { 67,-21694 }, { 68,-21694 }, { 69,-21694 }, + { 70,-21694 }, { 71,-21694 }, { 72,-21694 }, { 73,-21694 }, { 74,-21694 }, + { 75,-21694 }, { 76,-21694 }, { 77,-21694 }, { 78,-21694 }, { 79,-21694 }, + { 80,-21694 }, { 81,-21694 }, { 82,-21694 }, { 83,-21694 }, { 84,15939 }, + { 85,-21694 }, { 86,-21694 }, { 87,-21694 }, { 88,-21694 }, { 89,-21694 }, + + { 90,-21694 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-21694 }, { 0, 0 }, { 97,-21694 }, { 98,-21694 }, { 99,-21694 }, + { 100,-21694 }, { 101,-21694 }, { 102,-21694 }, { 103,-21694 }, { 104,-21694 }, + { 105,-21694 }, { 106,-21694 }, { 107,-21694 }, { 108,-21694 }, { 109,-21694 }, + { 110,-21694 }, { 111,-21694 }, { 112,-21694 }, { 113,-21694 }, { 114,-21694 }, + { 115,-21694 }, { 116,15939 }, { 117,-21694 }, { 118,-21694 }, { 119,-21694 }, + { 120,-21694 }, { 121,-21694 }, { 122,-21694 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-21694 }, { 128,-21694 }, { 129,-21694 }, + { 130,-21694 }, { 131,-21694 }, { 132,-21694 }, { 133,-21694 }, { 134,-21694 }, + { 135,-21694 }, { 136,-21694 }, { 137,-21694 }, { 138,-21694 }, { 139,-21694 }, + + { 140,-21694 }, { 141,-21694 }, { 142,-21694 }, { 143,-21694 }, { 144,-21694 }, + { 145,-21694 }, { 146,-21694 }, { 147,-21694 }, { 148,-21694 }, { 149,-21694 }, + { 150,-21694 }, { 151,-21694 }, { 152,-21694 }, { 153,-21694 }, { 154,-21694 }, + { 155,-21694 }, { 156,-21694 }, { 157,-21694 }, { 158,-21694 }, { 159,-21694 }, + { 160,-21694 }, { 161,-21694 }, { 162,-21694 }, { 163,-21694 }, { 164,-21694 }, + { 165,-21694 }, { 166,-21694 }, { 167,-21694 }, { 168,-21694 }, { 169,-21694 }, + { 170,-21694 }, { 171,-21694 }, { 172,-21694 }, { 173,-21694 }, { 174,-21694 }, + { 175,-21694 }, { 176,-21694 }, { 177,-21694 }, { 178,-21694 }, { 179,-21694 }, + { 180,-21694 }, { 181,-21694 }, { 182,-21694 }, { 183,-21694 }, { 184,-21694 }, + { 185,-21694 }, { 186,-21694 }, { 187,-21694 }, { 188,-21694 }, { 189,-21694 }, + + { 190,-21694 }, { 191,-21694 }, { 192,-21694 }, { 193,-21694 }, { 194,-21694 }, + { 195,-21694 }, { 196,-21694 }, { 197,-21694 }, { 198,-21694 }, { 199,-21694 }, + { 200,-21694 }, { 201,-21694 }, { 202,-21694 }, { 203,-21694 }, { 204,-21694 }, + { 205,-21694 }, { 206,-21694 }, { 207,-21694 }, { 208,-21694 }, { 209,-21694 }, + { 210,-21694 }, { 211,-21694 }, { 212,-21694 }, { 213,-21694 }, { 214,-21694 }, + { 215,-21694 }, { 216,-21694 }, { 217,-21694 }, { 218,-21694 }, { 219,-21694 }, + { 220,-21694 }, { 221,-21694 }, { 222,-21694 }, { 223,-21694 }, { 224,-21694 }, + { 225,-21694 }, { 226,-21694 }, { 227,-21694 }, { 228,-21694 }, { 229,-21694 }, + { 230,-21694 }, { 231,-21694 }, { 232,-21694 }, { 233,-21694 }, { 234,-21694 }, + { 235,-21694 }, { 236,-21694 }, { 237,-21694 }, { 238,-21694 }, { 239,-21694 }, + + { 240,-21694 }, { 241,-21694 }, { 242,-21694 }, { 243,-21694 }, { 244,-21694 }, + { 245,-21694 }, { 246,-21694 }, { 247,-21694 }, { 248,-21694 }, { 249,-21694 }, + { 250,-21694 }, { 251,-21694 }, { 252,-21694 }, { 253,-21694 }, { 254,-21694 }, + { 255,-21694 }, { 0, 131 }, { 0,70172 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-21951 }, { 49,-21951 }, { 50,-21951 }, { 51,-21951 }, { 52,-21951 }, + { 53,-21951 }, { 54,-21951 }, { 55,-21951 }, { 56,-21951 }, { 57,-21951 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-21951 }, { 66,-21951 }, { 67,-21951 }, + { 68,-21951 }, { 69,15939 }, { 70,-21951 }, { 71,-21951 }, { 72,-21951 }, + { 73,-21951 }, { 74,-21951 }, { 75,-21951 }, { 76,-21951 }, { 77,-21951 }, + { 78,-21951 }, { 79,-21951 }, { 80,-21951 }, { 81,-21951 }, { 82,-21951 }, + + { 83,-21951 }, { 84,-21951 }, { 85,-21951 }, { 86,-21951 }, { 87,-21951 }, + { 88,-21951 }, { 89,-21951 }, { 90,-21951 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-21951 }, { 0, 0 }, { 97,-21951 }, + { 98,-21951 }, { 99,-21951 }, { 100,-21951 }, { 101,15939 }, { 102,-21951 }, + { 103,-21951 }, { 104,-21951 }, { 105,-21951 }, { 106,-21951 }, { 107,-21951 }, + { 108,-21951 }, { 109,-21951 }, { 110,-21951 }, { 111,-21951 }, { 112,-21951 }, + { 113,-21951 }, { 114,-21951 }, { 115,-21951 }, { 116,-21951 }, { 117,-21951 }, + { 118,-21951 }, { 119,-21951 }, { 120,-21951 }, { 121,-21951 }, { 122,-21951 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-21951 }, + { 128,-21951 }, { 129,-21951 }, { 130,-21951 }, { 131,-21951 }, { 132,-21951 }, + + { 133,-21951 }, { 134,-21951 }, { 135,-21951 }, { 136,-21951 }, { 137,-21951 }, + { 138,-21951 }, { 139,-21951 }, { 140,-21951 }, { 141,-21951 }, { 142,-21951 }, + { 143,-21951 }, { 144,-21951 }, { 145,-21951 }, { 146,-21951 }, { 147,-21951 }, + { 148,-21951 }, { 149,-21951 }, { 150,-21951 }, { 151,-21951 }, { 152,-21951 }, + { 153,-21951 }, { 154,-21951 }, { 155,-21951 }, { 156,-21951 }, { 157,-21951 }, + { 158,-21951 }, { 159,-21951 }, { 160,-21951 }, { 161,-21951 }, { 162,-21951 }, + { 163,-21951 }, { 164,-21951 }, { 165,-21951 }, { 166,-21951 }, { 167,-21951 }, + { 168,-21951 }, { 169,-21951 }, { 170,-21951 }, { 171,-21951 }, { 172,-21951 }, + { 173,-21951 }, { 174,-21951 }, { 175,-21951 }, { 176,-21951 }, { 177,-21951 }, + { 178,-21951 }, { 179,-21951 }, { 180,-21951 }, { 181,-21951 }, { 182,-21951 }, + + { 183,-21951 }, { 184,-21951 }, { 185,-21951 }, { 186,-21951 }, { 187,-21951 }, + { 188,-21951 }, { 189,-21951 }, { 190,-21951 }, { 191,-21951 }, { 192,-21951 }, + { 193,-21951 }, { 194,-21951 }, { 195,-21951 }, { 196,-21951 }, { 197,-21951 }, + { 198,-21951 }, { 199,-21951 }, { 200,-21951 }, { 201,-21951 }, { 202,-21951 }, + { 203,-21951 }, { 204,-21951 }, { 205,-21951 }, { 206,-21951 }, { 207,-21951 }, + { 208,-21951 }, { 209,-21951 }, { 210,-21951 }, { 211,-21951 }, { 212,-21951 }, + { 213,-21951 }, { 214,-21951 }, { 215,-21951 }, { 216,-21951 }, { 217,-21951 }, + { 218,-21951 }, { 219,-21951 }, { 220,-21951 }, { 221,-21951 }, { 222,-21951 }, + { 223,-21951 }, { 224,-21951 }, { 225,-21951 }, { 226,-21951 }, { 227,-21951 }, + { 228,-21951 }, { 229,-21951 }, { 230,-21951 }, { 231,-21951 }, { 232,-21951 }, + + { 233,-21951 }, { 234,-21951 }, { 235,-21951 }, { 236,-21951 }, { 237,-21951 }, + { 238,-21951 }, { 239,-21951 }, { 240,-21951 }, { 241,-21951 }, { 242,-21951 }, + { 243,-21951 }, { 244,-21951 }, { 245,-21951 }, { 246,-21951 }, { 247,-21951 }, + { 248,-21951 }, { 249,-21951 }, { 250,-21951 }, { 251,-21951 }, { 252,-21951 }, + { 253,-21951 }, { 254,-21951 }, { 255,-21951 }, { 0, 131 }, { 0,69915 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-22208 }, { 49,-22208 }, { 50,-22208 }, + { 51,-22208 }, { 52,-22208 }, { 53,-22208 }, { 54,-22208 }, { 55,-22208 }, + { 56,-22208 }, { 57,-22208 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-22208 }, + { 66,-22208 }, { 67,-22208 }, { 68,-22208 }, { 69,15939 }, { 70,-22208 }, + { 71,-22208 }, { 72,-22208 }, { 73,-22208 }, { 74,-22208 }, { 75,-22208 }, + + { 76,-22208 }, { 77,-22208 }, { 78,-22208 }, { 79,-22208 }, { 80,-22208 }, + { 81,-22208 }, { 82,-22208 }, { 83,-22208 }, { 84,-22208 }, { 85,-22208 }, + { 86,-22208 }, { 87,-22208 }, { 88,-22208 }, { 89,-22208 }, { 90,-22208 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-22208 }, + { 0, 0 }, { 97,-22208 }, { 98,-22208 }, { 99,-22208 }, { 100,-22208 }, + { 101,15939 }, { 102,-22208 }, { 103,-22208 }, { 104,-22208 }, { 105,-22208 }, + { 106,-22208 }, { 107,-22208 }, { 108,-22208 }, { 109,-22208 }, { 110,-22208 }, + { 111,-22208 }, { 112,-22208 }, { 113,-22208 }, { 114,-22208 }, { 115,-22208 }, + { 116,-22208 }, { 117,-22208 }, { 118,-22208 }, { 119,-22208 }, { 120,-22208 }, + { 121,-22208 }, { 122,-22208 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 127,-22208 }, { 128,-22208 }, { 129,-22208 }, { 130,-22208 }, + { 131,-22208 }, { 132,-22208 }, { 133,-22208 }, { 134,-22208 }, { 135,-22208 }, + { 136,-22208 }, { 137,-22208 }, { 138,-22208 }, { 139,-22208 }, { 140,-22208 }, + { 141,-22208 }, { 142,-22208 }, { 143,-22208 }, { 144,-22208 }, { 145,-22208 }, + { 146,-22208 }, { 147,-22208 }, { 148,-22208 }, { 149,-22208 }, { 150,-22208 }, + { 151,-22208 }, { 152,-22208 }, { 153,-22208 }, { 154,-22208 }, { 155,-22208 }, + { 156,-22208 }, { 157,-22208 }, { 158,-22208 }, { 159,-22208 }, { 160,-22208 }, + { 161,-22208 }, { 162,-22208 }, { 163,-22208 }, { 164,-22208 }, { 165,-22208 }, + { 166,-22208 }, { 167,-22208 }, { 168,-22208 }, { 169,-22208 }, { 170,-22208 }, + { 171,-22208 }, { 172,-22208 }, { 173,-22208 }, { 174,-22208 }, { 175,-22208 }, + + { 176,-22208 }, { 177,-22208 }, { 178,-22208 }, { 179,-22208 }, { 180,-22208 }, + { 181,-22208 }, { 182,-22208 }, { 183,-22208 }, { 184,-22208 }, { 185,-22208 }, + { 186,-22208 }, { 187,-22208 }, { 188,-22208 }, { 189,-22208 }, { 190,-22208 }, + { 191,-22208 }, { 192,-22208 }, { 193,-22208 }, { 194,-22208 }, { 195,-22208 }, + { 196,-22208 }, { 197,-22208 }, { 198,-22208 }, { 199,-22208 }, { 200,-22208 }, + { 201,-22208 }, { 202,-22208 }, { 203,-22208 }, { 204,-22208 }, { 205,-22208 }, + { 206,-22208 }, { 207,-22208 }, { 208,-22208 }, { 209,-22208 }, { 210,-22208 }, + { 211,-22208 }, { 212,-22208 }, { 213,-22208 }, { 214,-22208 }, { 215,-22208 }, + { 216,-22208 }, { 217,-22208 }, { 218,-22208 }, { 219,-22208 }, { 220,-22208 }, + { 221,-22208 }, { 222,-22208 }, { 223,-22208 }, { 224,-22208 }, { 225,-22208 }, + + { 226,-22208 }, { 227,-22208 }, { 228,-22208 }, { 229,-22208 }, { 230,-22208 }, + { 231,-22208 }, { 232,-22208 }, { 233,-22208 }, { 234,-22208 }, { 235,-22208 }, + { 236,-22208 }, { 237,-22208 }, { 238,-22208 }, { 239,-22208 }, { 240,-22208 }, + { 241,-22208 }, { 242,-22208 }, { 243,-22208 }, { 244,-22208 }, { 245,-22208 }, + { 246,-22208 }, { 247,-22208 }, { 248,-22208 }, { 249,-22208 }, { 250,-22208 }, + { 251,-22208 }, { 252,-22208 }, { 253,-22208 }, { 254,-22208 }, { 255,-22208 }, + { 0, 131 }, { 0,69658 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-22465 }, + { 49,-22465 }, { 50,-22465 }, { 51,-22465 }, { 52,-22465 }, { 53,-22465 }, + { 54,-22465 }, { 55,-22465 }, { 56,-22465 }, { 57,-22465 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-22465 }, { 66,-22465 }, { 67,-22465 }, { 68,-22465 }, + + { 69,-22465 }, { 70,-22465 }, { 71,-22465 }, { 72,-22465 }, { 73,-22465 }, + { 74,-22465 }, { 75,-22465 }, { 76,-22465 }, { 77,-22465 }, { 78,-22465 }, + { 79,-22465 }, { 80,-22465 }, { 81,-22465 }, { 82,-22465 }, { 83,-22465 }, + { 84,15939 }, { 85,-22465 }, { 86,-22465 }, { 87,-22465 }, { 88,-22465 }, + { 89,-22465 }, { 90,-22465 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-22465 }, { 0, 0 }, { 97,-22465 }, { 98,-22465 }, + { 99,-22465 }, { 100,-22465 }, { 101,-22465 }, { 102,-22465 }, { 103,-22465 }, + { 104,-22465 }, { 105,-22465 }, { 106,-22465 }, { 107,-22465 }, { 108,-22465 }, + { 109,-22465 }, { 110,-22465 }, { 111,-22465 }, { 112,-22465 }, { 113,-22465 }, + { 114,-22465 }, { 115,-22465 }, { 116,15939 }, { 117,-22465 }, { 118,-22465 }, + + { 119,-22465 }, { 120,-22465 }, { 121,-22465 }, { 122,-22465 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-22465 }, { 128,-22465 }, + { 129,-22465 }, { 130,-22465 }, { 131,-22465 }, { 132,-22465 }, { 133,-22465 }, + { 134,-22465 }, { 135,-22465 }, { 136,-22465 }, { 137,-22465 }, { 138,-22465 }, + { 139,-22465 }, { 140,-22465 }, { 141,-22465 }, { 142,-22465 }, { 143,-22465 }, + { 144,-22465 }, { 145,-22465 }, { 146,-22465 }, { 147,-22465 }, { 148,-22465 }, + { 149,-22465 }, { 150,-22465 }, { 151,-22465 }, { 152,-22465 }, { 153,-22465 }, + { 154,-22465 }, { 155,-22465 }, { 156,-22465 }, { 157,-22465 }, { 158,-22465 }, + { 159,-22465 }, { 160,-22465 }, { 161,-22465 }, { 162,-22465 }, { 163,-22465 }, + { 164,-22465 }, { 165,-22465 }, { 166,-22465 }, { 167,-22465 }, { 168,-22465 }, + + { 169,-22465 }, { 170,-22465 }, { 171,-22465 }, { 172,-22465 }, { 173,-22465 }, + { 174,-22465 }, { 175,-22465 }, { 176,-22465 }, { 177,-22465 }, { 178,-22465 }, + { 179,-22465 }, { 180,-22465 }, { 181,-22465 }, { 182,-22465 }, { 183,-22465 }, + { 184,-22465 }, { 185,-22465 }, { 186,-22465 }, { 187,-22465 }, { 188,-22465 }, + { 189,-22465 }, { 190,-22465 }, { 191,-22465 }, { 192,-22465 }, { 193,-22465 }, + { 194,-22465 }, { 195,-22465 }, { 196,-22465 }, { 197,-22465 }, { 198,-22465 }, + { 199,-22465 }, { 200,-22465 }, { 201,-22465 }, { 202,-22465 }, { 203,-22465 }, + { 204,-22465 }, { 205,-22465 }, { 206,-22465 }, { 207,-22465 }, { 208,-22465 }, + { 209,-22465 }, { 210,-22465 }, { 211,-22465 }, { 212,-22465 }, { 213,-22465 }, + { 214,-22465 }, { 215,-22465 }, { 216,-22465 }, { 217,-22465 }, { 218,-22465 }, + + { 219,-22465 }, { 220,-22465 }, { 221,-22465 }, { 222,-22465 }, { 223,-22465 }, + { 224,-22465 }, { 225,-22465 }, { 226,-22465 }, { 227,-22465 }, { 228,-22465 }, + { 229,-22465 }, { 230,-22465 }, { 231,-22465 }, { 232,-22465 }, { 233,-22465 }, + { 234,-22465 }, { 235,-22465 }, { 236,-22465 }, { 237,-22465 }, { 238,-22465 }, + { 239,-22465 }, { 240,-22465 }, { 241,-22465 }, { 242,-22465 }, { 243,-22465 }, + { 244,-22465 }, { 245,-22465 }, { 246,-22465 }, { 247,-22465 }, { 248,-22465 }, + { 249,-22465 }, { 250,-22465 }, { 251,-22465 }, { 252,-22465 }, { 253,-22465 }, + { 254,-22465 }, { 255,-22465 }, { 0, 131 }, { 0,69401 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-22722 }, { 49,-22722 }, { 50,-22722 }, { 51,-22722 }, + { 52,-22722 }, { 53,-22722 }, { 54,-22722 }, { 55,-22722 }, { 56,-22722 }, + { 57,-22722 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-22722 }, { 66,-22722 }, + { 67,-22722 }, { 68,-22722 }, { 69,15939 }, { 70,-22722 }, { 71,-22722 }, + { 72,-22722 }, { 73,-22722 }, { 74,-22722 }, { 75,-22722 }, { 76,-22722 }, + { 77,-22722 }, { 78,-22722 }, { 79,-22722 }, { 80,-22722 }, { 81,-22722 }, + { 82,-22722 }, { 83,-22722 }, { 84,-22722 }, { 85,-22722 }, { 86,-22722 }, + { 87,-22722 }, { 88,-22722 }, { 89,-22722 }, { 90,-22722 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-22722 }, { 0, 0 }, + { 97,-22722 }, { 98,-22722 }, { 99,-22722 }, { 100,-22722 }, { 101,15939 }, + { 102,-22722 }, { 103,-22722 }, { 104,-22722 }, { 105,-22722 }, { 106,-22722 }, + { 107,-22722 }, { 108,-22722 }, { 109,-22722 }, { 110,-22722 }, { 111,-22722 }, + + { 112,-22722 }, { 113,-22722 }, { 114,-22722 }, { 115,-22722 }, { 116,-22722 }, + { 117,-22722 }, { 118,-22722 }, { 119,-22722 }, { 120,-22722 }, { 121,-22722 }, + { 122,-22722 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-22722 }, { 128,-22722 }, { 129,-22722 }, { 130,-22722 }, { 131,-22722 }, + { 132,-22722 }, { 133,-22722 }, { 134,-22722 }, { 135,-22722 }, { 136,-22722 }, + { 137,-22722 }, { 138,-22722 }, { 139,-22722 }, { 140,-22722 }, { 141,-22722 }, + { 142,-22722 }, { 143,-22722 }, { 144,-22722 }, { 145,-22722 }, { 146,-22722 }, + { 147,-22722 }, { 148,-22722 }, { 149,-22722 }, { 150,-22722 }, { 151,-22722 }, + { 152,-22722 }, { 153,-22722 }, { 154,-22722 }, { 155,-22722 }, { 156,-22722 }, + { 157,-22722 }, { 158,-22722 }, { 159,-22722 }, { 160,-22722 }, { 161,-22722 }, + + { 162,-22722 }, { 163,-22722 }, { 164,-22722 }, { 165,-22722 }, { 166,-22722 }, + { 167,-22722 }, { 168,-22722 }, { 169,-22722 }, { 170,-22722 }, { 171,-22722 }, + { 172,-22722 }, { 173,-22722 }, { 174,-22722 }, { 175,-22722 }, { 176,-22722 }, + { 177,-22722 }, { 178,-22722 }, { 179,-22722 }, { 180,-22722 }, { 181,-22722 }, + { 182,-22722 }, { 183,-22722 }, { 184,-22722 }, { 185,-22722 }, { 186,-22722 }, + { 187,-22722 }, { 188,-22722 }, { 189,-22722 }, { 190,-22722 }, { 191,-22722 }, + { 192,-22722 }, { 193,-22722 }, { 194,-22722 }, { 195,-22722 }, { 196,-22722 }, + { 197,-22722 }, { 198,-22722 }, { 199,-22722 }, { 200,-22722 }, { 201,-22722 }, + { 202,-22722 }, { 203,-22722 }, { 204,-22722 }, { 205,-22722 }, { 206,-22722 }, + { 207,-22722 }, { 208,-22722 }, { 209,-22722 }, { 210,-22722 }, { 211,-22722 }, + + { 212,-22722 }, { 213,-22722 }, { 214,-22722 }, { 215,-22722 }, { 216,-22722 }, + { 217,-22722 }, { 218,-22722 }, { 219,-22722 }, { 220,-22722 }, { 221,-22722 }, + { 222,-22722 }, { 223,-22722 }, { 224,-22722 }, { 225,-22722 }, { 226,-22722 }, + { 227,-22722 }, { 228,-22722 }, { 229,-22722 }, { 230,-22722 }, { 231,-22722 }, + { 232,-22722 }, { 233,-22722 }, { 234,-22722 }, { 235,-22722 }, { 236,-22722 }, + { 237,-22722 }, { 238,-22722 }, { 239,-22722 }, { 240,-22722 }, { 241,-22722 }, + { 242,-22722 }, { 243,-22722 }, { 244,-22722 }, { 245,-22722 }, { 246,-22722 }, + { 247,-22722 }, { 248,-22722 }, { 249,-22722 }, { 250,-22722 }, { 251,-22722 }, + { 252,-22722 }, { 253,-22722 }, { 254,-22722 }, { 255,-22722 }, { 0, 28 }, + { 0,69144 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-22979 }, { 49,-22979 }, + { 50,-22979 }, { 51,-22979 }, { 52,-22979 }, { 53,-22979 }, { 54,-22979 }, + + { 55,-22979 }, { 56,-22979 }, { 57,-22979 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-22979 }, { 66,-22979 }, { 67,-22979 }, { 68,-22979 }, { 69,-22979 }, + { 70,-22979 }, { 71,-22979 }, { 72,-22979 }, { 73,-22979 }, { 74,-22979 }, + { 75,-22979 }, { 76,-22979 }, { 77,-22979 }, { 78,-22979 }, { 79,-22979 }, + { 80,-22979 }, { 81,-22979 }, { 82,-22979 }, { 83,-22979 }, { 84,-22979 }, + { 85,-22979 }, { 86,-22979 }, { 87,-22979 }, { 88,-22979 }, { 89,-22979 }, + { 90,-22979 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-22979 }, { 0, 0 }, { 97,-22979 }, { 98,-22979 }, { 99,-22979 }, + { 100,-22979 }, { 101,-22979 }, { 102,-22979 }, { 103,-22979 }, { 104,-22979 }, + + { 105,-22979 }, { 106,-22979 }, { 107,-22979 }, { 108,-22979 }, { 109,-22979 }, + { 110,-22979 }, { 111,-22979 }, { 112,-22979 }, { 113,-22979 }, { 114,-22979 }, + { 115,-22979 }, { 116,-22979 }, { 117,-22979 }, { 118,-22979 }, { 119,-22979 }, + { 120,-22979 }, { 121,-22979 }, { 122,-22979 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-22979 }, { 128,-22979 }, { 129,-22979 }, + { 130,-22979 }, { 131,-22979 }, { 132,-22979 }, { 133,-22979 }, { 134,-22979 }, + { 135,-22979 }, { 136,-22979 }, { 137,-22979 }, { 138,-22979 }, { 139,-22979 }, + { 140,-22979 }, { 141,-22979 }, { 142,-22979 }, { 143,-22979 }, { 144,-22979 }, + { 145,-22979 }, { 146,-22979 }, { 147,-22979 }, { 148,-22979 }, { 149,-22979 }, + { 150,-22979 }, { 151,-22979 }, { 152,-22979 }, { 153,-22979 }, { 154,-22979 }, + + { 155,-22979 }, { 156,-22979 }, { 157,-22979 }, { 158,-22979 }, { 159,-22979 }, + { 160,-22979 }, { 161,-22979 }, { 162,-22979 }, { 163,-22979 }, { 164,-22979 }, + { 165,-22979 }, { 166,-22979 }, { 167,-22979 }, { 168,-22979 }, { 169,-22979 }, + { 170,-22979 }, { 171,-22979 }, { 172,-22979 }, { 173,-22979 }, { 174,-22979 }, + { 175,-22979 }, { 176,-22979 }, { 177,-22979 }, { 178,-22979 }, { 179,-22979 }, + { 180,-22979 }, { 181,-22979 }, { 182,-22979 }, { 183,-22979 }, { 184,-22979 }, + { 185,-22979 }, { 186,-22979 }, { 187,-22979 }, { 188,-22979 }, { 189,-22979 }, + { 190,-22979 }, { 191,-22979 }, { 192,-22979 }, { 193,-22979 }, { 194,-22979 }, + { 195,-22979 }, { 196,-22979 }, { 197,-22979 }, { 198,-22979 }, { 199,-22979 }, + { 200,-22979 }, { 201,-22979 }, { 202,-22979 }, { 203,-22979 }, { 204,-22979 }, + + { 205,-22979 }, { 206,-22979 }, { 207,-22979 }, { 208,-22979 }, { 209,-22979 }, + { 210,-22979 }, { 211,-22979 }, { 212,-22979 }, { 213,-22979 }, { 214,-22979 }, + { 215,-22979 }, { 216,-22979 }, { 217,-22979 }, { 218,-22979 }, { 219,-22979 }, + { 220,-22979 }, { 221,-22979 }, { 222,-22979 }, { 223,-22979 }, { 224,-22979 }, + { 225,-22979 }, { 226,-22979 }, { 227,-22979 }, { 228,-22979 }, { 229,-22979 }, + { 230,-22979 }, { 231,-22979 }, { 232,-22979 }, { 233,-22979 }, { 234,-22979 }, + { 235,-22979 }, { 236,-22979 }, { 237,-22979 }, { 238,-22979 }, { 239,-22979 }, + { 240,-22979 }, { 241,-22979 }, { 242,-22979 }, { 243,-22979 }, { 244,-22979 }, + { 245,-22979 }, { 246,-22979 }, { 247,-22979 }, { 248,-22979 }, { 249,-22979 }, + { 250,-22979 }, { 251,-22979 }, { 252,-22979 }, { 253,-22979 }, { 254,-22979 }, + + { 255,-22979 }, { 0, 131 }, { 0,68887 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 48,-23236 }, { 49,-23236 }, { 50,-23236 }, { 51,-23236 }, { 52,-23236 }, + { 53,-23236 }, { 54,-23236 }, { 55,-23236 }, { 56,-23236 }, { 57,-23236 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-23236 }, { 66,-23236 }, { 67,-23236 }, + { 68,-23236 }, { 69,-23236 }, { 70,-23236 }, { 71,-23236 }, { 72,-23236 }, + { 73,-23236 }, { 74,-23236 }, { 75,-23236 }, { 76,-23236 }, { 77,-23236 }, + { 78,15682 }, { 79,-23236 }, { 80,-23236 }, { 81,-23236 }, { 82,-23236 }, + { 83,-23236 }, { 84,-23236 }, { 85,-23236 }, { 86,15939 }, { 87,-23236 }, + { 88,-23236 }, { 89,-23236 }, { 90,-23236 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-23236 }, { 0, 0 }, { 97,-23236 }, + + { 98,-23236 }, { 99,-23236 }, { 100,-23236 }, { 101,-23236 }, { 102,-23236 }, + { 103,-23236 }, { 104,-23236 }, { 105,-23236 }, { 106,-23236 }, { 107,-23236 }, + { 108,-23236 }, { 109,-23236 }, { 110,15682 }, { 111,-23236 }, { 112,-23236 }, + { 113,-23236 }, { 114,-23236 }, { 115,-23236 }, { 116,-23236 }, { 117,-23236 }, + { 118,15939 }, { 119,-23236 }, { 120,-23236 }, { 121,-23236 }, { 122,-23236 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-23236 }, + { 128,-23236 }, { 129,-23236 }, { 130,-23236 }, { 131,-23236 }, { 132,-23236 }, + { 133,-23236 }, { 134,-23236 }, { 135,-23236 }, { 136,-23236 }, { 137,-23236 }, + { 138,-23236 }, { 139,-23236 }, { 140,-23236 }, { 141,-23236 }, { 142,-23236 }, + { 143,-23236 }, { 144,-23236 }, { 145,-23236 }, { 146,-23236 }, { 147,-23236 }, + + { 148,-23236 }, { 149,-23236 }, { 150,-23236 }, { 151,-23236 }, { 152,-23236 }, + { 153,-23236 }, { 154,-23236 }, { 155,-23236 }, { 156,-23236 }, { 157,-23236 }, + { 158,-23236 }, { 159,-23236 }, { 160,-23236 }, { 161,-23236 }, { 162,-23236 }, + { 163,-23236 }, { 164,-23236 }, { 165,-23236 }, { 166,-23236 }, { 167,-23236 }, + { 168,-23236 }, { 169,-23236 }, { 170,-23236 }, { 171,-23236 }, { 172,-23236 }, + { 173,-23236 }, { 174,-23236 }, { 175,-23236 }, { 176,-23236 }, { 177,-23236 }, + { 178,-23236 }, { 179,-23236 }, { 180,-23236 }, { 181,-23236 }, { 182,-23236 }, + { 183,-23236 }, { 184,-23236 }, { 185,-23236 }, { 186,-23236 }, { 187,-23236 }, + { 188,-23236 }, { 189,-23236 }, { 190,-23236 }, { 191,-23236 }, { 192,-23236 }, + { 193,-23236 }, { 194,-23236 }, { 195,-23236 }, { 196,-23236 }, { 197,-23236 }, + + { 198,-23236 }, { 199,-23236 }, { 200,-23236 }, { 201,-23236 }, { 202,-23236 }, + { 203,-23236 }, { 204,-23236 }, { 205,-23236 }, { 206,-23236 }, { 207,-23236 }, + { 208,-23236 }, { 209,-23236 }, { 210,-23236 }, { 211,-23236 }, { 212,-23236 }, + { 213,-23236 }, { 214,-23236 }, { 215,-23236 }, { 216,-23236 }, { 217,-23236 }, + { 218,-23236 }, { 219,-23236 }, { 220,-23236 }, { 221,-23236 }, { 222,-23236 }, + { 223,-23236 }, { 224,-23236 }, { 225,-23236 }, { 226,-23236 }, { 227,-23236 }, + { 228,-23236 }, { 229,-23236 }, { 230,-23236 }, { 231,-23236 }, { 232,-23236 }, + { 233,-23236 }, { 234,-23236 }, { 235,-23236 }, { 236,-23236 }, { 237,-23236 }, + { 238,-23236 }, { 239,-23236 }, { 240,-23236 }, { 241,-23236 }, { 242,-23236 }, + { 243,-23236 }, { 244,-23236 }, { 245,-23236 }, { 246,-23236 }, { 247,-23236 }, + + { 248,-23236 }, { 249,-23236 }, { 250,-23236 }, { 251,-23236 }, { 252,-23236 }, + { 253,-23236 }, { 254,-23236 }, { 255,-23236 }, { 0, 131 }, { 0,68630 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-23493 }, { 49,-23493 }, { 50,-23493 }, + { 51,-23493 }, { 52,-23493 }, { 53,-23493 }, { 54,-23493 }, { 55,-23493 }, + { 56,-23493 }, { 57,-23493 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-23493 }, + { 66,-23493 }, { 67,-23493 }, { 68,-23493 }, { 69,-23493 }, { 70,-23493 }, + { 71,-23493 }, { 72,-23493 }, { 73,-23493 }, { 74,-23493 }, { 75,-23493 }, + { 76,-23493 }, { 77,-23493 }, { 78,-23493 }, { 79,-23493 }, { 80,-23493 }, + { 81,-23493 }, { 82,-23493 }, { 83,-23493 }, { 84,15939 }, { 85,-23493 }, + { 86,-23493 }, { 87,-23493 }, { 88,-23493 }, { 89,-23493 }, { 90,-23493 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-23493 }, + { 0, 0 }, { 97,-23493 }, { 98,-23493 }, { 99,-23493 }, { 100,-23493 }, + { 101,-23493 }, { 102,-23493 }, { 103,-23493 }, { 104,-23493 }, { 105,-23493 }, + { 106,-23493 }, { 107,-23493 }, { 108,-23493 }, { 109,-23493 }, { 110,-23493 }, + { 111,-23493 }, { 112,-23493 }, { 113,-23493 }, { 114,-23493 }, { 115,-23493 }, + { 116,15939 }, { 117,-23493 }, { 118,-23493 }, { 119,-23493 }, { 120,-23493 }, + { 121,-23493 }, { 122,-23493 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-23493 }, { 128,-23493 }, { 129,-23493 }, { 130,-23493 }, + { 131,-23493 }, { 132,-23493 }, { 133,-23493 }, { 134,-23493 }, { 135,-23493 }, + { 136,-23493 }, { 137,-23493 }, { 138,-23493 }, { 139,-23493 }, { 140,-23493 }, + + { 141,-23493 }, { 142,-23493 }, { 143,-23493 }, { 144,-23493 }, { 145,-23493 }, + { 146,-23493 }, { 147,-23493 }, { 148,-23493 }, { 149,-23493 }, { 150,-23493 }, + { 151,-23493 }, { 152,-23493 }, { 153,-23493 }, { 154,-23493 }, { 155,-23493 }, + { 156,-23493 }, { 157,-23493 }, { 158,-23493 }, { 159,-23493 }, { 160,-23493 }, + { 161,-23493 }, { 162,-23493 }, { 163,-23493 }, { 164,-23493 }, { 165,-23493 }, + { 166,-23493 }, { 167,-23493 }, { 168,-23493 }, { 169,-23493 }, { 170,-23493 }, + { 171,-23493 }, { 172,-23493 }, { 173,-23493 }, { 174,-23493 }, { 175,-23493 }, + { 176,-23493 }, { 177,-23493 }, { 178,-23493 }, { 179,-23493 }, { 180,-23493 }, + { 181,-23493 }, { 182,-23493 }, { 183,-23493 }, { 184,-23493 }, { 185,-23493 }, + { 186,-23493 }, { 187,-23493 }, { 188,-23493 }, { 189,-23493 }, { 190,-23493 }, + + { 191,-23493 }, { 192,-23493 }, { 193,-23493 }, { 194,-23493 }, { 195,-23493 }, + { 196,-23493 }, { 197,-23493 }, { 198,-23493 }, { 199,-23493 }, { 200,-23493 }, + { 201,-23493 }, { 202,-23493 }, { 203,-23493 }, { 204,-23493 }, { 205,-23493 }, + { 206,-23493 }, { 207,-23493 }, { 208,-23493 }, { 209,-23493 }, { 210,-23493 }, + { 211,-23493 }, { 212,-23493 }, { 213,-23493 }, { 214,-23493 }, { 215,-23493 }, + { 216,-23493 }, { 217,-23493 }, { 218,-23493 }, { 219,-23493 }, { 220,-23493 }, + { 221,-23493 }, { 222,-23493 }, { 223,-23493 }, { 224,-23493 }, { 225,-23493 }, + { 226,-23493 }, { 227,-23493 }, { 228,-23493 }, { 229,-23493 }, { 230,-23493 }, + { 231,-23493 }, { 232,-23493 }, { 233,-23493 }, { 234,-23493 }, { 235,-23493 }, + { 236,-23493 }, { 237,-23493 }, { 238,-23493 }, { 239,-23493 }, { 240,-23493 }, + + { 241,-23493 }, { 242,-23493 }, { 243,-23493 }, { 244,-23493 }, { 245,-23493 }, + { 246,-23493 }, { 247,-23493 }, { 248,-23493 }, { 249,-23493 }, { 250,-23493 }, + { 251,-23493 }, { 252,-23493 }, { 253,-23493 }, { 254,-23493 }, { 255,-23493 }, + { 0, 131 }, { 0,68373 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-23750 }, + { 49,-23750 }, { 50,-23750 }, { 51,-23750 }, { 52,-23750 }, { 53,-23750 }, + { 54,-23750 }, { 55,-23750 }, { 56,-23750 }, { 57,-23750 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-23750 }, { 66,-23750 }, { 67,-23750 }, { 68,-23750 }, + { 69,-23750 }, { 70,-23750 }, { 71,-23750 }, { 72,-23750 }, { 73,-23750 }, + { 74,-23750 }, { 75,-23750 }, { 76,15939 }, { 77,-23750 }, { 78,-23750 }, + { 79,-23750 }, { 80,-23750 }, { 81,-23750 }, { 82,-23750 }, { 83,-23750 }, + + { 84,-23750 }, { 85,-23750 }, { 86,-23750 }, { 87,-23750 }, { 88,-23750 }, + { 89,-23750 }, { 90,-23750 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-23750 }, { 0, 0 }, { 97,-23750 }, { 98,-23750 }, + { 99,-23750 }, { 100,-23750 }, { 101,-23750 }, { 102,-23750 }, { 103,-23750 }, + { 104,-23750 }, { 105,-23750 }, { 106,-23750 }, { 107,-23750 }, { 108,15939 }, + { 109,-23750 }, { 110,-23750 }, { 111,-23750 }, { 112,-23750 }, { 113,-23750 }, + { 114,-23750 }, { 115,-23750 }, { 116,-23750 }, { 117,-23750 }, { 118,-23750 }, + { 119,-23750 }, { 120,-23750 }, { 121,-23750 }, { 122,-23750 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-23750 }, { 128,-23750 }, + { 129,-23750 }, { 130,-23750 }, { 131,-23750 }, { 132,-23750 }, { 133,-23750 }, + + { 134,-23750 }, { 135,-23750 }, { 136,-23750 }, { 137,-23750 }, { 138,-23750 }, + { 139,-23750 }, { 140,-23750 }, { 141,-23750 }, { 142,-23750 }, { 143,-23750 }, + { 144,-23750 }, { 145,-23750 }, { 146,-23750 }, { 147,-23750 }, { 148,-23750 }, + { 149,-23750 }, { 150,-23750 }, { 151,-23750 }, { 152,-23750 }, { 153,-23750 }, + { 154,-23750 }, { 155,-23750 }, { 156,-23750 }, { 157,-23750 }, { 158,-23750 }, + { 159,-23750 }, { 160,-23750 }, { 161,-23750 }, { 162,-23750 }, { 163,-23750 }, + { 164,-23750 }, { 165,-23750 }, { 166,-23750 }, { 167,-23750 }, { 168,-23750 }, + { 169,-23750 }, { 170,-23750 }, { 171,-23750 }, { 172,-23750 }, { 173,-23750 }, + { 174,-23750 }, { 175,-23750 }, { 176,-23750 }, { 177,-23750 }, { 178,-23750 }, + { 179,-23750 }, { 180,-23750 }, { 181,-23750 }, { 182,-23750 }, { 183,-23750 }, + + { 184,-23750 }, { 185,-23750 }, { 186,-23750 }, { 187,-23750 }, { 188,-23750 }, + { 189,-23750 }, { 190,-23750 }, { 191,-23750 }, { 192,-23750 }, { 193,-23750 }, + { 194,-23750 }, { 195,-23750 }, { 196,-23750 }, { 197,-23750 }, { 198,-23750 }, + { 199,-23750 }, { 200,-23750 }, { 201,-23750 }, { 202,-23750 }, { 203,-23750 }, + { 204,-23750 }, { 205,-23750 }, { 206,-23750 }, { 207,-23750 }, { 208,-23750 }, + { 209,-23750 }, { 210,-23750 }, { 211,-23750 }, { 212,-23750 }, { 213,-23750 }, + { 214,-23750 }, { 215,-23750 }, { 216,-23750 }, { 217,-23750 }, { 218,-23750 }, + { 219,-23750 }, { 220,-23750 }, { 221,-23750 }, { 222,-23750 }, { 223,-23750 }, + { 224,-23750 }, { 225,-23750 }, { 226,-23750 }, { 227,-23750 }, { 228,-23750 }, + { 229,-23750 }, { 230,-23750 }, { 231,-23750 }, { 232,-23750 }, { 233,-23750 }, + + { 234,-23750 }, { 235,-23750 }, { 236,-23750 }, { 237,-23750 }, { 238,-23750 }, + { 239,-23750 }, { 240,-23750 }, { 241,-23750 }, { 242,-23750 }, { 243,-23750 }, + { 244,-23750 }, { 245,-23750 }, { 246,-23750 }, { 247,-23750 }, { 248,-23750 }, + { 249,-23750 }, { 250,-23750 }, { 251,-23750 }, { 252,-23750 }, { 253,-23750 }, + { 254,-23750 }, { 255,-23750 }, { 0, 131 }, { 0,68116 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-24007 }, { 49,-24007 }, { 50,-24007 }, { 51,-24007 }, + { 52,-24007 }, { 53,-24007 }, { 54,-24007 }, { 55,-24007 }, { 56,-24007 }, + { 57,-24007 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-24007 }, { 66,-24007 }, + { 67,-24007 }, { 68,-24007 }, { 69,-24007 }, { 70,-24007 }, { 71,-24007 }, + { 72,-24007 }, { 73,-24007 }, { 74,-24007 }, { 75,-24007 }, { 76,-24007 }, + + { 77,-24007 }, { 78,-24007 }, { 79,-24007 }, { 80,-24007 }, { 81,-24007 }, + { 82,-24007 }, { 83,-24007 }, { 84,-24007 }, { 85,15939 }, { 86,-24007 }, + { 87,-24007 }, { 88,-24007 }, { 89,-24007 }, { 90,-24007 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-24007 }, { 0, 0 }, + { 97,-24007 }, { 98,-24007 }, { 99,-24007 }, { 100,-24007 }, { 101,-24007 }, + { 102,-24007 }, { 103,-24007 }, { 104,-24007 }, { 105,-24007 }, { 106,-24007 }, + { 107,-24007 }, { 108,-24007 }, { 109,-24007 }, { 110,-24007 }, { 111,-24007 }, + { 112,-24007 }, { 113,-24007 }, { 114,-24007 }, { 115,-24007 }, { 116,-24007 }, + { 117,15939 }, { 118,-24007 }, { 119,-24007 }, { 120,-24007 }, { 121,-24007 }, + { 122,-24007 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 127,-24007 }, { 128,-24007 }, { 129,-24007 }, { 130,-24007 }, { 131,-24007 }, + { 132,-24007 }, { 133,-24007 }, { 134,-24007 }, { 135,-24007 }, { 136,-24007 }, + { 137,-24007 }, { 138,-24007 }, { 139,-24007 }, { 140,-24007 }, { 141,-24007 }, + { 142,-24007 }, { 143,-24007 }, { 144,-24007 }, { 145,-24007 }, { 146,-24007 }, + { 147,-24007 }, { 148,-24007 }, { 149,-24007 }, { 150,-24007 }, { 151,-24007 }, + { 152,-24007 }, { 153,-24007 }, { 154,-24007 }, { 155,-24007 }, { 156,-24007 }, + { 157,-24007 }, { 158,-24007 }, { 159,-24007 }, { 160,-24007 }, { 161,-24007 }, + { 162,-24007 }, { 163,-24007 }, { 164,-24007 }, { 165,-24007 }, { 166,-24007 }, + { 167,-24007 }, { 168,-24007 }, { 169,-24007 }, { 170,-24007 }, { 171,-24007 }, + { 172,-24007 }, { 173,-24007 }, { 174,-24007 }, { 175,-24007 }, { 176,-24007 }, + + { 177,-24007 }, { 178,-24007 }, { 179,-24007 }, { 180,-24007 }, { 181,-24007 }, + { 182,-24007 }, { 183,-24007 }, { 184,-24007 }, { 185,-24007 }, { 186,-24007 }, + { 187,-24007 }, { 188,-24007 }, { 189,-24007 }, { 190,-24007 }, { 191,-24007 }, + { 192,-24007 }, { 193,-24007 }, { 194,-24007 }, { 195,-24007 }, { 196,-24007 }, + { 197,-24007 }, { 198,-24007 }, { 199,-24007 }, { 200,-24007 }, { 201,-24007 }, + { 202,-24007 }, { 203,-24007 }, { 204,-24007 }, { 205,-24007 }, { 206,-24007 }, + { 207,-24007 }, { 208,-24007 }, { 209,-24007 }, { 210,-24007 }, { 211,-24007 }, + { 212,-24007 }, { 213,-24007 }, { 214,-24007 }, { 215,-24007 }, { 216,-24007 }, + { 217,-24007 }, { 218,-24007 }, { 219,-24007 }, { 220,-24007 }, { 221,-24007 }, + { 222,-24007 }, { 223,-24007 }, { 224,-24007 }, { 225,-24007 }, { 226,-24007 }, + + { 227,-24007 }, { 228,-24007 }, { 229,-24007 }, { 230,-24007 }, { 231,-24007 }, + { 232,-24007 }, { 233,-24007 }, { 234,-24007 }, { 235,-24007 }, { 236,-24007 }, + { 237,-24007 }, { 238,-24007 }, { 239,-24007 }, { 240,-24007 }, { 241,-24007 }, + { 242,-24007 }, { 243,-24007 }, { 244,-24007 }, { 245,-24007 }, { 246,-24007 }, + { 247,-24007 }, { 248,-24007 }, { 249,-24007 }, { 250,-24007 }, { 251,-24007 }, + { 252,-24007 }, { 253,-24007 }, { 254,-24007 }, { 255,-24007 }, { 0, 131 }, + { 0,67859 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-24264 }, { 49,-24264 }, + { 50,-24264 }, { 51,-24264 }, { 52,-24264 }, { 53,-24264 }, { 54,-24264 }, + { 55,-24264 }, { 56,-24264 }, { 57,-24264 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-24264 }, { 66,-24264 }, { 67,-24264 }, { 68,-24264 }, { 69,-24264 }, + + { 70,-24264 }, { 71,-24264 }, { 72,-24264 }, { 73,-24264 }, { 74,-24264 }, + { 75,-24264 }, { 76,-24264 }, { 77,-24264 }, { 78,-24264 }, { 79,-24264 }, + { 80,-24264 }, { 81,-24264 }, { 82,-24264 }, { 83,-24264 }, { 84,-24264 }, + { 85,15939 }, { 86,-24264 }, { 87,-24264 }, { 88,-24264 }, { 89,-24264 }, + { 90,-24264 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-24264 }, { 0, 0 }, { 97,-24264 }, { 98,-24264 }, { 99,-24264 }, + { 100,-24264 }, { 101,-24264 }, { 102,-24264 }, { 103,-24264 }, { 104,-24264 }, + { 105,-24264 }, { 106,-24264 }, { 107,-24264 }, { 108,-24264 }, { 109,-24264 }, + { 110,-24264 }, { 111,-24264 }, { 112,-24264 }, { 113,-24264 }, { 114,-24264 }, + { 115,-24264 }, { 116,-24264 }, { 117,15939 }, { 118,-24264 }, { 119,-24264 }, + + { 120,-24264 }, { 121,-24264 }, { 122,-24264 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-24264 }, { 128,-24264 }, { 129,-24264 }, + { 130,-24264 }, { 131,-24264 }, { 132,-24264 }, { 133,-24264 }, { 134,-24264 }, + { 135,-24264 }, { 136,-24264 }, { 137,-24264 }, { 138,-24264 }, { 139,-24264 }, + { 140,-24264 }, { 141,-24264 }, { 142,-24264 }, { 143,-24264 }, { 144,-24264 }, + { 145,-24264 }, { 146,-24264 }, { 147,-24264 }, { 148,-24264 }, { 149,-24264 }, + { 150,-24264 }, { 151,-24264 }, { 152,-24264 }, { 153,-24264 }, { 154,-24264 }, + { 155,-24264 }, { 156,-24264 }, { 157,-24264 }, { 158,-24264 }, { 159,-24264 }, + { 160,-24264 }, { 161,-24264 }, { 162,-24264 }, { 163,-24264 }, { 164,-24264 }, + { 165,-24264 }, { 166,-24264 }, { 167,-24264 }, { 168,-24264 }, { 169,-24264 }, + + { 170,-24264 }, { 171,-24264 }, { 172,-24264 }, { 173,-24264 }, { 174,-24264 }, + { 175,-24264 }, { 176,-24264 }, { 177,-24264 }, { 178,-24264 }, { 179,-24264 }, + { 180,-24264 }, { 181,-24264 }, { 182,-24264 }, { 183,-24264 }, { 184,-24264 }, + { 185,-24264 }, { 186,-24264 }, { 187,-24264 }, { 188,-24264 }, { 189,-24264 }, + { 190,-24264 }, { 191,-24264 }, { 192,-24264 }, { 193,-24264 }, { 194,-24264 }, + { 195,-24264 }, { 196,-24264 }, { 197,-24264 }, { 198,-24264 }, { 199,-24264 }, + { 200,-24264 }, { 201,-24264 }, { 202,-24264 }, { 203,-24264 }, { 204,-24264 }, + { 205,-24264 }, { 206,-24264 }, { 207,-24264 }, { 208,-24264 }, { 209,-24264 }, + { 210,-24264 }, { 211,-24264 }, { 212,-24264 }, { 213,-24264 }, { 214,-24264 }, + { 215,-24264 }, { 216,-24264 }, { 217,-24264 }, { 218,-24264 }, { 219,-24264 }, + + { 220,-24264 }, { 221,-24264 }, { 222,-24264 }, { 223,-24264 }, { 224,-24264 }, + { 225,-24264 }, { 226,-24264 }, { 227,-24264 }, { 228,-24264 }, { 229,-24264 }, + { 230,-24264 }, { 231,-24264 }, { 232,-24264 }, { 233,-24264 }, { 234,-24264 }, + { 235,-24264 }, { 236,-24264 }, { 237,-24264 }, { 238,-24264 }, { 239,-24264 }, + { 240,-24264 }, { 241,-24264 }, { 242,-24264 }, { 243,-24264 }, { 244,-24264 }, + { 245,-24264 }, { 246,-24264 }, { 247,-24264 }, { 248,-24264 }, { 249,-24264 }, + { 250,-24264 }, { 251,-24264 }, { 252,-24264 }, { 253,-24264 }, { 254,-24264 }, + { 255,-24264 }, { 0, 131 }, { 0,67602 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-24521 }, { 49,-24521 }, { 50,-24521 }, { 51,-24521 }, { 52,-24521 }, + { 53,-24521 }, { 54,-24521 }, { 55,-24521 }, { 56,-24521 }, { 57,-24521 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 65,-24521 }, { 66,-24521 }, { 67,-24521 }, + { 68,-24521 }, { 69,-24521 }, { 70,-24521 }, { 71,-24521 }, { 72,-24521 }, + { 73,-24521 }, { 74,-24521 }, { 75,-24521 }, { 76,-24521 }, { 77,-24521 }, + { 78,-24521 }, { 79,-24521 }, { 80,-24521 }, { 81,-24521 }, { 82,-24521 }, + { 83,-24521 }, { 84,15939 }, { 85,-24521 }, { 86,-24521 }, { 87,-24521 }, + { 88,-24521 }, { 89,-24521 }, { 90,-24521 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-24521 }, { 0, 0 }, { 97,-24521 }, + { 98,-24521 }, { 99,-24521 }, { 100,-24521 }, { 101,-24521 }, { 102,-24521 }, + { 103,-24521 }, { 104,-24521 }, { 105,-24521 }, { 106,-24521 }, { 107,-24521 }, + { 108,-24521 }, { 109,-24521 }, { 110,-24521 }, { 111,-24521 }, { 112,-24521 }, + + { 113,-24521 }, { 114,-24521 }, { 115,-24521 }, { 116,15939 }, { 117,-24521 }, + { 118,-24521 }, { 119,-24521 }, { 120,-24521 }, { 121,-24521 }, { 122,-24521 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-24521 }, + { 128,-24521 }, { 129,-24521 }, { 130,-24521 }, { 131,-24521 }, { 132,-24521 }, + { 133,-24521 }, { 134,-24521 }, { 135,-24521 }, { 136,-24521 }, { 137,-24521 }, + { 138,-24521 }, { 139,-24521 }, { 140,-24521 }, { 141,-24521 }, { 142,-24521 }, + { 143,-24521 }, { 144,-24521 }, { 145,-24521 }, { 146,-24521 }, { 147,-24521 }, + { 148,-24521 }, { 149,-24521 }, { 150,-24521 }, { 151,-24521 }, { 152,-24521 }, + { 153,-24521 }, { 154,-24521 }, { 155,-24521 }, { 156,-24521 }, { 157,-24521 }, + { 158,-24521 }, { 159,-24521 }, { 160,-24521 }, { 161,-24521 }, { 162,-24521 }, + + { 163,-24521 }, { 164,-24521 }, { 165,-24521 }, { 166,-24521 }, { 167,-24521 }, + { 168,-24521 }, { 169,-24521 }, { 170,-24521 }, { 171,-24521 }, { 172,-24521 }, + { 173,-24521 }, { 174,-24521 }, { 175,-24521 }, { 176,-24521 }, { 177,-24521 }, + { 178,-24521 }, { 179,-24521 }, { 180,-24521 }, { 181,-24521 }, { 182,-24521 }, + { 183,-24521 }, { 184,-24521 }, { 185,-24521 }, { 186,-24521 }, { 187,-24521 }, + { 188,-24521 }, { 189,-24521 }, { 190,-24521 }, { 191,-24521 }, { 192,-24521 }, + { 193,-24521 }, { 194,-24521 }, { 195,-24521 }, { 196,-24521 }, { 197,-24521 }, + { 198,-24521 }, { 199,-24521 }, { 200,-24521 }, { 201,-24521 }, { 202,-24521 }, + { 203,-24521 }, { 204,-24521 }, { 205,-24521 }, { 206,-24521 }, { 207,-24521 }, + { 208,-24521 }, { 209,-24521 }, { 210,-24521 }, { 211,-24521 }, { 212,-24521 }, + + { 213,-24521 }, { 214,-24521 }, { 215,-24521 }, { 216,-24521 }, { 217,-24521 }, + { 218,-24521 }, { 219,-24521 }, { 220,-24521 }, { 221,-24521 }, { 222,-24521 }, + { 223,-24521 }, { 224,-24521 }, { 225,-24521 }, { 226,-24521 }, { 227,-24521 }, + { 228,-24521 }, { 229,-24521 }, { 230,-24521 }, { 231,-24521 }, { 232,-24521 }, + { 233,-24521 }, { 234,-24521 }, { 235,-24521 }, { 236,-24521 }, { 237,-24521 }, + { 238,-24521 }, { 239,-24521 }, { 240,-24521 }, { 241,-24521 }, { 242,-24521 }, + { 243,-24521 }, { 244,-24521 }, { 245,-24521 }, { 246,-24521 }, { 247,-24521 }, + { 248,-24521 }, { 249,-24521 }, { 250,-24521 }, { 251,-24521 }, { 252,-24521 }, + { 253,-24521 }, { 254,-24521 }, { 255,-24521 }, { 0, 131 }, { 0,67345 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-24778 }, { 49,-24778 }, { 50,-24778 }, + { 51,-24778 }, { 52,-24778 }, { 53,-24778 }, { 54,-24778 }, { 55,-24778 }, + + { 56,-24778 }, { 57,-24778 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-24778 }, + { 66,-24778 }, { 67,-24778 }, { 68,-24778 }, { 69,-24778 }, { 70,-24778 }, + { 71,-24778 }, { 72,-24778 }, { 73,-24778 }, { 74,-24778 }, { 75,-24778 }, + { 76,-24778 }, { 77,-24778 }, { 78,-24778 }, { 79,-24778 }, { 80,-24778 }, + { 81,-24778 }, { 82,-24778 }, { 83,-24778 }, { 84,15939 }, { 85,-24778 }, + { 86,-24778 }, { 87,-24778 }, { 88,-24778 }, { 89,-24778 }, { 90,-24778 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-24778 }, + { 0, 0 }, { 97,-24778 }, { 98,-24778 }, { 99,-24778 }, { 100,-24778 }, + { 101,-24778 }, { 102,-24778 }, { 103,-24778 }, { 104,-24778 }, { 105,-24778 }, + + { 106,-24778 }, { 107,-24778 }, { 108,-24778 }, { 109,-24778 }, { 110,-24778 }, + { 111,-24778 }, { 112,-24778 }, { 113,-24778 }, { 114,-24778 }, { 115,-24778 }, + { 116,15939 }, { 117,-24778 }, { 118,-24778 }, { 119,-24778 }, { 120,-24778 }, + { 121,-24778 }, { 122,-24778 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-24778 }, { 128,-24778 }, { 129,-24778 }, { 130,-24778 }, + { 131,-24778 }, { 132,-24778 }, { 133,-24778 }, { 134,-24778 }, { 135,-24778 }, + { 136,-24778 }, { 137,-24778 }, { 138,-24778 }, { 139,-24778 }, { 140,-24778 }, + { 141,-24778 }, { 142,-24778 }, { 143,-24778 }, { 144,-24778 }, { 145,-24778 }, + { 146,-24778 }, { 147,-24778 }, { 148,-24778 }, { 149,-24778 }, { 150,-24778 }, + { 151,-24778 }, { 152,-24778 }, { 153,-24778 }, { 154,-24778 }, { 155,-24778 }, + + { 156,-24778 }, { 157,-24778 }, { 158,-24778 }, { 159,-24778 }, { 160,-24778 }, + { 161,-24778 }, { 162,-24778 }, { 163,-24778 }, { 164,-24778 }, { 165,-24778 }, + { 166,-24778 }, { 167,-24778 }, { 168,-24778 }, { 169,-24778 }, { 170,-24778 }, + { 171,-24778 }, { 172,-24778 }, { 173,-24778 }, { 174,-24778 }, { 175,-24778 }, + { 176,-24778 }, { 177,-24778 }, { 178,-24778 }, { 179,-24778 }, { 180,-24778 }, + { 181,-24778 }, { 182,-24778 }, { 183,-24778 }, { 184,-24778 }, { 185,-24778 }, + { 186,-24778 }, { 187,-24778 }, { 188,-24778 }, { 189,-24778 }, { 190,-24778 }, + { 191,-24778 }, { 192,-24778 }, { 193,-24778 }, { 194,-24778 }, { 195,-24778 }, + { 196,-24778 }, { 197,-24778 }, { 198,-24778 }, { 199,-24778 }, { 200,-24778 }, + { 201,-24778 }, { 202,-24778 }, { 203,-24778 }, { 204,-24778 }, { 205,-24778 }, + + { 206,-24778 }, { 207,-24778 }, { 208,-24778 }, { 209,-24778 }, { 210,-24778 }, + { 211,-24778 }, { 212,-24778 }, { 213,-24778 }, { 214,-24778 }, { 215,-24778 }, + { 216,-24778 }, { 217,-24778 }, { 218,-24778 }, { 219,-24778 }, { 220,-24778 }, + { 221,-24778 }, { 222,-24778 }, { 223,-24778 }, { 224,-24778 }, { 225,-24778 }, + { 226,-24778 }, { 227,-24778 }, { 228,-24778 }, { 229,-24778 }, { 230,-24778 }, + { 231,-24778 }, { 232,-24778 }, { 233,-24778 }, { 234,-24778 }, { 235,-24778 }, + { 236,-24778 }, { 237,-24778 }, { 238,-24778 }, { 239,-24778 }, { 240,-24778 }, + { 241,-24778 }, { 242,-24778 }, { 243,-24778 }, { 244,-24778 }, { 245,-24778 }, + { 246,-24778 }, { 247,-24778 }, { 248,-24778 }, { 249,-24778 }, { 250,-24778 }, + { 251,-24778 }, { 252,-24778 }, { 253,-24778 }, { 254,-24778 }, { 255,-24778 }, + + { 0, 131 }, { 0,67088 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-25035 }, + + { 49,-25035 }, { 50,-25035 }, { 51,-25035 }, { 52,-25035 }, { 53,-25035 }, + { 54,-25035 }, { 55,-25035 }, { 56,-25035 }, { 57,-25035 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-25035 }, { 66,-25035 }, { 67,-25035 }, { 68,-25035 }, + { 69,-25035 }, { 70,-25035 }, { 71,-25035 }, { 72,-25035 }, { 73,-25035 }, + { 74,-25035 }, { 75,-25035 }, { 76,-25035 }, { 77,-25035 }, { 78,-25035 }, + { 79,15939 }, { 80,-25035 }, { 81,-25035 }, { 82,-25035 }, { 83,-25035 }, + { 84,-25035 }, { 85,-25035 }, { 86,-25035 }, { 87,-25035 }, { 88,-25035 }, + { 89,-25035 }, { 90,-25035 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-25035 }, { 0, 0 }, { 97,-25035 }, { 98,-25035 }, + + { 99,-25035 }, { 100,-25035 }, { 101,-25035 }, { 102,-25035 }, { 103,-25035 }, + { 104,-25035 }, { 105,-25035 }, { 106,-25035 }, { 107,-25035 }, { 108,-25035 }, + { 109,-25035 }, { 110,-25035 }, { 111,15939 }, { 112,-25035 }, { 113,-25035 }, + { 114,-25035 }, { 115,-25035 }, { 116,-25035 }, { 117,-25035 }, { 118,-25035 }, + { 119,-25035 }, { 120,-25035 }, { 121,-25035 }, { 122,-25035 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-25035 }, { 128,-25035 }, + { 129,-25035 }, { 130,-25035 }, { 131,-25035 }, { 132,-25035 }, { 133,-25035 }, + { 134,-25035 }, { 135,-25035 }, { 136,-25035 }, { 137,-25035 }, { 138,-25035 }, + { 139,-25035 }, { 140,-25035 }, { 141,-25035 }, { 142,-25035 }, { 143,-25035 }, + { 144,-25035 }, { 145,-25035 }, { 146,-25035 }, { 147,-25035 }, { 148,-25035 }, + + { 149,-25035 }, { 150,-25035 }, { 151,-25035 }, { 152,-25035 }, { 153,-25035 }, + { 154,-25035 }, { 155,-25035 }, { 156,-25035 }, { 157,-25035 }, { 158,-25035 }, + { 159,-25035 }, { 160,-25035 }, { 161,-25035 }, { 162,-25035 }, { 163,-25035 }, + { 164,-25035 }, { 165,-25035 }, { 166,-25035 }, { 167,-25035 }, { 168,-25035 }, + { 169,-25035 }, { 170,-25035 }, { 171,-25035 }, { 172,-25035 }, { 173,-25035 }, + { 174,-25035 }, { 175,-25035 }, { 176,-25035 }, { 177,-25035 }, { 178,-25035 }, + { 179,-25035 }, { 180,-25035 }, { 181,-25035 }, { 182,-25035 }, { 183,-25035 }, + { 184,-25035 }, { 185,-25035 }, { 186,-25035 }, { 187,-25035 }, { 188,-25035 }, + { 189,-25035 }, { 190,-25035 }, { 191,-25035 }, { 192,-25035 }, { 193,-25035 }, + { 194,-25035 }, { 195,-25035 }, { 196,-25035 }, { 197,-25035 }, { 198,-25035 }, + + { 199,-25035 }, { 200,-25035 }, { 201,-25035 }, { 202,-25035 }, { 203,-25035 }, + { 204,-25035 }, { 205,-25035 }, { 206,-25035 }, { 207,-25035 }, { 208,-25035 }, + { 209,-25035 }, { 210,-25035 }, { 211,-25035 }, { 212,-25035 }, { 213,-25035 }, + { 214,-25035 }, { 215,-25035 }, { 216,-25035 }, { 217,-25035 }, { 218,-25035 }, + { 219,-25035 }, { 220,-25035 }, { 221,-25035 }, { 222,-25035 }, { 223,-25035 }, + { 224,-25035 }, { 225,-25035 }, { 226,-25035 }, { 227,-25035 }, { 228,-25035 }, + { 229,-25035 }, { 230,-25035 }, { 231,-25035 }, { 232,-25035 }, { 233,-25035 }, + { 234,-25035 }, { 235,-25035 }, { 236,-25035 }, { 237,-25035 }, { 238,-25035 }, + { 239,-25035 }, { 240,-25035 }, { 241,-25035 }, { 242,-25035 }, { 243,-25035 }, + { 244,-25035 }, { 245,-25035 }, { 246,-25035 }, { 247,-25035 }, { 248,-25035 }, + + { 249,-25035 }, { 250,-25035 }, { 251,-25035 }, { 252,-25035 }, { 253,-25035 }, + { 254,-25035 }, { 255,-25035 }, { 0, 131 }, { 0,66831 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-25292 }, { 49,-25292 }, { 50,-25292 }, { 51,-25292 }, + { 52,-25292 }, { 53,-25292 }, { 54,-25292 }, { 55,-25292 }, { 56,-25292 }, + { 57,-25292 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-25292 }, { 66,-25292 }, + { 67,-25292 }, { 68,-25292 }, { 69,-25292 }, { 70,-25292 }, { 71,-25292 }, + { 72,-25292 }, { 73,15939 }, { 74,-25292 }, { 75,-25292 }, { 76,-25292 }, + { 77,-25292 }, { 78,-25292 }, { 79,-25292 }, { 80,-25292 }, { 81,-25292 }, + { 82,-25292 }, { 83,-25292 }, { 84,-25292 }, { 85,-25292 }, { 86,-25292 }, + { 87,-25292 }, { 88,-25292 }, { 89,-25292 }, { 90,-25292 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-25292 }, { 0, 0 }, + { 97,-25292 }, { 98,-25292 }, { 99,-25292 }, { 100,-25292 }, { 101,-25292 }, + { 102,-25292 }, { 103,-25292 }, { 104,-25292 }, { 105,15939 }, { 106,-25292 }, + { 107,-25292 }, { 108,-25292 }, { 109,-25292 }, { 110,-25292 }, { 111,-25292 }, + { 112,-25292 }, { 113,-25292 }, { 114,-25292 }, { 115,-25292 }, { 116,-25292 }, + { 117,-25292 }, { 118,-25292 }, { 119,-25292 }, { 120,-25292 }, { 121,-25292 }, + { 122,-25292 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-25292 }, { 128,-25292 }, { 129,-25292 }, { 130,-25292 }, { 131,-25292 }, + { 132,-25292 }, { 133,-25292 }, { 134,-25292 }, { 135,-25292 }, { 136,-25292 }, + { 137,-25292 }, { 138,-25292 }, { 139,-25292 }, { 140,-25292 }, { 141,-25292 }, + + { 142,-25292 }, { 143,-25292 }, { 144,-25292 }, { 145,-25292 }, { 146,-25292 }, + { 147,-25292 }, { 148,-25292 }, { 149,-25292 }, { 150,-25292 }, { 151,-25292 }, + { 152,-25292 }, { 153,-25292 }, { 154,-25292 }, { 155,-25292 }, { 156,-25292 }, + { 157,-25292 }, { 158,-25292 }, { 159,-25292 }, { 160,-25292 }, { 161,-25292 }, + { 162,-25292 }, { 163,-25292 }, { 164,-25292 }, { 165,-25292 }, { 166,-25292 }, + { 167,-25292 }, { 168,-25292 }, { 169,-25292 }, { 170,-25292 }, { 171,-25292 }, + { 172,-25292 }, { 173,-25292 }, { 174,-25292 }, { 175,-25292 }, { 176,-25292 }, + { 177,-25292 }, { 178,-25292 }, { 179,-25292 }, { 180,-25292 }, { 181,-25292 }, + { 182,-25292 }, { 183,-25292 }, { 184,-25292 }, { 185,-25292 }, { 186,-25292 }, + { 187,-25292 }, { 188,-25292 }, { 189,-25292 }, { 190,-25292 }, { 191,-25292 }, + + { 192,-25292 }, { 193,-25292 }, { 194,-25292 }, { 195,-25292 }, { 196,-25292 }, + { 197,-25292 }, { 198,-25292 }, { 199,-25292 }, { 200,-25292 }, { 201,-25292 }, + { 202,-25292 }, { 203,-25292 }, { 204,-25292 }, { 205,-25292 }, { 206,-25292 }, + { 207,-25292 }, { 208,-25292 }, { 209,-25292 }, { 210,-25292 }, { 211,-25292 }, + { 212,-25292 }, { 213,-25292 }, { 214,-25292 }, { 215,-25292 }, { 216,-25292 }, + { 217,-25292 }, { 218,-25292 }, { 219,-25292 }, { 220,-25292 }, { 221,-25292 }, + { 222,-25292 }, { 223,-25292 }, { 224,-25292 }, { 225,-25292 }, { 226,-25292 }, + { 227,-25292 }, { 228,-25292 }, { 229,-25292 }, { 230,-25292 }, { 231,-25292 }, + { 232,-25292 }, { 233,-25292 }, { 234,-25292 }, { 235,-25292 }, { 236,-25292 }, + { 237,-25292 }, { 238,-25292 }, { 239,-25292 }, { 240,-25292 }, { 241,-25292 }, + + { 242,-25292 }, { 243,-25292 }, { 244,-25292 }, { 245,-25292 }, { 246,-25292 }, + { 247,-25292 }, { 248,-25292 }, { 249,-25292 }, { 250,-25292 }, { 251,-25292 }, + { 252,-25292 }, { 253,-25292 }, { 254,-25292 }, { 255,-25292 }, { 0, 56 }, + { 0,66574 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-25549 }, { 49,-25549 }, + { 50,-25549 }, { 51,-25549 }, { 52,-25549 }, { 53,-25549 }, { 54,-25549 }, + { 55,-25549 }, { 56,-25549 }, { 57,-25549 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-25549 }, { 66,-25549 }, { 67,-25549 }, { 68,-25549 }, { 69,-25549 }, + { 70,-25549 }, { 71,-25549 }, { 72,-25549 }, { 73,-25549 }, { 74,-25549 }, + { 75,-25549 }, { 76,-25549 }, { 77,-25549 }, { 78,-25549 }, { 79,-25549 }, + { 80,-25549 }, { 81,-25549 }, { 82,-25549 }, { 83,-25549 }, { 84,-25549 }, + + { 85,-25549 }, { 86,-25549 }, { 87,-25549 }, { 88,-25549 }, { 89,-25549 }, + { 90,-25549 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-25549 }, { 0, 0 }, { 97,-25549 }, { 98,-25549 }, { 99,-25549 }, + { 100,-25549 }, { 101,-25549 }, { 102,-25549 }, { 103,-25549 }, { 104,-25549 }, + { 105,-25549 }, { 106,-25549 }, { 107,-25549 }, { 108,-25549 }, { 109,-25549 }, + { 110,-25549 }, { 111,-25549 }, { 112,-25549 }, { 113,-25549 }, { 114,-25549 }, + { 115,-25549 }, { 116,-25549 }, { 117,-25549 }, { 118,-25549 }, { 119,-25549 }, + { 120,-25549 }, { 121,-25549 }, { 122,-25549 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-25549 }, { 128,-25549 }, { 129,-25549 }, + { 130,-25549 }, { 131,-25549 }, { 132,-25549 }, { 133,-25549 }, { 134,-25549 }, + + { 135,-25549 }, { 136,-25549 }, { 137,-25549 }, { 138,-25549 }, { 139,-25549 }, + { 140,-25549 }, { 141,-25549 }, { 142,-25549 }, { 143,-25549 }, { 144,-25549 }, + { 145,-25549 }, { 146,-25549 }, { 147,-25549 }, { 148,-25549 }, { 149,-25549 }, + { 150,-25549 }, { 151,-25549 }, { 152,-25549 }, { 153,-25549 }, { 154,-25549 }, + { 155,-25549 }, { 156,-25549 }, { 157,-25549 }, { 158,-25549 }, { 159,-25549 }, + { 160,-25549 }, { 161,-25549 }, { 162,-25549 }, { 163,-25549 }, { 164,-25549 }, + { 165,-25549 }, { 166,-25549 }, { 167,-25549 }, { 168,-25549 }, { 169,-25549 }, + { 170,-25549 }, { 171,-25549 }, { 172,-25549 }, { 173,-25549 }, { 174,-25549 }, + { 175,-25549 }, { 176,-25549 }, { 177,-25549 }, { 178,-25549 }, { 179,-25549 }, + { 180,-25549 }, { 181,-25549 }, { 182,-25549 }, { 183,-25549 }, { 184,-25549 }, + + { 185,-25549 }, { 186,-25549 }, { 187,-25549 }, { 188,-25549 }, { 189,-25549 }, + { 190,-25549 }, { 191,-25549 }, { 192,-25549 }, { 193,-25549 }, { 194,-25549 }, + { 195,-25549 }, { 196,-25549 }, { 197,-25549 }, { 198,-25549 }, { 199,-25549 }, + { 200,-25549 }, { 201,-25549 }, { 202,-25549 }, { 203,-25549 }, { 204,-25549 }, + { 205,-25549 }, { 206,-25549 }, { 207,-25549 }, { 208,-25549 }, { 209,-25549 }, + { 210,-25549 }, { 211,-25549 }, { 212,-25549 }, { 213,-25549 }, { 214,-25549 }, + { 215,-25549 }, { 216,-25549 }, { 217,-25549 }, { 218,-25549 }, { 219,-25549 }, + { 220,-25549 }, { 221,-25549 }, { 222,-25549 }, { 223,-25549 }, { 224,-25549 }, + { 225,-25549 }, { 226,-25549 }, { 227,-25549 }, { 228,-25549 }, { 229,-25549 }, + { 230,-25549 }, { 231,-25549 }, { 232,-25549 }, { 233,-25549 }, { 234,-25549 }, + + { 235,-25549 }, { 236,-25549 }, { 237,-25549 }, { 238,-25549 }, { 239,-25549 }, + { 240,-25549 }, { 241,-25549 }, { 242,-25549 }, { 243,-25549 }, { 244,-25549 }, + { 245,-25549 }, { 246,-25549 }, { 247,-25549 }, { 248,-25549 }, { 249,-25549 }, + { 250,-25549 }, { 251,-25549 }, { 252,-25549 }, { 253,-25549 }, { 254,-25549 }, + { 255,-25549 }, { 0, 131 }, { 0,66317 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-25806 }, { 49,-25806 }, { 50,-25806 }, { 51,-25806 }, { 52,-25806 }, + { 53,-25806 }, { 54,-25806 }, { 55,-25806 }, { 56,-25806 }, { 57,-25806 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-25806 }, { 66,-25806 }, { 67,-25806 }, + { 68,-25806 }, { 69,15682 }, { 70,-25806 }, { 71,-25806 }, { 72,-25806 }, + { 73,-25806 }, { 74,-25806 }, { 75,-25806 }, { 76,-25806 }, { 77,-25806 }, + + { 78,-25806 }, { 79,-25806 }, { 80,-25806 }, { 81,-25806 }, { 82,-25806 }, + { 83,-25806 }, { 84,-25806 }, { 85,-25806 }, { 86,-25806 }, { 87,-25806 }, + { 88,-25806 }, { 89,-25806 }, { 90,-25806 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-25806 }, { 0, 0 }, { 97,-25806 }, + { 98,-25806 }, { 99,-25806 }, { 100,-25806 }, { 101,15682 }, { 102,-25806 }, + { 103,-25806 }, { 104,-25806 }, { 105,-25806 }, { 106,-25806 }, { 107,-25806 }, + { 108,-25806 }, { 109,-25806 }, { 110,-25806 }, { 111,-25806 }, { 112,-25806 }, + { 113,-25806 }, { 114,-25806 }, { 115,-25806 }, { 116,-25806 }, { 117,-25806 }, + { 118,-25806 }, { 119,-25806 }, { 120,-25806 }, { 121,-25806 }, { 122,-25806 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-25806 }, + + { 128,-25806 }, { 129,-25806 }, { 130,-25806 }, { 131,-25806 }, { 132,-25806 }, + { 133,-25806 }, { 134,-25806 }, { 135,-25806 }, { 136,-25806 }, { 137,-25806 }, + { 138,-25806 }, { 139,-25806 }, { 140,-25806 }, { 141,-25806 }, { 142,-25806 }, + { 143,-25806 }, { 144,-25806 }, { 145,-25806 }, { 146,-25806 }, { 147,-25806 }, + { 148,-25806 }, { 149,-25806 }, { 150,-25806 }, { 151,-25806 }, { 152,-25806 }, + { 153,-25806 }, { 154,-25806 }, { 155,-25806 }, { 156,-25806 }, { 157,-25806 }, + { 158,-25806 }, { 159,-25806 }, { 160,-25806 }, { 161,-25806 }, { 162,-25806 }, + { 163,-25806 }, { 164,-25806 }, { 165,-25806 }, { 166,-25806 }, { 167,-25806 }, + { 168,-25806 }, { 169,-25806 }, { 170,-25806 }, { 171,-25806 }, { 172,-25806 }, + { 173,-25806 }, { 174,-25806 }, { 175,-25806 }, { 176,-25806 }, { 177,-25806 }, + + { 178,-25806 }, { 179,-25806 }, { 180,-25806 }, { 181,-25806 }, { 182,-25806 }, + { 183,-25806 }, { 184,-25806 }, { 185,-25806 }, { 186,-25806 }, { 187,-25806 }, + { 188,-25806 }, { 189,-25806 }, { 190,-25806 }, { 191,-25806 }, { 192,-25806 }, + { 193,-25806 }, { 194,-25806 }, { 195,-25806 }, { 196,-25806 }, { 197,-25806 }, + { 198,-25806 }, { 199,-25806 }, { 200,-25806 }, { 201,-25806 }, { 202,-25806 }, + { 203,-25806 }, { 204,-25806 }, { 205,-25806 }, { 206,-25806 }, { 207,-25806 }, + { 208,-25806 }, { 209,-25806 }, { 210,-25806 }, { 211,-25806 }, { 212,-25806 }, + { 213,-25806 }, { 214,-25806 }, { 215,-25806 }, { 216,-25806 }, { 217,-25806 }, + { 218,-25806 }, { 219,-25806 }, { 220,-25806 }, { 221,-25806 }, { 222,-25806 }, + { 223,-25806 }, { 224,-25806 }, { 225,-25806 }, { 226,-25806 }, { 227,-25806 }, + + { 228,-25806 }, { 229,-25806 }, { 230,-25806 }, { 231,-25806 }, { 232,-25806 }, + { 233,-25806 }, { 234,-25806 }, { 235,-25806 }, { 236,-25806 }, { 237,-25806 }, + { 238,-25806 }, { 239,-25806 }, { 240,-25806 }, { 241,-25806 }, { 242,-25806 }, + { 243,-25806 }, { 244,-25806 }, { 245,-25806 }, { 246,-25806 }, { 247,-25806 }, + { 248,-25806 }, { 249,-25806 }, { 250,-25806 }, { 251,-25806 }, { 252,-25806 }, + { 253,-25806 }, { 254,-25806 }, { 255,-25806 }, { 0, 59 }, { 0,66060 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-26063 }, { 49,-26063 }, { 50,-26063 }, + { 51,-26063 }, { 52,-26063 }, { 53,-26063 }, { 54,-26063 }, { 55,-26063 }, + { 56,-26063 }, { 57,-26063 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-26063 }, + { 66,-26063 }, { 67,-26063 }, { 68,-26063 }, { 69,-26063 }, { 70,-26063 }, + + { 71,-26063 }, { 72,-26063 }, { 73,-26063 }, { 74,-26063 }, { 75,-26063 }, + { 76,-26063 }, { 77,-26063 }, { 78,-26063 }, { 79,-26063 }, { 80,-26063 }, + { 81,-26063 }, { 82,-26063 }, { 83,-26063 }, { 84,-26063 }, { 85,-26063 }, + { 86,-26063 }, { 87,-26063 }, { 88,-26063 }, { 89,-26063 }, { 90,-26063 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-26063 }, + { 0, 0 }, { 97,-26063 }, { 98,-26063 }, { 99,-26063 }, { 100,-26063 }, + { 101,-26063 }, { 102,-26063 }, { 103,-26063 }, { 104,-26063 }, { 105,-26063 }, + { 106,-26063 }, { 107,-26063 }, { 108,-26063 }, { 109,-26063 }, { 110,-26063 }, + { 111,-26063 }, { 112,-26063 }, { 113,-26063 }, { 114,-26063 }, { 115,-26063 }, + { 116,-26063 }, { 117,-26063 }, { 118,-26063 }, { 119,-26063 }, { 120,-26063 }, + + { 121,-26063 }, { 122,-26063 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-26063 }, { 128,-26063 }, { 129,-26063 }, { 130,-26063 }, + { 131,-26063 }, { 132,-26063 }, { 133,-26063 }, { 134,-26063 }, { 135,-26063 }, + { 136,-26063 }, { 137,-26063 }, { 138,-26063 }, { 139,-26063 }, { 140,-26063 }, + { 141,-26063 }, { 142,-26063 }, { 143,-26063 }, { 144,-26063 }, { 145,-26063 }, + { 146,-26063 }, { 147,-26063 }, { 148,-26063 }, { 149,-26063 }, { 150,-26063 }, + { 151,-26063 }, { 152,-26063 }, { 153,-26063 }, { 154,-26063 }, { 155,-26063 }, + { 156,-26063 }, { 157,-26063 }, { 158,-26063 }, { 159,-26063 }, { 160,-26063 }, + { 161,-26063 }, { 162,-26063 }, { 163,-26063 }, { 164,-26063 }, { 165,-26063 }, + { 166,-26063 }, { 167,-26063 }, { 168,-26063 }, { 169,-26063 }, { 170,-26063 }, + + { 171,-26063 }, { 172,-26063 }, { 173,-26063 }, { 174,-26063 }, { 175,-26063 }, + { 176,-26063 }, { 177,-26063 }, { 178,-26063 }, { 179,-26063 }, { 180,-26063 }, + { 181,-26063 }, { 182,-26063 }, { 183,-26063 }, { 184,-26063 }, { 185,-26063 }, + { 186,-26063 }, { 187,-26063 }, { 188,-26063 }, { 189,-26063 }, { 190,-26063 }, + { 191,-26063 }, { 192,-26063 }, { 193,-26063 }, { 194,-26063 }, { 195,-26063 }, + { 196,-26063 }, { 197,-26063 }, { 198,-26063 }, { 199,-26063 }, { 200,-26063 }, + { 201,-26063 }, { 202,-26063 }, { 203,-26063 }, { 204,-26063 }, { 205,-26063 }, + { 206,-26063 }, { 207,-26063 }, { 208,-26063 }, { 209,-26063 }, { 210,-26063 }, + { 211,-26063 }, { 212,-26063 }, { 213,-26063 }, { 214,-26063 }, { 215,-26063 }, + { 216,-26063 }, { 217,-26063 }, { 218,-26063 }, { 219,-26063 }, { 220,-26063 }, + + { 221,-26063 }, { 222,-26063 }, { 223,-26063 }, { 224,-26063 }, { 225,-26063 }, + { 226,-26063 }, { 227,-26063 }, { 228,-26063 }, { 229,-26063 }, { 230,-26063 }, + { 231,-26063 }, { 232,-26063 }, { 233,-26063 }, { 234,-26063 }, { 235,-26063 }, + { 236,-26063 }, { 237,-26063 }, { 238,-26063 }, { 239,-26063 }, { 240,-26063 }, + { 241,-26063 }, { 242,-26063 }, { 243,-26063 }, { 244,-26063 }, { 245,-26063 }, + { 246,-26063 }, { 247,-26063 }, { 248,-26063 }, { 249,-26063 }, { 250,-26063 }, + { 251,-26063 }, { 252,-26063 }, { 253,-26063 }, { 254,-26063 }, { 255,-26063 }, + { 0, 67 }, { 0,65803 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-26320 }, + { 49,-26320 }, { 50,-26320 }, { 51,-26320 }, { 52,-26320 }, { 53,-26320 }, + { 54,-26320 }, { 55,-26320 }, { 56,-26320 }, { 57,-26320 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 65,-26320 }, { 66,-26320 }, { 67,-26320 }, { 68,-26320 }, + { 69,-26320 }, { 70,-26320 }, { 71,-26320 }, { 72,-26320 }, { 73,-26320 }, + { 74,-26320 }, { 75,-26320 }, { 76,-26320 }, { 77,-26320 }, { 78,-26320 }, + { 79,-26320 }, { 80,-26320 }, { 81,-26320 }, { 82,-26320 }, { 83,-26320 }, + { 84,-26320 }, { 85,-26320 }, { 86,-26320 }, { 87,-26320 }, { 88,-26320 }, + { 89,-26320 }, { 90,-26320 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-26320 }, { 0, 0 }, { 97,-26320 }, { 98,-26320 }, + { 99,-26320 }, { 100,-26320 }, { 101,-26320 }, { 102,-26320 }, { 103,-26320 }, + { 104,-26320 }, { 105,-26320 }, { 106,-26320 }, { 107,-26320 }, { 108,-26320 }, + { 109,-26320 }, { 110,-26320 }, { 111,-26320 }, { 112,-26320 }, { 113,-26320 }, + + { 114,-26320 }, { 115,-26320 }, { 116,-26320 }, { 117,-26320 }, { 118,-26320 }, + { 119,-26320 }, { 120,-26320 }, { 121,-26320 }, { 122,-26320 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-26320 }, { 128,-26320 }, + { 129,-26320 }, { 130,-26320 }, { 131,-26320 }, { 132,-26320 }, { 133,-26320 }, + { 134,-26320 }, { 135,-26320 }, { 136,-26320 }, { 137,-26320 }, { 138,-26320 }, + { 139,-26320 }, { 140,-26320 }, { 141,-26320 }, { 142,-26320 }, { 143,-26320 }, + { 144,-26320 }, { 145,-26320 }, { 146,-26320 }, { 147,-26320 }, { 148,-26320 }, + { 149,-26320 }, { 150,-26320 }, { 151,-26320 }, { 152,-26320 }, { 153,-26320 }, + { 154,-26320 }, { 155,-26320 }, { 156,-26320 }, { 157,-26320 }, { 158,-26320 }, + { 159,-26320 }, { 160,-26320 }, { 161,-26320 }, { 162,-26320 }, { 163,-26320 }, + + { 164,-26320 }, { 165,-26320 }, { 166,-26320 }, { 167,-26320 }, { 168,-26320 }, + { 169,-26320 }, { 170,-26320 }, { 171,-26320 }, { 172,-26320 }, { 173,-26320 }, + { 174,-26320 }, { 175,-26320 }, { 176,-26320 }, { 177,-26320 }, { 178,-26320 }, + { 179,-26320 }, { 180,-26320 }, { 181,-26320 }, { 182,-26320 }, { 183,-26320 }, + { 184,-26320 }, { 185,-26320 }, { 186,-26320 }, { 187,-26320 }, { 188,-26320 }, + { 189,-26320 }, { 190,-26320 }, { 191,-26320 }, { 192,-26320 }, { 193,-26320 }, + { 194,-26320 }, { 195,-26320 }, { 196,-26320 }, { 197,-26320 }, { 198,-26320 }, + { 199,-26320 }, { 200,-26320 }, { 201,-26320 }, { 202,-26320 }, { 203,-26320 }, + { 204,-26320 }, { 205,-26320 }, { 206,-26320 }, { 207,-26320 }, { 208,-26320 }, + { 209,-26320 }, { 210,-26320 }, { 211,-26320 }, { 212,-26320 }, { 213,-26320 }, + + { 214,-26320 }, { 215,-26320 }, { 216,-26320 }, { 217,-26320 }, { 218,-26320 }, + { 219,-26320 }, { 220,-26320 }, { 221,-26320 }, { 222,-26320 }, { 223,-26320 }, + { 224,-26320 }, { 225,-26320 }, { 226,-26320 }, { 227,-26320 }, { 228,-26320 }, + { 229,-26320 }, { 230,-26320 }, { 231,-26320 }, { 232,-26320 }, { 233,-26320 }, + { 234,-26320 }, { 235,-26320 }, { 236,-26320 }, { 237,-26320 }, { 238,-26320 }, + { 239,-26320 }, { 240,-26320 }, { 241,-26320 }, { 242,-26320 }, { 243,-26320 }, + { 244,-26320 }, { 245,-26320 }, { 246,-26320 }, { 247,-26320 }, { 248,-26320 }, + { 249,-26320 }, { 250,-26320 }, { 251,-26320 }, { 252,-26320 }, { 253,-26320 }, + { 254,-26320 }, { 255,-26320 }, { 0, 131 }, { 0,65546 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-26577 }, { 49,-26577 }, { 50,-26577 }, { 51,-26577 }, + { 52,-26577 }, { 53,-26577 }, { 54,-26577 }, { 55,-26577 }, { 56,-26577 }, + + { 57,-26577 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-26577 }, { 66,-26577 }, + { 67,-26577 }, { 68,-26577 }, { 69,-26577 }, { 70,-26577 }, { 71,-26577 }, + { 72,-26577 }, { 73,-26577 }, { 74,-26577 }, { 75,-26577 }, { 76,15168 }, + { 77,-26577 }, { 78,-26577 }, { 79,-26577 }, { 80,-26577 }, { 81,-26577 }, + { 82,-26577 }, { 83,-26577 }, { 84,-26577 }, { 85,-26577 }, { 86,-26577 }, + { 87,-26577 }, { 88,-26577 }, { 89,-26577 }, { 90,-26577 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-26577 }, { 0, 0 }, + { 97,-26577 }, { 98,-26577 }, { 99,-26577 }, { 100,-26577 }, { 101,-26577 }, + { 102,-26577 }, { 103,-26577 }, { 104,-26577 }, { 105,-26577 }, { 106,-26577 }, + + { 107,-26577 }, { 108,15168 }, { 109,-26577 }, { 110,-26577 }, { 111,-26577 }, + { 112,-26577 }, { 113,-26577 }, { 114,-26577 }, { 115,-26577 }, { 116,-26577 }, + { 117,-26577 }, { 118,-26577 }, { 119,-26577 }, { 120,-26577 }, { 121,-26577 }, + { 122,-26577 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-26577 }, { 128,-26577 }, { 129,-26577 }, { 130,-26577 }, { 131,-26577 }, + { 132,-26577 }, { 133,-26577 }, { 134,-26577 }, { 135,-26577 }, { 136,-26577 }, + { 137,-26577 }, { 138,-26577 }, { 139,-26577 }, { 140,-26577 }, { 141,-26577 }, + { 142,-26577 }, { 143,-26577 }, { 144,-26577 }, { 145,-26577 }, { 146,-26577 }, + { 147,-26577 }, { 148,-26577 }, { 149,-26577 }, { 150,-26577 }, { 151,-26577 }, + { 152,-26577 }, { 153,-26577 }, { 154,-26577 }, { 155,-26577 }, { 156,-26577 }, + + { 157,-26577 }, { 158,-26577 }, { 159,-26577 }, { 160,-26577 }, { 161,-26577 }, + { 162,-26577 }, { 163,-26577 }, { 164,-26577 }, { 165,-26577 }, { 166,-26577 }, + { 167,-26577 }, { 168,-26577 }, { 169,-26577 }, { 170,-26577 }, { 171,-26577 }, + { 172,-26577 }, { 173,-26577 }, { 174,-26577 }, { 175,-26577 }, { 176,-26577 }, + { 177,-26577 }, { 178,-26577 }, { 179,-26577 }, { 180,-26577 }, { 181,-26577 }, + { 182,-26577 }, { 183,-26577 }, { 184,-26577 }, { 185,-26577 }, { 186,-26577 }, + { 187,-26577 }, { 188,-26577 }, { 189,-26577 }, { 190,-26577 }, { 191,-26577 }, + { 192,-26577 }, { 193,-26577 }, { 194,-26577 }, { 195,-26577 }, { 196,-26577 }, + { 197,-26577 }, { 198,-26577 }, { 199,-26577 }, { 200,-26577 }, { 201,-26577 }, + { 202,-26577 }, { 203,-26577 }, { 204,-26577 }, { 205,-26577 }, { 206,-26577 }, + + { 207,-26577 }, { 208,-26577 }, { 209,-26577 }, { 210,-26577 }, { 211,-26577 }, + { 212,-26577 }, { 213,-26577 }, { 214,-26577 }, { 215,-26577 }, { 216,-26577 }, + { 217,-26577 }, { 218,-26577 }, { 219,-26577 }, { 220,-26577 }, { 221,-26577 }, + { 222,-26577 }, { 223,-26577 }, { 224,-26577 }, { 225,-26577 }, { 226,-26577 }, + { 227,-26577 }, { 228,-26577 }, { 229,-26577 }, { 230,-26577 }, { 231,-26577 }, + { 232,-26577 }, { 233,-26577 }, { 234,-26577 }, { 235,-26577 }, { 236,-26577 }, + { 237,-26577 }, { 238,-26577 }, { 239,-26577 }, { 240,-26577 }, { 241,-26577 }, + { 242,-26577 }, { 243,-26577 }, { 244,-26577 }, { 245,-26577 }, { 246,-26577 }, + { 247,-26577 }, { 248,-26577 }, { 249,-26577 }, { 250,-26577 }, { 251,-26577 }, + { 252,-26577 }, { 253,-26577 }, { 254,-26577 }, { 255,-26577 }, { 0, 24 }, + + { 0,65289 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-26834 }, { 49,-26834 }, + + { 50,-26834 }, { 51,-26834 }, { 52,-26834 }, { 53,-26834 }, { 54,-26834 }, + { 55,-26834 }, { 56,-26834 }, { 57,-26834 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-26834 }, { 66,-26834 }, { 67,-26834 }, { 68,-26834 }, { 69,-26834 }, + { 70,-26834 }, { 71,-26834 }, { 72,-26834 }, { 73,-26834 }, { 74,-26834 }, + { 75,-26834 }, { 76,-26834 }, { 77,-26834 }, { 78,-26834 }, { 79,-26834 }, + { 80,-26834 }, { 81,-26834 }, { 82,-26834 }, { 83,-26834 }, { 84,-26834 }, + { 85,-26834 }, { 86,-26834 }, { 87,-26834 }, { 88,-26834 }, { 89,-26834 }, + { 90,-26834 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-26834 }, { 0, 0 }, { 97,-26834 }, { 98,-26834 }, { 99,-26834 }, + + { 100,-26834 }, { 101,-26834 }, { 102,-26834 }, { 103,-26834 }, { 104,-26834 }, + { 105,-26834 }, { 106,-26834 }, { 107,-26834 }, { 108,-26834 }, { 109,-26834 }, + { 110,-26834 }, { 111,-26834 }, { 112,-26834 }, { 113,-26834 }, { 114,-26834 }, + { 115,-26834 }, { 116,-26834 }, { 117,-26834 }, { 118,-26834 }, { 119,-26834 }, + { 120,-26834 }, { 121,-26834 }, { 122,-26834 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-26834 }, { 128,-26834 }, { 129,-26834 }, + { 130,-26834 }, { 131,-26834 }, { 132,-26834 }, { 133,-26834 }, { 134,-26834 }, + { 135,-26834 }, { 136,-26834 }, { 137,-26834 }, { 138,-26834 }, { 139,-26834 }, + { 140,-26834 }, { 141,-26834 }, { 142,-26834 }, { 143,-26834 }, { 144,-26834 }, + { 145,-26834 }, { 146,-26834 }, { 147,-26834 }, { 148,-26834 }, { 149,-26834 }, + + { 150,-26834 }, { 151,-26834 }, { 152,-26834 }, { 153,-26834 }, { 154,-26834 }, + { 155,-26834 }, { 156,-26834 }, { 157,-26834 }, { 158,-26834 }, { 159,-26834 }, + { 160,-26834 }, { 161,-26834 }, { 162,-26834 }, { 163,-26834 }, { 164,-26834 }, + { 165,-26834 }, { 166,-26834 }, { 167,-26834 }, { 168,-26834 }, { 169,-26834 }, + { 170,-26834 }, { 171,-26834 }, { 172,-26834 }, { 173,-26834 }, { 174,-26834 }, + { 175,-26834 }, { 176,-26834 }, { 177,-26834 }, { 178,-26834 }, { 179,-26834 }, + { 180,-26834 }, { 181,-26834 }, { 182,-26834 }, { 183,-26834 }, { 184,-26834 }, + { 185,-26834 }, { 186,-26834 }, { 187,-26834 }, { 188,-26834 }, { 189,-26834 }, + { 190,-26834 }, { 191,-26834 }, { 192,-26834 }, { 193,-26834 }, { 194,-26834 }, + { 195,-26834 }, { 196,-26834 }, { 197,-26834 }, { 198,-26834 }, { 199,-26834 }, + + { 200,-26834 }, { 201,-26834 }, { 202,-26834 }, { 203,-26834 }, { 204,-26834 }, + { 205,-26834 }, { 206,-26834 }, { 207,-26834 }, { 208,-26834 }, { 209,-26834 }, + { 210,-26834 }, { 211,-26834 }, { 212,-26834 }, { 213,-26834 }, { 214,-26834 }, + { 215,-26834 }, { 216,-26834 }, { 217,-26834 }, { 218,-26834 }, { 219,-26834 }, + { 220,-26834 }, { 221,-26834 }, { 222,-26834 }, { 223,-26834 }, { 224,-26834 }, + { 225,-26834 }, { 226,-26834 }, { 227,-26834 }, { 228,-26834 }, { 229,-26834 }, + { 230,-26834 }, { 231,-26834 }, { 232,-26834 }, { 233,-26834 }, { 234,-26834 }, + { 235,-26834 }, { 236,-26834 }, { 237,-26834 }, { 238,-26834 }, { 239,-26834 }, + { 240,-26834 }, { 241,-26834 }, { 242,-26834 }, { 243,-26834 }, { 244,-26834 }, + { 245,-26834 }, { 246,-26834 }, { 247,-26834 }, { 248,-26834 }, { 249,-26834 }, + + { 250,-26834 }, { 251,-26834 }, { 252,-26834 }, { 253,-26834 }, { 254,-26834 }, + { 255,-26834 }, { 0, 131 }, { 0,65032 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-27091 }, { 49,-27091 }, { 50,-27091 }, { 51,-27091 }, { 52,-27091 }, + { 53,-27091 }, { 54,-27091 }, { 55,-27091 }, { 56,-27091 }, { 57,-27091 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-27091 }, { 66,-27091 }, { 67,-27091 }, + { 68,-27091 }, { 69,-27091 }, { 70,-27091 }, { 71,-27091 }, { 72,-27091 }, + { 73,-27091 }, { 74,-27091 }, { 75,-27091 }, { 76,14911 }, { 77,-27091 }, + { 78,-27091 }, { 79,-27091 }, { 80,-27091 }, { 81,-27091 }, { 82,-27091 }, + { 83,-27091 }, { 84,-27091 }, { 85,-27091 }, { 86,-27091 }, { 87,-27091 }, + { 88,-27091 }, { 89,-27091 }, { 90,-27091 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 95,-27091 }, { 0, 0 }, { 97,-27091 }, + { 98,-27091 }, { 99,-27091 }, { 100,-27091 }, { 101,-27091 }, { 102,-27091 }, + { 103,-27091 }, { 104,-27091 }, { 105,-27091 }, { 106,-27091 }, { 107,-27091 }, + { 108,14911 }, { 109,-27091 }, { 110,-27091 }, { 111,-27091 }, { 112,-27091 }, + { 113,-27091 }, { 114,-27091 }, { 115,-27091 }, { 116,-27091 }, { 117,-27091 }, + { 118,-27091 }, { 119,-27091 }, { 120,-27091 }, { 121,-27091 }, { 122,-27091 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-27091 }, + { 128,-27091 }, { 129,-27091 }, { 130,-27091 }, { 131,-27091 }, { 132,-27091 }, + { 133,-27091 }, { 134,-27091 }, { 135,-27091 }, { 136,-27091 }, { 137,-27091 }, + { 138,-27091 }, { 139,-27091 }, { 140,-27091 }, { 141,-27091 }, { 142,-27091 }, + + { 143,-27091 }, { 144,-27091 }, { 145,-27091 }, { 146,-27091 }, { 147,-27091 }, + { 148,-27091 }, { 149,-27091 }, { 150,-27091 }, { 151,-27091 }, { 152,-27091 }, + { 153,-27091 }, { 154,-27091 }, { 155,-27091 }, { 156,-27091 }, { 157,-27091 }, + { 158,-27091 }, { 159,-27091 }, { 160,-27091 }, { 161,-27091 }, { 162,-27091 }, + { 163,-27091 }, { 164,-27091 }, { 165,-27091 }, { 166,-27091 }, { 167,-27091 }, + { 168,-27091 }, { 169,-27091 }, { 170,-27091 }, { 171,-27091 }, { 172,-27091 }, + { 173,-27091 }, { 174,-27091 }, { 175,-27091 }, { 176,-27091 }, { 177,-27091 }, + { 178,-27091 }, { 179,-27091 }, { 180,-27091 }, { 181,-27091 }, { 182,-27091 }, + { 183,-27091 }, { 184,-27091 }, { 185,-27091 }, { 186,-27091 }, { 187,-27091 }, + { 188,-27091 }, { 189,-27091 }, { 190,-27091 }, { 191,-27091 }, { 192,-27091 }, + + { 193,-27091 }, { 194,-27091 }, { 195,-27091 }, { 196,-27091 }, { 197,-27091 }, + { 198,-27091 }, { 199,-27091 }, { 200,-27091 }, { 201,-27091 }, { 202,-27091 }, + { 203,-27091 }, { 204,-27091 }, { 205,-27091 }, { 206,-27091 }, { 207,-27091 }, + { 208,-27091 }, { 209,-27091 }, { 210,-27091 }, { 211,-27091 }, { 212,-27091 }, + { 213,-27091 }, { 214,-27091 }, { 215,-27091 }, { 216,-27091 }, { 217,-27091 }, + { 218,-27091 }, { 219,-27091 }, { 220,-27091 }, { 221,-27091 }, { 222,-27091 }, + { 223,-27091 }, { 224,-27091 }, { 225,-27091 }, { 226,-27091 }, { 227,-27091 }, + { 228,-27091 }, { 229,-27091 }, { 230,-27091 }, { 231,-27091 }, { 232,-27091 }, + { 233,-27091 }, { 234,-27091 }, { 235,-27091 }, { 236,-27091 }, { 237,-27091 }, + { 238,-27091 }, { 239,-27091 }, { 240,-27091 }, { 241,-27091 }, { 242,-27091 }, + + { 243,-27091 }, { 244,-27091 }, { 245,-27091 }, { 246,-27091 }, { 247,-27091 }, + { 248,-27091 }, { 249,-27091 }, { 250,-27091 }, { 251,-27091 }, { 252,-27091 }, + { 253,-27091 }, { 254,-27091 }, { 255,-27091 }, { 0, 131 }, { 0,64775 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-27348 }, { 49,-27348 }, { 50,-27348 }, + { 51,-27348 }, { 52,-27348 }, { 53,-27348 }, { 54,-27348 }, { 55,-27348 }, + { 56,-27348 }, { 57,-27348 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-27348 }, + { 66,-27348 }, { 67,-27348 }, { 68,-27348 }, { 69,-27348 }, { 70,-27348 }, + { 71,-27348 }, { 72,-27348 }, { 73,-27348 }, { 74,-27348 }, { 75,-27348 }, + { 76,14911 }, { 77,-27348 }, { 78,-27348 }, { 79,-27348 }, { 80,-27348 }, + { 81,-27348 }, { 82,-27348 }, { 83,-27348 }, { 84,-27348 }, { 85,-27348 }, + + { 86,-27348 }, { 87,-27348 }, { 88,-27348 }, { 89,-27348 }, { 90,-27348 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-27348 }, + { 0, 0 }, { 97,-27348 }, { 98,-27348 }, { 99,-27348 }, { 100,-27348 }, + { 101,-27348 }, { 102,-27348 }, { 103,-27348 }, { 104,-27348 }, { 105,-27348 }, + { 106,-27348 }, { 107,-27348 }, { 108,14911 }, { 109,-27348 }, { 110,-27348 }, + { 111,-27348 }, { 112,-27348 }, { 113,-27348 }, { 114,-27348 }, { 115,-27348 }, + { 116,-27348 }, { 117,-27348 }, { 118,-27348 }, { 119,-27348 }, { 120,-27348 }, + { 121,-27348 }, { 122,-27348 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-27348 }, { 128,-27348 }, { 129,-27348 }, { 130,-27348 }, + { 131,-27348 }, { 132,-27348 }, { 133,-27348 }, { 134,-27348 }, { 135,-27348 }, + + { 136,-27348 }, { 137,-27348 }, { 138,-27348 }, { 139,-27348 }, { 140,-27348 }, + { 141,-27348 }, { 142,-27348 }, { 143,-27348 }, { 144,-27348 }, { 145,-27348 }, + { 146,-27348 }, { 147,-27348 }, { 148,-27348 }, { 149,-27348 }, { 150,-27348 }, + { 151,-27348 }, { 152,-27348 }, { 153,-27348 }, { 154,-27348 }, { 155,-27348 }, + { 156,-27348 }, { 157,-27348 }, { 158,-27348 }, { 159,-27348 }, { 160,-27348 }, + { 161,-27348 }, { 162,-27348 }, { 163,-27348 }, { 164,-27348 }, { 165,-27348 }, + { 166,-27348 }, { 167,-27348 }, { 168,-27348 }, { 169,-27348 }, { 170,-27348 }, + { 171,-27348 }, { 172,-27348 }, { 173,-27348 }, { 174,-27348 }, { 175,-27348 }, + { 176,-27348 }, { 177,-27348 }, { 178,-27348 }, { 179,-27348 }, { 180,-27348 }, + { 181,-27348 }, { 182,-27348 }, { 183,-27348 }, { 184,-27348 }, { 185,-27348 }, + + { 186,-27348 }, { 187,-27348 }, { 188,-27348 }, { 189,-27348 }, { 190,-27348 }, + { 191,-27348 }, { 192,-27348 }, { 193,-27348 }, { 194,-27348 }, { 195,-27348 }, + { 196,-27348 }, { 197,-27348 }, { 198,-27348 }, { 199,-27348 }, { 200,-27348 }, + { 201,-27348 }, { 202,-27348 }, { 203,-27348 }, { 204,-27348 }, { 205,-27348 }, + { 206,-27348 }, { 207,-27348 }, { 208,-27348 }, { 209,-27348 }, { 210,-27348 }, + { 211,-27348 }, { 212,-27348 }, { 213,-27348 }, { 214,-27348 }, { 215,-27348 }, + { 216,-27348 }, { 217,-27348 }, { 218,-27348 }, { 219,-27348 }, { 220,-27348 }, + { 221,-27348 }, { 222,-27348 }, { 223,-27348 }, { 224,-27348 }, { 225,-27348 }, + { 226,-27348 }, { 227,-27348 }, { 228,-27348 }, { 229,-27348 }, { 230,-27348 }, + { 231,-27348 }, { 232,-27348 }, { 233,-27348 }, { 234,-27348 }, { 235,-27348 }, + + { 236,-27348 }, { 237,-27348 }, { 238,-27348 }, { 239,-27348 }, { 240,-27348 }, + { 241,-27348 }, { 242,-27348 }, { 243,-27348 }, { 244,-27348 }, { 245,-27348 }, + { 246,-27348 }, { 247,-27348 }, { 248,-27348 }, { 249,-27348 }, { 250,-27348 }, + { 251,-27348 }, { 252,-27348 }, { 253,-27348 }, { 254,-27348 }, { 255,-27348 }, + { 0, 131 }, { 0,64518 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-27605 }, + { 49,-27605 }, { 50,-27605 }, { 51,-27605 }, { 52,-27605 }, { 53,-27605 }, + { 54,-27605 }, { 55,-27605 }, { 56,-27605 }, { 57,-27605 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-27605 }, { 66,-27605 }, { 67,-27605 }, { 68,-27605 }, + { 69,-27605 }, { 70,-27605 }, { 71,-27605 }, { 72,-27605 }, { 73,14911 }, + { 74,-27605 }, { 75,-27605 }, { 76,-27605 }, { 77,-27605 }, { 78,-27605 }, + + { 79,-27605 }, { 80,-27605 }, { 81,-27605 }, { 82,-27605 }, { 83,-27605 }, + { 84,-27605 }, { 85,-27605 }, { 86,-27605 }, { 87,-27605 }, { 88,-27605 }, + { 89,-27605 }, { 90,-27605 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-27605 }, { 0, 0 }, { 97,-27605 }, { 98,-27605 }, + { 99,-27605 }, { 100,-27605 }, { 101,-27605 }, { 102,-27605 }, { 103,-27605 }, + { 104,-27605 }, { 105,14911 }, { 106,-27605 }, { 107,-27605 }, { 108,-27605 }, + { 109,-27605 }, { 110,-27605 }, { 111,-27605 }, { 112,-27605 }, { 113,-27605 }, + { 114,-27605 }, { 115,-27605 }, { 116,-27605 }, { 117,-27605 }, { 118,-27605 }, + { 119,-27605 }, { 120,-27605 }, { 121,-27605 }, { 122,-27605 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-27605 }, { 128,-27605 }, + + { 129,-27605 }, { 130,-27605 }, { 131,-27605 }, { 132,-27605 }, { 133,-27605 }, + { 134,-27605 }, { 135,-27605 }, { 136,-27605 }, { 137,-27605 }, { 138,-27605 }, + { 139,-27605 }, { 140,-27605 }, { 141,-27605 }, { 142,-27605 }, { 143,-27605 }, + { 144,-27605 }, { 145,-27605 }, { 146,-27605 }, { 147,-27605 }, { 148,-27605 }, + { 149,-27605 }, { 150,-27605 }, { 151,-27605 }, { 152,-27605 }, { 153,-27605 }, + { 154,-27605 }, { 155,-27605 }, { 156,-27605 }, { 157,-27605 }, { 158,-27605 }, + { 159,-27605 }, { 160,-27605 }, { 161,-27605 }, { 162,-27605 }, { 163,-27605 }, + { 164,-27605 }, { 165,-27605 }, { 166,-27605 }, { 167,-27605 }, { 168,-27605 }, + { 169,-27605 }, { 170,-27605 }, { 171,-27605 }, { 172,-27605 }, { 173,-27605 }, + { 174,-27605 }, { 175,-27605 }, { 176,-27605 }, { 177,-27605 }, { 178,-27605 }, + + { 179,-27605 }, { 180,-27605 }, { 181,-27605 }, { 182,-27605 }, { 183,-27605 }, + { 184,-27605 }, { 185,-27605 }, { 186,-27605 }, { 187,-27605 }, { 188,-27605 }, + { 189,-27605 }, { 190,-27605 }, { 191,-27605 }, { 192,-27605 }, { 193,-27605 }, + { 194,-27605 }, { 195,-27605 }, { 196,-27605 }, { 197,-27605 }, { 198,-27605 }, + { 199,-27605 }, { 200,-27605 }, { 201,-27605 }, { 202,-27605 }, { 203,-27605 }, + { 204,-27605 }, { 205,-27605 }, { 206,-27605 }, { 207,-27605 }, { 208,-27605 }, + { 209,-27605 }, { 210,-27605 }, { 211,-27605 }, { 212,-27605 }, { 213,-27605 }, + { 214,-27605 }, { 215,-27605 }, { 216,-27605 }, { 217,-27605 }, { 218,-27605 }, + { 219,-27605 }, { 220,-27605 }, { 221,-27605 }, { 222,-27605 }, { 223,-27605 }, + { 224,-27605 }, { 225,-27605 }, { 226,-27605 }, { 227,-27605 }, { 228,-27605 }, + + { 229,-27605 }, { 230,-27605 }, { 231,-27605 }, { 232,-27605 }, { 233,-27605 }, + { 234,-27605 }, { 235,-27605 }, { 236,-27605 }, { 237,-27605 }, { 238,-27605 }, + { 239,-27605 }, { 240,-27605 }, { 241,-27605 }, { 242,-27605 }, { 243,-27605 }, + { 244,-27605 }, { 245,-27605 }, { 246,-27605 }, { 247,-27605 }, { 248,-27605 }, + { 249,-27605 }, { 250,-27605 }, { 251,-27605 }, { 252,-27605 }, { 253,-27605 }, + { 254,-27605 }, { 255,-27605 }, { 0, 131 }, { 0,64261 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-27862 }, { 49,-27862 }, { 50,-27862 }, { 51,-27862 }, + { 52,-27862 }, { 53,-27862 }, { 54,-27862 }, { 55,-27862 }, { 56,-27862 }, + { 57,-27862 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-27862 }, { 66,-27862 }, + { 67,-27862 }, { 68,-27862 }, { 69,-27862 }, { 70,-27862 }, { 71,-27862 }, + + { 72,-27862 }, { 73,14911 }, { 74,-27862 }, { 75,-27862 }, { 76,-27862 }, + { 77,-27862 }, { 78,-27862 }, { 79,-27862 }, { 80,-27862 }, { 81,-27862 }, + { 82,-27862 }, { 83,-27862 }, { 84,-27862 }, { 85,15168 }, { 86,-27862 }, + { 87,-27862 }, { 88,-27862 }, { 89,-27862 }, { 90,-27862 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-27862 }, { 0, 0 }, + { 97,-27862 }, { 98,-27862 }, { 99,-27862 }, { 100,-27862 }, { 101,-27862 }, + { 102,-27862 }, { 103,-27862 }, { 104,-27862 }, { 105,14911 }, { 106,-27862 }, + { 107,-27862 }, { 108,-27862 }, { 109,-27862 }, { 110,-27862 }, { 111,-27862 }, + { 112,-27862 }, { 113,-27862 }, { 114,-27862 }, { 115,-27862 }, { 116,-27862 }, + { 117,15168 }, { 118,-27862 }, { 119,-27862 }, { 120,-27862 }, { 121,-27862 }, + + { 122,-27862 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-27862 }, { 128,-27862 }, { 129,-27862 }, { 130,-27862 }, { 131,-27862 }, + { 132,-27862 }, { 133,-27862 }, { 134,-27862 }, { 135,-27862 }, { 136,-27862 }, + { 137,-27862 }, { 138,-27862 }, { 139,-27862 }, { 140,-27862 }, { 141,-27862 }, + { 142,-27862 }, { 143,-27862 }, { 144,-27862 }, { 145,-27862 }, { 146,-27862 }, + { 147,-27862 }, { 148,-27862 }, { 149,-27862 }, { 150,-27862 }, { 151,-27862 }, + { 152,-27862 }, { 153,-27862 }, { 154,-27862 }, { 155,-27862 }, { 156,-27862 }, + { 157,-27862 }, { 158,-27862 }, { 159,-27862 }, { 160,-27862 }, { 161,-27862 }, + { 162,-27862 }, { 163,-27862 }, { 164,-27862 }, { 165,-27862 }, { 166,-27862 }, + { 167,-27862 }, { 168,-27862 }, { 169,-27862 }, { 170,-27862 }, { 171,-27862 }, + + { 172,-27862 }, { 173,-27862 }, { 174,-27862 }, { 175,-27862 }, { 176,-27862 }, + { 177,-27862 }, { 178,-27862 }, { 179,-27862 }, { 180,-27862 }, { 181,-27862 }, + { 182,-27862 }, { 183,-27862 }, { 184,-27862 }, { 185,-27862 }, { 186,-27862 }, + { 187,-27862 }, { 188,-27862 }, { 189,-27862 }, { 190,-27862 }, { 191,-27862 }, + { 192,-27862 }, { 193,-27862 }, { 194,-27862 }, { 195,-27862 }, { 196,-27862 }, + { 197,-27862 }, { 198,-27862 }, { 199,-27862 }, { 200,-27862 }, { 201,-27862 }, + { 202,-27862 }, { 203,-27862 }, { 204,-27862 }, { 205,-27862 }, { 206,-27862 }, + { 207,-27862 }, { 208,-27862 }, { 209,-27862 }, { 210,-27862 }, { 211,-27862 }, + { 212,-27862 }, { 213,-27862 }, { 214,-27862 }, { 215,-27862 }, { 216,-27862 }, + { 217,-27862 }, { 218,-27862 }, { 219,-27862 }, { 220,-27862 }, { 221,-27862 }, + + { 222,-27862 }, { 223,-27862 }, { 224,-27862 }, { 225,-27862 }, { 226,-27862 }, + { 227,-27862 }, { 228,-27862 }, { 229,-27862 }, { 230,-27862 }, { 231,-27862 }, + { 232,-27862 }, { 233,-27862 }, { 234,-27862 }, { 235,-27862 }, { 236,-27862 }, + { 237,-27862 }, { 238,-27862 }, { 239,-27862 }, { 240,-27862 }, { 241,-27862 }, + { 242,-27862 }, { 243,-27862 }, { 244,-27862 }, { 245,-27862 }, { 246,-27862 }, + { 247,-27862 }, { 248,-27862 }, { 249,-27862 }, { 250,-27862 }, { 251,-27862 }, + { 252,-27862 }, { 253,-27862 }, { 254,-27862 }, { 255,-27862 }, { 0, 131 }, + { 0,64004 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-28119 }, { 49,-28119 }, + { 50,-28119 }, { 51,-28119 }, { 52,-28119 }, { 53,-28119 }, { 54,-28119 }, + { 55,-28119 }, { 56,-28119 }, { 57,-28119 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 65,15168 }, { 66,-28119 }, { 67,-28119 }, { 68,-28119 }, { 69,-28119 }, + { 70,-28119 }, { 71,-28119 }, { 72,-28119 }, { 73,-28119 }, { 74,-28119 }, + { 75,-28119 }, { 76,-28119 }, { 77,-28119 }, { 78,-28119 }, { 79,-28119 }, + { 80,-28119 }, { 81,-28119 }, { 82,-28119 }, { 83,-28119 }, { 84,-28119 }, + { 85,-28119 }, { 86,-28119 }, { 87,-28119 }, { 88,-28119 }, { 89,-28119 }, + { 90,-28119 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-28119 }, { 0, 0 }, { 97,15168 }, { 98,-28119 }, { 99,-28119 }, + { 100,-28119 }, { 101,-28119 }, { 102,-28119 }, { 103,-28119 }, { 104,-28119 }, + { 105,-28119 }, { 106,-28119 }, { 107,-28119 }, { 108,-28119 }, { 109,-28119 }, + { 110,-28119 }, { 111,-28119 }, { 112,-28119 }, { 113,-28119 }, { 114,-28119 }, + + { 115,-28119 }, { 116,-28119 }, { 117,-28119 }, { 118,-28119 }, { 119,-28119 }, + { 120,-28119 }, { 121,-28119 }, { 122,-28119 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-28119 }, { 128,-28119 }, { 129,-28119 }, + { 130,-28119 }, { 131,-28119 }, { 132,-28119 }, { 133,-28119 }, { 134,-28119 }, + { 135,-28119 }, { 136,-28119 }, { 137,-28119 }, { 138,-28119 }, { 139,-28119 }, + { 140,-28119 }, { 141,-28119 }, { 142,-28119 }, { 143,-28119 }, { 144,-28119 }, + { 145,-28119 }, { 146,-28119 }, { 147,-28119 }, { 148,-28119 }, { 149,-28119 }, + { 150,-28119 }, { 151,-28119 }, { 152,-28119 }, { 153,-28119 }, { 154,-28119 }, + { 155,-28119 }, { 156,-28119 }, { 157,-28119 }, { 158,-28119 }, { 159,-28119 }, + { 160,-28119 }, { 161,-28119 }, { 162,-28119 }, { 163,-28119 }, { 164,-28119 }, + + { 165,-28119 }, { 166,-28119 }, { 167,-28119 }, { 168,-28119 }, { 169,-28119 }, + { 170,-28119 }, { 171,-28119 }, { 172,-28119 }, { 173,-28119 }, { 174,-28119 }, + { 175,-28119 }, { 176,-28119 }, { 177,-28119 }, { 178,-28119 }, { 179,-28119 }, + { 180,-28119 }, { 181,-28119 }, { 182,-28119 }, { 183,-28119 }, { 184,-28119 }, + { 185,-28119 }, { 186,-28119 }, { 187,-28119 }, { 188,-28119 }, { 189,-28119 }, + { 190,-28119 }, { 191,-28119 }, { 192,-28119 }, { 193,-28119 }, { 194,-28119 }, + { 195,-28119 }, { 196,-28119 }, { 197,-28119 }, { 198,-28119 }, { 199,-28119 }, + { 200,-28119 }, { 201,-28119 }, { 202,-28119 }, { 203,-28119 }, { 204,-28119 }, + { 205,-28119 }, { 206,-28119 }, { 207,-28119 }, { 208,-28119 }, { 209,-28119 }, + { 210,-28119 }, { 211,-28119 }, { 212,-28119 }, { 213,-28119 }, { 214,-28119 }, + + { 215,-28119 }, { 216,-28119 }, { 217,-28119 }, { 218,-28119 }, { 219,-28119 }, + { 220,-28119 }, { 221,-28119 }, { 222,-28119 }, { 223,-28119 }, { 224,-28119 }, + { 225,-28119 }, { 226,-28119 }, { 227,-28119 }, { 228,-28119 }, { 229,-28119 }, + { 230,-28119 }, { 231,-28119 }, { 232,-28119 }, { 233,-28119 }, { 234,-28119 }, + { 235,-28119 }, { 236,-28119 }, { 237,-28119 }, { 238,-28119 }, { 239,-28119 }, + { 240,-28119 }, { 241,-28119 }, { 242,-28119 }, { 243,-28119 }, { 244,-28119 }, + { 245,-28119 }, { 246,-28119 }, { 247,-28119 }, { 248,-28119 }, { 249,-28119 }, + { 250,-28119 }, { 251,-28119 }, { 252,-28119 }, { 253,-28119 }, { 254,-28119 }, + { 255,-28119 }, { 0, 131 }, { 0,63747 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-28376 }, { 49,-28376 }, { 50,-28376 }, { 51,-28376 }, { 52,-28376 }, + { 53,-28376 }, { 54,-28376 }, { 55,-28376 }, { 56,-28376 }, { 57,-28376 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-28376 }, { 66,-28376 }, { 67,-28376 }, + { 68,-28376 }, { 69,-28376 }, { 70,-28376 }, { 71,-28376 }, { 72,-28376 }, + { 73,15168 }, { 74,-28376 }, { 75,-28376 }, { 76,-28376 }, { 77,-28376 }, + { 78,-28376 }, { 79,-28376 }, { 80,-28376 }, { 81,-28376 }, { 82,-28376 }, + { 83,-28376 }, { 84,-28376 }, { 85,-28376 }, { 86,-28376 }, { 87,-28376 }, + { 88,-28376 }, { 89,-28376 }, { 90,-28376 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-28376 }, { 0, 0 }, { 97,-28376 }, + { 98,-28376 }, { 99,-28376 }, { 100,-28376 }, { 101,-28376 }, { 102,-28376 }, + { 103,-28376 }, { 104,-28376 }, { 105,15168 }, { 106,-28376 }, { 107,-28376 }, + + { 108,-28376 }, { 109,-28376 }, { 110,-28376 }, { 111,-28376 }, { 112,-28376 }, + { 113,-28376 }, { 114,-28376 }, { 115,-28376 }, { 116,-28376 }, { 117,-28376 }, + { 118,-28376 }, { 119,-28376 }, { 120,-28376 }, { 121,-28376 }, { 122,-28376 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-28376 }, + { 128,-28376 }, { 129,-28376 }, { 130,-28376 }, { 131,-28376 }, { 132,-28376 }, + { 133,-28376 }, { 134,-28376 }, { 135,-28376 }, { 136,-28376 }, { 137,-28376 }, + { 138,-28376 }, { 139,-28376 }, { 140,-28376 }, { 141,-28376 }, { 142,-28376 }, + { 143,-28376 }, { 144,-28376 }, { 145,-28376 }, { 146,-28376 }, { 147,-28376 }, + { 148,-28376 }, { 149,-28376 }, { 150,-28376 }, { 151,-28376 }, { 152,-28376 }, + { 153,-28376 }, { 154,-28376 }, { 155,-28376 }, { 156,-28376 }, { 157,-28376 }, + + { 158,-28376 }, { 159,-28376 }, { 160,-28376 }, { 161,-28376 }, { 162,-28376 }, + { 163,-28376 }, { 164,-28376 }, { 165,-28376 }, { 166,-28376 }, { 167,-28376 }, + { 168,-28376 }, { 169,-28376 }, { 170,-28376 }, { 171,-28376 }, { 172,-28376 }, + { 173,-28376 }, { 174,-28376 }, { 175,-28376 }, { 176,-28376 }, { 177,-28376 }, + { 178,-28376 }, { 179,-28376 }, { 180,-28376 }, { 181,-28376 }, { 182,-28376 }, + { 183,-28376 }, { 184,-28376 }, { 185,-28376 }, { 186,-28376 }, { 187,-28376 }, + { 188,-28376 }, { 189,-28376 }, { 190,-28376 }, { 191,-28376 }, { 192,-28376 }, + { 193,-28376 }, { 194,-28376 }, { 195,-28376 }, { 196,-28376 }, { 197,-28376 }, + { 198,-28376 }, { 199,-28376 }, { 200,-28376 }, { 201,-28376 }, { 202,-28376 }, + { 203,-28376 }, { 204,-28376 }, { 205,-28376 }, { 206,-28376 }, { 207,-28376 }, + + { 208,-28376 }, { 209,-28376 }, { 210,-28376 }, { 211,-28376 }, { 212,-28376 }, + { 213,-28376 }, { 214,-28376 }, { 215,-28376 }, { 216,-28376 }, { 217,-28376 }, + { 218,-28376 }, { 219,-28376 }, { 220,-28376 }, { 221,-28376 }, { 222,-28376 }, + { 223,-28376 }, { 224,-28376 }, { 225,-28376 }, { 226,-28376 }, { 227,-28376 }, + { 228,-28376 }, { 229,-28376 }, { 230,-28376 }, { 231,-28376 }, { 232,-28376 }, + { 233,-28376 }, { 234,-28376 }, { 235,-28376 }, { 236,-28376 }, { 237,-28376 }, + { 238,-28376 }, { 239,-28376 }, { 240,-28376 }, { 241,-28376 }, { 242,-28376 }, + { 243,-28376 }, { 244,-28376 }, { 245,-28376 }, { 246,-28376 }, { 247,-28376 }, + { 248,-28376 }, { 249,-28376 }, { 250,-28376 }, { 251,-28376 }, { 252,-28376 }, + { 253,-28376 }, { 254,-28376 }, { 255,-28376 }, { 0, 131 }, { 0,63490 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-28633 }, { 49,-28633 }, { 50,-28633 }, + + { 51,-28633 }, { 52,-28633 }, { 53,-28633 }, { 54,-28633 }, { 55,-28633 }, + { 56,-28633 }, { 57,-28633 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-28633 }, + { 66,-28633 }, { 67,-28633 }, { 68,-28633 }, { 69,15168 }, { 70,-28633 }, + { 71,-28633 }, { 72,-28633 }, { 73,-28633 }, { 74,-28633 }, { 75,-28633 }, + { 76,-28633 }, { 77,-28633 }, { 78,-28633 }, { 79,-28633 }, { 80,-28633 }, + { 81,-28633 }, { 82,-28633 }, { 83,-28633 }, { 84,-28633 }, { 85,-28633 }, + { 86,-28633 }, { 87,-28633 }, { 88,-28633 }, { 89,-28633 }, { 90,-28633 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-28633 }, + { 0, 0 }, { 97,-28633 }, { 98,-28633 }, { 99,-28633 }, { 100,-28633 }, + + { 101,15168 }, { 102,-28633 }, { 103,-28633 }, { 104,-28633 }, { 105,-28633 }, + { 106,-28633 }, { 107,-28633 }, { 108,-28633 }, { 109,-28633 }, { 110,-28633 }, + { 111,-28633 }, { 112,-28633 }, { 113,-28633 }, { 114,-28633 }, { 115,-28633 }, + { 116,-28633 }, { 117,-28633 }, { 118,-28633 }, { 119,-28633 }, { 120,-28633 }, + { 121,-28633 }, { 122,-28633 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-28633 }, { 128,-28633 }, { 129,-28633 }, { 130,-28633 }, + { 131,-28633 }, { 132,-28633 }, { 133,-28633 }, { 134,-28633 }, { 135,-28633 }, + { 136,-28633 }, { 137,-28633 }, { 138,-28633 }, { 139,-28633 }, { 140,-28633 }, + { 141,-28633 }, { 142,-28633 }, { 143,-28633 }, { 144,-28633 }, { 145,-28633 }, + { 146,-28633 }, { 147,-28633 }, { 148,-28633 }, { 149,-28633 }, { 150,-28633 }, + + { 151,-28633 }, { 152,-28633 }, { 153,-28633 }, { 154,-28633 }, { 155,-28633 }, + { 156,-28633 }, { 157,-28633 }, { 158,-28633 }, { 159,-28633 }, { 160,-28633 }, + { 161,-28633 }, { 162,-28633 }, { 163,-28633 }, { 164,-28633 }, { 165,-28633 }, + { 166,-28633 }, { 167,-28633 }, { 168,-28633 }, { 169,-28633 }, { 170,-28633 }, + { 171,-28633 }, { 172,-28633 }, { 173,-28633 }, { 174,-28633 }, { 175,-28633 }, + { 176,-28633 }, { 177,-28633 }, { 178,-28633 }, { 179,-28633 }, { 180,-28633 }, + { 181,-28633 }, { 182,-28633 }, { 183,-28633 }, { 184,-28633 }, { 185,-28633 }, + { 186,-28633 }, { 187,-28633 }, { 188,-28633 }, { 189,-28633 }, { 190,-28633 }, + { 191,-28633 }, { 192,-28633 }, { 193,-28633 }, { 194,-28633 }, { 195,-28633 }, + { 196,-28633 }, { 197,-28633 }, { 198,-28633 }, { 199,-28633 }, { 200,-28633 }, + + { 201,-28633 }, { 202,-28633 }, { 203,-28633 }, { 204,-28633 }, { 205,-28633 }, + { 206,-28633 }, { 207,-28633 }, { 208,-28633 }, { 209,-28633 }, { 210,-28633 }, + { 211,-28633 }, { 212,-28633 }, { 213,-28633 }, { 214,-28633 }, { 215,-28633 }, + { 216,-28633 }, { 217,-28633 }, { 218,-28633 }, { 219,-28633 }, { 220,-28633 }, + { 221,-28633 }, { 222,-28633 }, { 223,-28633 }, { 224,-28633 }, { 225,-28633 }, + { 226,-28633 }, { 227,-28633 }, { 228,-28633 }, { 229,-28633 }, { 230,-28633 }, + { 231,-28633 }, { 232,-28633 }, { 233,-28633 }, { 234,-28633 }, { 235,-28633 }, + { 236,-28633 }, { 237,-28633 }, { 238,-28633 }, { 239,-28633 }, { 240,-28633 }, + { 241,-28633 }, { 242,-28633 }, { 243,-28633 }, { 244,-28633 }, { 245,-28633 }, + { 246,-28633 }, { 247,-28633 }, { 248,-28633 }, { 249,-28633 }, { 250,-28633 }, + + { 251,-28633 }, { 252,-28633 }, { 253,-28633 }, { 254,-28633 }, { 255,-28633 }, + { 0, 131 }, { 0,63233 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-28890 }, + { 49,-28890 }, { 50,-28890 }, { 51,-28890 }, { 52,-28890 }, { 53,-28890 }, + { 54,-28890 }, { 55,-28890 }, { 56,-28890 }, { 57,-28890 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,15168 }, { 66,-28890 }, { 67,-28890 }, { 68,-28890 }, + { 69,-28890 }, { 70,-28890 }, { 71,-28890 }, { 72,-28890 }, { 73,-28890 }, + { 74,-28890 }, { 75,-28890 }, { 76,-28890 }, { 77,-28890 }, { 78,-28890 }, + { 79,-28890 }, { 80,-28890 }, { 81,-28890 }, { 82,-28890 }, { 83,-28890 }, + { 84,-28890 }, { 85,-28890 }, { 86,-28890 }, { 87,-28890 }, { 88,-28890 }, + { 89,-28890 }, { 90,-28890 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 95,-28890 }, { 0, 0 }, { 97,15168 }, { 98,-28890 }, + { 99,-28890 }, { 100,-28890 }, { 101,-28890 }, { 102,-28890 }, { 103,-28890 }, + { 104,-28890 }, { 105,-28890 }, { 106,-28890 }, { 107,-28890 }, { 108,-28890 }, + { 109,-28890 }, { 110,-28890 }, { 111,-28890 }, { 112,-28890 }, { 113,-28890 }, + { 114,-28890 }, { 115,-28890 }, { 116,-28890 }, { 117,-28890 }, { 118,-28890 }, + { 119,-28890 }, { 120,-28890 }, { 121,-28890 }, { 122,-28890 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-28890 }, { 128,-28890 }, + { 129,-28890 }, { 130,-28890 }, { 131,-28890 }, { 132,-28890 }, { 133,-28890 }, + { 134,-28890 }, { 135,-28890 }, { 136,-28890 }, { 137,-28890 }, { 138,-28890 }, + { 139,-28890 }, { 140,-28890 }, { 141,-28890 }, { 142,-28890 }, { 143,-28890 }, + + { 144,-28890 }, { 145,-28890 }, { 146,-28890 }, { 147,-28890 }, { 148,-28890 }, + { 149,-28890 }, { 150,-28890 }, { 151,-28890 }, { 152,-28890 }, { 153,-28890 }, + { 154,-28890 }, { 155,-28890 }, { 156,-28890 }, { 157,-28890 }, { 158,-28890 }, + { 159,-28890 }, { 160,-28890 }, { 161,-28890 }, { 162,-28890 }, { 163,-28890 }, + { 164,-28890 }, { 165,-28890 }, { 166,-28890 }, { 167,-28890 }, { 168,-28890 }, + { 169,-28890 }, { 170,-28890 }, { 171,-28890 }, { 172,-28890 }, { 173,-28890 }, + { 174,-28890 }, { 175,-28890 }, { 176,-28890 }, { 177,-28890 }, { 178,-28890 }, + { 179,-28890 }, { 180,-28890 }, { 181,-28890 }, { 182,-28890 }, { 183,-28890 }, + { 184,-28890 }, { 185,-28890 }, { 186,-28890 }, { 187,-28890 }, { 188,-28890 }, + { 189,-28890 }, { 190,-28890 }, { 191,-28890 }, { 192,-28890 }, { 193,-28890 }, + + { 194,-28890 }, { 195,-28890 }, { 196,-28890 }, { 197,-28890 }, { 198,-28890 }, + { 199,-28890 }, { 200,-28890 }, { 201,-28890 }, { 202,-28890 }, { 203,-28890 }, + { 204,-28890 }, { 205,-28890 }, { 206,-28890 }, { 207,-28890 }, { 208,-28890 }, + { 209,-28890 }, { 210,-28890 }, { 211,-28890 }, { 212,-28890 }, { 213,-28890 }, + { 214,-28890 }, { 215,-28890 }, { 216,-28890 }, { 217,-28890 }, { 218,-28890 }, + { 219,-28890 }, { 220,-28890 }, { 221,-28890 }, { 222,-28890 }, { 223,-28890 }, + { 224,-28890 }, { 225,-28890 }, { 226,-28890 }, { 227,-28890 }, { 228,-28890 }, + { 229,-28890 }, { 230,-28890 }, { 231,-28890 }, { 232,-28890 }, { 233,-28890 }, + { 234,-28890 }, { 235,-28890 }, { 236,-28890 }, { 237,-28890 }, { 238,-28890 }, + { 239,-28890 }, { 240,-28890 }, { 241,-28890 }, { 242,-28890 }, { 243,-28890 }, + + { 244,-28890 }, { 245,-28890 }, { 246,-28890 }, { 247,-28890 }, { 248,-28890 }, + { 249,-28890 }, { 250,-28890 }, { 251,-28890 }, { 252,-28890 }, { 253,-28890 }, + { 254,-28890 }, { 255,-28890 }, { 0, 131 }, { 0,62976 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-29147 }, { 49,-29147 }, { 50,-29147 }, { 51,-29147 }, + { 52,-29147 }, { 53,-29147 }, { 54,-29147 }, { 55,-29147 }, { 56,-29147 }, + { 57,-29147 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-29147 }, { 66,-29147 }, + { 67,-29147 }, { 68,-29147 }, { 69,-29147 }, { 70,-29147 }, { 71,-29147 }, + { 72,-29147 }, { 73,-29147 }, { 74,-29147 }, { 75,-29147 }, { 76,-29147 }, + { 77,-29147 }, { 78,-29147 }, { 79,-29147 }, { 80,-29147 }, { 81,-29147 }, + { 82,15168 }, { 83,-29147 }, { 84,-29147 }, { 85,-29147 }, { 86,-29147 }, + + { 87,-29147 }, { 88,-29147 }, { 89,-29147 }, { 90,-29147 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-29147 }, { 0, 0 }, + { 97,-29147 }, { 98,-29147 }, { 99,-29147 }, { 100,-29147 }, { 101,-29147 }, + { 102,-29147 }, { 103,-29147 }, { 104,-29147 }, { 105,-29147 }, { 106,-29147 }, + { 107,-29147 }, { 108,-29147 }, { 109,-29147 }, { 110,-29147 }, { 111,-29147 }, + { 112,-29147 }, { 113,-29147 }, { 114,15168 }, { 115,-29147 }, { 116,-29147 }, + { 117,-29147 }, { 118,-29147 }, { 119,-29147 }, { 120,-29147 }, { 121,-29147 }, + { 122,-29147 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-29147 }, { 128,-29147 }, { 129,-29147 }, { 130,-29147 }, { 131,-29147 }, + { 132,-29147 }, { 133,-29147 }, { 134,-29147 }, { 135,-29147 }, { 136,-29147 }, + + { 137,-29147 }, { 138,-29147 }, { 139,-29147 }, { 140,-29147 }, { 141,-29147 }, + { 142,-29147 }, { 143,-29147 }, { 144,-29147 }, { 145,-29147 }, { 146,-29147 }, + { 147,-29147 }, { 148,-29147 }, { 149,-29147 }, { 150,-29147 }, { 151,-29147 }, + { 152,-29147 }, { 153,-29147 }, { 154,-29147 }, { 155,-29147 }, { 156,-29147 }, + { 157,-29147 }, { 158,-29147 }, { 159,-29147 }, { 160,-29147 }, { 161,-29147 }, + { 162,-29147 }, { 163,-29147 }, { 164,-29147 }, { 165,-29147 }, { 166,-29147 }, + { 167,-29147 }, { 168,-29147 }, { 169,-29147 }, { 170,-29147 }, { 171,-29147 }, + { 172,-29147 }, { 173,-29147 }, { 174,-29147 }, { 175,-29147 }, { 176,-29147 }, + { 177,-29147 }, { 178,-29147 }, { 179,-29147 }, { 180,-29147 }, { 181,-29147 }, + { 182,-29147 }, { 183,-29147 }, { 184,-29147 }, { 185,-29147 }, { 186,-29147 }, + + { 187,-29147 }, { 188,-29147 }, { 189,-29147 }, { 190,-29147 }, { 191,-29147 }, + { 192,-29147 }, { 193,-29147 }, { 194,-29147 }, { 195,-29147 }, { 196,-29147 }, + { 197,-29147 }, { 198,-29147 }, { 199,-29147 }, { 200,-29147 }, { 201,-29147 }, + { 202,-29147 }, { 203,-29147 }, { 204,-29147 }, { 205,-29147 }, { 206,-29147 }, + { 207,-29147 }, { 208,-29147 }, { 209,-29147 }, { 210,-29147 }, { 211,-29147 }, + { 212,-29147 }, { 213,-29147 }, { 214,-29147 }, { 215,-29147 }, { 216,-29147 }, + { 217,-29147 }, { 218,-29147 }, { 219,-29147 }, { 220,-29147 }, { 221,-29147 }, + { 222,-29147 }, { 223,-29147 }, { 224,-29147 }, { 225,-29147 }, { 226,-29147 }, + { 227,-29147 }, { 228,-29147 }, { 229,-29147 }, { 230,-29147 }, { 231,-29147 }, + { 232,-29147 }, { 233,-29147 }, { 234,-29147 }, { 235,-29147 }, { 236,-29147 }, + + { 237,-29147 }, { 238,-29147 }, { 239,-29147 }, { 240,-29147 }, { 241,-29147 }, + { 242,-29147 }, { 243,-29147 }, { 244,-29147 }, { 245,-29147 }, { 246,-29147 }, + { 247,-29147 }, { 248,-29147 }, { 249,-29147 }, { 250,-29147 }, { 251,-29147 }, + { 252,-29147 }, { 253,-29147 }, { 254,-29147 }, { 255,-29147 }, { 0, 0 }, + { 0,62719 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 34,-26826 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48, 0 }, { 49, 0 }, + { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 }, + { 55, 0 }, { 56, 0 }, { 57, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 }, { 69, 0 }, + { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 }, { 74, 0 }, + { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 }, { 79, 0 }, + + { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 }, { 84, 0 }, + { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 }, { 89, 0 }, + { 90, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95, 0 }, { 0, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 }, + { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 }, + { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 }, + { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 }, + { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 }, + { 120, 0 }, { 121, 0 }, { 122, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127, 0 }, { 128, 0 }, { 129, 0 }, + + { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 }, { 134, 0 }, + { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 }, { 139, 0 }, + { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 }, { 144, 0 }, + { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 }, { 149, 0 }, + { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 }, { 154, 0 }, + { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 }, { 159, 0 }, + { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 }, { 164, 0 }, + { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 }, { 169, 0 }, + { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 }, { 174, 0 }, + { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 }, { 179, 0 }, + + { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 }, { 184, 0 }, + { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 }, { 189, 0 }, + { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 }, { 194, 0 }, + { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 }, { 199, 0 }, + { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 }, { 204, 0 }, + { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 }, { 209, 0 }, + { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 }, { 214, 0 }, + { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 }, { 219, 0 }, + { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 }, { 224, 0 }, + { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 }, { 229, 0 }, + + { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 }, { 234, 0 }, + { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 }, { 239, 0 }, + { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 }, { 244, 0 }, + { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 }, { 249, 0 }, + { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 }, { 254, 0 }, + { 255, 0 }, { 0, 0 }, { 0,62462 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 39,-27083 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 }, + { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65, 0 }, { 66, 0 }, { 67, 0 }, + { 68, 0 }, { 69, 0 }, { 70, 0 }, { 71, 0 }, { 72, 0 }, + + { 73, 0 }, { 74, 0 }, { 75, 0 }, { 76, 0 }, { 77, 0 }, + { 78, 0 }, { 79, 0 }, { 80, 0 }, { 81, 0 }, { 82, 0 }, + { 83, 0 }, { 84, 0 }, { 85, 0 }, { 86, 0 }, { 87, 0 }, + { 88, 0 }, { 89, 0 }, { 90, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95, 0 }, { 0, 0 }, { 97, 0 }, + { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 }, { 102, 0 }, + { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 }, { 107, 0 }, + { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 }, { 112, 0 }, + { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 }, { 117, 0 }, + { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 }, { 122, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127, 0 }, + { 128, 0 }, { 129, 0 }, { 130, 0 }, { 131, 0 }, { 132, 0 }, + { 133, 0 }, { 134, 0 }, { 135, 0 }, { 136, 0 }, { 137, 0 }, + { 138, 0 }, { 139, 0 }, { 140, 0 }, { 141, 0 }, { 142, 0 }, + { 143, 0 }, { 144, 0 }, { 145, 0 }, { 146, 0 }, { 147, 0 }, + { 148, 0 }, { 149, 0 }, { 150, 0 }, { 151, 0 }, { 152, 0 }, + { 153, 0 }, { 154, 0 }, { 155, 0 }, { 156, 0 }, { 157, 0 }, + { 158, 0 }, { 159, 0 }, { 160, 0 }, { 161, 0 }, { 162, 0 }, + { 163, 0 }, { 164, 0 }, { 165, 0 }, { 166, 0 }, { 167, 0 }, + { 168, 0 }, { 169, 0 }, { 170, 0 }, { 171, 0 }, { 172, 0 }, + + { 173, 0 }, { 174, 0 }, { 175, 0 }, { 176, 0 }, { 177, 0 }, + { 178, 0 }, { 179, 0 }, { 180, 0 }, { 181, 0 }, { 182, 0 }, + { 183, 0 }, { 184, 0 }, { 185, 0 }, { 186, 0 }, { 187, 0 }, + { 188, 0 }, { 189, 0 }, { 190, 0 }, { 191, 0 }, { 192, 0 }, + { 193, 0 }, { 194, 0 }, { 195, 0 }, { 196, 0 }, { 197, 0 }, + { 198, 0 }, { 199, 0 }, { 200, 0 }, { 201, 0 }, { 202, 0 }, + { 203, 0 }, { 204, 0 }, { 205, 0 }, { 206, 0 }, { 207, 0 }, + { 208, 0 }, { 209, 0 }, { 210, 0 }, { 211, 0 }, { 212, 0 }, + { 213, 0 }, { 214, 0 }, { 215, 0 }, { 216, 0 }, { 217, 0 }, + { 218, 0 }, { 219, 0 }, { 220, 0 }, { 221, 0 }, { 222, 0 }, + + { 223, 0 }, { 224, 0 }, { 225, 0 }, { 226, 0 }, { 227, 0 }, + { 228, 0 }, { 229, 0 }, { 230, 0 }, { 231, 0 }, { 232, 0 }, + { 233, 0 }, { 234, 0 }, { 235, 0 }, { 236, 0 }, { 237, 0 }, + { 238, 0 }, { 239, 0 }, { 240, 0 }, { 241, 0 }, { 242, 0 }, + { 243, 0 }, { 244, 0 }, { 245, 0 }, { 246, 0 }, { 247, 0 }, + { 248, 0 }, { 249, 0 }, { 250, 0 }, { 251, 0 }, { 252, 0 }, + { 253, 0 }, { 254, 0 }, { 255, 0 }, { 0, 0 }, { 0,62205 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 131 }, { 0,62200 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 9,-25545 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 32,-25545 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 41,-25543 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-29923 }, { 49,-29923 }, { 50,-29923 }, + { 51,-29923 }, { 52,-29923 }, { 53,-29923 }, { 54,-29923 }, { 55,-29923 }, + { 56,-29923 }, { 57,-29923 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 69,-25527 }, { 65,-29923 }, + { 66,-29923 }, { 67,-29923 }, { 68,-29923 }, { 69,-29923 }, { 70,-29923 }, + { 71,-29923 }, { 72,-29923 }, { 73,-29923 }, { 74,-29923 }, { 75,-29923 }, + { 76,-29923 }, { 77,-29923 }, { 78,-29923 }, { 79,-29923 }, { 80,-29923 }, + { 81,-29923 }, { 82,14654 }, { 83,-29923 }, { 84,-29923 }, { 85,-29923 }, + { 86,-29923 }, { 87,-29923 }, { 88,-29923 }, { 89,-29923 }, { 90,-29923 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-29923 }, + { 101,-25527 }, { 97,-29923 }, { 98,-29923 }, { 99,-29923 }, { 100,-29923 }, + { 101,-29923 }, { 102,-29923 }, { 103,-29923 }, { 104,-29923 }, { 105,-29923 }, + { 106,-29923 }, { 107,-29923 }, { 108,-29923 }, { 109,-29923 }, { 110,-29923 }, + + { 111,-29923 }, { 112,-29923 }, { 113,-29923 }, { 114,14654 }, { 115,-29923 }, + { 116,-29923 }, { 117,-29923 }, { 118,-29923 }, { 119,-29923 }, { 120,-29923 }, + { 121,-29923 }, { 122,-29923 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-29923 }, { 128,-29923 }, { 129,-29923 }, { 130,-29923 }, + { 131,-29923 }, { 132,-29923 }, { 133,-29923 }, { 134,-29923 }, { 135,-29923 }, + { 136,-29923 }, { 137,-29923 }, { 138,-29923 }, { 139,-29923 }, { 140,-29923 }, + { 141,-29923 }, { 142,-29923 }, { 143,-29923 }, { 144,-29923 }, { 145,-29923 }, + { 146,-29923 }, { 147,-29923 }, { 148,-29923 }, { 149,-29923 }, { 150,-29923 }, + { 151,-29923 }, { 152,-29923 }, { 153,-29923 }, { 154,-29923 }, { 155,-29923 }, + { 156,-29923 }, { 157,-29923 }, { 158,-29923 }, { 159,-29923 }, { 160,-29923 }, + + { 161,-29923 }, { 162,-29923 }, { 163,-29923 }, { 164,-29923 }, { 165,-29923 }, + { 166,-29923 }, { 167,-29923 }, { 168,-29923 }, { 169,-29923 }, { 170,-29923 }, + { 171,-29923 }, { 172,-29923 }, { 173,-29923 }, { 174,-29923 }, { 175,-29923 }, + { 176,-29923 }, { 177,-29923 }, { 178,-29923 }, { 179,-29923 }, { 180,-29923 }, + { 181,-29923 }, { 182,-29923 }, { 183,-29923 }, { 184,-29923 }, { 185,-29923 }, + { 186,-29923 }, { 187,-29923 }, { 188,-29923 }, { 189,-29923 }, { 190,-29923 }, + { 191,-29923 }, { 192,-29923 }, { 193,-29923 }, { 194,-29923 }, { 195,-29923 }, + { 196,-29923 }, { 197,-29923 }, { 198,-29923 }, { 199,-29923 }, { 200,-29923 }, + { 201,-29923 }, { 202,-29923 }, { 203,-29923 }, { 204,-29923 }, { 205,-29923 }, + { 206,-29923 }, { 207,-29923 }, { 208,-29923 }, { 209,-29923 }, { 210,-29923 }, + + { 211,-29923 }, { 212,-29923 }, { 213,-29923 }, { 214,-29923 }, { 215,-29923 }, + { 216,-29923 }, { 217,-29923 }, { 218,-29923 }, { 219,-29923 }, { 220,-29923 }, + { 221,-29923 }, { 222,-29923 }, { 223,-29923 }, { 224,-29923 }, { 225,-29923 }, + { 226,-29923 }, { 227,-29923 }, { 228,-29923 }, { 229,-29923 }, { 230,-29923 }, + { 231,-29923 }, { 232,-29923 }, { 233,-29923 }, { 234,-29923 }, { 235,-29923 }, + { 236,-29923 }, { 237,-29923 }, { 238,-29923 }, { 239,-29923 }, { 240,-29923 }, + { 241,-29923 }, { 242,-29923 }, { 243,-29923 }, { 244,-29923 }, { 245,-29923 }, + { 246,-29923 }, { 247,-29923 }, { 248,-29923 }, { 249,-29923 }, { 250,-29923 }, + { 251,-29923 }, { 252,-29923 }, { 253,-29923 }, { 254,-29923 }, { 255,-29923 }, + { 0, 131 }, { 0,61943 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-30180 }, + { 49,-30180 }, { 50,-30180 }, { 51,-30180 }, { 52,-30180 }, { 53,-30180 }, + + { 54,-30180 }, { 55,-30180 }, { 56,-30180 }, { 57,-30180 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-30180 }, { 66,-30180 }, { 67,-30180 }, { 68,-30180 }, + { 69,-30180 }, { 70,-30180 }, { 71,-30180 }, { 72,-30180 }, { 73,-30180 }, + { 74,-30180 }, { 75,-30180 }, { 76,-30180 }, { 77,-30180 }, { 78,-30180 }, + { 79,-30180 }, { 80,-30180 }, { 81,-30180 }, { 82,-30180 }, { 83,-30180 }, + { 84,-30180 }, { 85,-30180 }, { 86,-30180 }, { 87,-30180 }, { 88,-30180 }, + { 89,14654 }, { 90,-30180 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-30180 }, { 0, 0 }, { 97,-30180 }, { 98,-30180 }, + { 99,-30180 }, { 100,-30180 }, { 101,-30180 }, { 102,-30180 }, { 103,-30180 }, + + { 104,-30180 }, { 105,-30180 }, { 106,-30180 }, { 107,-30180 }, { 108,-30180 }, + { 109,-30180 }, { 110,-30180 }, { 111,-30180 }, { 112,-30180 }, { 113,-30180 }, + { 114,-30180 }, { 115,-30180 }, { 116,-30180 }, { 117,-30180 }, { 118,-30180 }, + { 119,-30180 }, { 120,-30180 }, { 121,14654 }, { 122,-30180 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-30180 }, { 128,-30180 }, + { 129,-30180 }, { 130,-30180 }, { 131,-30180 }, { 132,-30180 }, { 133,-30180 }, + { 134,-30180 }, { 135,-30180 }, { 136,-30180 }, { 137,-30180 }, { 138,-30180 }, + { 139,-30180 }, { 140,-30180 }, { 141,-30180 }, { 142,-30180 }, { 143,-30180 }, + { 144,-30180 }, { 145,-30180 }, { 146,-30180 }, { 147,-30180 }, { 148,-30180 }, + { 149,-30180 }, { 150,-30180 }, { 151,-30180 }, { 152,-30180 }, { 153,-30180 }, + + { 154,-30180 }, { 155,-30180 }, { 156,-30180 }, { 157,-30180 }, { 158,-30180 }, + { 159,-30180 }, { 160,-30180 }, { 161,-30180 }, { 162,-30180 }, { 163,-30180 }, + { 164,-30180 }, { 165,-30180 }, { 166,-30180 }, { 167,-30180 }, { 168,-30180 }, + { 169,-30180 }, { 170,-30180 }, { 171,-30180 }, { 172,-30180 }, { 173,-30180 }, + { 174,-30180 }, { 175,-30180 }, { 176,-30180 }, { 177,-30180 }, { 178,-30180 }, + { 179,-30180 }, { 180,-30180 }, { 181,-30180 }, { 182,-30180 }, { 183,-30180 }, + { 184,-30180 }, { 185,-30180 }, { 186,-30180 }, { 187,-30180 }, { 188,-30180 }, + { 189,-30180 }, { 190,-30180 }, { 191,-30180 }, { 192,-30180 }, { 193,-30180 }, + { 194,-30180 }, { 195,-30180 }, { 196,-30180 }, { 197,-30180 }, { 198,-30180 }, + { 199,-30180 }, { 200,-30180 }, { 201,-30180 }, { 202,-30180 }, { 203,-30180 }, + + { 204,-30180 }, { 205,-30180 }, { 206,-30180 }, { 207,-30180 }, { 208,-30180 }, + { 209,-30180 }, { 210,-30180 }, { 211,-30180 }, { 212,-30180 }, { 213,-30180 }, + { 214,-30180 }, { 215,-30180 }, { 216,-30180 }, { 217,-30180 }, { 218,-30180 }, + { 219,-30180 }, { 220,-30180 }, { 221,-30180 }, { 222,-30180 }, { 223,-30180 }, + { 224,-30180 }, { 225,-30180 }, { 226,-30180 }, { 227,-30180 }, { 228,-30180 }, + { 229,-30180 }, { 230,-30180 }, { 231,-30180 }, { 232,-30180 }, { 233,-30180 }, + { 234,-30180 }, { 235,-30180 }, { 236,-30180 }, { 237,-30180 }, { 238,-30180 }, + { 239,-30180 }, { 240,-30180 }, { 241,-30180 }, { 242,-30180 }, { 243,-30180 }, + { 244,-30180 }, { 245,-30180 }, { 246,-30180 }, { 247,-30180 }, { 248,-30180 }, + { 249,-30180 }, { 250,-30180 }, { 251,-30180 }, { 252,-30180 }, { 253,-30180 }, + + { 254,-30180 }, { 255,-30180 }, { 0, 131 }, { 0,61686 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 48,-30437 }, { 49,-30437 }, { 50,-30437 }, { 51,-30437 }, + { 52,-30437 }, { 53,-30437 }, { 54,-30437 }, { 55,-30437 }, { 56,-30437 }, + { 57,-30437 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-30437 }, { 66,-30437 }, + { 67,-30437 }, { 68,-30437 }, { 69,-30437 }, { 70,-30437 }, { 71,-30437 }, + { 72,-30437 }, { 73,-30437 }, { 74,-30437 }, { 75,14654 }, { 76,-30437 }, + { 77,-30437 }, { 78,-30437 }, { 79,-30437 }, { 80,-30437 }, { 81,-30437 }, + { 82,-30437 }, { 83,-30437 }, { 84,-30437 }, { 85,-30437 }, { 86,-30437 }, + { 87,-30437 }, { 88,-30437 }, { 89,-30437 }, { 90,-30437 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-30437 }, { 0, 0 }, + + { 97,-30437 }, { 98,-30437 }, { 99,-30437 }, { 100,-30437 }, { 101,-30437 }, + { 102,-30437 }, { 103,-30437 }, { 104,-30437 }, { 105,-30437 }, { 106,-30437 }, + { 107,14654 }, { 108,-30437 }, { 109,-30437 }, { 110,-30437 }, { 111,-30437 }, + { 112,-30437 }, { 113,-30437 }, { 114,-30437 }, { 115,-30437 }, { 116,-30437 }, + { 117,-30437 }, { 118,-30437 }, { 119,-30437 }, { 120,-30437 }, { 121,-30437 }, + { 122,-30437 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-30437 }, { 128,-30437 }, { 129,-30437 }, { 130,-30437 }, { 131,-30437 }, + { 132,-30437 }, { 133,-30437 }, { 134,-30437 }, { 135,-30437 }, { 136,-30437 }, + { 137,-30437 }, { 138,-30437 }, { 139,-30437 }, { 140,-30437 }, { 141,-30437 }, + { 142,-30437 }, { 143,-30437 }, { 144,-30437 }, { 145,-30437 }, { 146,-30437 }, + + { 147,-30437 }, { 148,-30437 }, { 149,-30437 }, { 150,-30437 }, { 151,-30437 }, + { 152,-30437 }, { 153,-30437 }, { 154,-30437 }, { 155,-30437 }, { 156,-30437 }, + { 157,-30437 }, { 158,-30437 }, { 159,-30437 }, { 160,-30437 }, { 161,-30437 }, + { 162,-30437 }, { 163,-30437 }, { 164,-30437 }, { 165,-30437 }, { 166,-30437 }, + { 167,-30437 }, { 168,-30437 }, { 169,-30437 }, { 170,-30437 }, { 171,-30437 }, + { 172,-30437 }, { 173,-30437 }, { 174,-30437 }, { 175,-30437 }, { 176,-30437 }, + { 177,-30437 }, { 178,-30437 }, { 179,-30437 }, { 180,-30437 }, { 181,-30437 }, + { 182,-30437 }, { 183,-30437 }, { 184,-30437 }, { 185,-30437 }, { 186,-30437 }, + { 187,-30437 }, { 188,-30437 }, { 189,-30437 }, { 190,-30437 }, { 191,-30437 }, + { 192,-30437 }, { 193,-30437 }, { 194,-30437 }, { 195,-30437 }, { 196,-30437 }, + + { 197,-30437 }, { 198,-30437 }, { 199,-30437 }, { 200,-30437 }, { 201,-30437 }, + { 202,-30437 }, { 203,-30437 }, { 204,-30437 }, { 205,-30437 }, { 206,-30437 }, + { 207,-30437 }, { 208,-30437 }, { 209,-30437 }, { 210,-30437 }, { 211,-30437 }, + { 212,-30437 }, { 213,-30437 }, { 214,-30437 }, { 215,-30437 }, { 216,-30437 }, + { 217,-30437 }, { 218,-30437 }, { 219,-30437 }, { 220,-30437 }, { 221,-30437 }, + { 222,-30437 }, { 223,-30437 }, { 224,-30437 }, { 225,-30437 }, { 226,-30437 }, + { 227,-30437 }, { 228,-30437 }, { 229,-30437 }, { 230,-30437 }, { 231,-30437 }, + { 232,-30437 }, { 233,-30437 }, { 234,-30437 }, { 235,-30437 }, { 236,-30437 }, + { 237,-30437 }, { 238,-30437 }, { 239,-30437 }, { 240,-30437 }, { 241,-30437 }, + { 242,-30437 }, { 243,-30437 }, { 244,-30437 }, { 245,-30437 }, { 246,-30437 }, + + { 247,-30437 }, { 248,-30437 }, { 249,-30437 }, { 250,-30437 }, { 251,-30437 }, + { 252,-30437 }, { 253,-30437 }, { 254,-30437 }, { 255,-30437 }, { 0, 131 }, + { 0,61429 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-30694 }, { 49,-30694 }, + { 50,-30694 }, { 51,-30694 }, { 52,-30694 }, { 53,-30694 }, { 54,-30694 }, + { 55,-30694 }, { 56,-30694 }, { 57,-30694 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,14654 }, { 66,-30694 }, { 67,-30694 }, { 68,-30694 }, { 69,-30694 }, + { 70,-30694 }, { 71,-30694 }, { 72,-30694 }, { 73,-30694 }, { 74,-30694 }, + { 75,-30694 }, { 76,-30694 }, { 77,-30694 }, { 78,-30694 }, { 79,-30694 }, + { 80,-30694 }, { 81,-30694 }, { 82,-30694 }, { 83,-30694 }, { 84,-30694 }, + { 85,-30694 }, { 86,-30694 }, { 87,-30694 }, { 88,-30694 }, { 89,-30694 }, + + { 90,-30694 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-30694 }, { 0, 0 }, { 97,14654 }, { 98,-30694 }, { 99,-30694 }, + { 100,-30694 }, { 101,-30694 }, { 102,-30694 }, { 103,-30694 }, { 104,-30694 }, + { 105,-30694 }, { 106,-30694 }, { 107,-30694 }, { 108,-30694 }, { 109,-30694 }, + { 110,-30694 }, { 111,-30694 }, { 112,-30694 }, { 113,-30694 }, { 114,-30694 }, + { 115,-30694 }, { 116,-30694 }, { 117,-30694 }, { 118,-30694 }, { 119,-30694 }, + { 120,-30694 }, { 121,-30694 }, { 122,-30694 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-30694 }, { 128,-30694 }, { 129,-30694 }, + { 130,-30694 }, { 131,-30694 }, { 132,-30694 }, { 133,-30694 }, { 134,-30694 }, + { 135,-30694 }, { 136,-30694 }, { 137,-30694 }, { 138,-30694 }, { 139,-30694 }, + + { 140,-30694 }, { 141,-30694 }, { 142,-30694 }, { 143,-30694 }, { 144,-30694 }, + { 145,-30694 }, { 146,-30694 }, { 147,-30694 }, { 148,-30694 }, { 149,-30694 }, + { 150,-30694 }, { 151,-30694 }, { 152,-30694 }, { 153,-30694 }, { 154,-30694 }, + { 155,-30694 }, { 156,-30694 }, { 157,-30694 }, { 158,-30694 }, { 159,-30694 }, + { 160,-30694 }, { 161,-30694 }, { 162,-30694 }, { 163,-30694 }, { 164,-30694 }, + { 165,-30694 }, { 166,-30694 }, { 167,-30694 }, { 168,-30694 }, { 169,-30694 }, + { 170,-30694 }, { 171,-30694 }, { 172,-30694 }, { 173,-30694 }, { 174,-30694 }, + { 175,-30694 }, { 176,-30694 }, { 177,-30694 }, { 178,-30694 }, { 179,-30694 }, + { 180,-30694 }, { 181,-30694 }, { 182,-30694 }, { 183,-30694 }, { 184,-30694 }, + { 185,-30694 }, { 186,-30694 }, { 187,-30694 }, { 188,-30694 }, { 189,-30694 }, + + { 190,-30694 }, { 191,-30694 }, { 192,-30694 }, { 193,-30694 }, { 194,-30694 }, + { 195,-30694 }, { 196,-30694 }, { 197,-30694 }, { 198,-30694 }, { 199,-30694 }, + { 200,-30694 }, { 201,-30694 }, { 202,-30694 }, { 203,-30694 }, { 204,-30694 }, + { 205,-30694 }, { 206,-30694 }, { 207,-30694 }, { 208,-30694 }, { 209,-30694 }, + { 210,-30694 }, { 211,-30694 }, { 212,-30694 }, { 213,-30694 }, { 214,-30694 }, + { 215,-30694 }, { 216,-30694 }, { 217,-30694 }, { 218,-30694 }, { 219,-30694 }, + { 220,-30694 }, { 221,-30694 }, { 222,-30694 }, { 223,-30694 }, { 224,-30694 }, + { 225,-30694 }, { 226,-30694 }, { 227,-30694 }, { 228,-30694 }, { 229,-30694 }, + { 230,-30694 }, { 231,-30694 }, { 232,-30694 }, { 233,-30694 }, { 234,-30694 }, + { 235,-30694 }, { 236,-30694 }, { 237,-30694 }, { 238,-30694 }, { 239,-30694 }, + + { 240,-30694 }, { 241,-30694 }, { 242,-30694 }, { 243,-30694 }, { 244,-30694 }, + { 245,-30694 }, { 246,-30694 }, { 247,-30694 }, { 248,-30694 }, { 249,-30694 }, + { 250,-30694 }, { 251,-30694 }, { 252,-30694 }, { 253,-30694 }, { 254,-30694 }, + { 255,-30694 }, { 0, 48 }, { 0,61172 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-30951 }, { 49,-30951 }, { 50,-30951 }, { 51,-30951 }, { 52,-30951 }, + { 53,-30951 }, { 54,-30951 }, { 55,-30951 }, { 56,-30951 }, { 57,-30951 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-30951 }, { 66,-30951 }, { 67,-30951 }, + { 68,-30951 }, { 69,-30951 }, { 70,-30951 }, { 71,-30951 }, { 72,-30951 }, + { 73,-30951 }, { 74,-30951 }, { 75,-30951 }, { 76,-30951 }, { 77,-30951 }, + { 78,-30951 }, { 79,-30951 }, { 80,-30951 }, { 81,-30951 }, { 82,-30951 }, + + { 83,-30951 }, { 84,-30951 }, { 85,-30951 }, { 86,-30951 }, { 87,-30951 }, + { 88,-30951 }, { 89,-30951 }, { 90,-30951 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-30951 }, { 0, 0 }, { 97,-30951 }, + { 98,-30951 }, { 99,-30951 }, { 100,-30951 }, { 101,-30951 }, { 102,-30951 }, + { 103,-30951 }, { 104,-30951 }, { 105,-30951 }, { 106,-30951 }, { 107,-30951 }, + { 108,-30951 }, { 109,-30951 }, { 110,-30951 }, { 111,-30951 }, { 112,-30951 }, + { 113,-30951 }, { 114,-30951 }, { 115,-30951 }, { 116,-30951 }, { 117,-30951 }, + { 118,-30951 }, { 119,-30951 }, { 120,-30951 }, { 121,-30951 }, { 122,-30951 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-30951 }, + { 128,-30951 }, { 129,-30951 }, { 130,-30951 }, { 131,-30951 }, { 132,-30951 }, + + { 133,-30951 }, { 134,-30951 }, { 135,-30951 }, { 136,-30951 }, { 137,-30951 }, + { 138,-30951 }, { 139,-30951 }, { 140,-30951 }, { 141,-30951 }, { 142,-30951 }, + { 143,-30951 }, { 144,-30951 }, { 145,-30951 }, { 146,-30951 }, { 147,-30951 }, + { 148,-30951 }, { 149,-30951 }, { 150,-30951 }, { 151,-30951 }, { 152,-30951 }, + { 153,-30951 }, { 154,-30951 }, { 155,-30951 }, { 156,-30951 }, { 157,-30951 }, + { 158,-30951 }, { 159,-30951 }, { 160,-30951 }, { 161,-30951 }, { 162,-30951 }, + { 163,-30951 }, { 164,-30951 }, { 165,-30951 }, { 166,-30951 }, { 167,-30951 }, + { 168,-30951 }, { 169,-30951 }, { 170,-30951 }, { 171,-30951 }, { 172,-30951 }, + { 173,-30951 }, { 174,-30951 }, { 175,-30951 }, { 176,-30951 }, { 177,-30951 }, + { 178,-30951 }, { 179,-30951 }, { 180,-30951 }, { 181,-30951 }, { 182,-30951 }, + + { 183,-30951 }, { 184,-30951 }, { 185,-30951 }, { 186,-30951 }, { 187,-30951 }, + { 188,-30951 }, { 189,-30951 }, { 190,-30951 }, { 191,-30951 }, { 192,-30951 }, + { 193,-30951 }, { 194,-30951 }, { 195,-30951 }, { 196,-30951 }, { 197,-30951 }, + { 198,-30951 }, { 199,-30951 }, { 200,-30951 }, { 201,-30951 }, { 202,-30951 }, + { 203,-30951 }, { 204,-30951 }, { 205,-30951 }, { 206,-30951 }, { 207,-30951 }, + { 208,-30951 }, { 209,-30951 }, { 210,-30951 }, { 211,-30951 }, { 212,-30951 }, + { 213,-30951 }, { 214,-30951 }, { 215,-30951 }, { 216,-30951 }, { 217,-30951 }, + { 218,-30951 }, { 219,-30951 }, { 220,-30951 }, { 221,-30951 }, { 222,-30951 }, + { 223,-30951 }, { 224,-30951 }, { 225,-30951 }, { 226,-30951 }, { 227,-30951 }, + { 228,-30951 }, { 229,-30951 }, { 230,-30951 }, { 231,-30951 }, { 232,-30951 }, + + { 233,-30951 }, { 234,-30951 }, { 235,-30951 }, { 236,-30951 }, { 237,-30951 }, + { 238,-30951 }, { 239,-30951 }, { 240,-30951 }, { 241,-30951 }, { 242,-30951 }, + { 243,-30951 }, { 244,-30951 }, { 245,-30951 }, { 246,-30951 }, { 247,-30951 }, + { 248,-30951 }, { 249,-30951 }, { 250,-30951 }, { 251,-30951 }, { 252,-30951 }, + { 253,-30951 }, { 254,-30951 }, { 255,-30951 }, { 0, 131 }, { 0,60915 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-31208 }, { 49,-31208 }, { 50,-31208 }, + { 51,-31208 }, { 52,-31208 }, { 53,-31208 }, { 54,-31208 }, { 55,-31208 }, + { 56,-31208 }, { 57,-31208 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-31208 }, + { 66,-31208 }, { 67,-31208 }, { 68,-31208 }, { 69,-31208 }, { 70,-31208 }, + { 71,-31208 }, { 72,14397 }, { 73,-31208 }, { 74,-31208 }, { 75,-31208 }, + + { 76,-31208 }, { 77,-31208 }, { 78,-31208 }, { 79,-31208 }, { 80,-31208 }, + { 81,-31208 }, { 82,-31208 }, { 83,-31208 }, { 84,-31208 }, { 85,-31208 }, + { 86,-31208 }, { 87,-31208 }, { 88,-31208 }, { 89,-31208 }, { 90,-31208 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-31208 }, + { 0, 0 }, { 97,-31208 }, { 98,-31208 }, { 99,-31208 }, { 100,-31208 }, + { 101,-31208 }, { 102,-31208 }, { 103,-31208 }, { 104,14397 }, { 105,-31208 }, + { 106,-31208 }, { 107,-31208 }, { 108,-31208 }, { 109,-31208 }, { 110,-31208 }, + { 111,-31208 }, { 112,-31208 }, { 113,-31208 }, { 114,-31208 }, { 115,-31208 }, + { 116,-31208 }, { 117,-31208 }, { 118,-31208 }, { 119,-31208 }, { 120,-31208 }, + { 121,-31208 }, { 122,-31208 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 127,-31208 }, { 128,-31208 }, { 129,-31208 }, { 130,-31208 }, + { 131,-31208 }, { 132,-31208 }, { 133,-31208 }, { 134,-31208 }, { 135,-31208 }, + { 136,-31208 }, { 137,-31208 }, { 138,-31208 }, { 139,-31208 }, { 140,-31208 }, + { 141,-31208 }, { 142,-31208 }, { 143,-31208 }, { 144,-31208 }, { 145,-31208 }, + { 146,-31208 }, { 147,-31208 }, { 148,-31208 }, { 149,-31208 }, { 150,-31208 }, + { 151,-31208 }, { 152,-31208 }, { 153,-31208 }, { 154,-31208 }, { 155,-31208 }, + { 156,-31208 }, { 157,-31208 }, { 158,-31208 }, { 159,-31208 }, { 160,-31208 }, + { 161,-31208 }, { 162,-31208 }, { 163,-31208 }, { 164,-31208 }, { 165,-31208 }, + { 166,-31208 }, { 167,-31208 }, { 168,-31208 }, { 169,-31208 }, { 170,-31208 }, + { 171,-31208 }, { 172,-31208 }, { 173,-31208 }, { 174,-31208 }, { 175,-31208 }, + + { 176,-31208 }, { 177,-31208 }, { 178,-31208 }, { 179,-31208 }, { 180,-31208 }, + { 181,-31208 }, { 182,-31208 }, { 183,-31208 }, { 184,-31208 }, { 185,-31208 }, + { 186,-31208 }, { 187,-31208 }, { 188,-31208 }, { 189,-31208 }, { 190,-31208 }, + { 191,-31208 }, { 192,-31208 }, { 193,-31208 }, { 194,-31208 }, { 195,-31208 }, + { 196,-31208 }, { 197,-31208 }, { 198,-31208 }, { 199,-31208 }, { 200,-31208 }, + { 201,-31208 }, { 202,-31208 }, { 203,-31208 }, { 204,-31208 }, { 205,-31208 }, + { 206,-31208 }, { 207,-31208 }, { 208,-31208 }, { 209,-31208 }, { 210,-31208 }, + { 211,-31208 }, { 212,-31208 }, { 213,-31208 }, { 214,-31208 }, { 215,-31208 }, + { 216,-31208 }, { 217,-31208 }, { 218,-31208 }, { 219,-31208 }, { 220,-31208 }, + { 221,-31208 }, { 222,-31208 }, { 223,-31208 }, { 224,-31208 }, { 225,-31208 }, + + { 226,-31208 }, { 227,-31208 }, { 228,-31208 }, { 229,-31208 }, { 230,-31208 }, + { 231,-31208 }, { 232,-31208 }, { 233,-31208 }, { 234,-31208 }, { 235,-31208 }, + { 236,-31208 }, { 237,-31208 }, { 238,-31208 }, { 239,-31208 }, { 240,-31208 }, + { 241,-31208 }, { 242,-31208 }, { 243,-31208 }, { 244,-31208 }, { 245,-31208 }, + { 246,-31208 }, { 247,-31208 }, { 248,-31208 }, { 249,-31208 }, { 250,-31208 }, + { 251,-31208 }, { 252,-31208 }, { 253,-31208 }, { 254,-31208 }, { 255,-31208 }, + { 0, 131 }, { 0,60658 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-31465 }, + { 49,-31465 }, { 50,-31465 }, { 51,-31465 }, { 52,-31465 }, { 53,-31465 }, + { 54,-31465 }, { 55,-31465 }, { 56,-31465 }, { 57,-31465 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-31465 }, { 66,-31465 }, { 67,-31465 }, { 68,-31465 }, + + { 69,-31465 }, { 70,-31465 }, { 71,-31465 }, { 72,-31465 }, { 73,-31465 }, + { 74,-31465 }, { 75,-31465 }, { 76,-31465 }, { 77,-31465 }, { 78,-31465 }, + { 79,-31465 }, { 80,-31465 }, { 81,-31465 }, { 82,-31465 }, { 83,14397 }, + { 84,-31465 }, { 85,-31465 }, { 86,-31465 }, { 87,-31465 }, { 88,-31465 }, + { 89,-31465 }, { 90,-31465 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-31465 }, { 0, 0 }, { 97,-31465 }, { 98,-31465 }, + { 99,-31465 }, { 100,-31465 }, { 101,-31465 }, { 102,-31465 }, { 103,-31465 }, + { 104,-31465 }, { 105,-31465 }, { 106,-31465 }, { 107,-31465 }, { 108,-31465 }, + { 109,-31465 }, { 110,-31465 }, { 111,-31465 }, { 112,-31465 }, { 113,-31465 }, + { 114,-31465 }, { 115,14397 }, { 116,-31465 }, { 117,-31465 }, { 118,-31465 }, + + { 119,-31465 }, { 120,-31465 }, { 121,-31465 }, { 122,-31465 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-31465 }, { 128,-31465 }, + { 129,-31465 }, { 130,-31465 }, { 131,-31465 }, { 132,-31465 }, { 133,-31465 }, + { 134,-31465 }, { 135,-31465 }, { 136,-31465 }, { 137,-31465 }, { 138,-31465 }, + { 139,-31465 }, { 140,-31465 }, { 141,-31465 }, { 142,-31465 }, { 143,-31465 }, + { 144,-31465 }, { 145,-31465 }, { 146,-31465 }, { 147,-31465 }, { 148,-31465 }, + { 149,-31465 }, { 150,-31465 }, { 151,-31465 }, { 152,-31465 }, { 153,-31465 }, + { 154,-31465 }, { 155,-31465 }, { 156,-31465 }, { 157,-31465 }, { 158,-31465 }, + { 159,-31465 }, { 160,-31465 }, { 161,-31465 }, { 162,-31465 }, { 163,-31465 }, + { 164,-31465 }, { 165,-31465 }, { 166,-31465 }, { 167,-31465 }, { 168,-31465 }, + + { 169,-31465 }, { 170,-31465 }, { 171,-31465 }, { 172,-31465 }, { 173,-31465 }, + { 174,-31465 }, { 175,-31465 }, { 176,-31465 }, { 177,-31465 }, { 178,-31465 }, + { 179,-31465 }, { 180,-31465 }, { 181,-31465 }, { 182,-31465 }, { 183,-31465 }, + { 184,-31465 }, { 185,-31465 }, { 186,-31465 }, { 187,-31465 }, { 188,-31465 }, + { 189,-31465 }, { 190,-31465 }, { 191,-31465 }, { 192,-31465 }, { 193,-31465 }, + { 194,-31465 }, { 195,-31465 }, { 196,-31465 }, { 197,-31465 }, { 198,-31465 }, + { 199,-31465 }, { 200,-31465 }, { 201,-31465 }, { 202,-31465 }, { 203,-31465 }, + { 204,-31465 }, { 205,-31465 }, { 206,-31465 }, { 207,-31465 }, { 208,-31465 }, + { 209,-31465 }, { 210,-31465 }, { 211,-31465 }, { 212,-31465 }, { 213,-31465 }, + { 214,-31465 }, { 215,-31465 }, { 216,-31465 }, { 217,-31465 }, { 218,-31465 }, + + { 219,-31465 }, { 220,-31465 }, { 221,-31465 }, { 222,-31465 }, { 223,-31465 }, + { 224,-31465 }, { 225,-31465 }, { 226,-31465 }, { 227,-31465 }, { 228,-31465 }, + { 229,-31465 }, { 230,-31465 }, { 231,-31465 }, { 232,-31465 }, { 233,-31465 }, + { 234,-31465 }, { 235,-31465 }, { 236,-31465 }, { 237,-31465 }, { 238,-31465 }, + { 239,-31465 }, { 240,-31465 }, { 241,-31465 }, { 242,-31465 }, { 243,-31465 }, + { 244,-31465 }, { 245,-31465 }, { 246,-31465 }, { 247,-31465 }, { 248,-31465 }, + { 249,-31465 }, { 250,-31465 }, { 251,-31465 }, { 252,-31465 }, { 253,-31465 }, + { 254,-31465 }, { 255,-31465 }, { 0, 131 }, { 0,60401 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-31722 }, { 49,-31722 }, { 50,-31722 }, { 51,-31722 }, + { 52,-31722 }, { 53,-31722 }, { 54,-31722 }, { 55,-31722 }, { 56,-31722 }, + { 57,-31722 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-31722 }, { 66,-31722 }, + { 67,-31722 }, { 68,-31722 }, { 69,14397 }, { 70,-31722 }, { 71,-31722 }, + { 72,-31722 }, { 73,-31722 }, { 74,-31722 }, { 75,-31722 }, { 76,-31722 }, + { 77,-31722 }, { 78,-31722 }, { 79,-31722 }, { 80,-31722 }, { 81,-31722 }, + { 82,-31722 }, { 83,-31722 }, { 84,-31722 }, { 85,-31722 }, { 86,-31722 }, + { 87,-31722 }, { 88,-31722 }, { 89,-31722 }, { 90,-31722 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-31722 }, { 0, 0 }, + { 97,-31722 }, { 98,-31722 }, { 99,-31722 }, { 100,-31722 }, { 101,14397 }, + { 102,-31722 }, { 103,-31722 }, { 104,-31722 }, { 105,-31722 }, { 106,-31722 }, + { 107,-31722 }, { 108,-31722 }, { 109,-31722 }, { 110,-31722 }, { 111,-31722 }, + + { 112,-31722 }, { 113,-31722 }, { 114,-31722 }, { 115,-31722 }, { 116,-31722 }, + { 117,-31722 }, { 118,-31722 }, { 119,-31722 }, { 120,-31722 }, { 121,-31722 }, + { 122,-31722 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-31722 }, { 128,-31722 }, { 129,-31722 }, { 130,-31722 }, { 131,-31722 }, + { 132,-31722 }, { 133,-31722 }, { 134,-31722 }, { 135,-31722 }, { 136,-31722 }, + { 137,-31722 }, { 138,-31722 }, { 139,-31722 }, { 140,-31722 }, { 141,-31722 }, + { 142,-31722 }, { 143,-31722 }, { 144,-31722 }, { 145,-31722 }, { 146,-31722 }, + { 147,-31722 }, { 148,-31722 }, { 149,-31722 }, { 150,-31722 }, { 151,-31722 }, + { 152,-31722 }, { 153,-31722 }, { 154,-31722 }, { 155,-31722 }, { 156,-31722 }, + { 157,-31722 }, { 158,-31722 }, { 159,-31722 }, { 160,-31722 }, { 161,-31722 }, + + { 162,-31722 }, { 163,-31722 }, { 164,-31722 }, { 165,-31722 }, { 166,-31722 }, + { 167,-31722 }, { 168,-31722 }, { 169,-31722 }, { 170,-31722 }, { 171,-31722 }, + { 172,-31722 }, { 173,-31722 }, { 174,-31722 }, { 175,-31722 }, { 176,-31722 }, + { 177,-31722 }, { 178,-31722 }, { 179,-31722 }, { 180,-31722 }, { 181,-31722 }, + { 182,-31722 }, { 183,-31722 }, { 184,-31722 }, { 185,-31722 }, { 186,-31722 }, + { 187,-31722 }, { 188,-31722 }, { 189,-31722 }, { 190,-31722 }, { 191,-31722 }, + { 192,-31722 }, { 193,-31722 }, { 194,-31722 }, { 195,-31722 }, { 196,-31722 }, + { 197,-31722 }, { 198,-31722 }, { 199,-31722 }, { 200,-31722 }, { 201,-31722 }, + { 202,-31722 }, { 203,-31722 }, { 204,-31722 }, { 205,-31722 }, { 206,-31722 }, + { 207,-31722 }, { 208,-31722 }, { 209,-31722 }, { 210,-31722 }, { 211,-31722 }, + + { 212,-31722 }, { 213,-31722 }, { 214,-31722 }, { 215,-31722 }, { 216,-31722 }, + { 217,-31722 }, { 218,-31722 }, { 219,-31722 }, { 220,-31722 }, { 221,-31722 }, + { 222,-31722 }, { 223,-31722 }, { 224,-31722 }, { 225,-31722 }, { 226,-31722 }, + { 227,-31722 }, { 228,-31722 }, { 229,-31722 }, { 230,-31722 }, { 231,-31722 }, + { 232,-31722 }, { 233,-31722 }, { 234,-31722 }, { 235,-31722 }, { 236,-31722 }, + { 237,-31722 }, { 238,-31722 }, { 239,-31722 }, { 240,-31722 }, { 241,-31722 }, + { 242,-31722 }, { 243,-31722 }, { 244,-31722 }, { 245,-31722 }, { 246,-31722 }, + { 247,-31722 }, { 248,-31722 }, { 249,-31722 }, { 250,-31722 }, { 251,-31722 }, + { 252,-31722 }, { 253,-31722 }, { 254,-31722 }, { 255,-31722 }, { 0, 131 }, + { 0,60144 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-31979 }, { 49,-31979 }, + { 50,-31979 }, { 51,-31979 }, { 52,-31979 }, { 53,-31979 }, { 54,-31979 }, + + { 55,-31979 }, { 56,-31979 }, { 57,-31979 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-31979 }, { 66,-31979 }, { 67,-31979 }, { 68,-31979 }, { 69,-31979 }, + { 70,-31979 }, { 71,-31979 }, { 72,-31979 }, { 73,-31979 }, { 74,-31979 }, + { 75,-31979 }, { 76,-31979 }, { 77,-31979 }, { 78,-31979 }, { 79,-31979 }, + { 80,-31979 }, { 81,-31979 }, { 82,-31979 }, { 83,-31979 }, { 84,14397 }, + { 85,-31979 }, { 86,-31979 }, { 87,-31979 }, { 88,-31979 }, { 89,-31979 }, + { 90,-31979 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-31979 }, { 0, 0 }, { 97,-31979 }, { 98,-31979 }, { 99,-31979 }, + { 100,-31979 }, { 101,-31979 }, { 102,-31979 }, { 103,-31979 }, { 104,-31979 }, + + { 105,-31979 }, { 106,-31979 }, { 107,-31979 }, { 108,-31979 }, { 109,-31979 }, + { 110,-31979 }, { 111,-31979 }, { 112,-31979 }, { 113,-31979 }, { 114,-31979 }, + { 115,-31979 }, { 116,14397 }, { 117,-31979 }, { 118,-31979 }, { 119,-31979 }, + { 120,-31979 }, { 121,-31979 }, { 122,-31979 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-31979 }, { 128,-31979 }, { 129,-31979 }, + { 130,-31979 }, { 131,-31979 }, { 132,-31979 }, { 133,-31979 }, { 134,-31979 }, + { 135,-31979 }, { 136,-31979 }, { 137,-31979 }, { 138,-31979 }, { 139,-31979 }, + { 140,-31979 }, { 141,-31979 }, { 142,-31979 }, { 143,-31979 }, { 144,-31979 }, + { 145,-31979 }, { 146,-31979 }, { 147,-31979 }, { 148,-31979 }, { 149,-31979 }, + { 150,-31979 }, { 151,-31979 }, { 152,-31979 }, { 153,-31979 }, { 154,-31979 }, + + { 155,-31979 }, { 156,-31979 }, { 157,-31979 }, { 158,-31979 }, { 159,-31979 }, + { 160,-31979 }, { 161,-31979 }, { 162,-31979 }, { 163,-31979 }, { 164,-31979 }, + { 165,-31979 }, { 166,-31979 }, { 167,-31979 }, { 168,-31979 }, { 169,-31979 }, + { 170,-31979 }, { 171,-31979 }, { 172,-31979 }, { 173,-31979 }, { 174,-31979 }, + { 175,-31979 }, { 176,-31979 }, { 177,-31979 }, { 178,-31979 }, { 179,-31979 }, + { 180,-31979 }, { 181,-31979 }, { 182,-31979 }, { 183,-31979 }, { 184,-31979 }, + { 185,-31979 }, { 186,-31979 }, { 187,-31979 }, { 188,-31979 }, { 189,-31979 }, + { 190,-31979 }, { 191,-31979 }, { 192,-31979 }, { 193,-31979 }, { 194,-31979 }, + { 195,-31979 }, { 196,-31979 }, { 197,-31979 }, { 198,-31979 }, { 199,-31979 }, + { 200,-31979 }, { 201,-31979 }, { 202,-31979 }, { 203,-31979 }, { 204,-31979 }, + + { 205,-31979 }, { 206,-31979 }, { 207,-31979 }, { 208,-31979 }, { 209,-31979 }, + { 210,-31979 }, { 211,-31979 }, { 212,-31979 }, { 213,-31979 }, { 214,-31979 }, + { 215,-31979 }, { 216,-31979 }, { 217,-31979 }, { 218,-31979 }, { 219,-31979 }, + { 220,-31979 }, { 221,-31979 }, { 222,-31979 }, { 223,-31979 }, { 224,-31979 }, + { 225,-31979 }, { 226,-31979 }, { 227,-31979 }, { 228,-31979 }, { 229,-31979 }, + { 230,-31979 }, { 231,-31979 }, { 232,-31979 }, { 233,-31979 }, { 234,-31979 }, + { 235,-31979 }, { 236,-31979 }, { 237,-31979 }, { 238,-31979 }, { 239,-31979 }, + { 240,-31979 }, { 241,-31979 }, { 242,-31979 }, { 243,-31979 }, { 244,-31979 }, + { 245,-31979 }, { 246,-31979 }, { 247,-31979 }, { 248,-31979 }, { 249,-31979 }, + { 250,-31979 }, { 251,-31979 }, { 252,-31979 }, { 253,-31979 }, { 254,-31979 }, + + { 255,-31979 }, { 0, 131 }, { 0,59887 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 48,-32236 }, { 49,-32236 }, { 50,-32236 }, { 51,-32236 }, { 52,-32236 }, + { 53,-32236 }, { 54,-32236 }, { 55,-32236 }, { 56,-32236 }, { 57,-32236 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-32236 }, { 66,-32236 }, { 67,-32236 }, + { 68,-32236 }, { 69,-32236 }, { 70,-32236 }, { 71,-32236 }, { 72,-32236 }, + { 73,14397 }, { 74,-32236 }, { 75,-32236 }, { 76,-32236 }, { 77,-32236 }, + { 78,-32236 }, { 79,-32236 }, { 80,-32236 }, { 81,-32236 }, { 82,-32236 }, + { 83,-32236 }, { 84,-32236 }, { 85,-32236 }, { 86,-32236 }, { 87,-32236 }, + { 88,-32236 }, { 89,-32236 }, { 90,-32236 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-32236 }, { 0, 0 }, { 97,-32236 }, + + { 98,-32236 }, { 99,-32236 }, { 100,-32236 }, { 101,-32236 }, { 102,-32236 }, + { 103,-32236 }, { 104,-32236 }, { 105,14397 }, { 106,-32236 }, { 107,-32236 }, + { 108,-32236 }, { 109,-32236 }, { 110,-32236 }, { 111,-32236 }, { 112,-32236 }, + { 113,-32236 }, { 114,-32236 }, { 115,-32236 }, { 116,-32236 }, { 117,-32236 }, + { 118,-32236 }, { 119,-32236 }, { 120,-32236 }, { 121,-32236 }, { 122,-32236 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-32236 }, + { 128,-32236 }, { 129,-32236 }, { 130,-32236 }, { 131,-32236 }, { 132,-32236 }, + { 133,-32236 }, { 134,-32236 }, { 135,-32236 }, { 136,-32236 }, { 137,-32236 }, + { 138,-32236 }, { 139,-32236 }, { 140,-32236 }, { 141,-32236 }, { 142,-32236 }, + { 143,-32236 }, { 144,-32236 }, { 145,-32236 }, { 146,-32236 }, { 147,-32236 }, + + { 148,-32236 }, { 149,-32236 }, { 150,-32236 }, { 151,-32236 }, { 152,-32236 }, + { 153,-32236 }, { 154,-32236 }, { 155,-32236 }, { 156,-32236 }, { 157,-32236 }, + { 158,-32236 }, { 159,-32236 }, { 160,-32236 }, { 161,-32236 }, { 162,-32236 }, + { 163,-32236 }, { 164,-32236 }, { 165,-32236 }, { 166,-32236 }, { 167,-32236 }, + { 168,-32236 }, { 169,-32236 }, { 170,-32236 }, { 171,-32236 }, { 172,-32236 }, + { 173,-32236 }, { 174,-32236 }, { 175,-32236 }, { 176,-32236 }, { 177,-32236 }, + { 178,-32236 }, { 179,-32236 }, { 180,-32236 }, { 181,-32236 }, { 182,-32236 }, + { 183,-32236 }, { 184,-32236 }, { 185,-32236 }, { 186,-32236 }, { 187,-32236 }, + { 188,-32236 }, { 189,-32236 }, { 190,-32236 }, { 191,-32236 }, { 192,-32236 }, + { 193,-32236 }, { 194,-32236 }, { 195,-32236 }, { 196,-32236 }, { 197,-32236 }, + + { 198,-32236 }, { 199,-32236 }, { 200,-32236 }, { 201,-32236 }, { 202,-32236 }, + { 203,-32236 }, { 204,-32236 }, { 205,-32236 }, { 206,-32236 }, { 207,-32236 }, + { 208,-32236 }, { 209,-32236 }, { 210,-32236 }, { 211,-32236 }, { 212,-32236 }, + { 213,-32236 }, { 214,-32236 }, { 215,-32236 }, { 216,-32236 }, { 217,-32236 }, + { 218,-32236 }, { 219,-32236 }, { 220,-32236 }, { 221,-32236 }, { 222,-32236 }, + { 223,-32236 }, { 224,-32236 }, { 225,-32236 }, { 226,-32236 }, { 227,-32236 }, + { 228,-32236 }, { 229,-32236 }, { 230,-32236 }, { 231,-32236 }, { 232,-32236 }, + { 233,-32236 }, { 234,-32236 }, { 235,-32236 }, { 236,-32236 }, { 237,-32236 }, + { 238,-32236 }, { 239,-32236 }, { 240,-32236 }, { 241,-32236 }, { 242,-32236 }, + { 243,-32236 }, { 244,-32236 }, { 245,-32236 }, { 246,-32236 }, { 247,-32236 }, + + { 248,-32236 }, { 249,-32236 }, { 250,-32236 }, { 251,-32236 }, { 252,-32236 }, + { 253,-32236 }, { 254,-32236 }, { 255,-32236 }, { 0, 131 }, { 0,59630 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-32493 }, { 49,-32493 }, { 50,-32493 }, + { 51,-32493 }, { 52,-32493 }, { 53,-32493 }, { 54,-32493 }, { 55,-32493 }, + { 56,-32493 }, { 57,-32493 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,14397 }, + { 66,-32493 }, { 67,-32493 }, { 68,-32493 }, { 69,-32493 }, { 70,-32493 }, + { 71,-32493 }, { 72,-32493 }, { 73,-32493 }, { 74,-32493 }, { 75,-32493 }, + { 76,-32493 }, { 77,-32493 }, { 78,-32493 }, { 79,-32493 }, { 80,-32493 }, + { 81,-32493 }, { 82,-32493 }, { 83,-32493 }, { 84,-32493 }, { 85,-32493 }, + { 86,-32493 }, { 87,-32493 }, { 88,-32493 }, { 89,-32493 }, { 90,-32493 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-32493 }, + { 0, 0 }, { 97,14397 }, { 98,-32493 }, { 99,-32493 }, { 100,-32493 }, + { 101,-32493 }, { 102,-32493 }, { 103,-32493 }, { 104,-32493 }, { 105,-32493 }, + { 106,-32493 }, { 107,-32493 }, { 108,-32493 }, { 109,-32493 }, { 110,-32493 }, + { 111,-32493 }, { 112,-32493 }, { 113,-32493 }, { 114,-32493 }, { 115,-32493 }, + { 116,-32493 }, { 117,-32493 }, { 118,-32493 }, { 119,-32493 }, { 120,-32493 }, + { 121,-32493 }, { 122,-32493 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-32493 }, { 128,-32493 }, { 129,-32493 }, { 130,-32493 }, + { 131,-32493 }, { 132,-32493 }, { 133,-32493 }, { 134,-32493 }, { 135,-32493 }, + { 136,-32493 }, { 137,-32493 }, { 138,-32493 }, { 139,-32493 }, { 140,-32493 }, + + { 141,-32493 }, { 142,-32493 }, { 143,-32493 }, { 144,-32493 }, { 145,-32493 }, + { 146,-32493 }, { 147,-32493 }, { 148,-32493 }, { 149,-32493 }, { 150,-32493 }, + { 151,-32493 }, { 152,-32493 }, { 153,-32493 }, { 154,-32493 }, { 155,-32493 }, + { 156,-32493 }, { 157,-32493 }, { 158,-32493 }, { 159,-32493 }, { 160,-32493 }, + { 161,-32493 }, { 162,-32493 }, { 163,-32493 }, { 164,-32493 }, { 165,-32493 }, + { 166,-32493 }, { 167,-32493 }, { 168,-32493 }, { 169,-32493 }, { 170,-32493 }, + { 171,-32493 }, { 172,-32493 }, { 173,-32493 }, { 174,-32493 }, { 175,-32493 }, + { 176,-32493 }, { 177,-32493 }, { 178,-32493 }, { 179,-32493 }, { 180,-32493 }, + { 181,-32493 }, { 182,-32493 }, { 183,-32493 }, { 184,-32493 }, { 185,-32493 }, + { 186,-32493 }, { 187,-32493 }, { 188,-32493 }, { 189,-32493 }, { 190,-32493 }, + + { 191,-32493 }, { 192,-32493 }, { 193,-32493 }, { 194,-32493 }, { 195,-32493 }, + { 196,-32493 }, { 197,-32493 }, { 198,-32493 }, { 199,-32493 }, { 200,-32493 }, + { 201,-32493 }, { 202,-32493 }, { 203,-32493 }, { 204,-32493 }, { 205,-32493 }, + { 206,-32493 }, { 207,-32493 }, { 208,-32493 }, { 209,-32493 }, { 210,-32493 }, + { 211,-32493 }, { 212,-32493 }, { 213,-32493 }, { 214,-32493 }, { 215,-32493 }, + { 216,-32493 }, { 217,-32493 }, { 218,-32493 }, { 219,-32493 }, { 220,-32493 }, + { 221,-32493 }, { 222,-32493 }, { 223,-32493 }, { 224,-32493 }, { 225,-32493 }, + { 226,-32493 }, { 227,-32493 }, { 228,-32493 }, { 229,-32493 }, { 230,-32493 }, + { 231,-32493 }, { 232,-32493 }, { 233,-32493 }, { 234,-32493 }, { 235,-32493 }, + { 236,-32493 }, { 237,-32493 }, { 238,-32493 }, { 239,-32493 }, { 240,-32493 }, + + { 241,-32493 }, { 242,-32493 }, { 243,-32493 }, { 244,-32493 }, { 245,-32493 }, + { 246,-32493 }, { 247,-32493 }, { 248,-32493 }, { 249,-32493 }, { 250,-32493 }, + { 251,-32493 }, { 252,-32493 }, { 253,-32493 }, { 254,-32493 }, { 255,-32493 }, + { 0, 131 }, { 0,59373 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-32750 }, + { 49,-32750 }, { 50,-32750 }, { 51,-32750 }, { 52,-32750 }, { 53,-32750 }, + { 54,-32750 }, { 55,-32750 }, { 56,-32750 }, { 57,-32750 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-32750 }, { 66,-32750 }, { 67,-32750 }, { 68,-32750 }, + { 69,-32750 }, { 70,-32750 }, { 71,-32750 }, { 72,-32750 }, { 73,-32750 }, + { 74,-32750 }, { 75,-32750 }, { 76,-32750 }, { 77,-32750 }, { 78,-32750 }, + { 79,-32750 }, { 80,-32750 }, { 81,-32750 }, { 82,-32750 }, { 83,-32750 }, + + { 84,-32750 }, { 85,14397 }, { 86,-32750 }, { 87,-32750 }, { 88,-32750 }, + { 89,-32750 }, { 90,-32750 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-32750 }, { 0, 0 }, { 97,-32750 }, { 98,-32750 }, + { 99,-32750 }, { 100,-32750 }, { 101,-32750 }, { 102,-32750 }, { 103,-32750 }, + { 104,-32750 }, { 105,-32750 }, { 106,-32750 }, { 107,-32750 }, { 108,-32750 }, + { 109,-32750 }, { 110,-32750 }, { 111,-32750 }, { 112,-32750 }, { 113,-32750 }, + { 114,-32750 }, { 115,-32750 }, { 116,-32750 }, { 117,14397 }, { 118,-32750 }, + { 119,-32750 }, { 120,-32750 }, { 121,-32750 }, { 122,-32750 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-32750 }, { 128,-32750 }, + { 129,-32750 }, { 130,-32750 }, { 131,-32750 }, { 132,-32750 }, { 133,-32750 }, + + { 134,-32750 }, { 135,-32750 }, { 136,-32750 }, { 137,-32750 }, { 138,-32750 }, + { 139,-32750 }, { 140,-32750 }, { 141,-32750 }, { 142,-32750 }, { 143,-32750 }, + { 144,-32750 }, { 145,-32750 }, { 146,-32750 }, { 147,-32750 }, { 148,-32750 }, + { 149,-32750 }, { 150,-32750 }, { 151,-32750 }, { 152,-32750 }, { 153,-32750 }, + { 154,-32750 }, { 155,-32750 }, { 156,-32750 }, { 157,-32750 }, { 158,-32750 }, + { 159,-32750 }, { 160,-32750 }, { 161,-32750 }, { 162,-32750 }, { 163,-32750 }, + { 164,-32750 }, { 165,-32750 }, { 166,-32750 }, { 167,-32750 }, { 168,-32750 }, + { 169,-32750 }, { 170,-32750 }, { 171,-32750 }, { 172,-32750 }, { 173,-32750 }, + { 174,-32750 }, { 175,-32750 }, { 176,-32750 }, { 177,-32750 }, { 178,-32750 }, + { 179,-32750 }, { 180,-32750 }, { 181,-32750 }, { 182,-32750 }, { 183,-32750 }, + + { 184,-32750 }, { 185,-32750 }, { 186,-32750 }, { 187,-32750 }, { 188,-32750 }, + { 189,-32750 }, { 190,-32750 }, { 191,-32750 }, { 192,-32750 }, { 193,-32750 }, + { 194,-32750 }, { 195,-32750 }, { 196,-32750 }, { 197,-32750 }, { 198,-32750 }, + { 199,-32750 }, { 200,-32750 }, { 201,-32750 }, { 202,-32750 }, { 203,-32750 }, + { 204,-32750 }, { 205,-32750 }, { 206,-32750 }, { 207,-32750 }, { 208,-32750 }, + { 209,-32750 }, { 210,-32750 }, { 211,-32750 }, { 212,-32750 }, { 213,-32750 }, + { 214,-32750 }, { 215,-32750 }, { 216,-32750 }, { 217,-32750 }, { 218,-32750 }, + { 219,-32750 }, { 220,-32750 }, { 221,-32750 }, { 222,-32750 }, { 223,-32750 }, + { 224,-32750 }, { 225,-32750 }, { 226,-32750 }, { 227,-32750 }, { 228,-32750 }, + { 229,-32750 }, { 230,-32750 }, { 231,-32750 }, { 232,-32750 }, { 233,-32750 }, + + { 234,-32750 }, { 235,-32750 }, { 236,-32750 }, { 237,-32750 }, { 238,-32750 }, + { 239,-32750 }, { 240,-32750 }, { 241,-32750 }, { 242,-32750 }, { 243,-32750 }, + { 244,-32750 }, { 245,-32750 }, { 246,-32750 }, { 247,-32750 }, { 248,-32750 }, + { 249,-32750 }, { 250,-32750 }, { 251,-32750 }, { 252,-32750 }, { 253,-32750 }, + { 254,-32750 }, { 255,-32750 }, { 0, 35 }, { 0,59116 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-33007 }, { 49,-33007 }, { 50,-33007 }, { 51,-33007 }, + { 52,-33007 }, { 53,-33007 }, { 54,-33007 }, { 55,-33007 }, { 56,-33007 }, + { 57,-33007 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-33007 }, { 66,-33007 }, + { 67,-33007 }, { 68,-33007 }, { 69,-33007 }, { 70,-33007 }, { 71,-33007 }, + { 72,-33007 }, { 73,-33007 }, { 74,-33007 }, { 75,-33007 }, { 76,-33007 }, + + { 77,-33007 }, { 78,-33007 }, { 79,-33007 }, { 80,-33007 }, { 81,-33007 }, + { 82,-33007 }, { 83,-33007 }, { 84,-33007 }, { 85,-33007 }, { 86,-33007 }, + { 87,-33007 }, { 88,-33007 }, { 89,-33007 }, { 90,-33007 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-33007 }, { 0, 0 }, + { 97,-33007 }, { 98,-33007 }, { 99,-33007 }, { 100,-33007 }, { 101,-33007 }, + { 102,-33007 }, { 103,-33007 }, { 104,-33007 }, { 105,-33007 }, { 106,-33007 }, + { 107,-33007 }, { 108,-33007 }, { 109,-33007 }, { 110,-33007 }, { 111,-33007 }, + { 112,-33007 }, { 113,-33007 }, { 114,-33007 }, { 115,-33007 }, { 116,-33007 }, + { 117,-33007 }, { 118,-33007 }, { 119,-33007 }, { 120,-33007 }, { 121,-33007 }, + { 122,-33007 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 127,-33007 }, { 128,-33007 }, { 129,-33007 }, { 130,-33007 }, { 131,-33007 }, + { 132,-33007 }, { 133,-33007 }, { 134,-33007 }, { 135,-33007 }, { 136,-33007 }, + { 137,-33007 }, { 138,-33007 }, { 139,-33007 }, { 140,-33007 }, { 141,-33007 }, + { 142,-33007 }, { 143,-33007 }, { 144,-33007 }, { 145,-33007 }, { 146,-33007 }, + { 147,-33007 }, { 148,-33007 }, { 149,-33007 }, { 150,-33007 }, { 151,-33007 }, + { 152,-33007 }, { 153,-33007 }, { 154,-33007 }, { 155,-33007 }, { 156,-33007 }, + { 157,-33007 }, { 158,-33007 }, { 159,-33007 }, { 160,-33007 }, { 161,-33007 }, + { 162,-33007 }, { 163,-33007 }, { 164,-33007 }, { 165,-33007 }, { 166,-33007 }, + { 167,-33007 }, { 168,-33007 }, { 169,-33007 }, { 170,-33007 }, { 171,-33007 }, + { 172,-33007 }, { 173,-33007 }, { 174,-33007 }, { 175,-33007 }, { 176,-33007 }, + + { 177,-33007 }, { 178,-33007 }, { 179,-33007 }, { 180,-33007 }, { 181,-33007 }, + { 182,-33007 }, { 183,-33007 }, { 184,-33007 }, { 185,-33007 }, { 186,-33007 }, + { 187,-33007 }, { 188,-33007 }, { 189,-33007 }, { 190,-33007 }, { 191,-33007 }, + { 192,-33007 }, { 193,-33007 }, { 194,-33007 }, { 195,-33007 }, { 196,-33007 }, + { 197,-33007 }, { 198,-33007 }, { 199,-33007 }, { 200,-33007 }, { 201,-33007 }, + { 202,-33007 }, { 203,-33007 }, { 204,-33007 }, { 205,-33007 }, { 206,-33007 }, + { 207,-33007 }, { 208,-33007 }, { 209,-33007 }, { 210,-33007 }, { 211,-33007 }, + { 212,-33007 }, { 213,-33007 }, { 214,-33007 }, { 215,-33007 }, { 216,-33007 }, + { 217,-33007 }, { 218,-33007 }, { 219,-33007 }, { 220,-33007 }, { 221,-33007 }, + { 222,-33007 }, { 223,-33007 }, { 224,-33007 }, { 225,-33007 }, { 226,-33007 }, + + { 227,-33007 }, { 228,-33007 }, { 229,-33007 }, { 230,-33007 }, { 231,-33007 }, + { 232,-33007 }, { 233,-33007 }, { 234,-33007 }, { 235,-33007 }, { 236,-33007 }, + { 237,-33007 }, { 238,-33007 }, { 239,-33007 }, { 240,-33007 }, { 241,-33007 }, + { 242,-33007 }, { 243,-33007 }, { 244,-33007 }, { 245,-33007 }, { 246,-33007 }, + { 247,-33007 }, { 248,-33007 }, { 249,-33007 }, { 250,-33007 }, { 251,-33007 }, + { 252,-33007 }, { 253,-33007 }, { 254,-33007 }, { 255,-33007 }, { 0, 33 }, + { 0,58859 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-33264 }, { 49,-33264 }, + { 50,-33264 }, { 51,-33264 }, { 52,-33264 }, { 53,-33264 }, { 54,-33264 }, + { 55,-33264 }, { 56,-33264 }, { 57,-33264 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-33264 }, { 66,-33264 }, { 67,-33264 }, { 68,-33264 }, { 69,-33264 }, + + { 70,-33264 }, { 71,-33264 }, { 72,-33264 }, { 73,14140 }, { 74,-33264 }, + { 75,-33264 }, { 76,-33264 }, { 77,-33264 }, { 78,-33264 }, { 79,-33264 }, + { 80,-33264 }, { 81,-33264 }, { 82,-33264 }, { 83,-33264 }, { 84,-33264 }, + { 85,-33264 }, { 86,-33264 }, { 87,-33264 }, { 88,-33264 }, { 89,-33264 }, + { 90,-33264 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-33264 }, { 0, 0 }, { 97,-33264 }, { 98,-33264 }, { 99,-33264 }, + { 100,-33264 }, { 101,-33264 }, { 102,-33264 }, { 103,-33264 }, { 104,-33264 }, + { 105,14140 }, { 106,-33264 }, { 107,-33264 }, { 108,-33264 }, { 109,-33264 }, + { 110,-33264 }, { 111,-33264 }, { 112,-33264 }, { 113,-33264 }, { 114,-33264 }, + { 115,-33264 }, { 116,-33264 }, { 117,-33264 }, { 118,-33264 }, { 119,-33264 }, + + { 120,-33264 }, { 121,-33264 }, { 122,-33264 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-33264 }, { 128,-33264 }, { 129,-33264 }, + { 130,-33264 }, { 131,-33264 }, { 132,-33264 }, { 133,-33264 }, { 134,-33264 }, + { 135,-33264 }, { 136,-33264 }, { 137,-33264 }, { 138,-33264 }, { 139,-33264 }, + { 140,-33264 }, { 141,-33264 }, { 142,-33264 }, { 143,-33264 }, { 144,-33264 }, + { 145,-33264 }, { 146,-33264 }, { 147,-33264 }, { 148,-33264 }, { 149,-33264 }, + { 150,-33264 }, { 151,-33264 }, { 152,-33264 }, { 153,-33264 }, { 154,-33264 }, + { 155,-33264 }, { 156,-33264 }, { 157,-33264 }, { 158,-33264 }, { 159,-33264 }, + { 160,-33264 }, { 161,-33264 }, { 162,-33264 }, { 163,-33264 }, { 164,-33264 }, + { 165,-33264 }, { 166,-33264 }, { 167,-33264 }, { 168,-33264 }, { 169,-33264 }, + + { 170,-33264 }, { 171,-33264 }, { 172,-33264 }, { 173,-33264 }, { 174,-33264 }, + { 175,-33264 }, { 176,-33264 }, { 177,-33264 }, { 178,-33264 }, { 179,-33264 }, + { 180,-33264 }, { 181,-33264 }, { 182,-33264 }, { 183,-33264 }, { 184,-33264 }, + { 185,-33264 }, { 186,-33264 }, { 187,-33264 }, { 188,-33264 }, { 189,-33264 }, + { 190,-33264 }, { 191,-33264 }, { 192,-33264 }, { 193,-33264 }, { 194,-33264 }, + { 195,-33264 }, { 196,-33264 }, { 197,-33264 }, { 198,-33264 }, { 199,-33264 }, + { 200,-33264 }, { 201,-33264 }, { 202,-33264 }, { 203,-33264 }, { 204,-33264 }, + { 205,-33264 }, { 206,-33264 }, { 207,-33264 }, { 208,-33264 }, { 209,-33264 }, + { 210,-33264 }, { 211,-33264 }, { 212,-33264 }, { 213,-33264 }, { 214,-33264 }, + { 215,-33264 }, { 216,-33264 }, { 217,-33264 }, { 218,-33264 }, { 219,-33264 }, + + { 220,-33264 }, { 221,-33264 }, { 222,-33264 }, { 223,-33264 }, { 224,-33264 }, + { 225,-33264 }, { 226,-33264 }, { 227,-33264 }, { 228,-33264 }, { 229,-33264 }, + { 230,-33264 }, { 231,-33264 }, { 232,-33264 }, { 233,-33264 }, { 234,-33264 }, + { 235,-33264 }, { 236,-33264 }, { 237,-33264 }, { 238,-33264 }, { 239,-33264 }, + { 240,-33264 }, { 241,-33264 }, { 242,-33264 }, { 243,-33264 }, { 244,-33264 }, + { 245,-33264 }, { 246,-33264 }, { 247,-33264 }, { 248,-33264 }, { 249,-33264 }, + { 250,-33264 }, { 251,-33264 }, { 252,-33264 }, { 253,-33264 }, { 254,-33264 }, + { 255,-33264 }, { 0, 131 }, { 0,58602 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-33521 }, { 49,-33521 }, { 50,-33521 }, { 51,-33521 }, { 52,-33521 }, + { 53,-33521 }, { 54,-33521 }, { 55,-33521 }, { 56,-33521 }, { 57,-33521 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 65,-33521 }, { 66,-33521 }, { 67,-33521 }, + { 68,-33521 }, { 69,-33521 }, { 70,-33521 }, { 71,-33521 }, { 72,-33521 }, + { 73,-33521 }, { 74,-33521 }, { 75,-33521 }, { 76,-33521 }, { 77,-33521 }, + { 78,-33521 }, { 79,-33521 }, { 80,-33521 }, { 81,-33521 }, { 82,-33521 }, + { 83,-33521 }, { 84,-33521 }, { 85,-33521 }, { 86,-33521 }, { 87,-33521 }, + { 88,-33521 }, { 89,14140 }, { 90,-33521 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-33521 }, { 0, 0 }, { 97,-33521 }, + { 98,-33521 }, { 99,-33521 }, { 100,-33521 }, { 101,-33521 }, { 102,-33521 }, + { 103,-33521 }, { 104,-33521 }, { 105,-33521 }, { 106,-33521 }, { 107,-33521 }, + { 108,-33521 }, { 109,-33521 }, { 110,-33521 }, { 111,-33521 }, { 112,-33521 }, + + { 113,-33521 }, { 114,-33521 }, { 115,-33521 }, { 116,-33521 }, { 117,-33521 }, + { 118,-33521 }, { 119,-33521 }, { 120,-33521 }, { 121,14140 }, { 122,-33521 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-33521 }, + { 128,-33521 }, { 129,-33521 }, { 130,-33521 }, { 131,-33521 }, { 132,-33521 }, + { 133,-33521 }, { 134,-33521 }, { 135,-33521 }, { 136,-33521 }, { 137,-33521 }, + { 138,-33521 }, { 139,-33521 }, { 140,-33521 }, { 141,-33521 }, { 142,-33521 }, + { 143,-33521 }, { 144,-33521 }, { 145,-33521 }, { 146,-33521 }, { 147,-33521 }, + { 148,-33521 }, { 149,-33521 }, { 150,-33521 }, { 151,-33521 }, { 152,-33521 }, + { 153,-33521 }, { 154,-33521 }, { 155,-33521 }, { 156,-33521 }, { 157,-33521 }, + { 158,-33521 }, { 159,-33521 }, { 160,-33521 }, { 161,-33521 }, { 162,-33521 }, + + { 163,-33521 }, { 164,-33521 }, { 165,-33521 }, { 166,-33521 }, { 167,-33521 }, + { 168,-33521 }, { 169,-33521 }, { 170,-33521 }, { 171,-33521 }, { 172,-33521 }, + { 173,-33521 }, { 174,-33521 }, { 175,-33521 }, { 176,-33521 }, { 177,-33521 }, + { 178,-33521 }, { 179,-33521 }, { 180,-33521 }, { 181,-33521 }, { 182,-33521 }, + { 183,-33521 }, { 184,-33521 }, { 185,-33521 }, { 186,-33521 }, { 187,-33521 }, + { 188,-33521 }, { 189,-33521 }, { 190,-33521 }, { 191,-33521 }, { 192,-33521 }, + { 193,-33521 }, { 194,-33521 }, { 195,-33521 }, { 196,-33521 }, { 197,-33521 }, + { 198,-33521 }, { 199,-33521 }, { 200,-33521 }, { 201,-33521 }, { 202,-33521 }, + { 203,-33521 }, { 204,-33521 }, { 205,-33521 }, { 206,-33521 }, { 207,-33521 }, + { 208,-33521 }, { 209,-33521 }, { 210,-33521 }, { 211,-33521 }, { 212,-33521 }, + + { 213,-33521 }, { 214,-33521 }, { 215,-33521 }, { 216,-33521 }, { 217,-33521 }, + { 218,-33521 }, { 219,-33521 }, { 220,-33521 }, { 221,-33521 }, { 222,-33521 }, + { 223,-33521 }, { 224,-33521 }, { 225,-33521 }, { 226,-33521 }, { 227,-33521 }, + { 228,-33521 }, { 229,-33521 }, { 230,-33521 }, { 231,-33521 }, { 232,-33521 }, + { 233,-33521 }, { 234,-33521 }, { 235,-33521 }, { 236,-33521 }, { 237,-33521 }, + { 238,-33521 }, { 239,-33521 }, { 240,-33521 }, { 241,-33521 }, { 242,-33521 }, + { 243,-33521 }, { 244,-33521 }, { 245,-33521 }, { 246,-33521 }, { 247,-33521 }, + { 248,-33521 }, { 249,-33521 }, { 250,-33521 }, { 251,-33521 }, { 252,-33521 }, + { 253,-33521 }, { 254,-33521 }, { 255,-33521 }, { 0, 131 }, { 0,58345 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-33778 }, { 49,-33778 }, { 50,-33778 }, + { 51,-33778 }, { 52,-33778 }, { 53,-33778 }, { 54,-33778 }, { 55,-33778 }, + + { 56,-33778 }, { 57,-33778 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-33778 }, + { 66,-33778 }, { 67,-33778 }, { 68,-33778 }, { 69,14140 }, { 70,-33778 }, + { 71,-33778 }, { 72,-33778 }, { 73,-33778 }, { 74,-33778 }, { 75,-33778 }, + { 76,-33778 }, { 77,-33778 }, { 78,-33778 }, { 79,-33778 }, { 80,-33778 }, + { 81,-33778 }, { 82,-33778 }, { 83,-33778 }, { 84,-33778 }, { 85,-33778 }, + { 86,-33778 }, { 87,-33778 }, { 88,-33778 }, { 89,-33778 }, { 90,-33778 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-33778 }, + { 0, 0 }, { 97,-33778 }, { 98,-33778 }, { 99,-33778 }, { 100,-33778 }, + { 101,14140 }, { 102,-33778 }, { 103,-33778 }, { 104,-33778 }, { 105,-33778 }, + + { 106,-33778 }, { 107,-33778 }, { 108,-33778 }, { 109,-33778 }, { 110,-33778 }, + { 111,-33778 }, { 112,-33778 }, { 113,-33778 }, { 114,-33778 }, { 115,-33778 }, + { 116,-33778 }, { 117,-33778 }, { 118,-33778 }, { 119,-33778 }, { 120,-33778 }, + { 121,-33778 }, { 122,-33778 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-33778 }, { 128,-33778 }, { 129,-33778 }, { 130,-33778 }, + { 131,-33778 }, { 132,-33778 }, { 133,-33778 }, { 134,-33778 }, { 135,-33778 }, + { 136,-33778 }, { 137,-33778 }, { 138,-33778 }, { 139,-33778 }, { 140,-33778 }, + { 141,-33778 }, { 142,-33778 }, { 143,-33778 }, { 144,-33778 }, { 145,-33778 }, + { 146,-33778 }, { 147,-33778 }, { 148,-33778 }, { 149,-33778 }, { 150,-33778 }, + { 151,-33778 }, { 152,-33778 }, { 153,-33778 }, { 154,-33778 }, { 155,-33778 }, + + { 156,-33778 }, { 157,-33778 }, { 158,-33778 }, { 159,-33778 }, { 160,-33778 }, + { 161,-33778 }, { 162,-33778 }, { 163,-33778 }, { 164,-33778 }, { 165,-33778 }, + { 166,-33778 }, { 167,-33778 }, { 168,-33778 }, { 169,-33778 }, { 170,-33778 }, + { 171,-33778 }, { 172,-33778 }, { 173,-33778 }, { 174,-33778 }, { 175,-33778 }, + { 176,-33778 }, { 177,-33778 }, { 178,-33778 }, { 179,-33778 }, { 180,-33778 }, + { 181,-33778 }, { 182,-33778 }, { 183,-33778 }, { 184,-33778 }, { 185,-33778 }, + { 186,-33778 }, { 187,-33778 }, { 188,-33778 }, { 189,-33778 }, { 190,-33778 }, + { 191,-33778 }, { 192,-33778 }, { 193,-33778 }, { 194,-33778 }, { 195,-33778 }, + { 196,-33778 }, { 197,-33778 }, { 198,-33778 }, { 199,-33778 }, { 200,-33778 }, + { 201,-33778 }, { 202,-33778 }, { 203,-33778 }, { 204,-33778 }, { 205,-33778 }, + + { 206,-33778 }, { 207,-33778 }, { 208,-33778 }, { 209,-33778 }, { 210,-33778 }, + { 211,-33778 }, { 212,-33778 }, { 213,-33778 }, { 214,-33778 }, { 215,-33778 }, + { 216,-33778 }, { 217,-33778 }, { 218,-33778 }, { 219,-33778 }, { 220,-33778 }, + { 221,-33778 }, { 222,-33778 }, { 223,-33778 }, { 224,-33778 }, { 225,-33778 }, + { 226,-33778 }, { 227,-33778 }, { 228,-33778 }, { 229,-33778 }, { 230,-33778 }, + { 231,-33778 }, { 232,-33778 }, { 233,-33778 }, { 234,-33778 }, { 235,-33778 }, + { 236,-33778 }, { 237,-33778 }, { 238,-33778 }, { 239,-33778 }, { 240,-33778 }, + { 241,-33778 }, { 242,-33778 }, { 243,-33778 }, { 244,-33778 }, { 245,-33778 }, + { 246,-33778 }, { 247,-33778 }, { 248,-33778 }, { 249,-33778 }, { 250,-33778 }, + { 251,-33778 }, { 252,-33778 }, { 253,-33778 }, { 254,-33778 }, { 255,-33778 }, + + { 0, 131 }, { 0,58088 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-34035 }, + + { 49,-34035 }, { 50,-34035 }, { 51,-34035 }, { 52,-34035 }, { 53,-34035 }, + { 54,-34035 }, { 55,-34035 }, { 56,-34035 }, { 57,-34035 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-34035 }, { 66,-34035 }, { 67,-34035 }, { 68,-34035 }, + { 69,-34035 }, { 70,-34035 }, { 71,-34035 }, { 72,-34035 }, { 73,-34035 }, + { 74,-34035 }, { 75,-34035 }, { 76,-34035 }, { 77,-34035 }, { 78,-34035 }, + { 79,14140 }, { 80,-34035 }, { 81,-34035 }, { 82,-34035 }, { 83,-34035 }, + { 84,-34035 }, { 85,-34035 }, { 86,-34035 }, { 87,-34035 }, { 88,-34035 }, + { 89,-34035 }, { 90,-34035 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-34035 }, { 0, 0 }, { 97,-34035 }, { 98,-34035 }, + + { 99,-34035 }, { 100,-34035 }, { 101,-34035 }, { 102,-34035 }, { 103,-34035 }, + { 104,-34035 }, { 105,-34035 }, { 106,-34035 }, { 107,-34035 }, { 108,-34035 }, + { 109,-34035 }, { 110,-34035 }, { 111,14140 }, { 112,-34035 }, { 113,-34035 }, + { 114,-34035 }, { 115,-34035 }, { 116,-34035 }, { 117,-34035 }, { 118,-34035 }, + { 119,-34035 }, { 120,-34035 }, { 121,-34035 }, { 122,-34035 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-34035 }, { 128,-34035 }, + { 129,-34035 }, { 130,-34035 }, { 131,-34035 }, { 132,-34035 }, { 133,-34035 }, + { 134,-34035 }, { 135,-34035 }, { 136,-34035 }, { 137,-34035 }, { 138,-34035 }, + { 139,-34035 }, { 140,-34035 }, { 141,-34035 }, { 142,-34035 }, { 143,-34035 }, + { 144,-34035 }, { 145,-34035 }, { 146,-34035 }, { 147,-34035 }, { 148,-34035 }, + + { 149,-34035 }, { 150,-34035 }, { 151,-34035 }, { 152,-34035 }, { 153,-34035 }, + { 154,-34035 }, { 155,-34035 }, { 156,-34035 }, { 157,-34035 }, { 158,-34035 }, + { 159,-34035 }, { 160,-34035 }, { 161,-34035 }, { 162,-34035 }, { 163,-34035 }, + { 164,-34035 }, { 165,-34035 }, { 166,-34035 }, { 167,-34035 }, { 168,-34035 }, + { 169,-34035 }, { 170,-34035 }, { 171,-34035 }, { 172,-34035 }, { 173,-34035 }, + { 174,-34035 }, { 175,-34035 }, { 176,-34035 }, { 177,-34035 }, { 178,-34035 }, + { 179,-34035 }, { 180,-34035 }, { 181,-34035 }, { 182,-34035 }, { 183,-34035 }, + { 184,-34035 }, { 185,-34035 }, { 186,-34035 }, { 187,-34035 }, { 188,-34035 }, + { 189,-34035 }, { 190,-34035 }, { 191,-34035 }, { 192,-34035 }, { 193,-34035 }, + { 194,-34035 }, { 195,-34035 }, { 196,-34035 }, { 197,-34035 }, { 198,-34035 }, + + { 199,-34035 }, { 200,-34035 }, { 201,-34035 }, { 202,-34035 }, { 203,-34035 }, + { 204,-34035 }, { 205,-34035 }, { 206,-34035 }, { 207,-34035 }, { 208,-34035 }, + { 209,-34035 }, { 210,-34035 }, { 211,-34035 }, { 212,-34035 }, { 213,-34035 }, + { 214,-34035 }, { 215,-34035 }, { 216,-34035 }, { 217,-34035 }, { 218,-34035 }, + { 219,-34035 }, { 220,-34035 }, { 221,-34035 }, { 222,-34035 }, { 223,-34035 }, + { 224,-34035 }, { 225,-34035 }, { 226,-34035 }, { 227,-34035 }, { 228,-34035 }, + { 229,-34035 }, { 230,-34035 }, { 231,-34035 }, { 232,-34035 }, { 233,-34035 }, + { 234,-34035 }, { 235,-34035 }, { 236,-34035 }, { 237,-34035 }, { 238,-34035 }, + { 239,-34035 }, { 240,-34035 }, { 241,-34035 }, { 242,-34035 }, { 243,-34035 }, + { 244,-34035 }, { 245,-34035 }, { 246,-34035 }, { 247,-34035 }, { 248,-34035 }, + + { 249,-34035 }, { 250,-34035 }, { 251,-34035 }, { 252,-34035 }, { 253,-34035 }, + { 254,-34035 }, { 255,-34035 }, { 0, 131 }, { 0,57831 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-34292 }, { 49,-34292 }, { 50,-34292 }, { 51,-34292 }, + { 52,-34292 }, { 53,-34292 }, { 54,-34292 }, { 55,-34292 }, { 56,-34292 }, + { 57,-34292 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-34292 }, { 66,-34292 }, + { 67,-34292 }, { 68,-34292 }, { 69,-34292 }, { 70,14140 }, { 71,-34292 }, + { 72,-34292 }, { 73,-34292 }, { 74,-34292 }, { 75,-34292 }, { 76,-34292 }, + { 77,-34292 }, { 78,-34292 }, { 79,-34292 }, { 80,-34292 }, { 81,-34292 }, + { 82,-34292 }, { 83,-34292 }, { 84,-34292 }, { 85,-34292 }, { 86,-34292 }, + { 87,-34292 }, { 88,-34292 }, { 89,-34292 }, { 90,-34292 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-34292 }, { 0, 0 }, + { 97,-34292 }, { 98,-34292 }, { 99,-34292 }, { 100,-34292 }, { 101,-34292 }, + { 102,14140 }, { 103,-34292 }, { 104,-34292 }, { 105,-34292 }, { 106,-34292 }, + { 107,-34292 }, { 108,-34292 }, { 109,-34292 }, { 110,-34292 }, { 111,-34292 }, + { 112,-34292 }, { 113,-34292 }, { 114,-34292 }, { 115,-34292 }, { 116,-34292 }, + { 117,-34292 }, { 118,-34292 }, { 119,-34292 }, { 120,-34292 }, { 121,-34292 }, + { 122,-34292 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-34292 }, { 128,-34292 }, { 129,-34292 }, { 130,-34292 }, { 131,-34292 }, + { 132,-34292 }, { 133,-34292 }, { 134,-34292 }, { 135,-34292 }, { 136,-34292 }, + { 137,-34292 }, { 138,-34292 }, { 139,-34292 }, { 140,-34292 }, { 141,-34292 }, + + { 142,-34292 }, { 143,-34292 }, { 144,-34292 }, { 145,-34292 }, { 146,-34292 }, + { 147,-34292 }, { 148,-34292 }, { 149,-34292 }, { 150,-34292 }, { 151,-34292 }, + { 152,-34292 }, { 153,-34292 }, { 154,-34292 }, { 155,-34292 }, { 156,-34292 }, + { 157,-34292 }, { 158,-34292 }, { 159,-34292 }, { 160,-34292 }, { 161,-34292 }, + { 162,-34292 }, { 163,-34292 }, { 164,-34292 }, { 165,-34292 }, { 166,-34292 }, + { 167,-34292 }, { 168,-34292 }, { 169,-34292 }, { 170,-34292 }, { 171,-34292 }, + { 172,-34292 }, { 173,-34292 }, { 174,-34292 }, { 175,-34292 }, { 176,-34292 }, + { 177,-34292 }, { 178,-34292 }, { 179,-34292 }, { 180,-34292 }, { 181,-34292 }, + { 182,-34292 }, { 183,-34292 }, { 184,-34292 }, { 185,-34292 }, { 186,-34292 }, + { 187,-34292 }, { 188,-34292 }, { 189,-34292 }, { 190,-34292 }, { 191,-34292 }, + + { 192,-34292 }, { 193,-34292 }, { 194,-34292 }, { 195,-34292 }, { 196,-34292 }, + { 197,-34292 }, { 198,-34292 }, { 199,-34292 }, { 200,-34292 }, { 201,-34292 }, + { 202,-34292 }, { 203,-34292 }, { 204,-34292 }, { 205,-34292 }, { 206,-34292 }, + { 207,-34292 }, { 208,-34292 }, { 209,-34292 }, { 210,-34292 }, { 211,-34292 }, + { 212,-34292 }, { 213,-34292 }, { 214,-34292 }, { 215,-34292 }, { 216,-34292 }, + { 217,-34292 }, { 218,-34292 }, { 219,-34292 }, { 220,-34292 }, { 221,-34292 }, + { 222,-34292 }, { 223,-34292 }, { 224,-34292 }, { 225,-34292 }, { 226,-34292 }, + { 227,-34292 }, { 228,-34292 }, { 229,-34292 }, { 230,-34292 }, { 231,-34292 }, + { 232,-34292 }, { 233,-34292 }, { 234,-34292 }, { 235,-34292 }, { 236,-34292 }, + { 237,-34292 }, { 238,-34292 }, { 239,-34292 }, { 240,-34292 }, { 241,-34292 }, + + { 242,-34292 }, { 243,-34292 }, { 244,-34292 }, { 245,-34292 }, { 246,-34292 }, + { 247,-34292 }, { 248,-34292 }, { 249,-34292 }, { 250,-34292 }, { 251,-34292 }, + { 252,-34292 }, { 253,-34292 }, { 254,-34292 }, { 255,-34292 }, { 0, 131 }, + { 0,57574 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-34549 }, { 49,-34549 }, + { 50,-34549 }, { 51,-34549 }, { 52,-34549 }, { 53,-34549 }, { 54,-34549 }, + { 55,-34549 }, { 56,-34549 }, { 57,-34549 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-34549 }, { 66,-34549 }, { 67,-34549 }, { 68,-34549 }, { 69,-34549 }, + { 70,-34549 }, { 71,-34549 }, { 72,-34549 }, { 73,-34549 }, { 74,-34549 }, + { 75,-34549 }, { 76,-34549 }, { 77,-34549 }, { 78,-34549 }, { 79,-34549 }, + { 80,-34549 }, { 81,-34549 }, { 82,-34549 }, { 83,-34549 }, { 84,-34549 }, + + { 85,-34549 }, { 86,-34549 }, { 87,14140 }, { 88,-34549 }, { 89,-34549 }, + { 90,-34549 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-34549 }, { 0, 0 }, { 97,-34549 }, { 98,-34549 }, { 99,-34549 }, + { 100,-34549 }, { 101,-34549 }, { 102,-34549 }, { 103,-34549 }, { 104,-34549 }, + { 105,-34549 }, { 106,-34549 }, { 107,-34549 }, { 108,-34549 }, { 109,-34549 }, + { 110,-34549 }, { 111,-34549 }, { 112,-34549 }, { 113,-34549 }, { 114,-34549 }, + { 115,-34549 }, { 116,-34549 }, { 117,-34549 }, { 118,-34549 }, { 119,14140 }, + { 120,-34549 }, { 121,-34549 }, { 122,-34549 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-34549 }, { 128,-34549 }, { 129,-34549 }, + { 130,-34549 }, { 131,-34549 }, { 132,-34549 }, { 133,-34549 }, { 134,-34549 }, + + { 135,-34549 }, { 136,-34549 }, { 137,-34549 }, { 138,-34549 }, { 139,-34549 }, + { 140,-34549 }, { 141,-34549 }, { 142,-34549 }, { 143,-34549 }, { 144,-34549 }, + { 145,-34549 }, { 146,-34549 }, { 147,-34549 }, { 148,-34549 }, { 149,-34549 }, + { 150,-34549 }, { 151,-34549 }, { 152,-34549 }, { 153,-34549 }, { 154,-34549 }, + { 155,-34549 }, { 156,-34549 }, { 157,-34549 }, { 158,-34549 }, { 159,-34549 }, + { 160,-34549 }, { 161,-34549 }, { 162,-34549 }, { 163,-34549 }, { 164,-34549 }, + { 165,-34549 }, { 166,-34549 }, { 167,-34549 }, { 168,-34549 }, { 169,-34549 }, + { 170,-34549 }, { 171,-34549 }, { 172,-34549 }, { 173,-34549 }, { 174,-34549 }, + { 175,-34549 }, { 176,-34549 }, { 177,-34549 }, { 178,-34549 }, { 179,-34549 }, + { 180,-34549 }, { 181,-34549 }, { 182,-34549 }, { 183,-34549 }, { 184,-34549 }, + + { 185,-34549 }, { 186,-34549 }, { 187,-34549 }, { 188,-34549 }, { 189,-34549 }, + { 190,-34549 }, { 191,-34549 }, { 192,-34549 }, { 193,-34549 }, { 194,-34549 }, + { 195,-34549 }, { 196,-34549 }, { 197,-34549 }, { 198,-34549 }, { 199,-34549 }, + { 200,-34549 }, { 201,-34549 }, { 202,-34549 }, { 203,-34549 }, { 204,-34549 }, + { 205,-34549 }, { 206,-34549 }, { 207,-34549 }, { 208,-34549 }, { 209,-34549 }, + { 210,-34549 }, { 211,-34549 }, { 212,-34549 }, { 213,-34549 }, { 214,-34549 }, + { 215,-34549 }, { 216,-34549 }, { 217,-34549 }, { 218,-34549 }, { 219,-34549 }, + { 220,-34549 }, { 221,-34549 }, { 222,-34549 }, { 223,-34549 }, { 224,-34549 }, + { 225,-34549 }, { 226,-34549 }, { 227,-34549 }, { 228,-34549 }, { 229,-34549 }, + { 230,-34549 }, { 231,-34549 }, { 232,-34549 }, { 233,-34549 }, { 234,-34549 }, + + { 235,-34549 }, { 236,-34549 }, { 237,-34549 }, { 238,-34549 }, { 239,-34549 }, + { 240,-34549 }, { 241,-34549 }, { 242,-34549 }, { 243,-34549 }, { 244,-34549 }, + { 245,-34549 }, { 246,-34549 }, { 247,-34549 }, { 248,-34549 }, { 249,-34549 }, + { 250,-34549 }, { 251,-34549 }, { 252,-34549 }, { 253,-34549 }, { 254,-34549 }, + { 255,-34549 }, { 0, 131 }, { 0,57317 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-34806 }, { 49,-34806 }, { 50,-34806 }, { 51,-34806 }, { 52,-34806 }, + { 53,-34806 }, { 54,-34806 }, { 55,-34806 }, { 56,-34806 }, { 57,-34806 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-34806 }, { 66,-34806 }, { 67,-34806 }, + { 68,-34806 }, { 69,-34806 }, { 70,-34806 }, { 71,-34806 }, { 72,14140 }, + { 73,-34806 }, { 74,-34806 }, { 75,-34806 }, { 76,-34806 }, { 77,-34806 }, + + { 78,-34806 }, { 79,-34806 }, { 80,-34806 }, { 81,-34806 }, { 82,-34806 }, + { 83,-34806 }, { 84,-34806 }, { 85,-34806 }, { 86,-34806 }, { 87,-34806 }, + { 88,-34806 }, { 89,-34806 }, { 90,-34806 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-34806 }, { 0, 0 }, { 97,-34806 }, + { 98,-34806 }, { 99,-34806 }, { 100,-34806 }, { 101,-34806 }, { 102,-34806 }, + { 103,-34806 }, { 104,14140 }, { 105,-34806 }, { 106,-34806 }, { 107,-34806 }, + { 108,-34806 }, { 109,-34806 }, { 110,-34806 }, { 111,-34806 }, { 112,-34806 }, + { 113,-34806 }, { 114,-34806 }, { 115,-34806 }, { 116,-34806 }, { 117,-34806 }, + { 118,-34806 }, { 119,-34806 }, { 120,-34806 }, { 121,-34806 }, { 122,-34806 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-34806 }, + + { 128,-34806 }, { 129,-34806 }, { 130,-34806 }, { 131,-34806 }, { 132,-34806 }, + { 133,-34806 }, { 134,-34806 }, { 135,-34806 }, { 136,-34806 }, { 137,-34806 }, + { 138,-34806 }, { 139,-34806 }, { 140,-34806 }, { 141,-34806 }, { 142,-34806 }, + { 143,-34806 }, { 144,-34806 }, { 145,-34806 }, { 146,-34806 }, { 147,-34806 }, + { 148,-34806 }, { 149,-34806 }, { 150,-34806 }, { 151,-34806 }, { 152,-34806 }, + { 153,-34806 }, { 154,-34806 }, { 155,-34806 }, { 156,-34806 }, { 157,-34806 }, + { 158,-34806 }, { 159,-34806 }, { 160,-34806 }, { 161,-34806 }, { 162,-34806 }, + { 163,-34806 }, { 164,-34806 }, { 165,-34806 }, { 166,-34806 }, { 167,-34806 }, + { 168,-34806 }, { 169,-34806 }, { 170,-34806 }, { 171,-34806 }, { 172,-34806 }, + { 173,-34806 }, { 174,-34806 }, { 175,-34806 }, { 176,-34806 }, { 177,-34806 }, + + { 178,-34806 }, { 179,-34806 }, { 180,-34806 }, { 181,-34806 }, { 182,-34806 }, + { 183,-34806 }, { 184,-34806 }, { 185,-34806 }, { 186,-34806 }, { 187,-34806 }, + { 188,-34806 }, { 189,-34806 }, { 190,-34806 }, { 191,-34806 }, { 192,-34806 }, + { 193,-34806 }, { 194,-34806 }, { 195,-34806 }, { 196,-34806 }, { 197,-34806 }, + { 198,-34806 }, { 199,-34806 }, { 200,-34806 }, { 201,-34806 }, { 202,-34806 }, + { 203,-34806 }, { 204,-34806 }, { 205,-34806 }, { 206,-34806 }, { 207,-34806 }, + { 208,-34806 }, { 209,-34806 }, { 210,-34806 }, { 211,-34806 }, { 212,-34806 }, + { 213,-34806 }, { 214,-34806 }, { 215,-34806 }, { 216,-34806 }, { 217,-34806 }, + { 218,-34806 }, { 219,-34806 }, { 220,-34806 }, { 221,-34806 }, { 222,-34806 }, + { 223,-34806 }, { 224,-34806 }, { 225,-34806 }, { 226,-34806 }, { 227,-34806 }, + + { 228,-34806 }, { 229,-34806 }, { 230,-34806 }, { 231,-34806 }, { 232,-34806 }, + { 233,-34806 }, { 234,-34806 }, { 235,-34806 }, { 236,-34806 }, { 237,-34806 }, + { 238,-34806 }, { 239,-34806 }, { 240,-34806 }, { 241,-34806 }, { 242,-34806 }, + { 243,-34806 }, { 244,-34806 }, { 245,-34806 }, { 246,-34806 }, { 247,-34806 }, + { 248,-34806 }, { 249,-34806 }, { 250,-34806 }, { 251,-34806 }, { 252,-34806 }, + { 253,-34806 }, { 254,-34806 }, { 255,-34806 }, { 0, 20 }, { 0,57060 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-35063 }, { 49,-35063 }, { 50,-35063 }, + { 51,-35063 }, { 52,-35063 }, { 53,-35063 }, { 54,-35063 }, { 55,-35063 }, + { 56,-35063 }, { 57,-35063 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-35063 }, + { 66,-35063 }, { 67,-35063 }, { 68,-35063 }, { 69,-35063 }, { 70,-35063 }, + + { 71,-35063 }, { 72,-35063 }, { 73,-35063 }, { 74,-35063 }, { 75,-35063 }, + { 76,-35063 }, { 77,-35063 }, { 78,-35063 }, { 79,-35063 }, { 80,-35063 }, + { 81,-35063 }, { 82,-35063 }, { 83,-35063 }, { 84,-35063 }, { 85,-35063 }, + { 86,-35063 }, { 87,-35063 }, { 88,-35063 }, { 89,-35063 }, { 90,-35063 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-35063 }, + { 0, 0 }, { 97,-35063 }, { 98,-35063 }, { 99,-35063 }, { 100,-35063 }, + { 101,-35063 }, { 102,-35063 }, { 103,-35063 }, { 104,-35063 }, { 105,-35063 }, + { 106,-35063 }, { 107,-35063 }, { 108,-35063 }, { 109,-35063 }, { 110,-35063 }, + { 111,-35063 }, { 112,-35063 }, { 113,-35063 }, { 114,-35063 }, { 115,-35063 }, + { 116,-35063 }, { 117,-35063 }, { 118,-35063 }, { 119,-35063 }, { 120,-35063 }, + + { 121,-35063 }, { 122,-35063 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-35063 }, { 128,-35063 }, { 129,-35063 }, { 130,-35063 }, + { 131,-35063 }, { 132,-35063 }, { 133,-35063 }, { 134,-35063 }, { 135,-35063 }, + { 136,-35063 }, { 137,-35063 }, { 138,-35063 }, { 139,-35063 }, { 140,-35063 }, + { 141,-35063 }, { 142,-35063 }, { 143,-35063 }, { 144,-35063 }, { 145,-35063 }, + { 146,-35063 }, { 147,-35063 }, { 148,-35063 }, { 149,-35063 }, { 150,-35063 }, + { 151,-35063 }, { 152,-35063 }, { 153,-35063 }, { 154,-35063 }, { 155,-35063 }, + { 156,-35063 }, { 157,-35063 }, { 158,-35063 }, { 159,-35063 }, { 160,-35063 }, + { 161,-35063 }, { 162,-35063 }, { 163,-35063 }, { 164,-35063 }, { 165,-35063 }, + { 166,-35063 }, { 167,-35063 }, { 168,-35063 }, { 169,-35063 }, { 170,-35063 }, + + { 171,-35063 }, { 172,-35063 }, { 173,-35063 }, { 174,-35063 }, { 175,-35063 }, + { 176,-35063 }, { 177,-35063 }, { 178,-35063 }, { 179,-35063 }, { 180,-35063 }, + { 181,-35063 }, { 182,-35063 }, { 183,-35063 }, { 184,-35063 }, { 185,-35063 }, + { 186,-35063 }, { 187,-35063 }, { 188,-35063 }, { 189,-35063 }, { 190,-35063 }, + { 191,-35063 }, { 192,-35063 }, { 193,-35063 }, { 194,-35063 }, { 195,-35063 }, + { 196,-35063 }, { 197,-35063 }, { 198,-35063 }, { 199,-35063 }, { 200,-35063 }, + { 201,-35063 }, { 202,-35063 }, { 203,-35063 }, { 204,-35063 }, { 205,-35063 }, + { 206,-35063 }, { 207,-35063 }, { 208,-35063 }, { 209,-35063 }, { 210,-35063 }, + { 211,-35063 }, { 212,-35063 }, { 213,-35063 }, { 214,-35063 }, { 215,-35063 }, + { 216,-35063 }, { 217,-35063 }, { 218,-35063 }, { 219,-35063 }, { 220,-35063 }, + + { 221,-35063 }, { 222,-35063 }, { 223,-35063 }, { 224,-35063 }, { 225,-35063 }, + { 226,-35063 }, { 227,-35063 }, { 228,-35063 }, { 229,-35063 }, { 230,-35063 }, + { 231,-35063 }, { 232,-35063 }, { 233,-35063 }, { 234,-35063 }, { 235,-35063 }, + { 236,-35063 }, { 237,-35063 }, { 238,-35063 }, { 239,-35063 }, { 240,-35063 }, + { 241,-35063 }, { 242,-35063 }, { 243,-35063 }, { 244,-35063 }, { 245,-35063 }, + { 246,-35063 }, { 247,-35063 }, { 248,-35063 }, { 249,-35063 }, { 250,-35063 }, + { 251,-35063 }, { 252,-35063 }, { 253,-35063 }, { 254,-35063 }, { 255,-35063 }, + { 0, 30 }, { 0,56803 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-35320 }, + { 49,-35320 }, { 50,-35320 }, { 51,-35320 }, { 52,-35320 }, { 53,-35320 }, + { 54,-35320 }, { 55,-35320 }, { 56,-35320 }, { 57,-35320 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 65,-35320 }, { 66,-35320 }, { 67,-35320 }, { 68,-35320 }, + { 69,-35320 }, { 70,-35320 }, { 71,-35320 }, { 72,-35320 }, { 73,-35320 }, + { 74,-35320 }, { 75,-35320 }, { 76,-35320 }, { 77,-35320 }, { 78,-35320 }, + { 79,-35320 }, { 80,-35320 }, { 81,-35320 }, { 82,-35320 }, { 83,-35320 }, + { 84,-35320 }, { 85,-35320 }, { 86,-35320 }, { 87,-35320 }, { 88,-35320 }, + { 89,-35320 }, { 90,-35320 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-35320 }, { 0, 0 }, { 97,-35320 }, { 98,-35320 }, + { 99,-35320 }, { 100,-35320 }, { 101,-35320 }, { 102,-35320 }, { 103,-35320 }, + { 104,-35320 }, { 105,-35320 }, { 106,-35320 }, { 107,-35320 }, { 108,-35320 }, + { 109,-35320 }, { 110,-35320 }, { 111,-35320 }, { 112,-35320 }, { 113,-35320 }, + + { 114,-35320 }, { 115,-35320 }, { 116,-35320 }, { 117,-35320 }, { 118,-35320 }, + { 119,-35320 }, { 120,-35320 }, { 121,-35320 }, { 122,-35320 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-35320 }, { 128,-35320 }, + { 129,-35320 }, { 130,-35320 }, { 131,-35320 }, { 132,-35320 }, { 133,-35320 }, + { 134,-35320 }, { 135,-35320 }, { 136,-35320 }, { 137,-35320 }, { 138,-35320 }, + { 139,-35320 }, { 140,-35320 }, { 141,-35320 }, { 142,-35320 }, { 143,-35320 }, + { 144,-35320 }, { 145,-35320 }, { 146,-35320 }, { 147,-35320 }, { 148,-35320 }, + { 149,-35320 }, { 150,-35320 }, { 151,-35320 }, { 152,-35320 }, { 153,-35320 }, + { 154,-35320 }, { 155,-35320 }, { 156,-35320 }, { 157,-35320 }, { 158,-35320 }, + { 159,-35320 }, { 160,-35320 }, { 161,-35320 }, { 162,-35320 }, { 163,-35320 }, + + { 164,-35320 }, { 165,-35320 }, { 166,-35320 }, { 167,-35320 }, { 168,-35320 }, + { 169,-35320 }, { 170,-35320 }, { 171,-35320 }, { 172,-35320 }, { 173,-35320 }, + { 174,-35320 }, { 175,-35320 }, { 176,-35320 }, { 177,-35320 }, { 178,-35320 }, + { 179,-35320 }, { 180,-35320 }, { 181,-35320 }, { 182,-35320 }, { 183,-35320 }, + { 184,-35320 }, { 185,-35320 }, { 186,-35320 }, { 187,-35320 }, { 188,-35320 }, + { 189,-35320 }, { 190,-35320 }, { 191,-35320 }, { 192,-35320 }, { 193,-35320 }, + { 194,-35320 }, { 195,-35320 }, { 196,-35320 }, { 197,-35320 }, { 198,-35320 }, + { 199,-35320 }, { 200,-35320 }, { 201,-35320 }, { 202,-35320 }, { 203,-35320 }, + { 204,-35320 }, { 205,-35320 }, { 206,-35320 }, { 207,-35320 }, { 208,-35320 }, + { 209,-35320 }, { 210,-35320 }, { 211,-35320 }, { 212,-35320 }, { 213,-35320 }, + + { 214,-35320 }, { 215,-35320 }, { 216,-35320 }, { 217,-35320 }, { 218,-35320 }, + { 219,-35320 }, { 220,-35320 }, { 221,-35320 }, { 222,-35320 }, { 223,-35320 }, + { 224,-35320 }, { 225,-35320 }, { 226,-35320 }, { 227,-35320 }, { 228,-35320 }, + { 229,-35320 }, { 230,-35320 }, { 231,-35320 }, { 232,-35320 }, { 233,-35320 }, + { 234,-35320 }, { 235,-35320 }, { 236,-35320 }, { 237,-35320 }, { 238,-35320 }, + { 239,-35320 }, { 240,-35320 }, { 241,-35320 }, { 242,-35320 }, { 243,-35320 }, + { 244,-35320 }, { 245,-35320 }, { 246,-35320 }, { 247,-35320 }, { 248,-35320 }, + { 249,-35320 }, { 250,-35320 }, { 251,-35320 }, { 252,-35320 }, { 253,-35320 }, + { 254,-35320 }, { 255,-35320 }, { 0, 131 }, { 0,56546 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-35577 }, { 49,-35577 }, { 50,-35577 }, { 51,-35577 }, + { 52,-35577 }, { 53,-35577 }, { 54,-35577 }, { 55,-35577 }, { 56,-35577 }, + + { 57,-35577 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-35577 }, { 66,-35577 }, + { 67,-35577 }, { 68,-35577 }, { 69,-35577 }, { 70,-35577 }, { 71,-35577 }, + { 72,-35577 }, { 73,-35577 }, { 74,-35577 }, { 75,-35577 }, { 76,-35577 }, + { 77,-35577 }, { 78,13626 }, { 79,-35577 }, { 80,-35577 }, { 81,-35577 }, + { 82,-35577 }, { 83,-35577 }, { 84,-35577 }, { 85,-35577 }, { 86,-35577 }, + { 87,-35577 }, { 88,-35577 }, { 89,-35577 }, { 90,-35577 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-35577 }, { 0, 0 }, + { 97,-35577 }, { 98,-35577 }, { 99,-35577 }, { 100,-35577 }, { 101,-35577 }, + { 102,-35577 }, { 103,-35577 }, { 104,-35577 }, { 105,-35577 }, { 106,-35577 }, + + { 107,-35577 }, { 108,-35577 }, { 109,-35577 }, { 110,13626 }, { 111,-35577 }, + { 112,-35577 }, { 113,-35577 }, { 114,-35577 }, { 115,-35577 }, { 116,-35577 }, + { 117,-35577 }, { 118,-35577 }, { 119,-35577 }, { 120,-35577 }, { 121,-35577 }, + { 122,-35577 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-35577 }, { 128,-35577 }, { 129,-35577 }, { 130,-35577 }, { 131,-35577 }, + { 132,-35577 }, { 133,-35577 }, { 134,-35577 }, { 135,-35577 }, { 136,-35577 }, + { 137,-35577 }, { 138,-35577 }, { 139,-35577 }, { 140,-35577 }, { 141,-35577 }, + { 142,-35577 }, { 143,-35577 }, { 144,-35577 }, { 145,-35577 }, { 146,-35577 }, + { 147,-35577 }, { 148,-35577 }, { 149,-35577 }, { 150,-35577 }, { 151,-35577 }, + { 152,-35577 }, { 153,-35577 }, { 154,-35577 }, { 155,-35577 }, { 156,-35577 }, + + { 157,-35577 }, { 158,-35577 }, { 159,-35577 }, { 160,-35577 }, { 161,-35577 }, + { 162,-35577 }, { 163,-35577 }, { 164,-35577 }, { 165,-35577 }, { 166,-35577 }, + { 167,-35577 }, { 168,-35577 }, { 169,-35577 }, { 170,-35577 }, { 171,-35577 }, + { 172,-35577 }, { 173,-35577 }, { 174,-35577 }, { 175,-35577 }, { 176,-35577 }, + { 177,-35577 }, { 178,-35577 }, { 179,-35577 }, { 180,-35577 }, { 181,-35577 }, + { 182,-35577 }, { 183,-35577 }, { 184,-35577 }, { 185,-35577 }, { 186,-35577 }, + { 187,-35577 }, { 188,-35577 }, { 189,-35577 }, { 190,-35577 }, { 191,-35577 }, + { 192,-35577 }, { 193,-35577 }, { 194,-35577 }, { 195,-35577 }, { 196,-35577 }, + { 197,-35577 }, { 198,-35577 }, { 199,-35577 }, { 200,-35577 }, { 201,-35577 }, + { 202,-35577 }, { 203,-35577 }, { 204,-35577 }, { 205,-35577 }, { 206,-35577 }, + + { 207,-35577 }, { 208,-35577 }, { 209,-35577 }, { 210,-35577 }, { 211,-35577 }, + { 212,-35577 }, { 213,-35577 }, { 214,-35577 }, { 215,-35577 }, { 216,-35577 }, + { 217,-35577 }, { 218,-35577 }, { 219,-35577 }, { 220,-35577 }, { 221,-35577 }, + { 222,-35577 }, { 223,-35577 }, { 224,-35577 }, { 225,-35577 }, { 226,-35577 }, + { 227,-35577 }, { 228,-35577 }, { 229,-35577 }, { 230,-35577 }, { 231,-35577 }, + { 232,-35577 }, { 233,-35577 }, { 234,-35577 }, { 235,-35577 }, { 236,-35577 }, + { 237,-35577 }, { 238,-35577 }, { 239,-35577 }, { 240,-35577 }, { 241,-35577 }, + { 242,-35577 }, { 243,-35577 }, { 244,-35577 }, { 245,-35577 }, { 246,-35577 }, + { 247,-35577 }, { 248,-35577 }, { 249,-35577 }, { 250,-35577 }, { 251,-35577 }, + { 252,-35577 }, { 253,-35577 }, { 254,-35577 }, { 255,-35577 }, { 0, 131 }, + + { 0,56289 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-35834 }, { 49,-35834 }, + + { 50,-35834 }, { 51,-35834 }, { 52,-35834 }, { 53,-35834 }, { 54,-35834 }, + { 55,-35834 }, { 56,-35834 }, { 57,-35834 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-35834 }, { 66,-35834 }, { 67,-35834 }, { 68,-35834 }, { 69,-35834 }, + { 70,-35834 }, { 71,-35834 }, { 72,-35834 }, { 73,-35834 }, { 74,-35834 }, + { 75,-35834 }, { 76,13626 }, { 77,-35834 }, { 78,-35834 }, { 79,-35834 }, + { 80,-35834 }, { 81,-35834 }, { 82,-35834 }, { 83,-35834 }, { 84,-35834 }, + { 85,-35834 }, { 86,-35834 }, { 87,-35834 }, { 88,-35834 }, { 89,-35834 }, + { 90,-35834 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-35834 }, { 0, 0 }, { 97,-35834 }, { 98,-35834 }, { 99,-35834 }, + + { 100,-35834 }, { 101,-35834 }, { 102,-35834 }, { 103,-35834 }, { 104,-35834 }, + { 105,-35834 }, { 106,-35834 }, { 107,-35834 }, { 108,13626 }, { 109,-35834 }, + { 110,-35834 }, { 111,-35834 }, { 112,-35834 }, { 113,-35834 }, { 114,-35834 }, + { 115,-35834 }, { 116,-35834 }, { 117,-35834 }, { 118,-35834 }, { 119,-35834 }, + { 120,-35834 }, { 121,-35834 }, { 122,-35834 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-35834 }, { 128,-35834 }, { 129,-35834 }, + { 130,-35834 }, { 131,-35834 }, { 132,-35834 }, { 133,-35834 }, { 134,-35834 }, + { 135,-35834 }, { 136,-35834 }, { 137,-35834 }, { 138,-35834 }, { 139,-35834 }, + { 140,-35834 }, { 141,-35834 }, { 142,-35834 }, { 143,-35834 }, { 144,-35834 }, + { 145,-35834 }, { 146,-35834 }, { 147,-35834 }, { 148,-35834 }, { 149,-35834 }, + + { 150,-35834 }, { 151,-35834 }, { 152,-35834 }, { 153,-35834 }, { 154,-35834 }, + { 155,-35834 }, { 156,-35834 }, { 157,-35834 }, { 158,-35834 }, { 159,-35834 }, + { 160,-35834 }, { 161,-35834 }, { 162,-35834 }, { 163,-35834 }, { 164,-35834 }, + { 165,-35834 }, { 166,-35834 }, { 167,-35834 }, { 168,-35834 }, { 169,-35834 }, + { 170,-35834 }, { 171,-35834 }, { 172,-35834 }, { 173,-35834 }, { 174,-35834 }, + { 175,-35834 }, { 176,-35834 }, { 177,-35834 }, { 178,-35834 }, { 179,-35834 }, + { 180,-35834 }, { 181,-35834 }, { 182,-35834 }, { 183,-35834 }, { 184,-35834 }, + { 185,-35834 }, { 186,-35834 }, { 187,-35834 }, { 188,-35834 }, { 189,-35834 }, + { 190,-35834 }, { 191,-35834 }, { 192,-35834 }, { 193,-35834 }, { 194,-35834 }, + { 195,-35834 }, { 196,-35834 }, { 197,-35834 }, { 198,-35834 }, { 199,-35834 }, + + { 200,-35834 }, { 201,-35834 }, { 202,-35834 }, { 203,-35834 }, { 204,-35834 }, + { 205,-35834 }, { 206,-35834 }, { 207,-35834 }, { 208,-35834 }, { 209,-35834 }, + { 210,-35834 }, { 211,-35834 }, { 212,-35834 }, { 213,-35834 }, { 214,-35834 }, + { 215,-35834 }, { 216,-35834 }, { 217,-35834 }, { 218,-35834 }, { 219,-35834 }, + { 220,-35834 }, { 221,-35834 }, { 222,-35834 }, { 223,-35834 }, { 224,-35834 }, + { 225,-35834 }, { 226,-35834 }, { 227,-35834 }, { 228,-35834 }, { 229,-35834 }, + { 230,-35834 }, { 231,-35834 }, { 232,-35834 }, { 233,-35834 }, { 234,-35834 }, + { 235,-35834 }, { 236,-35834 }, { 237,-35834 }, { 238,-35834 }, { 239,-35834 }, + { 240,-35834 }, { 241,-35834 }, { 242,-35834 }, { 243,-35834 }, { 244,-35834 }, + { 245,-35834 }, { 246,-35834 }, { 247,-35834 }, { 248,-35834 }, { 249,-35834 }, + + { 250,-35834 }, { 251,-35834 }, { 252,-35834 }, { 253,-35834 }, { 254,-35834 }, + { 255,-35834 }, { 0, 131 }, { 0,56032 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-36091 }, { 49,-36091 }, { 50,-36091 }, { 51,-36091 }, { 52,-36091 }, + { 53,-36091 }, { 54,-36091 }, { 55,-36091 }, { 56,-36091 }, { 57,-36091 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,13626 }, { 66,-36091 }, { 67,-36091 }, + { 68,-36091 }, { 69,-36091 }, { 70,-36091 }, { 71,-36091 }, { 72,-36091 }, + { 73,-36091 }, { 74,-36091 }, { 75,-36091 }, { 76,-36091 }, { 77,-36091 }, + { 78,-36091 }, { 79,-36091 }, { 80,-36091 }, { 81,-36091 }, { 82,-36091 }, + { 83,-36091 }, { 84,-36091 }, { 85,-36091 }, { 86,-36091 }, { 87,-36091 }, + { 88,-36091 }, { 89,-36091 }, { 90,-36091 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 95,-36091 }, { 0, 0 }, { 97,13626 }, + { 98,-36091 }, { 99,-36091 }, { 100,-36091 }, { 101,-36091 }, { 102,-36091 }, + { 103,-36091 }, { 104,-36091 }, { 105,-36091 }, { 106,-36091 }, { 107,-36091 }, + { 108,-36091 }, { 109,-36091 }, { 110,-36091 }, { 111,-36091 }, { 112,-36091 }, + { 113,-36091 }, { 114,-36091 }, { 115,-36091 }, { 116,-36091 }, { 117,-36091 }, + { 118,-36091 }, { 119,-36091 }, { 120,-36091 }, { 121,-36091 }, { 122,-36091 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-36091 }, + { 128,-36091 }, { 129,-36091 }, { 130,-36091 }, { 131,-36091 }, { 132,-36091 }, + { 133,-36091 }, { 134,-36091 }, { 135,-36091 }, { 136,-36091 }, { 137,-36091 }, + { 138,-36091 }, { 139,-36091 }, { 140,-36091 }, { 141,-36091 }, { 142,-36091 }, + + { 143,-36091 }, { 144,-36091 }, { 145,-36091 }, { 146,-36091 }, { 147,-36091 }, + { 148,-36091 }, { 149,-36091 }, { 150,-36091 }, { 151,-36091 }, { 152,-36091 }, + { 153,-36091 }, { 154,-36091 }, { 155,-36091 }, { 156,-36091 }, { 157,-36091 }, + { 158,-36091 }, { 159,-36091 }, { 160,-36091 }, { 161,-36091 }, { 162,-36091 }, + { 163,-36091 }, { 164,-36091 }, { 165,-36091 }, { 166,-36091 }, { 167,-36091 }, + { 168,-36091 }, { 169,-36091 }, { 170,-36091 }, { 171,-36091 }, { 172,-36091 }, + { 173,-36091 }, { 174,-36091 }, { 175,-36091 }, { 176,-36091 }, { 177,-36091 }, + { 178,-36091 }, { 179,-36091 }, { 180,-36091 }, { 181,-36091 }, { 182,-36091 }, + { 183,-36091 }, { 184,-36091 }, { 185,-36091 }, { 186,-36091 }, { 187,-36091 }, + { 188,-36091 }, { 189,-36091 }, { 190,-36091 }, { 191,-36091 }, { 192,-36091 }, + + { 193,-36091 }, { 194,-36091 }, { 195,-36091 }, { 196,-36091 }, { 197,-36091 }, + { 198,-36091 }, { 199,-36091 }, { 200,-36091 }, { 201,-36091 }, { 202,-36091 }, + { 203,-36091 }, { 204,-36091 }, { 205,-36091 }, { 206,-36091 }, { 207,-36091 }, + { 208,-36091 }, { 209,-36091 }, { 210,-36091 }, { 211,-36091 }, { 212,-36091 }, + { 213,-36091 }, { 214,-36091 }, { 215,-36091 }, { 216,-36091 }, { 217,-36091 }, + { 218,-36091 }, { 219,-36091 }, { 220,-36091 }, { 221,-36091 }, { 222,-36091 }, + { 223,-36091 }, { 224,-36091 }, { 225,-36091 }, { 226,-36091 }, { 227,-36091 }, + { 228,-36091 }, { 229,-36091 }, { 230,-36091 }, { 231,-36091 }, { 232,-36091 }, + { 233,-36091 }, { 234,-36091 }, { 235,-36091 }, { 236,-36091 }, { 237,-36091 }, + { 238,-36091 }, { 239,-36091 }, { 240,-36091 }, { 241,-36091 }, { 242,-36091 }, + + { 243,-36091 }, { 244,-36091 }, { 245,-36091 }, { 246,-36091 }, { 247,-36091 }, + { 248,-36091 }, { 249,-36091 }, { 250,-36091 }, { 251,-36091 }, { 252,-36091 }, + { 253,-36091 }, { 254,-36091 }, { 255,-36091 }, { 0, 131 }, { 0,55775 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-36348 }, { 49,-36348 }, { 50,-36348 }, + { 51,-36348 }, { 52,-36348 }, { 53,-36348 }, { 54,-36348 }, { 55,-36348 }, + { 56,-36348 }, { 57,-36348 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-36348 }, + { 66,-36348 }, { 67,-36348 }, { 68,-36348 }, { 69,-36348 }, { 70,-36348 }, + { 71,-36348 }, { 72,-36348 }, { 73,-36348 }, { 74,-36348 }, { 75,-36348 }, + { 76,-36348 }, { 77,-36348 }, { 78,-36348 }, { 79,-36348 }, { 80,-36348 }, + { 81,-36348 }, { 82,-36348 }, { 83,-36348 }, { 84,13626 }, { 85,-36348 }, + + { 86,-36348 }, { 87,-36348 }, { 88,-36348 }, { 89,-36348 }, { 90,-36348 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-36348 }, + { 0, 0 }, { 97,-36348 }, { 98,-36348 }, { 99,-36348 }, { 100,-36348 }, + { 101,-36348 }, { 102,-36348 }, { 103,-36348 }, { 104,-36348 }, { 105,-36348 }, + { 106,-36348 }, { 107,-36348 }, { 108,-36348 }, { 109,-36348 }, { 110,-36348 }, + { 111,-36348 }, { 112,-36348 }, { 113,-36348 }, { 114,-36348 }, { 115,-36348 }, + { 116,13626 }, { 117,-36348 }, { 118,-36348 }, { 119,-36348 }, { 120,-36348 }, + { 121,-36348 }, { 122,-36348 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-36348 }, { 128,-36348 }, { 129,-36348 }, { 130,-36348 }, + { 131,-36348 }, { 132,-36348 }, { 133,-36348 }, { 134,-36348 }, { 135,-36348 }, + + { 136,-36348 }, { 137,-36348 }, { 138,-36348 }, { 139,-36348 }, { 140,-36348 }, + { 141,-36348 }, { 142,-36348 }, { 143,-36348 }, { 144,-36348 }, { 145,-36348 }, + { 146,-36348 }, { 147,-36348 }, { 148,-36348 }, { 149,-36348 }, { 150,-36348 }, + { 151,-36348 }, { 152,-36348 }, { 153,-36348 }, { 154,-36348 }, { 155,-36348 }, + { 156,-36348 }, { 157,-36348 }, { 158,-36348 }, { 159,-36348 }, { 160,-36348 }, + { 161,-36348 }, { 162,-36348 }, { 163,-36348 }, { 164,-36348 }, { 165,-36348 }, + { 166,-36348 }, { 167,-36348 }, { 168,-36348 }, { 169,-36348 }, { 170,-36348 }, + { 171,-36348 }, { 172,-36348 }, { 173,-36348 }, { 174,-36348 }, { 175,-36348 }, + { 176,-36348 }, { 177,-36348 }, { 178,-36348 }, { 179,-36348 }, { 180,-36348 }, + { 181,-36348 }, { 182,-36348 }, { 183,-36348 }, { 184,-36348 }, { 185,-36348 }, + + { 186,-36348 }, { 187,-36348 }, { 188,-36348 }, { 189,-36348 }, { 190,-36348 }, + { 191,-36348 }, { 192,-36348 }, { 193,-36348 }, { 194,-36348 }, { 195,-36348 }, + { 196,-36348 }, { 197,-36348 }, { 198,-36348 }, { 199,-36348 }, { 200,-36348 }, + { 201,-36348 }, { 202,-36348 }, { 203,-36348 }, { 204,-36348 }, { 205,-36348 }, + { 206,-36348 }, { 207,-36348 }, { 208,-36348 }, { 209,-36348 }, { 210,-36348 }, + { 211,-36348 }, { 212,-36348 }, { 213,-36348 }, { 214,-36348 }, { 215,-36348 }, + { 216,-36348 }, { 217,-36348 }, { 218,-36348 }, { 219,-36348 }, { 220,-36348 }, + { 221,-36348 }, { 222,-36348 }, { 223,-36348 }, { 224,-36348 }, { 225,-36348 }, + { 226,-36348 }, { 227,-36348 }, { 228,-36348 }, { 229,-36348 }, { 230,-36348 }, + { 231,-36348 }, { 232,-36348 }, { 233,-36348 }, { 234,-36348 }, { 235,-36348 }, + + { 236,-36348 }, { 237,-36348 }, { 238,-36348 }, { 239,-36348 }, { 240,-36348 }, + { 241,-36348 }, { 242,-36348 }, { 243,-36348 }, { 244,-36348 }, { 245,-36348 }, + { 246,-36348 }, { 247,-36348 }, { 248,-36348 }, { 249,-36348 }, { 250,-36348 }, + { 251,-36348 }, { 252,-36348 }, { 253,-36348 }, { 254,-36348 }, { 255,-36348 }, + { 0, 131 }, { 0,55518 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-36605 }, + { 49,-36605 }, { 50,-36605 }, { 51,-36605 }, { 52,-36605 }, { 53,-36605 }, + { 54,-36605 }, { 55,-36605 }, { 56,-36605 }, { 57,-36605 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,13626 }, { 66,-36605 }, { 67,-36605 }, { 68,-36605 }, + { 69,-36605 }, { 70,-36605 }, { 71,-36605 }, { 72,-36605 }, { 73,-36605 }, + { 74,-36605 }, { 75,-36605 }, { 76,-36605 }, { 77,-36605 }, { 78,-36605 }, + + { 79,-36605 }, { 80,-36605 }, { 81,-36605 }, { 82,-36605 }, { 83,-36605 }, + { 84,-36605 }, { 85,-36605 }, { 86,-36605 }, { 87,-36605 }, { 88,-36605 }, + { 89,-36605 }, { 90,-36605 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-36605 }, { 0, 0 }, { 97,13626 }, { 98,-36605 }, + { 99,-36605 }, { 100,-36605 }, { 101,-36605 }, { 102,-36605 }, { 103,-36605 }, + { 104,-36605 }, { 105,-36605 }, { 106,-36605 }, { 107,-36605 }, { 108,-36605 }, + { 109,-36605 }, { 110,-36605 }, { 111,-36605 }, { 112,-36605 }, { 113,-36605 }, + { 114,-36605 }, { 115,-36605 }, { 116,-36605 }, { 117,-36605 }, { 118,-36605 }, + { 119,-36605 }, { 120,-36605 }, { 121,-36605 }, { 122,-36605 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-36605 }, { 128,-36605 }, + + { 129,-36605 }, { 130,-36605 }, { 131,-36605 }, { 132,-36605 }, { 133,-36605 }, + { 134,-36605 }, { 135,-36605 }, { 136,-36605 }, { 137,-36605 }, { 138,-36605 }, + { 139,-36605 }, { 140,-36605 }, { 141,-36605 }, { 142,-36605 }, { 143,-36605 }, + { 144,-36605 }, { 145,-36605 }, { 146,-36605 }, { 147,-36605 }, { 148,-36605 }, + { 149,-36605 }, { 150,-36605 }, { 151,-36605 }, { 152,-36605 }, { 153,-36605 }, + { 154,-36605 }, { 155,-36605 }, { 156,-36605 }, { 157,-36605 }, { 158,-36605 }, + { 159,-36605 }, { 160,-36605 }, { 161,-36605 }, { 162,-36605 }, { 163,-36605 }, + { 164,-36605 }, { 165,-36605 }, { 166,-36605 }, { 167,-36605 }, { 168,-36605 }, + { 169,-36605 }, { 170,-36605 }, { 171,-36605 }, { 172,-36605 }, { 173,-36605 }, + { 174,-36605 }, { 175,-36605 }, { 176,-36605 }, { 177,-36605 }, { 178,-36605 }, + + { 179,-36605 }, { 180,-36605 }, { 181,-36605 }, { 182,-36605 }, { 183,-36605 }, + { 184,-36605 }, { 185,-36605 }, { 186,-36605 }, { 187,-36605 }, { 188,-36605 }, + { 189,-36605 }, { 190,-36605 }, { 191,-36605 }, { 192,-36605 }, { 193,-36605 }, + { 194,-36605 }, { 195,-36605 }, { 196,-36605 }, { 197,-36605 }, { 198,-36605 }, + { 199,-36605 }, { 200,-36605 }, { 201,-36605 }, { 202,-36605 }, { 203,-36605 }, + { 204,-36605 }, { 205,-36605 }, { 206,-36605 }, { 207,-36605 }, { 208,-36605 }, + { 209,-36605 }, { 210,-36605 }, { 211,-36605 }, { 212,-36605 }, { 213,-36605 }, + { 214,-36605 }, { 215,-36605 }, { 216,-36605 }, { 217,-36605 }, { 218,-36605 }, + { 219,-36605 }, { 220,-36605 }, { 221,-36605 }, { 222,-36605 }, { 223,-36605 }, + { 224,-36605 }, { 225,-36605 }, { 226,-36605 }, { 227,-36605 }, { 228,-36605 }, + + { 229,-36605 }, { 230,-36605 }, { 231,-36605 }, { 232,-36605 }, { 233,-36605 }, + { 234,-36605 }, { 235,-36605 }, { 236,-36605 }, { 237,-36605 }, { 238,-36605 }, + { 239,-36605 }, { 240,-36605 }, { 241,-36605 }, { 242,-36605 }, { 243,-36605 }, + { 244,-36605 }, { 245,-36605 }, { 246,-36605 }, { 247,-36605 }, { 248,-36605 }, + { 249,-36605 }, { 250,-36605 }, { 251,-36605 }, { 252,-36605 }, { 253,-36605 }, + { 254,-36605 }, { 255,-36605 }, { 0, 52 }, { 0,55261 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-36862 }, { 49,-36862 }, { 50,-36862 }, { 51,-36862 }, + { 52,-36862 }, { 53,-36862 }, { 54,-36862 }, { 55,-36862 }, { 56,-36862 }, + { 57,-36862 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-36862 }, { 66,-36862 }, + { 67,-36862 }, { 68,-36862 }, { 69,-36862 }, { 70,-36862 }, { 71,-36862 }, + + { 72,-36862 }, { 73,-36862 }, { 74,-36862 }, { 75,-36862 }, { 76,-36862 }, + { 77,-36862 }, { 78,-36862 }, { 79,-36862 }, { 80,-36862 }, { 81,-36862 }, + { 82,-36862 }, { 83,-36862 }, { 84,-36862 }, { 85,-36862 }, { 86,-36862 }, + { 87,-36862 }, { 88,-36862 }, { 89,-36862 }, { 90,-36862 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-36862 }, { 0, 0 }, + { 97,-36862 }, { 98,-36862 }, { 99,-36862 }, { 100,-36862 }, { 101,-36862 }, + { 102,-36862 }, { 103,-36862 }, { 104,-36862 }, { 105,-36862 }, { 106,-36862 }, + { 107,-36862 }, { 108,-36862 }, { 109,-36862 }, { 110,-36862 }, { 111,-36862 }, + { 112,-36862 }, { 113,-36862 }, { 114,-36862 }, { 115,-36862 }, { 116,-36862 }, + { 117,-36862 }, { 118,-36862 }, { 119,-36862 }, { 120,-36862 }, { 121,-36862 }, + + { 122,-36862 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-36862 }, { 128,-36862 }, { 129,-36862 }, { 130,-36862 }, { 131,-36862 }, + { 132,-36862 }, { 133,-36862 }, { 134,-36862 }, { 135,-36862 }, { 136,-36862 }, + { 137,-36862 }, { 138,-36862 }, { 139,-36862 }, { 140,-36862 }, { 141,-36862 }, + { 142,-36862 }, { 143,-36862 }, { 144,-36862 }, { 145,-36862 }, { 146,-36862 }, + { 147,-36862 }, { 148,-36862 }, { 149,-36862 }, { 150,-36862 }, { 151,-36862 }, + { 152,-36862 }, { 153,-36862 }, { 154,-36862 }, { 155,-36862 }, { 156,-36862 }, + { 157,-36862 }, { 158,-36862 }, { 159,-36862 }, { 160,-36862 }, { 161,-36862 }, + { 162,-36862 }, { 163,-36862 }, { 164,-36862 }, { 165,-36862 }, { 166,-36862 }, + { 167,-36862 }, { 168,-36862 }, { 169,-36862 }, { 170,-36862 }, { 171,-36862 }, + + { 172,-36862 }, { 173,-36862 }, { 174,-36862 }, { 175,-36862 }, { 176,-36862 }, + { 177,-36862 }, { 178,-36862 }, { 179,-36862 }, { 180,-36862 }, { 181,-36862 }, + { 182,-36862 }, { 183,-36862 }, { 184,-36862 }, { 185,-36862 }, { 186,-36862 }, + { 187,-36862 }, { 188,-36862 }, { 189,-36862 }, { 190,-36862 }, { 191,-36862 }, + { 192,-36862 }, { 193,-36862 }, { 194,-36862 }, { 195,-36862 }, { 196,-36862 }, + { 197,-36862 }, { 198,-36862 }, { 199,-36862 }, { 200,-36862 }, { 201,-36862 }, + { 202,-36862 }, { 203,-36862 }, { 204,-36862 }, { 205,-36862 }, { 206,-36862 }, + { 207,-36862 }, { 208,-36862 }, { 209,-36862 }, { 210,-36862 }, { 211,-36862 }, + { 212,-36862 }, { 213,-36862 }, { 214,-36862 }, { 215,-36862 }, { 216,-36862 }, + { 217,-36862 }, { 218,-36862 }, { 219,-36862 }, { 220,-36862 }, { 221,-36862 }, + + { 222,-36862 }, { 223,-36862 }, { 224,-36862 }, { 225,-36862 }, { 226,-36862 }, + { 227,-36862 }, { 228,-36862 }, { 229,-36862 }, { 230,-36862 }, { 231,-36862 }, + { 232,-36862 }, { 233,-36862 }, { 234,-36862 }, { 235,-36862 }, { 236,-36862 }, + { 237,-36862 }, { 238,-36862 }, { 239,-36862 }, { 240,-36862 }, { 241,-36862 }, + { 242,-36862 }, { 243,-36862 }, { 244,-36862 }, { 245,-36862 }, { 246,-36862 }, + { 247,-36862 }, { 248,-36862 }, { 249,-36862 }, { 250,-36862 }, { 251,-36862 }, + { 252,-36862 }, { 253,-36862 }, { 254,-36862 }, { 255,-36862 }, { 0, 131 }, + { 0,55004 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-37119 }, { 49,-37119 }, + { 50,-37119 }, { 51,-37119 }, { 52,-37119 }, { 53,-37119 }, { 54,-37119 }, + { 55,-37119 }, { 56,-37119 }, { 57,-37119 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 65,-37119 }, { 66,-37119 }, { 67,-37119 }, { 68,-37119 }, { 69,13369 }, + { 70,-37119 }, { 71,-37119 }, { 72,-37119 }, { 73,-37119 }, { 74,-37119 }, + { 75,-37119 }, { 76,-37119 }, { 77,-37119 }, { 78,-37119 }, { 79,-37119 }, + { 80,-37119 }, { 81,-37119 }, { 82,-37119 }, { 83,-37119 }, { 84,-37119 }, + { 85,-37119 }, { 86,-37119 }, { 87,-37119 }, { 88,-37119 }, { 89,-37119 }, + { 90,-37119 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-37119 }, { 0, 0 }, { 97,-37119 }, { 98,-37119 }, { 99,-37119 }, + { 100,-37119 }, { 101,13369 }, { 102,-37119 }, { 103,-37119 }, { 104,-37119 }, + { 105,-37119 }, { 106,-37119 }, { 107,-37119 }, { 108,-37119 }, { 109,-37119 }, + { 110,-37119 }, { 111,-37119 }, { 112,-37119 }, { 113,-37119 }, { 114,-37119 }, + + { 115,-37119 }, { 116,-37119 }, { 117,-37119 }, { 118,-37119 }, { 119,-37119 }, + { 120,-37119 }, { 121,-37119 }, { 122,-37119 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-37119 }, { 128,-37119 }, { 129,-37119 }, + { 130,-37119 }, { 131,-37119 }, { 132,-37119 }, { 133,-37119 }, { 134,-37119 }, + { 135,-37119 }, { 136,-37119 }, { 137,-37119 }, { 138,-37119 }, { 139,-37119 }, + { 140,-37119 }, { 141,-37119 }, { 142,-37119 }, { 143,-37119 }, { 144,-37119 }, + { 145,-37119 }, { 146,-37119 }, { 147,-37119 }, { 148,-37119 }, { 149,-37119 }, + { 150,-37119 }, { 151,-37119 }, { 152,-37119 }, { 153,-37119 }, { 154,-37119 }, + { 155,-37119 }, { 156,-37119 }, { 157,-37119 }, { 158,-37119 }, { 159,-37119 }, + { 160,-37119 }, { 161,-37119 }, { 162,-37119 }, { 163,-37119 }, { 164,-37119 }, + + { 165,-37119 }, { 166,-37119 }, { 167,-37119 }, { 168,-37119 }, { 169,-37119 }, + { 170,-37119 }, { 171,-37119 }, { 172,-37119 }, { 173,-37119 }, { 174,-37119 }, + { 175,-37119 }, { 176,-37119 }, { 177,-37119 }, { 178,-37119 }, { 179,-37119 }, + { 180,-37119 }, { 181,-37119 }, { 182,-37119 }, { 183,-37119 }, { 184,-37119 }, + { 185,-37119 }, { 186,-37119 }, { 187,-37119 }, { 188,-37119 }, { 189,-37119 }, + { 190,-37119 }, { 191,-37119 }, { 192,-37119 }, { 193,-37119 }, { 194,-37119 }, + { 195,-37119 }, { 196,-37119 }, { 197,-37119 }, { 198,-37119 }, { 199,-37119 }, + { 200,-37119 }, { 201,-37119 }, { 202,-37119 }, { 203,-37119 }, { 204,-37119 }, + { 205,-37119 }, { 206,-37119 }, { 207,-37119 }, { 208,-37119 }, { 209,-37119 }, + { 210,-37119 }, { 211,-37119 }, { 212,-37119 }, { 213,-37119 }, { 214,-37119 }, + + { 215,-37119 }, { 216,-37119 }, { 217,-37119 }, { 218,-37119 }, { 219,-37119 }, + { 220,-37119 }, { 221,-37119 }, { 222,-37119 }, { 223,-37119 }, { 224,-37119 }, + { 225,-37119 }, { 226,-37119 }, { 227,-37119 }, { 228,-37119 }, { 229,-37119 }, + { 230,-37119 }, { 231,-37119 }, { 232,-37119 }, { 233,-37119 }, { 234,-37119 }, + { 235,-37119 }, { 236,-37119 }, { 237,-37119 }, { 238,-37119 }, { 239,-37119 }, + { 240,-37119 }, { 241,-37119 }, { 242,-37119 }, { 243,-37119 }, { 244,-37119 }, + { 245,-37119 }, { 246,-37119 }, { 247,-37119 }, { 248,-37119 }, { 249,-37119 }, + { 250,-37119 }, { 251,-37119 }, { 252,-37119 }, { 253,-37119 }, { 254,-37119 }, + { 255,-37119 }, { 0, 131 }, { 0,54747 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-37376 }, { 49,-37376 }, { 50,-37376 }, { 51,-37376 }, { 52,-37376 }, + { 53,-37376 }, { 54,-37376 }, { 55,-37376 }, { 56,-37376 }, { 57,-37376 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-37376 }, { 66,-37376 }, { 67,-37376 }, + { 68,-37376 }, { 69,-37376 }, { 70,-37376 }, { 71,-37376 }, { 72,-37376 }, + { 73,-37376 }, { 74,-37376 }, { 75,-37376 }, { 76,-37376 }, { 77,-37376 }, + { 78,-37376 }, { 79,-37376 }, { 80,-37376 }, { 81,-37376 }, { 82,-37376 }, + { 83,-37376 }, { 84,-37376 }, { 85,13369 }, { 86,-37376 }, { 87,-37376 }, + { 88,-37376 }, { 89,-37376 }, { 90,-37376 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-37376 }, { 0, 0 }, { 97,-37376 }, + { 98,-37376 }, { 99,-37376 }, { 100,-37376 }, { 101,-37376 }, { 102,-37376 }, + { 103,-37376 }, { 104,-37376 }, { 105,-37376 }, { 106,-37376 }, { 107,-37376 }, + + { 108,-37376 }, { 109,-37376 }, { 110,-37376 }, { 111,-37376 }, { 112,-37376 }, + { 113,-37376 }, { 114,-37376 }, { 115,-37376 }, { 116,-37376 }, { 117,13369 }, + { 118,-37376 }, { 119,-37376 }, { 120,-37376 }, { 121,-37376 }, { 122,-37376 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-37376 }, + { 128,-37376 }, { 129,-37376 }, { 130,-37376 }, { 131,-37376 }, { 132,-37376 }, + { 133,-37376 }, { 134,-37376 }, { 135,-37376 }, { 136,-37376 }, { 137,-37376 }, + { 138,-37376 }, { 139,-37376 }, { 140,-37376 }, { 141,-37376 }, { 142,-37376 }, + { 143,-37376 }, { 144,-37376 }, { 145,-37376 }, { 146,-37376 }, { 147,-37376 }, + { 148,-37376 }, { 149,-37376 }, { 150,-37376 }, { 151,-37376 }, { 152,-37376 }, + { 153,-37376 }, { 154,-37376 }, { 155,-37376 }, { 156,-37376 }, { 157,-37376 }, + + { 158,-37376 }, { 159,-37376 }, { 160,-37376 }, { 161,-37376 }, { 162,-37376 }, + { 163,-37376 }, { 164,-37376 }, { 165,-37376 }, { 166,-37376 }, { 167,-37376 }, + { 168,-37376 }, { 169,-37376 }, { 170,-37376 }, { 171,-37376 }, { 172,-37376 }, + { 173,-37376 }, { 174,-37376 }, { 175,-37376 }, { 176,-37376 }, { 177,-37376 }, + { 178,-37376 }, { 179,-37376 }, { 180,-37376 }, { 181,-37376 }, { 182,-37376 }, + { 183,-37376 }, { 184,-37376 }, { 185,-37376 }, { 186,-37376 }, { 187,-37376 }, + { 188,-37376 }, { 189,-37376 }, { 190,-37376 }, { 191,-37376 }, { 192,-37376 }, + { 193,-37376 }, { 194,-37376 }, { 195,-37376 }, { 196,-37376 }, { 197,-37376 }, + { 198,-37376 }, { 199,-37376 }, { 200,-37376 }, { 201,-37376 }, { 202,-37376 }, + { 203,-37376 }, { 204,-37376 }, { 205,-37376 }, { 206,-37376 }, { 207,-37376 }, + + { 208,-37376 }, { 209,-37376 }, { 210,-37376 }, { 211,-37376 }, { 212,-37376 }, + { 213,-37376 }, { 214,-37376 }, { 215,-37376 }, { 216,-37376 }, { 217,-37376 }, + { 218,-37376 }, { 219,-37376 }, { 220,-37376 }, { 221,-37376 }, { 222,-37376 }, + { 223,-37376 }, { 224,-37376 }, { 225,-37376 }, { 226,-37376 }, { 227,-37376 }, + { 228,-37376 }, { 229,-37376 }, { 230,-37376 }, { 231,-37376 }, { 232,-37376 }, + { 233,-37376 }, { 234,-37376 }, { 235,-37376 }, { 236,-37376 }, { 237,-37376 }, + { 238,-37376 }, { 239,-37376 }, { 240,-37376 }, { 241,-37376 }, { 242,-37376 }, + { 243,-37376 }, { 244,-37376 }, { 245,-37376 }, { 246,-37376 }, { 247,-37376 }, + { 248,-37376 }, { 249,-37376 }, { 250,-37376 }, { 251,-37376 }, { 252,-37376 }, + { 253,-37376 }, { 254,-37376 }, { 255,-37376 }, { 0, 131 }, { 0,54490 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-37633 }, { 49,-37633 }, { 50,-37633 }, + + { 51,-37633 }, { 52,-37633 }, { 53,-37633 }, { 54,-37633 }, { 55,-37633 }, + { 56,-37633 }, { 57,-37633 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,13369 }, + { 66,-37633 }, { 67,-37633 }, { 68,-37633 }, { 69,13626 }, { 70,-37633 }, + { 71,-37633 }, { 72,-37633 }, { 73,-37633 }, { 74,-37633 }, { 75,-37633 }, + { 76,-37633 }, { 77,-37633 }, { 78,-37633 }, { 79,-37633 }, { 80,-37633 }, + { 81,-37633 }, { 82,-37633 }, { 83,-37633 }, { 84,-37633 }, { 85,-37633 }, + { 86,-37633 }, { 87,-37633 }, { 88,-37633 }, { 89,-37633 }, { 90,-37633 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-37633 }, + { 0, 0 }, { 97,13369 }, { 98,-37633 }, { 99,-37633 }, { 100,-37633 }, + + { 101,13626 }, { 102,-37633 }, { 103,-37633 }, { 104,-37633 }, { 105,-37633 }, + { 106,-37633 }, { 107,-37633 }, { 108,-37633 }, { 109,-37633 }, { 110,-37633 }, + { 111,-37633 }, { 112,-37633 }, { 113,-37633 }, { 114,-37633 }, { 115,-37633 }, + { 116,-37633 }, { 117,-37633 }, { 118,-37633 }, { 119,-37633 }, { 120,-37633 }, + { 121,-37633 }, { 122,-37633 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-37633 }, { 128,-37633 }, { 129,-37633 }, { 130,-37633 }, + { 131,-37633 }, { 132,-37633 }, { 133,-37633 }, { 134,-37633 }, { 135,-37633 }, + { 136,-37633 }, { 137,-37633 }, { 138,-37633 }, { 139,-37633 }, { 140,-37633 }, + { 141,-37633 }, { 142,-37633 }, { 143,-37633 }, { 144,-37633 }, { 145,-37633 }, + { 146,-37633 }, { 147,-37633 }, { 148,-37633 }, { 149,-37633 }, { 150,-37633 }, + + { 151,-37633 }, { 152,-37633 }, { 153,-37633 }, { 154,-37633 }, { 155,-37633 }, + { 156,-37633 }, { 157,-37633 }, { 158,-37633 }, { 159,-37633 }, { 160,-37633 }, + { 161,-37633 }, { 162,-37633 }, { 163,-37633 }, { 164,-37633 }, { 165,-37633 }, + { 166,-37633 }, { 167,-37633 }, { 168,-37633 }, { 169,-37633 }, { 170,-37633 }, + { 171,-37633 }, { 172,-37633 }, { 173,-37633 }, { 174,-37633 }, { 175,-37633 }, + { 176,-37633 }, { 177,-37633 }, { 178,-37633 }, { 179,-37633 }, { 180,-37633 }, + { 181,-37633 }, { 182,-37633 }, { 183,-37633 }, { 184,-37633 }, { 185,-37633 }, + { 186,-37633 }, { 187,-37633 }, { 188,-37633 }, { 189,-37633 }, { 190,-37633 }, + { 191,-37633 }, { 192,-37633 }, { 193,-37633 }, { 194,-37633 }, { 195,-37633 }, + { 196,-37633 }, { 197,-37633 }, { 198,-37633 }, { 199,-37633 }, { 200,-37633 }, + + { 201,-37633 }, { 202,-37633 }, { 203,-37633 }, { 204,-37633 }, { 205,-37633 }, + { 206,-37633 }, { 207,-37633 }, { 208,-37633 }, { 209,-37633 }, { 210,-37633 }, + { 211,-37633 }, { 212,-37633 }, { 213,-37633 }, { 214,-37633 }, { 215,-37633 }, + { 216,-37633 }, { 217,-37633 }, { 218,-37633 }, { 219,-37633 }, { 220,-37633 }, + { 221,-37633 }, { 222,-37633 }, { 223,-37633 }, { 224,-37633 }, { 225,-37633 }, + { 226,-37633 }, { 227,-37633 }, { 228,-37633 }, { 229,-37633 }, { 230,-37633 }, + { 231,-37633 }, { 232,-37633 }, { 233,-37633 }, { 234,-37633 }, { 235,-37633 }, + { 236,-37633 }, { 237,-37633 }, { 238,-37633 }, { 239,-37633 }, { 240,-37633 }, + { 241,-37633 }, { 242,-37633 }, { 243,-37633 }, { 244,-37633 }, { 245,-37633 }, + { 246,-37633 }, { 247,-37633 }, { 248,-37633 }, { 249,-37633 }, { 250,-37633 }, + + { 251,-37633 }, { 252,-37633 }, { 253,-37633 }, { 254,-37633 }, { 255,-37633 }, + { 0, 131 }, { 0,54233 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-37890 }, + { 49,-37890 }, { 50,-37890 }, { 51,-37890 }, { 52,-37890 }, { 53,-37890 }, + { 54,-37890 }, { 55,-37890 }, { 56,-37890 }, { 57,-37890 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-37890 }, { 66,-37890 }, { 67,-37890 }, { 68,-37890 }, + { 69,-37890 }, { 70,-37890 }, { 71,-37890 }, { 72,-37890 }, { 73,-37890 }, + { 74,-37890 }, { 75,-37890 }, { 76,-37890 }, { 77,-37890 }, { 78,-37890 }, + { 79,-37890 }, { 80,-37890 }, { 81,-37890 }, { 82,13626 }, { 83,-37890 }, + { 84,-37890 }, { 85,-37890 }, { 86,-37890 }, { 87,-37890 }, { 88,-37890 }, + { 89,-37890 }, { 90,-37890 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 95,-37890 }, { 0, 0 }, { 97,-37890 }, { 98,-37890 }, + { 99,-37890 }, { 100,-37890 }, { 101,-37890 }, { 102,-37890 }, { 103,-37890 }, + { 104,-37890 }, { 105,-37890 }, { 106,-37890 }, { 107,-37890 }, { 108,-37890 }, + { 109,-37890 }, { 110,-37890 }, { 111,-37890 }, { 112,-37890 }, { 113,-37890 }, + { 114,13626 }, { 115,-37890 }, { 116,-37890 }, { 117,-37890 }, { 118,-37890 }, + { 119,-37890 }, { 120,-37890 }, { 121,-37890 }, { 122,-37890 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-37890 }, { 128,-37890 }, + { 129,-37890 }, { 130,-37890 }, { 131,-37890 }, { 132,-37890 }, { 133,-37890 }, + { 134,-37890 }, { 135,-37890 }, { 136,-37890 }, { 137,-37890 }, { 138,-37890 }, + { 139,-37890 }, { 140,-37890 }, { 141,-37890 }, { 142,-37890 }, { 143,-37890 }, + + { 144,-37890 }, { 145,-37890 }, { 146,-37890 }, { 147,-37890 }, { 148,-37890 }, + { 149,-37890 }, { 150,-37890 }, { 151,-37890 }, { 152,-37890 }, { 153,-37890 }, + { 154,-37890 }, { 155,-37890 }, { 156,-37890 }, { 157,-37890 }, { 158,-37890 }, + { 159,-37890 }, { 160,-37890 }, { 161,-37890 }, { 162,-37890 }, { 163,-37890 }, + { 164,-37890 }, { 165,-37890 }, { 166,-37890 }, { 167,-37890 }, { 168,-37890 }, + { 169,-37890 }, { 170,-37890 }, { 171,-37890 }, { 172,-37890 }, { 173,-37890 }, + { 174,-37890 }, { 175,-37890 }, { 176,-37890 }, { 177,-37890 }, { 178,-37890 }, + { 179,-37890 }, { 180,-37890 }, { 181,-37890 }, { 182,-37890 }, { 183,-37890 }, + { 184,-37890 }, { 185,-37890 }, { 186,-37890 }, { 187,-37890 }, { 188,-37890 }, + { 189,-37890 }, { 190,-37890 }, { 191,-37890 }, { 192,-37890 }, { 193,-37890 }, + + { 194,-37890 }, { 195,-37890 }, { 196,-37890 }, { 197,-37890 }, { 198,-37890 }, + { 199,-37890 }, { 200,-37890 }, { 201,-37890 }, { 202,-37890 }, { 203,-37890 }, + { 204,-37890 }, { 205,-37890 }, { 206,-37890 }, { 207,-37890 }, { 208,-37890 }, + { 209,-37890 }, { 210,-37890 }, { 211,-37890 }, { 212,-37890 }, { 213,-37890 }, + { 214,-37890 }, { 215,-37890 }, { 216,-37890 }, { 217,-37890 }, { 218,-37890 }, + { 219,-37890 }, { 220,-37890 }, { 221,-37890 }, { 222,-37890 }, { 223,-37890 }, + { 224,-37890 }, { 225,-37890 }, { 226,-37890 }, { 227,-37890 }, { 228,-37890 }, + { 229,-37890 }, { 230,-37890 }, { 231,-37890 }, { 232,-37890 }, { 233,-37890 }, + { 234,-37890 }, { 235,-37890 }, { 236,-37890 }, { 237,-37890 }, { 238,-37890 }, + { 239,-37890 }, { 240,-37890 }, { 241,-37890 }, { 242,-37890 }, { 243,-37890 }, + + { 244,-37890 }, { 245,-37890 }, { 246,-37890 }, { 247,-37890 }, { 248,-37890 }, + { 249,-37890 }, { 250,-37890 }, { 251,-37890 }, { 252,-37890 }, { 253,-37890 }, + { 254,-37890 }, { 255,-37890 }, { 0, 131 }, { 0,53976 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-38147 }, { 49,-38147 }, { 50,-38147 }, { 51,-38147 }, + { 52,-38147 }, { 53,-38147 }, { 54,-38147 }, { 55,-38147 }, { 56,-38147 }, + { 57,-38147 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-38147 }, { 66,-38147 }, + { 67,-38147 }, { 68,-38147 }, { 69,-38147 }, { 70,-38147 }, { 71,-38147 }, + { 72,-38147 }, { 73,-38147 }, { 74,-38147 }, { 75,-38147 }, { 76,-38147 }, + { 77,-38147 }, { 78,-38147 }, { 79,-38147 }, { 80,-38147 }, { 81,-38147 }, + { 82,-38147 }, { 83,-38147 }, { 84,13626 }, { 85,-38147 }, { 86,-38147 }, + + { 87,-38147 }, { 88,-38147 }, { 89,-38147 }, { 90,-38147 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-38147 }, { 0, 0 }, + { 97,-38147 }, { 98,-38147 }, { 99,-38147 }, { 100,-38147 }, { 101,-38147 }, + { 102,-38147 }, { 103,-38147 }, { 104,-38147 }, { 105,-38147 }, { 106,-38147 }, + { 107,-38147 }, { 108,-38147 }, { 109,-38147 }, { 110,-38147 }, { 111,-38147 }, + { 112,-38147 }, { 113,-38147 }, { 114,-38147 }, { 115,-38147 }, { 116,13626 }, + { 117,-38147 }, { 118,-38147 }, { 119,-38147 }, { 120,-38147 }, { 121,-38147 }, + { 122,-38147 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-38147 }, { 128,-38147 }, { 129,-38147 }, { 130,-38147 }, { 131,-38147 }, + { 132,-38147 }, { 133,-38147 }, { 134,-38147 }, { 135,-38147 }, { 136,-38147 }, + + { 137,-38147 }, { 138,-38147 }, { 139,-38147 }, { 140,-38147 }, { 141,-38147 }, + { 142,-38147 }, { 143,-38147 }, { 144,-38147 }, { 145,-38147 }, { 146,-38147 }, + { 147,-38147 }, { 148,-38147 }, { 149,-38147 }, { 150,-38147 }, { 151,-38147 }, + { 152,-38147 }, { 153,-38147 }, { 154,-38147 }, { 155,-38147 }, { 156,-38147 }, + { 157,-38147 }, { 158,-38147 }, { 159,-38147 }, { 160,-38147 }, { 161,-38147 }, + { 162,-38147 }, { 163,-38147 }, { 164,-38147 }, { 165,-38147 }, { 166,-38147 }, + { 167,-38147 }, { 168,-38147 }, { 169,-38147 }, { 170,-38147 }, { 171,-38147 }, + { 172,-38147 }, { 173,-38147 }, { 174,-38147 }, { 175,-38147 }, { 176,-38147 }, + { 177,-38147 }, { 178,-38147 }, { 179,-38147 }, { 180,-38147 }, { 181,-38147 }, + { 182,-38147 }, { 183,-38147 }, { 184,-38147 }, { 185,-38147 }, { 186,-38147 }, + + { 187,-38147 }, { 188,-38147 }, { 189,-38147 }, { 190,-38147 }, { 191,-38147 }, + { 192,-38147 }, { 193,-38147 }, { 194,-38147 }, { 195,-38147 }, { 196,-38147 }, + { 197,-38147 }, { 198,-38147 }, { 199,-38147 }, { 200,-38147 }, { 201,-38147 }, + { 202,-38147 }, { 203,-38147 }, { 204,-38147 }, { 205,-38147 }, { 206,-38147 }, + { 207,-38147 }, { 208,-38147 }, { 209,-38147 }, { 210,-38147 }, { 211,-38147 }, + { 212,-38147 }, { 213,-38147 }, { 214,-38147 }, { 215,-38147 }, { 216,-38147 }, + { 217,-38147 }, { 218,-38147 }, { 219,-38147 }, { 220,-38147 }, { 221,-38147 }, + { 222,-38147 }, { 223,-38147 }, { 224,-38147 }, { 225,-38147 }, { 226,-38147 }, + { 227,-38147 }, { 228,-38147 }, { 229,-38147 }, { 230,-38147 }, { 231,-38147 }, + { 232,-38147 }, { 233,-38147 }, { 234,-38147 }, { 235,-38147 }, { 236,-38147 }, + + { 237,-38147 }, { 238,-38147 }, { 239,-38147 }, { 240,-38147 }, { 241,-38147 }, + { 242,-38147 }, { 243,-38147 }, { 244,-38147 }, { 245,-38147 }, { 246,-38147 }, + { 247,-38147 }, { 248,-38147 }, { 249,-38147 }, { 250,-38147 }, { 251,-38147 }, + { 252,-38147 }, { 253,-38147 }, { 254,-38147 }, { 255,-38147 }, { 0, 76 }, + { 0,53719 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-38404 }, { 49,-38404 }, + { 50,-38404 }, { 51,-38404 }, { 52,-38404 }, { 53,-38404 }, { 54,-38404 }, + { 55,-38404 }, { 56,-38404 }, { 57,-38404 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-38404 }, { 66,-38404 }, { 67,-38404 }, { 68,-38404 }, { 69,-38404 }, + { 70,-38404 }, { 71,-38404 }, { 72,-38404 }, { 73,-38404 }, { 74,-38404 }, + { 75,-38404 }, { 76,-38404 }, { 77,-38404 }, { 78,-38404 }, { 79,-38404 }, + + { 80,-38404 }, { 81,-38404 }, { 82,-38404 }, { 83,-38404 }, { 84,-38404 }, + { 85,-38404 }, { 86,-38404 }, { 87,-38404 }, { 88,-38404 }, { 89,-38404 }, + { 90,-38404 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-38404 }, { 0, 0 }, { 97,-38404 }, { 98,-38404 }, { 99,-38404 }, + { 100,-38404 }, { 101,-38404 }, { 102,-38404 }, { 103,-38404 }, { 104,-38404 }, + { 105,-38404 }, { 106,-38404 }, { 107,-38404 }, { 108,-38404 }, { 109,-38404 }, + { 110,-38404 }, { 111,-38404 }, { 112,-38404 }, { 113,-38404 }, { 114,-38404 }, + { 115,-38404 }, { 116,-38404 }, { 117,-38404 }, { 118,-38404 }, { 119,-38404 }, + { 120,-38404 }, { 121,-38404 }, { 122,-38404 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-38404 }, { 128,-38404 }, { 129,-38404 }, + + { 130,-38404 }, { 131,-38404 }, { 132,-38404 }, { 133,-38404 }, { 134,-38404 }, + { 135,-38404 }, { 136,-38404 }, { 137,-38404 }, { 138,-38404 }, { 139,-38404 }, + { 140,-38404 }, { 141,-38404 }, { 142,-38404 }, { 143,-38404 }, { 144,-38404 }, + { 145,-38404 }, { 146,-38404 }, { 147,-38404 }, { 148,-38404 }, { 149,-38404 }, + { 150,-38404 }, { 151,-38404 }, { 152,-38404 }, { 153,-38404 }, { 154,-38404 }, + { 155,-38404 }, { 156,-38404 }, { 157,-38404 }, { 158,-38404 }, { 159,-38404 }, + { 160,-38404 }, { 161,-38404 }, { 162,-38404 }, { 163,-38404 }, { 164,-38404 }, + { 165,-38404 }, { 166,-38404 }, { 167,-38404 }, { 168,-38404 }, { 169,-38404 }, + { 170,-38404 }, { 171,-38404 }, { 172,-38404 }, { 173,-38404 }, { 174,-38404 }, + { 175,-38404 }, { 176,-38404 }, { 177,-38404 }, { 178,-38404 }, { 179,-38404 }, + + { 180,-38404 }, { 181,-38404 }, { 182,-38404 }, { 183,-38404 }, { 184,-38404 }, + { 185,-38404 }, { 186,-38404 }, { 187,-38404 }, { 188,-38404 }, { 189,-38404 }, + { 190,-38404 }, { 191,-38404 }, { 192,-38404 }, { 193,-38404 }, { 194,-38404 }, + { 195,-38404 }, { 196,-38404 }, { 197,-38404 }, { 198,-38404 }, { 199,-38404 }, + { 200,-38404 }, { 201,-38404 }, { 202,-38404 }, { 203,-38404 }, { 204,-38404 }, + { 205,-38404 }, { 206,-38404 }, { 207,-38404 }, { 208,-38404 }, { 209,-38404 }, + { 210,-38404 }, { 211,-38404 }, { 212,-38404 }, { 213,-38404 }, { 214,-38404 }, + { 215,-38404 }, { 216,-38404 }, { 217,-38404 }, { 218,-38404 }, { 219,-38404 }, + { 220,-38404 }, { 221,-38404 }, { 222,-38404 }, { 223,-38404 }, { 224,-38404 }, + { 225,-38404 }, { 226,-38404 }, { 227,-38404 }, { 228,-38404 }, { 229,-38404 }, + + { 230,-38404 }, { 231,-38404 }, { 232,-38404 }, { 233,-38404 }, { 234,-38404 }, + { 235,-38404 }, { 236,-38404 }, { 237,-38404 }, { 238,-38404 }, { 239,-38404 }, + { 240,-38404 }, { 241,-38404 }, { 242,-38404 }, { 243,-38404 }, { 244,-38404 }, + { 245,-38404 }, { 246,-38404 }, { 247,-38404 }, { 248,-38404 }, { 249,-38404 }, + { 250,-38404 }, { 251,-38404 }, { 252,-38404 }, { 253,-38404 }, { 254,-38404 }, + { 255,-38404 }, { 0, 131 }, { 0,53462 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-38661 }, { 49,-38661 }, { 50,-38661 }, { 51,-38661 }, { 52,-38661 }, + { 53,-38661 }, { 54,-38661 }, { 55,-38661 }, { 56,-38661 }, { 57,-38661 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-38661 }, { 66,-38661 }, { 67,-38661 }, + { 68,-38661 }, { 69,-38661 }, { 70,-38661 }, { 71,-38661 }, { 72,-38661 }, + + { 73,-38661 }, { 74,-38661 }, { 75,-38661 }, { 76,-38661 }, { 77,-38661 }, + { 78,-38661 }, { 79,-38661 }, { 80,-38661 }, { 81,-38661 }, { 82,-38661 }, + { 83,13369 }, { 84,-38661 }, { 85,-38661 }, { 86,-38661 }, { 87,-38661 }, + { 88,-38661 }, { 89,-38661 }, { 90,-38661 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-38661 }, { 0, 0 }, { 97,-38661 }, + { 98,-38661 }, { 99,-38661 }, { 100,-38661 }, { 101,-38661 }, { 102,-38661 }, + { 103,-38661 }, { 104,-38661 }, { 105,-38661 }, { 106,-38661 }, { 107,-38661 }, + { 108,-38661 }, { 109,-38661 }, { 110,-38661 }, { 111,-38661 }, { 112,-38661 }, + { 113,-38661 }, { 114,-38661 }, { 115,13369 }, { 116,-38661 }, { 117,-38661 }, + { 118,-38661 }, { 119,-38661 }, { 120,-38661 }, { 121,-38661 }, { 122,-38661 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-38661 }, + { 128,-38661 }, { 129,-38661 }, { 130,-38661 }, { 131,-38661 }, { 132,-38661 }, + { 133,-38661 }, { 134,-38661 }, { 135,-38661 }, { 136,-38661 }, { 137,-38661 }, + { 138,-38661 }, { 139,-38661 }, { 140,-38661 }, { 141,-38661 }, { 142,-38661 }, + { 143,-38661 }, { 144,-38661 }, { 145,-38661 }, { 146,-38661 }, { 147,-38661 }, + { 148,-38661 }, { 149,-38661 }, { 150,-38661 }, { 151,-38661 }, { 152,-38661 }, + { 153,-38661 }, { 154,-38661 }, { 155,-38661 }, { 156,-38661 }, { 157,-38661 }, + { 158,-38661 }, { 159,-38661 }, { 160,-38661 }, { 161,-38661 }, { 162,-38661 }, + { 163,-38661 }, { 164,-38661 }, { 165,-38661 }, { 166,-38661 }, { 167,-38661 }, + { 168,-38661 }, { 169,-38661 }, { 170,-38661 }, { 171,-38661 }, { 172,-38661 }, + + { 173,-38661 }, { 174,-38661 }, { 175,-38661 }, { 176,-38661 }, { 177,-38661 }, + { 178,-38661 }, { 179,-38661 }, { 180,-38661 }, { 181,-38661 }, { 182,-38661 }, + { 183,-38661 }, { 184,-38661 }, { 185,-38661 }, { 186,-38661 }, { 187,-38661 }, + { 188,-38661 }, { 189,-38661 }, { 190,-38661 }, { 191,-38661 }, { 192,-38661 }, + { 193,-38661 }, { 194,-38661 }, { 195,-38661 }, { 196,-38661 }, { 197,-38661 }, + { 198,-38661 }, { 199,-38661 }, { 200,-38661 }, { 201,-38661 }, { 202,-38661 }, + { 203,-38661 }, { 204,-38661 }, { 205,-38661 }, { 206,-38661 }, { 207,-38661 }, + { 208,-38661 }, { 209,-38661 }, { 210,-38661 }, { 211,-38661 }, { 212,-38661 }, + { 213,-38661 }, { 214,-38661 }, { 215,-38661 }, { 216,-38661 }, { 217,-38661 }, + { 218,-38661 }, { 219,-38661 }, { 220,-38661 }, { 221,-38661 }, { 222,-38661 }, + + { 223,-38661 }, { 224,-38661 }, { 225,-38661 }, { 226,-38661 }, { 227,-38661 }, + { 228,-38661 }, { 229,-38661 }, { 230,-38661 }, { 231,-38661 }, { 232,-38661 }, + { 233,-38661 }, { 234,-38661 }, { 235,-38661 }, { 236,-38661 }, { 237,-38661 }, + { 238,-38661 }, { 239,-38661 }, { 240,-38661 }, { 241,-38661 }, { 242,-38661 }, + { 243,-38661 }, { 244,-38661 }, { 245,-38661 }, { 246,-38661 }, { 247,-38661 }, + { 248,-38661 }, { 249,-38661 }, { 250,-38661 }, { 251,-38661 }, { 252,-38661 }, + { 253,-38661 }, { 254,-38661 }, { 255,-38661 }, { 0, 131 }, { 0,53205 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-38918 }, { 49,-38918 }, { 50,-38918 }, + { 51,-38918 }, { 52,-38918 }, { 53,-38918 }, { 54,-38918 }, { 55,-38918 }, + { 56,-38918 }, { 57,-38918 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-38918 }, + + { 66,-38918 }, { 67,-38918 }, { 68,-38918 }, { 69,-38918 }, { 70,-38918 }, + { 71,-38918 }, { 72,-38918 }, { 73,-38918 }, { 74,-38918 }, { 75,-38918 }, + { 76,-38918 }, { 77,-38918 }, { 78,-38918 }, { 79,-38918 }, { 80,-38918 }, + { 81,-38918 }, { 82,-38918 }, { 83,-38918 }, { 84,13369 }, { 85,-38918 }, + { 86,-38918 }, { 87,-38918 }, { 88,-38918 }, { 89,-38918 }, { 90,-38918 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-38918 }, + { 0, 0 }, { 97,-38918 }, { 98,-38918 }, { 99,-38918 }, { 100,-38918 }, + { 101,-38918 }, { 102,-38918 }, { 103,-38918 }, { 104,-38918 }, { 105,-38918 }, + { 106,-38918 }, { 107,-38918 }, { 108,-38918 }, { 109,-38918 }, { 110,-38918 }, + { 111,-38918 }, { 112,-38918 }, { 113,-38918 }, { 114,-38918 }, { 115,-38918 }, + + { 116,13369 }, { 117,-38918 }, { 118,-38918 }, { 119,-38918 }, { 120,-38918 }, + { 121,-38918 }, { 122,-38918 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-38918 }, { 128,-38918 }, { 129,-38918 }, { 130,-38918 }, + { 131,-38918 }, { 132,-38918 }, { 133,-38918 }, { 134,-38918 }, { 135,-38918 }, + { 136,-38918 }, { 137,-38918 }, { 138,-38918 }, { 139,-38918 }, { 140,-38918 }, + { 141,-38918 }, { 142,-38918 }, { 143,-38918 }, { 144,-38918 }, { 145,-38918 }, + { 146,-38918 }, { 147,-38918 }, { 148,-38918 }, { 149,-38918 }, { 150,-38918 }, + { 151,-38918 }, { 152,-38918 }, { 153,-38918 }, { 154,-38918 }, { 155,-38918 }, + { 156,-38918 }, { 157,-38918 }, { 158,-38918 }, { 159,-38918 }, { 160,-38918 }, + { 161,-38918 }, { 162,-38918 }, { 163,-38918 }, { 164,-38918 }, { 165,-38918 }, + + { 166,-38918 }, { 167,-38918 }, { 168,-38918 }, { 169,-38918 }, { 170,-38918 }, + { 171,-38918 }, { 172,-38918 }, { 173,-38918 }, { 174,-38918 }, { 175,-38918 }, + { 176,-38918 }, { 177,-38918 }, { 178,-38918 }, { 179,-38918 }, { 180,-38918 }, + { 181,-38918 }, { 182,-38918 }, { 183,-38918 }, { 184,-38918 }, { 185,-38918 }, + { 186,-38918 }, { 187,-38918 }, { 188,-38918 }, { 189,-38918 }, { 190,-38918 }, + { 191,-38918 }, { 192,-38918 }, { 193,-38918 }, { 194,-38918 }, { 195,-38918 }, + { 196,-38918 }, { 197,-38918 }, { 198,-38918 }, { 199,-38918 }, { 200,-38918 }, + { 201,-38918 }, { 202,-38918 }, { 203,-38918 }, { 204,-38918 }, { 205,-38918 }, + { 206,-38918 }, { 207,-38918 }, { 208,-38918 }, { 209,-38918 }, { 210,-38918 }, + { 211,-38918 }, { 212,-38918 }, { 213,-38918 }, { 214,-38918 }, { 215,-38918 }, + + { 216,-38918 }, { 217,-38918 }, { 218,-38918 }, { 219,-38918 }, { 220,-38918 }, + { 221,-38918 }, { 222,-38918 }, { 223,-38918 }, { 224,-38918 }, { 225,-38918 }, + { 226,-38918 }, { 227,-38918 }, { 228,-38918 }, { 229,-38918 }, { 230,-38918 }, + { 231,-38918 }, { 232,-38918 }, { 233,-38918 }, { 234,-38918 }, { 235,-38918 }, + { 236,-38918 }, { 237,-38918 }, { 238,-38918 }, { 239,-38918 }, { 240,-38918 }, + { 241,-38918 }, { 242,-38918 }, { 243,-38918 }, { 244,-38918 }, { 245,-38918 }, + { 246,-38918 }, { 247,-38918 }, { 248,-38918 }, { 249,-38918 }, { 250,-38918 }, + { 251,-38918 }, { 252,-38918 }, { 253,-38918 }, { 254,-38918 }, { 255,-38918 }, + { 0, 131 }, { 0,52948 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-39175 }, + { 49,-39175 }, { 50,-39175 }, { 51,-39175 }, { 52,-39175 }, { 53,-39175 }, + { 54,-39175 }, { 55,-39175 }, { 56,-39175 }, { 57,-39175 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,13369 }, { 66,-39175 }, { 67,-39175 }, { 68,-39175 }, + { 69,-39175 }, { 70,-39175 }, { 71,-39175 }, { 72,-39175 }, { 73,-39175 }, + { 74,-39175 }, { 75,-39175 }, { 76,-39175 }, { 77,-39175 }, { 78,-39175 }, + { 79,-39175 }, { 80,-39175 }, { 81,-39175 }, { 82,-39175 }, { 83,-39175 }, + { 84,-39175 }, { 85,-39175 }, { 86,-39175 }, { 87,-39175 }, { 88,-39175 }, + { 89,-39175 }, { 90,-39175 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-39175 }, { 0, 0 }, { 97,13369 }, { 98,-39175 }, + { 99,-39175 }, { 100,-39175 }, { 101,-39175 }, { 102,-39175 }, { 103,-39175 }, + { 104,-39175 }, { 105,-39175 }, { 106,-39175 }, { 107,-39175 }, { 108,-39175 }, + + { 109,-39175 }, { 110,-39175 }, { 111,-39175 }, { 112,-39175 }, { 113,-39175 }, + { 114,-39175 }, { 115,-39175 }, { 116,-39175 }, { 117,-39175 }, { 118,-39175 }, + { 119,-39175 }, { 120,-39175 }, { 121,-39175 }, { 122,-39175 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-39175 }, { 128,-39175 }, + { 129,-39175 }, { 130,-39175 }, { 131,-39175 }, { 132,-39175 }, { 133,-39175 }, + { 134,-39175 }, { 135,-39175 }, { 136,-39175 }, { 137,-39175 }, { 138,-39175 }, + { 139,-39175 }, { 140,-39175 }, { 141,-39175 }, { 142,-39175 }, { 143,-39175 }, + { 144,-39175 }, { 145,-39175 }, { 146,-39175 }, { 147,-39175 }, { 148,-39175 }, + { 149,-39175 }, { 150,-39175 }, { 151,-39175 }, { 152,-39175 }, { 153,-39175 }, + { 154,-39175 }, { 155,-39175 }, { 156,-39175 }, { 157,-39175 }, { 158,-39175 }, + + { 159,-39175 }, { 160,-39175 }, { 161,-39175 }, { 162,-39175 }, { 163,-39175 }, + { 164,-39175 }, { 165,-39175 }, { 166,-39175 }, { 167,-39175 }, { 168,-39175 }, + { 169,-39175 }, { 170,-39175 }, { 171,-39175 }, { 172,-39175 }, { 173,-39175 }, + { 174,-39175 }, { 175,-39175 }, { 176,-39175 }, { 177,-39175 }, { 178,-39175 }, + { 179,-39175 }, { 180,-39175 }, { 181,-39175 }, { 182,-39175 }, { 183,-39175 }, + { 184,-39175 }, { 185,-39175 }, { 186,-39175 }, { 187,-39175 }, { 188,-39175 }, + { 189,-39175 }, { 190,-39175 }, { 191,-39175 }, { 192,-39175 }, { 193,-39175 }, + { 194,-39175 }, { 195,-39175 }, { 196,-39175 }, { 197,-39175 }, { 198,-39175 }, + { 199,-39175 }, { 200,-39175 }, { 201,-39175 }, { 202,-39175 }, { 203,-39175 }, + { 204,-39175 }, { 205,-39175 }, { 206,-39175 }, { 207,-39175 }, { 208,-39175 }, + + { 209,-39175 }, { 210,-39175 }, { 211,-39175 }, { 212,-39175 }, { 213,-39175 }, + { 214,-39175 }, { 215,-39175 }, { 216,-39175 }, { 217,-39175 }, { 218,-39175 }, + { 219,-39175 }, { 220,-39175 }, { 221,-39175 }, { 222,-39175 }, { 223,-39175 }, + { 224,-39175 }, { 225,-39175 }, { 226,-39175 }, { 227,-39175 }, { 228,-39175 }, + { 229,-39175 }, { 230,-39175 }, { 231,-39175 }, { 232,-39175 }, { 233,-39175 }, + { 234,-39175 }, { 235,-39175 }, { 236,-39175 }, { 237,-39175 }, { 238,-39175 }, + { 239,-39175 }, { 240,-39175 }, { 241,-39175 }, { 242,-39175 }, { 243,-39175 }, + { 244,-39175 }, { 245,-39175 }, { 246,-39175 }, { 247,-39175 }, { 248,-39175 }, + { 249,-39175 }, { 250,-39175 }, { 251,-39175 }, { 252,-39175 }, { 253,-39175 }, + { 254,-39175 }, { 255,-39175 }, { 0, 131 }, { 0,52691 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-39432 }, { 49,-39432 }, { 50,-39432 }, { 51,-39432 }, + + { 52,-39432 }, { 53,-39432 }, { 54,-39432 }, { 55,-39432 }, { 56,-39432 }, + { 57,-39432 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-39432 }, { 66,-39432 }, + { 67,-39432 }, { 68,-39432 }, { 69,13369 }, { 70,-39432 }, { 71,-39432 }, + { 72,-39432 }, { 73,-39432 }, { 74,-39432 }, { 75,-39432 }, { 76,-39432 }, + { 77,-39432 }, { 78,-39432 }, { 79,-39432 }, { 80,-39432 }, { 81,-39432 }, + { 82,-39432 }, { 83,-39432 }, { 84,-39432 }, { 85,-39432 }, { 86,-39432 }, + { 87,-39432 }, { 88,-39432 }, { 89,-39432 }, { 90,-39432 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-39432 }, { 0, 0 }, + { 97,-39432 }, { 98,-39432 }, { 99,-39432 }, { 100,-39432 }, { 101,13369 }, + + { 102,-39432 }, { 103,-39432 }, { 104,-39432 }, { 105,-39432 }, { 106,-39432 }, + { 107,-39432 }, { 108,-39432 }, { 109,-39432 }, { 110,-39432 }, { 111,-39432 }, + { 112,-39432 }, { 113,-39432 }, { 114,-39432 }, { 115,-39432 }, { 116,-39432 }, + { 117,-39432 }, { 118,-39432 }, { 119,-39432 }, { 120,-39432 }, { 121,-39432 }, + { 122,-39432 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-39432 }, { 128,-39432 }, { 129,-39432 }, { 130,-39432 }, { 131,-39432 }, + { 132,-39432 }, { 133,-39432 }, { 134,-39432 }, { 135,-39432 }, { 136,-39432 }, + { 137,-39432 }, { 138,-39432 }, { 139,-39432 }, { 140,-39432 }, { 141,-39432 }, + { 142,-39432 }, { 143,-39432 }, { 144,-39432 }, { 145,-39432 }, { 146,-39432 }, + { 147,-39432 }, { 148,-39432 }, { 149,-39432 }, { 150,-39432 }, { 151,-39432 }, + + { 152,-39432 }, { 153,-39432 }, { 154,-39432 }, { 155,-39432 }, { 156,-39432 }, + { 157,-39432 }, { 158,-39432 }, { 159,-39432 }, { 160,-39432 }, { 161,-39432 }, + { 162,-39432 }, { 163,-39432 }, { 164,-39432 }, { 165,-39432 }, { 166,-39432 }, + { 167,-39432 }, { 168,-39432 }, { 169,-39432 }, { 170,-39432 }, { 171,-39432 }, + { 172,-39432 }, { 173,-39432 }, { 174,-39432 }, { 175,-39432 }, { 176,-39432 }, + { 177,-39432 }, { 178,-39432 }, { 179,-39432 }, { 180,-39432 }, { 181,-39432 }, + { 182,-39432 }, { 183,-39432 }, { 184,-39432 }, { 185,-39432 }, { 186,-39432 }, + { 187,-39432 }, { 188,-39432 }, { 189,-39432 }, { 190,-39432 }, { 191,-39432 }, + { 192,-39432 }, { 193,-39432 }, { 194,-39432 }, { 195,-39432 }, { 196,-39432 }, + { 197,-39432 }, { 198,-39432 }, { 199,-39432 }, { 200,-39432 }, { 201,-39432 }, + + { 202,-39432 }, { 203,-39432 }, { 204,-39432 }, { 205,-39432 }, { 206,-39432 }, + { 207,-39432 }, { 208,-39432 }, { 209,-39432 }, { 210,-39432 }, { 211,-39432 }, + { 212,-39432 }, { 213,-39432 }, { 214,-39432 }, { 215,-39432 }, { 216,-39432 }, + { 217,-39432 }, { 218,-39432 }, { 219,-39432 }, { 220,-39432 }, { 221,-39432 }, + { 222,-39432 }, { 223,-39432 }, { 224,-39432 }, { 225,-39432 }, { 226,-39432 }, + { 227,-39432 }, { 228,-39432 }, { 229,-39432 }, { 230,-39432 }, { 231,-39432 }, + { 232,-39432 }, { 233,-39432 }, { 234,-39432 }, { 235,-39432 }, { 236,-39432 }, + { 237,-39432 }, { 238,-39432 }, { 239,-39432 }, { 240,-39432 }, { 241,-39432 }, + { 242,-39432 }, { 243,-39432 }, { 244,-39432 }, { 245,-39432 }, { 246,-39432 }, + { 247,-39432 }, { 248,-39432 }, { 249,-39432 }, { 250,-39432 }, { 251,-39432 }, + + { 252,-39432 }, { 253,-39432 }, { 254,-39432 }, { 255,-39432 }, { 0, 131 }, + { 0,52434 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-39689 }, { 49,-39689 }, + { 50,-39689 }, { 51,-39689 }, { 52,-39689 }, { 53,-39689 }, { 54,-39689 }, + { 55,-39689 }, { 56,-39689 }, { 57,-39689 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-39689 }, { 66,-39689 }, { 67,-39689 }, { 68,-39689 }, { 69,-39689 }, + { 70,-39689 }, { 71,-39689 }, { 72,-39689 }, { 73,13369 }, { 74,-39689 }, + { 75,-39689 }, { 76,-39689 }, { 77,-39689 }, { 78,-39689 }, { 79,-39689 }, + { 80,-39689 }, { 81,-39689 }, { 82,-39689 }, { 83,-39689 }, { 84,-39689 }, + { 85,-39689 }, { 86,-39689 }, { 87,-39689 }, { 88,-39689 }, { 89,-39689 }, + { 90,-39689 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 95,-39689 }, { 0, 0 }, { 97,-39689 }, { 98,-39689 }, { 99,-39689 }, + { 100,-39689 }, { 101,-39689 }, { 102,-39689 }, { 103,-39689 }, { 104,-39689 }, + { 105,13369 }, { 106,-39689 }, { 107,-39689 }, { 108,-39689 }, { 109,-39689 }, + { 110,-39689 }, { 111,-39689 }, { 112,-39689 }, { 113,-39689 }, { 114,-39689 }, + { 115,-39689 }, { 116,-39689 }, { 117,-39689 }, { 118,-39689 }, { 119,-39689 }, + { 120,-39689 }, { 121,-39689 }, { 122,-39689 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-39689 }, { 128,-39689 }, { 129,-39689 }, + { 130,-39689 }, { 131,-39689 }, { 132,-39689 }, { 133,-39689 }, { 134,-39689 }, + { 135,-39689 }, { 136,-39689 }, { 137,-39689 }, { 138,-39689 }, { 139,-39689 }, + { 140,-39689 }, { 141,-39689 }, { 142,-39689 }, { 143,-39689 }, { 144,-39689 }, + + { 145,-39689 }, { 146,-39689 }, { 147,-39689 }, { 148,-39689 }, { 149,-39689 }, + { 150,-39689 }, { 151,-39689 }, { 152,-39689 }, { 153,-39689 }, { 154,-39689 }, + { 155,-39689 }, { 156,-39689 }, { 157,-39689 }, { 158,-39689 }, { 159,-39689 }, + { 160,-39689 }, { 161,-39689 }, { 162,-39689 }, { 163,-39689 }, { 164,-39689 }, + { 165,-39689 }, { 166,-39689 }, { 167,-39689 }, { 168,-39689 }, { 169,-39689 }, + { 170,-39689 }, { 171,-39689 }, { 172,-39689 }, { 173,-39689 }, { 174,-39689 }, + { 175,-39689 }, { 176,-39689 }, { 177,-39689 }, { 178,-39689 }, { 179,-39689 }, + { 180,-39689 }, { 181,-39689 }, { 182,-39689 }, { 183,-39689 }, { 184,-39689 }, + { 185,-39689 }, { 186,-39689 }, { 187,-39689 }, { 188,-39689 }, { 189,-39689 }, + { 190,-39689 }, { 191,-39689 }, { 192,-39689 }, { 193,-39689 }, { 194,-39689 }, + + { 195,-39689 }, { 196,-39689 }, { 197,-39689 }, { 198,-39689 }, { 199,-39689 }, + { 200,-39689 }, { 201,-39689 }, { 202,-39689 }, { 203,-39689 }, { 204,-39689 }, + { 205,-39689 }, { 206,-39689 }, { 207,-39689 }, { 208,-39689 }, { 209,-39689 }, + { 210,-39689 }, { 211,-39689 }, { 212,-39689 }, { 213,-39689 }, { 214,-39689 }, + { 215,-39689 }, { 216,-39689 }, { 217,-39689 }, { 218,-39689 }, { 219,-39689 }, + { 220,-39689 }, { 221,-39689 }, { 222,-39689 }, { 223,-39689 }, { 224,-39689 }, + { 225,-39689 }, { 226,-39689 }, { 227,-39689 }, { 228,-39689 }, { 229,-39689 }, + { 230,-39689 }, { 231,-39689 }, { 232,-39689 }, { 233,-39689 }, { 234,-39689 }, + { 235,-39689 }, { 236,-39689 }, { 237,-39689 }, { 238,-39689 }, { 239,-39689 }, + { 240,-39689 }, { 241,-39689 }, { 242,-39689 }, { 243,-39689 }, { 244,-39689 }, + + { 245,-39689 }, { 246,-39689 }, { 247,-39689 }, { 248,-39689 }, { 249,-39689 }, + { 250,-39689 }, { 251,-39689 }, { 252,-39689 }, { 253,-39689 }, { 254,-39689 }, + { 255,-39689 }, { 0, 131 }, { 0,52177 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-39946 }, { 49,-39946 }, { 50,-39946 }, { 51,-39946 }, { 52,-39946 }, + { 53,-39946 }, { 54,-39946 }, { 55,-39946 }, { 56,-39946 }, { 57,-39946 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-39946 }, { 66,-39946 }, { 67,-39946 }, + { 68,-39946 }, { 69,-39946 }, { 70,-39946 }, { 71,-39946 }, { 72,-39946 }, + { 73,13369 }, { 74,-39946 }, { 75,-39946 }, { 76,-39946 }, { 77,-39946 }, + { 78,-39946 }, { 79,-39946 }, { 80,-39946 }, { 81,-39946 }, { 82,-39946 }, + { 83,-39946 }, { 84,-39946 }, { 85,-39946 }, { 86,-39946 }, { 87,-39946 }, + + { 88,-39946 }, { 89,-39946 }, { 90,-39946 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-39946 }, { 0, 0 }, { 97,-39946 }, + { 98,-39946 }, { 99,-39946 }, { 100,-39946 }, { 101,-39946 }, { 102,-39946 }, + { 103,-39946 }, { 104,-39946 }, { 105,13369 }, { 106,-39946 }, { 107,-39946 }, + { 108,-39946 }, { 109,-39946 }, { 110,-39946 }, { 111,-39946 }, { 112,-39946 }, + { 113,-39946 }, { 114,-39946 }, { 115,-39946 }, { 116,-39946 }, { 117,-39946 }, + { 118,-39946 }, { 119,-39946 }, { 120,-39946 }, { 121,-39946 }, { 122,-39946 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-39946 }, + { 128,-39946 }, { 129,-39946 }, { 130,-39946 }, { 131,-39946 }, { 132,-39946 }, + { 133,-39946 }, { 134,-39946 }, { 135,-39946 }, { 136,-39946 }, { 137,-39946 }, + + { 138,-39946 }, { 139,-39946 }, { 140,-39946 }, { 141,-39946 }, { 142,-39946 }, + { 143,-39946 }, { 144,-39946 }, { 145,-39946 }, { 146,-39946 }, { 147,-39946 }, + { 148,-39946 }, { 149,-39946 }, { 150,-39946 }, { 151,-39946 }, { 152,-39946 }, + { 153,-39946 }, { 154,-39946 }, { 155,-39946 }, { 156,-39946 }, { 157,-39946 }, + { 158,-39946 }, { 159,-39946 }, { 160,-39946 }, { 161,-39946 }, { 162,-39946 }, + { 163,-39946 }, { 164,-39946 }, { 165,-39946 }, { 166,-39946 }, { 167,-39946 }, + { 168,-39946 }, { 169,-39946 }, { 170,-39946 }, { 171,-39946 }, { 172,-39946 }, + { 173,-39946 }, { 174,-39946 }, { 175,-39946 }, { 176,-39946 }, { 177,-39946 }, + { 178,-39946 }, { 179,-39946 }, { 180,-39946 }, { 181,-39946 }, { 182,-39946 }, + { 183,-39946 }, { 184,-39946 }, { 185,-39946 }, { 186,-39946 }, { 187,-39946 }, + + { 188,-39946 }, { 189,-39946 }, { 190,-39946 }, { 191,-39946 }, { 192,-39946 }, + { 193,-39946 }, { 194,-39946 }, { 195,-39946 }, { 196,-39946 }, { 197,-39946 }, + { 198,-39946 }, { 199,-39946 }, { 200,-39946 }, { 201,-39946 }, { 202,-39946 }, + { 203,-39946 }, { 204,-39946 }, { 205,-39946 }, { 206,-39946 }, { 207,-39946 }, + { 208,-39946 }, { 209,-39946 }, { 210,-39946 }, { 211,-39946 }, { 212,-39946 }, + { 213,-39946 }, { 214,-39946 }, { 215,-39946 }, { 216,-39946 }, { 217,-39946 }, + { 218,-39946 }, { 219,-39946 }, { 220,-39946 }, { 221,-39946 }, { 222,-39946 }, + { 223,-39946 }, { 224,-39946 }, { 225,-39946 }, { 226,-39946 }, { 227,-39946 }, + { 228,-39946 }, { 229,-39946 }, { 230,-39946 }, { 231,-39946 }, { 232,-39946 }, + { 233,-39946 }, { 234,-39946 }, { 235,-39946 }, { 236,-39946 }, { 237,-39946 }, + + { 238,-39946 }, { 239,-39946 }, { 240,-39946 }, { 241,-39946 }, { 242,-39946 }, + { 243,-39946 }, { 244,-39946 }, { 245,-39946 }, { 246,-39946 }, { 247,-39946 }, + { 248,-39946 }, { 249,-39946 }, { 250,-39946 }, { 251,-39946 }, { 252,-39946 }, + { 253,-39946 }, { 254,-39946 }, { 255,-39946 }, { 0, 131 }, { 0,51920 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-40203 }, { 49,-40203 }, { 50,-40203 }, + { 51,-40203 }, { 52,-40203 }, { 53,-40203 }, { 54,-40203 }, { 55,-40203 }, + { 56,-40203 }, { 57,-40203 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-40203 }, + { 66,-40203 }, { 67,-40203 }, { 68,-40203 }, { 69,-40203 }, { 70,-40203 }, + { 71,-40203 }, { 72,-40203 }, { 73,-40203 }, { 74,-40203 }, { 75,-40203 }, + { 76,-40203 }, { 77,-40203 }, { 78,-40203 }, { 79,-40203 }, { 80,-40203 }, + + { 81,-40203 }, { 82,13369 }, { 83,-40203 }, { 84,-40203 }, { 85,-40203 }, + { 86,-40203 }, { 87,-40203 }, { 88,-40203 }, { 89,-40203 }, { 90,-40203 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-40203 }, + { 0, 0 }, { 97,-40203 }, { 98,-40203 }, { 99,-40203 }, { 100,-40203 }, + { 101,-40203 }, { 102,-40203 }, { 103,-40203 }, { 104,-40203 }, { 105,-40203 }, + { 106,-40203 }, { 107,-40203 }, { 108,-40203 }, { 109,-40203 }, { 110,-40203 }, + { 111,-40203 }, { 112,-40203 }, { 113,-40203 }, { 114,13369 }, { 115,-40203 }, + { 116,-40203 }, { 117,-40203 }, { 118,-40203 }, { 119,-40203 }, { 120,-40203 }, + { 121,-40203 }, { 122,-40203 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-40203 }, { 128,-40203 }, { 129,-40203 }, { 130,-40203 }, + + { 131,-40203 }, { 132,-40203 }, { 133,-40203 }, { 134,-40203 }, { 135,-40203 }, + { 136,-40203 }, { 137,-40203 }, { 138,-40203 }, { 139,-40203 }, { 140,-40203 }, + { 141,-40203 }, { 142,-40203 }, { 143,-40203 }, { 144,-40203 }, { 145,-40203 }, + { 146,-40203 }, { 147,-40203 }, { 148,-40203 }, { 149,-40203 }, { 150,-40203 }, + { 151,-40203 }, { 152,-40203 }, { 153,-40203 }, { 154,-40203 }, { 155,-40203 }, + { 156,-40203 }, { 157,-40203 }, { 158,-40203 }, { 159,-40203 }, { 160,-40203 }, + { 161,-40203 }, { 162,-40203 }, { 163,-40203 }, { 164,-40203 }, { 165,-40203 }, + { 166,-40203 }, { 167,-40203 }, { 168,-40203 }, { 169,-40203 }, { 170,-40203 }, + { 171,-40203 }, { 172,-40203 }, { 173,-40203 }, { 174,-40203 }, { 175,-40203 }, + { 176,-40203 }, { 177,-40203 }, { 178,-40203 }, { 179,-40203 }, { 180,-40203 }, + + { 181,-40203 }, { 182,-40203 }, { 183,-40203 }, { 184,-40203 }, { 185,-40203 }, + { 186,-40203 }, { 187,-40203 }, { 188,-40203 }, { 189,-40203 }, { 190,-40203 }, + { 191,-40203 }, { 192,-40203 }, { 193,-40203 }, { 194,-40203 }, { 195,-40203 }, + { 196,-40203 }, { 197,-40203 }, { 198,-40203 }, { 199,-40203 }, { 200,-40203 }, + { 201,-40203 }, { 202,-40203 }, { 203,-40203 }, { 204,-40203 }, { 205,-40203 }, + { 206,-40203 }, { 207,-40203 }, { 208,-40203 }, { 209,-40203 }, { 210,-40203 }, + { 211,-40203 }, { 212,-40203 }, { 213,-40203 }, { 214,-40203 }, { 215,-40203 }, + { 216,-40203 }, { 217,-40203 }, { 218,-40203 }, { 219,-40203 }, { 220,-40203 }, + { 221,-40203 }, { 222,-40203 }, { 223,-40203 }, { 224,-40203 }, { 225,-40203 }, + { 226,-40203 }, { 227,-40203 }, { 228,-40203 }, { 229,-40203 }, { 230,-40203 }, + + { 231,-40203 }, { 232,-40203 }, { 233,-40203 }, { 234,-40203 }, { 235,-40203 }, + { 236,-40203 }, { 237,-40203 }, { 238,-40203 }, { 239,-40203 }, { 240,-40203 }, + { 241,-40203 }, { 242,-40203 }, { 243,-40203 }, { 244,-40203 }, { 245,-40203 }, + { 246,-40203 }, { 247,-40203 }, { 248,-40203 }, { 249,-40203 }, { 250,-40203 }, + { 251,-40203 }, { 252,-40203 }, { 253,-40203 }, { 254,-40203 }, { 255,-40203 }, + { 0, 131 }, { 0,51663 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-40460 }, + { 49,-40460 }, { 50,-40460 }, { 51,-40460 }, { 52,-40460 }, { 53,-40460 }, + { 54,-40460 }, { 55,-40460 }, { 56,-40460 }, { 57,-40460 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-40460 }, { 66,-40460 }, { 67,-40460 }, { 68,-40460 }, + { 69,-40460 }, { 70,-40460 }, { 71,-40460 }, { 72,-40460 }, { 73,13369 }, + + { 74,-40460 }, { 75,-40460 }, { 76,-40460 }, { 77,-40460 }, { 78,-40460 }, + { 79,-40460 }, { 80,-40460 }, { 81,-40460 }, { 82,-40460 }, { 83,-40460 }, + { 84,-40460 }, { 85,-40460 }, { 86,-40460 }, { 87,-40460 }, { 88,-40460 }, + { 89,-40460 }, { 90,-40460 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-40460 }, { 0, 0 }, { 97,-40460 }, { 98,-40460 }, + { 99,-40460 }, { 100,-40460 }, { 101,-40460 }, { 102,-40460 }, { 103,-40460 }, + { 104,-40460 }, { 105,13369 }, { 106,-40460 }, { 107,-40460 }, { 108,-40460 }, + { 109,-40460 }, { 110,-40460 }, { 111,-40460 }, { 112,-40460 }, { 113,-40460 }, + { 114,-40460 }, { 115,-40460 }, { 116,-40460 }, { 117,-40460 }, { 118,-40460 }, + { 119,-40460 }, { 120,-40460 }, { 121,-40460 }, { 122,-40460 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-40460 }, { 128,-40460 }, + { 129,-40460 }, { 130,-40460 }, { 131,-40460 }, { 132,-40460 }, { 133,-40460 }, + { 134,-40460 }, { 135,-40460 }, { 136,-40460 }, { 137,-40460 }, { 138,-40460 }, + { 139,-40460 }, { 140,-40460 }, { 141,-40460 }, { 142,-40460 }, { 143,-40460 }, + { 144,-40460 }, { 145,-40460 }, { 146,-40460 }, { 147,-40460 }, { 148,-40460 }, + { 149,-40460 }, { 150,-40460 }, { 151,-40460 }, { 152,-40460 }, { 153,-40460 }, + { 154,-40460 }, { 155,-40460 }, { 156,-40460 }, { 157,-40460 }, { 158,-40460 }, + { 159,-40460 }, { 160,-40460 }, { 161,-40460 }, { 162,-40460 }, { 163,-40460 }, + { 164,-40460 }, { 165,-40460 }, { 166,-40460 }, { 167,-40460 }, { 168,-40460 }, + { 169,-40460 }, { 170,-40460 }, { 171,-40460 }, { 172,-40460 }, { 173,-40460 }, + + { 174,-40460 }, { 175,-40460 }, { 176,-40460 }, { 177,-40460 }, { 178,-40460 }, + { 179,-40460 }, { 180,-40460 }, { 181,-40460 }, { 182,-40460 }, { 183,-40460 }, + { 184,-40460 }, { 185,-40460 }, { 186,-40460 }, { 187,-40460 }, { 188,-40460 }, + { 189,-40460 }, { 190,-40460 }, { 191,-40460 }, { 192,-40460 }, { 193,-40460 }, + { 194,-40460 }, { 195,-40460 }, { 196,-40460 }, { 197,-40460 }, { 198,-40460 }, + { 199,-40460 }, { 200,-40460 }, { 201,-40460 }, { 202,-40460 }, { 203,-40460 }, + { 204,-40460 }, { 205,-40460 }, { 206,-40460 }, { 207,-40460 }, { 208,-40460 }, + { 209,-40460 }, { 210,-40460 }, { 211,-40460 }, { 212,-40460 }, { 213,-40460 }, + { 214,-40460 }, { 215,-40460 }, { 216,-40460 }, { 217,-40460 }, { 218,-40460 }, + { 219,-40460 }, { 220,-40460 }, { 221,-40460 }, { 222,-40460 }, { 223,-40460 }, + + { 224,-40460 }, { 225,-40460 }, { 226,-40460 }, { 227,-40460 }, { 228,-40460 }, + { 229,-40460 }, { 230,-40460 }, { 231,-40460 }, { 232,-40460 }, { 233,-40460 }, + { 234,-40460 }, { 235,-40460 }, { 236,-40460 }, { 237,-40460 }, { 238,-40460 }, + { 239,-40460 }, { 240,-40460 }, { 241,-40460 }, { 242,-40460 }, { 243,-40460 }, + { 244,-40460 }, { 245,-40460 }, { 246,-40460 }, { 247,-40460 }, { 248,-40460 }, + { 249,-40460 }, { 250,-40460 }, { 251,-40460 }, { 252,-40460 }, { 253,-40460 }, + { 254,-40460 }, { 255,-40460 }, { 0, 131 }, { 0,51406 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-40717 }, { 49,-40717 }, { 50,-40717 }, { 51,-40717 }, + { 52,-40717 }, { 53,-40717 }, { 54,-40717 }, { 55,-40717 }, { 56,-40717 }, + { 57,-40717 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-40717 }, { 66,-40717 }, + + { 67,13369 }, { 68,-40717 }, { 69,-40717 }, { 70,-40717 }, { 71,-40717 }, + { 72,-40717 }, { 73,-40717 }, { 74,-40717 }, { 75,-40717 }, { 76,-40717 }, + { 77,-40717 }, { 78,-40717 }, { 79,-40717 }, { 80,-40717 }, { 81,-40717 }, + { 82,-40717 }, { 83,-40717 }, { 84,-40717 }, { 85,-40717 }, { 86,-40717 }, + { 87,-40717 }, { 88,-40717 }, { 89,-40717 }, { 90,-40717 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-40717 }, { 0, 0 }, + { 97,-40717 }, { 98,-40717 }, { 99,13369 }, { 100,-40717 }, { 101,-40717 }, + { 102,-40717 }, { 103,-40717 }, { 104,-40717 }, { 105,-40717 }, { 106,-40717 }, + { 107,-40717 }, { 108,-40717 }, { 109,-40717 }, { 110,-40717 }, { 111,-40717 }, + { 112,-40717 }, { 113,-40717 }, { 114,-40717 }, { 115,-40717 }, { 116,-40717 }, + + { 117,-40717 }, { 118,-40717 }, { 119,-40717 }, { 120,-40717 }, { 121,-40717 }, + { 122,-40717 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-40717 }, { 128,-40717 }, { 129,-40717 }, { 130,-40717 }, { 131,-40717 }, + { 132,-40717 }, { 133,-40717 }, { 134,-40717 }, { 135,-40717 }, { 136,-40717 }, + { 137,-40717 }, { 138,-40717 }, { 139,-40717 }, { 140,-40717 }, { 141,-40717 }, + { 142,-40717 }, { 143,-40717 }, { 144,-40717 }, { 145,-40717 }, { 146,-40717 }, + { 147,-40717 }, { 148,-40717 }, { 149,-40717 }, { 150,-40717 }, { 151,-40717 }, + { 152,-40717 }, { 153,-40717 }, { 154,-40717 }, { 155,-40717 }, { 156,-40717 }, + { 157,-40717 }, { 158,-40717 }, { 159,-40717 }, { 160,-40717 }, { 161,-40717 }, + { 162,-40717 }, { 163,-40717 }, { 164,-40717 }, { 165,-40717 }, { 166,-40717 }, + + { 167,-40717 }, { 168,-40717 }, { 169,-40717 }, { 170,-40717 }, { 171,-40717 }, + { 172,-40717 }, { 173,-40717 }, { 174,-40717 }, { 175,-40717 }, { 176,-40717 }, + { 177,-40717 }, { 178,-40717 }, { 179,-40717 }, { 180,-40717 }, { 181,-40717 }, + { 182,-40717 }, { 183,-40717 }, { 184,-40717 }, { 185,-40717 }, { 186,-40717 }, + { 187,-40717 }, { 188,-40717 }, { 189,-40717 }, { 190,-40717 }, { 191,-40717 }, + { 192,-40717 }, { 193,-40717 }, { 194,-40717 }, { 195,-40717 }, { 196,-40717 }, + { 197,-40717 }, { 198,-40717 }, { 199,-40717 }, { 200,-40717 }, { 201,-40717 }, + { 202,-40717 }, { 203,-40717 }, { 204,-40717 }, { 205,-40717 }, { 206,-40717 }, + { 207,-40717 }, { 208,-40717 }, { 209,-40717 }, { 210,-40717 }, { 211,-40717 }, + { 212,-40717 }, { 213,-40717 }, { 214,-40717 }, { 215,-40717 }, { 216,-40717 }, + + { 217,-40717 }, { 218,-40717 }, { 219,-40717 }, { 220,-40717 }, { 221,-40717 }, + { 222,-40717 }, { 223,-40717 }, { 224,-40717 }, { 225,-40717 }, { 226,-40717 }, + { 227,-40717 }, { 228,-40717 }, { 229,-40717 }, { 230,-40717 }, { 231,-40717 }, + { 232,-40717 }, { 233,-40717 }, { 234,-40717 }, { 235,-40717 }, { 236,-40717 }, + { 237,-40717 }, { 238,-40717 }, { 239,-40717 }, { 240,-40717 }, { 241,-40717 }, + { 242,-40717 }, { 243,-40717 }, { 244,-40717 }, { 245,-40717 }, { 246,-40717 }, + { 247,-40717 }, { 248,-40717 }, { 249,-40717 }, { 250,-40717 }, { 251,-40717 }, + { 252,-40717 }, { 253,-40717 }, { 254,-40717 }, { 255,-40717 }, { 0, 131 }, + { 0,51149 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-40974 }, { 49,-40974 }, + { 50,-40974 }, { 51,-40974 }, { 52,-40974 }, { 53,-40974 }, { 54,-40974 }, + { 55,-40974 }, { 56,-40974 }, { 57,-40974 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-40974 }, { 66,-40974 }, { 67,-40974 }, { 68,-40974 }, { 69,-40974 }, + { 70,-40974 }, { 71,-40974 }, { 72,-40974 }, { 73,-40974 }, { 74,-40974 }, + { 75,-40974 }, { 76,-40974 }, { 77,-40974 }, { 78,-40974 }, { 79,-40974 }, + { 80,-40974 }, { 81,-40974 }, { 82,-40974 }, { 83,-40974 }, { 84,-40974 }, + { 85,-40974 }, { 86,-40974 }, { 87,13369 }, { 88,-40974 }, { 89,-40974 }, + { 90,-40974 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-40974 }, { 0, 0 }, { 97,-40974 }, { 98,-40974 }, { 99,-40974 }, + { 100,-40974 }, { 101,-40974 }, { 102,-40974 }, { 103,-40974 }, { 104,-40974 }, + { 105,-40974 }, { 106,-40974 }, { 107,-40974 }, { 108,-40974 }, { 109,-40974 }, + + { 110,-40974 }, { 111,-40974 }, { 112,-40974 }, { 113,-40974 }, { 114,-40974 }, + { 115,-40974 }, { 116,-40974 }, { 117,-40974 }, { 118,-40974 }, { 119,13369 }, + { 120,-40974 }, { 121,-40974 }, { 122,-40974 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-40974 }, { 128,-40974 }, { 129,-40974 }, + { 130,-40974 }, { 131,-40974 }, { 132,-40974 }, { 133,-40974 }, { 134,-40974 }, + { 135,-40974 }, { 136,-40974 }, { 137,-40974 }, { 138,-40974 }, { 139,-40974 }, + { 140,-40974 }, { 141,-40974 }, { 142,-40974 }, { 143,-40974 }, { 144,-40974 }, + { 145,-40974 }, { 146,-40974 }, { 147,-40974 }, { 148,-40974 }, { 149,-40974 }, + { 150,-40974 }, { 151,-40974 }, { 152,-40974 }, { 153,-40974 }, { 154,-40974 }, + { 155,-40974 }, { 156,-40974 }, { 157,-40974 }, { 158,-40974 }, { 159,-40974 }, + + { 160,-40974 }, { 161,-40974 }, { 162,-40974 }, { 163,-40974 }, { 164,-40974 }, + { 165,-40974 }, { 166,-40974 }, { 167,-40974 }, { 168,-40974 }, { 169,-40974 }, + { 170,-40974 }, { 171,-40974 }, { 172,-40974 }, { 173,-40974 }, { 174,-40974 }, + { 175,-40974 }, { 176,-40974 }, { 177,-40974 }, { 178,-40974 }, { 179,-40974 }, + { 180,-40974 }, { 181,-40974 }, { 182,-40974 }, { 183,-40974 }, { 184,-40974 }, + { 185,-40974 }, { 186,-40974 }, { 187,-40974 }, { 188,-40974 }, { 189,-40974 }, + { 190,-40974 }, { 191,-40974 }, { 192,-40974 }, { 193,-40974 }, { 194,-40974 }, + { 195,-40974 }, { 196,-40974 }, { 197,-40974 }, { 198,-40974 }, { 199,-40974 }, + { 200,-40974 }, { 201,-40974 }, { 202,-40974 }, { 203,-40974 }, { 204,-40974 }, + { 205,-40974 }, { 206,-40974 }, { 207,-40974 }, { 208,-40974 }, { 209,-40974 }, + + { 210,-40974 }, { 211,-40974 }, { 212,-40974 }, { 213,-40974 }, { 214,-40974 }, + { 215,-40974 }, { 216,-40974 }, { 217,-40974 }, { 218,-40974 }, { 219,-40974 }, + { 220,-40974 }, { 221,-40974 }, { 222,-40974 }, { 223,-40974 }, { 224,-40974 }, + { 225,-40974 }, { 226,-40974 }, { 227,-40974 }, { 228,-40974 }, { 229,-40974 }, + { 230,-40974 }, { 231,-40974 }, { 232,-40974 }, { 233,-40974 }, { 234,-40974 }, + { 235,-40974 }, { 236,-40974 }, { 237,-40974 }, { 238,-40974 }, { 239,-40974 }, + { 240,-40974 }, { 241,-40974 }, { 242,-40974 }, { 243,-40974 }, { 244,-40974 }, + { 245,-40974 }, { 246,-40974 }, { 247,-40974 }, { 248,-40974 }, { 249,-40974 }, + { 250,-40974 }, { 251,-40974 }, { 252,-40974 }, { 253,-40974 }, { 254,-40974 }, + { 255,-40974 }, { 0, 131 }, { 0,50892 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-41231 }, { 49,-41231 }, { 50,-41231 }, { 51,-41231 }, { 52,-41231 }, + + { 53,-41231 }, { 54,-41231 }, { 55,-41231 }, { 56,-41231 }, { 57,-41231 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-41231 }, { 66,-41231 }, { 67,-41231 }, + { 68,-41231 }, { 69,-41231 }, { 70,-41231 }, { 71,-41231 }, { 72,-41231 }, + { 73,-41231 }, { 74,-41231 }, { 75,-41231 }, { 76,-41231 }, { 77,-41231 }, + { 78,-41231 }, { 79,-41231 }, { 80,-41231 }, { 81,-41231 }, { 82,-41231 }, + { 83,-41231 }, { 84,13369 }, { 85,-41231 }, { 86,-41231 }, { 87,-41231 }, + { 88,-41231 }, { 89,-41231 }, { 90,-41231 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-41231 }, { 0, 0 }, { 97,-41231 }, + { 98,-41231 }, { 99,-41231 }, { 100,-41231 }, { 101,-41231 }, { 102,-41231 }, + + { 103,-41231 }, { 104,-41231 }, { 105,-41231 }, { 106,-41231 }, { 107,-41231 }, + { 108,-41231 }, { 109,-41231 }, { 110,-41231 }, { 111,-41231 }, { 112,-41231 }, + { 113,-41231 }, { 114,-41231 }, { 115,-41231 }, { 116,13369 }, { 117,-41231 }, + { 118,-41231 }, { 119,-41231 }, { 120,-41231 }, { 121,-41231 }, { 122,-41231 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-41231 }, + { 128,-41231 }, { 129,-41231 }, { 130,-41231 }, { 131,-41231 }, { 132,-41231 }, + { 133,-41231 }, { 134,-41231 }, { 135,-41231 }, { 136,-41231 }, { 137,-41231 }, + { 138,-41231 }, { 139,-41231 }, { 140,-41231 }, { 141,-41231 }, { 142,-41231 }, + { 143,-41231 }, { 144,-41231 }, { 145,-41231 }, { 146,-41231 }, { 147,-41231 }, + { 148,-41231 }, { 149,-41231 }, { 150,-41231 }, { 151,-41231 }, { 152,-41231 }, + + { 153,-41231 }, { 154,-41231 }, { 155,-41231 }, { 156,-41231 }, { 157,-41231 }, + { 158,-41231 }, { 159,-41231 }, { 160,-41231 }, { 161,-41231 }, { 162,-41231 }, + { 163,-41231 }, { 164,-41231 }, { 165,-41231 }, { 166,-41231 }, { 167,-41231 }, + { 168,-41231 }, { 169,-41231 }, { 170,-41231 }, { 171,-41231 }, { 172,-41231 }, + { 173,-41231 }, { 174,-41231 }, { 175,-41231 }, { 176,-41231 }, { 177,-41231 }, + { 178,-41231 }, { 179,-41231 }, { 180,-41231 }, { 181,-41231 }, { 182,-41231 }, + { 183,-41231 }, { 184,-41231 }, { 185,-41231 }, { 186,-41231 }, { 187,-41231 }, + { 188,-41231 }, { 189,-41231 }, { 190,-41231 }, { 191,-41231 }, { 192,-41231 }, + { 193,-41231 }, { 194,-41231 }, { 195,-41231 }, { 196,-41231 }, { 197,-41231 }, + { 198,-41231 }, { 199,-41231 }, { 200,-41231 }, { 201,-41231 }, { 202,-41231 }, + + { 203,-41231 }, { 204,-41231 }, { 205,-41231 }, { 206,-41231 }, { 207,-41231 }, + { 208,-41231 }, { 209,-41231 }, { 210,-41231 }, { 211,-41231 }, { 212,-41231 }, + { 213,-41231 }, { 214,-41231 }, { 215,-41231 }, { 216,-41231 }, { 217,-41231 }, + { 218,-41231 }, { 219,-41231 }, { 220,-41231 }, { 221,-41231 }, { 222,-41231 }, + { 223,-41231 }, { 224,-41231 }, { 225,-41231 }, { 226,-41231 }, { 227,-41231 }, + { 228,-41231 }, { 229,-41231 }, { 230,-41231 }, { 231,-41231 }, { 232,-41231 }, + { 233,-41231 }, { 234,-41231 }, { 235,-41231 }, { 236,-41231 }, { 237,-41231 }, + { 238,-41231 }, { 239,-41231 }, { 240,-41231 }, { 241,-41231 }, { 242,-41231 }, + { 243,-41231 }, { 244,-41231 }, { 245,-41231 }, { 246,-41231 }, { 247,-41231 }, + { 248,-41231 }, { 249,-41231 }, { 250,-41231 }, { 251,-41231 }, { 252,-41231 }, + + { 253,-41231 }, { 254,-41231 }, { 255,-41231 }, { 0, 131 }, { 0,50635 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 48,-41488 }, { 49,-41488 }, { 50,-41488 }, + { 51,-41488 }, { 52,-41488 }, { 53,-41488 }, { 54,-41488 }, { 55,-41488 }, + { 56,-41488 }, { 57,-41488 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-41488 }, + { 66,-41488 }, { 67,-41488 }, { 68,-41488 }, { 69,-41488 }, { 70,-41488 }, + { 71,-41488 }, { 72,-41488 }, { 73,-41488 }, { 74,-41488 }, { 75,-41488 }, + { 76,-41488 }, { 77,-41488 }, { 78,-41488 }, { 79,-41488 }, { 80,-41488 }, + { 81,-41488 }, { 82,-41488 }, { 83,-41488 }, { 84,13369 }, { 85,-41488 }, + { 86,-41488 }, { 87,-41488 }, { 88,-41488 }, { 89,-41488 }, { 90,-41488 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-41488 }, + + { 0, 0 }, { 97,-41488 }, { 98,-41488 }, { 99,-41488 }, { 100,-41488 }, + { 101,-41488 }, { 102,-41488 }, { 103,-41488 }, { 104,-41488 }, { 105,-41488 }, + { 106,-41488 }, { 107,-41488 }, { 108,-41488 }, { 109,-41488 }, { 110,-41488 }, + { 111,-41488 }, { 112,-41488 }, { 113,-41488 }, { 114,-41488 }, { 115,-41488 }, + { 116,13369 }, { 117,-41488 }, { 118,-41488 }, { 119,-41488 }, { 120,-41488 }, + { 121,-41488 }, { 122,-41488 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-41488 }, { 128,-41488 }, { 129,-41488 }, { 130,-41488 }, + { 131,-41488 }, { 132,-41488 }, { 133,-41488 }, { 134,-41488 }, { 135,-41488 }, + { 136,-41488 }, { 137,-41488 }, { 138,-41488 }, { 139,-41488 }, { 140,-41488 }, + { 141,-41488 }, { 142,-41488 }, { 143,-41488 }, { 144,-41488 }, { 145,-41488 }, + + { 146,-41488 }, { 147,-41488 }, { 148,-41488 }, { 149,-41488 }, { 150,-41488 }, + { 151,-41488 }, { 152,-41488 }, { 153,-41488 }, { 154,-41488 }, { 155,-41488 }, + { 156,-41488 }, { 157,-41488 }, { 158,-41488 }, { 159,-41488 }, { 160,-41488 }, + { 161,-41488 }, { 162,-41488 }, { 163,-41488 }, { 164,-41488 }, { 165,-41488 }, + { 166,-41488 }, { 167,-41488 }, { 168,-41488 }, { 169,-41488 }, { 170,-41488 }, + { 171,-41488 }, { 172,-41488 }, { 173,-41488 }, { 174,-41488 }, { 175,-41488 }, + { 176,-41488 }, { 177,-41488 }, { 178,-41488 }, { 179,-41488 }, { 180,-41488 }, + { 181,-41488 }, { 182,-41488 }, { 183,-41488 }, { 184,-41488 }, { 185,-41488 }, + { 186,-41488 }, { 187,-41488 }, { 188,-41488 }, { 189,-41488 }, { 190,-41488 }, + { 191,-41488 }, { 192,-41488 }, { 193,-41488 }, { 194,-41488 }, { 195,-41488 }, + + { 196,-41488 }, { 197,-41488 }, { 198,-41488 }, { 199,-41488 }, { 200,-41488 }, + { 201,-41488 }, { 202,-41488 }, { 203,-41488 }, { 204,-41488 }, { 205,-41488 }, + { 206,-41488 }, { 207,-41488 }, { 208,-41488 }, { 209,-41488 }, { 210,-41488 }, + { 211,-41488 }, { 212,-41488 }, { 213,-41488 }, { 214,-41488 }, { 215,-41488 }, + { 216,-41488 }, { 217,-41488 }, { 218,-41488 }, { 219,-41488 }, { 220,-41488 }, + { 221,-41488 }, { 222,-41488 }, { 223,-41488 }, { 224,-41488 }, { 225,-41488 }, + { 226,-41488 }, { 227,-41488 }, { 228,-41488 }, { 229,-41488 }, { 230,-41488 }, + { 231,-41488 }, { 232,-41488 }, { 233,-41488 }, { 234,-41488 }, { 235,-41488 }, + { 236,-41488 }, { 237,-41488 }, { 238,-41488 }, { 239,-41488 }, { 240,-41488 }, + { 241,-41488 }, { 242,-41488 }, { 243,-41488 }, { 244,-41488 }, { 245,-41488 }, + + { 246,-41488 }, { 247,-41488 }, { 248,-41488 }, { 249,-41488 }, { 250,-41488 }, + { 251,-41488 }, { 252,-41488 }, { 253,-41488 }, { 254,-41488 }, { 255,-41488 }, + { 0, 131 }, { 0,50378 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-41745 }, + { 49,-41745 }, { 50,-41745 }, { 51,-41745 }, { 52,-41745 }, { 53,-41745 }, + { 54,-41745 }, { 55,-41745 }, { 56,-41745 }, { 57,-41745 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-41745 }, { 66,-41745 }, { 67,-41745 }, { 68,-41745 }, + { 69,13369 }, { 70,-41745 }, { 71,-41745 }, { 72,-41745 }, { 73,-41745 }, + { 74,-41745 }, { 75,-41745 }, { 76,-41745 }, { 77,-41745 }, { 78,-41745 }, + { 79,-41745 }, { 80,-41745 }, { 81,-41745 }, { 82,-41745 }, { 83,-41745 }, + { 84,-41745 }, { 85,-41745 }, { 86,-41745 }, { 87,-41745 }, { 88,-41745 }, + + { 89,-41745 }, { 90,-41745 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-41745 }, { 0, 0 }, { 97,-41745 }, { 98,-41745 }, + { 99,-41745 }, { 100,-41745 }, { 101,13369 }, { 102,-41745 }, { 103,-41745 }, + { 104,-41745 }, { 105,-41745 }, { 106,-41745 }, { 107,-41745 }, { 108,-41745 }, + { 109,-41745 }, { 110,-41745 }, { 111,-41745 }, { 112,-41745 }, { 113,-41745 }, + { 114,-41745 }, { 115,-41745 }, { 116,-41745 }, { 117,-41745 }, { 118,-41745 }, + { 119,-41745 }, { 120,-41745 }, { 121,-41745 }, { 122,-41745 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-41745 }, { 128,-41745 }, + { 129,-41745 }, { 130,-41745 }, { 131,-41745 }, { 132,-41745 }, { 133,-41745 }, + { 134,-41745 }, { 135,-41745 }, { 136,-41745 }, { 137,-41745 }, { 138,-41745 }, + + { 139,-41745 }, { 140,-41745 }, { 141,-41745 }, { 142,-41745 }, { 143,-41745 }, + { 144,-41745 }, { 145,-41745 }, { 146,-41745 }, { 147,-41745 }, { 148,-41745 }, + { 149,-41745 }, { 150,-41745 }, { 151,-41745 }, { 152,-41745 }, { 153,-41745 }, + { 154,-41745 }, { 155,-41745 }, { 156,-41745 }, { 157,-41745 }, { 158,-41745 }, + { 159,-41745 }, { 160,-41745 }, { 161,-41745 }, { 162,-41745 }, { 163,-41745 }, + { 164,-41745 }, { 165,-41745 }, { 166,-41745 }, { 167,-41745 }, { 168,-41745 }, + { 169,-41745 }, { 170,-41745 }, { 171,-41745 }, { 172,-41745 }, { 173,-41745 }, + { 174,-41745 }, { 175,-41745 }, { 176,-41745 }, { 177,-41745 }, { 178,-41745 }, + { 179,-41745 }, { 180,-41745 }, { 181,-41745 }, { 182,-41745 }, { 183,-41745 }, + { 184,-41745 }, { 185,-41745 }, { 186,-41745 }, { 187,-41745 }, { 188,-41745 }, + + { 189,-41745 }, { 190,-41745 }, { 191,-41745 }, { 192,-41745 }, { 193,-41745 }, + { 194,-41745 }, { 195,-41745 }, { 196,-41745 }, { 197,-41745 }, { 198,-41745 }, + { 199,-41745 }, { 200,-41745 }, { 201,-41745 }, { 202,-41745 }, { 203,-41745 }, + { 204,-41745 }, { 205,-41745 }, { 206,-41745 }, { 207,-41745 }, { 208,-41745 }, + { 209,-41745 }, { 210,-41745 }, { 211,-41745 }, { 212,-41745 }, { 213,-41745 }, + { 214,-41745 }, { 215,-41745 }, { 216,-41745 }, { 217,-41745 }, { 218,-41745 }, + { 219,-41745 }, { 220,-41745 }, { 221,-41745 }, { 222,-41745 }, { 223,-41745 }, + { 224,-41745 }, { 225,-41745 }, { 226,-41745 }, { 227,-41745 }, { 228,-41745 }, + { 229,-41745 }, { 230,-41745 }, { 231,-41745 }, { 232,-41745 }, { 233,-41745 }, + { 234,-41745 }, { 235,-41745 }, { 236,-41745 }, { 237,-41745 }, { 238,-41745 }, + + { 239,-41745 }, { 240,-41745 }, { 241,-41745 }, { 242,-41745 }, { 243,-41745 }, + { 244,-41745 }, { 245,-41745 }, { 246,-41745 }, { 247,-41745 }, { 248,-41745 }, + { 249,-41745 }, { 250,-41745 }, { 251,-41745 }, { 252,-41745 }, { 253,-41745 }, + { 254,-41745 }, { 255,-41745 }, { 0, 131 }, { 0,50121 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-42002 }, { 49,-42002 }, { 50,-42002 }, { 51,-42002 }, + { 52,-42002 }, { 53,-42002 }, { 54,-42002 }, { 55,-42002 }, { 56,-42002 }, + { 57,-42002 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-42002 }, { 66,-42002 }, + { 67,-42002 }, { 68,13369 }, { 69,-42002 }, { 70,-42002 }, { 71,-42002 }, + { 72,-42002 }, { 73,-42002 }, { 74,-42002 }, { 75,-42002 }, { 76,-42002 }, + { 77,-42002 }, { 78,-42002 }, { 79,-42002 }, { 80,-42002 }, { 81,-42002 }, + + { 82,-42002 }, { 83,-42002 }, { 84,-42002 }, { 85,-42002 }, { 86,-42002 }, + { 87,-42002 }, { 88,-42002 }, { 89,-42002 }, { 90,-42002 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-42002 }, { 0, 0 }, + { 97,-42002 }, { 98,-42002 }, { 99,-42002 }, { 100,13369 }, { 101,-42002 }, + { 102,-42002 }, { 103,-42002 }, { 104,-42002 }, { 105,-42002 }, { 106,-42002 }, + { 107,-42002 }, { 108,-42002 }, { 109,-42002 }, { 110,-42002 }, { 111,-42002 }, + { 112,-42002 }, { 113,-42002 }, { 114,-42002 }, { 115,-42002 }, { 116,-42002 }, + { 117,-42002 }, { 118,-42002 }, { 119,-42002 }, { 120,-42002 }, { 121,-42002 }, + { 122,-42002 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-42002 }, { 128,-42002 }, { 129,-42002 }, { 130,-42002 }, { 131,-42002 }, + + { 132,-42002 }, { 133,-42002 }, { 134,-42002 }, { 135,-42002 }, { 136,-42002 }, + { 137,-42002 }, { 138,-42002 }, { 139,-42002 }, { 140,-42002 }, { 141,-42002 }, + { 142,-42002 }, { 143,-42002 }, { 144,-42002 }, { 145,-42002 }, { 146,-42002 }, + { 147,-42002 }, { 148,-42002 }, { 149,-42002 }, { 150,-42002 }, { 151,-42002 }, + { 152,-42002 }, { 153,-42002 }, { 154,-42002 }, { 155,-42002 }, { 156,-42002 }, + { 157,-42002 }, { 158,-42002 }, { 159,-42002 }, { 160,-42002 }, { 161,-42002 }, + { 162,-42002 }, { 163,-42002 }, { 164,-42002 }, { 165,-42002 }, { 166,-42002 }, + { 167,-42002 }, { 168,-42002 }, { 169,-42002 }, { 170,-42002 }, { 171,-42002 }, + { 172,-42002 }, { 173,-42002 }, { 174,-42002 }, { 175,-42002 }, { 176,-42002 }, + { 177,-42002 }, { 178,-42002 }, { 179,-42002 }, { 180,-42002 }, { 181,-42002 }, + + { 182,-42002 }, { 183,-42002 }, { 184,-42002 }, { 185,-42002 }, { 186,-42002 }, + { 187,-42002 }, { 188,-42002 }, { 189,-42002 }, { 190,-42002 }, { 191,-42002 }, + { 192,-42002 }, { 193,-42002 }, { 194,-42002 }, { 195,-42002 }, { 196,-42002 }, + { 197,-42002 }, { 198,-42002 }, { 199,-42002 }, { 200,-42002 }, { 201,-42002 }, + { 202,-42002 }, { 203,-42002 }, { 204,-42002 }, { 205,-42002 }, { 206,-42002 }, + { 207,-42002 }, { 208,-42002 }, { 209,-42002 }, { 210,-42002 }, { 211,-42002 }, + { 212,-42002 }, { 213,-42002 }, { 214,-42002 }, { 215,-42002 }, { 216,-42002 }, + { 217,-42002 }, { 218,-42002 }, { 219,-42002 }, { 220,-42002 }, { 221,-42002 }, + { 222,-42002 }, { 223,-42002 }, { 224,-42002 }, { 225,-42002 }, { 226,-42002 }, + { 227,-42002 }, { 228,-42002 }, { 229,-42002 }, { 230,-42002 }, { 231,-42002 }, + + { 232,-42002 }, { 233,-42002 }, { 234,-42002 }, { 235,-42002 }, { 236,-42002 }, + { 237,-42002 }, { 238,-42002 }, { 239,-42002 }, { 240,-42002 }, { 241,-42002 }, + { 242,-42002 }, { 243,-42002 }, { 244,-42002 }, { 245,-42002 }, { 246,-42002 }, + { 247,-42002 }, { 248,-42002 }, { 249,-42002 }, { 250,-42002 }, { 251,-42002 }, + { 252,-42002 }, { 253,-42002 }, { 254,-42002 }, { 255,-42002 }, { 0, 131 }, + { 0,49864 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-42259 }, { 49,-42259 }, + { 50,-42259 }, { 51,-42259 }, { 52,-42259 }, { 53,-42259 }, { 54,-42259 }, + { 55,-42259 }, { 56,-42259 }, { 57,-42259 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,13369 }, { 66,-42259 }, { 67,-42259 }, { 68,-42259 }, { 69,-42259 }, + { 70,-42259 }, { 71,-42259 }, { 72,-42259 }, { 73,-42259 }, { 74,-42259 }, + + { 75,-42259 }, { 76,-42259 }, { 77,-42259 }, { 78,-42259 }, { 79,-42259 }, + { 80,-42259 }, { 81,-42259 }, { 82,-42259 }, { 83,-42259 }, { 84,-42259 }, + { 85,-42259 }, { 86,-42259 }, { 87,-42259 }, { 88,-42259 }, { 89,-42259 }, + { 90,-42259 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-42259 }, { 0, 0 }, { 97,13369 }, { 98,-42259 }, { 99,-42259 }, + { 100,-42259 }, { 101,-42259 }, { 102,-42259 }, { 103,-42259 }, { 104,-42259 }, + { 105,-42259 }, { 106,-42259 }, { 107,-42259 }, { 108,-42259 }, { 109,-42259 }, + { 110,-42259 }, { 111,-42259 }, { 112,-42259 }, { 113,-42259 }, { 114,-42259 }, + { 115,-42259 }, { 116,-42259 }, { 117,-42259 }, { 118,-42259 }, { 119,-42259 }, + { 120,-42259 }, { 121,-42259 }, { 122,-42259 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 127,-42259 }, { 128,-42259 }, { 129,-42259 }, + { 130,-42259 }, { 131,-42259 }, { 132,-42259 }, { 133,-42259 }, { 134,-42259 }, + { 135,-42259 }, { 136,-42259 }, { 137,-42259 }, { 138,-42259 }, { 139,-42259 }, + { 140,-42259 }, { 141,-42259 }, { 142,-42259 }, { 143,-42259 }, { 144,-42259 }, + { 145,-42259 }, { 146,-42259 }, { 147,-42259 }, { 148,-42259 }, { 149,-42259 }, + { 150,-42259 }, { 151,-42259 }, { 152,-42259 }, { 153,-42259 }, { 154,-42259 }, + { 155,-42259 }, { 156,-42259 }, { 157,-42259 }, { 158,-42259 }, { 159,-42259 }, + { 160,-42259 }, { 161,-42259 }, { 162,-42259 }, { 163,-42259 }, { 164,-42259 }, + { 165,-42259 }, { 166,-42259 }, { 167,-42259 }, { 168,-42259 }, { 169,-42259 }, + { 170,-42259 }, { 171,-42259 }, { 172,-42259 }, { 173,-42259 }, { 174,-42259 }, + + { 175,-42259 }, { 176,-42259 }, { 177,-42259 }, { 178,-42259 }, { 179,-42259 }, + { 180,-42259 }, { 181,-42259 }, { 182,-42259 }, { 183,-42259 }, { 184,-42259 }, + { 185,-42259 }, { 186,-42259 }, { 187,-42259 }, { 188,-42259 }, { 189,-42259 }, + { 190,-42259 }, { 191,-42259 }, { 192,-42259 }, { 193,-42259 }, { 194,-42259 }, + { 195,-42259 }, { 196,-42259 }, { 197,-42259 }, { 198,-42259 }, { 199,-42259 }, + { 200,-42259 }, { 201,-42259 }, { 202,-42259 }, { 203,-42259 }, { 204,-42259 }, + { 205,-42259 }, { 206,-42259 }, { 207,-42259 }, { 208,-42259 }, { 209,-42259 }, + { 210,-42259 }, { 211,-42259 }, { 212,-42259 }, { 213,-42259 }, { 214,-42259 }, + { 215,-42259 }, { 216,-42259 }, { 217,-42259 }, { 218,-42259 }, { 219,-42259 }, + { 220,-42259 }, { 221,-42259 }, { 222,-42259 }, { 223,-42259 }, { 224,-42259 }, + + { 225,-42259 }, { 226,-42259 }, { 227,-42259 }, { 228,-42259 }, { 229,-42259 }, + { 230,-42259 }, { 231,-42259 }, { 232,-42259 }, { 233,-42259 }, { 234,-42259 }, + { 235,-42259 }, { 236,-42259 }, { 237,-42259 }, { 238,-42259 }, { 239,-42259 }, + { 240,-42259 }, { 241,-42259 }, { 242,-42259 }, { 243,-42259 }, { 244,-42259 }, + { 245,-42259 }, { 246,-42259 }, { 247,-42259 }, { 248,-42259 }, { 249,-42259 }, + { 250,-42259 }, { 251,-42259 }, { 252,-42259 }, { 253,-42259 }, { 254,-42259 }, + { 255,-42259 }, { 0, 131 }, { 0,49607 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-42516 }, { 49,-42516 }, { 50,-42516 }, { 51,-42516 }, { 52,-42516 }, + { 53,-42516 }, { 54,-42516 }, { 55,-42516 }, { 56,-42516 }, { 57,-42516 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-42516 }, { 66,-42516 }, { 67,-42516 }, + + { 68,-42516 }, { 69,-42516 }, { 70,-42516 }, { 71,-42516 }, { 72,-42516 }, + { 73,-42516 }, { 74,-42516 }, { 75,-42516 }, { 76,-42516 }, { 77,-42516 }, + { 78,-42516 }, { 79,-42516 }, { 80,-42516 }, { 81,-42516 }, { 82,13369 }, + { 83,-42516 }, { 84,-42516 }, { 85,-42516 }, { 86,-42516 }, { 87,-42516 }, + { 88,-42516 }, { 89,-42516 }, { 90,-42516 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-42516 }, { 0, 0 }, { 97,-42516 }, + { 98,-42516 }, { 99,-42516 }, { 100,-42516 }, { 101,-42516 }, { 102,-42516 }, + { 103,-42516 }, { 104,-42516 }, { 105,-42516 }, { 106,-42516 }, { 107,-42516 }, + { 108,-42516 }, { 109,-42516 }, { 110,-42516 }, { 111,-42516 }, { 112,-42516 }, + { 113,-42516 }, { 114,13369 }, { 115,-42516 }, { 116,-42516 }, { 117,-42516 }, + + { 118,-42516 }, { 119,-42516 }, { 120,-42516 }, { 121,-42516 }, { 122,-42516 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-42516 }, + { 128,-42516 }, { 129,-42516 }, { 130,-42516 }, { 131,-42516 }, { 132,-42516 }, + { 133,-42516 }, { 134,-42516 }, { 135,-42516 }, { 136,-42516 }, { 137,-42516 }, + { 138,-42516 }, { 139,-42516 }, { 140,-42516 }, { 141,-42516 }, { 142,-42516 }, + { 143,-42516 }, { 144,-42516 }, { 145,-42516 }, { 146,-42516 }, { 147,-42516 }, + { 148,-42516 }, { 149,-42516 }, { 150,-42516 }, { 151,-42516 }, { 152,-42516 }, + { 153,-42516 }, { 154,-42516 }, { 155,-42516 }, { 156,-42516 }, { 157,-42516 }, + { 158,-42516 }, { 159,-42516 }, { 160,-42516 }, { 161,-42516 }, { 162,-42516 }, + { 163,-42516 }, { 164,-42516 }, { 165,-42516 }, { 166,-42516 }, { 167,-42516 }, + + { 168,-42516 }, { 169,-42516 }, { 170,-42516 }, { 171,-42516 }, { 172,-42516 }, + { 173,-42516 }, { 174,-42516 }, { 175,-42516 }, { 176,-42516 }, { 177,-42516 }, + { 178,-42516 }, { 179,-42516 }, { 180,-42516 }, { 181,-42516 }, { 182,-42516 }, + { 183,-42516 }, { 184,-42516 }, { 185,-42516 }, { 186,-42516 }, { 187,-42516 }, + { 188,-42516 }, { 189,-42516 }, { 190,-42516 }, { 191,-42516 }, { 192,-42516 }, + { 193,-42516 }, { 194,-42516 }, { 195,-42516 }, { 196,-42516 }, { 197,-42516 }, + { 198,-42516 }, { 199,-42516 }, { 200,-42516 }, { 201,-42516 }, { 202,-42516 }, + { 203,-42516 }, { 204,-42516 }, { 205,-42516 }, { 206,-42516 }, { 207,-42516 }, + { 208,-42516 }, { 209,-42516 }, { 210,-42516 }, { 211,-42516 }, { 212,-42516 }, + { 213,-42516 }, { 214,-42516 }, { 215,-42516 }, { 216,-42516 }, { 217,-42516 }, + + { 218,-42516 }, { 219,-42516 }, { 220,-42516 }, { 221,-42516 }, { 222,-42516 }, + { 223,-42516 }, { 224,-42516 }, { 225,-42516 }, { 226,-42516 }, { 227,-42516 }, + { 228,-42516 }, { 229,-42516 }, { 230,-42516 }, { 231,-42516 }, { 232,-42516 }, + { 233,-42516 }, { 234,-42516 }, { 235,-42516 }, { 236,-42516 }, { 237,-42516 }, + { 238,-42516 }, { 239,-42516 }, { 240,-42516 }, { 241,-42516 }, { 242,-42516 }, + { 243,-42516 }, { 244,-42516 }, { 245,-42516 }, { 246,-42516 }, { 247,-42516 }, + { 248,-42516 }, { 249,-42516 }, { 250,-42516 }, { 251,-42516 }, { 252,-42516 }, + { 253,-42516 }, { 254,-42516 }, { 255,-42516 }, { 0, 131 }, { 0,49350 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-42773 }, { 49,-42773 }, { 50,-42773 }, + { 51,-42773 }, { 52,-42773 }, { 53,-42773 }, { 54,-42773 }, { 55,-42773 }, + { 56,-42773 }, { 57,-42773 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-42773 }, + { 66,-42773 }, { 67,-42773 }, { 68,-42773 }, { 69,-42773 }, { 70,-42773 }, + { 71,-42773 }, { 72,-42773 }, { 73,-42773 }, { 74,-42773 }, { 75,-42773 }, + { 76,13369 }, { 77,-42773 }, { 78,-42773 }, { 79,-42773 }, { 80,-42773 }, + { 81,-42773 }, { 82,-42773 }, { 83,-42773 }, { 84,-42773 }, { 85,-42773 }, + { 86,-42773 }, { 87,-42773 }, { 88,-42773 }, { 89,-42773 }, { 90,-42773 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-42773 }, + { 0, 0 }, { 97,-42773 }, { 98,-42773 }, { 99,-42773 }, { 100,-42773 }, + { 101,-42773 }, { 102,-42773 }, { 103,-42773 }, { 104,-42773 }, { 105,-42773 }, + { 106,-42773 }, { 107,-42773 }, { 108,13369 }, { 109,-42773 }, { 110,-42773 }, + + { 111,-42773 }, { 112,-42773 }, { 113,-42773 }, { 114,-42773 }, { 115,-42773 }, + { 116,-42773 }, { 117,-42773 }, { 118,-42773 }, { 119,-42773 }, { 120,-42773 }, + { 121,-42773 }, { 122,-42773 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-42773 }, { 128,-42773 }, { 129,-42773 }, { 130,-42773 }, + { 131,-42773 }, { 132,-42773 }, { 133,-42773 }, { 134,-42773 }, { 135,-42773 }, + { 136,-42773 }, { 137,-42773 }, { 138,-42773 }, { 139,-42773 }, { 140,-42773 }, + { 141,-42773 }, { 142,-42773 }, { 143,-42773 }, { 144,-42773 }, { 145,-42773 }, + { 146,-42773 }, { 147,-42773 }, { 148,-42773 }, { 149,-42773 }, { 150,-42773 }, + { 151,-42773 }, { 152,-42773 }, { 153,-42773 }, { 154,-42773 }, { 155,-42773 }, + { 156,-42773 }, { 157,-42773 }, { 158,-42773 }, { 159,-42773 }, { 160,-42773 }, + + { 161,-42773 }, { 162,-42773 }, { 163,-42773 }, { 164,-42773 }, { 165,-42773 }, + { 166,-42773 }, { 167,-42773 }, { 168,-42773 }, { 169,-42773 }, { 170,-42773 }, + { 171,-42773 }, { 172,-42773 }, { 173,-42773 }, { 174,-42773 }, { 175,-42773 }, + { 176,-42773 }, { 177,-42773 }, { 178,-42773 }, { 179,-42773 }, { 180,-42773 }, + { 181,-42773 }, { 182,-42773 }, { 183,-42773 }, { 184,-42773 }, { 185,-42773 }, + { 186,-42773 }, { 187,-42773 }, { 188,-42773 }, { 189,-42773 }, { 190,-42773 }, + { 191,-42773 }, { 192,-42773 }, { 193,-42773 }, { 194,-42773 }, { 195,-42773 }, + { 196,-42773 }, { 197,-42773 }, { 198,-42773 }, { 199,-42773 }, { 200,-42773 }, + { 201,-42773 }, { 202,-42773 }, { 203,-42773 }, { 204,-42773 }, { 205,-42773 }, + { 206,-42773 }, { 207,-42773 }, { 208,-42773 }, { 209,-42773 }, { 210,-42773 }, + + { 211,-42773 }, { 212,-42773 }, { 213,-42773 }, { 214,-42773 }, { 215,-42773 }, + { 216,-42773 }, { 217,-42773 }, { 218,-42773 }, { 219,-42773 }, { 220,-42773 }, + { 221,-42773 }, { 222,-42773 }, { 223,-42773 }, { 224,-42773 }, { 225,-42773 }, + { 226,-42773 }, { 227,-42773 }, { 228,-42773 }, { 229,-42773 }, { 230,-42773 }, + { 231,-42773 }, { 232,-42773 }, { 233,-42773 }, { 234,-42773 }, { 235,-42773 }, + { 236,-42773 }, { 237,-42773 }, { 238,-42773 }, { 239,-42773 }, { 240,-42773 }, + { 241,-42773 }, { 242,-42773 }, { 243,-42773 }, { 244,-42773 }, { 245,-42773 }, + { 246,-42773 }, { 247,-42773 }, { 248,-42773 }, { 249,-42773 }, { 250,-42773 }, + { 251,-42773 }, { 252,-42773 }, { 253,-42773 }, { 254,-42773 }, { 255,-42773 }, + { 0, 131 }, { 0,49093 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-43030 }, + { 49,-43030 }, { 50,-43030 }, { 51,-43030 }, { 52,-43030 }, { 53,-43030 }, + + { 54,-43030 }, { 55,-43030 }, { 56,-43030 }, { 57,-43030 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-43030 }, { 66,-43030 }, { 67,-43030 }, { 68,-43030 }, + { 69,-43030 }, { 70,-43030 }, { 71,-43030 }, { 72,-43030 }, { 73,-43030 }, + { 74,-43030 }, { 75,-43030 }, { 76,-43030 }, { 77,-43030 }, { 78,13369 }, + { 79,-43030 }, { 80,-43030 }, { 81,-43030 }, { 82,-43030 }, { 83,-43030 }, + { 84,-43030 }, { 85,-43030 }, { 86,-43030 }, { 87,-43030 }, { 88,-43030 }, + { 89,-43030 }, { 90,-43030 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-43030 }, { 0, 0 }, { 97,-43030 }, { 98,-43030 }, + { 99,-43030 }, { 100,-43030 }, { 101,-43030 }, { 102,-43030 }, { 103,-43030 }, + + { 104,-43030 }, { 105,-43030 }, { 106,-43030 }, { 107,-43030 }, { 108,-43030 }, + { 109,-43030 }, { 110,13369 }, { 111,-43030 }, { 112,-43030 }, { 113,-43030 }, + { 114,-43030 }, { 115,-43030 }, { 116,-43030 }, { 117,-43030 }, { 118,-43030 }, + { 119,-43030 }, { 120,-43030 }, { 121,-43030 }, { 122,-43030 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-43030 }, { 128,-43030 }, + { 129,-43030 }, { 130,-43030 }, { 131,-43030 }, { 132,-43030 }, { 133,-43030 }, + { 134,-43030 }, { 135,-43030 }, { 136,-43030 }, { 137,-43030 }, { 138,-43030 }, + { 139,-43030 }, { 140,-43030 }, { 141,-43030 }, { 142,-43030 }, { 143,-43030 }, + { 144,-43030 }, { 145,-43030 }, { 146,-43030 }, { 147,-43030 }, { 148,-43030 }, + { 149,-43030 }, { 150,-43030 }, { 151,-43030 }, { 152,-43030 }, { 153,-43030 }, + + { 154,-43030 }, { 155,-43030 }, { 156,-43030 }, { 157,-43030 }, { 158,-43030 }, + { 159,-43030 }, { 160,-43030 }, { 161,-43030 }, { 162,-43030 }, { 163,-43030 }, + { 164,-43030 }, { 165,-43030 }, { 166,-43030 }, { 167,-43030 }, { 168,-43030 }, + { 169,-43030 }, { 170,-43030 }, { 171,-43030 }, { 172,-43030 }, { 173,-43030 }, + { 174,-43030 }, { 175,-43030 }, { 176,-43030 }, { 177,-43030 }, { 178,-43030 }, + { 179,-43030 }, { 180,-43030 }, { 181,-43030 }, { 182,-43030 }, { 183,-43030 }, + { 184,-43030 }, { 185,-43030 }, { 186,-43030 }, { 187,-43030 }, { 188,-43030 }, + { 189,-43030 }, { 190,-43030 }, { 191,-43030 }, { 192,-43030 }, { 193,-43030 }, + { 194,-43030 }, { 195,-43030 }, { 196,-43030 }, { 197,-43030 }, { 198,-43030 }, + { 199,-43030 }, { 200,-43030 }, { 201,-43030 }, { 202,-43030 }, { 203,-43030 }, + + { 204,-43030 }, { 205,-43030 }, { 206,-43030 }, { 207,-43030 }, { 208,-43030 }, + { 209,-43030 }, { 210,-43030 }, { 211,-43030 }, { 212,-43030 }, { 213,-43030 }, + { 214,-43030 }, { 215,-43030 }, { 216,-43030 }, { 217,-43030 }, { 218,-43030 }, + { 219,-43030 }, { 220,-43030 }, { 221,-43030 }, { 222,-43030 }, { 223,-43030 }, + { 224,-43030 }, { 225,-43030 }, { 226,-43030 }, { 227,-43030 }, { 228,-43030 }, + { 229,-43030 }, { 230,-43030 }, { 231,-43030 }, { 232,-43030 }, { 233,-43030 }, + { 234,-43030 }, { 235,-43030 }, { 236,-43030 }, { 237,-43030 }, { 238,-43030 }, + { 239,-43030 }, { 240,-43030 }, { 241,-43030 }, { 242,-43030 }, { 243,-43030 }, + { 244,-43030 }, { 245,-43030 }, { 246,-43030 }, { 247,-43030 }, { 248,-43030 }, + { 249,-43030 }, { 250,-43030 }, { 251,-43030 }, { 252,-43030 }, { 253,-43030 }, + + { 254,-43030 }, { 255,-43030 }, { 0, 131 }, { 0,48836 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 48,-43287 }, { 49,-43287 }, { 50,-43287 }, { 51,-43287 }, + { 52,-43287 }, { 53,-43287 }, { 54,-43287 }, { 55,-43287 }, { 56,-43287 }, + { 57,-43287 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-43287 }, { 66,-43287 }, + { 67,-43287 }, { 68,-43287 }, { 69,-43287 }, { 70,-43287 }, { 71,-43287 }, + { 72,-43287 }, { 73,-43287 }, { 74,-43287 }, { 75,-43287 }, { 76,13369 }, + { 77,-43287 }, { 78,-43287 }, { 79,-43287 }, { 80,-43287 }, { 81,-43287 }, + { 82,-43287 }, { 83,-43287 }, { 84,-43287 }, { 85,-43287 }, { 86,-43287 }, + { 87,-43287 }, { 88,-43287 }, { 89,-43287 }, { 90,-43287 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-43287 }, { 0, 0 }, + + { 97,-43287 }, { 98,-43287 }, { 99,-43287 }, { 100,-43287 }, { 101,-43287 }, + { 102,-43287 }, { 103,-43287 }, { 104,-43287 }, { 105,-43287 }, { 106,-43287 }, + { 107,-43287 }, { 108,13369 }, { 109,-43287 }, { 110,-43287 }, { 111,-43287 }, + { 112,-43287 }, { 113,-43287 }, { 114,-43287 }, { 115,-43287 }, { 116,-43287 }, + { 117,-43287 }, { 118,-43287 }, { 119,-43287 }, { 120,-43287 }, { 121,-43287 }, + { 122,-43287 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-43287 }, { 128,-43287 }, { 129,-43287 }, { 130,-43287 }, { 131,-43287 }, + { 132,-43287 }, { 133,-43287 }, { 134,-43287 }, { 135,-43287 }, { 136,-43287 }, + { 137,-43287 }, { 138,-43287 }, { 139,-43287 }, { 140,-43287 }, { 141,-43287 }, + { 142,-43287 }, { 143,-43287 }, { 144,-43287 }, { 145,-43287 }, { 146,-43287 }, + + { 147,-43287 }, { 148,-43287 }, { 149,-43287 }, { 150,-43287 }, { 151,-43287 }, + { 152,-43287 }, { 153,-43287 }, { 154,-43287 }, { 155,-43287 }, { 156,-43287 }, + { 157,-43287 }, { 158,-43287 }, { 159,-43287 }, { 160,-43287 }, { 161,-43287 }, + { 162,-43287 }, { 163,-43287 }, { 164,-43287 }, { 165,-43287 }, { 166,-43287 }, + { 167,-43287 }, { 168,-43287 }, { 169,-43287 }, { 170,-43287 }, { 171,-43287 }, + { 172,-43287 }, { 173,-43287 }, { 174,-43287 }, { 175,-43287 }, { 176,-43287 }, + { 177,-43287 }, { 178,-43287 }, { 179,-43287 }, { 180,-43287 }, { 181,-43287 }, + { 182,-43287 }, { 183,-43287 }, { 184,-43287 }, { 185,-43287 }, { 186,-43287 }, + { 187,-43287 }, { 188,-43287 }, { 189,-43287 }, { 190,-43287 }, { 191,-43287 }, + { 192,-43287 }, { 193,-43287 }, { 194,-43287 }, { 195,-43287 }, { 196,-43287 }, + + { 197,-43287 }, { 198,-43287 }, { 199,-43287 }, { 200,-43287 }, { 201,-43287 }, + { 202,-43287 }, { 203,-43287 }, { 204,-43287 }, { 205,-43287 }, { 206,-43287 }, + { 207,-43287 }, { 208,-43287 }, { 209,-43287 }, { 210,-43287 }, { 211,-43287 }, + { 212,-43287 }, { 213,-43287 }, { 214,-43287 }, { 215,-43287 }, { 216,-43287 }, + { 217,-43287 }, { 218,-43287 }, { 219,-43287 }, { 220,-43287 }, { 221,-43287 }, + { 222,-43287 }, { 223,-43287 }, { 224,-43287 }, { 225,-43287 }, { 226,-43287 }, + { 227,-43287 }, { 228,-43287 }, { 229,-43287 }, { 230,-43287 }, { 231,-43287 }, + { 232,-43287 }, { 233,-43287 }, { 234,-43287 }, { 235,-43287 }, { 236,-43287 }, + { 237,-43287 }, { 238,-43287 }, { 239,-43287 }, { 240,-43287 }, { 241,-43287 }, + { 242,-43287 }, { 243,-43287 }, { 244,-43287 }, { 245,-43287 }, { 246,-43287 }, + + { 247,-43287 }, { 248,-43287 }, { 249,-43287 }, { 250,-43287 }, { 251,-43287 }, + { 252,-43287 }, { 253,-43287 }, { 254,-43287 }, { 255,-43287 }, { 0, 131 }, + { 0,48579 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-43544 }, { 49,-43544 }, + { 50,-43544 }, { 51,-43544 }, { 52,-43544 }, { 53,-43544 }, { 54,-43544 }, + { 55,-43544 }, { 56,-43544 }, { 57,-43544 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-43544 }, { 66,-43544 }, { 67,-43544 }, { 68,-43544 }, { 69,-43544 }, + { 70,-43544 }, { 71,-43544 }, { 72,-43544 }, { 73,-43544 }, { 74,-43544 }, + { 75,-43544 }, { 76,-43544 }, { 77,-43544 }, { 78,13369 }, { 79,-43544 }, + { 80,-43544 }, { 81,-43544 }, { 82,-43544 }, { 83,-43544 }, { 84,-43544 }, + { 85,-43544 }, { 86,-43544 }, { 87,-43544 }, { 88,-43544 }, { 89,-43544 }, + + { 90,-43544 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-43544 }, { 0, 0 }, { 97,-43544 }, { 98,-43544 }, { 99,-43544 }, + { 100,-43544 }, { 101,-43544 }, { 102,-43544 }, { 103,-43544 }, { 104,-43544 }, + { 105,-43544 }, { 106,-43544 }, { 107,-43544 }, { 108,-43544 }, { 109,-43544 }, + { 110,13369 }, { 111,-43544 }, { 112,-43544 }, { 113,-43544 }, { 114,-43544 }, + { 115,-43544 }, { 116,-43544 }, { 117,-43544 }, { 118,-43544 }, { 119,-43544 }, + { 120,-43544 }, { 121,-43544 }, { 122,-43544 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-43544 }, { 128,-43544 }, { 129,-43544 }, + { 130,-43544 }, { 131,-43544 }, { 132,-43544 }, { 133,-43544 }, { 134,-43544 }, + { 135,-43544 }, { 136,-43544 }, { 137,-43544 }, { 138,-43544 }, { 139,-43544 }, + + { 140,-43544 }, { 141,-43544 }, { 142,-43544 }, { 143,-43544 }, { 144,-43544 }, + { 145,-43544 }, { 146,-43544 }, { 147,-43544 }, { 148,-43544 }, { 149,-43544 }, + { 150,-43544 }, { 151,-43544 }, { 152,-43544 }, { 153,-43544 }, { 154,-43544 }, + { 155,-43544 }, { 156,-43544 }, { 157,-43544 }, { 158,-43544 }, { 159,-43544 }, + { 160,-43544 }, { 161,-43544 }, { 162,-43544 }, { 163,-43544 }, { 164,-43544 }, + { 165,-43544 }, { 166,-43544 }, { 167,-43544 }, { 168,-43544 }, { 169,-43544 }, + { 170,-43544 }, { 171,-43544 }, { 172,-43544 }, { 173,-43544 }, { 174,-43544 }, + { 175,-43544 }, { 176,-43544 }, { 177,-43544 }, { 178,-43544 }, { 179,-43544 }, + { 180,-43544 }, { 181,-43544 }, { 182,-43544 }, { 183,-43544 }, { 184,-43544 }, + { 185,-43544 }, { 186,-43544 }, { 187,-43544 }, { 188,-43544 }, { 189,-43544 }, + + { 190,-43544 }, { 191,-43544 }, { 192,-43544 }, { 193,-43544 }, { 194,-43544 }, + { 195,-43544 }, { 196,-43544 }, { 197,-43544 }, { 198,-43544 }, { 199,-43544 }, + { 200,-43544 }, { 201,-43544 }, { 202,-43544 }, { 203,-43544 }, { 204,-43544 }, + { 205,-43544 }, { 206,-43544 }, { 207,-43544 }, { 208,-43544 }, { 209,-43544 }, + { 210,-43544 }, { 211,-43544 }, { 212,-43544 }, { 213,-43544 }, { 214,-43544 }, + { 215,-43544 }, { 216,-43544 }, { 217,-43544 }, { 218,-43544 }, { 219,-43544 }, + { 220,-43544 }, { 221,-43544 }, { 222,-43544 }, { 223,-43544 }, { 224,-43544 }, + { 225,-43544 }, { 226,-43544 }, { 227,-43544 }, { 228,-43544 }, { 229,-43544 }, + { 230,-43544 }, { 231,-43544 }, { 232,-43544 }, { 233,-43544 }, { 234,-43544 }, + { 235,-43544 }, { 236,-43544 }, { 237,-43544 }, { 238,-43544 }, { 239,-43544 }, + + { 240,-43544 }, { 241,-43544 }, { 242,-43544 }, { 243,-43544 }, { 244,-43544 }, + { 245,-43544 }, { 246,-43544 }, { 247,-43544 }, { 248,-43544 }, { 249,-43544 }, + { 250,-43544 }, { 251,-43544 }, { 252,-43544 }, { 253,-43544 }, { 254,-43544 }, + { 255,-43544 }, { 0, 131 }, { 0,48322 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-43801 }, { 49,-43801 }, { 50,-43801 }, { 51,-43801 }, { 52,-43801 }, + { 53,-43801 }, { 54,-43801 }, { 55,-43801 }, { 56,-43801 }, { 57,-43801 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-43801 }, { 66,-43801 }, { 67,-43801 }, + { 68,-43801 }, { 69,-43801 }, { 70,-43801 }, { 71,-43801 }, { 72,-43801 }, + { 73,-43801 }, { 74,-43801 }, { 75,-43801 }, { 76,-43801 }, { 77,-43801 }, + { 78,-43801 }, { 79,-43801 }, { 80,-43801 }, { 81,-43801 }, { 82,-43801 }, + + { 83,-43801 }, { 84,13369 }, { 85,-43801 }, { 86,-43801 }, { 87,-43801 }, + { 88,-43801 }, { 89,-43801 }, { 90,-43801 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-43801 }, { 0, 0 }, { 97,-43801 }, + { 98,-43801 }, { 99,-43801 }, { 100,-43801 }, { 101,-43801 }, { 102,-43801 }, + { 103,-43801 }, { 104,-43801 }, { 105,-43801 }, { 106,-43801 }, { 107,-43801 }, + { 108,-43801 }, { 109,-43801 }, { 110,-43801 }, { 111,-43801 }, { 112,-43801 }, + { 113,-43801 }, { 114,-43801 }, { 115,-43801 }, { 116,13369 }, { 117,-43801 }, + { 118,-43801 }, { 119,-43801 }, { 120,-43801 }, { 121,-43801 }, { 122,-43801 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-43801 }, + { 128,-43801 }, { 129,-43801 }, { 130,-43801 }, { 131,-43801 }, { 132,-43801 }, + + { 133,-43801 }, { 134,-43801 }, { 135,-43801 }, { 136,-43801 }, { 137,-43801 }, + { 138,-43801 }, { 139,-43801 }, { 140,-43801 }, { 141,-43801 }, { 142,-43801 }, + { 143,-43801 }, { 144,-43801 }, { 145,-43801 }, { 146,-43801 }, { 147,-43801 }, + { 148,-43801 }, { 149,-43801 }, { 150,-43801 }, { 151,-43801 }, { 152,-43801 }, + { 153,-43801 }, { 154,-43801 }, { 155,-43801 }, { 156,-43801 }, { 157,-43801 }, + { 158,-43801 }, { 159,-43801 }, { 160,-43801 }, { 161,-43801 }, { 162,-43801 }, + { 163,-43801 }, { 164,-43801 }, { 165,-43801 }, { 166,-43801 }, { 167,-43801 }, + { 168,-43801 }, { 169,-43801 }, { 170,-43801 }, { 171,-43801 }, { 172,-43801 }, + { 173,-43801 }, { 174,-43801 }, { 175,-43801 }, { 176,-43801 }, { 177,-43801 }, + { 178,-43801 }, { 179,-43801 }, { 180,-43801 }, { 181,-43801 }, { 182,-43801 }, + + { 183,-43801 }, { 184,-43801 }, { 185,-43801 }, { 186,-43801 }, { 187,-43801 }, + { 188,-43801 }, { 189,-43801 }, { 190,-43801 }, { 191,-43801 }, { 192,-43801 }, + { 193,-43801 }, { 194,-43801 }, { 195,-43801 }, { 196,-43801 }, { 197,-43801 }, + { 198,-43801 }, { 199,-43801 }, { 200,-43801 }, { 201,-43801 }, { 202,-43801 }, + { 203,-43801 }, { 204,-43801 }, { 205,-43801 }, { 206,-43801 }, { 207,-43801 }, + { 208,-43801 }, { 209,-43801 }, { 210,-43801 }, { 211,-43801 }, { 212,-43801 }, + { 213,-43801 }, { 214,-43801 }, { 215,-43801 }, { 216,-43801 }, { 217,-43801 }, + { 218,-43801 }, { 219,-43801 }, { 220,-43801 }, { 221,-43801 }, { 222,-43801 }, + { 223,-43801 }, { 224,-43801 }, { 225,-43801 }, { 226,-43801 }, { 227,-43801 }, + { 228,-43801 }, { 229,-43801 }, { 230,-43801 }, { 231,-43801 }, { 232,-43801 }, + + { 233,-43801 }, { 234,-43801 }, { 235,-43801 }, { 236,-43801 }, { 237,-43801 }, + { 238,-43801 }, { 239,-43801 }, { 240,-43801 }, { 241,-43801 }, { 242,-43801 }, + { 243,-43801 }, { 244,-43801 }, { 245,-43801 }, { 246,-43801 }, { 247,-43801 }, + { 248,-43801 }, { 249,-43801 }, { 250,-43801 }, { 251,-43801 }, { 252,-43801 }, + { 253,-43801 }, { 254,-43801 }, { 255,-43801 }, { 0, 131 }, { 0,48065 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-44058 }, { 49,-44058 }, { 50,-44058 }, + { 51,-44058 }, { 52,-44058 }, { 53,-44058 }, { 54,-44058 }, { 55,-44058 }, + { 56,-44058 }, { 57,-44058 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-44058 }, + { 66,-44058 }, { 67,-44058 }, { 68,-44058 }, { 69,-44058 }, { 70,-44058 }, + { 71,-44058 }, { 72,-44058 }, { 73,-44058 }, { 74,-44058 }, { 75,-44058 }, + + { 76,-44058 }, { 77,13369 }, { 78,-44058 }, { 79,-44058 }, { 80,-44058 }, + { 81,-44058 }, { 82,-44058 }, { 83,-44058 }, { 84,-44058 }, { 85,-44058 }, + { 86,-44058 }, { 87,-44058 }, { 88,-44058 }, { 89,-44058 }, { 90,-44058 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-44058 }, + { 0, 0 }, { 97,-44058 }, { 98,-44058 }, { 99,-44058 }, { 100,-44058 }, + { 101,-44058 }, { 102,-44058 }, { 103,-44058 }, { 104,-44058 }, { 105,-44058 }, + { 106,-44058 }, { 107,-44058 }, { 108,-44058 }, { 109,13369 }, { 110,-44058 }, + { 111,-44058 }, { 112,-44058 }, { 113,-44058 }, { 114,-44058 }, { 115,-44058 }, + { 116,-44058 }, { 117,-44058 }, { 118,-44058 }, { 119,-44058 }, { 120,-44058 }, + { 121,-44058 }, { 122,-44058 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 127,-44058 }, { 128,-44058 }, { 129,-44058 }, { 130,-44058 }, + { 131,-44058 }, { 132,-44058 }, { 133,-44058 }, { 134,-44058 }, { 135,-44058 }, + { 136,-44058 }, { 137,-44058 }, { 138,-44058 }, { 139,-44058 }, { 140,-44058 }, + { 141,-44058 }, { 142,-44058 }, { 143,-44058 }, { 144,-44058 }, { 145,-44058 }, + { 146,-44058 }, { 147,-44058 }, { 148,-44058 }, { 149,-44058 }, { 150,-44058 }, + { 151,-44058 }, { 152,-44058 }, { 153,-44058 }, { 154,-44058 }, { 155,-44058 }, + { 156,-44058 }, { 157,-44058 }, { 158,-44058 }, { 159,-44058 }, { 160,-44058 }, + { 161,-44058 }, { 162,-44058 }, { 163,-44058 }, { 164,-44058 }, { 165,-44058 }, + { 166,-44058 }, { 167,-44058 }, { 168,-44058 }, { 169,-44058 }, { 170,-44058 }, + { 171,-44058 }, { 172,-44058 }, { 173,-44058 }, { 174,-44058 }, { 175,-44058 }, + + { 176,-44058 }, { 177,-44058 }, { 178,-44058 }, { 179,-44058 }, { 180,-44058 }, + { 181,-44058 }, { 182,-44058 }, { 183,-44058 }, { 184,-44058 }, { 185,-44058 }, + { 186,-44058 }, { 187,-44058 }, { 188,-44058 }, { 189,-44058 }, { 190,-44058 }, + { 191,-44058 }, { 192,-44058 }, { 193,-44058 }, { 194,-44058 }, { 195,-44058 }, + { 196,-44058 }, { 197,-44058 }, { 198,-44058 }, { 199,-44058 }, { 200,-44058 }, + { 201,-44058 }, { 202,-44058 }, { 203,-44058 }, { 204,-44058 }, { 205,-44058 }, + { 206,-44058 }, { 207,-44058 }, { 208,-44058 }, { 209,-44058 }, { 210,-44058 }, + { 211,-44058 }, { 212,-44058 }, { 213,-44058 }, { 214,-44058 }, { 215,-44058 }, + { 216,-44058 }, { 217,-44058 }, { 218,-44058 }, { 219,-44058 }, { 220,-44058 }, + { 221,-44058 }, { 222,-44058 }, { 223,-44058 }, { 224,-44058 }, { 225,-44058 }, + + { 226,-44058 }, { 227,-44058 }, { 228,-44058 }, { 229,-44058 }, { 230,-44058 }, + { 231,-44058 }, { 232,-44058 }, { 233,-44058 }, { 234,-44058 }, { 235,-44058 }, + { 236,-44058 }, { 237,-44058 }, { 238,-44058 }, { 239,-44058 }, { 240,-44058 }, + { 241,-44058 }, { 242,-44058 }, { 243,-44058 }, { 244,-44058 }, { 245,-44058 }, + { 246,-44058 }, { 247,-44058 }, { 248,-44058 }, { 249,-44058 }, { 250,-44058 }, + { 251,-44058 }, { 252,-44058 }, { 253,-44058 }, { 254,-44058 }, { 255,-44058 }, + { 0, 131 }, { 0,47808 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-44315 }, + { 49,-44315 }, { 50,-44315 }, { 51,-44315 }, { 52,-44315 }, { 53,-44315 }, + { 54,-44315 }, { 55,-44315 }, { 56,-44315 }, { 57,-44315 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,13369 }, { 66,-44315 }, { 67,-44315 }, { 68,-44315 }, + + { 69,-44315 }, { 70,-44315 }, { 71,-44315 }, { 72,-44315 }, { 73,-44315 }, + { 74,-44315 }, { 75,-44315 }, { 76,-44315 }, { 77,-44315 }, { 78,-44315 }, + { 79,-44315 }, { 80,-44315 }, { 81,-44315 }, { 82,-44315 }, { 83,-44315 }, + { 84,-44315 }, { 85,-44315 }, { 86,-44315 }, { 87,-44315 }, { 88,-44315 }, + { 89,-44315 }, { 90,-44315 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-44315 }, { 0, 0 }, { 97,13369 }, { 98,-44315 }, + { 99,-44315 }, { 100,-44315 }, { 101,-44315 }, { 102,-44315 }, { 103,-44315 }, + { 104,-44315 }, { 105,-44315 }, { 106,-44315 }, { 107,-44315 }, { 108,-44315 }, + { 109,-44315 }, { 110,-44315 }, { 111,-44315 }, { 112,-44315 }, { 113,-44315 }, + { 114,-44315 }, { 115,-44315 }, { 116,-44315 }, { 117,-44315 }, { 118,-44315 }, + + { 119,-44315 }, { 120,-44315 }, { 121,-44315 }, { 122,-44315 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-44315 }, { 128,-44315 }, + { 129,-44315 }, { 130,-44315 }, { 131,-44315 }, { 132,-44315 }, { 133,-44315 }, + { 134,-44315 }, { 135,-44315 }, { 136,-44315 }, { 137,-44315 }, { 138,-44315 }, + { 139,-44315 }, { 140,-44315 }, { 141,-44315 }, { 142,-44315 }, { 143,-44315 }, + { 144,-44315 }, { 145,-44315 }, { 146,-44315 }, { 147,-44315 }, { 148,-44315 }, + { 149,-44315 }, { 150,-44315 }, { 151,-44315 }, { 152,-44315 }, { 153,-44315 }, + { 154,-44315 }, { 155,-44315 }, { 156,-44315 }, { 157,-44315 }, { 158,-44315 }, + { 159,-44315 }, { 160,-44315 }, { 161,-44315 }, { 162,-44315 }, { 163,-44315 }, + { 164,-44315 }, { 165,-44315 }, { 166,-44315 }, { 167,-44315 }, { 168,-44315 }, + + { 169,-44315 }, { 170,-44315 }, { 171,-44315 }, { 172,-44315 }, { 173,-44315 }, + { 174,-44315 }, { 175,-44315 }, { 176,-44315 }, { 177,-44315 }, { 178,-44315 }, + { 179,-44315 }, { 180,-44315 }, { 181,-44315 }, { 182,-44315 }, { 183,-44315 }, + { 184,-44315 }, { 185,-44315 }, { 186,-44315 }, { 187,-44315 }, { 188,-44315 }, + { 189,-44315 }, { 190,-44315 }, { 191,-44315 }, { 192,-44315 }, { 193,-44315 }, + { 194,-44315 }, { 195,-44315 }, { 196,-44315 }, { 197,-44315 }, { 198,-44315 }, + { 199,-44315 }, { 200,-44315 }, { 201,-44315 }, { 202,-44315 }, { 203,-44315 }, + { 204,-44315 }, { 205,-44315 }, { 206,-44315 }, { 207,-44315 }, { 208,-44315 }, + { 209,-44315 }, { 210,-44315 }, { 211,-44315 }, { 212,-44315 }, { 213,-44315 }, + { 214,-44315 }, { 215,-44315 }, { 216,-44315 }, { 217,-44315 }, { 218,-44315 }, + + { 219,-44315 }, { 220,-44315 }, { 221,-44315 }, { 222,-44315 }, { 223,-44315 }, + { 224,-44315 }, { 225,-44315 }, { 226,-44315 }, { 227,-44315 }, { 228,-44315 }, + { 229,-44315 }, { 230,-44315 }, { 231,-44315 }, { 232,-44315 }, { 233,-44315 }, + { 234,-44315 }, { 235,-44315 }, { 236,-44315 }, { 237,-44315 }, { 238,-44315 }, + { 239,-44315 }, { 240,-44315 }, { 241,-44315 }, { 242,-44315 }, { 243,-44315 }, + { 244,-44315 }, { 245,-44315 }, { 246,-44315 }, { 247,-44315 }, { 248,-44315 }, + { 249,-44315 }, { 250,-44315 }, { 251,-44315 }, { 252,-44315 }, { 253,-44315 }, + { 254,-44315 }, { 255,-44315 }, { 0, 0 }, { 0,47551 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 131 }, { 0,47546 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 9,-39424 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 32,-39424 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 41,-39422 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-44577 }, { 49,-44577 }, { 50,-44577 }, { 51,-44577 }, + { 52,-44577 }, { 53,-44577 }, { 54,-44577 }, { 55,-44577 }, { 56,-44577 }, + + { 57,-44577 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 69,-39404 }, { 65,13364 }, { 66,-44577 }, + { 67,-44577 }, { 68,-44577 }, { 69,-44577 }, { 70,-44577 }, { 71,-44577 }, + { 72,-44577 }, { 73,-44577 }, { 74,-44577 }, { 75,-44577 }, { 76,-44577 }, + { 77,-44577 }, { 78,-44577 }, { 79,-44577 }, { 80,-44577 }, { 81,-44577 }, + { 82,-44577 }, { 83,-44577 }, { 84,-44577 }, { 85,-44577 }, { 86,-44577 }, + { 87,-44577 }, { 88,-44577 }, { 89,-44577 }, { 90,-44577 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-44577 }, { 101,-39404 }, + { 97,13364 }, { 98,-44577 }, { 99,-44577 }, { 100,-44577 }, { 101,-44577 }, + { 102,-44577 }, { 103,-44577 }, { 104,-44577 }, { 105,-44577 }, { 106,-44577 }, + + { 107,-44577 }, { 108,-44577 }, { 109,-44577 }, { 110,-44577 }, { 111,-44577 }, + { 112,-44577 }, { 113,-44577 }, { 114,-44577 }, { 115,-44577 }, { 116,-44577 }, + { 117,-44577 }, { 118,-44577 }, { 119,-44577 }, { 120,-44577 }, { 121,-44577 }, + { 122,-44577 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-44577 }, { 128,-44577 }, { 129,-44577 }, { 130,-44577 }, { 131,-44577 }, + { 132,-44577 }, { 133,-44577 }, { 134,-44577 }, { 135,-44577 }, { 136,-44577 }, + { 137,-44577 }, { 138,-44577 }, { 139,-44577 }, { 140,-44577 }, { 141,-44577 }, + { 142,-44577 }, { 143,-44577 }, { 144,-44577 }, { 145,-44577 }, { 146,-44577 }, + { 147,-44577 }, { 148,-44577 }, { 149,-44577 }, { 150,-44577 }, { 151,-44577 }, + { 152,-44577 }, { 153,-44577 }, { 154,-44577 }, { 155,-44577 }, { 156,-44577 }, + + { 157,-44577 }, { 158,-44577 }, { 159,-44577 }, { 160,-44577 }, { 161,-44577 }, + { 162,-44577 }, { 163,-44577 }, { 164,-44577 }, { 165,-44577 }, { 166,-44577 }, + { 167,-44577 }, { 168,-44577 }, { 169,-44577 }, { 170,-44577 }, { 171,-44577 }, + { 172,-44577 }, { 173,-44577 }, { 174,-44577 }, { 175,-44577 }, { 176,-44577 }, + { 177,-44577 }, { 178,-44577 }, { 179,-44577 }, { 180,-44577 }, { 181,-44577 }, + { 182,-44577 }, { 183,-44577 }, { 184,-44577 }, { 185,-44577 }, { 186,-44577 }, + { 187,-44577 }, { 188,-44577 }, { 189,-44577 }, { 190,-44577 }, { 191,-44577 }, + { 192,-44577 }, { 193,-44577 }, { 194,-44577 }, { 195,-44577 }, { 196,-44577 }, + { 197,-44577 }, { 198,-44577 }, { 199,-44577 }, { 200,-44577 }, { 201,-44577 }, + { 202,-44577 }, { 203,-44577 }, { 204,-44577 }, { 205,-44577 }, { 206,-44577 }, + + { 207,-44577 }, { 208,-44577 }, { 209,-44577 }, { 210,-44577 }, { 211,-44577 }, + { 212,-44577 }, { 213,-44577 }, { 214,-44577 }, { 215,-44577 }, { 216,-44577 }, + { 217,-44577 }, { 218,-44577 }, { 219,-44577 }, { 220,-44577 }, { 221,-44577 }, + { 222,-44577 }, { 223,-44577 }, { 224,-44577 }, { 225,-44577 }, { 226,-44577 }, + { 227,-44577 }, { 228,-44577 }, { 229,-44577 }, { 230,-44577 }, { 231,-44577 }, + { 232,-44577 }, { 233,-44577 }, { 234,-44577 }, { 235,-44577 }, { 236,-44577 }, + { 237,-44577 }, { 238,-44577 }, { 239,-44577 }, { 240,-44577 }, { 241,-44577 }, + { 242,-44577 }, { 243,-44577 }, { 244,-44577 }, { 245,-44577 }, { 246,-44577 }, + { 247,-44577 }, { 248,-44577 }, { 249,-44577 }, { 250,-44577 }, { 251,-44577 }, + { 252,-44577 }, { 253,-44577 }, { 254,-44577 }, { 255,-44577 }, { 0, 77 }, + + { 0,47289 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-44834 }, { 49,-44834 }, + + { 50,-44834 }, { 51,-44834 }, { 52,-44834 }, { 53,-44834 }, { 54,-44834 }, + { 55,-44834 }, { 56,-44834 }, { 57,-44834 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-44834 }, { 66,-44834 }, { 67,-44834 }, { 68,-44834 }, { 69,-44834 }, + { 70,-44834 }, { 71,-44834 }, { 72,-44834 }, { 73,-44834 }, { 74,-44834 }, + { 75,-44834 }, { 76,-44834 }, { 77,-44834 }, { 78,-44834 }, { 79,-44834 }, + { 80,-44834 }, { 81,-44834 }, { 82,-44834 }, { 83,-44834 }, { 84,-44834 }, + { 85,-44834 }, { 86,-44834 }, { 87,-44834 }, { 88,-44834 }, { 89,-44834 }, + { 90,-44834 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-44834 }, { 0, 0 }, { 97,-44834 }, { 98,-44834 }, { 99,-44834 }, + + { 100,-44834 }, { 101,-44834 }, { 102,-44834 }, { 103,-44834 }, { 104,-44834 }, + { 105,-44834 }, { 106,-44834 }, { 107,-44834 }, { 108,-44834 }, { 109,-44834 }, + { 110,-44834 }, { 111,-44834 }, { 112,-44834 }, { 113,-44834 }, { 114,-44834 }, + { 115,-44834 }, { 116,-44834 }, { 117,-44834 }, { 118,-44834 }, { 119,-44834 }, + { 120,-44834 }, { 121,-44834 }, { 122,-44834 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-44834 }, { 128,-44834 }, { 129,-44834 }, + { 130,-44834 }, { 131,-44834 }, { 132,-44834 }, { 133,-44834 }, { 134,-44834 }, + { 135,-44834 }, { 136,-44834 }, { 137,-44834 }, { 138,-44834 }, { 139,-44834 }, + { 140,-44834 }, { 141,-44834 }, { 142,-44834 }, { 143,-44834 }, { 144,-44834 }, + { 145,-44834 }, { 146,-44834 }, { 147,-44834 }, { 148,-44834 }, { 149,-44834 }, + + { 150,-44834 }, { 151,-44834 }, { 152,-44834 }, { 153,-44834 }, { 154,-44834 }, + { 155,-44834 }, { 156,-44834 }, { 157,-44834 }, { 158,-44834 }, { 159,-44834 }, + { 160,-44834 }, { 161,-44834 }, { 162,-44834 }, { 163,-44834 }, { 164,-44834 }, + { 165,-44834 }, { 166,-44834 }, { 167,-44834 }, { 168,-44834 }, { 169,-44834 }, + { 170,-44834 }, { 171,-44834 }, { 172,-44834 }, { 173,-44834 }, { 174,-44834 }, + { 175,-44834 }, { 176,-44834 }, { 177,-44834 }, { 178,-44834 }, { 179,-44834 }, + { 180,-44834 }, { 181,-44834 }, { 182,-44834 }, { 183,-44834 }, { 184,-44834 }, + { 185,-44834 }, { 186,-44834 }, { 187,-44834 }, { 188,-44834 }, { 189,-44834 }, + { 190,-44834 }, { 191,-44834 }, { 192,-44834 }, { 193,-44834 }, { 194,-44834 }, + { 195,-44834 }, { 196,-44834 }, { 197,-44834 }, { 198,-44834 }, { 199,-44834 }, + + { 200,-44834 }, { 201,-44834 }, { 202,-44834 }, { 203,-44834 }, { 204,-44834 }, + { 205,-44834 }, { 206,-44834 }, { 207,-44834 }, { 208,-44834 }, { 209,-44834 }, + { 210,-44834 }, { 211,-44834 }, { 212,-44834 }, { 213,-44834 }, { 214,-44834 }, + { 215,-44834 }, { 216,-44834 }, { 217,-44834 }, { 218,-44834 }, { 219,-44834 }, + { 220,-44834 }, { 221,-44834 }, { 222,-44834 }, { 223,-44834 }, { 224,-44834 }, + { 225,-44834 }, { 226,-44834 }, { 227,-44834 }, { 228,-44834 }, { 229,-44834 }, + { 230,-44834 }, { 231,-44834 }, { 232,-44834 }, { 233,-44834 }, { 234,-44834 }, + { 235,-44834 }, { 236,-44834 }, { 237,-44834 }, { 238,-44834 }, { 239,-44834 }, + { 240,-44834 }, { 241,-44834 }, { 242,-44834 }, { 243,-44834 }, { 244,-44834 }, + { 245,-44834 }, { 246,-44834 }, { 247,-44834 }, { 248,-44834 }, { 249,-44834 }, + + { 250,-44834 }, { 251,-44834 }, { 252,-44834 }, { 253,-44834 }, { 254,-44834 }, + { 255,-44834 }, { 0, 50 }, { 0,47032 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-45091 }, { 49,-45091 }, { 50,-45091 }, { 51,-45091 }, { 52,-45091 }, + { 53,-45091 }, { 54,-45091 }, { 55,-45091 }, { 56,-45091 }, { 57,-45091 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-45091 }, { 66,-45091 }, { 67,-45091 }, + { 68,-45091 }, { 69,-45091 }, { 70,-45091 }, { 71,-45091 }, { 72,-45091 }, + { 73,-45091 }, { 74,-45091 }, { 75,-45091 }, { 76,-45091 }, { 77,-45091 }, + { 78,-45091 }, { 79,-45091 }, { 80,-45091 }, { 81,-45091 }, { 82,-45091 }, + { 83,-45091 }, { 84,-45091 }, { 85,-45091 }, { 86,-45091 }, { 87,-45091 }, + { 88,-45091 }, { 89,-45091 }, { 90,-45091 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 95,-45091 }, { 0, 0 }, { 97,-45091 }, + { 98,-45091 }, { 99,-45091 }, { 100,-45091 }, { 101,-45091 }, { 102,-45091 }, + { 103,-45091 }, { 104,-45091 }, { 105,-45091 }, { 106,-45091 }, { 107,-45091 }, + { 108,-45091 }, { 109,-45091 }, { 110,-45091 }, { 111,-45091 }, { 112,-45091 }, + { 113,-45091 }, { 114,-45091 }, { 115,-45091 }, { 116,-45091 }, { 117,-45091 }, + { 118,-45091 }, { 119,-45091 }, { 120,-45091 }, { 121,-45091 }, { 122,-45091 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-45091 }, + { 128,-45091 }, { 129,-45091 }, { 130,-45091 }, { 131,-45091 }, { 132,-45091 }, + { 133,-45091 }, { 134,-45091 }, { 135,-45091 }, { 136,-45091 }, { 137,-45091 }, + { 138,-45091 }, { 139,-45091 }, { 140,-45091 }, { 141,-45091 }, { 142,-45091 }, + + { 143,-45091 }, { 144,-45091 }, { 145,-45091 }, { 146,-45091 }, { 147,-45091 }, + { 148,-45091 }, { 149,-45091 }, { 150,-45091 }, { 151,-45091 }, { 152,-45091 }, + { 153,-45091 }, { 154,-45091 }, { 155,-45091 }, { 156,-45091 }, { 157,-45091 }, + { 158,-45091 }, { 159,-45091 }, { 160,-45091 }, { 161,-45091 }, { 162,-45091 }, + { 163,-45091 }, { 164,-45091 }, { 165,-45091 }, { 166,-45091 }, { 167,-45091 }, + { 168,-45091 }, { 169,-45091 }, { 170,-45091 }, { 171,-45091 }, { 172,-45091 }, + { 173,-45091 }, { 174,-45091 }, { 175,-45091 }, { 176,-45091 }, { 177,-45091 }, + { 178,-45091 }, { 179,-45091 }, { 180,-45091 }, { 181,-45091 }, { 182,-45091 }, + { 183,-45091 }, { 184,-45091 }, { 185,-45091 }, { 186,-45091 }, { 187,-45091 }, + { 188,-45091 }, { 189,-45091 }, { 190,-45091 }, { 191,-45091 }, { 192,-45091 }, + + { 193,-45091 }, { 194,-45091 }, { 195,-45091 }, { 196,-45091 }, { 197,-45091 }, + { 198,-45091 }, { 199,-45091 }, { 200,-45091 }, { 201,-45091 }, { 202,-45091 }, + { 203,-45091 }, { 204,-45091 }, { 205,-45091 }, { 206,-45091 }, { 207,-45091 }, + { 208,-45091 }, { 209,-45091 }, { 210,-45091 }, { 211,-45091 }, { 212,-45091 }, + { 213,-45091 }, { 214,-45091 }, { 215,-45091 }, { 216,-45091 }, { 217,-45091 }, + { 218,-45091 }, { 219,-45091 }, { 220,-45091 }, { 221,-45091 }, { 222,-45091 }, + { 223,-45091 }, { 224,-45091 }, { 225,-45091 }, { 226,-45091 }, { 227,-45091 }, + { 228,-45091 }, { 229,-45091 }, { 230,-45091 }, { 231,-45091 }, { 232,-45091 }, + { 233,-45091 }, { 234,-45091 }, { 235,-45091 }, { 236,-45091 }, { 237,-45091 }, + { 238,-45091 }, { 239,-45091 }, { 240,-45091 }, { 241,-45091 }, { 242,-45091 }, + + { 243,-45091 }, { 244,-45091 }, { 245,-45091 }, { 246,-45091 }, { 247,-45091 }, + { 248,-45091 }, { 249,-45091 }, { 250,-45091 }, { 251,-45091 }, { 252,-45091 }, + { 253,-45091 }, { 254,-45091 }, { 255,-45091 }, { 0, 131 }, { 0,46775 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-45348 }, { 49,-45348 }, { 50,-45348 }, + { 51,-45348 }, { 52,-45348 }, { 53,-45348 }, { 54,-45348 }, { 55,-45348 }, + { 56,-45348 }, { 57,-45348 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-45348 }, + { 66,12850 }, { 67,-45348 }, { 68,-45348 }, { 69,-45348 }, { 70,-45348 }, + { 71,-45348 }, { 72,-45348 }, { 73,-45348 }, { 74,-45348 }, { 75,-45348 }, + { 76,-45348 }, { 77,-45348 }, { 78,-45348 }, { 79,-45348 }, { 80,-45348 }, + { 81,-45348 }, { 82,-45348 }, { 83,-45348 }, { 84,-45348 }, { 85,-45348 }, + + { 86,-45348 }, { 87,-45348 }, { 88,-45348 }, { 89,-45348 }, { 90,-45348 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-45348 }, + { 0, 0 }, { 97,-45348 }, { 98,12850 }, { 99,-45348 }, { 100,-45348 }, + { 101,-45348 }, { 102,-45348 }, { 103,-45348 }, { 104,-45348 }, { 105,-45348 }, + { 106,-45348 }, { 107,-45348 }, { 108,-45348 }, { 109,-45348 }, { 110,-45348 }, + { 111,-45348 }, { 112,-45348 }, { 113,-45348 }, { 114,-45348 }, { 115,-45348 }, + { 116,-45348 }, { 117,-45348 }, { 118,-45348 }, { 119,-45348 }, { 120,-45348 }, + { 121,-45348 }, { 122,-45348 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-45348 }, { 128,-45348 }, { 129,-45348 }, { 130,-45348 }, + { 131,-45348 }, { 132,-45348 }, { 133,-45348 }, { 134,-45348 }, { 135,-45348 }, + + { 136,-45348 }, { 137,-45348 }, { 138,-45348 }, { 139,-45348 }, { 140,-45348 }, + { 141,-45348 }, { 142,-45348 }, { 143,-45348 }, { 144,-45348 }, { 145,-45348 }, + { 146,-45348 }, { 147,-45348 }, { 148,-45348 }, { 149,-45348 }, { 150,-45348 }, + { 151,-45348 }, { 152,-45348 }, { 153,-45348 }, { 154,-45348 }, { 155,-45348 }, + { 156,-45348 }, { 157,-45348 }, { 158,-45348 }, { 159,-45348 }, { 160,-45348 }, + { 161,-45348 }, { 162,-45348 }, { 163,-45348 }, { 164,-45348 }, { 165,-45348 }, + { 166,-45348 }, { 167,-45348 }, { 168,-45348 }, { 169,-45348 }, { 170,-45348 }, + { 171,-45348 }, { 172,-45348 }, { 173,-45348 }, { 174,-45348 }, { 175,-45348 }, + { 176,-45348 }, { 177,-45348 }, { 178,-45348 }, { 179,-45348 }, { 180,-45348 }, + { 181,-45348 }, { 182,-45348 }, { 183,-45348 }, { 184,-45348 }, { 185,-45348 }, + + { 186,-45348 }, { 187,-45348 }, { 188,-45348 }, { 189,-45348 }, { 190,-45348 }, + { 191,-45348 }, { 192,-45348 }, { 193,-45348 }, { 194,-45348 }, { 195,-45348 }, + { 196,-45348 }, { 197,-45348 }, { 198,-45348 }, { 199,-45348 }, { 200,-45348 }, + { 201,-45348 }, { 202,-45348 }, { 203,-45348 }, { 204,-45348 }, { 205,-45348 }, + { 206,-45348 }, { 207,-45348 }, { 208,-45348 }, { 209,-45348 }, { 210,-45348 }, + { 211,-45348 }, { 212,-45348 }, { 213,-45348 }, { 214,-45348 }, { 215,-45348 }, + { 216,-45348 }, { 217,-45348 }, { 218,-45348 }, { 219,-45348 }, { 220,-45348 }, + { 221,-45348 }, { 222,-45348 }, { 223,-45348 }, { 224,-45348 }, { 225,-45348 }, + { 226,-45348 }, { 227,-45348 }, { 228,-45348 }, { 229,-45348 }, { 230,-45348 }, + { 231,-45348 }, { 232,-45348 }, { 233,-45348 }, { 234,-45348 }, { 235,-45348 }, + + { 236,-45348 }, { 237,-45348 }, { 238,-45348 }, { 239,-45348 }, { 240,-45348 }, + { 241,-45348 }, { 242,-45348 }, { 243,-45348 }, { 244,-45348 }, { 245,-45348 }, + { 246,-45348 }, { 247,-45348 }, { 248,-45348 }, { 249,-45348 }, { 250,-45348 }, + { 251,-45348 }, { 252,-45348 }, { 253,-45348 }, { 254,-45348 }, { 255,-45348 }, + { 0, 57 }, { 0,46518 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-45605 }, + { 49,-45605 }, { 50,-45605 }, { 51,-45605 }, { 52,-45605 }, { 53,-45605 }, + { 54,-45605 }, { 55,-45605 }, { 56,-45605 }, { 57,-45605 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-45605 }, { 66,-45605 }, { 67,-45605 }, { 68,-45605 }, + { 69,-45605 }, { 70,-45605 }, { 71,-45605 }, { 72,-45605 }, { 73,-45605 }, + { 74,-45605 }, { 75,-45605 }, { 76,-45605 }, { 77,-45605 }, { 78,-45605 }, + + { 79,-45605 }, { 80,-45605 }, { 81,-45605 }, { 82,-45605 }, { 83,-45605 }, + { 84,-45605 }, { 85,-45605 }, { 86,-45605 }, { 87,-45605 }, { 88,-45605 }, + { 89,-45605 }, { 90,-45605 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-45605 }, { 0, 0 }, { 97,-45605 }, { 98,-45605 }, + { 99,-45605 }, { 100,-45605 }, { 101,-45605 }, { 102,-45605 }, { 103,-45605 }, + { 104,-45605 }, { 105,-45605 }, { 106,-45605 }, { 107,-45605 }, { 108,-45605 }, + { 109,-45605 }, { 110,-45605 }, { 111,-45605 }, { 112,-45605 }, { 113,-45605 }, + { 114,-45605 }, { 115,-45605 }, { 116,-45605 }, { 117,-45605 }, { 118,-45605 }, + { 119,-45605 }, { 120,-45605 }, { 121,-45605 }, { 122,-45605 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-45605 }, { 128,-45605 }, + + { 129,-45605 }, { 130,-45605 }, { 131,-45605 }, { 132,-45605 }, { 133,-45605 }, + { 134,-45605 }, { 135,-45605 }, { 136,-45605 }, { 137,-45605 }, { 138,-45605 }, + { 139,-45605 }, { 140,-45605 }, { 141,-45605 }, { 142,-45605 }, { 143,-45605 }, + { 144,-45605 }, { 145,-45605 }, { 146,-45605 }, { 147,-45605 }, { 148,-45605 }, + { 149,-45605 }, { 150,-45605 }, { 151,-45605 }, { 152,-45605 }, { 153,-45605 }, + { 154,-45605 }, { 155,-45605 }, { 156,-45605 }, { 157,-45605 }, { 158,-45605 }, + { 159,-45605 }, { 160,-45605 }, { 161,-45605 }, { 162,-45605 }, { 163,-45605 }, + { 164,-45605 }, { 165,-45605 }, { 166,-45605 }, { 167,-45605 }, { 168,-45605 }, + { 169,-45605 }, { 170,-45605 }, { 171,-45605 }, { 172,-45605 }, { 173,-45605 }, + { 174,-45605 }, { 175,-45605 }, { 176,-45605 }, { 177,-45605 }, { 178,-45605 }, + + { 179,-45605 }, { 180,-45605 }, { 181,-45605 }, { 182,-45605 }, { 183,-45605 }, + { 184,-45605 }, { 185,-45605 }, { 186,-45605 }, { 187,-45605 }, { 188,-45605 }, + { 189,-45605 }, { 190,-45605 }, { 191,-45605 }, { 192,-45605 }, { 193,-45605 }, + { 194,-45605 }, { 195,-45605 }, { 196,-45605 }, { 197,-45605 }, { 198,-45605 }, + { 199,-45605 }, { 200,-45605 }, { 201,-45605 }, { 202,-45605 }, { 203,-45605 }, + { 204,-45605 }, { 205,-45605 }, { 206,-45605 }, { 207,-45605 }, { 208,-45605 }, + { 209,-45605 }, { 210,-45605 }, { 211,-45605 }, { 212,-45605 }, { 213,-45605 }, + { 214,-45605 }, { 215,-45605 }, { 216,-45605 }, { 217,-45605 }, { 218,-45605 }, + { 219,-45605 }, { 220,-45605 }, { 221,-45605 }, { 222,-45605 }, { 223,-45605 }, + { 224,-45605 }, { 225,-45605 }, { 226,-45605 }, { 227,-45605 }, { 228,-45605 }, + + { 229,-45605 }, { 230,-45605 }, { 231,-45605 }, { 232,-45605 }, { 233,-45605 }, + { 234,-45605 }, { 235,-45605 }, { 236,-45605 }, { 237,-45605 }, { 238,-45605 }, + { 239,-45605 }, { 240,-45605 }, { 241,-45605 }, { 242,-45605 }, { 243,-45605 }, + { 244,-45605 }, { 245,-45605 }, { 246,-45605 }, { 247,-45605 }, { 248,-45605 }, + { 249,-45605 }, { 250,-45605 }, { 251,-45605 }, { 252,-45605 }, { 253,-45605 }, + { 254,-45605 }, { 255,-45605 }, { 0, 72 }, { 0,46261 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-45862 }, { 49,-45862 }, { 50,-45862 }, { 51,-45862 }, + { 52,-45862 }, { 53,-45862 }, { 54,-45862 }, { 55,-45862 }, { 56,-45862 }, + { 57,-45862 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-45862 }, { 66,-45862 }, + { 67,-45862 }, { 68,-45862 }, { 69,-45862 }, { 70,-45862 }, { 71,-45862 }, + + { 72,-45862 }, { 73,-45862 }, { 74,-45862 }, { 75,-45862 }, { 76,-45862 }, + { 77,-45862 }, { 78,-45862 }, { 79,-45862 }, { 80,-45862 }, { 81,-45862 }, + { 82,-45862 }, { 83,-45862 }, { 84,-45862 }, { 85,-45862 }, { 86,-45862 }, + { 87,-45862 }, { 88,-45862 }, { 89,-45862 }, { 90,-45862 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-45862 }, { 0, 0 }, + { 97,-45862 }, { 98,-45862 }, { 99,-45862 }, { 100,-45862 }, { 101,-45862 }, + { 102,-45862 }, { 103,-45862 }, { 104,-45862 }, { 105,-45862 }, { 106,-45862 }, + { 107,-45862 }, { 108,-45862 }, { 109,-45862 }, { 110,-45862 }, { 111,-45862 }, + { 112,-45862 }, { 113,-45862 }, { 114,-45862 }, { 115,-45862 }, { 116,-45862 }, + { 117,-45862 }, { 118,-45862 }, { 119,-45862 }, { 120,-45862 }, { 121,-45862 }, + + { 122,-45862 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-45862 }, { 128,-45862 }, { 129,-45862 }, { 130,-45862 }, { 131,-45862 }, + { 132,-45862 }, { 133,-45862 }, { 134,-45862 }, { 135,-45862 }, { 136,-45862 }, + { 137,-45862 }, { 138,-45862 }, { 139,-45862 }, { 140,-45862 }, { 141,-45862 }, + { 142,-45862 }, { 143,-45862 }, { 144,-45862 }, { 145,-45862 }, { 146,-45862 }, + { 147,-45862 }, { 148,-45862 }, { 149,-45862 }, { 150,-45862 }, { 151,-45862 }, + { 152,-45862 }, { 153,-45862 }, { 154,-45862 }, { 155,-45862 }, { 156,-45862 }, + { 157,-45862 }, { 158,-45862 }, { 159,-45862 }, { 160,-45862 }, { 161,-45862 }, + { 162,-45862 }, { 163,-45862 }, { 164,-45862 }, { 165,-45862 }, { 166,-45862 }, + { 167,-45862 }, { 168,-45862 }, { 169,-45862 }, { 170,-45862 }, { 171,-45862 }, + + { 172,-45862 }, { 173,-45862 }, { 174,-45862 }, { 175,-45862 }, { 176,-45862 }, + { 177,-45862 }, { 178,-45862 }, { 179,-45862 }, { 180,-45862 }, { 181,-45862 }, + { 182,-45862 }, { 183,-45862 }, { 184,-45862 }, { 185,-45862 }, { 186,-45862 }, + { 187,-45862 }, { 188,-45862 }, { 189,-45862 }, { 190,-45862 }, { 191,-45862 }, + { 192,-45862 }, { 193,-45862 }, { 194,-45862 }, { 195,-45862 }, { 196,-45862 }, + { 197,-45862 }, { 198,-45862 }, { 199,-45862 }, { 200,-45862 }, { 201,-45862 }, + { 202,-45862 }, { 203,-45862 }, { 204,-45862 }, { 205,-45862 }, { 206,-45862 }, + { 207,-45862 }, { 208,-45862 }, { 209,-45862 }, { 210,-45862 }, { 211,-45862 }, + { 212,-45862 }, { 213,-45862 }, { 214,-45862 }, { 215,-45862 }, { 216,-45862 }, + { 217,-45862 }, { 218,-45862 }, { 219,-45862 }, { 220,-45862 }, { 221,-45862 }, + + { 222,-45862 }, { 223,-45862 }, { 224,-45862 }, { 225,-45862 }, { 226,-45862 }, + { 227,-45862 }, { 228,-45862 }, { 229,-45862 }, { 230,-45862 }, { 231,-45862 }, + { 232,-45862 }, { 233,-45862 }, { 234,-45862 }, { 235,-45862 }, { 236,-45862 }, + { 237,-45862 }, { 238,-45862 }, { 239,-45862 }, { 240,-45862 }, { 241,-45862 }, + { 242,-45862 }, { 243,-45862 }, { 244,-45862 }, { 245,-45862 }, { 246,-45862 }, + { 247,-45862 }, { 248,-45862 }, { 249,-45862 }, { 250,-45862 }, { 251,-45862 }, + { 252,-45862 }, { 253,-45862 }, { 254,-45862 }, { 255,-45862 }, { 0, 29 }, + { 0,46004 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-46119 }, { 49,-46119 }, + { 50,-46119 }, { 51,-46119 }, { 52,-46119 }, { 53,-46119 }, { 54,-46119 }, + { 55,-46119 }, { 56,-46119 }, { 57,-46119 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 65,-46119 }, { 66,-46119 }, { 67,-46119 }, { 68,-46119 }, { 69,-46119 }, + { 70,-46119 }, { 71,-46119 }, { 72,-46119 }, { 73,-46119 }, { 74,-46119 }, + { 75,-46119 }, { 76,-46119 }, { 77,-46119 }, { 78,-46119 }, { 79,-46119 }, + { 80,-46119 }, { 81,-46119 }, { 82,-46119 }, { 83,-46119 }, { 84,-46119 }, + { 85,-46119 }, { 86,-46119 }, { 87,-46119 }, { 88,-46119 }, { 89,-46119 }, + { 90,-46119 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-46119 }, { 0, 0 }, { 97,-46119 }, { 98,-46119 }, { 99,-46119 }, + { 100,-46119 }, { 101,-46119 }, { 102,-46119 }, { 103,-46119 }, { 104,-46119 }, + { 105,-46119 }, { 106,-46119 }, { 107,-46119 }, { 108,-46119 }, { 109,-46119 }, + { 110,-46119 }, { 111,-46119 }, { 112,-46119 }, { 113,-46119 }, { 114,-46119 }, + + { 115,-46119 }, { 116,-46119 }, { 117,-46119 }, { 118,-46119 }, { 119,-46119 }, + { 120,-46119 }, { 121,-46119 }, { 122,-46119 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-46119 }, { 128,-46119 }, { 129,-46119 }, + { 130,-46119 }, { 131,-46119 }, { 132,-46119 }, { 133,-46119 }, { 134,-46119 }, + { 135,-46119 }, { 136,-46119 }, { 137,-46119 }, { 138,-46119 }, { 139,-46119 }, + { 140,-46119 }, { 141,-46119 }, { 142,-46119 }, { 143,-46119 }, { 144,-46119 }, + { 145,-46119 }, { 146,-46119 }, { 147,-46119 }, { 148,-46119 }, { 149,-46119 }, + { 150,-46119 }, { 151,-46119 }, { 152,-46119 }, { 153,-46119 }, { 154,-46119 }, + { 155,-46119 }, { 156,-46119 }, { 157,-46119 }, { 158,-46119 }, { 159,-46119 }, + { 160,-46119 }, { 161,-46119 }, { 162,-46119 }, { 163,-46119 }, { 164,-46119 }, + + { 165,-46119 }, { 166,-46119 }, { 167,-46119 }, { 168,-46119 }, { 169,-46119 }, + { 170,-46119 }, { 171,-46119 }, { 172,-46119 }, { 173,-46119 }, { 174,-46119 }, + { 175,-46119 }, { 176,-46119 }, { 177,-46119 }, { 178,-46119 }, { 179,-46119 }, + { 180,-46119 }, { 181,-46119 }, { 182,-46119 }, { 183,-46119 }, { 184,-46119 }, + { 185,-46119 }, { 186,-46119 }, { 187,-46119 }, { 188,-46119 }, { 189,-46119 }, + { 190,-46119 }, { 191,-46119 }, { 192,-46119 }, { 193,-46119 }, { 194,-46119 }, + { 195,-46119 }, { 196,-46119 }, { 197,-46119 }, { 198,-46119 }, { 199,-46119 }, + { 200,-46119 }, { 201,-46119 }, { 202,-46119 }, { 203,-46119 }, { 204,-46119 }, + { 205,-46119 }, { 206,-46119 }, { 207,-46119 }, { 208,-46119 }, { 209,-46119 }, + { 210,-46119 }, { 211,-46119 }, { 212,-46119 }, { 213,-46119 }, { 214,-46119 }, + + { 215,-46119 }, { 216,-46119 }, { 217,-46119 }, { 218,-46119 }, { 219,-46119 }, + { 220,-46119 }, { 221,-46119 }, { 222,-46119 }, { 223,-46119 }, { 224,-46119 }, + { 225,-46119 }, { 226,-46119 }, { 227,-46119 }, { 228,-46119 }, { 229,-46119 }, + { 230,-46119 }, { 231,-46119 }, { 232,-46119 }, { 233,-46119 }, { 234,-46119 }, + { 235,-46119 }, { 236,-46119 }, { 237,-46119 }, { 238,-46119 }, { 239,-46119 }, + { 240,-46119 }, { 241,-46119 }, { 242,-46119 }, { 243,-46119 }, { 244,-46119 }, + { 245,-46119 }, { 246,-46119 }, { 247,-46119 }, { 248,-46119 }, { 249,-46119 }, + { 250,-46119 }, { 251,-46119 }, { 252,-46119 }, { 253,-46119 }, { 254,-46119 }, + { 255,-46119 }, { 0, 54 }, { 0,45747 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-46376 }, { 49,-46376 }, { 50,-46376 }, { 51,-46376 }, { 52,-46376 }, + { 53,-46376 }, { 54,-46376 }, { 55,-46376 }, { 56,-46376 }, { 57,-46376 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-46376 }, { 66,-46376 }, { 67,-46376 }, + { 68,-46376 }, { 69,-46376 }, { 70,-46376 }, { 71,-46376 }, { 72,-46376 }, + { 73,-46376 }, { 74,-46376 }, { 75,-46376 }, { 76,-46376 }, { 77,-46376 }, + { 78,-46376 }, { 79,-46376 }, { 80,-46376 }, { 81,-46376 }, { 82,-46376 }, + { 83,-46376 }, { 84,-46376 }, { 85,-46376 }, { 86,-46376 }, { 87,-46376 }, + { 88,-46376 }, { 89,-46376 }, { 90,-46376 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-46376 }, { 0, 0 }, { 97,-46376 }, + { 98,-46376 }, { 99,-46376 }, { 100,-46376 }, { 101,-46376 }, { 102,-46376 }, + { 103,-46376 }, { 104,-46376 }, { 105,-46376 }, { 106,-46376 }, { 107,-46376 }, + + { 108,-46376 }, { 109,-46376 }, { 110,-46376 }, { 111,-46376 }, { 112,-46376 }, + { 113,-46376 }, { 114,-46376 }, { 115,-46376 }, { 116,-46376 }, { 117,-46376 }, + { 118,-46376 }, { 119,-46376 }, { 120,-46376 }, { 121,-46376 }, { 122,-46376 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-46376 }, + { 128,-46376 }, { 129,-46376 }, { 130,-46376 }, { 131,-46376 }, { 132,-46376 }, + { 133,-46376 }, { 134,-46376 }, { 135,-46376 }, { 136,-46376 }, { 137,-46376 }, + { 138,-46376 }, { 139,-46376 }, { 140,-46376 }, { 141,-46376 }, { 142,-46376 }, + { 143,-46376 }, { 144,-46376 }, { 145,-46376 }, { 146,-46376 }, { 147,-46376 }, + { 148,-46376 }, { 149,-46376 }, { 150,-46376 }, { 151,-46376 }, { 152,-46376 }, + { 153,-46376 }, { 154,-46376 }, { 155,-46376 }, { 156,-46376 }, { 157,-46376 }, + + { 158,-46376 }, { 159,-46376 }, { 160,-46376 }, { 161,-46376 }, { 162,-46376 }, + { 163,-46376 }, { 164,-46376 }, { 165,-46376 }, { 166,-46376 }, { 167,-46376 }, + { 168,-46376 }, { 169,-46376 }, { 170,-46376 }, { 171,-46376 }, { 172,-46376 }, + { 173,-46376 }, { 174,-46376 }, { 175,-46376 }, { 176,-46376 }, { 177,-46376 }, + { 178,-46376 }, { 179,-46376 }, { 180,-46376 }, { 181,-46376 }, { 182,-46376 }, + { 183,-46376 }, { 184,-46376 }, { 185,-46376 }, { 186,-46376 }, { 187,-46376 }, + { 188,-46376 }, { 189,-46376 }, { 190,-46376 }, { 191,-46376 }, { 192,-46376 }, + { 193,-46376 }, { 194,-46376 }, { 195,-46376 }, { 196,-46376 }, { 197,-46376 }, + { 198,-46376 }, { 199,-46376 }, { 200,-46376 }, { 201,-46376 }, { 202,-46376 }, + { 203,-46376 }, { 204,-46376 }, { 205,-46376 }, { 206,-46376 }, { 207,-46376 }, + + { 208,-46376 }, { 209,-46376 }, { 210,-46376 }, { 211,-46376 }, { 212,-46376 }, + { 213,-46376 }, { 214,-46376 }, { 215,-46376 }, { 216,-46376 }, { 217,-46376 }, + { 218,-46376 }, { 219,-46376 }, { 220,-46376 }, { 221,-46376 }, { 222,-46376 }, + { 223,-46376 }, { 224,-46376 }, { 225,-46376 }, { 226,-46376 }, { 227,-46376 }, + { 228,-46376 }, { 229,-46376 }, { 230,-46376 }, { 231,-46376 }, { 232,-46376 }, + { 233,-46376 }, { 234,-46376 }, { 235,-46376 }, { 236,-46376 }, { 237,-46376 }, + { 238,-46376 }, { 239,-46376 }, { 240,-46376 }, { 241,-46376 }, { 242,-46376 }, + { 243,-46376 }, { 244,-46376 }, { 245,-46376 }, { 246,-46376 }, { 247,-46376 }, + { 248,-46376 }, { 249,-46376 }, { 250,-46376 }, { 251,-46376 }, { 252,-46376 }, + { 253,-46376 }, { 254,-46376 }, { 255,-46376 }, { 0, 131 }, { 0,45490 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-46633 }, { 49,-46633 }, { 50,-46633 }, + + { 51,-46633 }, { 52,-46633 }, { 53,-46633 }, { 54,-46633 }, { 55,-46633 }, + { 56,-46633 }, { 57,-46633 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-46633 }, + { 66,-46633 }, { 67,-46633 }, { 68,-46633 }, { 69,-46633 }, { 70,-46633 }, + { 71,-46633 }, { 72,-46633 }, { 73,-46633 }, { 74,-46633 }, { 75,-46633 }, + { 76,-46633 }, { 77,-46633 }, { 78,11822 }, { 79,-46633 }, { 80,-46633 }, + { 81,-46633 }, { 82,-46633 }, { 83,-46633 }, { 84,-46633 }, { 85,-46633 }, + { 86,-46633 }, { 87,-46633 }, { 88,-46633 }, { 89,-46633 }, { 90,-46633 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-46633 }, + { 0, 0 }, { 97,-46633 }, { 98,-46633 }, { 99,-46633 }, { 100,-46633 }, + + { 101,-46633 }, { 102,-46633 }, { 103,-46633 }, { 104,-46633 }, { 105,-46633 }, + { 106,-46633 }, { 107,-46633 }, { 108,-46633 }, { 109,-46633 }, { 110,11822 }, + { 111,-46633 }, { 112,-46633 }, { 113,-46633 }, { 114,-46633 }, { 115,-46633 }, + { 116,-46633 }, { 117,-46633 }, { 118,-46633 }, { 119,-46633 }, { 120,-46633 }, + { 121,-46633 }, { 122,-46633 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-46633 }, { 128,-46633 }, { 129,-46633 }, { 130,-46633 }, + { 131,-46633 }, { 132,-46633 }, { 133,-46633 }, { 134,-46633 }, { 135,-46633 }, + { 136,-46633 }, { 137,-46633 }, { 138,-46633 }, { 139,-46633 }, { 140,-46633 }, + { 141,-46633 }, { 142,-46633 }, { 143,-46633 }, { 144,-46633 }, { 145,-46633 }, + { 146,-46633 }, { 147,-46633 }, { 148,-46633 }, { 149,-46633 }, { 150,-46633 }, + + { 151,-46633 }, { 152,-46633 }, { 153,-46633 }, { 154,-46633 }, { 155,-46633 }, + { 156,-46633 }, { 157,-46633 }, { 158,-46633 }, { 159,-46633 }, { 160,-46633 }, + { 161,-46633 }, { 162,-46633 }, { 163,-46633 }, { 164,-46633 }, { 165,-46633 }, + { 166,-46633 }, { 167,-46633 }, { 168,-46633 }, { 169,-46633 }, { 170,-46633 }, + { 171,-46633 }, { 172,-46633 }, { 173,-46633 }, { 174,-46633 }, { 175,-46633 }, + { 176,-46633 }, { 177,-46633 }, { 178,-46633 }, { 179,-46633 }, { 180,-46633 }, + { 181,-46633 }, { 182,-46633 }, { 183,-46633 }, { 184,-46633 }, { 185,-46633 }, + { 186,-46633 }, { 187,-46633 }, { 188,-46633 }, { 189,-46633 }, { 190,-46633 }, + { 191,-46633 }, { 192,-46633 }, { 193,-46633 }, { 194,-46633 }, { 195,-46633 }, + { 196,-46633 }, { 197,-46633 }, { 198,-46633 }, { 199,-46633 }, { 200,-46633 }, + + { 201,-46633 }, { 202,-46633 }, { 203,-46633 }, { 204,-46633 }, { 205,-46633 }, + { 206,-46633 }, { 207,-46633 }, { 208,-46633 }, { 209,-46633 }, { 210,-46633 }, + { 211,-46633 }, { 212,-46633 }, { 213,-46633 }, { 214,-46633 }, { 215,-46633 }, + { 216,-46633 }, { 217,-46633 }, { 218,-46633 }, { 219,-46633 }, { 220,-46633 }, + { 221,-46633 }, { 222,-46633 }, { 223,-46633 }, { 224,-46633 }, { 225,-46633 }, + { 226,-46633 }, { 227,-46633 }, { 228,-46633 }, { 229,-46633 }, { 230,-46633 }, + { 231,-46633 }, { 232,-46633 }, { 233,-46633 }, { 234,-46633 }, { 235,-46633 }, + { 236,-46633 }, { 237,-46633 }, { 238,-46633 }, { 239,-46633 }, { 240,-46633 }, + { 241,-46633 }, { 242,-46633 }, { 243,-46633 }, { 244,-46633 }, { 245,-46633 }, + { 246,-46633 }, { 247,-46633 }, { 248,-46633 }, { 249,-46633 }, { 250,-46633 }, + + { 251,-46633 }, { 252,-46633 }, { 253,-46633 }, { 254,-46633 }, { 255,-46633 }, + { 0, 131 }, { 0,45233 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-46890 }, + { 49,-46890 }, { 50,-46890 }, { 51,-46890 }, { 52,-46890 }, { 53,-46890 }, + { 54,-46890 }, { 55,-46890 }, { 56,-46890 }, { 57,-46890 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-46890 }, { 66,-46890 }, { 67,-46890 }, { 68,-46890 }, + { 69,-46890 }, { 70,-46890 }, { 71,-46890 }, { 72,-46890 }, { 73,-46890 }, + { 74,-46890 }, { 75,-46890 }, { 76,-46890 }, { 77,-46890 }, { 78,-46890 }, + { 79,-46890 }, { 80,-46890 }, { 81,-46890 }, { 82,11822 }, { 83,-46890 }, + { 84,-46890 }, { 85,-46890 }, { 86,-46890 }, { 87,-46890 }, { 88,-46890 }, + { 89,-46890 }, { 90,-46890 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 95,-46890 }, { 0, 0 }, { 97,-46890 }, { 98,-46890 }, + { 99,-46890 }, { 100,-46890 }, { 101,-46890 }, { 102,-46890 }, { 103,-46890 }, + { 104,-46890 }, { 105,-46890 }, { 106,-46890 }, { 107,-46890 }, { 108,-46890 }, + { 109,-46890 }, { 110,-46890 }, { 111,-46890 }, { 112,-46890 }, { 113,-46890 }, + { 114,11822 }, { 115,-46890 }, { 116,-46890 }, { 117,-46890 }, { 118,-46890 }, + { 119,-46890 }, { 120,-46890 }, { 121,-46890 }, { 122,-46890 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-46890 }, { 128,-46890 }, + { 129,-46890 }, { 130,-46890 }, { 131,-46890 }, { 132,-46890 }, { 133,-46890 }, + { 134,-46890 }, { 135,-46890 }, { 136,-46890 }, { 137,-46890 }, { 138,-46890 }, + { 139,-46890 }, { 140,-46890 }, { 141,-46890 }, { 142,-46890 }, { 143,-46890 }, + + { 144,-46890 }, { 145,-46890 }, { 146,-46890 }, { 147,-46890 }, { 148,-46890 }, + { 149,-46890 }, { 150,-46890 }, { 151,-46890 }, { 152,-46890 }, { 153,-46890 }, + { 154,-46890 }, { 155,-46890 }, { 156,-46890 }, { 157,-46890 }, { 158,-46890 }, + { 159,-46890 }, { 160,-46890 }, { 161,-46890 }, { 162,-46890 }, { 163,-46890 }, + { 164,-46890 }, { 165,-46890 }, { 166,-46890 }, { 167,-46890 }, { 168,-46890 }, + { 169,-46890 }, { 170,-46890 }, { 171,-46890 }, { 172,-46890 }, { 173,-46890 }, + { 174,-46890 }, { 175,-46890 }, { 176,-46890 }, { 177,-46890 }, { 178,-46890 }, + { 179,-46890 }, { 180,-46890 }, { 181,-46890 }, { 182,-46890 }, { 183,-46890 }, + { 184,-46890 }, { 185,-46890 }, { 186,-46890 }, { 187,-46890 }, { 188,-46890 }, + { 189,-46890 }, { 190,-46890 }, { 191,-46890 }, { 192,-46890 }, { 193,-46890 }, + + { 194,-46890 }, { 195,-46890 }, { 196,-46890 }, { 197,-46890 }, { 198,-46890 }, + { 199,-46890 }, { 200,-46890 }, { 201,-46890 }, { 202,-46890 }, { 203,-46890 }, + { 204,-46890 }, { 205,-46890 }, { 206,-46890 }, { 207,-46890 }, { 208,-46890 }, + { 209,-46890 }, { 210,-46890 }, { 211,-46890 }, { 212,-46890 }, { 213,-46890 }, + { 214,-46890 }, { 215,-46890 }, { 216,-46890 }, { 217,-46890 }, { 218,-46890 }, + { 219,-46890 }, { 220,-46890 }, { 221,-46890 }, { 222,-46890 }, { 223,-46890 }, + { 224,-46890 }, { 225,-46890 }, { 226,-46890 }, { 227,-46890 }, { 228,-46890 }, + { 229,-46890 }, { 230,-46890 }, { 231,-46890 }, { 232,-46890 }, { 233,-46890 }, + { 234,-46890 }, { 235,-46890 }, { 236,-46890 }, { 237,-46890 }, { 238,-46890 }, + { 239,-46890 }, { 240,-46890 }, { 241,-46890 }, { 242,-46890 }, { 243,-46890 }, + + { 244,-46890 }, { 245,-46890 }, { 246,-46890 }, { 247,-46890 }, { 248,-46890 }, + { 249,-46890 }, { 250,-46890 }, { 251,-46890 }, { 252,-46890 }, { 253,-46890 }, + { 254,-46890 }, { 255,-46890 }, { 0, 131 }, { 0,44976 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-47147 }, { 49,-47147 }, { 50,-47147 }, { 51,-47147 }, + { 52,-47147 }, { 53,-47147 }, { 54,-47147 }, { 55,-47147 }, { 56,-47147 }, + { 57,-47147 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-47147 }, { 66,-47147 }, + { 67,-47147 }, { 68,-47147 }, { 69,-47147 }, { 70,-47147 }, { 71,-47147 }, + { 72,-47147 }, { 73,-47147 }, { 74,-47147 }, { 75,-47147 }, { 76,11822 }, + { 77,-47147 }, { 78,-47147 }, { 79,-47147 }, { 80,-47147 }, { 81,-47147 }, + { 82,-47147 }, { 83,-47147 }, { 84,-47147 }, { 85,-47147 }, { 86,-47147 }, + + { 87,-47147 }, { 88,-47147 }, { 89,-47147 }, { 90,-47147 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-47147 }, { 0, 0 }, + { 97,-47147 }, { 98,-47147 }, { 99,-47147 }, { 100,-47147 }, { 101,-47147 }, + { 102,-47147 }, { 103,-47147 }, { 104,-47147 }, { 105,-47147 }, { 106,-47147 }, + { 107,-47147 }, { 108,11822 }, { 109,-47147 }, { 110,-47147 }, { 111,-47147 }, + { 112,-47147 }, { 113,-47147 }, { 114,-47147 }, { 115,-47147 }, { 116,-47147 }, + { 117,-47147 }, { 118,-47147 }, { 119,-47147 }, { 120,-47147 }, { 121,-47147 }, + { 122,-47147 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-47147 }, { 128,-47147 }, { 129,-47147 }, { 130,-47147 }, { 131,-47147 }, + { 132,-47147 }, { 133,-47147 }, { 134,-47147 }, { 135,-47147 }, { 136,-47147 }, + + { 137,-47147 }, { 138,-47147 }, { 139,-47147 }, { 140,-47147 }, { 141,-47147 }, + { 142,-47147 }, { 143,-47147 }, { 144,-47147 }, { 145,-47147 }, { 146,-47147 }, + { 147,-47147 }, { 148,-47147 }, { 149,-47147 }, { 150,-47147 }, { 151,-47147 }, + { 152,-47147 }, { 153,-47147 }, { 154,-47147 }, { 155,-47147 }, { 156,-47147 }, + { 157,-47147 }, { 158,-47147 }, { 159,-47147 }, { 160,-47147 }, { 161,-47147 }, + { 162,-47147 }, { 163,-47147 }, { 164,-47147 }, { 165,-47147 }, { 166,-47147 }, + { 167,-47147 }, { 168,-47147 }, { 169,-47147 }, { 170,-47147 }, { 171,-47147 }, + { 172,-47147 }, { 173,-47147 }, { 174,-47147 }, { 175,-47147 }, { 176,-47147 }, + { 177,-47147 }, { 178,-47147 }, { 179,-47147 }, { 180,-47147 }, { 181,-47147 }, + { 182,-47147 }, { 183,-47147 }, { 184,-47147 }, { 185,-47147 }, { 186,-47147 }, + + { 187,-47147 }, { 188,-47147 }, { 189,-47147 }, { 190,-47147 }, { 191,-47147 }, + { 192,-47147 }, { 193,-47147 }, { 194,-47147 }, { 195,-47147 }, { 196,-47147 }, + { 197,-47147 }, { 198,-47147 }, { 199,-47147 }, { 200,-47147 }, { 201,-47147 }, + { 202,-47147 }, { 203,-47147 }, { 204,-47147 }, { 205,-47147 }, { 206,-47147 }, + { 207,-47147 }, { 208,-47147 }, { 209,-47147 }, { 210,-47147 }, { 211,-47147 }, + { 212,-47147 }, { 213,-47147 }, { 214,-47147 }, { 215,-47147 }, { 216,-47147 }, + { 217,-47147 }, { 218,-47147 }, { 219,-47147 }, { 220,-47147 }, { 221,-47147 }, + { 222,-47147 }, { 223,-47147 }, { 224,-47147 }, { 225,-47147 }, { 226,-47147 }, + { 227,-47147 }, { 228,-47147 }, { 229,-47147 }, { 230,-47147 }, { 231,-47147 }, + { 232,-47147 }, { 233,-47147 }, { 234,-47147 }, { 235,-47147 }, { 236,-47147 }, + + { 237,-47147 }, { 238,-47147 }, { 239,-47147 }, { 240,-47147 }, { 241,-47147 }, + { 242,-47147 }, { 243,-47147 }, { 244,-47147 }, { 245,-47147 }, { 246,-47147 }, + { 247,-47147 }, { 248,-47147 }, { 249,-47147 }, { 250,-47147 }, { 251,-47147 }, + { 252,-47147 }, { 253,-47147 }, { 254,-47147 }, { 255,-47147 }, { 0, 131 }, + { 0,44719 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-47404 }, { 49,-47404 }, + { 50,-47404 }, { 51,-47404 }, { 52,-47404 }, { 53,-47404 }, { 54,-47404 }, + { 55,-47404 }, { 56,-47404 }, { 57,-47404 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-47404 }, { 66,-47404 }, { 67,-47404 }, { 68,-47404 }, { 69,-47404 }, + { 70,11822 }, { 71,-47404 }, { 72,-47404 }, { 73,-47404 }, { 74,-47404 }, + { 75,-47404 }, { 76,-47404 }, { 77,-47404 }, { 78,-47404 }, { 79,-47404 }, + + { 80,-47404 }, { 81,-47404 }, { 82,-47404 }, { 83,-47404 }, { 84,-47404 }, + { 85,-47404 }, { 86,-47404 }, { 87,-47404 }, { 88,-47404 }, { 89,-47404 }, + { 90,-47404 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-47404 }, { 0, 0 }, { 97,-47404 }, { 98,-47404 }, { 99,-47404 }, + { 100,-47404 }, { 101,-47404 }, { 102,11822 }, { 103,-47404 }, { 104,-47404 }, + { 105,-47404 }, { 106,-47404 }, { 107,-47404 }, { 108,-47404 }, { 109,-47404 }, + { 110,-47404 }, { 111,-47404 }, { 112,-47404 }, { 113,-47404 }, { 114,-47404 }, + { 115,-47404 }, { 116,-47404 }, { 117,-47404 }, { 118,-47404 }, { 119,-47404 }, + { 120,-47404 }, { 121,-47404 }, { 122,-47404 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-47404 }, { 128,-47404 }, { 129,-47404 }, + + { 130,-47404 }, { 131,-47404 }, { 132,-47404 }, { 133,-47404 }, { 134,-47404 }, + { 135,-47404 }, { 136,-47404 }, { 137,-47404 }, { 138,-47404 }, { 139,-47404 }, + { 140,-47404 }, { 141,-47404 }, { 142,-47404 }, { 143,-47404 }, { 144,-47404 }, + { 145,-47404 }, { 146,-47404 }, { 147,-47404 }, { 148,-47404 }, { 149,-47404 }, + { 150,-47404 }, { 151,-47404 }, { 152,-47404 }, { 153,-47404 }, { 154,-47404 }, + { 155,-47404 }, { 156,-47404 }, { 157,-47404 }, { 158,-47404 }, { 159,-47404 }, + { 160,-47404 }, { 161,-47404 }, { 162,-47404 }, { 163,-47404 }, { 164,-47404 }, + { 165,-47404 }, { 166,-47404 }, { 167,-47404 }, { 168,-47404 }, { 169,-47404 }, + { 170,-47404 }, { 171,-47404 }, { 172,-47404 }, { 173,-47404 }, { 174,-47404 }, + { 175,-47404 }, { 176,-47404 }, { 177,-47404 }, { 178,-47404 }, { 179,-47404 }, + + { 180,-47404 }, { 181,-47404 }, { 182,-47404 }, { 183,-47404 }, { 184,-47404 }, + { 185,-47404 }, { 186,-47404 }, { 187,-47404 }, { 188,-47404 }, { 189,-47404 }, + { 190,-47404 }, { 191,-47404 }, { 192,-47404 }, { 193,-47404 }, { 194,-47404 }, + { 195,-47404 }, { 196,-47404 }, { 197,-47404 }, { 198,-47404 }, { 199,-47404 }, + { 200,-47404 }, { 201,-47404 }, { 202,-47404 }, { 203,-47404 }, { 204,-47404 }, + { 205,-47404 }, { 206,-47404 }, { 207,-47404 }, { 208,-47404 }, { 209,-47404 }, + { 210,-47404 }, { 211,-47404 }, { 212,-47404 }, { 213,-47404 }, { 214,-47404 }, + { 215,-47404 }, { 216,-47404 }, { 217,-47404 }, { 218,-47404 }, { 219,-47404 }, + { 220,-47404 }, { 221,-47404 }, { 222,-47404 }, { 223,-47404 }, { 224,-47404 }, + { 225,-47404 }, { 226,-47404 }, { 227,-47404 }, { 228,-47404 }, { 229,-47404 }, + + { 230,-47404 }, { 231,-47404 }, { 232,-47404 }, { 233,-47404 }, { 234,-47404 }, + { 235,-47404 }, { 236,-47404 }, { 237,-47404 }, { 238,-47404 }, { 239,-47404 }, + { 240,-47404 }, { 241,-47404 }, { 242,-47404 }, { 243,-47404 }, { 244,-47404 }, + { 245,-47404 }, { 246,-47404 }, { 247,-47404 }, { 248,-47404 }, { 249,-47404 }, + { 250,-47404 }, { 251,-47404 }, { 252,-47404 }, { 253,-47404 }, { 254,-47404 }, + { 255,-47404 }, { 0, 70 }, { 0,44462 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-47661 }, { 49,-47661 }, { 50,-47661 }, { 51,-47661 }, { 52,-47661 }, + { 53,-47661 }, { 54,-47661 }, { 55,-47661 }, { 56,-47661 }, { 57,-47661 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-47661 }, { 66,-47661 }, { 67,-47661 }, + { 68,-47661 }, { 69,-47661 }, { 70,-47661 }, { 71,-47661 }, { 72,-47661 }, + + { 73,-47661 }, { 74,-47661 }, { 75,-47661 }, { 76,-47661 }, { 77,-47661 }, + { 78,-47661 }, { 79,-47661 }, { 80,-47661 }, { 81,-47661 }, { 82,-47661 }, + { 83,-47661 }, { 84,-47661 }, { 85,-47661 }, { 86,-47661 }, { 87,-47661 }, + { 88,-47661 }, { 89,-47661 }, { 90,-47661 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-47661 }, { 0, 0 }, { 97,-47661 }, + { 98,-47661 }, { 99,-47661 }, { 100,-47661 }, { 101,-47661 }, { 102,-47661 }, + { 103,-47661 }, { 104,-47661 }, { 105,-47661 }, { 106,-47661 }, { 107,-47661 }, + { 108,-47661 }, { 109,-47661 }, { 110,-47661 }, { 111,-47661 }, { 112,-47661 }, + { 113,-47661 }, { 114,-47661 }, { 115,-47661 }, { 116,-47661 }, { 117,-47661 }, + { 118,-47661 }, { 119,-47661 }, { 120,-47661 }, { 121,-47661 }, { 122,-47661 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-47661 }, + { 128,-47661 }, { 129,-47661 }, { 130,-47661 }, { 131,-47661 }, { 132,-47661 }, + { 133,-47661 }, { 134,-47661 }, { 135,-47661 }, { 136,-47661 }, { 137,-47661 }, + { 138,-47661 }, { 139,-47661 }, { 140,-47661 }, { 141,-47661 }, { 142,-47661 }, + { 143,-47661 }, { 144,-47661 }, { 145,-47661 }, { 146,-47661 }, { 147,-47661 }, + { 148,-47661 }, { 149,-47661 }, { 150,-47661 }, { 151,-47661 }, { 152,-47661 }, + { 153,-47661 }, { 154,-47661 }, { 155,-47661 }, { 156,-47661 }, { 157,-47661 }, + { 158,-47661 }, { 159,-47661 }, { 160,-47661 }, { 161,-47661 }, { 162,-47661 }, + { 163,-47661 }, { 164,-47661 }, { 165,-47661 }, { 166,-47661 }, { 167,-47661 }, + { 168,-47661 }, { 169,-47661 }, { 170,-47661 }, { 171,-47661 }, { 172,-47661 }, + + { 173,-47661 }, { 174,-47661 }, { 175,-47661 }, { 176,-47661 }, { 177,-47661 }, + { 178,-47661 }, { 179,-47661 }, { 180,-47661 }, { 181,-47661 }, { 182,-47661 }, + { 183,-47661 }, { 184,-47661 }, { 185,-47661 }, { 186,-47661 }, { 187,-47661 }, + { 188,-47661 }, { 189,-47661 }, { 190,-47661 }, { 191,-47661 }, { 192,-47661 }, + { 193,-47661 }, { 194,-47661 }, { 195,-47661 }, { 196,-47661 }, { 197,-47661 }, + { 198,-47661 }, { 199,-47661 }, { 200,-47661 }, { 201,-47661 }, { 202,-47661 }, + { 203,-47661 }, { 204,-47661 }, { 205,-47661 }, { 206,-47661 }, { 207,-47661 }, + { 208,-47661 }, { 209,-47661 }, { 210,-47661 }, { 211,-47661 }, { 212,-47661 }, + { 213,-47661 }, { 214,-47661 }, { 215,-47661 }, { 216,-47661 }, { 217,-47661 }, + { 218,-47661 }, { 219,-47661 }, { 220,-47661 }, { 221,-47661 }, { 222,-47661 }, + + { 223,-47661 }, { 224,-47661 }, { 225,-47661 }, { 226,-47661 }, { 227,-47661 }, + { 228,-47661 }, { 229,-47661 }, { 230,-47661 }, { 231,-47661 }, { 232,-47661 }, + { 233,-47661 }, { 234,-47661 }, { 235,-47661 }, { 236,-47661 }, { 237,-47661 }, + { 238,-47661 }, { 239,-47661 }, { 240,-47661 }, { 241,-47661 }, { 242,-47661 }, + { 243,-47661 }, { 244,-47661 }, { 245,-47661 }, { 246,-47661 }, { 247,-47661 }, + { 248,-47661 }, { 249,-47661 }, { 250,-47661 }, { 251,-47661 }, { 252,-47661 }, + { 253,-47661 }, { 254,-47661 }, { 255,-47661 }, { 0, 131 }, { 0,44205 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-47918 }, { 49,-47918 }, { 50,-47918 }, + { 51,-47918 }, { 52,-47918 }, { 53,-47918 }, { 54,-47918 }, { 55,-47918 }, + { 56,-47918 }, { 57,-47918 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-47918 }, + + { 66,-47918 }, { 67,11565 }, { 68,-47918 }, { 69,-47918 }, { 70,-47918 }, + { 71,-47918 }, { 72,-47918 }, { 73,-47918 }, { 74,-47918 }, { 75,-47918 }, + { 76,-47918 }, { 77,-47918 }, { 78,-47918 }, { 79,-47918 }, { 80,-47918 }, + { 81,-47918 }, { 82,-47918 }, { 83,-47918 }, { 84,-47918 }, { 85,-47918 }, + { 86,-47918 }, { 87,-47918 }, { 88,-47918 }, { 89,-47918 }, { 90,-47918 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-47918 }, + { 0, 0 }, { 97,-47918 }, { 98,-47918 }, { 99,11565 }, { 100,-47918 }, + { 101,-47918 }, { 102,-47918 }, { 103,-47918 }, { 104,-47918 }, { 105,-47918 }, + { 106,-47918 }, { 107,-47918 }, { 108,-47918 }, { 109,-47918 }, { 110,-47918 }, + { 111,-47918 }, { 112,-47918 }, { 113,-47918 }, { 114,-47918 }, { 115,-47918 }, + + { 116,-47918 }, { 117,-47918 }, { 118,-47918 }, { 119,-47918 }, { 120,-47918 }, + { 121,-47918 }, { 122,-47918 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-47918 }, { 128,-47918 }, { 129,-47918 }, { 130,-47918 }, + { 131,-47918 }, { 132,-47918 }, { 133,-47918 }, { 134,-47918 }, { 135,-47918 }, + { 136,-47918 }, { 137,-47918 }, { 138,-47918 }, { 139,-47918 }, { 140,-47918 }, + { 141,-47918 }, { 142,-47918 }, { 143,-47918 }, { 144,-47918 }, { 145,-47918 }, + { 146,-47918 }, { 147,-47918 }, { 148,-47918 }, { 149,-47918 }, { 150,-47918 }, + { 151,-47918 }, { 152,-47918 }, { 153,-47918 }, { 154,-47918 }, { 155,-47918 }, + { 156,-47918 }, { 157,-47918 }, { 158,-47918 }, { 159,-47918 }, { 160,-47918 }, + { 161,-47918 }, { 162,-47918 }, { 163,-47918 }, { 164,-47918 }, { 165,-47918 }, + + { 166,-47918 }, { 167,-47918 }, { 168,-47918 }, { 169,-47918 }, { 170,-47918 }, + { 171,-47918 }, { 172,-47918 }, { 173,-47918 }, { 174,-47918 }, { 175,-47918 }, + { 176,-47918 }, { 177,-47918 }, { 178,-47918 }, { 179,-47918 }, { 180,-47918 }, + { 181,-47918 }, { 182,-47918 }, { 183,-47918 }, { 184,-47918 }, { 185,-47918 }, + { 186,-47918 }, { 187,-47918 }, { 188,-47918 }, { 189,-47918 }, { 190,-47918 }, + { 191,-47918 }, { 192,-47918 }, { 193,-47918 }, { 194,-47918 }, { 195,-47918 }, + { 196,-47918 }, { 197,-47918 }, { 198,-47918 }, { 199,-47918 }, { 200,-47918 }, + { 201,-47918 }, { 202,-47918 }, { 203,-47918 }, { 204,-47918 }, { 205,-47918 }, + { 206,-47918 }, { 207,-47918 }, { 208,-47918 }, { 209,-47918 }, { 210,-47918 }, + { 211,-47918 }, { 212,-47918 }, { 213,-47918 }, { 214,-47918 }, { 215,-47918 }, + + { 216,-47918 }, { 217,-47918 }, { 218,-47918 }, { 219,-47918 }, { 220,-47918 }, + { 221,-47918 }, { 222,-47918 }, { 223,-47918 }, { 224,-47918 }, { 225,-47918 }, + { 226,-47918 }, { 227,-47918 }, { 228,-47918 }, { 229,-47918 }, { 230,-47918 }, + { 231,-47918 }, { 232,-47918 }, { 233,-47918 }, { 234,-47918 }, { 235,-47918 }, + { 236,-47918 }, { 237,-47918 }, { 238,-47918 }, { 239,-47918 }, { 240,-47918 }, + { 241,-47918 }, { 242,-47918 }, { 243,-47918 }, { 244,-47918 }, { 245,-47918 }, + { 246,-47918 }, { 247,-47918 }, { 248,-47918 }, { 249,-47918 }, { 250,-47918 }, + { 251,-47918 }, { 252,-47918 }, { 253,-47918 }, { 254,-47918 }, { 255,-47918 }, + { 0, 131 }, { 0,43948 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-48175 }, + { 49,-48175 }, { 50,-48175 }, { 51,-48175 }, { 52,-48175 }, { 53,-48175 }, + { 54,-48175 }, { 55,-48175 }, { 56,-48175 }, { 57,-48175 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-48175 }, { 66,-48175 }, { 67,-48175 }, { 68,-48175 }, + { 69,-48175 }, { 70,-48175 }, { 71,-48175 }, { 72,-48175 }, { 73,-48175 }, + { 74,-48175 }, { 75,-48175 }, { 76,-48175 }, { 77,-48175 }, { 78,-48175 }, + { 79,-48175 }, { 80,-48175 }, { 81,-48175 }, { 82,11565 }, { 83,-48175 }, + { 84,-48175 }, { 85,-48175 }, { 86,-48175 }, { 87,-48175 }, { 88,-48175 }, + { 89,-48175 }, { 90,-48175 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-48175 }, { 0, 0 }, { 97,-48175 }, { 98,-48175 }, + { 99,-48175 }, { 100,-48175 }, { 101,-48175 }, { 102,-48175 }, { 103,-48175 }, + { 104,-48175 }, { 105,-48175 }, { 106,-48175 }, { 107,-48175 }, { 108,-48175 }, + + { 109,-48175 }, { 110,-48175 }, { 111,-48175 }, { 112,-48175 }, { 113,-48175 }, + { 114,11565 }, { 115,-48175 }, { 116,-48175 }, { 117,-48175 }, { 118,-48175 }, + { 119,-48175 }, { 120,-48175 }, { 121,-48175 }, { 122,-48175 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-48175 }, { 128,-48175 }, + { 129,-48175 }, { 130,-48175 }, { 131,-48175 }, { 132,-48175 }, { 133,-48175 }, + { 134,-48175 }, { 135,-48175 }, { 136,-48175 }, { 137,-48175 }, { 138,-48175 }, + { 139,-48175 }, { 140,-48175 }, { 141,-48175 }, { 142,-48175 }, { 143,-48175 }, + { 144,-48175 }, { 145,-48175 }, { 146,-48175 }, { 147,-48175 }, { 148,-48175 }, + { 149,-48175 }, { 150,-48175 }, { 151,-48175 }, { 152,-48175 }, { 153,-48175 }, + { 154,-48175 }, { 155,-48175 }, { 156,-48175 }, { 157,-48175 }, { 158,-48175 }, + + { 159,-48175 }, { 160,-48175 }, { 161,-48175 }, { 162,-48175 }, { 163,-48175 }, + { 164,-48175 }, { 165,-48175 }, { 166,-48175 }, { 167,-48175 }, { 168,-48175 }, + { 169,-48175 }, { 170,-48175 }, { 171,-48175 }, { 172,-48175 }, { 173,-48175 }, + { 174,-48175 }, { 175,-48175 }, { 176,-48175 }, { 177,-48175 }, { 178,-48175 }, + { 179,-48175 }, { 180,-48175 }, { 181,-48175 }, { 182,-48175 }, { 183,-48175 }, + { 184,-48175 }, { 185,-48175 }, { 186,-48175 }, { 187,-48175 }, { 188,-48175 }, + { 189,-48175 }, { 190,-48175 }, { 191,-48175 }, { 192,-48175 }, { 193,-48175 }, + { 194,-48175 }, { 195,-48175 }, { 196,-48175 }, { 197,-48175 }, { 198,-48175 }, + { 199,-48175 }, { 200,-48175 }, { 201,-48175 }, { 202,-48175 }, { 203,-48175 }, + { 204,-48175 }, { 205,-48175 }, { 206,-48175 }, { 207,-48175 }, { 208,-48175 }, + + { 209,-48175 }, { 210,-48175 }, { 211,-48175 }, { 212,-48175 }, { 213,-48175 }, + { 214,-48175 }, { 215,-48175 }, { 216,-48175 }, { 217,-48175 }, { 218,-48175 }, + { 219,-48175 }, { 220,-48175 }, { 221,-48175 }, { 222,-48175 }, { 223,-48175 }, + { 224,-48175 }, { 225,-48175 }, { 226,-48175 }, { 227,-48175 }, { 228,-48175 }, + { 229,-48175 }, { 230,-48175 }, { 231,-48175 }, { 232,-48175 }, { 233,-48175 }, + { 234,-48175 }, { 235,-48175 }, { 236,-48175 }, { 237,-48175 }, { 238,-48175 }, + { 239,-48175 }, { 240,-48175 }, { 241,-48175 }, { 242,-48175 }, { 243,-48175 }, + { 244,-48175 }, { 245,-48175 }, { 246,-48175 }, { 247,-48175 }, { 248,-48175 }, + { 249,-48175 }, { 250,-48175 }, { 251,-48175 }, { 252,-48175 }, { 253,-48175 }, + { 254,-48175 }, { 255,-48175 }, { 0, 34 }, { 0,43691 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-48432 }, { 49,-48432 }, { 50,-48432 }, { 51,-48432 }, + + { 52,-48432 }, { 53,-48432 }, { 54,-48432 }, { 55,-48432 }, { 56,-48432 }, + { 57,-48432 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-48432 }, { 66,-48432 }, + { 67,-48432 }, { 68,-48432 }, { 69,-48432 }, { 70,-48432 }, { 71,-48432 }, + { 72,-48432 }, { 73,-48432 }, { 74,-48432 }, { 75,-48432 }, { 76,-48432 }, + { 77,-48432 }, { 78,-48432 }, { 79,-48432 }, { 80,-48432 }, { 81,-48432 }, + { 82,-48432 }, { 83,-48432 }, { 84,-48432 }, { 85,-48432 }, { 86,-48432 }, + { 87,-48432 }, { 88,-48432 }, { 89,-48432 }, { 90,-48432 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-48432 }, { 0, 0 }, + { 97,-48432 }, { 98,-48432 }, { 99,-48432 }, { 100,-48432 }, { 101,-48432 }, + + { 102,-48432 }, { 103,-48432 }, { 104,-48432 }, { 105,-48432 }, { 106,-48432 }, + { 107,-48432 }, { 108,-48432 }, { 109,-48432 }, { 110,-48432 }, { 111,-48432 }, + { 112,-48432 }, { 113,-48432 }, { 114,-48432 }, { 115,-48432 }, { 116,-48432 }, + { 117,-48432 }, { 118,-48432 }, { 119,-48432 }, { 120,-48432 }, { 121,-48432 }, + { 122,-48432 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-48432 }, { 128,-48432 }, { 129,-48432 }, { 130,-48432 }, { 131,-48432 }, + { 132,-48432 }, { 133,-48432 }, { 134,-48432 }, { 135,-48432 }, { 136,-48432 }, + { 137,-48432 }, { 138,-48432 }, { 139,-48432 }, { 140,-48432 }, { 141,-48432 }, + { 142,-48432 }, { 143,-48432 }, { 144,-48432 }, { 145,-48432 }, { 146,-48432 }, + { 147,-48432 }, { 148,-48432 }, { 149,-48432 }, { 150,-48432 }, { 151,-48432 }, + + { 152,-48432 }, { 153,-48432 }, { 154,-48432 }, { 155,-48432 }, { 156,-48432 }, + { 157,-48432 }, { 158,-48432 }, { 159,-48432 }, { 160,-48432 }, { 161,-48432 }, + { 162,-48432 }, { 163,-48432 }, { 164,-48432 }, { 165,-48432 }, { 166,-48432 }, + { 167,-48432 }, { 168,-48432 }, { 169,-48432 }, { 170,-48432 }, { 171,-48432 }, + { 172,-48432 }, { 173,-48432 }, { 174,-48432 }, { 175,-48432 }, { 176,-48432 }, + { 177,-48432 }, { 178,-48432 }, { 179,-48432 }, { 180,-48432 }, { 181,-48432 }, + { 182,-48432 }, { 183,-48432 }, { 184,-48432 }, { 185,-48432 }, { 186,-48432 }, + { 187,-48432 }, { 188,-48432 }, { 189,-48432 }, { 190,-48432 }, { 191,-48432 }, + { 192,-48432 }, { 193,-48432 }, { 194,-48432 }, { 195,-48432 }, { 196,-48432 }, + { 197,-48432 }, { 198,-48432 }, { 199,-48432 }, { 200,-48432 }, { 201,-48432 }, + + { 202,-48432 }, { 203,-48432 }, { 204,-48432 }, { 205,-48432 }, { 206,-48432 }, + { 207,-48432 }, { 208,-48432 }, { 209,-48432 }, { 210,-48432 }, { 211,-48432 }, + { 212,-48432 }, { 213,-48432 }, { 214,-48432 }, { 215,-48432 }, { 216,-48432 }, + { 217,-48432 }, { 218,-48432 }, { 219,-48432 }, { 220,-48432 }, { 221,-48432 }, + { 222,-48432 }, { 223,-48432 }, { 224,-48432 }, { 225,-48432 }, { 226,-48432 }, + { 227,-48432 }, { 228,-48432 }, { 229,-48432 }, { 230,-48432 }, { 231,-48432 }, + { 232,-48432 }, { 233,-48432 }, { 234,-48432 }, { 235,-48432 }, { 236,-48432 }, + { 237,-48432 }, { 238,-48432 }, { 239,-48432 }, { 240,-48432 }, { 241,-48432 }, + { 242,-48432 }, { 243,-48432 }, { 244,-48432 }, { 245,-48432 }, { 246,-48432 }, + { 247,-48432 }, { 248,-48432 }, { 249,-48432 }, { 250,-48432 }, { 251,-48432 }, + + { 252,-48432 }, { 253,-48432 }, { 254,-48432 }, { 255,-48432 }, { 0, 131 }, + { 0,43434 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-48689 }, { 49,-48689 }, + { 50,-48689 }, { 51,-48689 }, { 52,-48689 }, { 53,-48689 }, { 54,-48689 }, + { 55,-48689 }, { 56,-48689 }, { 57,-48689 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-48689 }, { 66,-48689 }, { 67,-48689 }, { 68,-48689 }, { 69,-48689 }, + { 70,-48689 }, { 71,-48689 }, { 72,-48689 }, { 73,11308 }, { 74,-48689 }, + { 75,-48689 }, { 76,-48689 }, { 77,-48689 }, { 78,-48689 }, { 79,-48689 }, + { 80,-48689 }, { 81,-48689 }, { 82,-48689 }, { 83,-48689 }, { 84,-48689 }, + { 85,-48689 }, { 86,-48689 }, { 87,-48689 }, { 88,-48689 }, { 89,-48689 }, + { 90,-48689 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 95,-48689 }, { 0, 0 }, { 97,-48689 }, { 98,-48689 }, { 99,-48689 }, + { 100,-48689 }, { 101,-48689 }, { 102,-48689 }, { 103,-48689 }, { 104,-48689 }, + { 105,11308 }, { 106,-48689 }, { 107,-48689 }, { 108,-48689 }, { 109,-48689 }, + { 110,-48689 }, { 111,-48689 }, { 112,-48689 }, { 113,-48689 }, { 114,-48689 }, + { 115,-48689 }, { 116,-48689 }, { 117,-48689 }, { 118,-48689 }, { 119,-48689 }, + { 120,-48689 }, { 121,-48689 }, { 122,-48689 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-48689 }, { 128,-48689 }, { 129,-48689 }, + { 130,-48689 }, { 131,-48689 }, { 132,-48689 }, { 133,-48689 }, { 134,-48689 }, + { 135,-48689 }, { 136,-48689 }, { 137,-48689 }, { 138,-48689 }, { 139,-48689 }, + { 140,-48689 }, { 141,-48689 }, { 142,-48689 }, { 143,-48689 }, { 144,-48689 }, + + { 145,-48689 }, { 146,-48689 }, { 147,-48689 }, { 148,-48689 }, { 149,-48689 }, + { 150,-48689 }, { 151,-48689 }, { 152,-48689 }, { 153,-48689 }, { 154,-48689 }, + { 155,-48689 }, { 156,-48689 }, { 157,-48689 }, { 158,-48689 }, { 159,-48689 }, + { 160,-48689 }, { 161,-48689 }, { 162,-48689 }, { 163,-48689 }, { 164,-48689 }, + { 165,-48689 }, { 166,-48689 }, { 167,-48689 }, { 168,-48689 }, { 169,-48689 }, + { 170,-48689 }, { 171,-48689 }, { 172,-48689 }, { 173,-48689 }, { 174,-48689 }, + { 175,-48689 }, { 176,-48689 }, { 177,-48689 }, { 178,-48689 }, { 179,-48689 }, + { 180,-48689 }, { 181,-48689 }, { 182,-48689 }, { 183,-48689 }, { 184,-48689 }, + { 185,-48689 }, { 186,-48689 }, { 187,-48689 }, { 188,-48689 }, { 189,-48689 }, + { 190,-48689 }, { 191,-48689 }, { 192,-48689 }, { 193,-48689 }, { 194,-48689 }, + + { 195,-48689 }, { 196,-48689 }, { 197,-48689 }, { 198,-48689 }, { 199,-48689 }, + { 200,-48689 }, { 201,-48689 }, { 202,-48689 }, { 203,-48689 }, { 204,-48689 }, + { 205,-48689 }, { 206,-48689 }, { 207,-48689 }, { 208,-48689 }, { 209,-48689 }, + { 210,-48689 }, { 211,-48689 }, { 212,-48689 }, { 213,-48689 }, { 214,-48689 }, + { 215,-48689 }, { 216,-48689 }, { 217,-48689 }, { 218,-48689 }, { 219,-48689 }, + { 220,-48689 }, { 221,-48689 }, { 222,-48689 }, { 223,-48689 }, { 224,-48689 }, + { 225,-48689 }, { 226,-48689 }, { 227,-48689 }, { 228,-48689 }, { 229,-48689 }, + { 230,-48689 }, { 231,-48689 }, { 232,-48689 }, { 233,-48689 }, { 234,-48689 }, + { 235,-48689 }, { 236,-48689 }, { 237,-48689 }, { 238,-48689 }, { 239,-48689 }, + { 240,-48689 }, { 241,-48689 }, { 242,-48689 }, { 243,-48689 }, { 244,-48689 }, + + { 245,-48689 }, { 246,-48689 }, { 247,-48689 }, { 248,-48689 }, { 249,-48689 }, + { 250,-48689 }, { 251,-48689 }, { 252,-48689 }, { 253,-48689 }, { 254,-48689 }, + { 255,-48689 }, { 0, 131 }, { 0,43177 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-48946 }, { 49,-48946 }, { 50,-48946 }, { 51,-48946 }, { 52,-48946 }, + { 53,-48946 }, { 54,-48946 }, { 55,-48946 }, { 56,-48946 }, { 57,-48946 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-48946 }, { 66,-48946 }, { 67,-48946 }, + { 68,-48946 }, { 69,-48946 }, { 70,-48946 }, { 71,-48946 }, { 72,-48946 }, + { 73,11308 }, { 74,-48946 }, { 75,-48946 }, { 76,-48946 }, { 77,-48946 }, + { 78,-48946 }, { 79,-48946 }, { 80,-48946 }, { 81,-48946 }, { 82,-48946 }, + { 83,-48946 }, { 84,-48946 }, { 85,-48946 }, { 86,-48946 }, { 87,-48946 }, + + { 88,-48946 }, { 89,-48946 }, { 90,-48946 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-48946 }, { 0, 0 }, { 97,-48946 }, + { 98,-48946 }, { 99,-48946 }, { 100,-48946 }, { 101,-48946 }, { 102,-48946 }, + { 103,-48946 }, { 104,-48946 }, { 105,11308 }, { 106,-48946 }, { 107,-48946 }, + { 108,-48946 }, { 109,-48946 }, { 110,-48946 }, { 111,-48946 }, { 112,-48946 }, + { 113,-48946 }, { 114,-48946 }, { 115,-48946 }, { 116,-48946 }, { 117,-48946 }, + { 118,-48946 }, { 119,-48946 }, { 120,-48946 }, { 121,-48946 }, { 122,-48946 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-48946 }, + { 128,-48946 }, { 129,-48946 }, { 130,-48946 }, { 131,-48946 }, { 132,-48946 }, + { 133,-48946 }, { 134,-48946 }, { 135,-48946 }, { 136,-48946 }, { 137,-48946 }, + + { 138,-48946 }, { 139,-48946 }, { 140,-48946 }, { 141,-48946 }, { 142,-48946 }, + { 143,-48946 }, { 144,-48946 }, { 145,-48946 }, { 146,-48946 }, { 147,-48946 }, + { 148,-48946 }, { 149,-48946 }, { 150,-48946 }, { 151,-48946 }, { 152,-48946 }, + { 153,-48946 }, { 154,-48946 }, { 155,-48946 }, { 156,-48946 }, { 157,-48946 }, + { 158,-48946 }, { 159,-48946 }, { 160,-48946 }, { 161,-48946 }, { 162,-48946 }, + { 163,-48946 }, { 164,-48946 }, { 165,-48946 }, { 166,-48946 }, { 167,-48946 }, + { 168,-48946 }, { 169,-48946 }, { 170,-48946 }, { 171,-48946 }, { 172,-48946 }, + { 173,-48946 }, { 174,-48946 }, { 175,-48946 }, { 176,-48946 }, { 177,-48946 }, + { 178,-48946 }, { 179,-48946 }, { 180,-48946 }, { 181,-48946 }, { 182,-48946 }, + { 183,-48946 }, { 184,-48946 }, { 185,-48946 }, { 186,-48946 }, { 187,-48946 }, + + { 188,-48946 }, { 189,-48946 }, { 190,-48946 }, { 191,-48946 }, { 192,-48946 }, + { 193,-48946 }, { 194,-48946 }, { 195,-48946 }, { 196,-48946 }, { 197,-48946 }, + { 198,-48946 }, { 199,-48946 }, { 200,-48946 }, { 201,-48946 }, { 202,-48946 }, + { 203,-48946 }, { 204,-48946 }, { 205,-48946 }, { 206,-48946 }, { 207,-48946 }, + { 208,-48946 }, { 209,-48946 }, { 210,-48946 }, { 211,-48946 }, { 212,-48946 }, + { 213,-48946 }, { 214,-48946 }, { 215,-48946 }, { 216,-48946 }, { 217,-48946 }, + { 218,-48946 }, { 219,-48946 }, { 220,-48946 }, { 221,-48946 }, { 222,-48946 }, + { 223,-48946 }, { 224,-48946 }, { 225,-48946 }, { 226,-48946 }, { 227,-48946 }, + { 228,-48946 }, { 229,-48946 }, { 230,-48946 }, { 231,-48946 }, { 232,-48946 }, + { 233,-48946 }, { 234,-48946 }, { 235,-48946 }, { 236,-48946 }, { 237,-48946 }, + + { 238,-48946 }, { 239,-48946 }, { 240,-48946 }, { 241,-48946 }, { 242,-48946 }, + { 243,-48946 }, { 244,-48946 }, { 245,-48946 }, { 246,-48946 }, { 247,-48946 }, + { 248,-48946 }, { 249,-48946 }, { 250,-48946 }, { 251,-48946 }, { 252,-48946 }, + { 253,-48946 }, { 254,-48946 }, { 255,-48946 }, { 0, 131 }, { 0,42920 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-49203 }, { 49,-49203 }, { 50,-49203 }, + { 51,-49203 }, { 52,-49203 }, { 53,-49203 }, { 54,-49203 }, { 55,-49203 }, + { 56,-49203 }, { 57,-49203 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-49203 }, + { 66,-49203 }, { 67,-49203 }, { 68,11308 }, { 69,-49203 }, { 70,-49203 }, + { 71,-49203 }, { 72,-49203 }, { 73,-49203 }, { 74,-49203 }, { 75,-49203 }, + { 76,-49203 }, { 77,-49203 }, { 78,-49203 }, { 79,-49203 }, { 80,-49203 }, + + { 81,-49203 }, { 82,-49203 }, { 83,-49203 }, { 84,-49203 }, { 85,-49203 }, + { 86,-49203 }, { 87,-49203 }, { 88,-49203 }, { 89,-49203 }, { 90,-49203 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-49203 }, + { 0, 0 }, { 97,-49203 }, { 98,-49203 }, { 99,-49203 }, { 100,11308 }, + { 101,-49203 }, { 102,-49203 }, { 103,-49203 }, { 104,-49203 }, { 105,-49203 }, + { 106,-49203 }, { 107,-49203 }, { 108,-49203 }, { 109,-49203 }, { 110,-49203 }, + { 111,-49203 }, { 112,-49203 }, { 113,-49203 }, { 114,-49203 }, { 115,-49203 }, + { 116,-49203 }, { 117,-49203 }, { 118,-49203 }, { 119,-49203 }, { 120,-49203 }, + { 121,-49203 }, { 122,-49203 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-49203 }, { 128,-49203 }, { 129,-49203 }, { 130,-49203 }, + + { 131,-49203 }, { 132,-49203 }, { 133,-49203 }, { 134,-49203 }, { 135,-49203 }, + { 136,-49203 }, { 137,-49203 }, { 138,-49203 }, { 139,-49203 }, { 140,-49203 }, + { 141,-49203 }, { 142,-49203 }, { 143,-49203 }, { 144,-49203 }, { 145,-49203 }, + { 146,-49203 }, { 147,-49203 }, { 148,-49203 }, { 149,-49203 }, { 150,-49203 }, + { 151,-49203 }, { 152,-49203 }, { 153,-49203 }, { 154,-49203 }, { 155,-49203 }, + { 156,-49203 }, { 157,-49203 }, { 158,-49203 }, { 159,-49203 }, { 160,-49203 }, + { 161,-49203 }, { 162,-49203 }, { 163,-49203 }, { 164,-49203 }, { 165,-49203 }, + { 166,-49203 }, { 167,-49203 }, { 168,-49203 }, { 169,-49203 }, { 170,-49203 }, + { 171,-49203 }, { 172,-49203 }, { 173,-49203 }, { 174,-49203 }, { 175,-49203 }, + { 176,-49203 }, { 177,-49203 }, { 178,-49203 }, { 179,-49203 }, { 180,-49203 }, + + { 181,-49203 }, { 182,-49203 }, { 183,-49203 }, { 184,-49203 }, { 185,-49203 }, + { 186,-49203 }, { 187,-49203 }, { 188,-49203 }, { 189,-49203 }, { 190,-49203 }, + { 191,-49203 }, { 192,-49203 }, { 193,-49203 }, { 194,-49203 }, { 195,-49203 }, + { 196,-49203 }, { 197,-49203 }, { 198,-49203 }, { 199,-49203 }, { 200,-49203 }, + { 201,-49203 }, { 202,-49203 }, { 203,-49203 }, { 204,-49203 }, { 205,-49203 }, + { 206,-49203 }, { 207,-49203 }, { 208,-49203 }, { 209,-49203 }, { 210,-49203 }, + { 211,-49203 }, { 212,-49203 }, { 213,-49203 }, { 214,-49203 }, { 215,-49203 }, + { 216,-49203 }, { 217,-49203 }, { 218,-49203 }, { 219,-49203 }, { 220,-49203 }, + { 221,-49203 }, { 222,-49203 }, { 223,-49203 }, { 224,-49203 }, { 225,-49203 }, + { 226,-49203 }, { 227,-49203 }, { 228,-49203 }, { 229,-49203 }, { 230,-49203 }, + + { 231,-49203 }, { 232,-49203 }, { 233,-49203 }, { 234,-49203 }, { 235,-49203 }, + { 236,-49203 }, { 237,-49203 }, { 238,-49203 }, { 239,-49203 }, { 240,-49203 }, + { 241,-49203 }, { 242,-49203 }, { 243,-49203 }, { 244,-49203 }, { 245,-49203 }, + { 246,-49203 }, { 247,-49203 }, { 248,-49203 }, { 249,-49203 }, { 250,-49203 }, + { 251,-49203 }, { 252,-49203 }, { 253,-49203 }, { 254,-49203 }, { 255,-49203 }, + { 0, 63 }, { 0,42663 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-49460 }, + { 49,-49460 }, { 50,-49460 }, { 51,-49460 }, { 52,-49460 }, { 53,-49460 }, + { 54,-49460 }, { 55,-49460 }, { 56,-49460 }, { 57,-49460 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-49460 }, { 66,-49460 }, { 67,-49460 }, { 68,-49460 }, + { 69,-49460 }, { 70,-49460 }, { 71,-49460 }, { 72,-49460 }, { 73,-49460 }, + + { 74,-49460 }, { 75,-49460 }, { 76,11308 }, { 77,-49460 }, { 78,-49460 }, + { 79,-49460 }, { 80,-49460 }, { 81,-49460 }, { 82,-49460 }, { 83,-49460 }, + { 84,-49460 }, { 85,-49460 }, { 86,-49460 }, { 87,-49460 }, { 88,-49460 }, + { 89,-49460 }, { 90,-49460 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-49460 }, { 0, 0 }, { 97,-49460 }, { 98,-49460 }, + { 99,-49460 }, { 100,-49460 }, { 101,-49460 }, { 102,-49460 }, { 103,-49460 }, + { 104,-49460 }, { 105,-49460 }, { 106,-49460 }, { 107,-49460 }, { 108,11308 }, + { 109,-49460 }, { 110,-49460 }, { 111,-49460 }, { 112,-49460 }, { 113,-49460 }, + { 114,-49460 }, { 115,-49460 }, { 116,-49460 }, { 117,-49460 }, { 118,-49460 }, + { 119,-49460 }, { 120,-49460 }, { 121,-49460 }, { 122,-49460 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-49460 }, { 128,-49460 }, + { 129,-49460 }, { 130,-49460 }, { 131,-49460 }, { 132,-49460 }, { 133,-49460 }, + { 134,-49460 }, { 135,-49460 }, { 136,-49460 }, { 137,-49460 }, { 138,-49460 }, + { 139,-49460 }, { 140,-49460 }, { 141,-49460 }, { 142,-49460 }, { 143,-49460 }, + { 144,-49460 }, { 145,-49460 }, { 146,-49460 }, { 147,-49460 }, { 148,-49460 }, + { 149,-49460 }, { 150,-49460 }, { 151,-49460 }, { 152,-49460 }, { 153,-49460 }, + { 154,-49460 }, { 155,-49460 }, { 156,-49460 }, { 157,-49460 }, { 158,-49460 }, + { 159,-49460 }, { 160,-49460 }, { 161,-49460 }, { 162,-49460 }, { 163,-49460 }, + { 164,-49460 }, { 165,-49460 }, { 166,-49460 }, { 167,-49460 }, { 168,-49460 }, + { 169,-49460 }, { 170,-49460 }, { 171,-49460 }, { 172,-49460 }, { 173,-49460 }, + + { 174,-49460 }, { 175,-49460 }, { 176,-49460 }, { 177,-49460 }, { 178,-49460 }, + { 179,-49460 }, { 180,-49460 }, { 181,-49460 }, { 182,-49460 }, { 183,-49460 }, + { 184,-49460 }, { 185,-49460 }, { 186,-49460 }, { 187,-49460 }, { 188,-49460 }, + { 189,-49460 }, { 190,-49460 }, { 191,-49460 }, { 192,-49460 }, { 193,-49460 }, + { 194,-49460 }, { 195,-49460 }, { 196,-49460 }, { 197,-49460 }, { 198,-49460 }, + { 199,-49460 }, { 200,-49460 }, { 201,-49460 }, { 202,-49460 }, { 203,-49460 }, + { 204,-49460 }, { 205,-49460 }, { 206,-49460 }, { 207,-49460 }, { 208,-49460 }, + { 209,-49460 }, { 210,-49460 }, { 211,-49460 }, { 212,-49460 }, { 213,-49460 }, + { 214,-49460 }, { 215,-49460 }, { 216,-49460 }, { 217,-49460 }, { 218,-49460 }, + { 219,-49460 }, { 220,-49460 }, { 221,-49460 }, { 222,-49460 }, { 223,-49460 }, + + { 224,-49460 }, { 225,-49460 }, { 226,-49460 }, { 227,-49460 }, { 228,-49460 }, + { 229,-49460 }, { 230,-49460 }, { 231,-49460 }, { 232,-49460 }, { 233,-49460 }, + { 234,-49460 }, { 235,-49460 }, { 236,-49460 }, { 237,-49460 }, { 238,-49460 }, + { 239,-49460 }, { 240,-49460 }, { 241,-49460 }, { 242,-49460 }, { 243,-49460 }, + { 244,-49460 }, { 245,-49460 }, { 246,-49460 }, { 247,-49460 }, { 248,-49460 }, + { 249,-49460 }, { 250,-49460 }, { 251,-49460 }, { 252,-49460 }, { 253,-49460 }, + { 254,-49460 }, { 255,-49460 }, { 0, 131 }, { 0,42406 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-49717 }, { 49,-49717 }, { 50,-49717 }, { 51,-49717 }, + { 52,-49717 }, { 53,-49717 }, { 54,-49717 }, { 55,-49717 }, { 56,-49717 }, + { 57,-49717 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-49717 }, { 66,-49717 }, + + { 67,11308 }, { 68,-49717 }, { 69,-49717 }, { 70,-49717 }, { 71,-49717 }, + { 72,-49717 }, { 73,-49717 }, { 74,-49717 }, { 75,-49717 }, { 76,-49717 }, + { 77,-49717 }, { 78,-49717 }, { 79,-49717 }, { 80,-49717 }, { 81,-49717 }, + { 82,-49717 }, { 83,-49717 }, { 84,-49717 }, { 85,-49717 }, { 86,-49717 }, + { 87,-49717 }, { 88,-49717 }, { 89,-49717 }, { 90,-49717 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-49717 }, { 0, 0 }, + { 97,-49717 }, { 98,-49717 }, { 99,11308 }, { 100,-49717 }, { 101,-49717 }, + { 102,-49717 }, { 103,-49717 }, { 104,-49717 }, { 105,-49717 }, { 106,-49717 }, + { 107,-49717 }, { 108,-49717 }, { 109,-49717 }, { 110,-49717 }, { 111,-49717 }, + { 112,-49717 }, { 113,-49717 }, { 114,-49717 }, { 115,-49717 }, { 116,-49717 }, + + { 117,-49717 }, { 118,-49717 }, { 119,-49717 }, { 120,-49717 }, { 121,-49717 }, + { 122,-49717 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-49717 }, { 128,-49717 }, { 129,-49717 }, { 130,-49717 }, { 131,-49717 }, + { 132,-49717 }, { 133,-49717 }, { 134,-49717 }, { 135,-49717 }, { 136,-49717 }, + { 137,-49717 }, { 138,-49717 }, { 139,-49717 }, { 140,-49717 }, { 141,-49717 }, + { 142,-49717 }, { 143,-49717 }, { 144,-49717 }, { 145,-49717 }, { 146,-49717 }, + { 147,-49717 }, { 148,-49717 }, { 149,-49717 }, { 150,-49717 }, { 151,-49717 }, + { 152,-49717 }, { 153,-49717 }, { 154,-49717 }, { 155,-49717 }, { 156,-49717 }, + { 157,-49717 }, { 158,-49717 }, { 159,-49717 }, { 160,-49717 }, { 161,-49717 }, + { 162,-49717 }, { 163,-49717 }, { 164,-49717 }, { 165,-49717 }, { 166,-49717 }, + + { 167,-49717 }, { 168,-49717 }, { 169,-49717 }, { 170,-49717 }, { 171,-49717 }, + { 172,-49717 }, { 173,-49717 }, { 174,-49717 }, { 175,-49717 }, { 176,-49717 }, + { 177,-49717 }, { 178,-49717 }, { 179,-49717 }, { 180,-49717 }, { 181,-49717 }, + { 182,-49717 }, { 183,-49717 }, { 184,-49717 }, { 185,-49717 }, { 186,-49717 }, + { 187,-49717 }, { 188,-49717 }, { 189,-49717 }, { 190,-49717 }, { 191,-49717 }, + { 192,-49717 }, { 193,-49717 }, { 194,-49717 }, { 195,-49717 }, { 196,-49717 }, + { 197,-49717 }, { 198,-49717 }, { 199,-49717 }, { 200,-49717 }, { 201,-49717 }, + { 202,-49717 }, { 203,-49717 }, { 204,-49717 }, { 205,-49717 }, { 206,-49717 }, + { 207,-49717 }, { 208,-49717 }, { 209,-49717 }, { 210,-49717 }, { 211,-49717 }, + { 212,-49717 }, { 213,-49717 }, { 214,-49717 }, { 215,-49717 }, { 216,-49717 }, + + { 217,-49717 }, { 218,-49717 }, { 219,-49717 }, { 220,-49717 }, { 221,-49717 }, + { 222,-49717 }, { 223,-49717 }, { 224,-49717 }, { 225,-49717 }, { 226,-49717 }, + { 227,-49717 }, { 228,-49717 }, { 229,-49717 }, { 230,-49717 }, { 231,-49717 }, + { 232,-49717 }, { 233,-49717 }, { 234,-49717 }, { 235,-49717 }, { 236,-49717 }, + { 237,-49717 }, { 238,-49717 }, { 239,-49717 }, { 240,-49717 }, { 241,-49717 }, + { 242,-49717 }, { 243,-49717 }, { 244,-49717 }, { 245,-49717 }, { 246,-49717 }, + { 247,-49717 }, { 248,-49717 }, { 249,-49717 }, { 250,-49717 }, { 251,-49717 }, + { 252,-49717 }, { 253,-49717 }, { 254,-49717 }, { 255,-49717 }, { 0, 131 }, + { 0,42149 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-49974 }, { 49,-49974 }, + { 50,-49974 }, { 51,-49974 }, { 52,-49974 }, { 53,-49974 }, { 54,-49974 }, + { 55,-49974 }, { 56,-49974 }, { 57,-49974 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-49974 }, { 66,-49974 }, { 67,-49974 }, { 68,-49974 }, { 69,-49974 }, + { 70,-49974 }, { 71,-49974 }, { 72,-49974 }, { 73,11308 }, { 74,-49974 }, + { 75,-49974 }, { 76,-49974 }, { 77,-49974 }, { 78,-49974 }, { 79,-49974 }, + { 80,-49974 }, { 81,-49974 }, { 82,-49974 }, { 83,-49974 }, { 84,-49974 }, + { 85,-49974 }, { 86,-49974 }, { 87,-49974 }, { 88,-49974 }, { 89,-49974 }, + { 90,-49974 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-49974 }, { 0, 0 }, { 97,-49974 }, { 98,-49974 }, { 99,-49974 }, + { 100,-49974 }, { 101,-49974 }, { 102,-49974 }, { 103,-49974 }, { 104,-49974 }, + { 105,11308 }, { 106,-49974 }, { 107,-49974 }, { 108,-49974 }, { 109,-49974 }, + + { 110,-49974 }, { 111,-49974 }, { 112,-49974 }, { 113,-49974 }, { 114,-49974 }, + { 115,-49974 }, { 116,-49974 }, { 117,-49974 }, { 118,-49974 }, { 119,-49974 }, + { 120,-49974 }, { 121,-49974 }, { 122,-49974 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-49974 }, { 128,-49974 }, { 129,-49974 }, + { 130,-49974 }, { 131,-49974 }, { 132,-49974 }, { 133,-49974 }, { 134,-49974 }, + { 135,-49974 }, { 136,-49974 }, { 137,-49974 }, { 138,-49974 }, { 139,-49974 }, + { 140,-49974 }, { 141,-49974 }, { 142,-49974 }, { 143,-49974 }, { 144,-49974 }, + { 145,-49974 }, { 146,-49974 }, { 147,-49974 }, { 148,-49974 }, { 149,-49974 }, + { 150,-49974 }, { 151,-49974 }, { 152,-49974 }, { 153,-49974 }, { 154,-49974 }, + { 155,-49974 }, { 156,-49974 }, { 157,-49974 }, { 158,-49974 }, { 159,-49974 }, + + { 160,-49974 }, { 161,-49974 }, { 162,-49974 }, { 163,-49974 }, { 164,-49974 }, + { 165,-49974 }, { 166,-49974 }, { 167,-49974 }, { 168,-49974 }, { 169,-49974 }, + { 170,-49974 }, { 171,-49974 }, { 172,-49974 }, { 173,-49974 }, { 174,-49974 }, + { 175,-49974 }, { 176,-49974 }, { 177,-49974 }, { 178,-49974 }, { 179,-49974 }, + { 180,-49974 }, { 181,-49974 }, { 182,-49974 }, { 183,-49974 }, { 184,-49974 }, + { 185,-49974 }, { 186,-49974 }, { 187,-49974 }, { 188,-49974 }, { 189,-49974 }, + { 190,-49974 }, { 191,-49974 }, { 192,-49974 }, { 193,-49974 }, { 194,-49974 }, + { 195,-49974 }, { 196,-49974 }, { 197,-49974 }, { 198,-49974 }, { 199,-49974 }, + { 200,-49974 }, { 201,-49974 }, { 202,-49974 }, { 203,-49974 }, { 204,-49974 }, + { 205,-49974 }, { 206,-49974 }, { 207,-49974 }, { 208,-49974 }, { 209,-49974 }, + + { 210,-49974 }, { 211,-49974 }, { 212,-49974 }, { 213,-49974 }, { 214,-49974 }, + { 215,-49974 }, { 216,-49974 }, { 217,-49974 }, { 218,-49974 }, { 219,-49974 }, + { 220,-49974 }, { 221,-49974 }, { 222,-49974 }, { 223,-49974 }, { 224,-49974 }, + { 225,-49974 }, { 226,-49974 }, { 227,-49974 }, { 228,-49974 }, { 229,-49974 }, + { 230,-49974 }, { 231,-49974 }, { 232,-49974 }, { 233,-49974 }, { 234,-49974 }, + { 235,-49974 }, { 236,-49974 }, { 237,-49974 }, { 238,-49974 }, { 239,-49974 }, + { 240,-49974 }, { 241,-49974 }, { 242,-49974 }, { 243,-49974 }, { 244,-49974 }, + { 245,-49974 }, { 246,-49974 }, { 247,-49974 }, { 248,-49974 }, { 249,-49974 }, + { 250,-49974 }, { 251,-49974 }, { 252,-49974 }, { 253,-49974 }, { 254,-49974 }, + { 255,-49974 }, { 0, 131 }, { 0,41892 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-50231 }, { 49,-50231 }, { 50,-50231 }, { 51,-50231 }, { 52,-50231 }, + + { 53,-50231 }, { 54,-50231 }, { 55,-50231 }, { 56,-50231 }, { 57,-50231 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-50231 }, { 66,-50231 }, { 67,-50231 }, + { 68,-50231 }, { 69,-50231 }, { 70,-50231 }, { 71,-50231 }, { 72,-50231 }, + { 73,-50231 }, { 74,-50231 }, { 75,-50231 }, { 76,11308 }, { 77,-50231 }, + { 78,-50231 }, { 79,-50231 }, { 80,-50231 }, { 81,-50231 }, { 82,-50231 }, + { 83,-50231 }, { 84,-50231 }, { 85,-50231 }, { 86,-50231 }, { 87,-50231 }, + { 88,-50231 }, { 89,-50231 }, { 90,-50231 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-50231 }, { 0, 0 }, { 97,-50231 }, + { 98,-50231 }, { 99,-50231 }, { 100,-50231 }, { 101,-50231 }, { 102,-50231 }, + + { 103,-50231 }, { 104,-50231 }, { 105,-50231 }, { 106,-50231 }, { 107,-50231 }, + { 108,11308 }, { 109,-50231 }, { 110,-50231 }, { 111,-50231 }, { 112,-50231 }, + { 113,-50231 }, { 114,-50231 }, { 115,-50231 }, { 116,-50231 }, { 117,-50231 }, + { 118,-50231 }, { 119,-50231 }, { 120,-50231 }, { 121,-50231 }, { 122,-50231 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-50231 }, + { 128,-50231 }, { 129,-50231 }, { 130,-50231 }, { 131,-50231 }, { 132,-50231 }, + { 133,-50231 }, { 134,-50231 }, { 135,-50231 }, { 136,-50231 }, { 137,-50231 }, + { 138,-50231 }, { 139,-50231 }, { 140,-50231 }, { 141,-50231 }, { 142,-50231 }, + { 143,-50231 }, { 144,-50231 }, { 145,-50231 }, { 146,-50231 }, { 147,-50231 }, + { 148,-50231 }, { 149,-50231 }, { 150,-50231 }, { 151,-50231 }, { 152,-50231 }, + + { 153,-50231 }, { 154,-50231 }, { 155,-50231 }, { 156,-50231 }, { 157,-50231 }, + { 158,-50231 }, { 159,-50231 }, { 160,-50231 }, { 161,-50231 }, { 162,-50231 }, + { 163,-50231 }, { 164,-50231 }, { 165,-50231 }, { 166,-50231 }, { 167,-50231 }, + { 168,-50231 }, { 169,-50231 }, { 170,-50231 }, { 171,-50231 }, { 172,-50231 }, + { 173,-50231 }, { 174,-50231 }, { 175,-50231 }, { 176,-50231 }, { 177,-50231 }, + { 178,-50231 }, { 179,-50231 }, { 180,-50231 }, { 181,-50231 }, { 182,-50231 }, + { 183,-50231 }, { 184,-50231 }, { 185,-50231 }, { 186,-50231 }, { 187,-50231 }, + { 188,-50231 }, { 189,-50231 }, { 190,-50231 }, { 191,-50231 }, { 192,-50231 }, + { 193,-50231 }, { 194,-50231 }, { 195,-50231 }, { 196,-50231 }, { 197,-50231 }, + { 198,-50231 }, { 199,-50231 }, { 200,-50231 }, { 201,-50231 }, { 202,-50231 }, + + { 203,-50231 }, { 204,-50231 }, { 205,-50231 }, { 206,-50231 }, { 207,-50231 }, + { 208,-50231 }, { 209,-50231 }, { 210,-50231 }, { 211,-50231 }, { 212,-50231 }, + { 213,-50231 }, { 214,-50231 }, { 215,-50231 }, { 216,-50231 }, { 217,-50231 }, + { 218,-50231 }, { 219,-50231 }, { 220,-50231 }, { 221,-50231 }, { 222,-50231 }, + { 223,-50231 }, { 224,-50231 }, { 225,-50231 }, { 226,-50231 }, { 227,-50231 }, + { 228,-50231 }, { 229,-50231 }, { 230,-50231 }, { 231,-50231 }, { 232,-50231 }, + { 233,-50231 }, { 234,-50231 }, { 235,-50231 }, { 236,-50231 }, { 237,-50231 }, + { 238,-50231 }, { 239,-50231 }, { 240,-50231 }, { 241,-50231 }, { 242,-50231 }, + { 243,-50231 }, { 244,-50231 }, { 245,-50231 }, { 246,-50231 }, { 247,-50231 }, + { 248,-50231 }, { 249,-50231 }, { 250,-50231 }, { 251,-50231 }, { 252,-50231 }, + + { 253,-50231 }, { 254,-50231 }, { 255,-50231 }, { 0, 131 }, { 0,41635 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 48,-50488 }, { 49,-50488 }, { 50,-50488 }, + { 51,-50488 }, { 52,-50488 }, { 53,-50488 }, { 54,-50488 }, { 55,-50488 }, + { 56,-50488 }, { 57,-50488 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-50488 }, + { 66,-50488 }, { 67,-50488 }, { 68,-50488 }, { 69,-50488 }, { 70,-50488 }, + { 71,-50488 }, { 72,-50488 }, { 73,-50488 }, { 74,-50488 }, { 75,-50488 }, + { 76,-50488 }, { 77,11308 }, { 78,-50488 }, { 79,-50488 }, { 80,-50488 }, + { 81,-50488 }, { 82,-50488 }, { 83,-50488 }, { 84,-50488 }, { 85,-50488 }, + { 86,-50488 }, { 87,-50488 }, { 88,-50488 }, { 89,-50488 }, { 90,-50488 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-50488 }, + + { 0, 0 }, { 97,-50488 }, { 98,-50488 }, { 99,-50488 }, { 100,-50488 }, + { 101,-50488 }, { 102,-50488 }, { 103,-50488 }, { 104,-50488 }, { 105,-50488 }, + { 106,-50488 }, { 107,-50488 }, { 108,-50488 }, { 109,11308 }, { 110,-50488 }, + { 111,-50488 }, { 112,-50488 }, { 113,-50488 }, { 114,-50488 }, { 115,-50488 }, + { 116,-50488 }, { 117,-50488 }, { 118,-50488 }, { 119,-50488 }, { 120,-50488 }, + { 121,-50488 }, { 122,-50488 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-50488 }, { 128,-50488 }, { 129,-50488 }, { 130,-50488 }, + { 131,-50488 }, { 132,-50488 }, { 133,-50488 }, { 134,-50488 }, { 135,-50488 }, + { 136,-50488 }, { 137,-50488 }, { 138,-50488 }, { 139,-50488 }, { 140,-50488 }, + { 141,-50488 }, { 142,-50488 }, { 143,-50488 }, { 144,-50488 }, { 145,-50488 }, + + { 146,-50488 }, { 147,-50488 }, { 148,-50488 }, { 149,-50488 }, { 150,-50488 }, + { 151,-50488 }, { 152,-50488 }, { 153,-50488 }, { 154,-50488 }, { 155,-50488 }, + { 156,-50488 }, { 157,-50488 }, { 158,-50488 }, { 159,-50488 }, { 160,-50488 }, + { 161,-50488 }, { 162,-50488 }, { 163,-50488 }, { 164,-50488 }, { 165,-50488 }, + { 166,-50488 }, { 167,-50488 }, { 168,-50488 }, { 169,-50488 }, { 170,-50488 }, + { 171,-50488 }, { 172,-50488 }, { 173,-50488 }, { 174,-50488 }, { 175,-50488 }, + { 176,-50488 }, { 177,-50488 }, { 178,-50488 }, { 179,-50488 }, { 180,-50488 }, + { 181,-50488 }, { 182,-50488 }, { 183,-50488 }, { 184,-50488 }, { 185,-50488 }, + { 186,-50488 }, { 187,-50488 }, { 188,-50488 }, { 189,-50488 }, { 190,-50488 }, + { 191,-50488 }, { 192,-50488 }, { 193,-50488 }, { 194,-50488 }, { 195,-50488 }, + + { 196,-50488 }, { 197,-50488 }, { 198,-50488 }, { 199,-50488 }, { 200,-50488 }, + { 201,-50488 }, { 202,-50488 }, { 203,-50488 }, { 204,-50488 }, { 205,-50488 }, + { 206,-50488 }, { 207,-50488 }, { 208,-50488 }, { 209,-50488 }, { 210,-50488 }, + { 211,-50488 }, { 212,-50488 }, { 213,-50488 }, { 214,-50488 }, { 215,-50488 }, + { 216,-50488 }, { 217,-50488 }, { 218,-50488 }, { 219,-50488 }, { 220,-50488 }, + { 221,-50488 }, { 222,-50488 }, { 223,-50488 }, { 224,-50488 }, { 225,-50488 }, + { 226,-50488 }, { 227,-50488 }, { 228,-50488 }, { 229,-50488 }, { 230,-50488 }, + { 231,-50488 }, { 232,-50488 }, { 233,-50488 }, { 234,-50488 }, { 235,-50488 }, + { 236,-50488 }, { 237,-50488 }, { 238,-50488 }, { 239,-50488 }, { 240,-50488 }, + { 241,-50488 }, { 242,-50488 }, { 243,-50488 }, { 244,-50488 }, { 245,-50488 }, + + { 246,-50488 }, { 247,-50488 }, { 248,-50488 }, { 249,-50488 }, { 250,-50488 }, + { 251,-50488 }, { 252,-50488 }, { 253,-50488 }, { 254,-50488 }, { 255,-50488 }, + { 0, 131 }, { 0,41378 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-50745 }, + { 49,-50745 }, { 50,-50745 }, { 51,-50745 }, { 52,-50745 }, { 53,-50745 }, + { 54,-50745 }, { 55,-50745 }, { 56,-50745 }, { 57,-50745 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-50745 }, { 66,-50745 }, { 67,-50745 }, { 68,11308 }, + { 69,-50745 }, { 70,-50745 }, { 71,-50745 }, { 72,-50745 }, { 73,-50745 }, + { 74,-50745 }, { 75,-50745 }, { 76,-50745 }, { 77,-50745 }, { 78,-50745 }, + { 79,-50745 }, { 80,-50745 }, { 81,-50745 }, { 82,-50745 }, { 83,-50745 }, + { 84,-50745 }, { 85,-50745 }, { 86,-50745 }, { 87,-50745 }, { 88,-50745 }, + + { 89,-50745 }, { 90,-50745 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-50745 }, { 0, 0 }, { 97,-50745 }, { 98,-50745 }, + { 99,-50745 }, { 100,11308 }, { 101,-50745 }, { 102,-50745 }, { 103,-50745 }, + { 104,-50745 }, { 105,-50745 }, { 106,-50745 }, { 107,-50745 }, { 108,-50745 }, + { 109,-50745 }, { 110,-50745 }, { 111,-50745 }, { 112,-50745 }, { 113,-50745 }, + { 114,-50745 }, { 115,-50745 }, { 116,-50745 }, { 117,-50745 }, { 118,-50745 }, + { 119,-50745 }, { 120,-50745 }, { 121,-50745 }, { 122,-50745 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-50745 }, { 128,-50745 }, + { 129,-50745 }, { 130,-50745 }, { 131,-50745 }, { 132,-50745 }, { 133,-50745 }, + { 134,-50745 }, { 135,-50745 }, { 136,-50745 }, { 137,-50745 }, { 138,-50745 }, + + { 139,-50745 }, { 140,-50745 }, { 141,-50745 }, { 142,-50745 }, { 143,-50745 }, + { 144,-50745 }, { 145,-50745 }, { 146,-50745 }, { 147,-50745 }, { 148,-50745 }, + { 149,-50745 }, { 150,-50745 }, { 151,-50745 }, { 152,-50745 }, { 153,-50745 }, + { 154,-50745 }, { 155,-50745 }, { 156,-50745 }, { 157,-50745 }, { 158,-50745 }, + { 159,-50745 }, { 160,-50745 }, { 161,-50745 }, { 162,-50745 }, { 163,-50745 }, + { 164,-50745 }, { 165,-50745 }, { 166,-50745 }, { 167,-50745 }, { 168,-50745 }, + { 169,-50745 }, { 170,-50745 }, { 171,-50745 }, { 172,-50745 }, { 173,-50745 }, + { 174,-50745 }, { 175,-50745 }, { 176,-50745 }, { 177,-50745 }, { 178,-50745 }, + { 179,-50745 }, { 180,-50745 }, { 181,-50745 }, { 182,-50745 }, { 183,-50745 }, + { 184,-50745 }, { 185,-50745 }, { 186,-50745 }, { 187,-50745 }, { 188,-50745 }, + + { 189,-50745 }, { 190,-50745 }, { 191,-50745 }, { 192,-50745 }, { 193,-50745 }, + { 194,-50745 }, { 195,-50745 }, { 196,-50745 }, { 197,-50745 }, { 198,-50745 }, + { 199,-50745 }, { 200,-50745 }, { 201,-50745 }, { 202,-50745 }, { 203,-50745 }, + { 204,-50745 }, { 205,-50745 }, { 206,-50745 }, { 207,-50745 }, { 208,-50745 }, + { 209,-50745 }, { 210,-50745 }, { 211,-50745 }, { 212,-50745 }, { 213,-50745 }, + { 214,-50745 }, { 215,-50745 }, { 216,-50745 }, { 217,-50745 }, { 218,-50745 }, + { 219,-50745 }, { 220,-50745 }, { 221,-50745 }, { 222,-50745 }, { 223,-50745 }, + { 224,-50745 }, { 225,-50745 }, { 226,-50745 }, { 227,-50745 }, { 228,-50745 }, + { 229,-50745 }, { 230,-50745 }, { 231,-50745 }, { 232,-50745 }, { 233,-50745 }, + { 234,-50745 }, { 235,-50745 }, { 236,-50745 }, { 237,-50745 }, { 238,-50745 }, + + { 239,-50745 }, { 240,-50745 }, { 241,-50745 }, { 242,-50745 }, { 243,-50745 }, + { 244,-50745 }, { 245,-50745 }, { 246,-50745 }, { 247,-50745 }, { 248,-50745 }, + { 249,-50745 }, { 250,-50745 }, { 251,-50745 }, { 252,-50745 }, { 253,-50745 }, + { 254,-50745 }, { 255,-50745 }, { 0, 131 }, { 0,41121 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-51002 }, { 49,-51002 }, { 50,-51002 }, { 51,-51002 }, + { 52,-51002 }, { 53,-51002 }, { 54,-51002 }, { 55,-51002 }, { 56,-51002 }, + { 57,-51002 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-51002 }, { 66,-51002 }, + { 67,-51002 }, { 68,-51002 }, { 69,-51002 }, { 70,-51002 }, { 71,-51002 }, + { 72,-51002 }, { 73,-51002 }, { 74,-51002 }, { 75,-51002 }, { 76,-51002 }, + { 77,-51002 }, { 78,11308 }, { 79,-51002 }, { 80,-51002 }, { 81,-51002 }, + + { 82,-51002 }, { 83,-51002 }, { 84,-51002 }, { 85,-51002 }, { 86,-51002 }, + { 87,-51002 }, { 88,-51002 }, { 89,-51002 }, { 90,-51002 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-51002 }, { 0, 0 }, + { 97,-51002 }, { 98,-51002 }, { 99,-51002 }, { 100,-51002 }, { 101,-51002 }, + { 102,-51002 }, { 103,-51002 }, { 104,-51002 }, { 105,-51002 }, { 106,-51002 }, + { 107,-51002 }, { 108,-51002 }, { 109,-51002 }, { 110,11308 }, { 111,-51002 }, + { 112,-51002 }, { 113,-51002 }, { 114,-51002 }, { 115,-51002 }, { 116,-51002 }, + { 117,-51002 }, { 118,-51002 }, { 119,-51002 }, { 120,-51002 }, { 121,-51002 }, + { 122,-51002 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-51002 }, { 128,-51002 }, { 129,-51002 }, { 130,-51002 }, { 131,-51002 }, + + { 132,-51002 }, { 133,-51002 }, { 134,-51002 }, { 135,-51002 }, { 136,-51002 }, + { 137,-51002 }, { 138,-51002 }, { 139,-51002 }, { 140,-51002 }, { 141,-51002 }, + { 142,-51002 }, { 143,-51002 }, { 144,-51002 }, { 145,-51002 }, { 146,-51002 }, + { 147,-51002 }, { 148,-51002 }, { 149,-51002 }, { 150,-51002 }, { 151,-51002 }, + { 152,-51002 }, { 153,-51002 }, { 154,-51002 }, { 155,-51002 }, { 156,-51002 }, + { 157,-51002 }, { 158,-51002 }, { 159,-51002 }, { 160,-51002 }, { 161,-51002 }, + { 162,-51002 }, { 163,-51002 }, { 164,-51002 }, { 165,-51002 }, { 166,-51002 }, + { 167,-51002 }, { 168,-51002 }, { 169,-51002 }, { 170,-51002 }, { 171,-51002 }, + { 172,-51002 }, { 173,-51002 }, { 174,-51002 }, { 175,-51002 }, { 176,-51002 }, + { 177,-51002 }, { 178,-51002 }, { 179,-51002 }, { 180,-51002 }, { 181,-51002 }, + + { 182,-51002 }, { 183,-51002 }, { 184,-51002 }, { 185,-51002 }, { 186,-51002 }, + { 187,-51002 }, { 188,-51002 }, { 189,-51002 }, { 190,-51002 }, { 191,-51002 }, + { 192,-51002 }, { 193,-51002 }, { 194,-51002 }, { 195,-51002 }, { 196,-51002 }, + { 197,-51002 }, { 198,-51002 }, { 199,-51002 }, { 200,-51002 }, { 201,-51002 }, + { 202,-51002 }, { 203,-51002 }, { 204,-51002 }, { 205,-51002 }, { 206,-51002 }, + { 207,-51002 }, { 208,-51002 }, { 209,-51002 }, { 210,-51002 }, { 211,-51002 }, + { 212,-51002 }, { 213,-51002 }, { 214,-51002 }, { 215,-51002 }, { 216,-51002 }, + { 217,-51002 }, { 218,-51002 }, { 219,-51002 }, { 220,-51002 }, { 221,-51002 }, + { 222,-51002 }, { 223,-51002 }, { 224,-51002 }, { 225,-51002 }, { 226,-51002 }, + { 227,-51002 }, { 228,-51002 }, { 229,-51002 }, { 230,-51002 }, { 231,-51002 }, + + { 232,-51002 }, { 233,-51002 }, { 234,-51002 }, { 235,-51002 }, { 236,-51002 }, + { 237,-51002 }, { 238,-51002 }, { 239,-51002 }, { 240,-51002 }, { 241,-51002 }, + { 242,-51002 }, { 243,-51002 }, { 244,-51002 }, { 245,-51002 }, { 246,-51002 }, + { 247,-51002 }, { 248,-51002 }, { 249,-51002 }, { 250,-51002 }, { 251,-51002 }, + { 252,-51002 }, { 253,-51002 }, { 254,-51002 }, { 255,-51002 }, { 0, 131 }, + { 0,40864 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-51259 }, { 49,-51259 }, + { 50,-51259 }, { 51,-51259 }, { 52,-51259 }, { 53,-51259 }, { 54,-51259 }, + { 55,-51259 }, { 56,-51259 }, { 57,-51259 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,11308 }, { 66,-51259 }, { 67,-51259 }, { 68,-51259 }, { 69,-51259 }, + { 70,-51259 }, { 71,-51259 }, { 72,-51259 }, { 73,-51259 }, { 74,-51259 }, + + { 75,-51259 }, { 76,-51259 }, { 77,-51259 }, { 78,-51259 }, { 79,-51259 }, + { 80,-51259 }, { 81,-51259 }, { 82,-51259 }, { 83,-51259 }, { 84,-51259 }, + { 85,-51259 }, { 86,-51259 }, { 87,-51259 }, { 88,-51259 }, { 89,-51259 }, + { 90,-51259 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-51259 }, { 0, 0 }, { 97,11308 }, { 98,-51259 }, { 99,-51259 }, + { 100,-51259 }, { 101,-51259 }, { 102,-51259 }, { 103,-51259 }, { 104,-51259 }, + { 105,-51259 }, { 106,-51259 }, { 107,-51259 }, { 108,-51259 }, { 109,-51259 }, + { 110,-51259 }, { 111,-51259 }, { 112,-51259 }, { 113,-51259 }, { 114,-51259 }, + { 115,-51259 }, { 116,-51259 }, { 117,-51259 }, { 118,-51259 }, { 119,-51259 }, + { 120,-51259 }, { 121,-51259 }, { 122,-51259 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 127,-51259 }, { 128,-51259 }, { 129,-51259 }, + { 130,-51259 }, { 131,-51259 }, { 132,-51259 }, { 133,-51259 }, { 134,-51259 }, + { 135,-51259 }, { 136,-51259 }, { 137,-51259 }, { 138,-51259 }, { 139,-51259 }, + { 140,-51259 }, { 141,-51259 }, { 142,-51259 }, { 143,-51259 }, { 144,-51259 }, + { 145,-51259 }, { 146,-51259 }, { 147,-51259 }, { 148,-51259 }, { 149,-51259 }, + { 150,-51259 }, { 151,-51259 }, { 152,-51259 }, { 153,-51259 }, { 154,-51259 }, + { 155,-51259 }, { 156,-51259 }, { 157,-51259 }, { 158,-51259 }, { 159,-51259 }, + { 160,-51259 }, { 161,-51259 }, { 162,-51259 }, { 163,-51259 }, { 164,-51259 }, + { 165,-51259 }, { 166,-51259 }, { 167,-51259 }, { 168,-51259 }, { 169,-51259 }, + { 170,-51259 }, { 171,-51259 }, { 172,-51259 }, { 173,-51259 }, { 174,-51259 }, + + { 175,-51259 }, { 176,-51259 }, { 177,-51259 }, { 178,-51259 }, { 179,-51259 }, + { 180,-51259 }, { 181,-51259 }, { 182,-51259 }, { 183,-51259 }, { 184,-51259 }, + { 185,-51259 }, { 186,-51259 }, { 187,-51259 }, { 188,-51259 }, { 189,-51259 }, + { 190,-51259 }, { 191,-51259 }, { 192,-51259 }, { 193,-51259 }, { 194,-51259 }, + { 195,-51259 }, { 196,-51259 }, { 197,-51259 }, { 198,-51259 }, { 199,-51259 }, + { 200,-51259 }, { 201,-51259 }, { 202,-51259 }, { 203,-51259 }, { 204,-51259 }, + { 205,-51259 }, { 206,-51259 }, { 207,-51259 }, { 208,-51259 }, { 209,-51259 }, + { 210,-51259 }, { 211,-51259 }, { 212,-51259 }, { 213,-51259 }, { 214,-51259 }, + { 215,-51259 }, { 216,-51259 }, { 217,-51259 }, { 218,-51259 }, { 219,-51259 }, + { 220,-51259 }, { 221,-51259 }, { 222,-51259 }, { 223,-51259 }, { 224,-51259 }, + + { 225,-51259 }, { 226,-51259 }, { 227,-51259 }, { 228,-51259 }, { 229,-51259 }, + { 230,-51259 }, { 231,-51259 }, { 232,-51259 }, { 233,-51259 }, { 234,-51259 }, + { 235,-51259 }, { 236,-51259 }, { 237,-51259 }, { 238,-51259 }, { 239,-51259 }, + { 240,-51259 }, { 241,-51259 }, { 242,-51259 }, { 243,-51259 }, { 244,-51259 }, + { 245,-51259 }, { 246,-51259 }, { 247,-51259 }, { 248,-51259 }, { 249,-51259 }, + { 250,-51259 }, { 251,-51259 }, { 252,-51259 }, { 253,-51259 }, { 254,-51259 }, + { 255,-51259 }, { 0, 131 }, { 0,40607 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-51516 }, { 49,-51516 }, { 50,-51516 }, { 51,-51516 }, { 52,-51516 }, + { 53,-51516 }, { 54,-51516 }, { 55,-51516 }, { 56,-51516 }, { 57,-51516 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-51516 }, { 66,-51516 }, { 67,-51516 }, + + { 68,-51516 }, { 69,-51516 }, { 70,11308 }, { 71,-51516 }, { 72,-51516 }, + { 73,-51516 }, { 74,-51516 }, { 75,-51516 }, { 76,-51516 }, { 77,-51516 }, + { 78,-51516 }, { 79,-51516 }, { 80,-51516 }, { 81,-51516 }, { 82,-51516 }, + { 83,-51516 }, { 84,-51516 }, { 85,-51516 }, { 86,-51516 }, { 87,-51516 }, + { 88,-51516 }, { 89,-51516 }, { 90,-51516 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-51516 }, { 0, 0 }, { 97,-51516 }, + { 98,-51516 }, { 99,-51516 }, { 100,-51516 }, { 101,-51516 }, { 102,11308 }, + { 103,-51516 }, { 104,-51516 }, { 105,-51516 }, { 106,-51516 }, { 107,-51516 }, + { 108,-51516 }, { 109,-51516 }, { 110,-51516 }, { 111,-51516 }, { 112,-51516 }, + { 113,-51516 }, { 114,-51516 }, { 115,-51516 }, { 116,-51516 }, { 117,-51516 }, + + { 118,-51516 }, { 119,-51516 }, { 120,-51516 }, { 121,-51516 }, { 122,-51516 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-51516 }, + { 128,-51516 }, { 129,-51516 }, { 130,-51516 }, { 131,-51516 }, { 132,-51516 }, + { 133,-51516 }, { 134,-51516 }, { 135,-51516 }, { 136,-51516 }, { 137,-51516 }, + { 138,-51516 }, { 139,-51516 }, { 140,-51516 }, { 141,-51516 }, { 142,-51516 }, + { 143,-51516 }, { 144,-51516 }, { 145,-51516 }, { 146,-51516 }, { 147,-51516 }, + { 148,-51516 }, { 149,-51516 }, { 150,-51516 }, { 151,-51516 }, { 152,-51516 }, + { 153,-51516 }, { 154,-51516 }, { 155,-51516 }, { 156,-51516 }, { 157,-51516 }, + { 158,-51516 }, { 159,-51516 }, { 160,-51516 }, { 161,-51516 }, { 162,-51516 }, + { 163,-51516 }, { 164,-51516 }, { 165,-51516 }, { 166,-51516 }, { 167,-51516 }, + + { 168,-51516 }, { 169,-51516 }, { 170,-51516 }, { 171,-51516 }, { 172,-51516 }, + { 173,-51516 }, { 174,-51516 }, { 175,-51516 }, { 176,-51516 }, { 177,-51516 }, + { 178,-51516 }, { 179,-51516 }, { 180,-51516 }, { 181,-51516 }, { 182,-51516 }, + { 183,-51516 }, { 184,-51516 }, { 185,-51516 }, { 186,-51516 }, { 187,-51516 }, + { 188,-51516 }, { 189,-51516 }, { 190,-51516 }, { 191,-51516 }, { 192,-51516 }, + { 193,-51516 }, { 194,-51516 }, { 195,-51516 }, { 196,-51516 }, { 197,-51516 }, + { 198,-51516 }, { 199,-51516 }, { 200,-51516 }, { 201,-51516 }, { 202,-51516 }, + { 203,-51516 }, { 204,-51516 }, { 205,-51516 }, { 206,-51516 }, { 207,-51516 }, + { 208,-51516 }, { 209,-51516 }, { 210,-51516 }, { 211,-51516 }, { 212,-51516 }, + { 213,-51516 }, { 214,-51516 }, { 215,-51516 }, { 216,-51516 }, { 217,-51516 }, + + { 218,-51516 }, { 219,-51516 }, { 220,-51516 }, { 221,-51516 }, { 222,-51516 }, + { 223,-51516 }, { 224,-51516 }, { 225,-51516 }, { 226,-51516 }, { 227,-51516 }, + { 228,-51516 }, { 229,-51516 }, { 230,-51516 }, { 231,-51516 }, { 232,-51516 }, + { 233,-51516 }, { 234,-51516 }, { 235,-51516 }, { 236,-51516 }, { 237,-51516 }, + { 238,-51516 }, { 239,-51516 }, { 240,-51516 }, { 241,-51516 }, { 242,-51516 }, + { 243,-51516 }, { 244,-51516 }, { 245,-51516 }, { 246,-51516 }, { 247,-51516 }, + { 248,-51516 }, { 249,-51516 }, { 250,-51516 }, { 251,-51516 }, { 252,-51516 }, + { 253,-51516 }, { 254,-51516 }, { 255,-51516 }, { 0, 69 }, { 0,40350 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-51773 }, { 49,-51773 }, { 50,-51773 }, + { 51,-51773 }, { 52,-51773 }, { 53,-51773 }, { 54,-51773 }, { 55,-51773 }, + { 56,-51773 }, { 57,-51773 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-51773 }, + { 66,-51773 }, { 67,-51773 }, { 68,-51773 }, { 69,-51773 }, { 70,-51773 }, + { 71,-51773 }, { 72,-51773 }, { 73,-51773 }, { 74,-51773 }, { 75,-51773 }, + { 76,-51773 }, { 77,-51773 }, { 78,-51773 }, { 79,-51773 }, { 80,-51773 }, + { 81,-51773 }, { 82,-51773 }, { 83,-51773 }, { 84,-51773 }, { 85,-51773 }, + { 86,-51773 }, { 87,-51773 }, { 88,-51773 }, { 89,-51773 }, { 90,-51773 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-51773 }, + { 0, 0 }, { 97,-51773 }, { 98,-51773 }, { 99,-51773 }, { 100,-51773 }, + { 101,-51773 }, { 102,-51773 }, { 103,-51773 }, { 104,-51773 }, { 105,-51773 }, + { 106,-51773 }, { 107,-51773 }, { 108,-51773 }, { 109,-51773 }, { 110,-51773 }, + + { 111,-51773 }, { 112,-51773 }, { 113,-51773 }, { 114,-51773 }, { 115,-51773 }, + { 116,-51773 }, { 117,-51773 }, { 118,-51773 }, { 119,-51773 }, { 120,-51773 }, + { 121,-51773 }, { 122,-51773 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-51773 }, { 128,-51773 }, { 129,-51773 }, { 130,-51773 }, + { 131,-51773 }, { 132,-51773 }, { 133,-51773 }, { 134,-51773 }, { 135,-51773 }, + { 136,-51773 }, { 137,-51773 }, { 138,-51773 }, { 139,-51773 }, { 140,-51773 }, + { 141,-51773 }, { 142,-51773 }, { 143,-51773 }, { 144,-51773 }, { 145,-51773 }, + { 146,-51773 }, { 147,-51773 }, { 148,-51773 }, { 149,-51773 }, { 150,-51773 }, + { 151,-51773 }, { 152,-51773 }, { 153,-51773 }, { 154,-51773 }, { 155,-51773 }, + { 156,-51773 }, { 157,-51773 }, { 158,-51773 }, { 159,-51773 }, { 160,-51773 }, + + { 161,-51773 }, { 162,-51773 }, { 163,-51773 }, { 164,-51773 }, { 165,-51773 }, + { 166,-51773 }, { 167,-51773 }, { 168,-51773 }, { 169,-51773 }, { 170,-51773 }, + { 171,-51773 }, { 172,-51773 }, { 173,-51773 }, { 174,-51773 }, { 175,-51773 }, + { 176,-51773 }, { 177,-51773 }, { 178,-51773 }, { 179,-51773 }, { 180,-51773 }, + { 181,-51773 }, { 182,-51773 }, { 183,-51773 }, { 184,-51773 }, { 185,-51773 }, + { 186,-51773 }, { 187,-51773 }, { 188,-51773 }, { 189,-51773 }, { 190,-51773 }, + { 191,-51773 }, { 192,-51773 }, { 193,-51773 }, { 194,-51773 }, { 195,-51773 }, + { 196,-51773 }, { 197,-51773 }, { 198,-51773 }, { 199,-51773 }, { 200,-51773 }, + { 201,-51773 }, { 202,-51773 }, { 203,-51773 }, { 204,-51773 }, { 205,-51773 }, + { 206,-51773 }, { 207,-51773 }, { 208,-51773 }, { 209,-51773 }, { 210,-51773 }, + + { 211,-51773 }, { 212,-51773 }, { 213,-51773 }, { 214,-51773 }, { 215,-51773 }, + { 216,-51773 }, { 217,-51773 }, { 218,-51773 }, { 219,-51773 }, { 220,-51773 }, + { 221,-51773 }, { 222,-51773 }, { 223,-51773 }, { 224,-51773 }, { 225,-51773 }, + { 226,-51773 }, { 227,-51773 }, { 228,-51773 }, { 229,-51773 }, { 230,-51773 }, + { 231,-51773 }, { 232,-51773 }, { 233,-51773 }, { 234,-51773 }, { 235,-51773 }, + { 236,-51773 }, { 237,-51773 }, { 238,-51773 }, { 239,-51773 }, { 240,-51773 }, + { 241,-51773 }, { 242,-51773 }, { 243,-51773 }, { 244,-51773 }, { 245,-51773 }, + { 246,-51773 }, { 247,-51773 }, { 248,-51773 }, { 249,-51773 }, { 250,-51773 }, + { 251,-51773 }, { 252,-51773 }, { 253,-51773 }, { 254,-51773 }, { 255,-51773 }, + { 0, 131 }, { 0,40093 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-52030 }, + { 49,-52030 }, { 50,-52030 }, { 51,-52030 }, { 52,-52030 }, { 53,-52030 }, + + { 54,-52030 }, { 55,-52030 }, { 56,-52030 }, { 57,-52030 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-52030 }, { 66,-52030 }, { 67,-52030 }, { 68,-52030 }, + { 69,-52030 }, { 70,-52030 }, { 71,-52030 }, { 72,-52030 }, { 73,-52030 }, + { 74,-52030 }, { 75,-52030 }, { 76,-52030 }, { 77,-52030 }, { 78,-52030 }, + { 79,-52030 }, { 80,11051 }, { 81,-52030 }, { 82,-52030 }, { 83,-52030 }, + { 84,-52030 }, { 85,-52030 }, { 86,-52030 }, { 87,-52030 }, { 88,-52030 }, + { 89,-52030 }, { 90,-52030 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-52030 }, { 0, 0 }, { 97,-52030 }, { 98,-52030 }, + { 99,-52030 }, { 100,-52030 }, { 101,-52030 }, { 102,-52030 }, { 103,-52030 }, + + { 104,-52030 }, { 105,-52030 }, { 106,-52030 }, { 107,-52030 }, { 108,-52030 }, + { 109,-52030 }, { 110,-52030 }, { 111,-52030 }, { 112,11051 }, { 113,-52030 }, + { 114,-52030 }, { 115,-52030 }, { 116,-52030 }, { 117,-52030 }, { 118,-52030 }, + { 119,-52030 }, { 120,-52030 }, { 121,-52030 }, { 122,-52030 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-52030 }, { 128,-52030 }, + { 129,-52030 }, { 130,-52030 }, { 131,-52030 }, { 132,-52030 }, { 133,-52030 }, + { 134,-52030 }, { 135,-52030 }, { 136,-52030 }, { 137,-52030 }, { 138,-52030 }, + { 139,-52030 }, { 140,-52030 }, { 141,-52030 }, { 142,-52030 }, { 143,-52030 }, + { 144,-52030 }, { 145,-52030 }, { 146,-52030 }, { 147,-52030 }, { 148,-52030 }, + { 149,-52030 }, { 150,-52030 }, { 151,-52030 }, { 152,-52030 }, { 153,-52030 }, + + { 154,-52030 }, { 155,-52030 }, { 156,-52030 }, { 157,-52030 }, { 158,-52030 }, + { 159,-52030 }, { 160,-52030 }, { 161,-52030 }, { 162,-52030 }, { 163,-52030 }, + { 164,-52030 }, { 165,-52030 }, { 166,-52030 }, { 167,-52030 }, { 168,-52030 }, + { 169,-52030 }, { 170,-52030 }, { 171,-52030 }, { 172,-52030 }, { 173,-52030 }, + { 174,-52030 }, { 175,-52030 }, { 176,-52030 }, { 177,-52030 }, { 178,-52030 }, + { 179,-52030 }, { 180,-52030 }, { 181,-52030 }, { 182,-52030 }, { 183,-52030 }, + { 184,-52030 }, { 185,-52030 }, { 186,-52030 }, { 187,-52030 }, { 188,-52030 }, + { 189,-52030 }, { 190,-52030 }, { 191,-52030 }, { 192,-52030 }, { 193,-52030 }, + { 194,-52030 }, { 195,-52030 }, { 196,-52030 }, { 197,-52030 }, { 198,-52030 }, + { 199,-52030 }, { 200,-52030 }, { 201,-52030 }, { 202,-52030 }, { 203,-52030 }, + + { 204,-52030 }, { 205,-52030 }, { 206,-52030 }, { 207,-52030 }, { 208,-52030 }, + { 209,-52030 }, { 210,-52030 }, { 211,-52030 }, { 212,-52030 }, { 213,-52030 }, + { 214,-52030 }, { 215,-52030 }, { 216,-52030 }, { 217,-52030 }, { 218,-52030 }, + { 219,-52030 }, { 220,-52030 }, { 221,-52030 }, { 222,-52030 }, { 223,-52030 }, + { 224,-52030 }, { 225,-52030 }, { 226,-52030 }, { 227,-52030 }, { 228,-52030 }, + { 229,-52030 }, { 230,-52030 }, { 231,-52030 }, { 232,-52030 }, { 233,-52030 }, + { 234,-52030 }, { 235,-52030 }, { 236,-52030 }, { 237,-52030 }, { 238,-52030 }, + { 239,-52030 }, { 240,-52030 }, { 241,-52030 }, { 242,-52030 }, { 243,-52030 }, + { 244,-52030 }, { 245,-52030 }, { 246,-52030 }, { 247,-52030 }, { 248,-52030 }, + { 249,-52030 }, { 250,-52030 }, { 251,-52030 }, { 252,-52030 }, { 253,-52030 }, + + { 254,-52030 }, { 255,-52030 }, { 0, 26 }, { 0,39836 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 48,-52287 }, { 49,-52287 }, { 50,-52287 }, { 51,-52287 }, + { 52,-52287 }, { 53,-52287 }, { 54,-52287 }, { 55,-52287 }, { 56,-52287 }, + { 57,-52287 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-52287 }, { 66,-52287 }, + { 67,-52287 }, { 68,-52287 }, { 69,-52287 }, { 70,-52287 }, { 71,-52287 }, + { 72,-52287 }, { 73,-52287 }, { 74,-52287 }, { 75,-52287 }, { 76,-52287 }, + { 77,-52287 }, { 78,-52287 }, { 79,-52287 }, { 80,-52287 }, { 81,-52287 }, + { 82,-52287 }, { 83,-52287 }, { 84,-52287 }, { 85,-52287 }, { 86,-52287 }, + { 87,-52287 }, { 88,-52287 }, { 89,-52287 }, { 90,-52287 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-52287 }, { 0, 0 }, + + { 97,-52287 }, { 98,-52287 }, { 99,-52287 }, { 100,-52287 }, { 101,-52287 }, + { 102,-52287 }, { 103,-52287 }, { 104,-52287 }, { 105,-52287 }, { 106,-52287 }, + { 107,-52287 }, { 108,-52287 }, { 109,-52287 }, { 110,-52287 }, { 111,-52287 }, + { 112,-52287 }, { 113,-52287 }, { 114,-52287 }, { 115,-52287 }, { 116,-52287 }, + { 117,-52287 }, { 118,-52287 }, { 119,-52287 }, { 120,-52287 }, { 121,-52287 }, + { 122,-52287 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-52287 }, { 128,-52287 }, { 129,-52287 }, { 130,-52287 }, { 131,-52287 }, + { 132,-52287 }, { 133,-52287 }, { 134,-52287 }, { 135,-52287 }, { 136,-52287 }, + { 137,-52287 }, { 138,-52287 }, { 139,-52287 }, { 140,-52287 }, { 141,-52287 }, + { 142,-52287 }, { 143,-52287 }, { 144,-52287 }, { 145,-52287 }, { 146,-52287 }, + + { 147,-52287 }, { 148,-52287 }, { 149,-52287 }, { 150,-52287 }, { 151,-52287 }, + { 152,-52287 }, { 153,-52287 }, { 154,-52287 }, { 155,-52287 }, { 156,-52287 }, + { 157,-52287 }, { 158,-52287 }, { 159,-52287 }, { 160,-52287 }, { 161,-52287 }, + { 162,-52287 }, { 163,-52287 }, { 164,-52287 }, { 165,-52287 }, { 166,-52287 }, + { 167,-52287 }, { 168,-52287 }, { 169,-52287 }, { 170,-52287 }, { 171,-52287 }, + { 172,-52287 }, { 173,-52287 }, { 174,-52287 }, { 175,-52287 }, { 176,-52287 }, + { 177,-52287 }, { 178,-52287 }, { 179,-52287 }, { 180,-52287 }, { 181,-52287 }, + { 182,-52287 }, { 183,-52287 }, { 184,-52287 }, { 185,-52287 }, { 186,-52287 }, + { 187,-52287 }, { 188,-52287 }, { 189,-52287 }, { 190,-52287 }, { 191,-52287 }, + { 192,-52287 }, { 193,-52287 }, { 194,-52287 }, { 195,-52287 }, { 196,-52287 }, + + { 197,-52287 }, { 198,-52287 }, { 199,-52287 }, { 200,-52287 }, { 201,-52287 }, + { 202,-52287 }, { 203,-52287 }, { 204,-52287 }, { 205,-52287 }, { 206,-52287 }, + { 207,-52287 }, { 208,-52287 }, { 209,-52287 }, { 210,-52287 }, { 211,-52287 }, + { 212,-52287 }, { 213,-52287 }, { 214,-52287 }, { 215,-52287 }, { 216,-52287 }, + { 217,-52287 }, { 218,-52287 }, { 219,-52287 }, { 220,-52287 }, { 221,-52287 }, + { 222,-52287 }, { 223,-52287 }, { 224,-52287 }, { 225,-52287 }, { 226,-52287 }, + { 227,-52287 }, { 228,-52287 }, { 229,-52287 }, { 230,-52287 }, { 231,-52287 }, + { 232,-52287 }, { 233,-52287 }, { 234,-52287 }, { 235,-52287 }, { 236,-52287 }, + { 237,-52287 }, { 238,-52287 }, { 239,-52287 }, { 240,-52287 }, { 241,-52287 }, + { 242,-52287 }, { 243,-52287 }, { 244,-52287 }, { 245,-52287 }, { 246,-52287 }, + + { 247,-52287 }, { 248,-52287 }, { 249,-52287 }, { 250,-52287 }, { 251,-52287 }, + { 252,-52287 }, { 253,-52287 }, { 254,-52287 }, { 255,-52287 }, { 0, 131 }, + { 0,39579 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-52544 }, { 49,-52544 }, + { 50,-52544 }, { 51,-52544 }, { 52,-52544 }, { 53,-52544 }, { 54,-52544 }, + { 55,-52544 }, { 56,-52544 }, { 57,-52544 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-52544 }, { 66,-52544 }, { 67,-52544 }, { 68,-52544 }, { 69,-52544 }, + { 70,-52544 }, { 71,-52544 }, { 72,-52544 }, { 73,-52544 }, { 74,-52544 }, + { 75,-52544 }, { 76,-52544 }, { 77,-52544 }, { 78,-52544 }, { 79,-52544 }, + { 80,-52544 }, { 81,-52544 }, { 82,-52544 }, { 83,-52544 }, { 84,10794 }, + { 85,-52544 }, { 86,-52544 }, { 87,-52544 }, { 88,-52544 }, { 89,-52544 }, + + { 90,-52544 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-52544 }, { 0, 0 }, { 97,-52544 }, { 98,-52544 }, { 99,-52544 }, + { 100,-52544 }, { 101,-52544 }, { 102,-52544 }, { 103,-52544 }, { 104,-52544 }, + { 105,-52544 }, { 106,-52544 }, { 107,-52544 }, { 108,-52544 }, { 109,-52544 }, + { 110,-52544 }, { 111,-52544 }, { 112,-52544 }, { 113,-52544 }, { 114,-52544 }, + { 115,-52544 }, { 116,10794 }, { 117,-52544 }, { 118,-52544 }, { 119,-52544 }, + { 120,-52544 }, { 121,-52544 }, { 122,-52544 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-52544 }, { 128,-52544 }, { 129,-52544 }, + { 130,-52544 }, { 131,-52544 }, { 132,-52544 }, { 133,-52544 }, { 134,-52544 }, + { 135,-52544 }, { 136,-52544 }, { 137,-52544 }, { 138,-52544 }, { 139,-52544 }, + + { 140,-52544 }, { 141,-52544 }, { 142,-52544 }, { 143,-52544 }, { 144,-52544 }, + { 145,-52544 }, { 146,-52544 }, { 147,-52544 }, { 148,-52544 }, { 149,-52544 }, + { 150,-52544 }, { 151,-52544 }, { 152,-52544 }, { 153,-52544 }, { 154,-52544 }, + { 155,-52544 }, { 156,-52544 }, { 157,-52544 }, { 158,-52544 }, { 159,-52544 }, + { 160,-52544 }, { 161,-52544 }, { 162,-52544 }, { 163,-52544 }, { 164,-52544 }, + { 165,-52544 }, { 166,-52544 }, { 167,-52544 }, { 168,-52544 }, { 169,-52544 }, + { 170,-52544 }, { 171,-52544 }, { 172,-52544 }, { 173,-52544 }, { 174,-52544 }, + { 175,-52544 }, { 176,-52544 }, { 177,-52544 }, { 178,-52544 }, { 179,-52544 }, + { 180,-52544 }, { 181,-52544 }, { 182,-52544 }, { 183,-52544 }, { 184,-52544 }, + { 185,-52544 }, { 186,-52544 }, { 187,-52544 }, { 188,-52544 }, { 189,-52544 }, + + { 190,-52544 }, { 191,-52544 }, { 192,-52544 }, { 193,-52544 }, { 194,-52544 }, + { 195,-52544 }, { 196,-52544 }, { 197,-52544 }, { 198,-52544 }, { 199,-52544 }, + { 200,-52544 }, { 201,-52544 }, { 202,-52544 }, { 203,-52544 }, { 204,-52544 }, + { 205,-52544 }, { 206,-52544 }, { 207,-52544 }, { 208,-52544 }, { 209,-52544 }, + { 210,-52544 }, { 211,-52544 }, { 212,-52544 }, { 213,-52544 }, { 214,-52544 }, + { 215,-52544 }, { 216,-52544 }, { 217,-52544 }, { 218,-52544 }, { 219,-52544 }, + { 220,-52544 }, { 221,-52544 }, { 222,-52544 }, { 223,-52544 }, { 224,-52544 }, + { 225,-52544 }, { 226,-52544 }, { 227,-52544 }, { 228,-52544 }, { 229,-52544 }, + { 230,-52544 }, { 231,-52544 }, { 232,-52544 }, { 233,-52544 }, { 234,-52544 }, + { 235,-52544 }, { 236,-52544 }, { 237,-52544 }, { 238,-52544 }, { 239,-52544 }, + + { 240,-52544 }, { 241,-52544 }, { 242,-52544 }, { 243,-52544 }, { 244,-52544 }, + { 245,-52544 }, { 246,-52544 }, { 247,-52544 }, { 248,-52544 }, { 249,-52544 }, + { 250,-52544 }, { 251,-52544 }, { 252,-52544 }, { 253,-52544 }, { 254,-52544 }, + { 255,-52544 }, { 0, 131 }, { 0,39322 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-52801 }, { 49,-52801 }, { 50,-52801 }, { 51,-52801 }, { 52,-52801 }, + { 53,-52801 }, { 54,-52801 }, { 55,-52801 }, { 56,-52801 }, { 57,-52801 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-52801 }, { 66,-52801 }, { 67,10794 }, + { 68,-52801 }, { 69,-52801 }, { 70,-52801 }, { 71,-52801 }, { 72,-52801 }, + { 73,-52801 }, { 74,-52801 }, { 75,-52801 }, { 76,-52801 }, { 77,-52801 }, + { 78,-52801 }, { 79,-52801 }, { 80,-52801 }, { 81,-52801 }, { 82,-52801 }, + + { 83,-52801 }, { 84,-52801 }, { 85,-52801 }, { 86,-52801 }, { 87,-52801 }, + { 88,-52801 }, { 89,-52801 }, { 90,-52801 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-52801 }, { 0, 0 }, { 97,-52801 }, + { 98,-52801 }, { 99,10794 }, { 100,-52801 }, { 101,-52801 }, { 102,-52801 }, + { 103,-52801 }, { 104,-52801 }, { 105,-52801 }, { 106,-52801 }, { 107,-52801 }, + { 108,-52801 }, { 109,-52801 }, { 110,-52801 }, { 111,-52801 }, { 112,-52801 }, + { 113,-52801 }, { 114,-52801 }, { 115,-52801 }, { 116,-52801 }, { 117,-52801 }, + { 118,-52801 }, { 119,-52801 }, { 120,-52801 }, { 121,-52801 }, { 122,-52801 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-52801 }, + { 128,-52801 }, { 129,-52801 }, { 130,-52801 }, { 131,-52801 }, { 132,-52801 }, + + { 133,-52801 }, { 134,-52801 }, { 135,-52801 }, { 136,-52801 }, { 137,-52801 }, + { 138,-52801 }, { 139,-52801 }, { 140,-52801 }, { 141,-52801 }, { 142,-52801 }, + { 143,-52801 }, { 144,-52801 }, { 145,-52801 }, { 146,-52801 }, { 147,-52801 }, + { 148,-52801 }, { 149,-52801 }, { 150,-52801 }, { 151,-52801 }, { 152,-52801 }, + { 153,-52801 }, { 154,-52801 }, { 155,-52801 }, { 156,-52801 }, { 157,-52801 }, + { 158,-52801 }, { 159,-52801 }, { 160,-52801 }, { 161,-52801 }, { 162,-52801 }, + { 163,-52801 }, { 164,-52801 }, { 165,-52801 }, { 166,-52801 }, { 167,-52801 }, + { 168,-52801 }, { 169,-52801 }, { 170,-52801 }, { 171,-52801 }, { 172,-52801 }, + { 173,-52801 }, { 174,-52801 }, { 175,-52801 }, { 176,-52801 }, { 177,-52801 }, + { 178,-52801 }, { 179,-52801 }, { 180,-52801 }, { 181,-52801 }, { 182,-52801 }, + + { 183,-52801 }, { 184,-52801 }, { 185,-52801 }, { 186,-52801 }, { 187,-52801 }, + { 188,-52801 }, { 189,-52801 }, { 190,-52801 }, { 191,-52801 }, { 192,-52801 }, + { 193,-52801 }, { 194,-52801 }, { 195,-52801 }, { 196,-52801 }, { 197,-52801 }, + { 198,-52801 }, { 199,-52801 }, { 200,-52801 }, { 201,-52801 }, { 202,-52801 }, + { 203,-52801 }, { 204,-52801 }, { 205,-52801 }, { 206,-52801 }, { 207,-52801 }, + { 208,-52801 }, { 209,-52801 }, { 210,-52801 }, { 211,-52801 }, { 212,-52801 }, + { 213,-52801 }, { 214,-52801 }, { 215,-52801 }, { 216,-52801 }, { 217,-52801 }, + { 218,-52801 }, { 219,-52801 }, { 220,-52801 }, { 221,-52801 }, { 222,-52801 }, + { 223,-52801 }, { 224,-52801 }, { 225,-52801 }, { 226,-52801 }, { 227,-52801 }, + { 228,-52801 }, { 229,-52801 }, { 230,-52801 }, { 231,-52801 }, { 232,-52801 }, + + { 233,-52801 }, { 234,-52801 }, { 235,-52801 }, { 236,-52801 }, { 237,-52801 }, + { 238,-52801 }, { 239,-52801 }, { 240,-52801 }, { 241,-52801 }, { 242,-52801 }, + { 243,-52801 }, { 244,-52801 }, { 245,-52801 }, { 246,-52801 }, { 247,-52801 }, + { 248,-52801 }, { 249,-52801 }, { 250,-52801 }, { 251,-52801 }, { 252,-52801 }, + { 253,-52801 }, { 254,-52801 }, { 255,-52801 }, { 0, 131 }, { 0,39065 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-53058 }, { 49,-53058 }, { 50,-53058 }, + { 51,-53058 }, { 52,-53058 }, { 53,-53058 }, { 54,-53058 }, { 55,-53058 }, + { 56,-53058 }, { 57,-53058 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-53058 }, + { 66,-53058 }, { 67,10794 }, { 68,-53058 }, { 69,-53058 }, { 70,-53058 }, + { 71,-53058 }, { 72,-53058 }, { 73,-53058 }, { 74,-53058 }, { 75,-53058 }, + + { 76,-53058 }, { 77,-53058 }, { 78,-53058 }, { 79,-53058 }, { 80,-53058 }, + { 81,-53058 }, { 82,-53058 }, { 83,-53058 }, { 84,-53058 }, { 85,-53058 }, + { 86,-53058 }, { 87,-53058 }, { 88,-53058 }, { 89,-53058 }, { 90,-53058 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-53058 }, + { 0, 0 }, { 97,-53058 }, { 98,-53058 }, { 99,10794 }, { 100,-53058 }, + { 101,-53058 }, { 102,-53058 }, { 103,-53058 }, { 104,-53058 }, { 105,-53058 }, + { 106,-53058 }, { 107,-53058 }, { 108,-53058 }, { 109,-53058 }, { 110,-53058 }, + { 111,-53058 }, { 112,-53058 }, { 113,-53058 }, { 114,-53058 }, { 115,-53058 }, + { 116,-53058 }, { 117,-53058 }, { 118,-53058 }, { 119,-53058 }, { 120,-53058 }, + { 121,-53058 }, { 122,-53058 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 127,-53058 }, { 128,-53058 }, { 129,-53058 }, { 130,-53058 }, + { 131,-53058 }, { 132,-53058 }, { 133,-53058 }, { 134,-53058 }, { 135,-53058 }, + { 136,-53058 }, { 137,-53058 }, { 138,-53058 }, { 139,-53058 }, { 140,-53058 }, + { 141,-53058 }, { 142,-53058 }, { 143,-53058 }, { 144,-53058 }, { 145,-53058 }, + { 146,-53058 }, { 147,-53058 }, { 148,-53058 }, { 149,-53058 }, { 150,-53058 }, + { 151,-53058 }, { 152,-53058 }, { 153,-53058 }, { 154,-53058 }, { 155,-53058 }, + { 156,-53058 }, { 157,-53058 }, { 158,-53058 }, { 159,-53058 }, { 160,-53058 }, + { 161,-53058 }, { 162,-53058 }, { 163,-53058 }, { 164,-53058 }, { 165,-53058 }, + { 166,-53058 }, { 167,-53058 }, { 168,-53058 }, { 169,-53058 }, { 170,-53058 }, + { 171,-53058 }, { 172,-53058 }, { 173,-53058 }, { 174,-53058 }, { 175,-53058 }, + + { 176,-53058 }, { 177,-53058 }, { 178,-53058 }, { 179,-53058 }, { 180,-53058 }, + { 181,-53058 }, { 182,-53058 }, { 183,-53058 }, { 184,-53058 }, { 185,-53058 }, + { 186,-53058 }, { 187,-53058 }, { 188,-53058 }, { 189,-53058 }, { 190,-53058 }, + { 191,-53058 }, { 192,-53058 }, { 193,-53058 }, { 194,-53058 }, { 195,-53058 }, + { 196,-53058 }, { 197,-53058 }, { 198,-53058 }, { 199,-53058 }, { 200,-53058 }, + { 201,-53058 }, { 202,-53058 }, { 203,-53058 }, { 204,-53058 }, { 205,-53058 }, + { 206,-53058 }, { 207,-53058 }, { 208,-53058 }, { 209,-53058 }, { 210,-53058 }, + { 211,-53058 }, { 212,-53058 }, { 213,-53058 }, { 214,-53058 }, { 215,-53058 }, + { 216,-53058 }, { 217,-53058 }, { 218,-53058 }, { 219,-53058 }, { 220,-53058 }, + { 221,-53058 }, { 222,-53058 }, { 223,-53058 }, { 224,-53058 }, { 225,-53058 }, + + { 226,-53058 }, { 227,-53058 }, { 228,-53058 }, { 229,-53058 }, { 230,-53058 }, + { 231,-53058 }, { 232,-53058 }, { 233,-53058 }, { 234,-53058 }, { 235,-53058 }, + { 236,-53058 }, { 237,-53058 }, { 238,-53058 }, { 239,-53058 }, { 240,-53058 }, + { 241,-53058 }, { 242,-53058 }, { 243,-53058 }, { 244,-53058 }, { 245,-53058 }, + { 246,-53058 }, { 247,-53058 }, { 248,-53058 }, { 249,-53058 }, { 250,-53058 }, + { 251,-53058 }, { 252,-53058 }, { 253,-53058 }, { 254,-53058 }, { 255,-53058 }, + { 0, 131 }, { 0,38808 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-53315 }, + { 49,-53315 }, { 50,-53315 }, { 51,-53315 }, { 52,-53315 }, { 53,-53315 }, + { 54,-53315 }, { 55,-53315 }, { 56,-53315 }, { 57,-53315 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-53315 }, { 66,-53315 }, { 67,-53315 }, { 68,-53315 }, + + { 69,-53315 }, { 70,-53315 }, { 71,-53315 }, { 72,-53315 }, { 73,-53315 }, + { 74,-53315 }, { 75,-53315 }, { 76,-53315 }, { 77,-53315 }, { 78,-53315 }, + { 79,-53315 }, { 80,-53315 }, { 81,-53315 }, { 82,10794 }, { 83,-53315 }, + { 84,-53315 }, { 85,-53315 }, { 86,-53315 }, { 87,-53315 }, { 88,-53315 }, + { 89,-53315 }, { 90,-53315 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-53315 }, { 0, 0 }, { 97,-53315 }, { 98,-53315 }, + { 99,-53315 }, { 100,-53315 }, { 101,-53315 }, { 102,-53315 }, { 103,-53315 }, + { 104,-53315 }, { 105,-53315 }, { 106,-53315 }, { 107,-53315 }, { 108,-53315 }, + { 109,-53315 }, { 110,-53315 }, { 111,-53315 }, { 112,-53315 }, { 113,-53315 }, + { 114,10794 }, { 115,-53315 }, { 116,-53315 }, { 117,-53315 }, { 118,-53315 }, + + { 119,-53315 }, { 120,-53315 }, { 121,-53315 }, { 122,-53315 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-53315 }, { 128,-53315 }, + { 129,-53315 }, { 130,-53315 }, { 131,-53315 }, { 132,-53315 }, { 133,-53315 }, + { 134,-53315 }, { 135,-53315 }, { 136,-53315 }, { 137,-53315 }, { 138,-53315 }, + { 139,-53315 }, { 140,-53315 }, { 141,-53315 }, { 142,-53315 }, { 143,-53315 }, + { 144,-53315 }, { 145,-53315 }, { 146,-53315 }, { 147,-53315 }, { 148,-53315 }, + { 149,-53315 }, { 150,-53315 }, { 151,-53315 }, { 152,-53315 }, { 153,-53315 }, + { 154,-53315 }, { 155,-53315 }, { 156,-53315 }, { 157,-53315 }, { 158,-53315 }, + { 159,-53315 }, { 160,-53315 }, { 161,-53315 }, { 162,-53315 }, { 163,-53315 }, + { 164,-53315 }, { 165,-53315 }, { 166,-53315 }, { 167,-53315 }, { 168,-53315 }, + + { 169,-53315 }, { 170,-53315 }, { 171,-53315 }, { 172,-53315 }, { 173,-53315 }, + { 174,-53315 }, { 175,-53315 }, { 176,-53315 }, { 177,-53315 }, { 178,-53315 }, + { 179,-53315 }, { 180,-53315 }, { 181,-53315 }, { 182,-53315 }, { 183,-53315 }, + { 184,-53315 }, { 185,-53315 }, { 186,-53315 }, { 187,-53315 }, { 188,-53315 }, + { 189,-53315 }, { 190,-53315 }, { 191,-53315 }, { 192,-53315 }, { 193,-53315 }, + { 194,-53315 }, { 195,-53315 }, { 196,-53315 }, { 197,-53315 }, { 198,-53315 }, + { 199,-53315 }, { 200,-53315 }, { 201,-53315 }, { 202,-53315 }, { 203,-53315 }, + { 204,-53315 }, { 205,-53315 }, { 206,-53315 }, { 207,-53315 }, { 208,-53315 }, + { 209,-53315 }, { 210,-53315 }, { 211,-53315 }, { 212,-53315 }, { 213,-53315 }, + { 214,-53315 }, { 215,-53315 }, { 216,-53315 }, { 217,-53315 }, { 218,-53315 }, + + { 219,-53315 }, { 220,-53315 }, { 221,-53315 }, { 222,-53315 }, { 223,-53315 }, + { 224,-53315 }, { 225,-53315 }, { 226,-53315 }, { 227,-53315 }, { 228,-53315 }, + { 229,-53315 }, { 230,-53315 }, { 231,-53315 }, { 232,-53315 }, { 233,-53315 }, + { 234,-53315 }, { 235,-53315 }, { 236,-53315 }, { 237,-53315 }, { 238,-53315 }, + { 239,-53315 }, { 240,-53315 }, { 241,-53315 }, { 242,-53315 }, { 243,-53315 }, + { 244,-53315 }, { 245,-53315 }, { 246,-53315 }, { 247,-53315 }, { 248,-53315 }, + { 249,-53315 }, { 250,-53315 }, { 251,-53315 }, { 252,-53315 }, { 253,-53315 }, + { 254,-53315 }, { 255,-53315 }, { 0, 131 }, { 0,38551 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-53572 }, { 49,-53572 }, { 50,-53572 }, { 51,-53572 }, + { 52,-53572 }, { 53,-53572 }, { 54,-53572 }, { 55,-53572 }, { 56,-53572 }, + { 57,-53572 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-53572 }, { 66,-53572 }, + { 67,-53572 }, { 68,-53572 }, { 69,-53572 }, { 70,-53572 }, { 71,-53572 }, + { 72,-53572 }, { 73,-53572 }, { 74,-53572 }, { 75,-53572 }, { 76,-53572 }, + { 77,-53572 }, { 78,10794 }, { 79,-53572 }, { 80,-53572 }, { 81,-53572 }, + { 82,-53572 }, { 83,-53572 }, { 84,-53572 }, { 85,-53572 }, { 86,-53572 }, + { 87,-53572 }, { 88,-53572 }, { 89,-53572 }, { 90,-53572 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-53572 }, { 0, 0 }, + { 97,-53572 }, { 98,-53572 }, { 99,-53572 }, { 100,-53572 }, { 101,-53572 }, + { 102,-53572 }, { 103,-53572 }, { 104,-53572 }, { 105,-53572 }, { 106,-53572 }, + { 107,-53572 }, { 108,-53572 }, { 109,-53572 }, { 110,10794 }, { 111,-53572 }, + + { 112,-53572 }, { 113,-53572 }, { 114,-53572 }, { 115,-53572 }, { 116,-53572 }, + { 117,-53572 }, { 118,-53572 }, { 119,-53572 }, { 120,-53572 }, { 121,-53572 }, + { 122,-53572 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-53572 }, { 128,-53572 }, { 129,-53572 }, { 130,-53572 }, { 131,-53572 }, + { 132,-53572 }, { 133,-53572 }, { 134,-53572 }, { 135,-53572 }, { 136,-53572 }, + { 137,-53572 }, { 138,-53572 }, { 139,-53572 }, { 140,-53572 }, { 141,-53572 }, + { 142,-53572 }, { 143,-53572 }, { 144,-53572 }, { 145,-53572 }, { 146,-53572 }, + { 147,-53572 }, { 148,-53572 }, { 149,-53572 }, { 150,-53572 }, { 151,-53572 }, + { 152,-53572 }, { 153,-53572 }, { 154,-53572 }, { 155,-53572 }, { 156,-53572 }, + { 157,-53572 }, { 158,-53572 }, { 159,-53572 }, { 160,-53572 }, { 161,-53572 }, + + { 162,-53572 }, { 163,-53572 }, { 164,-53572 }, { 165,-53572 }, { 166,-53572 }, + { 167,-53572 }, { 168,-53572 }, { 169,-53572 }, { 170,-53572 }, { 171,-53572 }, + { 172,-53572 }, { 173,-53572 }, { 174,-53572 }, { 175,-53572 }, { 176,-53572 }, + { 177,-53572 }, { 178,-53572 }, { 179,-53572 }, { 180,-53572 }, { 181,-53572 }, + { 182,-53572 }, { 183,-53572 }, { 184,-53572 }, { 185,-53572 }, { 186,-53572 }, + { 187,-53572 }, { 188,-53572 }, { 189,-53572 }, { 190,-53572 }, { 191,-53572 }, + { 192,-53572 }, { 193,-53572 }, { 194,-53572 }, { 195,-53572 }, { 196,-53572 }, + { 197,-53572 }, { 198,-53572 }, { 199,-53572 }, { 200,-53572 }, { 201,-53572 }, + { 202,-53572 }, { 203,-53572 }, { 204,-53572 }, { 205,-53572 }, { 206,-53572 }, + { 207,-53572 }, { 208,-53572 }, { 209,-53572 }, { 210,-53572 }, { 211,-53572 }, + + { 212,-53572 }, { 213,-53572 }, { 214,-53572 }, { 215,-53572 }, { 216,-53572 }, + { 217,-53572 }, { 218,-53572 }, { 219,-53572 }, { 220,-53572 }, { 221,-53572 }, + { 222,-53572 }, { 223,-53572 }, { 224,-53572 }, { 225,-53572 }, { 226,-53572 }, + { 227,-53572 }, { 228,-53572 }, { 229,-53572 }, { 230,-53572 }, { 231,-53572 }, + { 232,-53572 }, { 233,-53572 }, { 234,-53572 }, { 235,-53572 }, { 236,-53572 }, + { 237,-53572 }, { 238,-53572 }, { 239,-53572 }, { 240,-53572 }, { 241,-53572 }, + { 242,-53572 }, { 243,-53572 }, { 244,-53572 }, { 245,-53572 }, { 246,-53572 }, + { 247,-53572 }, { 248,-53572 }, { 249,-53572 }, { 250,-53572 }, { 251,-53572 }, + { 252,-53572 }, { 253,-53572 }, { 254,-53572 }, { 255,-53572 }, { 0, 131 }, + { 0,38294 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-53829 }, { 49,-53829 }, + { 50,-53829 }, { 51,-53829 }, { 52,-53829 }, { 53,-53829 }, { 54,-53829 }, + + { 55,-53829 }, { 56,-53829 }, { 57,-53829 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-53829 }, { 66,-53829 }, { 67,10794 }, { 68,-53829 }, { 69,-53829 }, + { 70,-53829 }, { 71,-53829 }, { 72,-53829 }, { 73,-53829 }, { 74,-53829 }, + { 75,-53829 }, { 76,-53829 }, { 77,-53829 }, { 78,-53829 }, { 79,-53829 }, + { 80,-53829 }, { 81,-53829 }, { 82,-53829 }, { 83,-53829 }, { 84,-53829 }, + { 85,-53829 }, { 86,-53829 }, { 87,-53829 }, { 88,-53829 }, { 89,-53829 }, + { 90,-53829 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-53829 }, { 0, 0 }, { 97,-53829 }, { 98,-53829 }, { 99,10794 }, + { 100,-53829 }, { 101,-53829 }, { 102,-53829 }, { 103,-53829 }, { 104,-53829 }, + + { 105,-53829 }, { 106,-53829 }, { 107,-53829 }, { 108,-53829 }, { 109,-53829 }, + { 110,-53829 }, { 111,-53829 }, { 112,-53829 }, { 113,-53829 }, { 114,-53829 }, + { 115,-53829 }, { 116,-53829 }, { 117,-53829 }, { 118,-53829 }, { 119,-53829 }, + { 120,-53829 }, { 121,-53829 }, { 122,-53829 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-53829 }, { 128,-53829 }, { 129,-53829 }, + { 130,-53829 }, { 131,-53829 }, { 132,-53829 }, { 133,-53829 }, { 134,-53829 }, + { 135,-53829 }, { 136,-53829 }, { 137,-53829 }, { 138,-53829 }, { 139,-53829 }, + { 140,-53829 }, { 141,-53829 }, { 142,-53829 }, { 143,-53829 }, { 144,-53829 }, + { 145,-53829 }, { 146,-53829 }, { 147,-53829 }, { 148,-53829 }, { 149,-53829 }, + { 150,-53829 }, { 151,-53829 }, { 152,-53829 }, { 153,-53829 }, { 154,-53829 }, + + { 155,-53829 }, { 156,-53829 }, { 157,-53829 }, { 158,-53829 }, { 159,-53829 }, + { 160,-53829 }, { 161,-53829 }, { 162,-53829 }, { 163,-53829 }, { 164,-53829 }, + { 165,-53829 }, { 166,-53829 }, { 167,-53829 }, { 168,-53829 }, { 169,-53829 }, + { 170,-53829 }, { 171,-53829 }, { 172,-53829 }, { 173,-53829 }, { 174,-53829 }, + { 175,-53829 }, { 176,-53829 }, { 177,-53829 }, { 178,-53829 }, { 179,-53829 }, + { 180,-53829 }, { 181,-53829 }, { 182,-53829 }, { 183,-53829 }, { 184,-53829 }, + { 185,-53829 }, { 186,-53829 }, { 187,-53829 }, { 188,-53829 }, { 189,-53829 }, + { 190,-53829 }, { 191,-53829 }, { 192,-53829 }, { 193,-53829 }, { 194,-53829 }, + { 195,-53829 }, { 196,-53829 }, { 197,-53829 }, { 198,-53829 }, { 199,-53829 }, + { 200,-53829 }, { 201,-53829 }, { 202,-53829 }, { 203,-53829 }, { 204,-53829 }, + + { 205,-53829 }, { 206,-53829 }, { 207,-53829 }, { 208,-53829 }, { 209,-53829 }, + { 210,-53829 }, { 211,-53829 }, { 212,-53829 }, { 213,-53829 }, { 214,-53829 }, + { 215,-53829 }, { 216,-53829 }, { 217,-53829 }, { 218,-53829 }, { 219,-53829 }, + { 220,-53829 }, { 221,-53829 }, { 222,-53829 }, { 223,-53829 }, { 224,-53829 }, + { 225,-53829 }, { 226,-53829 }, { 227,-53829 }, { 228,-53829 }, { 229,-53829 }, + { 230,-53829 }, { 231,-53829 }, { 232,-53829 }, { 233,-53829 }, { 234,-53829 }, + { 235,-53829 }, { 236,-53829 }, { 237,-53829 }, { 238,-53829 }, { 239,-53829 }, + { 240,-53829 }, { 241,-53829 }, { 242,-53829 }, { 243,-53829 }, { 244,-53829 }, + { 245,-53829 }, { 246,-53829 }, { 247,-53829 }, { 248,-53829 }, { 249,-53829 }, + { 250,-53829 }, { 251,-53829 }, { 252,-53829 }, { 253,-53829 }, { 254,-53829 }, + + { 255,-53829 }, { 0, 131 }, { 0,38037 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 48,-54086 }, { 49,-54086 }, { 50,-54086 }, { 51,-54086 }, { 52,-54086 }, + { 53,-54086 }, { 54,-54086 }, { 55,-54086 }, { 56,-54086 }, { 57,-54086 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-54086 }, { 66,-54086 }, { 67,-54086 }, + { 68,-54086 }, { 69,-54086 }, { 70,-54086 }, { 71,-54086 }, { 72,10794 }, + { 73,-54086 }, { 74,-54086 }, { 75,-54086 }, { 76,-54086 }, { 77,-54086 }, + { 78,-54086 }, { 79,-54086 }, { 80,-54086 }, { 81,-54086 }, { 82,-54086 }, + { 83,-54086 }, { 84,-54086 }, { 85,-54086 }, { 86,-54086 }, { 87,-54086 }, + { 88,-54086 }, { 89,-54086 }, { 90,-54086 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-54086 }, { 0, 0 }, { 97,-54086 }, + + { 98,-54086 }, { 99,-54086 }, { 100,-54086 }, { 101,-54086 }, { 102,-54086 }, + { 103,-54086 }, { 104,10794 }, { 105,-54086 }, { 106,-54086 }, { 107,-54086 }, + { 108,-54086 }, { 109,-54086 }, { 110,-54086 }, { 111,-54086 }, { 112,-54086 }, + { 113,-54086 }, { 114,-54086 }, { 115,-54086 }, { 116,-54086 }, { 117,-54086 }, + { 118,-54086 }, { 119,-54086 }, { 120,-54086 }, { 121,-54086 }, { 122,-54086 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-54086 }, + { 128,-54086 }, { 129,-54086 }, { 130,-54086 }, { 131,-54086 }, { 132,-54086 }, + { 133,-54086 }, { 134,-54086 }, { 135,-54086 }, { 136,-54086 }, { 137,-54086 }, + { 138,-54086 }, { 139,-54086 }, { 140,-54086 }, { 141,-54086 }, { 142,-54086 }, + { 143,-54086 }, { 144,-54086 }, { 145,-54086 }, { 146,-54086 }, { 147,-54086 }, + + { 148,-54086 }, { 149,-54086 }, { 150,-54086 }, { 151,-54086 }, { 152,-54086 }, + { 153,-54086 }, { 154,-54086 }, { 155,-54086 }, { 156,-54086 }, { 157,-54086 }, + { 158,-54086 }, { 159,-54086 }, { 160,-54086 }, { 161,-54086 }, { 162,-54086 }, + { 163,-54086 }, { 164,-54086 }, { 165,-54086 }, { 166,-54086 }, { 167,-54086 }, + { 168,-54086 }, { 169,-54086 }, { 170,-54086 }, { 171,-54086 }, { 172,-54086 }, + { 173,-54086 }, { 174,-54086 }, { 175,-54086 }, { 176,-54086 }, { 177,-54086 }, + { 178,-54086 }, { 179,-54086 }, { 180,-54086 }, { 181,-54086 }, { 182,-54086 }, + { 183,-54086 }, { 184,-54086 }, { 185,-54086 }, { 186,-54086 }, { 187,-54086 }, + { 188,-54086 }, { 189,-54086 }, { 190,-54086 }, { 191,-54086 }, { 192,-54086 }, + { 193,-54086 }, { 194,-54086 }, { 195,-54086 }, { 196,-54086 }, { 197,-54086 }, + + { 198,-54086 }, { 199,-54086 }, { 200,-54086 }, { 201,-54086 }, { 202,-54086 }, + { 203,-54086 }, { 204,-54086 }, { 205,-54086 }, { 206,-54086 }, { 207,-54086 }, + { 208,-54086 }, { 209,-54086 }, { 210,-54086 }, { 211,-54086 }, { 212,-54086 }, + { 213,-54086 }, { 214,-54086 }, { 215,-54086 }, { 216,-54086 }, { 217,-54086 }, + { 218,-54086 }, { 219,-54086 }, { 220,-54086 }, { 221,-54086 }, { 222,-54086 }, + { 223,-54086 }, { 224,-54086 }, { 225,-54086 }, { 226,-54086 }, { 227,-54086 }, + { 228,-54086 }, { 229,-54086 }, { 230,-54086 }, { 231,-54086 }, { 232,-54086 }, + { 233,-54086 }, { 234,-54086 }, { 235,-54086 }, { 236,-54086 }, { 237,-54086 }, + { 238,-54086 }, { 239,-54086 }, { 240,-54086 }, { 241,-54086 }, { 242,-54086 }, + { 243,-54086 }, { 244,-54086 }, { 245,-54086 }, { 246,-54086 }, { 247,-54086 }, + + { 248,-54086 }, { 249,-54086 }, { 250,-54086 }, { 251,-54086 }, { 252,-54086 }, + { 253,-54086 }, { 254,-54086 }, { 255,-54086 }, { 0, 58 }, { 0,37780 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-54343 }, { 49,-54343 }, { 50,-54343 }, + { 51,-54343 }, { 52,-54343 }, { 53,-54343 }, { 54,-54343 }, { 55,-54343 }, + { 56,-54343 }, { 57,-54343 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-54343 }, + { 66,-54343 }, { 67,-54343 }, { 68,-54343 }, { 69,-54343 }, { 70,-54343 }, + { 71,-54343 }, { 72,-54343 }, { 73,-54343 }, { 74,-54343 }, { 75,-54343 }, + { 76,-54343 }, { 77,-54343 }, { 78,-54343 }, { 79,-54343 }, { 80,-54343 }, + { 81,-54343 }, { 82,-54343 }, { 83,-54343 }, { 84,-54343 }, { 85,-54343 }, + { 86,-54343 }, { 87,-54343 }, { 88,-54343 }, { 89,-54343 }, { 90,-54343 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-54343 }, + { 0, 0 }, { 97,-54343 }, { 98,-54343 }, { 99,-54343 }, { 100,-54343 }, + { 101,-54343 }, { 102,-54343 }, { 103,-54343 }, { 104,-54343 }, { 105,-54343 }, + { 106,-54343 }, { 107,-54343 }, { 108,-54343 }, { 109,-54343 }, { 110,-54343 }, + { 111,-54343 }, { 112,-54343 }, { 113,-54343 }, { 114,-54343 }, { 115,-54343 }, + { 116,-54343 }, { 117,-54343 }, { 118,-54343 }, { 119,-54343 }, { 120,-54343 }, + { 121,-54343 }, { 122,-54343 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-54343 }, { 128,-54343 }, { 129,-54343 }, { 130,-54343 }, + { 131,-54343 }, { 132,-54343 }, { 133,-54343 }, { 134,-54343 }, { 135,-54343 }, + { 136,-54343 }, { 137,-54343 }, { 138,-54343 }, { 139,-54343 }, { 140,-54343 }, + + { 141,-54343 }, { 142,-54343 }, { 143,-54343 }, { 144,-54343 }, { 145,-54343 }, + { 146,-54343 }, { 147,-54343 }, { 148,-54343 }, { 149,-54343 }, { 150,-54343 }, + { 151,-54343 }, { 152,-54343 }, { 153,-54343 }, { 154,-54343 }, { 155,-54343 }, + { 156,-54343 }, { 157,-54343 }, { 158,-54343 }, { 159,-54343 }, { 160,-54343 }, + { 161,-54343 }, { 162,-54343 }, { 163,-54343 }, { 164,-54343 }, { 165,-54343 }, + { 166,-54343 }, { 167,-54343 }, { 168,-54343 }, { 169,-54343 }, { 170,-54343 }, + { 171,-54343 }, { 172,-54343 }, { 173,-54343 }, { 174,-54343 }, { 175,-54343 }, + { 176,-54343 }, { 177,-54343 }, { 178,-54343 }, { 179,-54343 }, { 180,-54343 }, + { 181,-54343 }, { 182,-54343 }, { 183,-54343 }, { 184,-54343 }, { 185,-54343 }, + { 186,-54343 }, { 187,-54343 }, { 188,-54343 }, { 189,-54343 }, { 190,-54343 }, + + { 191,-54343 }, { 192,-54343 }, { 193,-54343 }, { 194,-54343 }, { 195,-54343 }, + { 196,-54343 }, { 197,-54343 }, { 198,-54343 }, { 199,-54343 }, { 200,-54343 }, + { 201,-54343 }, { 202,-54343 }, { 203,-54343 }, { 204,-54343 }, { 205,-54343 }, + { 206,-54343 }, { 207,-54343 }, { 208,-54343 }, { 209,-54343 }, { 210,-54343 }, + { 211,-54343 }, { 212,-54343 }, { 213,-54343 }, { 214,-54343 }, { 215,-54343 }, + { 216,-54343 }, { 217,-54343 }, { 218,-54343 }, { 219,-54343 }, { 220,-54343 }, + { 221,-54343 }, { 222,-54343 }, { 223,-54343 }, { 224,-54343 }, { 225,-54343 }, + { 226,-54343 }, { 227,-54343 }, { 228,-54343 }, { 229,-54343 }, { 230,-54343 }, + { 231,-54343 }, { 232,-54343 }, { 233,-54343 }, { 234,-54343 }, { 235,-54343 }, + { 236,-54343 }, { 237,-54343 }, { 238,-54343 }, { 239,-54343 }, { 240,-54343 }, + + { 241,-54343 }, { 242,-54343 }, { 243,-54343 }, { 244,-54343 }, { 245,-54343 }, + { 246,-54343 }, { 247,-54343 }, { 248,-54343 }, { 249,-54343 }, { 250,-54343 }, + { 251,-54343 }, { 252,-54343 }, { 253,-54343 }, { 254,-54343 }, { 255,-54343 }, + { 0, 88 }, { 0,37523 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-54600 }, + { 49,-54600 }, { 50,-54600 }, { 51,-54600 }, { 52,-54600 }, { 53,-54600 }, + { 54,-54600 }, { 55,-54600 }, { 56,-54600 }, { 57,-54600 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-54600 }, { 66,-54600 }, { 67,-54600 }, { 68,-54600 }, + { 69,-54600 }, { 70,-54600 }, { 71,-54600 }, { 72,-54600 }, { 73,-54600 }, + { 74,-54600 }, { 75,-54600 }, { 76,-54600 }, { 77,-54600 }, { 78,-54600 }, + { 79,-54600 }, { 80,-54600 }, { 81,-54600 }, { 82,-54600 }, { 83,-54600 }, + + { 84,-54600 }, { 85,-54600 }, { 86,-54600 }, { 87,-54600 }, { 88,-54600 }, + { 89,-54600 }, { 90,-54600 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-54600 }, { 0, 0 }, { 97,-54600 }, { 98,-54600 }, + { 99,-54600 }, { 100,-54600 }, { 101,-54600 }, { 102,-54600 }, { 103,-54600 }, + { 104,-54600 }, { 105,-54600 }, { 106,-54600 }, { 107,-54600 }, { 108,-54600 }, + { 109,-54600 }, { 110,-54600 }, { 111,-54600 }, { 112,-54600 }, { 113,-54600 }, + { 114,-54600 }, { 115,-54600 }, { 116,-54600 }, { 117,-54600 }, { 118,-54600 }, + { 119,-54600 }, { 120,-54600 }, { 121,-54600 }, { 122,-54600 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-54600 }, { 128,-54600 }, + { 129,-54600 }, { 130,-54600 }, { 131,-54600 }, { 132,-54600 }, { 133,-54600 }, + + { 134,-54600 }, { 135,-54600 }, { 136,-54600 }, { 137,-54600 }, { 138,-54600 }, + { 139,-54600 }, { 140,-54600 }, { 141,-54600 }, { 142,-54600 }, { 143,-54600 }, + { 144,-54600 }, { 145,-54600 }, { 146,-54600 }, { 147,-54600 }, { 148,-54600 }, + { 149,-54600 }, { 150,-54600 }, { 151,-54600 }, { 152,-54600 }, { 153,-54600 }, + { 154,-54600 }, { 155,-54600 }, { 156,-54600 }, { 157,-54600 }, { 158,-54600 }, + { 159,-54600 }, { 160,-54600 }, { 161,-54600 }, { 162,-54600 }, { 163,-54600 }, + { 164,-54600 }, { 165,-54600 }, { 166,-54600 }, { 167,-54600 }, { 168,-54600 }, + { 169,-54600 }, { 170,-54600 }, { 171,-54600 }, { 172,-54600 }, { 173,-54600 }, + { 174,-54600 }, { 175,-54600 }, { 176,-54600 }, { 177,-54600 }, { 178,-54600 }, + { 179,-54600 }, { 180,-54600 }, { 181,-54600 }, { 182,-54600 }, { 183,-54600 }, + + { 184,-54600 }, { 185,-54600 }, { 186,-54600 }, { 187,-54600 }, { 188,-54600 }, + { 189,-54600 }, { 190,-54600 }, { 191,-54600 }, { 192,-54600 }, { 193,-54600 }, + { 194,-54600 }, { 195,-54600 }, { 196,-54600 }, { 197,-54600 }, { 198,-54600 }, + { 199,-54600 }, { 200,-54600 }, { 201,-54600 }, { 202,-54600 }, { 203,-54600 }, + { 204,-54600 }, { 205,-54600 }, { 206,-54600 }, { 207,-54600 }, { 208,-54600 }, + { 209,-54600 }, { 210,-54600 }, { 211,-54600 }, { 212,-54600 }, { 213,-54600 }, + { 214,-54600 }, { 215,-54600 }, { 216,-54600 }, { 217,-54600 }, { 218,-54600 }, + { 219,-54600 }, { 220,-54600 }, { 221,-54600 }, { 222,-54600 }, { 223,-54600 }, + { 224,-54600 }, { 225,-54600 }, { 226,-54600 }, { 227,-54600 }, { 228,-54600 }, + { 229,-54600 }, { 230,-54600 }, { 231,-54600 }, { 232,-54600 }, { 233,-54600 }, + + { 234,-54600 }, { 235,-54600 }, { 236,-54600 }, { 237,-54600 }, { 238,-54600 }, + { 239,-54600 }, { 240,-54600 }, { 241,-54600 }, { 242,-54600 }, { 243,-54600 }, + { 244,-54600 }, { 245,-54600 }, { 246,-54600 }, { 247,-54600 }, { 248,-54600 }, + { 249,-54600 }, { 250,-54600 }, { 251,-54600 }, { 252,-54600 }, { 253,-54600 }, + { 254,-54600 }, { 255,-54600 }, { 0, 68 }, { 0,37266 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-54857 }, { 49,-54857 }, { 50,-54857 }, { 51,-54857 }, + { 52,-54857 }, { 53,-54857 }, { 54,-54857 }, { 55,-54857 }, { 56,-54857 }, + { 57,-54857 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-54857 }, { 66,-54857 }, + { 67,-54857 }, { 68,-54857 }, { 69,-54857 }, { 70,-54857 }, { 71,-54857 }, + { 72,-54857 }, { 73,-54857 }, { 74,-54857 }, { 75,-54857 }, { 76,-54857 }, + + { 77,-54857 }, { 78,-54857 }, { 79,-54857 }, { 80,-54857 }, { 81,-54857 }, + { 82,-54857 }, { 83,-54857 }, { 84,-54857 }, { 85,-54857 }, { 86,-54857 }, + { 87,-54857 }, { 88,-54857 }, { 89,-54857 }, { 90,-54857 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-54857 }, { 0, 0 }, + { 97,-54857 }, { 98,-54857 }, { 99,-54857 }, { 100,-54857 }, { 101,-54857 }, + { 102,-54857 }, { 103,-54857 }, { 104,-54857 }, { 105,-54857 }, { 106,-54857 }, + { 107,-54857 }, { 108,-54857 }, { 109,-54857 }, { 110,-54857 }, { 111,-54857 }, + { 112,-54857 }, { 113,-54857 }, { 114,-54857 }, { 115,-54857 }, { 116,-54857 }, + { 117,-54857 }, { 118,-54857 }, { 119,-54857 }, { 120,-54857 }, { 121,-54857 }, + { 122,-54857 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 127,-54857 }, { 128,-54857 }, { 129,-54857 }, { 130,-54857 }, { 131,-54857 }, + { 132,-54857 }, { 133,-54857 }, { 134,-54857 }, { 135,-54857 }, { 136,-54857 }, + { 137,-54857 }, { 138,-54857 }, { 139,-54857 }, { 140,-54857 }, { 141,-54857 }, + { 142,-54857 }, { 143,-54857 }, { 144,-54857 }, { 145,-54857 }, { 146,-54857 }, + { 147,-54857 }, { 148,-54857 }, { 149,-54857 }, { 150,-54857 }, { 151,-54857 }, + { 152,-54857 }, { 153,-54857 }, { 154,-54857 }, { 155,-54857 }, { 156,-54857 }, + { 157,-54857 }, { 158,-54857 }, { 159,-54857 }, { 160,-54857 }, { 161,-54857 }, + { 162,-54857 }, { 163,-54857 }, { 164,-54857 }, { 165,-54857 }, { 166,-54857 }, + { 167,-54857 }, { 168,-54857 }, { 169,-54857 }, { 170,-54857 }, { 171,-54857 }, + { 172,-54857 }, { 173,-54857 }, { 174,-54857 }, { 175,-54857 }, { 176,-54857 }, + + { 177,-54857 }, { 178,-54857 }, { 179,-54857 }, { 180,-54857 }, { 181,-54857 }, + { 182,-54857 }, { 183,-54857 }, { 184,-54857 }, { 185,-54857 }, { 186,-54857 }, + { 187,-54857 }, { 188,-54857 }, { 189,-54857 }, { 190,-54857 }, { 191,-54857 }, + { 192,-54857 }, { 193,-54857 }, { 194,-54857 }, { 195,-54857 }, { 196,-54857 }, + { 197,-54857 }, { 198,-54857 }, { 199,-54857 }, { 200,-54857 }, { 201,-54857 }, + { 202,-54857 }, { 203,-54857 }, { 204,-54857 }, { 205,-54857 }, { 206,-54857 }, + { 207,-54857 }, { 208,-54857 }, { 209,-54857 }, { 210,-54857 }, { 211,-54857 }, + { 212,-54857 }, { 213,-54857 }, { 214,-54857 }, { 215,-54857 }, { 216,-54857 }, + { 217,-54857 }, { 218,-54857 }, { 219,-54857 }, { 220,-54857 }, { 221,-54857 }, + { 222,-54857 }, { 223,-54857 }, { 224,-54857 }, { 225,-54857 }, { 226,-54857 }, + + { 227,-54857 }, { 228,-54857 }, { 229,-54857 }, { 230,-54857 }, { 231,-54857 }, + { 232,-54857 }, { 233,-54857 }, { 234,-54857 }, { 235,-54857 }, { 236,-54857 }, + { 237,-54857 }, { 238,-54857 }, { 239,-54857 }, { 240,-54857 }, { 241,-54857 }, + { 242,-54857 }, { 243,-54857 }, { 244,-54857 }, { 245,-54857 }, { 246,-54857 }, + { 247,-54857 }, { 248,-54857 }, { 249,-54857 }, { 250,-54857 }, { 251,-54857 }, + { 252,-54857 }, { 253,-54857 }, { 254,-54857 }, { 255,-54857 }, { 0, 37 }, + { 0,37009 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-55114 }, { 49,-55114 }, + { 50,-55114 }, { 51,-55114 }, { 52,-55114 }, { 53,-55114 }, { 54,-55114 }, + { 55,-55114 }, { 56,-55114 }, { 57,-55114 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-55114 }, { 66,-55114 }, { 67,-55114 }, { 68,-55114 }, { 69,-55114 }, + + { 70,-55114 }, { 71,-55114 }, { 72,-55114 }, { 73,-55114 }, { 74,-55114 }, + { 75,-55114 }, { 76,-55114 }, { 77,-55114 }, { 78,-55114 }, { 79,-55114 }, + { 80,-55114 }, { 81,-55114 }, { 82,-55114 }, { 83,-55114 }, { 84,-55114 }, + { 85,-55114 }, { 86,-55114 }, { 87,-55114 }, { 88,-55114 }, { 89,-55114 }, + { 90,-55114 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-55114 }, { 0, 0 }, { 97,-55114 }, { 98,-55114 }, { 99,-55114 }, + { 100,-55114 }, { 101,-55114 }, { 102,-55114 }, { 103,-55114 }, { 104,-55114 }, + { 105,-55114 }, { 106,-55114 }, { 107,-55114 }, { 108,-55114 }, { 109,-55114 }, + { 110,-55114 }, { 111,-55114 }, { 112,-55114 }, { 113,-55114 }, { 114,-55114 }, + { 115,-55114 }, { 116,-55114 }, { 117,-55114 }, { 118,-55114 }, { 119,-55114 }, + + { 120,-55114 }, { 121,-55114 }, { 122,-55114 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-55114 }, { 128,-55114 }, { 129,-55114 }, + { 130,-55114 }, { 131,-55114 }, { 132,-55114 }, { 133,-55114 }, { 134,-55114 }, + { 135,-55114 }, { 136,-55114 }, { 137,-55114 }, { 138,-55114 }, { 139,-55114 }, + { 140,-55114 }, { 141,-55114 }, { 142,-55114 }, { 143,-55114 }, { 144,-55114 }, + { 145,-55114 }, { 146,-55114 }, { 147,-55114 }, { 148,-55114 }, { 149,-55114 }, + { 150,-55114 }, { 151,-55114 }, { 152,-55114 }, { 153,-55114 }, { 154,-55114 }, + { 155,-55114 }, { 156,-55114 }, { 157,-55114 }, { 158,-55114 }, { 159,-55114 }, + { 160,-55114 }, { 161,-55114 }, { 162,-55114 }, { 163,-55114 }, { 164,-55114 }, + { 165,-55114 }, { 166,-55114 }, { 167,-55114 }, { 168,-55114 }, { 169,-55114 }, + + { 170,-55114 }, { 171,-55114 }, { 172,-55114 }, { 173,-55114 }, { 174,-55114 }, + { 175,-55114 }, { 176,-55114 }, { 177,-55114 }, { 178,-55114 }, { 179,-55114 }, + { 180,-55114 }, { 181,-55114 }, { 182,-55114 }, { 183,-55114 }, { 184,-55114 }, + { 185,-55114 }, { 186,-55114 }, { 187,-55114 }, { 188,-55114 }, { 189,-55114 }, + { 190,-55114 }, { 191,-55114 }, { 192,-55114 }, { 193,-55114 }, { 194,-55114 }, + { 195,-55114 }, { 196,-55114 }, { 197,-55114 }, { 198,-55114 }, { 199,-55114 }, + { 200,-55114 }, { 201,-55114 }, { 202,-55114 }, { 203,-55114 }, { 204,-55114 }, + { 205,-55114 }, { 206,-55114 }, { 207,-55114 }, { 208,-55114 }, { 209,-55114 }, + { 210,-55114 }, { 211,-55114 }, { 212,-55114 }, { 213,-55114 }, { 214,-55114 }, + { 215,-55114 }, { 216,-55114 }, { 217,-55114 }, { 218,-55114 }, { 219,-55114 }, + + { 220,-55114 }, { 221,-55114 }, { 222,-55114 }, { 223,-55114 }, { 224,-55114 }, + { 225,-55114 }, { 226,-55114 }, { 227,-55114 }, { 228,-55114 }, { 229,-55114 }, + { 230,-55114 }, { 231,-55114 }, { 232,-55114 }, { 233,-55114 }, { 234,-55114 }, + { 235,-55114 }, { 236,-55114 }, { 237,-55114 }, { 238,-55114 }, { 239,-55114 }, + { 240,-55114 }, { 241,-55114 }, { 242,-55114 }, { 243,-55114 }, { 244,-55114 }, + { 245,-55114 }, { 246,-55114 }, { 247,-55114 }, { 248,-55114 }, { 249,-55114 }, + { 250,-55114 }, { 251,-55114 }, { 252,-55114 }, { 253,-55114 }, { 254,-55114 }, + { 255,-55114 }, { 0, 90 }, { 0,36752 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-55371 }, { 49,-55371 }, { 50,-55371 }, { 51,-55371 }, { 52,-55371 }, + { 53,-55371 }, { 54,-55371 }, { 55,-55371 }, { 56,-55371 }, { 57,-55371 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 65,-55371 }, { 66,-55371 }, { 67,-55371 }, + { 68,-55371 }, { 69,-55371 }, { 70,-55371 }, { 71,-55371 }, { 72,-55371 }, + { 73,-55371 }, { 74,-55371 }, { 75,-55371 }, { 76,-55371 }, { 77,-55371 }, + { 78,-55371 }, { 79,-55371 }, { 80,-55371 }, { 81,-55371 }, { 82,-55371 }, + { 83,-55371 }, { 84,-55371 }, { 85,-55371 }, { 86,-55371 }, { 87,-55371 }, + { 88,-55371 }, { 89,-55371 }, { 90,-55371 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-55371 }, { 0, 0 }, { 97,-55371 }, + { 98,-55371 }, { 99,-55371 }, { 100,-55371 }, { 101,-55371 }, { 102,-55371 }, + { 103,-55371 }, { 104,-55371 }, { 105,-55371 }, { 106,-55371 }, { 107,-55371 }, + { 108,-55371 }, { 109,-55371 }, { 110,-55371 }, { 111,-55371 }, { 112,-55371 }, + + { 113,-55371 }, { 114,-55371 }, { 115,-55371 }, { 116,-55371 }, { 117,-55371 }, + { 118,-55371 }, { 119,-55371 }, { 120,-55371 }, { 121,-55371 }, { 122,-55371 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-55371 }, + { 128,-55371 }, { 129,-55371 }, { 130,-55371 }, { 131,-55371 }, { 132,-55371 }, + { 133,-55371 }, { 134,-55371 }, { 135,-55371 }, { 136,-55371 }, { 137,-55371 }, + { 138,-55371 }, { 139,-55371 }, { 140,-55371 }, { 141,-55371 }, { 142,-55371 }, + { 143,-55371 }, { 144,-55371 }, { 145,-55371 }, { 146,-55371 }, { 147,-55371 }, + { 148,-55371 }, { 149,-55371 }, { 150,-55371 }, { 151,-55371 }, { 152,-55371 }, + { 153,-55371 }, { 154,-55371 }, { 155,-55371 }, { 156,-55371 }, { 157,-55371 }, + { 158,-55371 }, { 159,-55371 }, { 160,-55371 }, { 161,-55371 }, { 162,-55371 }, + + { 163,-55371 }, { 164,-55371 }, { 165,-55371 }, { 166,-55371 }, { 167,-55371 }, + { 168,-55371 }, { 169,-55371 }, { 170,-55371 }, { 171,-55371 }, { 172,-55371 }, + { 173,-55371 }, { 174,-55371 }, { 175,-55371 }, { 176,-55371 }, { 177,-55371 }, + { 178,-55371 }, { 179,-55371 }, { 180,-55371 }, { 181,-55371 }, { 182,-55371 }, + { 183,-55371 }, { 184,-55371 }, { 185,-55371 }, { 186,-55371 }, { 187,-55371 }, + { 188,-55371 }, { 189,-55371 }, { 190,-55371 }, { 191,-55371 }, { 192,-55371 }, + { 193,-55371 }, { 194,-55371 }, { 195,-55371 }, { 196,-55371 }, { 197,-55371 }, + { 198,-55371 }, { 199,-55371 }, { 200,-55371 }, { 201,-55371 }, { 202,-55371 }, + { 203,-55371 }, { 204,-55371 }, { 205,-55371 }, { 206,-55371 }, { 207,-55371 }, + { 208,-55371 }, { 209,-55371 }, { 210,-55371 }, { 211,-55371 }, { 212,-55371 }, + + { 213,-55371 }, { 214,-55371 }, { 215,-55371 }, { 216,-55371 }, { 217,-55371 }, + { 218,-55371 }, { 219,-55371 }, { 220,-55371 }, { 221,-55371 }, { 222,-55371 }, + { 223,-55371 }, { 224,-55371 }, { 225,-55371 }, { 226,-55371 }, { 227,-55371 }, + { 228,-55371 }, { 229,-55371 }, { 230,-55371 }, { 231,-55371 }, { 232,-55371 }, + { 233,-55371 }, { 234,-55371 }, { 235,-55371 }, { 236,-55371 }, { 237,-55371 }, + { 238,-55371 }, { 239,-55371 }, { 240,-55371 }, { 241,-55371 }, { 242,-55371 }, + { 243,-55371 }, { 244,-55371 }, { 245,-55371 }, { 246,-55371 }, { 247,-55371 }, + { 248,-55371 }, { 249,-55371 }, { 250,-55371 }, { 251,-55371 }, { 252,-55371 }, + { 253,-55371 }, { 254,-55371 }, { 255,-55371 }, { 0, 131 }, { 0,36495 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-55628 }, { 49,-55628 }, { 50,-55628 }, + { 51,-55628 }, { 52,-55628 }, { 53,-55628 }, { 54,-55628 }, { 55,-55628 }, + + { 56,-55628 }, { 57,-55628 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-55628 }, + { 66,-55628 }, { 67,-55628 }, { 68,-55628 }, { 69,-55628 }, { 70,-55628 }, + { 71,-55628 }, { 72,-55628 }, { 73,-55628 }, { 74,-55628 }, { 75,-55628 }, + { 76,-55628 }, { 77,-55628 }, { 78,-55628 }, { 79,-55628 }, { 80,-55628 }, + { 81,-55628 }, { 82,-55628 }, { 83,9509 }, { 84,-55628 }, { 85,-55628 }, + { 86,-55628 }, { 87,-55628 }, { 88,-55628 }, { 89,-55628 }, { 90,-55628 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-55628 }, + { 0, 0 }, { 97,-55628 }, { 98,-55628 }, { 99,-55628 }, { 100,-55628 }, + { 101,-55628 }, { 102,-55628 }, { 103,-55628 }, { 104,-55628 }, { 105,-55628 }, + + { 106,-55628 }, { 107,-55628 }, { 108,-55628 }, { 109,-55628 }, { 110,-55628 }, + { 111,-55628 }, { 112,-55628 }, { 113,-55628 }, { 114,-55628 }, { 115,9509 }, + { 116,-55628 }, { 117,-55628 }, { 118,-55628 }, { 119,-55628 }, { 120,-55628 }, + { 121,-55628 }, { 122,-55628 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-55628 }, { 128,-55628 }, { 129,-55628 }, { 130,-55628 }, + { 131,-55628 }, { 132,-55628 }, { 133,-55628 }, { 134,-55628 }, { 135,-55628 }, + { 136,-55628 }, { 137,-55628 }, { 138,-55628 }, { 139,-55628 }, { 140,-55628 }, + { 141,-55628 }, { 142,-55628 }, { 143,-55628 }, { 144,-55628 }, { 145,-55628 }, + { 146,-55628 }, { 147,-55628 }, { 148,-55628 }, { 149,-55628 }, { 150,-55628 }, + { 151,-55628 }, { 152,-55628 }, { 153,-55628 }, { 154,-55628 }, { 155,-55628 }, + + { 156,-55628 }, { 157,-55628 }, { 158,-55628 }, { 159,-55628 }, { 160,-55628 }, + { 161,-55628 }, { 162,-55628 }, { 163,-55628 }, { 164,-55628 }, { 165,-55628 }, + { 166,-55628 }, { 167,-55628 }, { 168,-55628 }, { 169,-55628 }, { 170,-55628 }, + { 171,-55628 }, { 172,-55628 }, { 173,-55628 }, { 174,-55628 }, { 175,-55628 }, + { 176,-55628 }, { 177,-55628 }, { 178,-55628 }, { 179,-55628 }, { 180,-55628 }, + { 181,-55628 }, { 182,-55628 }, { 183,-55628 }, { 184,-55628 }, { 185,-55628 }, + { 186,-55628 }, { 187,-55628 }, { 188,-55628 }, { 189,-55628 }, { 190,-55628 }, + { 191,-55628 }, { 192,-55628 }, { 193,-55628 }, { 194,-55628 }, { 195,-55628 }, + { 196,-55628 }, { 197,-55628 }, { 198,-55628 }, { 199,-55628 }, { 200,-55628 }, + { 201,-55628 }, { 202,-55628 }, { 203,-55628 }, { 204,-55628 }, { 205,-55628 }, + + { 206,-55628 }, { 207,-55628 }, { 208,-55628 }, { 209,-55628 }, { 210,-55628 }, + { 211,-55628 }, { 212,-55628 }, { 213,-55628 }, { 214,-55628 }, { 215,-55628 }, + { 216,-55628 }, { 217,-55628 }, { 218,-55628 }, { 219,-55628 }, { 220,-55628 }, + { 221,-55628 }, { 222,-55628 }, { 223,-55628 }, { 224,-55628 }, { 225,-55628 }, + { 226,-55628 }, { 227,-55628 }, { 228,-55628 }, { 229,-55628 }, { 230,-55628 }, + { 231,-55628 }, { 232,-55628 }, { 233,-55628 }, { 234,-55628 }, { 235,-55628 }, + { 236,-55628 }, { 237,-55628 }, { 238,-55628 }, { 239,-55628 }, { 240,-55628 }, + { 241,-55628 }, { 242,-55628 }, { 243,-55628 }, { 244,-55628 }, { 245,-55628 }, + { 246,-55628 }, { 247,-55628 }, { 248,-55628 }, { 249,-55628 }, { 250,-55628 }, + { 251,-55628 }, { 252,-55628 }, { 253,-55628 }, { 254,-55628 }, { 255,-55628 }, + + { 0, 131 }, { 0,36238 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-55885 }, + + { 49,-55885 }, { 50,-55885 }, { 51,-55885 }, { 52,-55885 }, { 53,-55885 }, + { 54,-55885 }, { 55,-55885 }, { 56,-55885 }, { 57,-55885 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-55885 }, { 66,-55885 }, { 67,-55885 }, { 68,-55885 }, + { 69,-55885 }, { 70,-55885 }, { 71,-55885 }, { 72,-55885 }, { 73,-55885 }, + { 74,-55885 }, { 75,-55885 }, { 76,-55885 }, { 77,-55885 }, { 78,-55885 }, + { 79,-55885 }, { 80,-55885 }, { 81,-55885 }, { 82,-55885 }, { 83,-55885 }, + { 84,-55885 }, { 85,-55885 }, { 86,-55885 }, { 87,-55885 }, { 88,-55885 }, + { 89,-55885 }, { 90,-55885 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,9509 }, { 0, 0 }, { 97,-55885 }, { 98,-55885 }, + + { 99,-55885 }, { 100,-55885 }, { 101,-55885 }, { 102,-55885 }, { 103,-55885 }, + { 104,-55885 }, { 105,-55885 }, { 106,-55885 }, { 107,-55885 }, { 108,-55885 }, + { 109,-55885 }, { 110,-55885 }, { 111,-55885 }, { 112,-55885 }, { 113,-55885 }, + { 114,-55885 }, { 115,-55885 }, { 116,-55885 }, { 117,-55885 }, { 118,-55885 }, + { 119,-55885 }, { 120,-55885 }, { 121,-55885 }, { 122,-55885 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-55885 }, { 128,-55885 }, + { 129,-55885 }, { 130,-55885 }, { 131,-55885 }, { 132,-55885 }, { 133,-55885 }, + { 134,-55885 }, { 135,-55885 }, { 136,-55885 }, { 137,-55885 }, { 138,-55885 }, + { 139,-55885 }, { 140,-55885 }, { 141,-55885 }, { 142,-55885 }, { 143,-55885 }, + { 144,-55885 }, { 145,-55885 }, { 146,-55885 }, { 147,-55885 }, { 148,-55885 }, + + { 149,-55885 }, { 150,-55885 }, { 151,-55885 }, { 152,-55885 }, { 153,-55885 }, + { 154,-55885 }, { 155,-55885 }, { 156,-55885 }, { 157,-55885 }, { 158,-55885 }, + { 159,-55885 }, { 160,-55885 }, { 161,-55885 }, { 162,-55885 }, { 163,-55885 }, + { 164,-55885 }, { 165,-55885 }, { 166,-55885 }, { 167,-55885 }, { 168,-55885 }, + { 169,-55885 }, { 170,-55885 }, { 171,-55885 }, { 172,-55885 }, { 173,-55885 }, + { 174,-55885 }, { 175,-55885 }, { 176,-55885 }, { 177,-55885 }, { 178,-55885 }, + { 179,-55885 }, { 180,-55885 }, { 181,-55885 }, { 182,-55885 }, { 183,-55885 }, + { 184,-55885 }, { 185,-55885 }, { 186,-55885 }, { 187,-55885 }, { 188,-55885 }, + { 189,-55885 }, { 190,-55885 }, { 191,-55885 }, { 192,-55885 }, { 193,-55885 }, + { 194,-55885 }, { 195,-55885 }, { 196,-55885 }, { 197,-55885 }, { 198,-55885 }, + + { 199,-55885 }, { 200,-55885 }, { 201,-55885 }, { 202,-55885 }, { 203,-55885 }, + { 204,-55885 }, { 205,-55885 }, { 206,-55885 }, { 207,-55885 }, { 208,-55885 }, + { 209,-55885 }, { 210,-55885 }, { 211,-55885 }, { 212,-55885 }, { 213,-55885 }, + { 214,-55885 }, { 215,-55885 }, { 216,-55885 }, { 217,-55885 }, { 218,-55885 }, + { 219,-55885 }, { 220,-55885 }, { 221,-55885 }, { 222,-55885 }, { 223,-55885 }, + { 224,-55885 }, { 225,-55885 }, { 226,-55885 }, { 227,-55885 }, { 228,-55885 }, + { 229,-55885 }, { 230,-55885 }, { 231,-55885 }, { 232,-55885 }, { 233,-55885 }, + { 234,-55885 }, { 235,-55885 }, { 236,-55885 }, { 237,-55885 }, { 238,-55885 }, + { 239,-55885 }, { 240,-55885 }, { 241,-55885 }, { 242,-55885 }, { 243,-55885 }, + { 244,-55885 }, { 245,-55885 }, { 246,-55885 }, { 247,-55885 }, { 248,-55885 }, + + { 249,-55885 }, { 250,-55885 }, { 251,-55885 }, { 252,-55885 }, { 253,-55885 }, + { 254,-55885 }, { 255,-55885 }, { 0, 131 }, { 0,35981 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-56142 }, { 49,-56142 }, { 50,-56142 }, { 51,-56142 }, + { 52,-56142 }, { 53,-56142 }, { 54,-56142 }, { 55,-56142 }, { 56,-56142 }, + { 57,-56142 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-56142 }, { 66,-56142 }, + { 67,-56142 }, { 68,-56142 }, { 69,9509 }, { 70,-56142 }, { 71,-56142 }, + { 72,-56142 }, { 73,-56142 }, { 74,-56142 }, { 75,-56142 }, { 76,-56142 }, + { 77,-56142 }, { 78,-56142 }, { 79,-56142 }, { 80,-56142 }, { 81,-56142 }, + { 82,-56142 }, { 83,-56142 }, { 84,-56142 }, { 85,-56142 }, { 86,-56142 }, + { 87,-56142 }, { 88,-56142 }, { 89,-56142 }, { 90,-56142 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-56142 }, { 0, 0 }, + { 97,-56142 }, { 98,-56142 }, { 99,-56142 }, { 100,-56142 }, { 101,9509 }, + { 102,-56142 }, { 103,-56142 }, { 104,-56142 }, { 105,-56142 }, { 106,-56142 }, + { 107,-56142 }, { 108,-56142 }, { 109,-56142 }, { 110,-56142 }, { 111,-56142 }, + { 112,-56142 }, { 113,-56142 }, { 114,-56142 }, { 115,-56142 }, { 116,-56142 }, + { 117,-56142 }, { 118,-56142 }, { 119,-56142 }, { 120,-56142 }, { 121,-56142 }, + { 122,-56142 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-56142 }, { 128,-56142 }, { 129,-56142 }, { 130,-56142 }, { 131,-56142 }, + { 132,-56142 }, { 133,-56142 }, { 134,-56142 }, { 135,-56142 }, { 136,-56142 }, + { 137,-56142 }, { 138,-56142 }, { 139,-56142 }, { 140,-56142 }, { 141,-56142 }, + + { 142,-56142 }, { 143,-56142 }, { 144,-56142 }, { 145,-56142 }, { 146,-56142 }, + { 147,-56142 }, { 148,-56142 }, { 149,-56142 }, { 150,-56142 }, { 151,-56142 }, + { 152,-56142 }, { 153,-56142 }, { 154,-56142 }, { 155,-56142 }, { 156,-56142 }, + { 157,-56142 }, { 158,-56142 }, { 159,-56142 }, { 160,-56142 }, { 161,-56142 }, + { 162,-56142 }, { 163,-56142 }, { 164,-56142 }, { 165,-56142 }, { 166,-56142 }, + { 167,-56142 }, { 168,-56142 }, { 169,-56142 }, { 170,-56142 }, { 171,-56142 }, + { 172,-56142 }, { 173,-56142 }, { 174,-56142 }, { 175,-56142 }, { 176,-56142 }, + { 177,-56142 }, { 178,-56142 }, { 179,-56142 }, { 180,-56142 }, { 181,-56142 }, + { 182,-56142 }, { 183,-56142 }, { 184,-56142 }, { 185,-56142 }, { 186,-56142 }, + { 187,-56142 }, { 188,-56142 }, { 189,-56142 }, { 190,-56142 }, { 191,-56142 }, + + { 192,-56142 }, { 193,-56142 }, { 194,-56142 }, { 195,-56142 }, { 196,-56142 }, + { 197,-56142 }, { 198,-56142 }, { 199,-56142 }, { 200,-56142 }, { 201,-56142 }, + { 202,-56142 }, { 203,-56142 }, { 204,-56142 }, { 205,-56142 }, { 206,-56142 }, + { 207,-56142 }, { 208,-56142 }, { 209,-56142 }, { 210,-56142 }, { 211,-56142 }, + { 212,-56142 }, { 213,-56142 }, { 214,-56142 }, { 215,-56142 }, { 216,-56142 }, + { 217,-56142 }, { 218,-56142 }, { 219,-56142 }, { 220,-56142 }, { 221,-56142 }, + { 222,-56142 }, { 223,-56142 }, { 224,-56142 }, { 225,-56142 }, { 226,-56142 }, + { 227,-56142 }, { 228,-56142 }, { 229,-56142 }, { 230,-56142 }, { 231,-56142 }, + { 232,-56142 }, { 233,-56142 }, { 234,-56142 }, { 235,-56142 }, { 236,-56142 }, + { 237,-56142 }, { 238,-56142 }, { 239,-56142 }, { 240,-56142 }, { 241,-56142 }, + + { 242,-56142 }, { 243,-56142 }, { 244,-56142 }, { 245,-56142 }, { 246,-56142 }, + { 247,-56142 }, { 248,-56142 }, { 249,-56142 }, { 250,-56142 }, { 251,-56142 }, + { 252,-56142 }, { 253,-56142 }, { 254,-56142 }, { 255,-56142 }, { 0, 131 }, + { 0,35724 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-56399 }, { 49,-56399 }, + { 50,-56399 }, { 51,-56399 }, { 52,-56399 }, { 53,-56399 }, { 54,-56399 }, + { 55,-56399 }, { 56,-56399 }, { 57,-56399 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-56399 }, { 66,-56399 }, { 67,9509 }, { 68,-56399 }, { 69,-56399 }, + { 70,-56399 }, { 71,-56399 }, { 72,-56399 }, { 73,-56399 }, { 74,-56399 }, + { 75,-56399 }, { 76,-56399 }, { 77,-56399 }, { 78,-56399 }, { 79,-56399 }, + { 80,-56399 }, { 81,-56399 }, { 82,-56399 }, { 83,-56399 }, { 84,-56399 }, + + { 85,-56399 }, { 86,-56399 }, { 87,-56399 }, { 88,-56399 }, { 89,-56399 }, + { 90,-56399 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-56399 }, { 0, 0 }, { 97,-56399 }, { 98,-56399 }, { 99,9509 }, + { 100,-56399 }, { 101,-56399 }, { 102,-56399 }, { 103,-56399 }, { 104,-56399 }, + { 105,-56399 }, { 106,-56399 }, { 107,-56399 }, { 108,-56399 }, { 109,-56399 }, + { 110,-56399 }, { 111,-56399 }, { 112,-56399 }, { 113,-56399 }, { 114,-56399 }, + { 115,-56399 }, { 116,-56399 }, { 117,-56399 }, { 118,-56399 }, { 119,-56399 }, + { 120,-56399 }, { 121,-56399 }, { 122,-56399 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-56399 }, { 128,-56399 }, { 129,-56399 }, + { 130,-56399 }, { 131,-56399 }, { 132,-56399 }, { 133,-56399 }, { 134,-56399 }, + + { 135,-56399 }, { 136,-56399 }, { 137,-56399 }, { 138,-56399 }, { 139,-56399 }, + { 140,-56399 }, { 141,-56399 }, { 142,-56399 }, { 143,-56399 }, { 144,-56399 }, + { 145,-56399 }, { 146,-56399 }, { 147,-56399 }, { 148,-56399 }, { 149,-56399 }, + { 150,-56399 }, { 151,-56399 }, { 152,-56399 }, { 153,-56399 }, { 154,-56399 }, + { 155,-56399 }, { 156,-56399 }, { 157,-56399 }, { 158,-56399 }, { 159,-56399 }, + { 160,-56399 }, { 161,-56399 }, { 162,-56399 }, { 163,-56399 }, { 164,-56399 }, + { 165,-56399 }, { 166,-56399 }, { 167,-56399 }, { 168,-56399 }, { 169,-56399 }, + { 170,-56399 }, { 171,-56399 }, { 172,-56399 }, { 173,-56399 }, { 174,-56399 }, + { 175,-56399 }, { 176,-56399 }, { 177,-56399 }, { 178,-56399 }, { 179,-56399 }, + { 180,-56399 }, { 181,-56399 }, { 182,-56399 }, { 183,-56399 }, { 184,-56399 }, + + { 185,-56399 }, { 186,-56399 }, { 187,-56399 }, { 188,-56399 }, { 189,-56399 }, + { 190,-56399 }, { 191,-56399 }, { 192,-56399 }, { 193,-56399 }, { 194,-56399 }, + { 195,-56399 }, { 196,-56399 }, { 197,-56399 }, { 198,-56399 }, { 199,-56399 }, + { 200,-56399 }, { 201,-56399 }, { 202,-56399 }, { 203,-56399 }, { 204,-56399 }, + { 205,-56399 }, { 206,-56399 }, { 207,-56399 }, { 208,-56399 }, { 209,-56399 }, + { 210,-56399 }, { 211,-56399 }, { 212,-56399 }, { 213,-56399 }, { 214,-56399 }, + { 215,-56399 }, { 216,-56399 }, { 217,-56399 }, { 218,-56399 }, { 219,-56399 }, + { 220,-56399 }, { 221,-56399 }, { 222,-56399 }, { 223,-56399 }, { 224,-56399 }, + { 225,-56399 }, { 226,-56399 }, { 227,-56399 }, { 228,-56399 }, { 229,-56399 }, + { 230,-56399 }, { 231,-56399 }, { 232,-56399 }, { 233,-56399 }, { 234,-56399 }, + + { 235,-56399 }, { 236,-56399 }, { 237,-56399 }, { 238,-56399 }, { 239,-56399 }, + { 240,-56399 }, { 241,-56399 }, { 242,-56399 }, { 243,-56399 }, { 244,-56399 }, + { 245,-56399 }, { 246,-56399 }, { 247,-56399 }, { 248,-56399 }, { 249,-56399 }, + { 250,-56399 }, { 251,-56399 }, { 252,-56399 }, { 253,-56399 }, { 254,-56399 }, + { 255,-56399 }, { 0, 131 }, { 0,35467 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-56656 }, { 49,-56656 }, { 50,-56656 }, { 51,-56656 }, { 52,-56656 }, + { 53,-56656 }, { 54,-56656 }, { 55,-56656 }, { 56,-56656 }, { 57,-56656 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-56656 }, { 66,-56656 }, { 67,-56656 }, + { 68,-56656 }, { 69,-56656 }, { 70,-56656 }, { 71,-56656 }, { 72,-56656 }, + { 73,-56656 }, { 74,-56656 }, { 75,-56656 }, { 76,-56656 }, { 77,-56656 }, + + { 78,-56656 }, { 79,-56656 }, { 80,-56656 }, { 81,-56656 }, { 82,-56656 }, + { 83,-56656 }, { 84,9509 }, { 85,-56656 }, { 86,-56656 }, { 87,-56656 }, + { 88,-56656 }, { 89,-56656 }, { 90,-56656 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-56656 }, { 0, 0 }, { 97,-56656 }, + { 98,-56656 }, { 99,-56656 }, { 100,-56656 }, { 101,-56656 }, { 102,-56656 }, + { 103,-56656 }, { 104,-56656 }, { 105,-56656 }, { 106,-56656 }, { 107,-56656 }, + { 108,-56656 }, { 109,-56656 }, { 110,-56656 }, { 111,-56656 }, { 112,-56656 }, + { 113,-56656 }, { 114,-56656 }, { 115,-56656 }, { 116,9509 }, { 117,-56656 }, + { 118,-56656 }, { 119,-56656 }, { 120,-56656 }, { 121,-56656 }, { 122,-56656 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-56656 }, + + { 128,-56656 }, { 129,-56656 }, { 130,-56656 }, { 131,-56656 }, { 132,-56656 }, + { 133,-56656 }, { 134,-56656 }, { 135,-56656 }, { 136,-56656 }, { 137,-56656 }, + { 138,-56656 }, { 139,-56656 }, { 140,-56656 }, { 141,-56656 }, { 142,-56656 }, + { 143,-56656 }, { 144,-56656 }, { 145,-56656 }, { 146,-56656 }, { 147,-56656 }, + { 148,-56656 }, { 149,-56656 }, { 150,-56656 }, { 151,-56656 }, { 152,-56656 }, + { 153,-56656 }, { 154,-56656 }, { 155,-56656 }, { 156,-56656 }, { 157,-56656 }, + { 158,-56656 }, { 159,-56656 }, { 160,-56656 }, { 161,-56656 }, { 162,-56656 }, + { 163,-56656 }, { 164,-56656 }, { 165,-56656 }, { 166,-56656 }, { 167,-56656 }, + { 168,-56656 }, { 169,-56656 }, { 170,-56656 }, { 171,-56656 }, { 172,-56656 }, + { 173,-56656 }, { 174,-56656 }, { 175,-56656 }, { 176,-56656 }, { 177,-56656 }, + + { 178,-56656 }, { 179,-56656 }, { 180,-56656 }, { 181,-56656 }, { 182,-56656 }, + { 183,-56656 }, { 184,-56656 }, { 185,-56656 }, { 186,-56656 }, { 187,-56656 }, + { 188,-56656 }, { 189,-56656 }, { 190,-56656 }, { 191,-56656 }, { 192,-56656 }, + { 193,-56656 }, { 194,-56656 }, { 195,-56656 }, { 196,-56656 }, { 197,-56656 }, + { 198,-56656 }, { 199,-56656 }, { 200,-56656 }, { 201,-56656 }, { 202,-56656 }, + { 203,-56656 }, { 204,-56656 }, { 205,-56656 }, { 206,-56656 }, { 207,-56656 }, + { 208,-56656 }, { 209,-56656 }, { 210,-56656 }, { 211,-56656 }, { 212,-56656 }, + { 213,-56656 }, { 214,-56656 }, { 215,-56656 }, { 216,-56656 }, { 217,-56656 }, + { 218,-56656 }, { 219,-56656 }, { 220,-56656 }, { 221,-56656 }, { 222,-56656 }, + { 223,-56656 }, { 224,-56656 }, { 225,-56656 }, { 226,-56656 }, { 227,-56656 }, + + { 228,-56656 }, { 229,-56656 }, { 230,-56656 }, { 231,-56656 }, { 232,-56656 }, + { 233,-56656 }, { 234,-56656 }, { 235,-56656 }, { 236,-56656 }, { 237,-56656 }, + { 238,-56656 }, { 239,-56656 }, { 240,-56656 }, { 241,-56656 }, { 242,-56656 }, + { 243,-56656 }, { 244,-56656 }, { 245,-56656 }, { 246,-56656 }, { 247,-56656 }, + { 248,-56656 }, { 249,-56656 }, { 250,-56656 }, { 251,-56656 }, { 252,-56656 }, + { 253,-56656 }, { 254,-56656 }, { 255,-56656 }, { 0, 131 }, { 0,35210 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-56913 }, { 49,-56913 }, { 50,-56913 }, + { 51,-56913 }, { 52,-56913 }, { 53,-56913 }, { 54,-56913 }, { 55,-56913 }, + { 56,-56913 }, { 57,-56913 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-56913 }, + { 66,-56913 }, { 67,-56913 }, { 68,-56913 }, { 69,9509 }, { 70,-56913 }, + + { 71,-56913 }, { 72,-56913 }, { 73,-56913 }, { 74,-56913 }, { 75,-56913 }, + { 76,-56913 }, { 77,-56913 }, { 78,-56913 }, { 79,-56913 }, { 80,-56913 }, + { 81,-56913 }, { 82,-56913 }, { 83,-56913 }, { 84,-56913 }, { 85,-56913 }, + { 86,-56913 }, { 87,-56913 }, { 88,-56913 }, { 89,-56913 }, { 90,-56913 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-56913 }, + { 0, 0 }, { 97,-56913 }, { 98,-56913 }, { 99,-56913 }, { 100,-56913 }, + { 101,9509 }, { 102,-56913 }, { 103,-56913 }, { 104,-56913 }, { 105,-56913 }, + { 106,-56913 }, { 107,-56913 }, { 108,-56913 }, { 109,-56913 }, { 110,-56913 }, + { 111,-56913 }, { 112,-56913 }, { 113,-56913 }, { 114,-56913 }, { 115,-56913 }, + { 116,-56913 }, { 117,-56913 }, { 118,-56913 }, { 119,-56913 }, { 120,-56913 }, + + { 121,-56913 }, { 122,-56913 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-56913 }, { 128,-56913 }, { 129,-56913 }, { 130,-56913 }, + { 131,-56913 }, { 132,-56913 }, { 133,-56913 }, { 134,-56913 }, { 135,-56913 }, + { 136,-56913 }, { 137,-56913 }, { 138,-56913 }, { 139,-56913 }, { 140,-56913 }, + { 141,-56913 }, { 142,-56913 }, { 143,-56913 }, { 144,-56913 }, { 145,-56913 }, + { 146,-56913 }, { 147,-56913 }, { 148,-56913 }, { 149,-56913 }, { 150,-56913 }, + { 151,-56913 }, { 152,-56913 }, { 153,-56913 }, { 154,-56913 }, { 155,-56913 }, + { 156,-56913 }, { 157,-56913 }, { 158,-56913 }, { 159,-56913 }, { 160,-56913 }, + { 161,-56913 }, { 162,-56913 }, { 163,-56913 }, { 164,-56913 }, { 165,-56913 }, + { 166,-56913 }, { 167,-56913 }, { 168,-56913 }, { 169,-56913 }, { 170,-56913 }, + + { 171,-56913 }, { 172,-56913 }, { 173,-56913 }, { 174,-56913 }, { 175,-56913 }, + { 176,-56913 }, { 177,-56913 }, { 178,-56913 }, { 179,-56913 }, { 180,-56913 }, + { 181,-56913 }, { 182,-56913 }, { 183,-56913 }, { 184,-56913 }, { 185,-56913 }, + { 186,-56913 }, { 187,-56913 }, { 188,-56913 }, { 189,-56913 }, { 190,-56913 }, + { 191,-56913 }, { 192,-56913 }, { 193,-56913 }, { 194,-56913 }, { 195,-56913 }, + { 196,-56913 }, { 197,-56913 }, { 198,-56913 }, { 199,-56913 }, { 200,-56913 }, + { 201,-56913 }, { 202,-56913 }, { 203,-56913 }, { 204,-56913 }, { 205,-56913 }, + { 206,-56913 }, { 207,-56913 }, { 208,-56913 }, { 209,-56913 }, { 210,-56913 }, + { 211,-56913 }, { 212,-56913 }, { 213,-56913 }, { 214,-56913 }, { 215,-56913 }, + { 216,-56913 }, { 217,-56913 }, { 218,-56913 }, { 219,-56913 }, { 220,-56913 }, + + { 221,-56913 }, { 222,-56913 }, { 223,-56913 }, { 224,-56913 }, { 225,-56913 }, + { 226,-56913 }, { 227,-56913 }, { 228,-56913 }, { 229,-56913 }, { 230,-56913 }, + { 231,-56913 }, { 232,-56913 }, { 233,-56913 }, { 234,-56913 }, { 235,-56913 }, + { 236,-56913 }, { 237,-56913 }, { 238,-56913 }, { 239,-56913 }, { 240,-56913 }, + { 241,-56913 }, { 242,-56913 }, { 243,-56913 }, { 244,-56913 }, { 245,-56913 }, + { 246,-56913 }, { 247,-56913 }, { 248,-56913 }, { 249,-56913 }, { 250,-56913 }, + { 251,-56913 }, { 252,-56913 }, { 253,-56913 }, { 254,-56913 }, { 255,-56913 }, + { 0, 131 }, { 0,34953 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-57170 }, + { 49,-57170 }, { 50,-57170 }, { 51,-57170 }, { 52,-57170 }, { 53,-57170 }, + { 54,-57170 }, { 55,-57170 }, { 56,-57170 }, { 57,-57170 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 65,-57170 }, { 66,-57170 }, { 67,-57170 }, { 68,-57170 }, + { 69,-57170 }, { 70,-57170 }, { 71,-57170 }, { 72,9509 }, { 73,-57170 }, + { 74,-57170 }, { 75,-57170 }, { 76,-57170 }, { 77,-57170 }, { 78,-57170 }, + { 79,-57170 }, { 80,-57170 }, { 81,-57170 }, { 82,-57170 }, { 83,-57170 }, + { 84,-57170 }, { 85,-57170 }, { 86,-57170 }, { 87,-57170 }, { 88,-57170 }, + { 89,-57170 }, { 90,-57170 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-57170 }, { 0, 0 }, { 97,-57170 }, { 98,-57170 }, + { 99,-57170 }, { 100,-57170 }, { 101,-57170 }, { 102,-57170 }, { 103,-57170 }, + { 104,9509 }, { 105,-57170 }, { 106,-57170 }, { 107,-57170 }, { 108,-57170 }, + { 109,-57170 }, { 110,-57170 }, { 111,-57170 }, { 112,-57170 }, { 113,-57170 }, + + { 114,-57170 }, { 115,-57170 }, { 116,-57170 }, { 117,-57170 }, { 118,-57170 }, + { 119,-57170 }, { 120,-57170 }, { 121,-57170 }, { 122,-57170 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-57170 }, { 128,-57170 }, + { 129,-57170 }, { 130,-57170 }, { 131,-57170 }, { 132,-57170 }, { 133,-57170 }, + { 134,-57170 }, { 135,-57170 }, { 136,-57170 }, { 137,-57170 }, { 138,-57170 }, + { 139,-57170 }, { 140,-57170 }, { 141,-57170 }, { 142,-57170 }, { 143,-57170 }, + { 144,-57170 }, { 145,-57170 }, { 146,-57170 }, { 147,-57170 }, { 148,-57170 }, + { 149,-57170 }, { 150,-57170 }, { 151,-57170 }, { 152,-57170 }, { 153,-57170 }, + { 154,-57170 }, { 155,-57170 }, { 156,-57170 }, { 157,-57170 }, { 158,-57170 }, + { 159,-57170 }, { 160,-57170 }, { 161,-57170 }, { 162,-57170 }, { 163,-57170 }, + + { 164,-57170 }, { 165,-57170 }, { 166,-57170 }, { 167,-57170 }, { 168,-57170 }, + { 169,-57170 }, { 170,-57170 }, { 171,-57170 }, { 172,-57170 }, { 173,-57170 }, + { 174,-57170 }, { 175,-57170 }, { 176,-57170 }, { 177,-57170 }, { 178,-57170 }, + { 179,-57170 }, { 180,-57170 }, { 181,-57170 }, { 182,-57170 }, { 183,-57170 }, + { 184,-57170 }, { 185,-57170 }, { 186,-57170 }, { 187,-57170 }, { 188,-57170 }, + { 189,-57170 }, { 190,-57170 }, { 191,-57170 }, { 192,-57170 }, { 193,-57170 }, + { 194,-57170 }, { 195,-57170 }, { 196,-57170 }, { 197,-57170 }, { 198,-57170 }, + { 199,-57170 }, { 200,-57170 }, { 201,-57170 }, { 202,-57170 }, { 203,-57170 }, + { 204,-57170 }, { 205,-57170 }, { 206,-57170 }, { 207,-57170 }, { 208,-57170 }, + { 209,-57170 }, { 210,-57170 }, { 211,-57170 }, { 212,-57170 }, { 213,-57170 }, + + { 214,-57170 }, { 215,-57170 }, { 216,-57170 }, { 217,-57170 }, { 218,-57170 }, + { 219,-57170 }, { 220,-57170 }, { 221,-57170 }, { 222,-57170 }, { 223,-57170 }, + { 224,-57170 }, { 225,-57170 }, { 226,-57170 }, { 227,-57170 }, { 228,-57170 }, + { 229,-57170 }, { 230,-57170 }, { 231,-57170 }, { 232,-57170 }, { 233,-57170 }, + { 234,-57170 }, { 235,-57170 }, { 236,-57170 }, { 237,-57170 }, { 238,-57170 }, + { 239,-57170 }, { 240,-57170 }, { 241,-57170 }, { 242,-57170 }, { 243,-57170 }, + { 244,-57170 }, { 245,-57170 }, { 246,-57170 }, { 247,-57170 }, { 248,-57170 }, + { 249,-57170 }, { 250,-57170 }, { 251,-57170 }, { 252,-57170 }, { 253,-57170 }, + { 254,-57170 }, { 255,-57170 }, { 0, 131 }, { 0,34696 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-57427 }, { 49,-57427 }, { 50,-57427 }, { 51,-57427 }, + { 52,-57427 }, { 53,-57427 }, { 54,-57427 }, { 55,-57427 }, { 56,-57427 }, + + { 57,-57427 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-57427 }, { 66,-57427 }, + { 67,-57427 }, { 68,-57427 }, { 69,9509 }, { 70,-57427 }, { 71,-57427 }, + { 72,-57427 }, { 73,-57427 }, { 74,-57427 }, { 75,-57427 }, { 76,-57427 }, + { 77,-57427 }, { 78,-57427 }, { 79,-57427 }, { 80,-57427 }, { 81,-57427 }, + { 82,-57427 }, { 83,-57427 }, { 84,-57427 }, { 85,-57427 }, { 86,-57427 }, + { 87,-57427 }, { 88,-57427 }, { 89,-57427 }, { 90,-57427 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-57427 }, { 0, 0 }, + { 97,-57427 }, { 98,-57427 }, { 99,-57427 }, { 100,-57427 }, { 101,9509 }, + { 102,-57427 }, { 103,-57427 }, { 104,-57427 }, { 105,-57427 }, { 106,-57427 }, + + { 107,-57427 }, { 108,-57427 }, { 109,-57427 }, { 110,-57427 }, { 111,-57427 }, + { 112,-57427 }, { 113,-57427 }, { 114,-57427 }, { 115,-57427 }, { 116,-57427 }, + { 117,-57427 }, { 118,-57427 }, { 119,-57427 }, { 120,-57427 }, { 121,-57427 }, + { 122,-57427 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-57427 }, { 128,-57427 }, { 129,-57427 }, { 130,-57427 }, { 131,-57427 }, + { 132,-57427 }, { 133,-57427 }, { 134,-57427 }, { 135,-57427 }, { 136,-57427 }, + { 137,-57427 }, { 138,-57427 }, { 139,-57427 }, { 140,-57427 }, { 141,-57427 }, + { 142,-57427 }, { 143,-57427 }, { 144,-57427 }, { 145,-57427 }, { 146,-57427 }, + { 147,-57427 }, { 148,-57427 }, { 149,-57427 }, { 150,-57427 }, { 151,-57427 }, + { 152,-57427 }, { 153,-57427 }, { 154,-57427 }, { 155,-57427 }, { 156,-57427 }, + + { 157,-57427 }, { 158,-57427 }, { 159,-57427 }, { 160,-57427 }, { 161,-57427 }, + { 162,-57427 }, { 163,-57427 }, { 164,-57427 }, { 165,-57427 }, { 166,-57427 }, + { 167,-57427 }, { 168,-57427 }, { 169,-57427 }, { 170,-57427 }, { 171,-57427 }, + { 172,-57427 }, { 173,-57427 }, { 174,-57427 }, { 175,-57427 }, { 176,-57427 }, + { 177,-57427 }, { 178,-57427 }, { 179,-57427 }, { 180,-57427 }, { 181,-57427 }, + { 182,-57427 }, { 183,-57427 }, { 184,-57427 }, { 185,-57427 }, { 186,-57427 }, + { 187,-57427 }, { 188,-57427 }, { 189,-57427 }, { 190,-57427 }, { 191,-57427 }, + { 192,-57427 }, { 193,-57427 }, { 194,-57427 }, { 195,-57427 }, { 196,-57427 }, + { 197,-57427 }, { 198,-57427 }, { 199,-57427 }, { 200,-57427 }, { 201,-57427 }, + { 202,-57427 }, { 203,-57427 }, { 204,-57427 }, { 205,-57427 }, { 206,-57427 }, + + { 207,-57427 }, { 208,-57427 }, { 209,-57427 }, { 210,-57427 }, { 211,-57427 }, + { 212,-57427 }, { 213,-57427 }, { 214,-57427 }, { 215,-57427 }, { 216,-57427 }, + { 217,-57427 }, { 218,-57427 }, { 219,-57427 }, { 220,-57427 }, { 221,-57427 }, + { 222,-57427 }, { 223,-57427 }, { 224,-57427 }, { 225,-57427 }, { 226,-57427 }, + { 227,-57427 }, { 228,-57427 }, { 229,-57427 }, { 230,-57427 }, { 231,-57427 }, + { 232,-57427 }, { 233,-57427 }, { 234,-57427 }, { 235,-57427 }, { 236,-57427 }, + { 237,-57427 }, { 238,-57427 }, { 239,-57427 }, { 240,-57427 }, { 241,-57427 }, + { 242,-57427 }, { 243,-57427 }, { 244,-57427 }, { 245,-57427 }, { 246,-57427 }, + { 247,-57427 }, { 248,-57427 }, { 249,-57427 }, { 250,-57427 }, { 251,-57427 }, + { 252,-57427 }, { 253,-57427 }, { 254,-57427 }, { 255,-57427 }, { 0, 131 }, + + { 0,34439 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-57684 }, { 49,-57684 }, + + { 50,-57684 }, { 51,-57684 }, { 52,-57684 }, { 53,-57684 }, { 54,-57684 }, + { 55,-57684 }, { 56,-57684 }, { 57,-57684 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-57684 }, { 66,-57684 }, { 67,-57684 }, { 68,-57684 }, { 69,-57684 }, + { 70,-57684 }, { 71,-57684 }, { 72,-57684 }, { 73,9509 }, { 74,-57684 }, + { 75,-57684 }, { 76,-57684 }, { 77,-57684 }, { 78,-57684 }, { 79,-57684 }, + { 80,-57684 }, { 81,-57684 }, { 82,-57684 }, { 83,-57684 }, { 84,-57684 }, + { 85,-57684 }, { 86,-57684 }, { 87,-57684 }, { 88,-57684 }, { 89,-57684 }, + { 90,-57684 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-57684 }, { 0, 0 }, { 97,-57684 }, { 98,-57684 }, { 99,-57684 }, + + { 100,-57684 }, { 101,-57684 }, { 102,-57684 }, { 103,-57684 }, { 104,-57684 }, + { 105,9509 }, { 106,-57684 }, { 107,-57684 }, { 108,-57684 }, { 109,-57684 }, + { 110,-57684 }, { 111,-57684 }, { 112,-57684 }, { 113,-57684 }, { 114,-57684 }, + { 115,-57684 }, { 116,-57684 }, { 117,-57684 }, { 118,-57684 }, { 119,-57684 }, + { 120,-57684 }, { 121,-57684 }, { 122,-57684 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-57684 }, { 128,-57684 }, { 129,-57684 }, + { 130,-57684 }, { 131,-57684 }, { 132,-57684 }, { 133,-57684 }, { 134,-57684 }, + { 135,-57684 }, { 136,-57684 }, { 137,-57684 }, { 138,-57684 }, { 139,-57684 }, + { 140,-57684 }, { 141,-57684 }, { 142,-57684 }, { 143,-57684 }, { 144,-57684 }, + { 145,-57684 }, { 146,-57684 }, { 147,-57684 }, { 148,-57684 }, { 149,-57684 }, + + { 150,-57684 }, { 151,-57684 }, { 152,-57684 }, { 153,-57684 }, { 154,-57684 }, + { 155,-57684 }, { 156,-57684 }, { 157,-57684 }, { 158,-57684 }, { 159,-57684 }, + { 160,-57684 }, { 161,-57684 }, { 162,-57684 }, { 163,-57684 }, { 164,-57684 }, + { 165,-57684 }, { 166,-57684 }, { 167,-57684 }, { 168,-57684 }, { 169,-57684 }, + { 170,-57684 }, { 171,-57684 }, { 172,-57684 }, { 173,-57684 }, { 174,-57684 }, + { 175,-57684 }, { 176,-57684 }, { 177,-57684 }, { 178,-57684 }, { 179,-57684 }, + { 180,-57684 }, { 181,-57684 }, { 182,-57684 }, { 183,-57684 }, { 184,-57684 }, + { 185,-57684 }, { 186,-57684 }, { 187,-57684 }, { 188,-57684 }, { 189,-57684 }, + { 190,-57684 }, { 191,-57684 }, { 192,-57684 }, { 193,-57684 }, { 194,-57684 }, + { 195,-57684 }, { 196,-57684 }, { 197,-57684 }, { 198,-57684 }, { 199,-57684 }, + + { 200,-57684 }, { 201,-57684 }, { 202,-57684 }, { 203,-57684 }, { 204,-57684 }, + { 205,-57684 }, { 206,-57684 }, { 207,-57684 }, { 208,-57684 }, { 209,-57684 }, + { 210,-57684 }, { 211,-57684 }, { 212,-57684 }, { 213,-57684 }, { 214,-57684 }, + { 215,-57684 }, { 216,-57684 }, { 217,-57684 }, { 218,-57684 }, { 219,-57684 }, + { 220,-57684 }, { 221,-57684 }, { 222,-57684 }, { 223,-57684 }, { 224,-57684 }, + { 225,-57684 }, { 226,-57684 }, { 227,-57684 }, { 228,-57684 }, { 229,-57684 }, + { 230,-57684 }, { 231,-57684 }, { 232,-57684 }, { 233,-57684 }, { 234,-57684 }, + { 235,-57684 }, { 236,-57684 }, { 237,-57684 }, { 238,-57684 }, { 239,-57684 }, + { 240,-57684 }, { 241,-57684 }, { 242,-57684 }, { 243,-57684 }, { 244,-57684 }, + { 245,-57684 }, { 246,-57684 }, { 247,-57684 }, { 248,-57684 }, { 249,-57684 }, + + { 250,-57684 }, { 251,-57684 }, { 252,-57684 }, { 253,-57684 }, { 254,-57684 }, + { 255,-57684 }, { 0, 131 }, { 0,34182 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-57941 }, { 49,-57941 }, { 50,-57941 }, { 51,-57941 }, { 52,-57941 }, + { 53,-57941 }, { 54,-57941 }, { 55,-57941 }, { 56,-57941 }, { 57,-57941 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-57941 }, { 66,-57941 }, { 67,9509 }, + { 68,-57941 }, { 69,-57941 }, { 70,-57941 }, { 71,-57941 }, { 72,-57941 }, + { 73,-57941 }, { 74,-57941 }, { 75,-57941 }, { 76,-57941 }, { 77,-57941 }, + { 78,-57941 }, { 79,-57941 }, { 80,-57941 }, { 81,-57941 }, { 82,-57941 }, + { 83,-57941 }, { 84,-57941 }, { 85,-57941 }, { 86,-57941 }, { 87,-57941 }, + { 88,-57941 }, { 89,-57941 }, { 90,-57941 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 95,-57941 }, { 0, 0 }, { 97,-57941 }, + { 98,-57941 }, { 99,9509 }, { 100,-57941 }, { 101,-57941 }, { 102,-57941 }, + { 103,-57941 }, { 104,-57941 }, { 105,-57941 }, { 106,-57941 }, { 107,-57941 }, + { 108,-57941 }, { 109,-57941 }, { 110,-57941 }, { 111,-57941 }, { 112,-57941 }, + { 113,-57941 }, { 114,-57941 }, { 115,-57941 }, { 116,-57941 }, { 117,-57941 }, + { 118,-57941 }, { 119,-57941 }, { 120,-57941 }, { 121,-57941 }, { 122,-57941 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-57941 }, + { 128,-57941 }, { 129,-57941 }, { 130,-57941 }, { 131,-57941 }, { 132,-57941 }, + { 133,-57941 }, { 134,-57941 }, { 135,-57941 }, { 136,-57941 }, { 137,-57941 }, + { 138,-57941 }, { 139,-57941 }, { 140,-57941 }, { 141,-57941 }, { 142,-57941 }, + + { 143,-57941 }, { 144,-57941 }, { 145,-57941 }, { 146,-57941 }, { 147,-57941 }, + { 148,-57941 }, { 149,-57941 }, { 150,-57941 }, { 151,-57941 }, { 152,-57941 }, + { 153,-57941 }, { 154,-57941 }, { 155,-57941 }, { 156,-57941 }, { 157,-57941 }, + { 158,-57941 }, { 159,-57941 }, { 160,-57941 }, { 161,-57941 }, { 162,-57941 }, + { 163,-57941 }, { 164,-57941 }, { 165,-57941 }, { 166,-57941 }, { 167,-57941 }, + { 168,-57941 }, { 169,-57941 }, { 170,-57941 }, { 171,-57941 }, { 172,-57941 }, + { 173,-57941 }, { 174,-57941 }, { 175,-57941 }, { 176,-57941 }, { 177,-57941 }, + { 178,-57941 }, { 179,-57941 }, { 180,-57941 }, { 181,-57941 }, { 182,-57941 }, + { 183,-57941 }, { 184,-57941 }, { 185,-57941 }, { 186,-57941 }, { 187,-57941 }, + { 188,-57941 }, { 189,-57941 }, { 190,-57941 }, { 191,-57941 }, { 192,-57941 }, + + { 193,-57941 }, { 194,-57941 }, { 195,-57941 }, { 196,-57941 }, { 197,-57941 }, + { 198,-57941 }, { 199,-57941 }, { 200,-57941 }, { 201,-57941 }, { 202,-57941 }, + { 203,-57941 }, { 204,-57941 }, { 205,-57941 }, { 206,-57941 }, { 207,-57941 }, + { 208,-57941 }, { 209,-57941 }, { 210,-57941 }, { 211,-57941 }, { 212,-57941 }, + { 213,-57941 }, { 214,-57941 }, { 215,-57941 }, { 216,-57941 }, { 217,-57941 }, + { 218,-57941 }, { 219,-57941 }, { 220,-57941 }, { 221,-57941 }, { 222,-57941 }, + { 223,-57941 }, { 224,-57941 }, { 225,-57941 }, { 226,-57941 }, { 227,-57941 }, + { 228,-57941 }, { 229,-57941 }, { 230,-57941 }, { 231,-57941 }, { 232,-57941 }, + { 233,-57941 }, { 234,-57941 }, { 235,-57941 }, { 236,-57941 }, { 237,-57941 }, + { 238,-57941 }, { 239,-57941 }, { 240,-57941 }, { 241,-57941 }, { 242,-57941 }, + + { 243,-57941 }, { 244,-57941 }, { 245,-57941 }, { 246,-57941 }, { 247,-57941 }, + { 248,-57941 }, { 249,-57941 }, { 250,-57941 }, { 251,-57941 }, { 252,-57941 }, + { 253,-57941 }, { 254,-57941 }, { 255,-57941 }, { 0, 131 }, { 0,33925 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-58198 }, { 49,-58198 }, { 50,-58198 }, + { 51,-58198 }, { 52,-58198 }, { 53,-58198 }, { 54,-58198 }, { 55,-58198 }, + { 56,-58198 }, { 57,-58198 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-58198 }, + { 66,-58198 }, { 67,-58198 }, { 68,-58198 }, { 69,-58198 }, { 70,-58198 }, + { 71,-58198 }, { 72,-58198 }, { 73,-58198 }, { 74,-58198 }, { 75,-58198 }, + { 76,9509 }, { 77,-58198 }, { 78,-58198 }, { 79,-58198 }, { 80,-58198 }, + { 81,-58198 }, { 82,-58198 }, { 83,-58198 }, { 84,-58198 }, { 85,-58198 }, + + { 86,-58198 }, { 87,-58198 }, { 88,-58198 }, { 89,-58198 }, { 90,-58198 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-58198 }, + { 0, 0 }, { 97,-58198 }, { 98,-58198 }, { 99,-58198 }, { 100,-58198 }, + { 101,-58198 }, { 102,-58198 }, { 103,-58198 }, { 104,-58198 }, { 105,-58198 }, + { 106,-58198 }, { 107,-58198 }, { 108,9509 }, { 109,-58198 }, { 110,-58198 }, + { 111,-58198 }, { 112,-58198 }, { 113,-58198 }, { 114,-58198 }, { 115,-58198 }, + { 116,-58198 }, { 117,-58198 }, { 118,-58198 }, { 119,-58198 }, { 120,-58198 }, + { 121,-58198 }, { 122,-58198 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-58198 }, { 128,-58198 }, { 129,-58198 }, { 130,-58198 }, + { 131,-58198 }, { 132,-58198 }, { 133,-58198 }, { 134,-58198 }, { 135,-58198 }, + + { 136,-58198 }, { 137,-58198 }, { 138,-58198 }, { 139,-58198 }, { 140,-58198 }, + { 141,-58198 }, { 142,-58198 }, { 143,-58198 }, { 144,-58198 }, { 145,-58198 }, + { 146,-58198 }, { 147,-58198 }, { 148,-58198 }, { 149,-58198 }, { 150,-58198 }, + { 151,-58198 }, { 152,-58198 }, { 153,-58198 }, { 154,-58198 }, { 155,-58198 }, + { 156,-58198 }, { 157,-58198 }, { 158,-58198 }, { 159,-58198 }, { 160,-58198 }, + { 161,-58198 }, { 162,-58198 }, { 163,-58198 }, { 164,-58198 }, { 165,-58198 }, + { 166,-58198 }, { 167,-58198 }, { 168,-58198 }, { 169,-58198 }, { 170,-58198 }, + { 171,-58198 }, { 172,-58198 }, { 173,-58198 }, { 174,-58198 }, { 175,-58198 }, + { 176,-58198 }, { 177,-58198 }, { 178,-58198 }, { 179,-58198 }, { 180,-58198 }, + { 181,-58198 }, { 182,-58198 }, { 183,-58198 }, { 184,-58198 }, { 185,-58198 }, + + { 186,-58198 }, { 187,-58198 }, { 188,-58198 }, { 189,-58198 }, { 190,-58198 }, + { 191,-58198 }, { 192,-58198 }, { 193,-58198 }, { 194,-58198 }, { 195,-58198 }, + { 196,-58198 }, { 197,-58198 }, { 198,-58198 }, { 199,-58198 }, { 200,-58198 }, + { 201,-58198 }, { 202,-58198 }, { 203,-58198 }, { 204,-58198 }, { 205,-58198 }, + { 206,-58198 }, { 207,-58198 }, { 208,-58198 }, { 209,-58198 }, { 210,-58198 }, + { 211,-58198 }, { 212,-58198 }, { 213,-58198 }, { 214,-58198 }, { 215,-58198 }, + { 216,-58198 }, { 217,-58198 }, { 218,-58198 }, { 219,-58198 }, { 220,-58198 }, + { 221,-58198 }, { 222,-58198 }, { 223,-58198 }, { 224,-58198 }, { 225,-58198 }, + { 226,-58198 }, { 227,-58198 }, { 228,-58198 }, { 229,-58198 }, { 230,-58198 }, + { 231,-58198 }, { 232,-58198 }, { 233,-58198 }, { 234,-58198 }, { 235,-58198 }, + + { 236,-58198 }, { 237,-58198 }, { 238,-58198 }, { 239,-58198 }, { 240,-58198 }, + { 241,-58198 }, { 242,-58198 }, { 243,-58198 }, { 244,-58198 }, { 245,-58198 }, + { 246,-58198 }, { 247,-58198 }, { 248,-58198 }, { 249,-58198 }, { 250,-58198 }, + { 251,-58198 }, { 252,-58198 }, { 253,-58198 }, { 254,-58198 }, { 255,-58198 }, + { 0, 131 }, { 0,33668 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-58455 }, + { 49,-58455 }, { 50,-58455 }, { 51,-58455 }, { 52,-58455 }, { 53,-58455 }, + { 54,-58455 }, { 55,-58455 }, { 56,-58455 }, { 57,-58455 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-58455 }, { 66,-58455 }, { 67,-58455 }, { 68,-58455 }, + { 69,-58455 }, { 70,-58455 }, { 71,-58455 }, { 72,-58455 }, { 73,-58455 }, + { 74,-58455 }, { 75,-58455 }, { 76,-58455 }, { 77,-58455 }, { 78,-58455 }, + + { 79,-58455 }, { 80,-58455 }, { 81,-58455 }, { 82,-58455 }, { 83,-58455 }, + { 84,-58455 }, { 85,9509 }, { 86,-58455 }, { 87,-58455 }, { 88,-58455 }, + { 89,-58455 }, { 90,-58455 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-58455 }, { 0, 0 }, { 97,-58455 }, { 98,-58455 }, + { 99,-58455 }, { 100,-58455 }, { 101,-58455 }, { 102,-58455 }, { 103,-58455 }, + { 104,-58455 }, { 105,-58455 }, { 106,-58455 }, { 107,-58455 }, { 108,-58455 }, + { 109,-58455 }, { 110,-58455 }, { 111,-58455 }, { 112,-58455 }, { 113,-58455 }, + { 114,-58455 }, { 115,-58455 }, { 116,-58455 }, { 117,9509 }, { 118,-58455 }, + { 119,-58455 }, { 120,-58455 }, { 121,-58455 }, { 122,-58455 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-58455 }, { 128,-58455 }, + + { 129,-58455 }, { 130,-58455 }, { 131,-58455 }, { 132,-58455 }, { 133,-58455 }, + { 134,-58455 }, { 135,-58455 }, { 136,-58455 }, { 137,-58455 }, { 138,-58455 }, + { 139,-58455 }, { 140,-58455 }, { 141,-58455 }, { 142,-58455 }, { 143,-58455 }, + { 144,-58455 }, { 145,-58455 }, { 146,-58455 }, { 147,-58455 }, { 148,-58455 }, + { 149,-58455 }, { 150,-58455 }, { 151,-58455 }, { 152,-58455 }, { 153,-58455 }, + { 154,-58455 }, { 155,-58455 }, { 156,-58455 }, { 157,-58455 }, { 158,-58455 }, + { 159,-58455 }, { 160,-58455 }, { 161,-58455 }, { 162,-58455 }, { 163,-58455 }, + { 164,-58455 }, { 165,-58455 }, { 166,-58455 }, { 167,-58455 }, { 168,-58455 }, + { 169,-58455 }, { 170,-58455 }, { 171,-58455 }, { 172,-58455 }, { 173,-58455 }, + { 174,-58455 }, { 175,-58455 }, { 176,-58455 }, { 177,-58455 }, { 178,-58455 }, + + { 179,-58455 }, { 180,-58455 }, { 181,-58455 }, { 182,-58455 }, { 183,-58455 }, + { 184,-58455 }, { 185,-58455 }, { 186,-58455 }, { 187,-58455 }, { 188,-58455 }, + { 189,-58455 }, { 190,-58455 }, { 191,-58455 }, { 192,-58455 }, { 193,-58455 }, + { 194,-58455 }, { 195,-58455 }, { 196,-58455 }, { 197,-58455 }, { 198,-58455 }, + { 199,-58455 }, { 200,-58455 }, { 201,-58455 }, { 202,-58455 }, { 203,-58455 }, + { 204,-58455 }, { 205,-58455 }, { 206,-58455 }, { 207,-58455 }, { 208,-58455 }, + { 209,-58455 }, { 210,-58455 }, { 211,-58455 }, { 212,-58455 }, { 213,-58455 }, + { 214,-58455 }, { 215,-58455 }, { 216,-58455 }, { 217,-58455 }, { 218,-58455 }, + { 219,-58455 }, { 220,-58455 }, { 221,-58455 }, { 222,-58455 }, { 223,-58455 }, + { 224,-58455 }, { 225,-58455 }, { 226,-58455 }, { 227,-58455 }, { 228,-58455 }, + + { 229,-58455 }, { 230,-58455 }, { 231,-58455 }, { 232,-58455 }, { 233,-58455 }, + { 234,-58455 }, { 235,-58455 }, { 236,-58455 }, { 237,-58455 }, { 238,-58455 }, + { 239,-58455 }, { 240,-58455 }, { 241,-58455 }, { 242,-58455 }, { 243,-58455 }, + { 244,-58455 }, { 245,-58455 }, { 246,-58455 }, { 247,-58455 }, { 248,-58455 }, + { 249,-58455 }, { 250,-58455 }, { 251,-58455 }, { 252,-58455 }, { 253,-58455 }, + { 254,-58455 }, { 255,-58455 }, { 0, 131 }, { 0,33411 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-58712 }, { 49,-58712 }, { 50,-58712 }, { 51,-58712 }, + { 52,-58712 }, { 53,-58712 }, { 54,-58712 }, { 55,-58712 }, { 56,-58712 }, + { 57,-58712 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-58712 }, { 66,-58712 }, + { 67,-58712 }, { 68,-58712 }, { 69,9509 }, { 70,-58712 }, { 71,-58712 }, + + { 72,-58712 }, { 73,-58712 }, { 74,-58712 }, { 75,-58712 }, { 76,-58712 }, + { 77,-58712 }, { 78,-58712 }, { 79,-58712 }, { 80,-58712 }, { 81,-58712 }, + { 82,-58712 }, { 83,-58712 }, { 84,-58712 }, { 85,-58712 }, { 86,-58712 }, + { 87,-58712 }, { 88,-58712 }, { 89,-58712 }, { 90,-58712 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-58712 }, { 0, 0 }, + { 97,-58712 }, { 98,-58712 }, { 99,-58712 }, { 100,-58712 }, { 101,9509 }, + { 102,-58712 }, { 103,-58712 }, { 104,-58712 }, { 105,-58712 }, { 106,-58712 }, + { 107,-58712 }, { 108,-58712 }, { 109,-58712 }, { 110,-58712 }, { 111,-58712 }, + { 112,-58712 }, { 113,-58712 }, { 114,-58712 }, { 115,-58712 }, { 116,-58712 }, + { 117,-58712 }, { 118,-58712 }, { 119,-58712 }, { 120,-58712 }, { 121,-58712 }, + + { 122,-58712 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-58712 }, { 128,-58712 }, { 129,-58712 }, { 130,-58712 }, { 131,-58712 }, + { 132,-58712 }, { 133,-58712 }, { 134,-58712 }, { 135,-58712 }, { 136,-58712 }, + { 137,-58712 }, { 138,-58712 }, { 139,-58712 }, { 140,-58712 }, { 141,-58712 }, + { 142,-58712 }, { 143,-58712 }, { 144,-58712 }, { 145,-58712 }, { 146,-58712 }, + { 147,-58712 }, { 148,-58712 }, { 149,-58712 }, { 150,-58712 }, { 151,-58712 }, + { 152,-58712 }, { 153,-58712 }, { 154,-58712 }, { 155,-58712 }, { 156,-58712 }, + { 157,-58712 }, { 158,-58712 }, { 159,-58712 }, { 160,-58712 }, { 161,-58712 }, + { 162,-58712 }, { 163,-58712 }, { 164,-58712 }, { 165,-58712 }, { 166,-58712 }, + { 167,-58712 }, { 168,-58712 }, { 169,-58712 }, { 170,-58712 }, { 171,-58712 }, + + { 172,-58712 }, { 173,-58712 }, { 174,-58712 }, { 175,-58712 }, { 176,-58712 }, + { 177,-58712 }, { 178,-58712 }, { 179,-58712 }, { 180,-58712 }, { 181,-58712 }, + { 182,-58712 }, { 183,-58712 }, { 184,-58712 }, { 185,-58712 }, { 186,-58712 }, + { 187,-58712 }, { 188,-58712 }, { 189,-58712 }, { 190,-58712 }, { 191,-58712 }, + { 192,-58712 }, { 193,-58712 }, { 194,-58712 }, { 195,-58712 }, { 196,-58712 }, + { 197,-58712 }, { 198,-58712 }, { 199,-58712 }, { 200,-58712 }, { 201,-58712 }, + { 202,-58712 }, { 203,-58712 }, { 204,-58712 }, { 205,-58712 }, { 206,-58712 }, + { 207,-58712 }, { 208,-58712 }, { 209,-58712 }, { 210,-58712 }, { 211,-58712 }, + { 212,-58712 }, { 213,-58712 }, { 214,-58712 }, { 215,-58712 }, { 216,-58712 }, + { 217,-58712 }, { 218,-58712 }, { 219,-58712 }, { 220,-58712 }, { 221,-58712 }, + + { 222,-58712 }, { 223,-58712 }, { 224,-58712 }, { 225,-58712 }, { 226,-58712 }, + { 227,-58712 }, { 228,-58712 }, { 229,-58712 }, { 230,-58712 }, { 231,-58712 }, + { 232,-58712 }, { 233,-58712 }, { 234,-58712 }, { 235,-58712 }, { 236,-58712 }, + { 237,-58712 }, { 238,-58712 }, { 239,-58712 }, { 240,-58712 }, { 241,-58712 }, + { 242,-58712 }, { 243,-58712 }, { 244,-58712 }, { 245,-58712 }, { 246,-58712 }, + { 247,-58712 }, { 248,-58712 }, { 249,-58712 }, { 250,-58712 }, { 251,-58712 }, + { 252,-58712 }, { 253,-58712 }, { 254,-58712 }, { 255,-58712 }, { 0, 131 }, + { 0,33154 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-58969 }, { 49,-58969 }, + { 50,-58969 }, { 51,-58969 }, { 52,-58969 }, { 53,-58969 }, { 54,-58969 }, + { 55,-58969 }, { 56,-58969 }, { 57,-58969 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 65,-58969 }, { 66,-58969 }, { 67,-58969 }, { 68,-58969 }, { 69,-58969 }, + { 70,-58969 }, { 71,-58969 }, { 72,-58969 }, { 73,-58969 }, { 74,-58969 }, + { 75,-58969 }, { 76,-58969 }, { 77,-58969 }, { 78,-58969 }, { 79,-58969 }, + { 80,-58969 }, { 81,-58969 }, { 82,-58969 }, { 83,-58969 }, { 84,9509 }, + { 85,-58969 }, { 86,-58969 }, { 87,-58969 }, { 88,-58969 }, { 89,-58969 }, + { 90,-58969 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-58969 }, { 0, 0 }, { 97,-58969 }, { 98,-58969 }, { 99,-58969 }, + { 100,-58969 }, { 101,-58969 }, { 102,-58969 }, { 103,-58969 }, { 104,-58969 }, + { 105,-58969 }, { 106,-58969 }, { 107,-58969 }, { 108,-58969 }, { 109,-58969 }, + { 110,-58969 }, { 111,-58969 }, { 112,-58969 }, { 113,-58969 }, { 114,-58969 }, + + { 115,-58969 }, { 116,9509 }, { 117,-58969 }, { 118,-58969 }, { 119,-58969 }, + { 120,-58969 }, { 121,-58969 }, { 122,-58969 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-58969 }, { 128,-58969 }, { 129,-58969 }, + { 130,-58969 }, { 131,-58969 }, { 132,-58969 }, { 133,-58969 }, { 134,-58969 }, + { 135,-58969 }, { 136,-58969 }, { 137,-58969 }, { 138,-58969 }, { 139,-58969 }, + { 140,-58969 }, { 141,-58969 }, { 142,-58969 }, { 143,-58969 }, { 144,-58969 }, + { 145,-58969 }, { 146,-58969 }, { 147,-58969 }, { 148,-58969 }, { 149,-58969 }, + { 150,-58969 }, { 151,-58969 }, { 152,-58969 }, { 153,-58969 }, { 154,-58969 }, + { 155,-58969 }, { 156,-58969 }, { 157,-58969 }, { 158,-58969 }, { 159,-58969 }, + { 160,-58969 }, { 161,-58969 }, { 162,-58969 }, { 163,-58969 }, { 164,-58969 }, + + { 165,-58969 }, { 166,-58969 }, { 167,-58969 }, { 168,-58969 }, { 169,-58969 }, + { 170,-58969 }, { 171,-58969 }, { 172,-58969 }, { 173,-58969 }, { 174,-58969 }, + { 175,-58969 }, { 176,-58969 }, { 177,-58969 }, { 178,-58969 }, { 179,-58969 }, + { 180,-58969 }, { 181,-58969 }, { 182,-58969 }, { 183,-58969 }, { 184,-58969 }, + { 185,-58969 }, { 186,-58969 }, { 187,-58969 }, { 188,-58969 }, { 189,-58969 }, + { 190,-58969 }, { 191,-58969 }, { 192,-58969 }, { 193,-58969 }, { 194,-58969 }, + { 195,-58969 }, { 196,-58969 }, { 197,-58969 }, { 198,-58969 }, { 199,-58969 }, + { 200,-58969 }, { 201,-58969 }, { 202,-58969 }, { 203,-58969 }, { 204,-58969 }, + { 205,-58969 }, { 206,-58969 }, { 207,-58969 }, { 208,-58969 }, { 209,-58969 }, + { 210,-58969 }, { 211,-58969 }, { 212,-58969 }, { 213,-58969 }, { 214,-58969 }, + + { 215,-58969 }, { 216,-58969 }, { 217,-58969 }, { 218,-58969 }, { 219,-58969 }, + { 220,-58969 }, { 221,-58969 }, { 222,-58969 }, { 223,-58969 }, { 224,-58969 }, + { 225,-58969 }, { 226,-58969 }, { 227,-58969 }, { 228,-58969 }, { 229,-58969 }, + { 230,-58969 }, { 231,-58969 }, { 232,-58969 }, { 233,-58969 }, { 234,-58969 }, + { 235,-58969 }, { 236,-58969 }, { 237,-58969 }, { 238,-58969 }, { 239,-58969 }, + { 240,-58969 }, { 241,-58969 }, { 242,-58969 }, { 243,-58969 }, { 244,-58969 }, + { 245,-58969 }, { 246,-58969 }, { 247,-58969 }, { 248,-58969 }, { 249,-58969 }, + { 250,-58969 }, { 251,-58969 }, { 252,-58969 }, { 253,-58969 }, { 254,-58969 }, + { 255,-58969 }, { 0, 32 }, { 0,32897 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-59226 }, { 49,-59226 }, { 50,-59226 }, { 51,-59226 }, { 52,-59226 }, + { 53,-59226 }, { 54,-59226 }, { 55,-59226 }, { 56,-59226 }, { 57,-59226 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-59226 }, { 66,-59226 }, { 67,-59226 }, + { 68,-59226 }, { 69,-59226 }, { 70,-59226 }, { 71,-59226 }, { 72,-59226 }, + { 73,-59226 }, { 74,-59226 }, { 75,-59226 }, { 76,-59226 }, { 77,-59226 }, + { 78,-59226 }, { 79,-59226 }, { 80,-59226 }, { 81,-59226 }, { 82,-59226 }, + { 83,-59226 }, { 84,-59226 }, { 85,-59226 }, { 86,-59226 }, { 87,-59226 }, + { 88,-59226 }, { 89,-59226 }, { 90,-59226 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-59226 }, { 0, 0 }, { 97,-59226 }, + { 98,-59226 }, { 99,-59226 }, { 100,-59226 }, { 101,-59226 }, { 102,-59226 }, + { 103,-59226 }, { 104,-59226 }, { 105,-59226 }, { 106,-59226 }, { 107,-59226 }, + + { 108,-59226 }, { 109,-59226 }, { 110,-59226 }, { 111,-59226 }, { 112,-59226 }, + { 113,-59226 }, { 114,-59226 }, { 115,-59226 }, { 116,-59226 }, { 117,-59226 }, + { 118,-59226 }, { 119,-59226 }, { 120,-59226 }, { 121,-59226 }, { 122,-59226 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-59226 }, + { 128,-59226 }, { 129,-59226 }, { 130,-59226 }, { 131,-59226 }, { 132,-59226 }, + { 133,-59226 }, { 134,-59226 }, { 135,-59226 }, { 136,-59226 }, { 137,-59226 }, + { 138,-59226 }, { 139,-59226 }, { 140,-59226 }, { 141,-59226 }, { 142,-59226 }, + { 143,-59226 }, { 144,-59226 }, { 145,-59226 }, { 146,-59226 }, { 147,-59226 }, + { 148,-59226 }, { 149,-59226 }, { 150,-59226 }, { 151,-59226 }, { 152,-59226 }, + { 153,-59226 }, { 154,-59226 }, { 155,-59226 }, { 156,-59226 }, { 157,-59226 }, + + { 158,-59226 }, { 159,-59226 }, { 160,-59226 }, { 161,-59226 }, { 162,-59226 }, + { 163,-59226 }, { 164,-59226 }, { 165,-59226 }, { 166,-59226 }, { 167,-59226 }, + { 168,-59226 }, { 169,-59226 }, { 170,-59226 }, { 171,-59226 }, { 172,-59226 }, + { 173,-59226 }, { 174,-59226 }, { 175,-59226 }, { 176,-59226 }, { 177,-59226 }, + { 178,-59226 }, { 179,-59226 }, { 180,-59226 }, { 181,-59226 }, { 182,-59226 }, + { 183,-59226 }, { 184,-59226 }, { 185,-59226 }, { 186,-59226 }, { 187,-59226 }, + { 188,-59226 }, { 189,-59226 }, { 190,-59226 }, { 191,-59226 }, { 192,-59226 }, + { 193,-59226 }, { 194,-59226 }, { 195,-59226 }, { 196,-59226 }, { 197,-59226 }, + { 198,-59226 }, { 199,-59226 }, { 200,-59226 }, { 201,-59226 }, { 202,-59226 }, + { 203,-59226 }, { 204,-59226 }, { 205,-59226 }, { 206,-59226 }, { 207,-59226 }, + + { 208,-59226 }, { 209,-59226 }, { 210,-59226 }, { 211,-59226 }, { 212,-59226 }, + { 213,-59226 }, { 214,-59226 }, { 215,-59226 }, { 216,-59226 }, { 217,-59226 }, + { 218,-59226 }, { 219,-59226 }, { 220,-59226 }, { 221,-59226 }, { 222,-59226 }, + { 223,-59226 }, { 224,-59226 }, { 225,-59226 }, { 226,-59226 }, { 227,-59226 }, + { 228,-59226 }, { 229,-59226 }, { 230,-59226 }, { 231,-59226 }, { 232,-59226 }, + { 233,-59226 }, { 234,-59226 }, { 235,-59226 }, { 236,-59226 }, { 237,-59226 }, + { 238,-59226 }, { 239,-59226 }, { 240,-59226 }, { 241,-59226 }, { 242,-59226 }, + { 243,-59226 }, { 244,-59226 }, { 245,-59226 }, { 246,-59226 }, { 247,-59226 }, + { 248,-59226 }, { 249,-59226 }, { 250,-59226 }, { 251,-59226 }, { 252,-59226 }, + { 253,-59226 }, { 254,-59226 }, { 255,-59226 }, { 0, 131 }, { 0,32640 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-59483 }, { 49,-59483 }, { 50,-59483 }, + + { 51,-59483 }, { 52,-59483 }, { 53,-59483 }, { 54,-59483 }, { 55,-59483 }, + { 56,-59483 }, { 57,-59483 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-59483 }, + { 66,-59483 }, { 67,-59483 }, { 68,-59483 }, { 69,-59483 }, { 70,-59483 }, + { 71,-59483 }, { 72,-59483 }, { 73,-59483 }, { 74,-59483 }, { 75,-59483 }, + { 76,9252 }, { 77,-59483 }, { 78,-59483 }, { 79,-59483 }, { 80,-59483 }, + { 81,-59483 }, { 82,-59483 }, { 83,-59483 }, { 84,-59483 }, { 85,-59483 }, + { 86,-59483 }, { 87,-59483 }, { 88,-59483 }, { 89,-59483 }, { 90,-59483 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-59483 }, + { 0, 0 }, { 97,-59483 }, { 98,-59483 }, { 99,-59483 }, { 100,-59483 }, + + { 101,-59483 }, { 102,-59483 }, { 103,-59483 }, { 104,-59483 }, { 105,-59483 }, + { 106,-59483 }, { 107,-59483 }, { 108,9252 }, { 109,-59483 }, { 110,-59483 }, + { 111,-59483 }, { 112,-59483 }, { 113,-59483 }, { 114,-59483 }, { 115,-59483 }, + { 116,-59483 }, { 117,-59483 }, { 118,-59483 }, { 119,-59483 }, { 120,-59483 }, + { 121,-59483 }, { 122,-59483 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-59483 }, { 128,-59483 }, { 129,-59483 }, { 130,-59483 }, + { 131,-59483 }, { 132,-59483 }, { 133,-59483 }, { 134,-59483 }, { 135,-59483 }, + { 136,-59483 }, { 137,-59483 }, { 138,-59483 }, { 139,-59483 }, { 140,-59483 }, + { 141,-59483 }, { 142,-59483 }, { 143,-59483 }, { 144,-59483 }, { 145,-59483 }, + { 146,-59483 }, { 147,-59483 }, { 148,-59483 }, { 149,-59483 }, { 150,-59483 }, + + { 151,-59483 }, { 152,-59483 }, { 153,-59483 }, { 154,-59483 }, { 155,-59483 }, + { 156,-59483 }, { 157,-59483 }, { 158,-59483 }, { 159,-59483 }, { 160,-59483 }, + { 161,-59483 }, { 162,-59483 }, { 163,-59483 }, { 164,-59483 }, { 165,-59483 }, + { 166,-59483 }, { 167,-59483 }, { 168,-59483 }, { 169,-59483 }, { 170,-59483 }, + { 171,-59483 }, { 172,-59483 }, { 173,-59483 }, { 174,-59483 }, { 175,-59483 }, + { 176,-59483 }, { 177,-59483 }, { 178,-59483 }, { 179,-59483 }, { 180,-59483 }, + { 181,-59483 }, { 182,-59483 }, { 183,-59483 }, { 184,-59483 }, { 185,-59483 }, + { 186,-59483 }, { 187,-59483 }, { 188,-59483 }, { 189,-59483 }, { 190,-59483 }, + { 191,-59483 }, { 192,-59483 }, { 193,-59483 }, { 194,-59483 }, { 195,-59483 }, + { 196,-59483 }, { 197,-59483 }, { 198,-59483 }, { 199,-59483 }, { 200,-59483 }, + + { 201,-59483 }, { 202,-59483 }, { 203,-59483 }, { 204,-59483 }, { 205,-59483 }, + { 206,-59483 }, { 207,-59483 }, { 208,-59483 }, { 209,-59483 }, { 210,-59483 }, + { 211,-59483 }, { 212,-59483 }, { 213,-59483 }, { 214,-59483 }, { 215,-59483 }, + { 216,-59483 }, { 217,-59483 }, { 218,-59483 }, { 219,-59483 }, { 220,-59483 }, + { 221,-59483 }, { 222,-59483 }, { 223,-59483 }, { 224,-59483 }, { 225,-59483 }, + { 226,-59483 }, { 227,-59483 }, { 228,-59483 }, { 229,-59483 }, { 230,-59483 }, + { 231,-59483 }, { 232,-59483 }, { 233,-59483 }, { 234,-59483 }, { 235,-59483 }, + { 236,-59483 }, { 237,-59483 }, { 238,-59483 }, { 239,-59483 }, { 240,-59483 }, + { 241,-59483 }, { 242,-59483 }, { 243,-59483 }, { 244,-59483 }, { 245,-59483 }, + { 246,-59483 }, { 247,-59483 }, { 248,-59483 }, { 249,-59483 }, { 250,-59483 }, + + { 251,-59483 }, { 252,-59483 }, { 253,-59483 }, { 254,-59483 }, { 255,-59483 }, + { 0, 40 }, { 0,32383 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-59740 }, + { 49,-59740 }, { 50,-59740 }, { 51,-59740 }, { 52,-59740 }, { 53,-59740 }, + { 54,-59740 }, { 55,-59740 }, { 56,-59740 }, { 57,-59740 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-59740 }, { 66,-59740 }, { 67,-59740 }, { 68,-59740 }, + { 69,9252 }, { 70,-59740 }, { 71,-59740 }, { 72,-59740 }, { 73,-59740 }, + { 74,-59740 }, { 75,-59740 }, { 76,-59740 }, { 77,-59740 }, { 78,-59740 }, + { 79,-59740 }, { 80,-59740 }, { 81,-59740 }, { 82,-59740 }, { 83,-59740 }, + { 84,-59740 }, { 85,-59740 }, { 86,-59740 }, { 87,-59740 }, { 88,-59740 }, + { 89,-59740 }, { 90,-59740 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 95,-59740 }, { 0, 0 }, { 97,-59740 }, { 98,-59740 }, + { 99,-59740 }, { 100,-59740 }, { 101,9252 }, { 102,-59740 }, { 103,-59740 }, + { 104,-59740 }, { 105,-59740 }, { 106,-59740 }, { 107,-59740 }, { 108,-59740 }, + { 109,-59740 }, { 110,-59740 }, { 111,-59740 }, { 112,-59740 }, { 113,-59740 }, + { 114,-59740 }, { 115,-59740 }, { 116,-59740 }, { 117,-59740 }, { 118,-59740 }, + { 119,-59740 }, { 120,-59740 }, { 121,-59740 }, { 122,-59740 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-59740 }, { 128,-59740 }, + { 129,-59740 }, { 130,-59740 }, { 131,-59740 }, { 132,-59740 }, { 133,-59740 }, + { 134,-59740 }, { 135,-59740 }, { 136,-59740 }, { 137,-59740 }, { 138,-59740 }, + { 139,-59740 }, { 140,-59740 }, { 141,-59740 }, { 142,-59740 }, { 143,-59740 }, + + { 144,-59740 }, { 145,-59740 }, { 146,-59740 }, { 147,-59740 }, { 148,-59740 }, + { 149,-59740 }, { 150,-59740 }, { 151,-59740 }, { 152,-59740 }, { 153,-59740 }, + { 154,-59740 }, { 155,-59740 }, { 156,-59740 }, { 157,-59740 }, { 158,-59740 }, + { 159,-59740 }, { 160,-59740 }, { 161,-59740 }, { 162,-59740 }, { 163,-59740 }, + { 164,-59740 }, { 165,-59740 }, { 166,-59740 }, { 167,-59740 }, { 168,-59740 }, + { 169,-59740 }, { 170,-59740 }, { 171,-59740 }, { 172,-59740 }, { 173,-59740 }, + { 174,-59740 }, { 175,-59740 }, { 176,-59740 }, { 177,-59740 }, { 178,-59740 }, + { 179,-59740 }, { 180,-59740 }, { 181,-59740 }, { 182,-59740 }, { 183,-59740 }, + { 184,-59740 }, { 185,-59740 }, { 186,-59740 }, { 187,-59740 }, { 188,-59740 }, + { 189,-59740 }, { 190,-59740 }, { 191,-59740 }, { 192,-59740 }, { 193,-59740 }, + + { 194,-59740 }, { 195,-59740 }, { 196,-59740 }, { 197,-59740 }, { 198,-59740 }, + { 199,-59740 }, { 200,-59740 }, { 201,-59740 }, { 202,-59740 }, { 203,-59740 }, + { 204,-59740 }, { 205,-59740 }, { 206,-59740 }, { 207,-59740 }, { 208,-59740 }, + { 209,-59740 }, { 210,-59740 }, { 211,-59740 }, { 212,-59740 }, { 213,-59740 }, + { 214,-59740 }, { 215,-59740 }, { 216,-59740 }, { 217,-59740 }, { 218,-59740 }, + { 219,-59740 }, { 220,-59740 }, { 221,-59740 }, { 222,-59740 }, { 223,-59740 }, + { 224,-59740 }, { 225,-59740 }, { 226,-59740 }, { 227,-59740 }, { 228,-59740 }, + { 229,-59740 }, { 230,-59740 }, { 231,-59740 }, { 232,-59740 }, { 233,-59740 }, + { 234,-59740 }, { 235,-59740 }, { 236,-59740 }, { 237,-59740 }, { 238,-59740 }, + { 239,-59740 }, { 240,-59740 }, { 241,-59740 }, { 242,-59740 }, { 243,-59740 }, + + { 244,-59740 }, { 245,-59740 }, { 246,-59740 }, { 247,-59740 }, { 248,-59740 }, + { 249,-59740 }, { 250,-59740 }, { 251,-59740 }, { 252,-59740 }, { 253,-59740 }, + { 254,-59740 }, { 255,-59740 }, { 0, 131 }, { 0,32126 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-59997 }, { 49,-59997 }, { 50,-59997 }, { 51,-59997 }, + { 52,-59997 }, { 53,-59997 }, { 54,-59997 }, { 55,-59997 }, { 56,-59997 }, + { 57,-59997 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-59997 }, { 66,-59997 }, + { 67,-59997 }, { 68,-59997 }, { 69,-59997 }, { 70,-59997 }, { 71,-59997 }, + { 72,-59997 }, { 73,-59997 }, { 74,-59997 }, { 75,-59997 }, { 76,-59997 }, + { 77,-59997 }, { 78,-59997 }, { 79,-59997 }, { 80,-59997 }, { 81,-59997 }, + { 82,-59997 }, { 83,-59997 }, { 84,9252 }, { 85,-59997 }, { 86,-59997 }, + + { 87,-59997 }, { 88,-59997 }, { 89,-59997 }, { 90,-59997 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-59997 }, { 0, 0 }, + { 97,-59997 }, { 98,-59997 }, { 99,-59997 }, { 100,-59997 }, { 101,-59997 }, + { 102,-59997 }, { 103,-59997 }, { 104,-59997 }, { 105,-59997 }, { 106,-59997 }, + { 107,-59997 }, { 108,-59997 }, { 109,-59997 }, { 110,-59997 }, { 111,-59997 }, + { 112,-59997 }, { 113,-59997 }, { 114,-59997 }, { 115,-59997 }, { 116,9252 }, + { 117,-59997 }, { 118,-59997 }, { 119,-59997 }, { 120,-59997 }, { 121,-59997 }, + { 122,-59997 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-59997 }, { 128,-59997 }, { 129,-59997 }, { 130,-59997 }, { 131,-59997 }, + { 132,-59997 }, { 133,-59997 }, { 134,-59997 }, { 135,-59997 }, { 136,-59997 }, + + { 137,-59997 }, { 138,-59997 }, { 139,-59997 }, { 140,-59997 }, { 141,-59997 }, + { 142,-59997 }, { 143,-59997 }, { 144,-59997 }, { 145,-59997 }, { 146,-59997 }, + { 147,-59997 }, { 148,-59997 }, { 149,-59997 }, { 150,-59997 }, { 151,-59997 }, + { 152,-59997 }, { 153,-59997 }, { 154,-59997 }, { 155,-59997 }, { 156,-59997 }, + { 157,-59997 }, { 158,-59997 }, { 159,-59997 }, { 160,-59997 }, { 161,-59997 }, + { 162,-59997 }, { 163,-59997 }, { 164,-59997 }, { 165,-59997 }, { 166,-59997 }, + { 167,-59997 }, { 168,-59997 }, { 169,-59997 }, { 170,-59997 }, { 171,-59997 }, + { 172,-59997 }, { 173,-59997 }, { 174,-59997 }, { 175,-59997 }, { 176,-59997 }, + { 177,-59997 }, { 178,-59997 }, { 179,-59997 }, { 180,-59997 }, { 181,-59997 }, + { 182,-59997 }, { 183,-59997 }, { 184,-59997 }, { 185,-59997 }, { 186,-59997 }, + + { 187,-59997 }, { 188,-59997 }, { 189,-59997 }, { 190,-59997 }, { 191,-59997 }, + { 192,-59997 }, { 193,-59997 }, { 194,-59997 }, { 195,-59997 }, { 196,-59997 }, + { 197,-59997 }, { 198,-59997 }, { 199,-59997 }, { 200,-59997 }, { 201,-59997 }, + { 202,-59997 }, { 203,-59997 }, { 204,-59997 }, { 205,-59997 }, { 206,-59997 }, + { 207,-59997 }, { 208,-59997 }, { 209,-59997 }, { 210,-59997 }, { 211,-59997 }, + { 212,-59997 }, { 213,-59997 }, { 214,-59997 }, { 215,-59997 }, { 216,-59997 }, + { 217,-59997 }, { 218,-59997 }, { 219,-59997 }, { 220,-59997 }, { 221,-59997 }, + { 222,-59997 }, { 223,-59997 }, { 224,-59997 }, { 225,-59997 }, { 226,-59997 }, + { 227,-59997 }, { 228,-59997 }, { 229,-59997 }, { 230,-59997 }, { 231,-59997 }, + { 232,-59997 }, { 233,-59997 }, { 234,-59997 }, { 235,-59997 }, { 236,-59997 }, + + { 237,-59997 }, { 238,-59997 }, { 239,-59997 }, { 240,-59997 }, { 241,-59997 }, + { 242,-59997 }, { 243,-59997 }, { 244,-59997 }, { 245,-59997 }, { 246,-59997 }, + { 247,-59997 }, { 248,-59997 }, { 249,-59997 }, { 250,-59997 }, { 251,-59997 }, + { 252,-59997 }, { 253,-59997 }, { 254,-59997 }, { 255,-59997 }, { 0, 131 }, + { 0,31869 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-60254 }, { 49,-60254 }, + { 50,-60254 }, { 51,-60254 }, { 52,-60254 }, { 53,-60254 }, { 54,-60254 }, + { 55,-60254 }, { 56,-60254 }, { 57,-60254 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-60254 }, { 66,-60254 }, { 67,-60254 }, { 68,-60254 }, { 69,-60254 }, + { 70,-60254 }, { 71,-60254 }, { 72,-60254 }, { 73,-60254 }, { 74,-60254 }, + { 75,-60254 }, { 76,9252 }, { 77,-60254 }, { 78,-60254 }, { 79,-60254 }, + + { 80,-60254 }, { 81,-60254 }, { 82,-60254 }, { 83,-60254 }, { 84,-60254 }, + { 85,-60254 }, { 86,-60254 }, { 87,-60254 }, { 88,-60254 }, { 89,-60254 }, + { 90,-60254 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-60254 }, { 0, 0 }, { 97,-60254 }, { 98,-60254 }, { 99,-60254 }, + { 100,-60254 }, { 101,-60254 }, { 102,-60254 }, { 103,-60254 }, { 104,-60254 }, + { 105,-60254 }, { 106,-60254 }, { 107,-60254 }, { 108,9252 }, { 109,-60254 }, + { 110,-60254 }, { 111,-60254 }, { 112,-60254 }, { 113,-60254 }, { 114,-60254 }, + { 115,-60254 }, { 116,-60254 }, { 117,-60254 }, { 118,-60254 }, { 119,-60254 }, + { 120,-60254 }, { 121,-60254 }, { 122,-60254 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-60254 }, { 128,-60254 }, { 129,-60254 }, + + { 130,-60254 }, { 131,-60254 }, { 132,-60254 }, { 133,-60254 }, { 134,-60254 }, + { 135,-60254 }, { 136,-60254 }, { 137,-60254 }, { 138,-60254 }, { 139,-60254 }, + { 140,-60254 }, { 141,-60254 }, { 142,-60254 }, { 143,-60254 }, { 144,-60254 }, + { 145,-60254 }, { 146,-60254 }, { 147,-60254 }, { 148,-60254 }, { 149,-60254 }, + { 150,-60254 }, { 151,-60254 }, { 152,-60254 }, { 153,-60254 }, { 154,-60254 }, + { 155,-60254 }, { 156,-60254 }, { 157,-60254 }, { 158,-60254 }, { 159,-60254 }, + { 160,-60254 }, { 161,-60254 }, { 162,-60254 }, { 163,-60254 }, { 164,-60254 }, + { 165,-60254 }, { 166,-60254 }, { 167,-60254 }, { 168,-60254 }, { 169,-60254 }, + { 170,-60254 }, { 171,-60254 }, { 172,-60254 }, { 173,-60254 }, { 174,-60254 }, + { 175,-60254 }, { 176,-60254 }, { 177,-60254 }, { 178,-60254 }, { 179,-60254 }, + + { 180,-60254 }, { 181,-60254 }, { 182,-60254 }, { 183,-60254 }, { 184,-60254 }, + { 185,-60254 }, { 186,-60254 }, { 187,-60254 }, { 188,-60254 }, { 189,-60254 }, + { 190,-60254 }, { 191,-60254 }, { 192,-60254 }, { 193,-60254 }, { 194,-60254 }, + { 195,-60254 }, { 196,-60254 }, { 197,-60254 }, { 198,-60254 }, { 199,-60254 }, + { 200,-60254 }, { 201,-60254 }, { 202,-60254 }, { 203,-60254 }, { 204,-60254 }, + { 205,-60254 }, { 206,-60254 }, { 207,-60254 }, { 208,-60254 }, { 209,-60254 }, + { 210,-60254 }, { 211,-60254 }, { 212,-60254 }, { 213,-60254 }, { 214,-60254 }, + { 215,-60254 }, { 216,-60254 }, { 217,-60254 }, { 218,-60254 }, { 219,-60254 }, + { 220,-60254 }, { 221,-60254 }, { 222,-60254 }, { 223,-60254 }, { 224,-60254 }, + { 225,-60254 }, { 226,-60254 }, { 227,-60254 }, { 228,-60254 }, { 229,-60254 }, + + { 230,-60254 }, { 231,-60254 }, { 232,-60254 }, { 233,-60254 }, { 234,-60254 }, + { 235,-60254 }, { 236,-60254 }, { 237,-60254 }, { 238,-60254 }, { 239,-60254 }, + { 240,-60254 }, { 241,-60254 }, { 242,-60254 }, { 243,-60254 }, { 244,-60254 }, + { 245,-60254 }, { 246,-60254 }, { 247,-60254 }, { 248,-60254 }, { 249,-60254 }, + { 250,-60254 }, { 251,-60254 }, { 252,-60254 }, { 253,-60254 }, { 254,-60254 }, + { 255,-60254 }, { 0, 131 }, { 0,31612 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-60511 }, { 49,-60511 }, { 50,-60511 }, { 51,-60511 }, { 52,-60511 }, + { 53,-60511 }, { 54,-60511 }, { 55,-60511 }, { 56,-60511 }, { 57,-60511 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-60511 }, { 66,-60511 }, { 67,-60511 }, + { 68,-60511 }, { 69,-60511 }, { 70,-60511 }, { 71,-60511 }, { 72,-60511 }, + + { 73,-60511 }, { 74,-60511 }, { 75,-60511 }, { 76,-60511 }, { 77,-60511 }, + { 78,-60511 }, { 79,-60511 }, { 80,-60511 }, { 81,-60511 }, { 82,-60511 }, + { 83,9252 }, { 84,-60511 }, { 85,-60511 }, { 86,-60511 }, { 87,-60511 }, + { 88,-60511 }, { 89,-60511 }, { 90,-60511 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-60511 }, { 0, 0 }, { 97,-60511 }, + { 98,-60511 }, { 99,-60511 }, { 100,-60511 }, { 101,-60511 }, { 102,-60511 }, + { 103,-60511 }, { 104,-60511 }, { 105,-60511 }, { 106,-60511 }, { 107,-60511 }, + { 108,-60511 }, { 109,-60511 }, { 110,-60511 }, { 111,-60511 }, { 112,-60511 }, + { 113,-60511 }, { 114,-60511 }, { 115,9252 }, { 116,-60511 }, { 117,-60511 }, + { 118,-60511 }, { 119,-60511 }, { 120,-60511 }, { 121,-60511 }, { 122,-60511 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-60511 }, + { 128,-60511 }, { 129,-60511 }, { 130,-60511 }, { 131,-60511 }, { 132,-60511 }, + { 133,-60511 }, { 134,-60511 }, { 135,-60511 }, { 136,-60511 }, { 137,-60511 }, + { 138,-60511 }, { 139,-60511 }, { 140,-60511 }, { 141,-60511 }, { 142,-60511 }, + { 143,-60511 }, { 144,-60511 }, { 145,-60511 }, { 146,-60511 }, { 147,-60511 }, + { 148,-60511 }, { 149,-60511 }, { 150,-60511 }, { 151,-60511 }, { 152,-60511 }, + { 153,-60511 }, { 154,-60511 }, { 155,-60511 }, { 156,-60511 }, { 157,-60511 }, + { 158,-60511 }, { 159,-60511 }, { 160,-60511 }, { 161,-60511 }, { 162,-60511 }, + { 163,-60511 }, { 164,-60511 }, { 165,-60511 }, { 166,-60511 }, { 167,-60511 }, + { 168,-60511 }, { 169,-60511 }, { 170,-60511 }, { 171,-60511 }, { 172,-60511 }, + + { 173,-60511 }, { 174,-60511 }, { 175,-60511 }, { 176,-60511 }, { 177,-60511 }, + { 178,-60511 }, { 179,-60511 }, { 180,-60511 }, { 181,-60511 }, { 182,-60511 }, + { 183,-60511 }, { 184,-60511 }, { 185,-60511 }, { 186,-60511 }, { 187,-60511 }, + { 188,-60511 }, { 189,-60511 }, { 190,-60511 }, { 191,-60511 }, { 192,-60511 }, + { 193,-60511 }, { 194,-60511 }, { 195,-60511 }, { 196,-60511 }, { 197,-60511 }, + { 198,-60511 }, { 199,-60511 }, { 200,-60511 }, { 201,-60511 }, { 202,-60511 }, + { 203,-60511 }, { 204,-60511 }, { 205,-60511 }, { 206,-60511 }, { 207,-60511 }, + { 208,-60511 }, { 209,-60511 }, { 210,-60511 }, { 211,-60511 }, { 212,-60511 }, + { 213,-60511 }, { 214,-60511 }, { 215,-60511 }, { 216,-60511 }, { 217,-60511 }, + { 218,-60511 }, { 219,-60511 }, { 220,-60511 }, { 221,-60511 }, { 222,-60511 }, + + { 223,-60511 }, { 224,-60511 }, { 225,-60511 }, { 226,-60511 }, { 227,-60511 }, + { 228,-60511 }, { 229,-60511 }, { 230,-60511 }, { 231,-60511 }, { 232,-60511 }, + { 233,-60511 }, { 234,-60511 }, { 235,-60511 }, { 236,-60511 }, { 237,-60511 }, + { 238,-60511 }, { 239,-60511 }, { 240,-60511 }, { 241,-60511 }, { 242,-60511 }, + { 243,-60511 }, { 244,-60511 }, { 245,-60511 }, { 246,-60511 }, { 247,-60511 }, + { 248,-60511 }, { 249,-60511 }, { 250,-60511 }, { 251,-60511 }, { 252,-60511 }, + { 253,-60511 }, { 254,-60511 }, { 255,-60511 }, { 0, 131 }, { 0,31355 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-60768 }, { 49,-60768 }, { 50,-60768 }, + { 51,-60768 }, { 52,-60768 }, { 53,-60768 }, { 54,-60768 }, { 55,-60768 }, + { 56,-60768 }, { 57,-60768 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-60768 }, + + { 66,-60768 }, { 67,-60768 }, { 68,-60768 }, { 69,-60768 }, { 70,-60768 }, + { 71,-60768 }, { 72,-60768 }, { 73,-60768 }, { 74,-60768 }, { 75,-60768 }, + { 76,-60768 }, { 77,-60768 }, { 78,-60768 }, { 79,-60768 }, { 80,-60768 }, + { 81,-60768 }, { 82,-60768 }, { 83,-60768 }, { 84,-60768 }, { 85,-60768 }, + { 86,-60768 }, { 87,-60768 }, { 88,-60768 }, { 89,9252 }, { 90,-60768 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-60768 }, + { 0, 0 }, { 97,-60768 }, { 98,-60768 }, { 99,-60768 }, { 100,-60768 }, + { 101,-60768 }, { 102,-60768 }, { 103,-60768 }, { 104,-60768 }, { 105,-60768 }, + { 106,-60768 }, { 107,-60768 }, { 108,-60768 }, { 109,-60768 }, { 110,-60768 }, + { 111,-60768 }, { 112,-60768 }, { 113,-60768 }, { 114,-60768 }, { 115,-60768 }, + + { 116,-60768 }, { 117,-60768 }, { 118,-60768 }, { 119,-60768 }, { 120,-60768 }, + { 121,9252 }, { 122,-60768 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-60768 }, { 128,-60768 }, { 129,-60768 }, { 130,-60768 }, + { 131,-60768 }, { 132,-60768 }, { 133,-60768 }, { 134,-60768 }, { 135,-60768 }, + { 136,-60768 }, { 137,-60768 }, { 138,-60768 }, { 139,-60768 }, { 140,-60768 }, + { 141,-60768 }, { 142,-60768 }, { 143,-60768 }, { 144,-60768 }, { 145,-60768 }, + { 146,-60768 }, { 147,-60768 }, { 148,-60768 }, { 149,-60768 }, { 150,-60768 }, + { 151,-60768 }, { 152,-60768 }, { 153,-60768 }, { 154,-60768 }, { 155,-60768 }, + { 156,-60768 }, { 157,-60768 }, { 158,-60768 }, { 159,-60768 }, { 160,-60768 }, + { 161,-60768 }, { 162,-60768 }, { 163,-60768 }, { 164,-60768 }, { 165,-60768 }, + + { 166,-60768 }, { 167,-60768 }, { 168,-60768 }, { 169,-60768 }, { 170,-60768 }, + { 171,-60768 }, { 172,-60768 }, { 173,-60768 }, { 174,-60768 }, { 175,-60768 }, + { 176,-60768 }, { 177,-60768 }, { 178,-60768 }, { 179,-60768 }, { 180,-60768 }, + { 181,-60768 }, { 182,-60768 }, { 183,-60768 }, { 184,-60768 }, { 185,-60768 }, + { 186,-60768 }, { 187,-60768 }, { 188,-60768 }, { 189,-60768 }, { 190,-60768 }, + { 191,-60768 }, { 192,-60768 }, { 193,-60768 }, { 194,-60768 }, { 195,-60768 }, + { 196,-60768 }, { 197,-60768 }, { 198,-60768 }, { 199,-60768 }, { 200,-60768 }, + { 201,-60768 }, { 202,-60768 }, { 203,-60768 }, { 204,-60768 }, { 205,-60768 }, + { 206,-60768 }, { 207,-60768 }, { 208,-60768 }, { 209,-60768 }, { 210,-60768 }, + { 211,-60768 }, { 212,-60768 }, { 213,-60768 }, { 214,-60768 }, { 215,-60768 }, + + { 216,-60768 }, { 217,-60768 }, { 218,-60768 }, { 219,-60768 }, { 220,-60768 }, + { 221,-60768 }, { 222,-60768 }, { 223,-60768 }, { 224,-60768 }, { 225,-60768 }, + { 226,-60768 }, { 227,-60768 }, { 228,-60768 }, { 229,-60768 }, { 230,-60768 }, + { 231,-60768 }, { 232,-60768 }, { 233,-60768 }, { 234,-60768 }, { 235,-60768 }, + { 236,-60768 }, { 237,-60768 }, { 238,-60768 }, { 239,-60768 }, { 240,-60768 }, + { 241,-60768 }, { 242,-60768 }, { 243,-60768 }, { 244,-60768 }, { 245,-60768 }, + { 246,-60768 }, { 247,-60768 }, { 248,-60768 }, { 249,-60768 }, { 250,-60768 }, + { 251,-60768 }, { 252,-60768 }, { 253,-60768 }, { 254,-60768 }, { 255,-60768 }, + { 0, 131 }, { 0,31098 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-61025 }, + { 49,-61025 }, { 50,-61025 }, { 51,-61025 }, { 52,-61025 }, { 53,-61025 }, + { 54,-61025 }, { 55,-61025 }, { 56,-61025 }, { 57,-61025 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-61025 }, { 66,-61025 }, { 67,-61025 }, { 68,-61025 }, + { 69,-61025 }, { 70,-61025 }, { 71,-61025 }, { 72,9252 }, { 73,-61025 }, + { 74,-61025 }, { 75,-61025 }, { 76,-61025 }, { 77,-61025 }, { 78,-61025 }, + { 79,-61025 }, { 80,-61025 }, { 81,-61025 }, { 82,-61025 }, { 83,-61025 }, + { 84,-61025 }, { 85,-61025 }, { 86,-61025 }, { 87,-61025 }, { 88,-61025 }, + { 89,-61025 }, { 90,-61025 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-61025 }, { 0, 0 }, { 97,-61025 }, { 98,-61025 }, + { 99,-61025 }, { 100,-61025 }, { 101,-61025 }, { 102,-61025 }, { 103,-61025 }, + { 104,9252 }, { 105,-61025 }, { 106,-61025 }, { 107,-61025 }, { 108,-61025 }, + + { 109,-61025 }, { 110,-61025 }, { 111,-61025 }, { 112,-61025 }, { 113,-61025 }, + { 114,-61025 }, { 115,-61025 }, { 116,-61025 }, { 117,-61025 }, { 118,-61025 }, + { 119,-61025 }, { 120,-61025 }, { 121,-61025 }, { 122,-61025 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-61025 }, { 128,-61025 }, + { 129,-61025 }, { 130,-61025 }, { 131,-61025 }, { 132,-61025 }, { 133,-61025 }, + { 134,-61025 }, { 135,-61025 }, { 136,-61025 }, { 137,-61025 }, { 138,-61025 }, + { 139,-61025 }, { 140,-61025 }, { 141,-61025 }, { 142,-61025 }, { 143,-61025 }, + { 144,-61025 }, { 145,-61025 }, { 146,-61025 }, { 147,-61025 }, { 148,-61025 }, + { 149,-61025 }, { 150,-61025 }, { 151,-61025 }, { 152,-61025 }, { 153,-61025 }, + { 154,-61025 }, { 155,-61025 }, { 156,-61025 }, { 157,-61025 }, { 158,-61025 }, + + { 159,-61025 }, { 160,-61025 }, { 161,-61025 }, { 162,-61025 }, { 163,-61025 }, + { 164,-61025 }, { 165,-61025 }, { 166,-61025 }, { 167,-61025 }, { 168,-61025 }, + { 169,-61025 }, { 170,-61025 }, { 171,-61025 }, { 172,-61025 }, { 173,-61025 }, + { 174,-61025 }, { 175,-61025 }, { 176,-61025 }, { 177,-61025 }, { 178,-61025 }, + { 179,-61025 }, { 180,-61025 }, { 181,-61025 }, { 182,-61025 }, { 183,-61025 }, + { 184,-61025 }, { 185,-61025 }, { 186,-61025 }, { 187,-61025 }, { 188,-61025 }, + { 189,-61025 }, { 190,-61025 }, { 191,-61025 }, { 192,-61025 }, { 193,-61025 }, + { 194,-61025 }, { 195,-61025 }, { 196,-61025 }, { 197,-61025 }, { 198,-61025 }, + { 199,-61025 }, { 200,-61025 }, { 201,-61025 }, { 202,-61025 }, { 203,-61025 }, + { 204,-61025 }, { 205,-61025 }, { 206,-61025 }, { 207,-61025 }, { 208,-61025 }, + + { 209,-61025 }, { 210,-61025 }, { 211,-61025 }, { 212,-61025 }, { 213,-61025 }, + { 214,-61025 }, { 215,-61025 }, { 216,-61025 }, { 217,-61025 }, { 218,-61025 }, + { 219,-61025 }, { 220,-61025 }, { 221,-61025 }, { 222,-61025 }, { 223,-61025 }, + { 224,-61025 }, { 225,-61025 }, { 226,-61025 }, { 227,-61025 }, { 228,-61025 }, + { 229,-61025 }, { 230,-61025 }, { 231,-61025 }, { 232,-61025 }, { 233,-61025 }, + { 234,-61025 }, { 235,-61025 }, { 236,-61025 }, { 237,-61025 }, { 238,-61025 }, + { 239,-61025 }, { 240,-61025 }, { 241,-61025 }, { 242,-61025 }, { 243,-61025 }, + { 244,-61025 }, { 245,-61025 }, { 246,-61025 }, { 247,-61025 }, { 248,-61025 }, + { 249,-61025 }, { 250,-61025 }, { 251,-61025 }, { 252,-61025 }, { 253,-61025 }, + { 254,-61025 }, { 255,-61025 }, { 0, 131 }, { 0,30841 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-61282 }, { 49,-61282 }, { 50,-61282 }, { 51,-61282 }, + + { 52,-61282 }, { 53,-61282 }, { 54,-61282 }, { 55,-61282 }, { 56,-61282 }, + { 57,-61282 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-61282 }, { 66,-61282 }, + { 67,-61282 }, { 68,-61282 }, { 69,-61282 }, { 70,-61282 }, { 71,-61282 }, + { 72,-61282 }, { 73,-61282 }, { 74,-61282 }, { 75,-61282 }, { 76,-61282 }, + { 77,-61282 }, { 78,-61282 }, { 79,9252 }, { 80,-61282 }, { 81,-61282 }, + { 82,-61282 }, { 83,-61282 }, { 84,-61282 }, { 85,-61282 }, { 86,-61282 }, + { 87,-61282 }, { 88,-61282 }, { 89,-61282 }, { 90,-61282 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-61282 }, { 0, 0 }, + { 97,-61282 }, { 98,-61282 }, { 99,-61282 }, { 100,-61282 }, { 101,-61282 }, + + { 102,-61282 }, { 103,-61282 }, { 104,-61282 }, { 105,-61282 }, { 106,-61282 }, + { 107,-61282 }, { 108,-61282 }, { 109,-61282 }, { 110,-61282 }, { 111,9252 }, + { 112,-61282 }, { 113,-61282 }, { 114,-61282 }, { 115,-61282 }, { 116,-61282 }, + { 117,-61282 }, { 118,-61282 }, { 119,-61282 }, { 120,-61282 }, { 121,-61282 }, + { 122,-61282 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-61282 }, { 128,-61282 }, { 129,-61282 }, { 130,-61282 }, { 131,-61282 }, + { 132,-61282 }, { 133,-61282 }, { 134,-61282 }, { 135,-61282 }, { 136,-61282 }, + { 137,-61282 }, { 138,-61282 }, { 139,-61282 }, { 140,-61282 }, { 141,-61282 }, + { 142,-61282 }, { 143,-61282 }, { 144,-61282 }, { 145,-61282 }, { 146,-61282 }, + { 147,-61282 }, { 148,-61282 }, { 149,-61282 }, { 150,-61282 }, { 151,-61282 }, + + { 152,-61282 }, { 153,-61282 }, { 154,-61282 }, { 155,-61282 }, { 156,-61282 }, + { 157,-61282 }, { 158,-61282 }, { 159,-61282 }, { 160,-61282 }, { 161,-61282 }, + { 162,-61282 }, { 163,-61282 }, { 164,-61282 }, { 165,-61282 }, { 166,-61282 }, + { 167,-61282 }, { 168,-61282 }, { 169,-61282 }, { 170,-61282 }, { 171,-61282 }, + { 172,-61282 }, { 173,-61282 }, { 174,-61282 }, { 175,-61282 }, { 176,-61282 }, + { 177,-61282 }, { 178,-61282 }, { 179,-61282 }, { 180,-61282 }, { 181,-61282 }, + { 182,-61282 }, { 183,-61282 }, { 184,-61282 }, { 185,-61282 }, { 186,-61282 }, + { 187,-61282 }, { 188,-61282 }, { 189,-61282 }, { 190,-61282 }, { 191,-61282 }, + { 192,-61282 }, { 193,-61282 }, { 194,-61282 }, { 195,-61282 }, { 196,-61282 }, + { 197,-61282 }, { 198,-61282 }, { 199,-61282 }, { 200,-61282 }, { 201,-61282 }, + + { 202,-61282 }, { 203,-61282 }, { 204,-61282 }, { 205,-61282 }, { 206,-61282 }, + { 207,-61282 }, { 208,-61282 }, { 209,-61282 }, { 210,-61282 }, { 211,-61282 }, + { 212,-61282 }, { 213,-61282 }, { 214,-61282 }, { 215,-61282 }, { 216,-61282 }, + { 217,-61282 }, { 218,-61282 }, { 219,-61282 }, { 220,-61282 }, { 221,-61282 }, + { 222,-61282 }, { 223,-61282 }, { 224,-61282 }, { 225,-61282 }, { 226,-61282 }, + { 227,-61282 }, { 228,-61282 }, { 229,-61282 }, { 230,-61282 }, { 231,-61282 }, + { 232,-61282 }, { 233,-61282 }, { 234,-61282 }, { 235,-61282 }, { 236,-61282 }, + { 237,-61282 }, { 238,-61282 }, { 239,-61282 }, { 240,-61282 }, { 241,-61282 }, + { 242,-61282 }, { 243,-61282 }, { 244,-61282 }, { 245,-61282 }, { 246,-61282 }, + { 247,-61282 }, { 248,-61282 }, { 249,-61282 }, { 250,-61282 }, { 251,-61282 }, + + { 252,-61282 }, { 253,-61282 }, { 254,-61282 }, { 255,-61282 }, { 0, 60 }, + { 0,30584 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-61539 }, { 49,-61539 }, + { 50,-61539 }, { 51,-61539 }, { 52,-61539 }, { 53,-61539 }, { 54,-61539 }, + { 55,-61539 }, { 56,-61539 }, { 57,-61539 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-61539 }, { 66,-61539 }, { 67,-61539 }, { 68,-61539 }, { 69,-61539 }, + { 70,-61539 }, { 71,-61539 }, { 72,-61539 }, { 73,-61539 }, { 74,-61539 }, + { 75,-61539 }, { 76,-61539 }, { 77,-61539 }, { 78,-61539 }, { 79,-61539 }, + { 80,-61539 }, { 81,-61539 }, { 82,-61539 }, { 83,-61539 }, { 84,-61539 }, + { 85,-61539 }, { 86,-61539 }, { 87,-61539 }, { 88,-61539 }, { 89,-61539 }, + { 90,-61539 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 95,-61539 }, { 0, 0 }, { 97,-61539 }, { 98,-61539 }, { 99,-61539 }, + { 100,-61539 }, { 101,-61539 }, { 102,-61539 }, { 103,-61539 }, { 104,-61539 }, + { 105,-61539 }, { 106,-61539 }, { 107,-61539 }, { 108,-61539 }, { 109,-61539 }, + { 110,-61539 }, { 111,-61539 }, { 112,-61539 }, { 113,-61539 }, { 114,-61539 }, + { 115,-61539 }, { 116,-61539 }, { 117,-61539 }, { 118,-61539 }, { 119,-61539 }, + { 120,-61539 }, { 121,-61539 }, { 122,-61539 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-61539 }, { 128,-61539 }, { 129,-61539 }, + { 130,-61539 }, { 131,-61539 }, { 132,-61539 }, { 133,-61539 }, { 134,-61539 }, + { 135,-61539 }, { 136,-61539 }, { 137,-61539 }, { 138,-61539 }, { 139,-61539 }, + { 140,-61539 }, { 141,-61539 }, { 142,-61539 }, { 143,-61539 }, { 144,-61539 }, + + { 145,-61539 }, { 146,-61539 }, { 147,-61539 }, { 148,-61539 }, { 149,-61539 }, + { 150,-61539 }, { 151,-61539 }, { 152,-61539 }, { 153,-61539 }, { 154,-61539 }, + { 155,-61539 }, { 156,-61539 }, { 157,-61539 }, { 158,-61539 }, { 159,-61539 }, + { 160,-61539 }, { 161,-61539 }, { 162,-61539 }, { 163,-61539 }, { 164,-61539 }, + { 165,-61539 }, { 166,-61539 }, { 167,-61539 }, { 168,-61539 }, { 169,-61539 }, + { 170,-61539 }, { 171,-61539 }, { 172,-61539 }, { 173,-61539 }, { 174,-61539 }, + { 175,-61539 }, { 176,-61539 }, { 177,-61539 }, { 178,-61539 }, { 179,-61539 }, + { 180,-61539 }, { 181,-61539 }, { 182,-61539 }, { 183,-61539 }, { 184,-61539 }, + { 185,-61539 }, { 186,-61539 }, { 187,-61539 }, { 188,-61539 }, { 189,-61539 }, + { 190,-61539 }, { 191,-61539 }, { 192,-61539 }, { 193,-61539 }, { 194,-61539 }, + + { 195,-61539 }, { 196,-61539 }, { 197,-61539 }, { 198,-61539 }, { 199,-61539 }, + { 200,-61539 }, { 201,-61539 }, { 202,-61539 }, { 203,-61539 }, { 204,-61539 }, + { 205,-61539 }, { 206,-61539 }, { 207,-61539 }, { 208,-61539 }, { 209,-61539 }, + { 210,-61539 }, { 211,-61539 }, { 212,-61539 }, { 213,-61539 }, { 214,-61539 }, + { 215,-61539 }, { 216,-61539 }, { 217,-61539 }, { 218,-61539 }, { 219,-61539 }, + { 220,-61539 }, { 221,-61539 }, { 222,-61539 }, { 223,-61539 }, { 224,-61539 }, + { 225,-61539 }, { 226,-61539 }, { 227,-61539 }, { 228,-61539 }, { 229,-61539 }, + { 230,-61539 }, { 231,-61539 }, { 232,-61539 }, { 233,-61539 }, { 234,-61539 }, + { 235,-61539 }, { 236,-61539 }, { 237,-61539 }, { 238,-61539 }, { 239,-61539 }, + { 240,-61539 }, { 241,-61539 }, { 242,-61539 }, { 243,-61539 }, { 244,-61539 }, + + { 245,-61539 }, { 246,-61539 }, { 247,-61539 }, { 248,-61539 }, { 249,-61539 }, + { 250,-61539 }, { 251,-61539 }, { 252,-61539 }, { 253,-61539 }, { 254,-61539 }, + { 255,-61539 }, { 0, 131 }, { 0,30327 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-61796 }, { 49,-61796 }, { 50,-61796 }, { 51,-61796 }, { 52,-61796 }, + { 53,-61796 }, { 54,-61796 }, { 55,-61796 }, { 56,-61796 }, { 57,-61796 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-61796 }, { 66,-61796 }, { 67,-61796 }, + { 68,-61796 }, { 69,8995 }, { 70,-61796 }, { 71,-61796 }, { 72,-61796 }, + { 73,-61796 }, { 74,-61796 }, { 75,-61796 }, { 76,-61796 }, { 77,-61796 }, + { 78,-61796 }, { 79,-61796 }, { 80,-61796 }, { 81,-61796 }, { 82,-61796 }, + { 83,-61796 }, { 84,-61796 }, { 85,-61796 }, { 86,-61796 }, { 87,-61796 }, + + { 88,-61796 }, { 89,-61796 }, { 90,-61796 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-61796 }, { 0, 0 }, { 97,-61796 }, + { 98,-61796 }, { 99,-61796 }, { 100,-61796 }, { 101,8995 }, { 102,-61796 }, + { 103,-61796 }, { 104,-61796 }, { 105,-61796 }, { 106,-61796 }, { 107,-61796 }, + { 108,-61796 }, { 109,-61796 }, { 110,-61796 }, { 111,-61796 }, { 112,-61796 }, + { 113,-61796 }, { 114,-61796 }, { 115,-61796 }, { 116,-61796 }, { 117,-61796 }, + { 118,-61796 }, { 119,-61796 }, { 120,-61796 }, { 121,-61796 }, { 122,-61796 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-61796 }, + { 128,-61796 }, { 129,-61796 }, { 130,-61796 }, { 131,-61796 }, { 132,-61796 }, + { 133,-61796 }, { 134,-61796 }, { 135,-61796 }, { 136,-61796 }, { 137,-61796 }, + + { 138,-61796 }, { 139,-61796 }, { 140,-61796 }, { 141,-61796 }, { 142,-61796 }, + { 143,-61796 }, { 144,-61796 }, { 145,-61796 }, { 146,-61796 }, { 147,-61796 }, + { 148,-61796 }, { 149,-61796 }, { 150,-61796 }, { 151,-61796 }, { 152,-61796 }, + { 153,-61796 }, { 154,-61796 }, { 155,-61796 }, { 156,-61796 }, { 157,-61796 }, + { 158,-61796 }, { 159,-61796 }, { 160,-61796 }, { 161,-61796 }, { 162,-61796 }, + { 163,-61796 }, { 164,-61796 }, { 165,-61796 }, { 166,-61796 }, { 167,-61796 }, + { 168,-61796 }, { 169,-61796 }, { 170,-61796 }, { 171,-61796 }, { 172,-61796 }, + { 173,-61796 }, { 174,-61796 }, { 175,-61796 }, { 176,-61796 }, { 177,-61796 }, + { 178,-61796 }, { 179,-61796 }, { 180,-61796 }, { 181,-61796 }, { 182,-61796 }, + { 183,-61796 }, { 184,-61796 }, { 185,-61796 }, { 186,-61796 }, { 187,-61796 }, + + { 188,-61796 }, { 189,-61796 }, { 190,-61796 }, { 191,-61796 }, { 192,-61796 }, + { 193,-61796 }, { 194,-61796 }, { 195,-61796 }, { 196,-61796 }, { 197,-61796 }, + { 198,-61796 }, { 199,-61796 }, { 200,-61796 }, { 201,-61796 }, { 202,-61796 }, + { 203,-61796 }, { 204,-61796 }, { 205,-61796 }, { 206,-61796 }, { 207,-61796 }, + { 208,-61796 }, { 209,-61796 }, { 210,-61796 }, { 211,-61796 }, { 212,-61796 }, + { 213,-61796 }, { 214,-61796 }, { 215,-61796 }, { 216,-61796 }, { 217,-61796 }, + { 218,-61796 }, { 219,-61796 }, { 220,-61796 }, { 221,-61796 }, { 222,-61796 }, + { 223,-61796 }, { 224,-61796 }, { 225,-61796 }, { 226,-61796 }, { 227,-61796 }, + { 228,-61796 }, { 229,-61796 }, { 230,-61796 }, { 231,-61796 }, { 232,-61796 }, + { 233,-61796 }, { 234,-61796 }, { 235,-61796 }, { 236,-61796 }, { 237,-61796 }, + + { 238,-61796 }, { 239,-61796 }, { 240,-61796 }, { 241,-61796 }, { 242,-61796 }, + { 243,-61796 }, { 244,-61796 }, { 245,-61796 }, { 246,-61796 }, { 247,-61796 }, + { 248,-61796 }, { 249,-61796 }, { 250,-61796 }, { 251,-61796 }, { 252,-61796 }, + { 253,-61796 }, { 254,-61796 }, { 255,-61796 }, { 0, 131 }, { 0,30070 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-62053 }, { 49,-62053 }, { 50,-62053 }, + { 51,-62053 }, { 52,-62053 }, { 53,-62053 }, { 54,-62053 }, { 55,-62053 }, + { 56,-62053 }, { 57,-62053 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-62053 }, + { 66,-62053 }, { 67,-62053 }, { 68,-62053 }, { 69,8995 }, { 70,-62053 }, + { 71,-62053 }, { 72,-62053 }, { 73,-62053 }, { 74,-62053 }, { 75,-62053 }, + { 76,-62053 }, { 77,-62053 }, { 78,-62053 }, { 79,-62053 }, { 80,-62053 }, + + { 81,-62053 }, { 82,-62053 }, { 83,-62053 }, { 84,-62053 }, { 85,-62053 }, + { 86,-62053 }, { 87,-62053 }, { 88,-62053 }, { 89,-62053 }, { 90,-62053 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-62053 }, + { 0, 0 }, { 97,-62053 }, { 98,-62053 }, { 99,-62053 }, { 100,-62053 }, + { 101,8995 }, { 102,-62053 }, { 103,-62053 }, { 104,-62053 }, { 105,-62053 }, + { 106,-62053 }, { 107,-62053 }, { 108,-62053 }, { 109,-62053 }, { 110,-62053 }, + { 111,-62053 }, { 112,-62053 }, { 113,-62053 }, { 114,-62053 }, { 115,-62053 }, + { 116,-62053 }, { 117,-62053 }, { 118,-62053 }, { 119,-62053 }, { 120,-62053 }, + { 121,-62053 }, { 122,-62053 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-62053 }, { 128,-62053 }, { 129,-62053 }, { 130,-62053 }, + + { 131,-62053 }, { 132,-62053 }, { 133,-62053 }, { 134,-62053 }, { 135,-62053 }, + { 136,-62053 }, { 137,-62053 }, { 138,-62053 }, { 139,-62053 }, { 140,-62053 }, + { 141,-62053 }, { 142,-62053 }, { 143,-62053 }, { 144,-62053 }, { 145,-62053 }, + { 146,-62053 }, { 147,-62053 }, { 148,-62053 }, { 149,-62053 }, { 150,-62053 }, + { 151,-62053 }, { 152,-62053 }, { 153,-62053 }, { 154,-62053 }, { 155,-62053 }, + { 156,-62053 }, { 157,-62053 }, { 158,-62053 }, { 159,-62053 }, { 160,-62053 }, + { 161,-62053 }, { 162,-62053 }, { 163,-62053 }, { 164,-62053 }, { 165,-62053 }, + { 166,-62053 }, { 167,-62053 }, { 168,-62053 }, { 169,-62053 }, { 170,-62053 }, + { 171,-62053 }, { 172,-62053 }, { 173,-62053 }, { 174,-62053 }, { 175,-62053 }, + { 176,-62053 }, { 177,-62053 }, { 178,-62053 }, { 179,-62053 }, { 180,-62053 }, + + { 181,-62053 }, { 182,-62053 }, { 183,-62053 }, { 184,-62053 }, { 185,-62053 }, + { 186,-62053 }, { 187,-62053 }, { 188,-62053 }, { 189,-62053 }, { 190,-62053 }, + { 191,-62053 }, { 192,-62053 }, { 193,-62053 }, { 194,-62053 }, { 195,-62053 }, + { 196,-62053 }, { 197,-62053 }, { 198,-62053 }, { 199,-62053 }, { 200,-62053 }, + { 201,-62053 }, { 202,-62053 }, { 203,-62053 }, { 204,-62053 }, { 205,-62053 }, + { 206,-62053 }, { 207,-62053 }, { 208,-62053 }, { 209,-62053 }, { 210,-62053 }, + { 211,-62053 }, { 212,-62053 }, { 213,-62053 }, { 214,-62053 }, { 215,-62053 }, + { 216,-62053 }, { 217,-62053 }, { 218,-62053 }, { 219,-62053 }, { 220,-62053 }, + { 221,-62053 }, { 222,-62053 }, { 223,-62053 }, { 224,-62053 }, { 225,-62053 }, + { 226,-62053 }, { 227,-62053 }, { 228,-62053 }, { 229,-62053 }, { 230,-62053 }, + + { 231,-62053 }, { 232,-62053 }, { 233,-62053 }, { 234,-62053 }, { 235,-62053 }, + { 236,-62053 }, { 237,-62053 }, { 238,-62053 }, { 239,-62053 }, { 240,-62053 }, + { 241,-62053 }, { 242,-62053 }, { 243,-62053 }, { 244,-62053 }, { 245,-62053 }, + { 246,-62053 }, { 247,-62053 }, { 248,-62053 }, { 249,-62053 }, { 250,-62053 }, + { 251,-62053 }, { 252,-62053 }, { 253,-62053 }, { 254,-62053 }, { 255,-62053 }, + { 0, 131 }, { 0,29813 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-62310 }, + { 49,-62310 }, { 50,-62310 }, { 51,-62310 }, { 52,-62310 }, { 53,-62310 }, + { 54,-62310 }, { 55,-62310 }, { 56,-62310 }, { 57,-62310 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-62310 }, { 66,-62310 }, { 67,8995 }, { 68,-62310 }, + { 69,-62310 }, { 70,-62310 }, { 71,-62310 }, { 72,-62310 }, { 73,-62310 }, + + { 74,-62310 }, { 75,-62310 }, { 76,-62310 }, { 77,-62310 }, { 78,-62310 }, + { 79,-62310 }, { 80,-62310 }, { 81,-62310 }, { 82,-62310 }, { 83,-62310 }, + { 84,-62310 }, { 85,-62310 }, { 86,-62310 }, { 87,-62310 }, { 88,-62310 }, + { 89,-62310 }, { 90,-62310 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-62310 }, { 0, 0 }, { 97,-62310 }, { 98,-62310 }, + { 99,8995 }, { 100,-62310 }, { 101,-62310 }, { 102,-62310 }, { 103,-62310 }, + { 104,-62310 }, { 105,-62310 }, { 106,-62310 }, { 107,-62310 }, { 108,-62310 }, + { 109,-62310 }, { 110,-62310 }, { 111,-62310 }, { 112,-62310 }, { 113,-62310 }, + { 114,-62310 }, { 115,-62310 }, { 116,-62310 }, { 117,-62310 }, { 118,-62310 }, + { 119,-62310 }, { 120,-62310 }, { 121,-62310 }, { 122,-62310 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-62310 }, { 128,-62310 }, + { 129,-62310 }, { 130,-62310 }, { 131,-62310 }, { 132,-62310 }, { 133,-62310 }, + { 134,-62310 }, { 135,-62310 }, { 136,-62310 }, { 137,-62310 }, { 138,-62310 }, + { 139,-62310 }, { 140,-62310 }, { 141,-62310 }, { 142,-62310 }, { 143,-62310 }, + { 144,-62310 }, { 145,-62310 }, { 146,-62310 }, { 147,-62310 }, { 148,-62310 }, + { 149,-62310 }, { 150,-62310 }, { 151,-62310 }, { 152,-62310 }, { 153,-62310 }, + { 154,-62310 }, { 155,-62310 }, { 156,-62310 }, { 157,-62310 }, { 158,-62310 }, + { 159,-62310 }, { 160,-62310 }, { 161,-62310 }, { 162,-62310 }, { 163,-62310 }, + { 164,-62310 }, { 165,-62310 }, { 166,-62310 }, { 167,-62310 }, { 168,-62310 }, + { 169,-62310 }, { 170,-62310 }, { 171,-62310 }, { 172,-62310 }, { 173,-62310 }, + + { 174,-62310 }, { 175,-62310 }, { 176,-62310 }, { 177,-62310 }, { 178,-62310 }, + { 179,-62310 }, { 180,-62310 }, { 181,-62310 }, { 182,-62310 }, { 183,-62310 }, + { 184,-62310 }, { 185,-62310 }, { 186,-62310 }, { 187,-62310 }, { 188,-62310 }, + { 189,-62310 }, { 190,-62310 }, { 191,-62310 }, { 192,-62310 }, { 193,-62310 }, + { 194,-62310 }, { 195,-62310 }, { 196,-62310 }, { 197,-62310 }, { 198,-62310 }, + { 199,-62310 }, { 200,-62310 }, { 201,-62310 }, { 202,-62310 }, { 203,-62310 }, + { 204,-62310 }, { 205,-62310 }, { 206,-62310 }, { 207,-62310 }, { 208,-62310 }, + { 209,-62310 }, { 210,-62310 }, { 211,-62310 }, { 212,-62310 }, { 213,-62310 }, + { 214,-62310 }, { 215,-62310 }, { 216,-62310 }, { 217,-62310 }, { 218,-62310 }, + { 219,-62310 }, { 220,-62310 }, { 221,-62310 }, { 222,-62310 }, { 223,-62310 }, + + { 224,-62310 }, { 225,-62310 }, { 226,-62310 }, { 227,-62310 }, { 228,-62310 }, + { 229,-62310 }, { 230,-62310 }, { 231,-62310 }, { 232,-62310 }, { 233,-62310 }, + { 234,-62310 }, { 235,-62310 }, { 236,-62310 }, { 237,-62310 }, { 238,-62310 }, + { 239,-62310 }, { 240,-62310 }, { 241,-62310 }, { 242,-62310 }, { 243,-62310 }, + { 244,-62310 }, { 245,-62310 }, { 246,-62310 }, { 247,-62310 }, { 248,-62310 }, + { 249,-62310 }, { 250,-62310 }, { 251,-62310 }, { 252,-62310 }, { 253,-62310 }, + { 254,-62310 }, { 255,-62310 }, { 0, 131 }, { 0,29556 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-62567 }, { 49,-62567 }, { 50,-62567 }, { 51,-62567 }, + { 52,-62567 }, { 53,-62567 }, { 54,-62567 }, { 55,-62567 }, { 56,-62567 }, + { 57,-62567 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-62567 }, { 66,-62567 }, + + { 67,-62567 }, { 68,8995 }, { 69,-62567 }, { 70,-62567 }, { 71,-62567 }, + { 72,-62567 }, { 73,-62567 }, { 74,-62567 }, { 75,-62567 }, { 76,-62567 }, + { 77,-62567 }, { 78,-62567 }, { 79,-62567 }, { 80,-62567 }, { 81,-62567 }, + { 82,-62567 }, { 83,-62567 }, { 84,-62567 }, { 85,-62567 }, { 86,-62567 }, + { 87,-62567 }, { 88,-62567 }, { 89,-62567 }, { 90,-62567 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-62567 }, { 0, 0 }, + { 97,-62567 }, { 98,-62567 }, { 99,-62567 }, { 100,8995 }, { 101,-62567 }, + { 102,-62567 }, { 103,-62567 }, { 104,-62567 }, { 105,-62567 }, { 106,-62567 }, + { 107,-62567 }, { 108,-62567 }, { 109,-62567 }, { 110,-62567 }, { 111,-62567 }, + { 112,-62567 }, { 113,-62567 }, { 114,-62567 }, { 115,-62567 }, { 116,-62567 }, + + { 117,-62567 }, { 118,-62567 }, { 119,-62567 }, { 120,-62567 }, { 121,-62567 }, + { 122,-62567 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-62567 }, { 128,-62567 }, { 129,-62567 }, { 130,-62567 }, { 131,-62567 }, + { 132,-62567 }, { 133,-62567 }, { 134,-62567 }, { 135,-62567 }, { 136,-62567 }, + { 137,-62567 }, { 138,-62567 }, { 139,-62567 }, { 140,-62567 }, { 141,-62567 }, + { 142,-62567 }, { 143,-62567 }, { 144,-62567 }, { 145,-62567 }, { 146,-62567 }, + { 147,-62567 }, { 148,-62567 }, { 149,-62567 }, { 150,-62567 }, { 151,-62567 }, + { 152,-62567 }, { 153,-62567 }, { 154,-62567 }, { 155,-62567 }, { 156,-62567 }, + { 157,-62567 }, { 158,-62567 }, { 159,-62567 }, { 160,-62567 }, { 161,-62567 }, + { 162,-62567 }, { 163,-62567 }, { 164,-62567 }, { 165,-62567 }, { 166,-62567 }, + + { 167,-62567 }, { 168,-62567 }, { 169,-62567 }, { 170,-62567 }, { 171,-62567 }, + { 172,-62567 }, { 173,-62567 }, { 174,-62567 }, { 175,-62567 }, { 176,-62567 }, + { 177,-62567 }, { 178,-62567 }, { 179,-62567 }, { 180,-62567 }, { 181,-62567 }, + { 182,-62567 }, { 183,-62567 }, { 184,-62567 }, { 185,-62567 }, { 186,-62567 }, + { 187,-62567 }, { 188,-62567 }, { 189,-62567 }, { 190,-62567 }, { 191,-62567 }, + { 192,-62567 }, { 193,-62567 }, { 194,-62567 }, { 195,-62567 }, { 196,-62567 }, + { 197,-62567 }, { 198,-62567 }, { 199,-62567 }, { 200,-62567 }, { 201,-62567 }, + { 202,-62567 }, { 203,-62567 }, { 204,-62567 }, { 205,-62567 }, { 206,-62567 }, + { 207,-62567 }, { 208,-62567 }, { 209,-62567 }, { 210,-62567 }, { 211,-62567 }, + { 212,-62567 }, { 213,-62567 }, { 214,-62567 }, { 215,-62567 }, { 216,-62567 }, + + { 217,-62567 }, { 218,-62567 }, { 219,-62567 }, { 220,-62567 }, { 221,-62567 }, + { 222,-62567 }, { 223,-62567 }, { 224,-62567 }, { 225,-62567 }, { 226,-62567 }, + { 227,-62567 }, { 228,-62567 }, { 229,-62567 }, { 230,-62567 }, { 231,-62567 }, + { 232,-62567 }, { 233,-62567 }, { 234,-62567 }, { 235,-62567 }, { 236,-62567 }, + { 237,-62567 }, { 238,-62567 }, { 239,-62567 }, { 240,-62567 }, { 241,-62567 }, + { 242,-62567 }, { 243,-62567 }, { 244,-62567 }, { 245,-62567 }, { 246,-62567 }, + { 247,-62567 }, { 248,-62567 }, { 249,-62567 }, { 250,-62567 }, { 251,-62567 }, + { 252,-62567 }, { 253,-62567 }, { 254,-62567 }, { 255,-62567 }, { 0, 131 }, + { 0,29299 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-62824 }, { 49,-62824 }, + { 50,-62824 }, { 51,-62824 }, { 52,-62824 }, { 53,-62824 }, { 54,-62824 }, + { 55,-62824 }, { 56,-62824 }, { 57,-62824 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,8995 }, { 66,-62824 }, { 67,-62824 }, { 68,-62824 }, { 69,-62824 }, + { 70,-62824 }, { 71,-62824 }, { 72,-62824 }, { 73,-62824 }, { 74,-62824 }, + { 75,-62824 }, { 76,-62824 }, { 77,-62824 }, { 78,-62824 }, { 79,-62824 }, + { 80,-62824 }, { 81,-62824 }, { 82,-62824 }, { 83,-62824 }, { 84,-62824 }, + { 85,-62824 }, { 86,-62824 }, { 87,-62824 }, { 88,-62824 }, { 89,-62824 }, + { 90,-62824 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-62824 }, { 0, 0 }, { 97,8995 }, { 98,-62824 }, { 99,-62824 }, + { 100,-62824 }, { 101,-62824 }, { 102,-62824 }, { 103,-62824 }, { 104,-62824 }, + { 105,-62824 }, { 106,-62824 }, { 107,-62824 }, { 108,-62824 }, { 109,-62824 }, + + { 110,-62824 }, { 111,-62824 }, { 112,-62824 }, { 113,-62824 }, { 114,-62824 }, + { 115,-62824 }, { 116,-62824 }, { 117,-62824 }, { 118,-62824 }, { 119,-62824 }, + { 120,-62824 }, { 121,-62824 }, { 122,-62824 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-62824 }, { 128,-62824 }, { 129,-62824 }, + { 130,-62824 }, { 131,-62824 }, { 132,-62824 }, { 133,-62824 }, { 134,-62824 }, + { 135,-62824 }, { 136,-62824 }, { 137,-62824 }, { 138,-62824 }, { 139,-62824 }, + { 140,-62824 }, { 141,-62824 }, { 142,-62824 }, { 143,-62824 }, { 144,-62824 }, + { 145,-62824 }, { 146,-62824 }, { 147,-62824 }, { 148,-62824 }, { 149,-62824 }, + { 150,-62824 }, { 151,-62824 }, { 152,-62824 }, { 153,-62824 }, { 154,-62824 }, + { 155,-62824 }, { 156,-62824 }, { 157,-62824 }, { 158,-62824 }, { 159,-62824 }, + + { 160,-62824 }, { 161,-62824 }, { 162,-62824 }, { 163,-62824 }, { 164,-62824 }, + { 165,-62824 }, { 166,-62824 }, { 167,-62824 }, { 168,-62824 }, { 169,-62824 }, + { 170,-62824 }, { 171,-62824 }, { 172,-62824 }, { 173,-62824 }, { 174,-62824 }, + { 175,-62824 }, { 176,-62824 }, { 177,-62824 }, { 178,-62824 }, { 179,-62824 }, + { 180,-62824 }, { 181,-62824 }, { 182,-62824 }, { 183,-62824 }, { 184,-62824 }, + { 185,-62824 }, { 186,-62824 }, { 187,-62824 }, { 188,-62824 }, { 189,-62824 }, + { 190,-62824 }, { 191,-62824 }, { 192,-62824 }, { 193,-62824 }, { 194,-62824 }, + { 195,-62824 }, { 196,-62824 }, { 197,-62824 }, { 198,-62824 }, { 199,-62824 }, + { 200,-62824 }, { 201,-62824 }, { 202,-62824 }, { 203,-62824 }, { 204,-62824 }, + { 205,-62824 }, { 206,-62824 }, { 207,-62824 }, { 208,-62824 }, { 209,-62824 }, + + { 210,-62824 }, { 211,-62824 }, { 212,-62824 }, { 213,-62824 }, { 214,-62824 }, + { 215,-62824 }, { 216,-62824 }, { 217,-62824 }, { 218,-62824 }, { 219,-62824 }, + { 220,-62824 }, { 221,-62824 }, { 222,-62824 }, { 223,-62824 }, { 224,-62824 }, + { 225,-62824 }, { 226,-62824 }, { 227,-62824 }, { 228,-62824 }, { 229,-62824 }, + { 230,-62824 }, { 231,-62824 }, { 232,-62824 }, { 233,-62824 }, { 234,-62824 }, + { 235,-62824 }, { 236,-62824 }, { 237,-62824 }, { 238,-62824 }, { 239,-62824 }, + { 240,-62824 }, { 241,-62824 }, { 242,-62824 }, { 243,-62824 }, { 244,-62824 }, + { 245,-62824 }, { 246,-62824 }, { 247,-62824 }, { 248,-62824 }, { 249,-62824 }, + { 250,-62824 }, { 251,-62824 }, { 252,-62824 }, { 253,-62824 }, { 254,-62824 }, + { 255,-62824 }, { 0, 131 }, { 0,29042 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-63081 }, { 49,-63081 }, { 50,-63081 }, { 51,-63081 }, { 52,-63081 }, + + { 53,-63081 }, { 54,-63081 }, { 55,-63081 }, { 56,-63081 }, { 57,-63081 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,8995 }, { 66,-63081 }, { 67,-63081 }, + { 68,-63081 }, { 69,-63081 }, { 70,-63081 }, { 71,-63081 }, { 72,-63081 }, + { 73,-63081 }, { 74,-63081 }, { 75,-63081 }, { 76,-63081 }, { 77,-63081 }, + { 78,-63081 }, { 79,-63081 }, { 80,-63081 }, { 81,-63081 }, { 82,-63081 }, + { 83,-63081 }, { 84,-63081 }, { 85,-63081 }, { 86,-63081 }, { 87,-63081 }, + { 88,-63081 }, { 89,-63081 }, { 90,-63081 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-63081 }, { 0, 0 }, { 97,8995 }, + { 98,-63081 }, { 99,-63081 }, { 100,-63081 }, { 101,-63081 }, { 102,-63081 }, + + { 103,-63081 }, { 104,-63081 }, { 105,-63081 }, { 106,-63081 }, { 107,-63081 }, + { 108,-63081 }, { 109,-63081 }, { 110,-63081 }, { 111,-63081 }, { 112,-63081 }, + { 113,-63081 }, { 114,-63081 }, { 115,-63081 }, { 116,-63081 }, { 117,-63081 }, + { 118,-63081 }, { 119,-63081 }, { 120,-63081 }, { 121,-63081 }, { 122,-63081 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-63081 }, + { 128,-63081 }, { 129,-63081 }, { 130,-63081 }, { 131,-63081 }, { 132,-63081 }, + { 133,-63081 }, { 134,-63081 }, { 135,-63081 }, { 136,-63081 }, { 137,-63081 }, + { 138,-63081 }, { 139,-63081 }, { 140,-63081 }, { 141,-63081 }, { 142,-63081 }, + { 143,-63081 }, { 144,-63081 }, { 145,-63081 }, { 146,-63081 }, { 147,-63081 }, + { 148,-63081 }, { 149,-63081 }, { 150,-63081 }, { 151,-63081 }, { 152,-63081 }, + + { 153,-63081 }, { 154,-63081 }, { 155,-63081 }, { 156,-63081 }, { 157,-63081 }, + { 158,-63081 }, { 159,-63081 }, { 160,-63081 }, { 161,-63081 }, { 162,-63081 }, + { 163,-63081 }, { 164,-63081 }, { 165,-63081 }, { 166,-63081 }, { 167,-63081 }, + { 168,-63081 }, { 169,-63081 }, { 170,-63081 }, { 171,-63081 }, { 172,-63081 }, + { 173,-63081 }, { 174,-63081 }, { 175,-63081 }, { 176,-63081 }, { 177,-63081 }, + { 178,-63081 }, { 179,-63081 }, { 180,-63081 }, { 181,-63081 }, { 182,-63081 }, + { 183,-63081 }, { 184,-63081 }, { 185,-63081 }, { 186,-63081 }, { 187,-63081 }, + { 188,-63081 }, { 189,-63081 }, { 190,-63081 }, { 191,-63081 }, { 192,-63081 }, + { 193,-63081 }, { 194,-63081 }, { 195,-63081 }, { 196,-63081 }, { 197,-63081 }, + { 198,-63081 }, { 199,-63081 }, { 200,-63081 }, { 201,-63081 }, { 202,-63081 }, + + { 203,-63081 }, { 204,-63081 }, { 205,-63081 }, { 206,-63081 }, { 207,-63081 }, + { 208,-63081 }, { 209,-63081 }, { 210,-63081 }, { 211,-63081 }, { 212,-63081 }, + { 213,-63081 }, { 214,-63081 }, { 215,-63081 }, { 216,-63081 }, { 217,-63081 }, + { 218,-63081 }, { 219,-63081 }, { 220,-63081 }, { 221,-63081 }, { 222,-63081 }, + { 223,-63081 }, { 224,-63081 }, { 225,-63081 }, { 226,-63081 }, { 227,-63081 }, + { 228,-63081 }, { 229,-63081 }, { 230,-63081 }, { 231,-63081 }, { 232,-63081 }, + { 233,-63081 }, { 234,-63081 }, { 235,-63081 }, { 236,-63081 }, { 237,-63081 }, + { 238,-63081 }, { 239,-63081 }, { 240,-63081 }, { 241,-63081 }, { 242,-63081 }, + { 243,-63081 }, { 244,-63081 }, { 245,-63081 }, { 246,-63081 }, { 247,-63081 }, + { 248,-63081 }, { 249,-63081 }, { 250,-63081 }, { 251,-63081 }, { 252,-63081 }, + + { 253,-63081 }, { 254,-63081 }, { 255,-63081 }, { 0, 131 }, { 0,28785 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 48,-63338 }, { 49,-63338 }, { 50,-63338 }, + { 51,-63338 }, { 52,-63338 }, { 53,-63338 }, { 54,-63338 }, { 55,-63338 }, + { 56,-63338 }, { 57,-63338 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-63338 }, + { 66,-63338 }, { 67,-63338 }, { 68,-63338 }, { 69,8995 }, { 70,-63338 }, + { 71,-63338 }, { 72,-63338 }, { 73,-63338 }, { 74,-63338 }, { 75,-63338 }, + { 76,-63338 }, { 77,-63338 }, { 78,-63338 }, { 79,-63338 }, { 80,-63338 }, + { 81,-63338 }, { 82,-63338 }, { 83,-63338 }, { 84,-63338 }, { 85,-63338 }, + { 86,-63338 }, { 87,-63338 }, { 88,-63338 }, { 89,-63338 }, { 90,-63338 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-63338 }, + + { 0, 0 }, { 97,-63338 }, { 98,-63338 }, { 99,-63338 }, { 100,-63338 }, + { 101,8995 }, { 102,-63338 }, { 103,-63338 }, { 104,-63338 }, { 105,-63338 }, + { 106,-63338 }, { 107,-63338 }, { 108,-63338 }, { 109,-63338 }, { 110,-63338 }, + { 111,-63338 }, { 112,-63338 }, { 113,-63338 }, { 114,-63338 }, { 115,-63338 }, + { 116,-63338 }, { 117,-63338 }, { 118,-63338 }, { 119,-63338 }, { 120,-63338 }, + { 121,-63338 }, { 122,-63338 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-63338 }, { 128,-63338 }, { 129,-63338 }, { 130,-63338 }, + { 131,-63338 }, { 132,-63338 }, { 133,-63338 }, { 134,-63338 }, { 135,-63338 }, + { 136,-63338 }, { 137,-63338 }, { 138,-63338 }, { 139,-63338 }, { 140,-63338 }, + { 141,-63338 }, { 142,-63338 }, { 143,-63338 }, { 144,-63338 }, { 145,-63338 }, + + { 146,-63338 }, { 147,-63338 }, { 148,-63338 }, { 149,-63338 }, { 150,-63338 }, + { 151,-63338 }, { 152,-63338 }, { 153,-63338 }, { 154,-63338 }, { 155,-63338 }, + { 156,-63338 }, { 157,-63338 }, { 158,-63338 }, { 159,-63338 }, { 160,-63338 }, + { 161,-63338 }, { 162,-63338 }, { 163,-63338 }, { 164,-63338 }, { 165,-63338 }, + { 166,-63338 }, { 167,-63338 }, { 168,-63338 }, { 169,-63338 }, { 170,-63338 }, + { 171,-63338 }, { 172,-63338 }, { 173,-63338 }, { 174,-63338 }, { 175,-63338 }, + { 176,-63338 }, { 177,-63338 }, { 178,-63338 }, { 179,-63338 }, { 180,-63338 }, + { 181,-63338 }, { 182,-63338 }, { 183,-63338 }, { 184,-63338 }, { 185,-63338 }, + { 186,-63338 }, { 187,-63338 }, { 188,-63338 }, { 189,-63338 }, { 190,-63338 }, + { 191,-63338 }, { 192,-63338 }, { 193,-63338 }, { 194,-63338 }, { 195,-63338 }, + + { 196,-63338 }, { 197,-63338 }, { 198,-63338 }, { 199,-63338 }, { 200,-63338 }, + { 201,-63338 }, { 202,-63338 }, { 203,-63338 }, { 204,-63338 }, { 205,-63338 }, + { 206,-63338 }, { 207,-63338 }, { 208,-63338 }, { 209,-63338 }, { 210,-63338 }, + { 211,-63338 }, { 212,-63338 }, { 213,-63338 }, { 214,-63338 }, { 215,-63338 }, + { 216,-63338 }, { 217,-63338 }, { 218,-63338 }, { 219,-63338 }, { 220,-63338 }, + { 221,-63338 }, { 222,-63338 }, { 223,-63338 }, { 224,-63338 }, { 225,-63338 }, + { 226,-63338 }, { 227,-63338 }, { 228,-63338 }, { 229,-63338 }, { 230,-63338 }, + { 231,-63338 }, { 232,-63338 }, { 233,-63338 }, { 234,-63338 }, { 235,-63338 }, + { 236,-63338 }, { 237,-63338 }, { 238,-63338 }, { 239,-63338 }, { 240,-63338 }, + { 241,-63338 }, { 242,-63338 }, { 243,-63338 }, { 244,-63338 }, { 245,-63338 }, + + { 246,-63338 }, { 247,-63338 }, { 248,-63338 }, { 249,-63338 }, { 250,-63338 }, + { 251,-63338 }, { 252,-63338 }, { 253,-63338 }, { 254,-63338 }, { 255,-63338 }, + { 0, 131 }, { 0,28528 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-63595 }, + { 49,-63595 }, { 50,-63595 }, { 51,-63595 }, { 52,-63595 }, { 53,-63595 }, + { 54,-63595 }, { 55,-63595 }, { 56,-63595 }, { 57,-63595 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-63595 }, { 66,-63595 }, { 67,-63595 }, { 68,-63595 }, + { 69,-63595 }, { 70,-63595 }, { 71,-63595 }, { 72,-63595 }, { 73,-63595 }, + { 74,-63595 }, { 75,-63595 }, { 76,-63595 }, { 77,-63595 }, { 78,-63595 }, + { 79,-63595 }, { 80,-63595 }, { 81,-63595 }, { 82,-63595 }, { 83,-63595 }, + { 84,8995 }, { 85,-63595 }, { 86,-63595 }, { 87,-63595 }, { 88,-63595 }, + + { 89,-63595 }, { 90,-63595 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-63595 }, { 0, 0 }, { 97,-63595 }, { 98,-63595 }, + { 99,-63595 }, { 100,-63595 }, { 101,-63595 }, { 102,-63595 }, { 103,-63595 }, + { 104,-63595 }, { 105,-63595 }, { 106,-63595 }, { 107,-63595 }, { 108,-63595 }, + { 109,-63595 }, { 110,-63595 }, { 111,-63595 }, { 112,-63595 }, { 113,-63595 }, + { 114,-63595 }, { 115,-63595 }, { 116,8995 }, { 117,-63595 }, { 118,-63595 }, + { 119,-63595 }, { 120,-63595 }, { 121,-63595 }, { 122,-63595 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-63595 }, { 128,-63595 }, + { 129,-63595 }, { 130,-63595 }, { 131,-63595 }, { 132,-63595 }, { 133,-63595 }, + { 134,-63595 }, { 135,-63595 }, { 136,-63595 }, { 137,-63595 }, { 138,-63595 }, + + { 139,-63595 }, { 140,-63595 }, { 141,-63595 }, { 142,-63595 }, { 143,-63595 }, + { 144,-63595 }, { 145,-63595 }, { 146,-63595 }, { 147,-63595 }, { 148,-63595 }, + { 149,-63595 }, { 150,-63595 }, { 151,-63595 }, { 152,-63595 }, { 153,-63595 }, + { 154,-63595 }, { 155,-63595 }, { 156,-63595 }, { 157,-63595 }, { 158,-63595 }, + { 159,-63595 }, { 160,-63595 }, { 161,-63595 }, { 162,-63595 }, { 163,-63595 }, + { 164,-63595 }, { 165,-63595 }, { 166,-63595 }, { 167,-63595 }, { 168,-63595 }, + { 169,-63595 }, { 170,-63595 }, { 171,-63595 }, { 172,-63595 }, { 173,-63595 }, + { 174,-63595 }, { 175,-63595 }, { 176,-63595 }, { 177,-63595 }, { 178,-63595 }, + { 179,-63595 }, { 180,-63595 }, { 181,-63595 }, { 182,-63595 }, { 183,-63595 }, + { 184,-63595 }, { 185,-63595 }, { 186,-63595 }, { 187,-63595 }, { 188,-63595 }, + + { 189,-63595 }, { 190,-63595 }, { 191,-63595 }, { 192,-63595 }, { 193,-63595 }, + { 194,-63595 }, { 195,-63595 }, { 196,-63595 }, { 197,-63595 }, { 198,-63595 }, + { 199,-63595 }, { 200,-63595 }, { 201,-63595 }, { 202,-63595 }, { 203,-63595 }, + { 204,-63595 }, { 205,-63595 }, { 206,-63595 }, { 207,-63595 }, { 208,-63595 }, + { 209,-63595 }, { 210,-63595 }, { 211,-63595 }, { 212,-63595 }, { 213,-63595 }, + { 214,-63595 }, { 215,-63595 }, { 216,-63595 }, { 217,-63595 }, { 218,-63595 }, + { 219,-63595 }, { 220,-63595 }, { 221,-63595 }, { 222,-63595 }, { 223,-63595 }, + { 224,-63595 }, { 225,-63595 }, { 226,-63595 }, { 227,-63595 }, { 228,-63595 }, + { 229,-63595 }, { 230,-63595 }, { 231,-63595 }, { 232,-63595 }, { 233,-63595 }, + { 234,-63595 }, { 235,-63595 }, { 236,-63595 }, { 237,-63595 }, { 238,-63595 }, + + { 239,-63595 }, { 240,-63595 }, { 241,-63595 }, { 242,-63595 }, { 243,-63595 }, + { 244,-63595 }, { 245,-63595 }, { 246,-63595 }, { 247,-63595 }, { 248,-63595 }, + { 249,-63595 }, { 250,-63595 }, { 251,-63595 }, { 252,-63595 }, { 253,-63595 }, + { 254,-63595 }, { 255,-63595 }, { 0, 66 }, { 0,28271 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-63852 }, { 49,-63852 }, { 50,-63852 }, { 51,-63852 }, + { 52,-63852 }, { 53,-63852 }, { 54,-63852 }, { 55,-63852 }, { 56,-63852 }, + { 57,-63852 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-63852 }, { 66,-63852 }, + { 67,-63852 }, { 68,-63852 }, { 69,-63852 }, { 70,-63852 }, { 71,-63852 }, + { 72,-63852 }, { 73,-63852 }, { 74,-63852 }, { 75,-63852 }, { 76,-63852 }, + { 77,-63852 }, { 78,-63852 }, { 79,-63852 }, { 80,-63852 }, { 81,-63852 }, + + { 82,-63852 }, { 83,-63852 }, { 84,-63852 }, { 85,-63852 }, { 86,-63852 }, + { 87,-63852 }, { 88,-63852 }, { 89,-63852 }, { 90,-63852 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-63852 }, { 0, 0 }, + { 97,-63852 }, { 98,-63852 }, { 99,-63852 }, { 100,-63852 }, { 101,-63852 }, + { 102,-63852 }, { 103,-63852 }, { 104,-63852 }, { 105,-63852 }, { 106,-63852 }, + { 107,-63852 }, { 108,-63852 }, { 109,-63852 }, { 110,-63852 }, { 111,-63852 }, + { 112,-63852 }, { 113,-63852 }, { 114,-63852 }, { 115,-63852 }, { 116,-63852 }, + { 117,-63852 }, { 118,-63852 }, { 119,-63852 }, { 120,-63852 }, { 121,-63852 }, + { 122,-63852 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-63852 }, { 128,-63852 }, { 129,-63852 }, { 130,-63852 }, { 131,-63852 }, + + { 132,-63852 }, { 133,-63852 }, { 134,-63852 }, { 135,-63852 }, { 136,-63852 }, + { 137,-63852 }, { 138,-63852 }, { 139,-63852 }, { 140,-63852 }, { 141,-63852 }, + { 142,-63852 }, { 143,-63852 }, { 144,-63852 }, { 145,-63852 }, { 146,-63852 }, + { 147,-63852 }, { 148,-63852 }, { 149,-63852 }, { 150,-63852 }, { 151,-63852 }, + { 152,-63852 }, { 153,-63852 }, { 154,-63852 }, { 155,-63852 }, { 156,-63852 }, + { 157,-63852 }, { 158,-63852 }, { 159,-63852 }, { 160,-63852 }, { 161,-63852 }, + { 162,-63852 }, { 163,-63852 }, { 164,-63852 }, { 165,-63852 }, { 166,-63852 }, + { 167,-63852 }, { 168,-63852 }, { 169,-63852 }, { 170,-63852 }, { 171,-63852 }, + { 172,-63852 }, { 173,-63852 }, { 174,-63852 }, { 175,-63852 }, { 176,-63852 }, + { 177,-63852 }, { 178,-63852 }, { 179,-63852 }, { 180,-63852 }, { 181,-63852 }, + + { 182,-63852 }, { 183,-63852 }, { 184,-63852 }, { 185,-63852 }, { 186,-63852 }, + { 187,-63852 }, { 188,-63852 }, { 189,-63852 }, { 190,-63852 }, { 191,-63852 }, + { 192,-63852 }, { 193,-63852 }, { 194,-63852 }, { 195,-63852 }, { 196,-63852 }, + { 197,-63852 }, { 198,-63852 }, { 199,-63852 }, { 200,-63852 }, { 201,-63852 }, + { 202,-63852 }, { 203,-63852 }, { 204,-63852 }, { 205,-63852 }, { 206,-63852 }, + { 207,-63852 }, { 208,-63852 }, { 209,-63852 }, { 210,-63852 }, { 211,-63852 }, + { 212,-63852 }, { 213,-63852 }, { 214,-63852 }, { 215,-63852 }, { 216,-63852 }, + { 217,-63852 }, { 218,-63852 }, { 219,-63852 }, { 220,-63852 }, { 221,-63852 }, + { 222,-63852 }, { 223,-63852 }, { 224,-63852 }, { 225,-63852 }, { 226,-63852 }, + { 227,-63852 }, { 228,-63852 }, { 229,-63852 }, { 230,-63852 }, { 231,-63852 }, + + { 232,-63852 }, { 233,-63852 }, { 234,-63852 }, { 235,-63852 }, { 236,-63852 }, + { 237,-63852 }, { 238,-63852 }, { 239,-63852 }, { 240,-63852 }, { 241,-63852 }, + { 242,-63852 }, { 243,-63852 }, { 244,-63852 }, { 245,-63852 }, { 246,-63852 }, + { 247,-63852 }, { 248,-63852 }, { 249,-63852 }, { 250,-63852 }, { 251,-63852 }, + { 252,-63852 }, { 253,-63852 }, { 254,-63852 }, { 255,-63852 }, { 0, 131 }, + { 0,28014 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-64109 }, { 49,-64109 }, + { 50,-64109 }, { 51,-64109 }, { 52,-64109 }, { 53,-64109 }, { 54,-64109 }, + { 55,-64109 }, { 56,-64109 }, { 57,-64109 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-64109 }, { 66,-64109 }, { 67,-64109 }, { 68,-64109 }, { 69,8738 }, + { 70,-64109 }, { 71,-64109 }, { 72,-64109 }, { 73,-64109 }, { 74,-64109 }, + + { 75,-64109 }, { 76,-64109 }, { 77,-64109 }, { 78,-64109 }, { 79,-64109 }, + { 80,-64109 }, { 81,-64109 }, { 82,-64109 }, { 83,-64109 }, { 84,-64109 }, + { 85,-64109 }, { 86,-64109 }, { 87,-64109 }, { 88,-64109 }, { 89,-64109 }, + { 90,-64109 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-64109 }, { 0, 0 }, { 97,-64109 }, { 98,-64109 }, { 99,-64109 }, + { 100,-64109 }, { 101,8738 }, { 102,-64109 }, { 103,-64109 }, { 104,-64109 }, + { 105,-64109 }, { 106,-64109 }, { 107,-64109 }, { 108,-64109 }, { 109,-64109 }, + { 110,-64109 }, { 111,-64109 }, { 112,-64109 }, { 113,-64109 }, { 114,-64109 }, + { 115,-64109 }, { 116,-64109 }, { 117,-64109 }, { 118,-64109 }, { 119,-64109 }, + { 120,-64109 }, { 121,-64109 }, { 122,-64109 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 127,-64109 }, { 128,-64109 }, { 129,-64109 }, + { 130,-64109 }, { 131,-64109 }, { 132,-64109 }, { 133,-64109 }, { 134,-64109 }, + { 135,-64109 }, { 136,-64109 }, { 137,-64109 }, { 138,-64109 }, { 139,-64109 }, + { 140,-64109 }, { 141,-64109 }, { 142,-64109 }, { 143,-64109 }, { 144,-64109 }, + { 145,-64109 }, { 146,-64109 }, { 147,-64109 }, { 148,-64109 }, { 149,-64109 }, + { 150,-64109 }, { 151,-64109 }, { 152,-64109 }, { 153,-64109 }, { 154,-64109 }, + { 155,-64109 }, { 156,-64109 }, { 157,-64109 }, { 158,-64109 }, { 159,-64109 }, + { 160,-64109 }, { 161,-64109 }, { 162,-64109 }, { 163,-64109 }, { 164,-64109 }, + { 165,-64109 }, { 166,-64109 }, { 167,-64109 }, { 168,-64109 }, { 169,-64109 }, + { 170,-64109 }, { 171,-64109 }, { 172,-64109 }, { 173,-64109 }, { 174,-64109 }, + + { 175,-64109 }, { 176,-64109 }, { 177,-64109 }, { 178,-64109 }, { 179,-64109 }, + { 180,-64109 }, { 181,-64109 }, { 182,-64109 }, { 183,-64109 }, { 184,-64109 }, + { 185,-64109 }, { 186,-64109 }, { 187,-64109 }, { 188,-64109 }, { 189,-64109 }, + { 190,-64109 }, { 191,-64109 }, { 192,-64109 }, { 193,-64109 }, { 194,-64109 }, + { 195,-64109 }, { 196,-64109 }, { 197,-64109 }, { 198,-64109 }, { 199,-64109 }, + { 200,-64109 }, { 201,-64109 }, { 202,-64109 }, { 203,-64109 }, { 204,-64109 }, + { 205,-64109 }, { 206,-64109 }, { 207,-64109 }, { 208,-64109 }, { 209,-64109 }, + { 210,-64109 }, { 211,-64109 }, { 212,-64109 }, { 213,-64109 }, { 214,-64109 }, + { 215,-64109 }, { 216,-64109 }, { 217,-64109 }, { 218,-64109 }, { 219,-64109 }, + { 220,-64109 }, { 221,-64109 }, { 222,-64109 }, { 223,-64109 }, { 224,-64109 }, + + { 225,-64109 }, { 226,-64109 }, { 227,-64109 }, { 228,-64109 }, { 229,-64109 }, + { 230,-64109 }, { 231,-64109 }, { 232,-64109 }, { 233,-64109 }, { 234,-64109 }, + { 235,-64109 }, { 236,-64109 }, { 237,-64109 }, { 238,-64109 }, { 239,-64109 }, + { 240,-64109 }, { 241,-64109 }, { 242,-64109 }, { 243,-64109 }, { 244,-64109 }, + { 245,-64109 }, { 246,-64109 }, { 247,-64109 }, { 248,-64109 }, { 249,-64109 }, + { 250,-64109 }, { 251,-64109 }, { 252,-64109 }, { 253,-64109 }, { 254,-64109 }, + { 255,-64109 }, { 0, 55 }, { 0,27757 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-64366 }, { 49,-64366 }, { 50,-64366 }, { 51,-64366 }, { 52,-64366 }, + { 53,-64366 }, { 54,-64366 }, { 55,-64366 }, { 56,-64366 }, { 57,-64366 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-64366 }, { 66,-64366 }, { 67,-64366 }, + + { 68,-64366 }, { 69,-64366 }, { 70,-64366 }, { 71,-64366 }, { 72,-64366 }, + { 73,-64366 }, { 74,-64366 }, { 75,-64366 }, { 76,-64366 }, { 77,-64366 }, + { 78,-64366 }, { 79,-64366 }, { 80,-64366 }, { 81,-64366 }, { 82,-64366 }, + { 83,-64366 }, { 84,-64366 }, { 85,-64366 }, { 86,-64366 }, { 87,-64366 }, + { 88,-64366 }, { 89,-64366 }, { 90,-64366 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-64366 }, { 0, 0 }, { 97,-64366 }, + { 98,-64366 }, { 99,-64366 }, { 100,-64366 }, { 101,-64366 }, { 102,-64366 }, + { 103,-64366 }, { 104,-64366 }, { 105,-64366 }, { 106,-64366 }, { 107,-64366 }, + { 108,-64366 }, { 109,-64366 }, { 110,-64366 }, { 111,-64366 }, { 112,-64366 }, + { 113,-64366 }, { 114,-64366 }, { 115,-64366 }, { 116,-64366 }, { 117,-64366 }, + + { 118,-64366 }, { 119,-64366 }, { 120,-64366 }, { 121,-64366 }, { 122,-64366 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-64366 }, + { 128,-64366 }, { 129,-64366 }, { 130,-64366 }, { 131,-64366 }, { 132,-64366 }, + { 133,-64366 }, { 134,-64366 }, { 135,-64366 }, { 136,-64366 }, { 137,-64366 }, + { 138,-64366 }, { 139,-64366 }, { 140,-64366 }, { 141,-64366 }, { 142,-64366 }, + { 143,-64366 }, { 144,-64366 }, { 145,-64366 }, { 146,-64366 }, { 147,-64366 }, + { 148,-64366 }, { 149,-64366 }, { 150,-64366 }, { 151,-64366 }, { 152,-64366 }, + { 153,-64366 }, { 154,-64366 }, { 155,-64366 }, { 156,-64366 }, { 157,-64366 }, + { 158,-64366 }, { 159,-64366 }, { 160,-64366 }, { 161,-64366 }, { 162,-64366 }, + { 163,-64366 }, { 164,-64366 }, { 165,-64366 }, { 166,-64366 }, { 167,-64366 }, + + { 168,-64366 }, { 169,-64366 }, { 170,-64366 }, { 171,-64366 }, { 172,-64366 }, + { 173,-64366 }, { 174,-64366 }, { 175,-64366 }, { 176,-64366 }, { 177,-64366 }, + { 178,-64366 }, { 179,-64366 }, { 180,-64366 }, { 181,-64366 }, { 182,-64366 }, + { 183,-64366 }, { 184,-64366 }, { 185,-64366 }, { 186,-64366 }, { 187,-64366 }, + { 188,-64366 }, { 189,-64366 }, { 190,-64366 }, { 191,-64366 }, { 192,-64366 }, + { 193,-64366 }, { 194,-64366 }, { 195,-64366 }, { 196,-64366 }, { 197,-64366 }, + { 198,-64366 }, { 199,-64366 }, { 200,-64366 }, { 201,-64366 }, { 202,-64366 }, + { 203,-64366 }, { 204,-64366 }, { 205,-64366 }, { 206,-64366 }, { 207,-64366 }, + { 208,-64366 }, { 209,-64366 }, { 210,-64366 }, { 211,-64366 }, { 212,-64366 }, + { 213,-64366 }, { 214,-64366 }, { 215,-64366 }, { 216,-64366 }, { 217,-64366 }, + + { 218,-64366 }, { 219,-64366 }, { 220,-64366 }, { 221,-64366 }, { 222,-64366 }, + { 223,-64366 }, { 224,-64366 }, { 225,-64366 }, { 226,-64366 }, { 227,-64366 }, + { 228,-64366 }, { 229,-64366 }, { 230,-64366 }, { 231,-64366 }, { 232,-64366 }, + { 233,-64366 }, { 234,-64366 }, { 235,-64366 }, { 236,-64366 }, { 237,-64366 }, + { 238,-64366 }, { 239,-64366 }, { 240,-64366 }, { 241,-64366 }, { 242,-64366 }, + { 243,-64366 }, { 244,-64366 }, { 245,-64366 }, { 246,-64366 }, { 247,-64366 }, + { 248,-64366 }, { 249,-64366 }, { 250,-64366 }, { 251,-64366 }, { 252,-64366 }, + { 253,-64366 }, { 254,-64366 }, { 255,-64366 }, { 0, 61 }, { 0,27500 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-64623 }, { 49,-64623 }, { 50,-64623 }, + { 51,-64623 }, { 52,-64623 }, { 53,-64623 }, { 54,-64623 }, { 55,-64623 }, + { 56,-64623 }, { 57,-64623 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-64623 }, + { 66,-64623 }, { 67,-64623 }, { 68,-64623 }, { 69,-64623 }, { 70,-64623 }, + { 71,-64623 }, { 72,-64623 }, { 73,-64623 }, { 74,-64623 }, { 75,-64623 }, + { 76,-64623 }, { 77,-64623 }, { 78,-64623 }, { 79,-64623 }, { 80,-64623 }, + { 81,-64623 }, { 82,-64623 }, { 83,-64623 }, { 84,-64623 }, { 85,-64623 }, + { 86,-64623 }, { 87,-64623 }, { 88,-64623 }, { 89,-64623 }, { 90,-64623 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-64623 }, + { 0, 0 }, { 97,-64623 }, { 98,-64623 }, { 99,-64623 }, { 100,-64623 }, + { 101,-64623 }, { 102,-64623 }, { 103,-64623 }, { 104,-64623 }, { 105,-64623 }, + { 106,-64623 }, { 107,-64623 }, { 108,-64623 }, { 109,-64623 }, { 110,-64623 }, + + { 111,-64623 }, { 112,-64623 }, { 113,-64623 }, { 114,-64623 }, { 115,-64623 }, + { 116,-64623 }, { 117,-64623 }, { 118,-64623 }, { 119,-64623 }, { 120,-64623 }, + { 121,-64623 }, { 122,-64623 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-64623 }, { 128,-64623 }, { 129,-64623 }, { 130,-64623 }, + { 131,-64623 }, { 132,-64623 }, { 133,-64623 }, { 134,-64623 }, { 135,-64623 }, + { 136,-64623 }, { 137,-64623 }, { 138,-64623 }, { 139,-64623 }, { 140,-64623 }, + { 141,-64623 }, { 142,-64623 }, { 143,-64623 }, { 144,-64623 }, { 145,-64623 }, + { 146,-64623 }, { 147,-64623 }, { 148,-64623 }, { 149,-64623 }, { 150,-64623 }, + { 151,-64623 }, { 152,-64623 }, { 153,-64623 }, { 154,-64623 }, { 155,-64623 }, + { 156,-64623 }, { 157,-64623 }, { 158,-64623 }, { 159,-64623 }, { 160,-64623 }, + + { 161,-64623 }, { 162,-64623 }, { 163,-64623 }, { 164,-64623 }, { 165,-64623 }, + { 166,-64623 }, { 167,-64623 }, { 168,-64623 }, { 169,-64623 }, { 170,-64623 }, + { 171,-64623 }, { 172,-64623 }, { 173,-64623 }, { 174,-64623 }, { 175,-64623 }, + { 176,-64623 }, { 177,-64623 }, { 178,-64623 }, { 179,-64623 }, { 180,-64623 }, + { 181,-64623 }, { 182,-64623 }, { 183,-64623 }, { 184,-64623 }, { 185,-64623 }, + { 186,-64623 }, { 187,-64623 }, { 188,-64623 }, { 189,-64623 }, { 190,-64623 }, + { 191,-64623 }, { 192,-64623 }, { 193,-64623 }, { 194,-64623 }, { 195,-64623 }, + { 196,-64623 }, { 197,-64623 }, { 198,-64623 }, { 199,-64623 }, { 200,-64623 }, + { 201,-64623 }, { 202,-64623 }, { 203,-64623 }, { 204,-64623 }, { 205,-64623 }, + { 206,-64623 }, { 207,-64623 }, { 208,-64623 }, { 209,-64623 }, { 210,-64623 }, + + { 211,-64623 }, { 212,-64623 }, { 213,-64623 }, { 214,-64623 }, { 215,-64623 }, + { 216,-64623 }, { 217,-64623 }, { 218,-64623 }, { 219,-64623 }, { 220,-64623 }, + { 221,-64623 }, { 222,-64623 }, { 223,-64623 }, { 224,-64623 }, { 225,-64623 }, + { 226,-64623 }, { 227,-64623 }, { 228,-64623 }, { 229,-64623 }, { 230,-64623 }, + { 231,-64623 }, { 232,-64623 }, { 233,-64623 }, { 234,-64623 }, { 235,-64623 }, + { 236,-64623 }, { 237,-64623 }, { 238,-64623 }, { 239,-64623 }, { 240,-64623 }, + { 241,-64623 }, { 242,-64623 }, { 243,-64623 }, { 244,-64623 }, { 245,-64623 }, + { 246,-64623 }, { 247,-64623 }, { 248,-64623 }, { 249,-64623 }, { 250,-64623 }, + { 251,-64623 }, { 252,-64623 }, { 253,-64623 }, { 254,-64623 }, { 255,-64623 }, + { 0, 46 }, { 0,27243 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-64880 }, + { 49,-64880 }, { 50,-64880 }, { 51,-64880 }, { 52,-64880 }, { 53,-64880 }, + + { 54,-64880 }, { 55,-64880 }, { 56,-64880 }, { 57,-64880 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-64880 }, { 66,-64880 }, { 67,-64880 }, { 68,-64880 }, + { 69,-64880 }, { 70,-64880 }, { 71,-64880 }, { 72,-64880 }, { 73,-64880 }, + { 74,-64880 }, { 75,-64880 }, { 76,-64880 }, { 77,-64880 }, { 78,-64880 }, + { 79,-64880 }, { 80,-64880 }, { 81,-64880 }, { 82,-64880 }, { 83,-64880 }, + { 84,-64880 }, { 85,-64880 }, { 86,-64880 }, { 87,-64880 }, { 88,-64880 }, + { 89,-64880 }, { 90,-64880 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-64880 }, { 0, 0 }, { 97,-64880 }, { 98,-64880 }, + { 99,-64880 }, { 100,-64880 }, { 101,-64880 }, { 102,-64880 }, { 103,-64880 }, + + { 104,-64880 }, { 105,-64880 }, { 106,-64880 }, { 107,-64880 }, { 108,-64880 }, + { 109,-64880 }, { 110,-64880 }, { 111,-64880 }, { 112,-64880 }, { 113,-64880 }, + { 114,-64880 }, { 115,-64880 }, { 116,-64880 }, { 117,-64880 }, { 118,-64880 }, + { 119,-64880 }, { 120,-64880 }, { 121,-64880 }, { 122,-64880 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-64880 }, { 128,-64880 }, + { 129,-64880 }, { 130,-64880 }, { 131,-64880 }, { 132,-64880 }, { 133,-64880 }, + { 134,-64880 }, { 135,-64880 }, { 136,-64880 }, { 137,-64880 }, { 138,-64880 }, + { 139,-64880 }, { 140,-64880 }, { 141,-64880 }, { 142,-64880 }, { 143,-64880 }, + { 144,-64880 }, { 145,-64880 }, { 146,-64880 }, { 147,-64880 }, { 148,-64880 }, + { 149,-64880 }, { 150,-64880 }, { 151,-64880 }, { 152,-64880 }, { 153,-64880 }, + + { 154,-64880 }, { 155,-64880 }, { 156,-64880 }, { 157,-64880 }, { 158,-64880 }, + { 159,-64880 }, { 160,-64880 }, { 161,-64880 }, { 162,-64880 }, { 163,-64880 }, + { 164,-64880 }, { 165,-64880 }, { 166,-64880 }, { 167,-64880 }, { 168,-64880 }, + { 169,-64880 }, { 170,-64880 }, { 171,-64880 }, { 172,-64880 }, { 173,-64880 }, + { 174,-64880 }, { 175,-64880 }, { 176,-64880 }, { 177,-64880 }, { 178,-64880 }, + { 179,-64880 }, { 180,-64880 }, { 181,-64880 }, { 182,-64880 }, { 183,-64880 }, + { 184,-64880 }, { 185,-64880 }, { 186,-64880 }, { 187,-64880 }, { 188,-64880 }, + { 189,-64880 }, { 190,-64880 }, { 191,-64880 }, { 192,-64880 }, { 193,-64880 }, + { 194,-64880 }, { 195,-64880 }, { 196,-64880 }, { 197,-64880 }, { 198,-64880 }, + { 199,-64880 }, { 200,-64880 }, { 201,-64880 }, { 202,-64880 }, { 203,-64880 }, + + { 204,-64880 }, { 205,-64880 }, { 206,-64880 }, { 207,-64880 }, { 208,-64880 }, + { 209,-64880 }, { 210,-64880 }, { 211,-64880 }, { 212,-64880 }, { 213,-64880 }, + { 214,-64880 }, { 215,-64880 }, { 216,-64880 }, { 217,-64880 }, { 218,-64880 }, + { 219,-64880 }, { 220,-64880 }, { 221,-64880 }, { 222,-64880 }, { 223,-64880 }, + { 224,-64880 }, { 225,-64880 }, { 226,-64880 }, { 227,-64880 }, { 228,-64880 }, + { 229,-64880 }, { 230,-64880 }, { 231,-64880 }, { 232,-64880 }, { 233,-64880 }, + { 234,-64880 }, { 235,-64880 }, { 236,-64880 }, { 237,-64880 }, { 238,-64880 }, + { 239,-64880 }, { 240,-64880 }, { 241,-64880 }, { 242,-64880 }, { 243,-64880 }, + { 244,-64880 }, { 245,-64880 }, { 246,-64880 }, { 247,-64880 }, { 248,-64880 }, + { 249,-64880 }, { 250,-64880 }, { 251,-64880 }, { 252,-64880 }, { 253,-64880 }, + + { 254,-64880 }, { 255,-64880 }, { 0, 131 }, { 0,26986 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 48,-65137 }, { 49,-65137 }, { 50,-65137 }, { 51,-65137 }, + { 52,-65137 }, { 53,-65137 }, { 54,-65137 }, { 55,-65137 }, { 56,-65137 }, + { 57,-65137 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-65137 }, { 66,-65137 }, + { 67,-65137 }, { 68,-65137 }, { 69,-65137 }, { 70,-65137 }, { 71,-65137 }, + { 72,-65137 }, { 73,-65137 }, { 74,-65137 }, { 75,-65137 }, { 76,-65137 }, + { 77,-65137 }, { 78,-65137 }, { 79,-65137 }, { 80,-65137 }, { 81,-65137 }, + { 82,-65137 }, { 83,7967 }, { 84,-65137 }, { 85,-65137 }, { 86,-65137 }, + { 87,-65137 }, { 88,-65137 }, { 89,-65137 }, { 90,-65137 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-65137 }, { 0, 0 }, + + { 97,-65137 }, { 98,-65137 }, { 99,-65137 }, { 100,-65137 }, { 101,-65137 }, + { 102,-65137 }, { 103,-65137 }, { 104,-65137 }, { 105,-65137 }, { 106,-65137 }, + { 107,-65137 }, { 108,-65137 }, { 109,-65137 }, { 110,-65137 }, { 111,-65137 }, + { 112,-65137 }, { 113,-65137 }, { 114,-65137 }, { 115,7967 }, { 116,-65137 }, + { 117,-65137 }, { 118,-65137 }, { 119,-65137 }, { 120,-65137 }, { 121,-65137 }, + { 122,-65137 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-65137 }, { 128,-65137 }, { 129,-65137 }, { 130,-65137 }, { 131,-65137 }, + { 132,-65137 }, { 133,-65137 }, { 134,-65137 }, { 135,-65137 }, { 136,-65137 }, + { 137,-65137 }, { 138,-65137 }, { 139,-65137 }, { 140,-65137 }, { 141,-65137 }, + { 142,-65137 }, { 143,-65137 }, { 144,-65137 }, { 145,-65137 }, { 146,-65137 }, + + { 147,-65137 }, { 148,-65137 }, { 149,-65137 }, { 150,-65137 }, { 151,-65137 }, + { 152,-65137 }, { 153,-65137 }, { 154,-65137 }, { 155,-65137 }, { 156,-65137 }, + { 157,-65137 }, { 158,-65137 }, { 159,-65137 }, { 160,-65137 }, { 161,-65137 }, + { 162,-65137 }, { 163,-65137 }, { 164,-65137 }, { 165,-65137 }, { 166,-65137 }, + { 167,-65137 }, { 168,-65137 }, { 169,-65137 }, { 170,-65137 }, { 171,-65137 }, + { 172,-65137 }, { 173,-65137 }, { 174,-65137 }, { 175,-65137 }, { 176,-65137 }, + { 177,-65137 }, { 178,-65137 }, { 179,-65137 }, { 180,-65137 }, { 181,-65137 }, + { 182,-65137 }, { 183,-65137 }, { 184,-65137 }, { 185,-65137 }, { 186,-65137 }, + { 187,-65137 }, { 188,-65137 }, { 189,-65137 }, { 190,-65137 }, { 191,-65137 }, + { 192,-65137 }, { 193,-65137 }, { 194,-65137 }, { 195,-65137 }, { 196,-65137 }, + + { 197,-65137 }, { 198,-65137 }, { 199,-65137 }, { 200,-65137 }, { 201,-65137 }, + { 202,-65137 }, { 203,-65137 }, { 204,-65137 }, { 205,-65137 }, { 206,-65137 }, + { 207,-65137 }, { 208,-65137 }, { 209,-65137 }, { 210,-65137 }, { 211,-65137 }, + { 212,-65137 }, { 213,-65137 }, { 214,-65137 }, { 215,-65137 }, { 216,-65137 }, + { 217,-65137 }, { 218,-65137 }, { 219,-65137 }, { 220,-65137 }, { 221,-65137 }, + { 222,-65137 }, { 223,-65137 }, { 224,-65137 }, { 225,-65137 }, { 226,-65137 }, + { 227,-65137 }, { 228,-65137 }, { 229,-65137 }, { 230,-65137 }, { 231,-65137 }, + { 232,-65137 }, { 233,-65137 }, { 234,-65137 }, { 235,-65137 }, { 236,-65137 }, + { 237,-65137 }, { 238,-65137 }, { 239,-65137 }, { 240,-65137 }, { 241,-65137 }, + { 242,-65137 }, { 243,-65137 }, { 244,-65137 }, { 245,-65137 }, { 246,-65137 }, + + { 247,-65137 }, { 248,-65137 }, { 249,-65137 }, { 250,-65137 }, { 251,-65137 }, + { 252,-65137 }, { 253,-65137 }, { 254,-65137 }, { 255,-65137 }, { 0, 131 }, + { 0,26729 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-65394 }, { 49,-65394 }, + { 50,-65394 }, { 51,-65394 }, { 52,-65394 }, { 53,-65394 }, { 54,-65394 }, + { 55,-65394 }, { 56,-65394 }, { 57,-65394 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-65394 }, { 66,-65394 }, { 67,-65394 }, { 68,-65394 }, { 69,-65394 }, + { 70,-65394 }, { 71,-65394 }, { 72,-65394 }, { 73,-65394 }, { 74,-65394 }, + { 75,-65394 }, { 76,-65394 }, { 77,-65394 }, { 78,-65394 }, { 79,-65394 }, + { 80,-65394 }, { 81,-65394 }, { 82,-65394 }, { 83,-65394 }, { 84,-65394 }, + { 85,-65394 }, { 86,-65394 }, { 87,-65394 }, { 88,-65394 }, { 89,-65394 }, + + { 90,-65394 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,7967 }, { 0, 0 }, { 97,-65394 }, { 98,-65394 }, { 99,-65394 }, + { 100,-65394 }, { 101,-65394 }, { 102,-65394 }, { 103,-65394 }, { 104,-65394 }, + { 105,-65394 }, { 106,-65394 }, { 107,-65394 }, { 108,-65394 }, { 109,-65394 }, + { 110,-65394 }, { 111,-65394 }, { 112,-65394 }, { 113,-65394 }, { 114,-65394 }, + { 115,-65394 }, { 116,-65394 }, { 117,-65394 }, { 118,-65394 }, { 119,-65394 }, + { 120,-65394 }, { 121,-65394 }, { 122,-65394 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-65394 }, { 128,-65394 }, { 129,-65394 }, + { 130,-65394 }, { 131,-65394 }, { 132,-65394 }, { 133,-65394 }, { 134,-65394 }, + { 135,-65394 }, { 136,-65394 }, { 137,-65394 }, { 138,-65394 }, { 139,-65394 }, + + { 140,-65394 }, { 141,-65394 }, { 142,-65394 }, { 143,-65394 }, { 144,-65394 }, + { 145,-65394 }, { 146,-65394 }, { 147,-65394 }, { 148,-65394 }, { 149,-65394 }, + { 150,-65394 }, { 151,-65394 }, { 152,-65394 }, { 153,-65394 }, { 154,-65394 }, + { 155,-65394 }, { 156,-65394 }, { 157,-65394 }, { 158,-65394 }, { 159,-65394 }, + { 160,-65394 }, { 161,-65394 }, { 162,-65394 }, { 163,-65394 }, { 164,-65394 }, + { 165,-65394 }, { 166,-65394 }, { 167,-65394 }, { 168,-65394 }, { 169,-65394 }, + { 170,-65394 }, { 171,-65394 }, { 172,-65394 }, { 173,-65394 }, { 174,-65394 }, + { 175,-65394 }, { 176,-65394 }, { 177,-65394 }, { 178,-65394 }, { 179,-65394 }, + { 180,-65394 }, { 181,-65394 }, { 182,-65394 }, { 183,-65394 }, { 184,-65394 }, + { 185,-65394 }, { 186,-65394 }, { 187,-65394 }, { 188,-65394 }, { 189,-65394 }, + + { 190,-65394 }, { 191,-65394 }, { 192,-65394 }, { 193,-65394 }, { 194,-65394 }, + { 195,-65394 }, { 196,-65394 }, { 197,-65394 }, { 198,-65394 }, { 199,-65394 }, + { 200,-65394 }, { 201,-65394 }, { 202,-65394 }, { 203,-65394 }, { 204,-65394 }, + { 205,-65394 }, { 206,-65394 }, { 207,-65394 }, { 208,-65394 }, { 209,-65394 }, + { 210,-65394 }, { 211,-65394 }, { 212,-65394 }, { 213,-65394 }, { 214,-65394 }, + { 215,-65394 }, { 216,-65394 }, { 217,-65394 }, { 218,-65394 }, { 219,-65394 }, + { 220,-65394 }, { 221,-65394 }, { 222,-65394 }, { 223,-65394 }, { 224,-65394 }, + { 225,-65394 }, { 226,-65394 }, { 227,-65394 }, { 228,-65394 }, { 229,-65394 }, + { 230,-65394 }, { 231,-65394 }, { 232,-65394 }, { 233,-65394 }, { 234,-65394 }, + { 235,-65394 }, { 236,-65394 }, { 237,-65394 }, { 238,-65394 }, { 239,-65394 }, + + { 240,-65394 }, { 241,-65394 }, { 242,-65394 }, { 243,-65394 }, { 244,-65394 }, + { 245,-65394 }, { 246,-65394 }, { 247,-65394 }, { 248,-65394 }, { 249,-65394 }, + { 250,-65394 }, { 251,-65394 }, { 252,-65394 }, { 253,-65394 }, { 254,-65394 }, + { 255,-65394 }, { 0, 131 }, { 0,26472 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-65651 }, { 49,-65651 }, { 50,-65651 }, { 51,-65651 }, { 52,-65651 }, + { 53,-65651 }, { 54,-65651 }, { 55,-65651 }, { 56,-65651 }, { 57,-65651 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-65651 }, { 66,-65651 }, { 67,-65651 }, + { 68,-65651 }, { 69,-65651 }, { 70,-65651 }, { 71,-65651 }, { 72,-65651 }, + { 73,-65651 }, { 74,-65651 }, { 75,-65651 }, { 76,-65651 }, { 77,-65651 }, + { 78,-65651 }, { 79,-65651 }, { 80,-65651 }, { 81,-65651 }, { 82,-65651 }, + + { 83,-65651 }, { 84,-65651 }, { 85,-65651 }, { 86,-65651 }, { 87,-65651 }, + { 88,-65651 }, { 89,-65651 }, { 90,-65651 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,7967 }, { 0, 0 }, { 97,-65651 }, + { 98,-65651 }, { 99,-65651 }, { 100,-65651 }, { 101,-65651 }, { 102,-65651 }, + { 103,-65651 }, { 104,-65651 }, { 105,-65651 }, { 106,-65651 }, { 107,-65651 }, + { 108,-65651 }, { 109,-65651 }, { 110,-65651 }, { 111,-65651 }, { 112,-65651 }, + { 113,-65651 }, { 114,-65651 }, { 115,-65651 }, { 116,-65651 }, { 117,-65651 }, + { 118,-65651 }, { 119,-65651 }, { 120,-65651 }, { 121,-65651 }, { 122,-65651 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-65651 }, + { 128,-65651 }, { 129,-65651 }, { 130,-65651 }, { 131,-65651 }, { 132,-65651 }, + + { 133,-65651 }, { 134,-65651 }, { 135,-65651 }, { 136,-65651 }, { 137,-65651 }, + { 138,-65651 }, { 139,-65651 }, { 140,-65651 }, { 141,-65651 }, { 142,-65651 }, + { 143,-65651 }, { 144,-65651 }, { 145,-65651 }, { 146,-65651 }, { 147,-65651 }, + { 148,-65651 }, { 149,-65651 }, { 150,-65651 }, { 151,-65651 }, { 152,-65651 }, + { 153,-65651 }, { 154,-65651 }, { 155,-65651 }, { 156,-65651 }, { 157,-65651 }, + { 158,-65651 }, { 159,-65651 }, { 160,-65651 }, { 161,-65651 }, { 162,-65651 }, + { 163,-65651 }, { 164,-65651 }, { 165,-65651 }, { 166,-65651 }, { 167,-65651 }, + { 168,-65651 }, { 169,-65651 }, { 170,-65651 }, { 171,-65651 }, { 172,-65651 }, + { 173,-65651 }, { 174,-65651 }, { 175,-65651 }, { 176,-65651 }, { 177,-65651 }, + { 178,-65651 }, { 179,-65651 }, { 180,-65651 }, { 181,-65651 }, { 182,-65651 }, + + { 183,-65651 }, { 184,-65651 }, { 185,-65651 }, { 186,-65651 }, { 187,-65651 }, + { 188,-65651 }, { 189,-65651 }, { 190,-65651 }, { 191,-65651 }, { 192,-65651 }, + { 193,-65651 }, { 194,-65651 }, { 195,-65651 }, { 196,-65651 }, { 197,-65651 }, + { 198,-65651 }, { 199,-65651 }, { 200,-65651 }, { 201,-65651 }, { 202,-65651 }, + { 203,-65651 }, { 204,-65651 }, { 205,-65651 }, { 206,-65651 }, { 207,-65651 }, + { 208,-65651 }, { 209,-65651 }, { 210,-65651 }, { 211,-65651 }, { 212,-65651 }, + { 213,-65651 }, { 214,-65651 }, { 215,-65651 }, { 216,-65651 }, { 217,-65651 }, + { 218,-65651 }, { 219,-65651 }, { 220,-65651 }, { 221,-65651 }, { 222,-65651 }, + { 223,-65651 }, { 224,-65651 }, { 225,-65651 }, { 226,-65651 }, { 227,-65651 }, + { 228,-65651 }, { 229,-65651 }, { 230,-65651 }, { 231,-65651 }, { 232,-65651 }, + + { 233,-65651 }, { 234,-65651 }, { 235,-65651 }, { 236,-65651 }, { 237,-65651 }, + { 238,-65651 }, { 239,-65651 }, { 240,-65651 }, { 241,-65651 }, { 242,-65651 }, + { 243,-65651 }, { 244,-65651 }, { 245,-65651 }, { 246,-65651 }, { 247,-65651 }, + { 248,-65651 }, { 249,-65651 }, { 250,-65651 }, { 251,-65651 }, { 252,-65651 }, + { 253,-65651 }, { 254,-65651 }, { 255,-65651 }, { 0, 131 }, { 0,26215 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-65908 }, { 49,-65908 }, { 50,-65908 }, + { 51,-65908 }, { 52,-65908 }, { 53,-65908 }, { 54,-65908 }, { 55,-65908 }, + { 56,-65908 }, { 57,-65908 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-65908 }, + { 66,-65908 }, { 67,-65908 }, { 68,-65908 }, { 69,-65908 }, { 70,-65908 }, + { 71,-65908 }, { 72,-65908 }, { 73,-65908 }, { 74,-65908 }, { 75,-65908 }, + + { 76,-65908 }, { 77,-65908 }, { 78,-65908 }, { 79,-65908 }, { 80,-65908 }, + { 81,-65908 }, { 82,-65908 }, { 83,-65908 }, { 84,7967 }, { 85,-65908 }, + { 86,-65908 }, { 87,-65908 }, { 88,-65908 }, { 89,-65908 }, { 90,-65908 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-65908 }, + { 0, 0 }, { 97,-65908 }, { 98,-65908 }, { 99,-65908 }, { 100,-65908 }, + { 101,-65908 }, { 102,-65908 }, { 103,-65908 }, { 104,-65908 }, { 105,-65908 }, + { 106,-65908 }, { 107,-65908 }, { 108,-65908 }, { 109,-65908 }, { 110,-65908 }, + { 111,-65908 }, { 112,-65908 }, { 113,-65908 }, { 114,-65908 }, { 115,-65908 }, + { 116,7967 }, { 117,-65908 }, { 118,-65908 }, { 119,-65908 }, { 120,-65908 }, + { 121,-65908 }, { 122,-65908 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 127,-65908 }, { 128,-65908 }, { 129,-65908 }, { 130,-65908 }, + { 131,-65908 }, { 132,-65908 }, { 133,-65908 }, { 134,-65908 }, { 135,-65908 }, + { 136,-65908 }, { 137,-65908 }, { 138,-65908 }, { 139,-65908 }, { 140,-65908 }, + { 141,-65908 }, { 142,-65908 }, { 143,-65908 }, { 144,-65908 }, { 145,-65908 }, + { 146,-65908 }, { 147,-65908 }, { 148,-65908 }, { 149,-65908 }, { 150,-65908 }, + { 151,-65908 }, { 152,-65908 }, { 153,-65908 }, { 154,-65908 }, { 155,-65908 }, + { 156,-65908 }, { 157,-65908 }, { 158,-65908 }, { 159,-65908 }, { 160,-65908 }, + { 161,-65908 }, { 162,-65908 }, { 163,-65908 }, { 164,-65908 }, { 165,-65908 }, + { 166,-65908 }, { 167,-65908 }, { 168,-65908 }, { 169,-65908 }, { 170,-65908 }, + { 171,-65908 }, { 172,-65908 }, { 173,-65908 }, { 174,-65908 }, { 175,-65908 }, + + { 176,-65908 }, { 177,-65908 }, { 178,-65908 }, { 179,-65908 }, { 180,-65908 }, + { 181,-65908 }, { 182,-65908 }, { 183,-65908 }, { 184,-65908 }, { 185,-65908 }, + { 186,-65908 }, { 187,-65908 }, { 188,-65908 }, { 189,-65908 }, { 190,-65908 }, + { 191,-65908 }, { 192,-65908 }, { 193,-65908 }, { 194,-65908 }, { 195,-65908 }, + { 196,-65908 }, { 197,-65908 }, { 198,-65908 }, { 199,-65908 }, { 200,-65908 }, + { 201,-65908 }, { 202,-65908 }, { 203,-65908 }, { 204,-65908 }, { 205,-65908 }, + { 206,-65908 }, { 207,-65908 }, { 208,-65908 }, { 209,-65908 }, { 210,-65908 }, + { 211,-65908 }, { 212,-65908 }, { 213,-65908 }, { 214,-65908 }, { 215,-65908 }, + { 216,-65908 }, { 217,-65908 }, { 218,-65908 }, { 219,-65908 }, { 220,-65908 }, + { 221,-65908 }, { 222,-65908 }, { 223,-65908 }, { 224,-65908 }, { 225,-65908 }, + + { 226,-65908 }, { 227,-65908 }, { 228,-65908 }, { 229,-65908 }, { 230,-65908 }, + { 231,-65908 }, { 232,-65908 }, { 233,-65908 }, { 234,-65908 }, { 235,-65908 }, + { 236,-65908 }, { 237,-65908 }, { 238,-65908 }, { 239,-65908 }, { 240,-65908 }, + { 241,-65908 }, { 242,-65908 }, { 243,-65908 }, { 244,-65908 }, { 245,-65908 }, + { 246,-65908 }, { 247,-65908 }, { 248,-65908 }, { 249,-65908 }, { 250,-65908 }, + { 251,-65908 }, { 252,-65908 }, { 253,-65908 }, { 254,-65908 }, { 255,-65908 }, + { 0, 131 }, { 0,25958 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-66165 }, + { 49,-66165 }, { 50,-66165 }, { 51,-66165 }, { 52,-66165 }, { 53,-66165 }, + { 54,-66165 }, { 55,-66165 }, { 56,-66165 }, { 57,-66165 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-66165 }, { 66,-66165 }, { 67,-66165 }, { 68,-66165 }, + + { 69,-66165 }, { 70,-66165 }, { 71,-66165 }, { 72,-66165 }, { 73,-66165 }, + { 74,-66165 }, { 75,-66165 }, { 76,-66165 }, { 77,-66165 }, { 78,-66165 }, + { 79,-66165 }, { 80,-66165 }, { 81,-66165 }, { 82,-66165 }, { 83,-66165 }, + { 84,-66165 }, { 85,-66165 }, { 86,-66165 }, { 87,-66165 }, { 88,-66165 }, + { 89,-66165 }, { 90,-66165 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,7967 }, { 0, 0 }, { 97,-66165 }, { 98,-66165 }, + { 99,-66165 }, { 100,-66165 }, { 101,-66165 }, { 102,-66165 }, { 103,-66165 }, + { 104,-66165 }, { 105,-66165 }, { 106,-66165 }, { 107,-66165 }, { 108,-66165 }, + { 109,-66165 }, { 110,-66165 }, { 111,-66165 }, { 112,-66165 }, { 113,-66165 }, + { 114,-66165 }, { 115,-66165 }, { 116,-66165 }, { 117,-66165 }, { 118,-66165 }, + + { 119,-66165 }, { 120,-66165 }, { 121,-66165 }, { 122,-66165 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-66165 }, { 128,-66165 }, + { 129,-66165 }, { 130,-66165 }, { 131,-66165 }, { 132,-66165 }, { 133,-66165 }, + { 134,-66165 }, { 135,-66165 }, { 136,-66165 }, { 137,-66165 }, { 138,-66165 }, + { 139,-66165 }, { 140,-66165 }, { 141,-66165 }, { 142,-66165 }, { 143,-66165 }, + { 144,-66165 }, { 145,-66165 }, { 146,-66165 }, { 147,-66165 }, { 148,-66165 }, + { 149,-66165 }, { 150,-66165 }, { 151,-66165 }, { 152,-66165 }, { 153,-66165 }, + { 154,-66165 }, { 155,-66165 }, { 156,-66165 }, { 157,-66165 }, { 158,-66165 }, + { 159,-66165 }, { 160,-66165 }, { 161,-66165 }, { 162,-66165 }, { 163,-66165 }, + { 164,-66165 }, { 165,-66165 }, { 166,-66165 }, { 167,-66165 }, { 168,-66165 }, + + { 169,-66165 }, { 170,-66165 }, { 171,-66165 }, { 172,-66165 }, { 173,-66165 }, + { 174,-66165 }, { 175,-66165 }, { 176,-66165 }, { 177,-66165 }, { 178,-66165 }, + { 179,-66165 }, { 180,-66165 }, { 181,-66165 }, { 182,-66165 }, { 183,-66165 }, + { 184,-66165 }, { 185,-66165 }, { 186,-66165 }, { 187,-66165 }, { 188,-66165 }, + { 189,-66165 }, { 190,-66165 }, { 191,-66165 }, { 192,-66165 }, { 193,-66165 }, + { 194,-66165 }, { 195,-66165 }, { 196,-66165 }, { 197,-66165 }, { 198,-66165 }, + { 199,-66165 }, { 200,-66165 }, { 201,-66165 }, { 202,-66165 }, { 203,-66165 }, + { 204,-66165 }, { 205,-66165 }, { 206,-66165 }, { 207,-66165 }, { 208,-66165 }, + { 209,-66165 }, { 210,-66165 }, { 211,-66165 }, { 212,-66165 }, { 213,-66165 }, + { 214,-66165 }, { 215,-66165 }, { 216,-66165 }, { 217,-66165 }, { 218,-66165 }, + + { 219,-66165 }, { 220,-66165 }, { 221,-66165 }, { 222,-66165 }, { 223,-66165 }, + { 224,-66165 }, { 225,-66165 }, { 226,-66165 }, { 227,-66165 }, { 228,-66165 }, + { 229,-66165 }, { 230,-66165 }, { 231,-66165 }, { 232,-66165 }, { 233,-66165 }, + { 234,-66165 }, { 235,-66165 }, { 236,-66165 }, { 237,-66165 }, { 238,-66165 }, + { 239,-66165 }, { 240,-66165 }, { 241,-66165 }, { 242,-66165 }, { 243,-66165 }, + { 244,-66165 }, { 245,-66165 }, { 246,-66165 }, { 247,-66165 }, { 248,-66165 }, + { 249,-66165 }, { 250,-66165 }, { 251,-66165 }, { 252,-66165 }, { 253,-66165 }, + { 254,-66165 }, { 255,-66165 }, { 0, 131 }, { 0,25701 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-66422 }, { 49,-66422 }, { 50,-66422 }, { 51,-66422 }, + { 52,-66422 }, { 53,-66422 }, { 54,-66422 }, { 55,-66422 }, { 56,-66422 }, + { 57,-66422 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-66422 }, { 66,-66422 }, + { 67,-66422 }, { 68,-66422 }, { 69,-66422 }, { 70,-66422 }, { 71,-66422 }, + { 72,-66422 }, { 73,-66422 }, { 74,-66422 }, { 75,-66422 }, { 76,-66422 }, + { 77,-66422 }, { 78,-66422 }, { 79,-66422 }, { 80,-66422 }, { 81,-66422 }, + { 82,-66422 }, { 83,-66422 }, { 84,-66422 }, { 85,-66422 }, { 86,-66422 }, + { 87,-66422 }, { 88,-66422 }, { 89,-66422 }, { 90,-66422 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,7967 }, { 0, 0 }, + { 97,-66422 }, { 98,-66422 }, { 99,-66422 }, { 100,-66422 }, { 101,-66422 }, + { 102,-66422 }, { 103,-66422 }, { 104,-66422 }, { 105,-66422 }, { 106,-66422 }, + { 107,-66422 }, { 108,-66422 }, { 109,-66422 }, { 110,-66422 }, { 111,-66422 }, + + { 112,-66422 }, { 113,-66422 }, { 114,-66422 }, { 115,-66422 }, { 116,-66422 }, + { 117,-66422 }, { 118,-66422 }, { 119,-66422 }, { 120,-66422 }, { 121,-66422 }, + { 122,-66422 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-66422 }, { 128,-66422 }, { 129,-66422 }, { 130,-66422 }, { 131,-66422 }, + { 132,-66422 }, { 133,-66422 }, { 134,-66422 }, { 135,-66422 }, { 136,-66422 }, + { 137,-66422 }, { 138,-66422 }, { 139,-66422 }, { 140,-66422 }, { 141,-66422 }, + { 142,-66422 }, { 143,-66422 }, { 144,-66422 }, { 145,-66422 }, { 146,-66422 }, + { 147,-66422 }, { 148,-66422 }, { 149,-66422 }, { 150,-66422 }, { 151,-66422 }, + { 152,-66422 }, { 153,-66422 }, { 154,-66422 }, { 155,-66422 }, { 156,-66422 }, + { 157,-66422 }, { 158,-66422 }, { 159,-66422 }, { 160,-66422 }, { 161,-66422 }, + + { 162,-66422 }, { 163,-66422 }, { 164,-66422 }, { 165,-66422 }, { 166,-66422 }, + { 167,-66422 }, { 168,-66422 }, { 169,-66422 }, { 170,-66422 }, { 171,-66422 }, + { 172,-66422 }, { 173,-66422 }, { 174,-66422 }, { 175,-66422 }, { 176,-66422 }, + { 177,-66422 }, { 178,-66422 }, { 179,-66422 }, { 180,-66422 }, { 181,-66422 }, + { 182,-66422 }, { 183,-66422 }, { 184,-66422 }, { 185,-66422 }, { 186,-66422 }, + { 187,-66422 }, { 188,-66422 }, { 189,-66422 }, { 190,-66422 }, { 191,-66422 }, + { 192,-66422 }, { 193,-66422 }, { 194,-66422 }, { 195,-66422 }, { 196,-66422 }, + { 197,-66422 }, { 198,-66422 }, { 199,-66422 }, { 200,-66422 }, { 201,-66422 }, + { 202,-66422 }, { 203,-66422 }, { 204,-66422 }, { 205,-66422 }, { 206,-66422 }, + { 207,-66422 }, { 208,-66422 }, { 209,-66422 }, { 210,-66422 }, { 211,-66422 }, + + { 212,-66422 }, { 213,-66422 }, { 214,-66422 }, { 215,-66422 }, { 216,-66422 }, + { 217,-66422 }, { 218,-66422 }, { 219,-66422 }, { 220,-66422 }, { 221,-66422 }, + { 222,-66422 }, { 223,-66422 }, { 224,-66422 }, { 225,-66422 }, { 226,-66422 }, + { 227,-66422 }, { 228,-66422 }, { 229,-66422 }, { 230,-66422 }, { 231,-66422 }, + { 232,-66422 }, { 233,-66422 }, { 234,-66422 }, { 235,-66422 }, { 236,-66422 }, + { 237,-66422 }, { 238,-66422 }, { 239,-66422 }, { 240,-66422 }, { 241,-66422 }, + { 242,-66422 }, { 243,-66422 }, { 244,-66422 }, { 245,-66422 }, { 246,-66422 }, + { 247,-66422 }, { 248,-66422 }, { 249,-66422 }, { 250,-66422 }, { 251,-66422 }, + { 252,-66422 }, { 253,-66422 }, { 254,-66422 }, { 255,-66422 }, { 0, 131 }, + { 0,25444 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-66679 }, { 49,-66679 }, + { 50,-66679 }, { 51,-66679 }, { 52,-66679 }, { 53,-66679 }, { 54,-66679 }, + + { 55,-66679 }, { 56,-66679 }, { 57,-66679 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-66679 }, { 66,-66679 }, { 67,-66679 }, { 68,-66679 }, { 69,-66679 }, + { 70,-66679 }, { 71,-66679 }, { 72,-66679 }, { 73,-66679 }, { 74,-66679 }, + { 75,-66679 }, { 76,-66679 }, { 77,-66679 }, { 78,-66679 }, { 79,7967 }, + { 80,-66679 }, { 81,-66679 }, { 82,-66679 }, { 83,-66679 }, { 84,-66679 }, + { 85,-66679 }, { 86,-66679 }, { 87,-66679 }, { 88,-66679 }, { 89,-66679 }, + { 90,-66679 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-66679 }, { 0, 0 }, { 97,-66679 }, { 98,-66679 }, { 99,-66679 }, + { 100,-66679 }, { 101,-66679 }, { 102,-66679 }, { 103,-66679 }, { 104,-66679 }, + + { 105,-66679 }, { 106,-66679 }, { 107,-66679 }, { 108,-66679 }, { 109,-66679 }, + { 110,-66679 }, { 111,7967 }, { 112,-66679 }, { 113,-66679 }, { 114,-66679 }, + { 115,-66679 }, { 116,-66679 }, { 117,-66679 }, { 118,-66679 }, { 119,-66679 }, + { 120,-66679 }, { 121,-66679 }, { 122,-66679 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-66679 }, { 128,-66679 }, { 129,-66679 }, + { 130,-66679 }, { 131,-66679 }, { 132,-66679 }, { 133,-66679 }, { 134,-66679 }, + { 135,-66679 }, { 136,-66679 }, { 137,-66679 }, { 138,-66679 }, { 139,-66679 }, + { 140,-66679 }, { 141,-66679 }, { 142,-66679 }, { 143,-66679 }, { 144,-66679 }, + { 145,-66679 }, { 146,-66679 }, { 147,-66679 }, { 148,-66679 }, { 149,-66679 }, + { 150,-66679 }, { 151,-66679 }, { 152,-66679 }, { 153,-66679 }, { 154,-66679 }, + + { 155,-66679 }, { 156,-66679 }, { 157,-66679 }, { 158,-66679 }, { 159,-66679 }, + { 160,-66679 }, { 161,-66679 }, { 162,-66679 }, { 163,-66679 }, { 164,-66679 }, + { 165,-66679 }, { 166,-66679 }, { 167,-66679 }, { 168,-66679 }, { 169,-66679 }, + { 170,-66679 }, { 171,-66679 }, { 172,-66679 }, { 173,-66679 }, { 174,-66679 }, + { 175,-66679 }, { 176,-66679 }, { 177,-66679 }, { 178,-66679 }, { 179,-66679 }, + { 180,-66679 }, { 181,-66679 }, { 182,-66679 }, { 183,-66679 }, { 184,-66679 }, + { 185,-66679 }, { 186,-66679 }, { 187,-66679 }, { 188,-66679 }, { 189,-66679 }, + { 190,-66679 }, { 191,-66679 }, { 192,-66679 }, { 193,-66679 }, { 194,-66679 }, + { 195,-66679 }, { 196,-66679 }, { 197,-66679 }, { 198,-66679 }, { 199,-66679 }, + { 200,-66679 }, { 201,-66679 }, { 202,-66679 }, { 203,-66679 }, { 204,-66679 }, + + { 205,-66679 }, { 206,-66679 }, { 207,-66679 }, { 208,-66679 }, { 209,-66679 }, + { 210,-66679 }, { 211,-66679 }, { 212,-66679 }, { 213,-66679 }, { 214,-66679 }, + { 215,-66679 }, { 216,-66679 }, { 217,-66679 }, { 218,-66679 }, { 219,-66679 }, + { 220,-66679 }, { 221,-66679 }, { 222,-66679 }, { 223,-66679 }, { 224,-66679 }, + { 225,-66679 }, { 226,-66679 }, { 227,-66679 }, { 228,-66679 }, { 229,-66679 }, + { 230,-66679 }, { 231,-66679 }, { 232,-66679 }, { 233,-66679 }, { 234,-66679 }, + { 235,-66679 }, { 236,-66679 }, { 237,-66679 }, { 238,-66679 }, { 239,-66679 }, + { 240,-66679 }, { 241,-66679 }, { 242,-66679 }, { 243,-66679 }, { 244,-66679 }, + { 245,-66679 }, { 246,-66679 }, { 247,-66679 }, { 248,-66679 }, { 249,-66679 }, + { 250,-66679 }, { 251,-66679 }, { 252,-66679 }, { 253,-66679 }, { 254,-66679 }, + + { 255,-66679 }, { 0, 131 }, { 0,25187 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 48,-66936 }, { 49,-66936 }, { 50,-66936 }, { 51,-66936 }, { 52,-66936 }, + { 53,-66936 }, { 54,-66936 }, { 55,-66936 }, { 56,-66936 }, { 57,-66936 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-66936 }, { 66,-66936 }, { 67,-66936 }, + { 68,-66936 }, { 69,-66936 }, { 70,-66936 }, { 71,-66936 }, { 72,-66936 }, + { 73,-66936 }, { 74,-66936 }, { 75,-66936 }, { 76,-66936 }, { 77,-66936 }, + { 78,-66936 }, { 79,-66936 }, { 80,-66936 }, { 81,-66936 }, { 82,-66936 }, + { 83,7967 }, { 84,-66936 }, { 85,-66936 }, { 86,-66936 }, { 87,-66936 }, + { 88,-66936 }, { 89,-66936 }, { 90,-66936 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-66936 }, { 0, 0 }, { 97,-66936 }, + + { 98,-66936 }, { 99,-66936 }, { 100,-66936 }, { 101,-66936 }, { 102,-66936 }, + { 103,-66936 }, { 104,-66936 }, { 105,-66936 }, { 106,-66936 }, { 107,-66936 }, + { 108,-66936 }, { 109,-66936 }, { 110,-66936 }, { 111,-66936 }, { 112,-66936 }, + { 113,-66936 }, { 114,-66936 }, { 115,7967 }, { 116,-66936 }, { 117,-66936 }, + { 118,-66936 }, { 119,-66936 }, { 120,-66936 }, { 121,-66936 }, { 122,-66936 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-66936 }, + { 128,-66936 }, { 129,-66936 }, { 130,-66936 }, { 131,-66936 }, { 132,-66936 }, + { 133,-66936 }, { 134,-66936 }, { 135,-66936 }, { 136,-66936 }, { 137,-66936 }, + { 138,-66936 }, { 139,-66936 }, { 140,-66936 }, { 141,-66936 }, { 142,-66936 }, + { 143,-66936 }, { 144,-66936 }, { 145,-66936 }, { 146,-66936 }, { 147,-66936 }, + + { 148,-66936 }, { 149,-66936 }, { 150,-66936 }, { 151,-66936 }, { 152,-66936 }, + { 153,-66936 }, { 154,-66936 }, { 155,-66936 }, { 156,-66936 }, { 157,-66936 }, + { 158,-66936 }, { 159,-66936 }, { 160,-66936 }, { 161,-66936 }, { 162,-66936 }, + { 163,-66936 }, { 164,-66936 }, { 165,-66936 }, { 166,-66936 }, { 167,-66936 }, + { 168,-66936 }, { 169,-66936 }, { 170,-66936 }, { 171,-66936 }, { 172,-66936 }, + { 173,-66936 }, { 174,-66936 }, { 175,-66936 }, { 176,-66936 }, { 177,-66936 }, + { 178,-66936 }, { 179,-66936 }, { 180,-66936 }, { 181,-66936 }, { 182,-66936 }, + { 183,-66936 }, { 184,-66936 }, { 185,-66936 }, { 186,-66936 }, { 187,-66936 }, + { 188,-66936 }, { 189,-66936 }, { 190,-66936 }, { 191,-66936 }, { 192,-66936 }, + { 193,-66936 }, { 194,-66936 }, { 195,-66936 }, { 196,-66936 }, { 197,-66936 }, + + { 198,-66936 }, { 199,-66936 }, { 200,-66936 }, { 201,-66936 }, { 202,-66936 }, + { 203,-66936 }, { 204,-66936 }, { 205,-66936 }, { 206,-66936 }, { 207,-66936 }, + { 208,-66936 }, { 209,-66936 }, { 210,-66936 }, { 211,-66936 }, { 212,-66936 }, + { 213,-66936 }, { 214,-66936 }, { 215,-66936 }, { 216,-66936 }, { 217,-66936 }, + { 218,-66936 }, { 219,-66936 }, { 220,-66936 }, { 221,-66936 }, { 222,-66936 }, + { 223,-66936 }, { 224,-66936 }, { 225,-66936 }, { 226,-66936 }, { 227,-66936 }, + { 228,-66936 }, { 229,-66936 }, { 230,-66936 }, { 231,-66936 }, { 232,-66936 }, + { 233,-66936 }, { 234,-66936 }, { 235,-66936 }, { 236,-66936 }, { 237,-66936 }, + { 238,-66936 }, { 239,-66936 }, { 240,-66936 }, { 241,-66936 }, { 242,-66936 }, + { 243,-66936 }, { 244,-66936 }, { 245,-66936 }, { 246,-66936 }, { 247,-66936 }, + + { 248,-66936 }, { 249,-66936 }, { 250,-66936 }, { 251,-66936 }, { 252,-66936 }, + { 253,-66936 }, { 254,-66936 }, { 255,-66936 }, { 0, 131 }, { 0,24930 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-67193 }, { 49,-67193 }, { 50,-67193 }, + { 51,-67193 }, { 52,-67193 }, { 53,-67193 }, { 54,-67193 }, { 55,-67193 }, + { 56,-67193 }, { 57,-67193 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-67193 }, + { 66,-67193 }, { 67,-67193 }, { 68,-67193 }, { 69,-67193 }, { 70,-67193 }, + { 71,-67193 }, { 72,-67193 }, { 73,-67193 }, { 74,-67193 }, { 75,-67193 }, + { 76,-67193 }, { 77,-67193 }, { 78,-67193 }, { 79,-67193 }, { 80,-67193 }, + { 81,-67193 }, { 82,-67193 }, { 83,-67193 }, { 84,7967 }, { 85,-67193 }, + { 86,-67193 }, { 87,-67193 }, { 88,-67193 }, { 89,-67193 }, { 90,-67193 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-67193 }, + { 0, 0 }, { 97,-67193 }, { 98,-67193 }, { 99,-67193 }, { 100,-67193 }, + { 101,-67193 }, { 102,-67193 }, { 103,-67193 }, { 104,-67193 }, { 105,-67193 }, + { 106,-67193 }, { 107,-67193 }, { 108,-67193 }, { 109,-67193 }, { 110,-67193 }, + { 111,-67193 }, { 112,-67193 }, { 113,-67193 }, { 114,-67193 }, { 115,-67193 }, + { 116,7967 }, { 117,-67193 }, { 118,-67193 }, { 119,-67193 }, { 120,-67193 }, + { 121,-67193 }, { 122,-67193 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-67193 }, { 128,-67193 }, { 129,-67193 }, { 130,-67193 }, + { 131,-67193 }, { 132,-67193 }, { 133,-67193 }, { 134,-67193 }, { 135,-67193 }, + { 136,-67193 }, { 137,-67193 }, { 138,-67193 }, { 139,-67193 }, { 140,-67193 }, + + { 141,-67193 }, { 142,-67193 }, { 143,-67193 }, { 144,-67193 }, { 145,-67193 }, + { 146,-67193 }, { 147,-67193 }, { 148,-67193 }, { 149,-67193 }, { 150,-67193 }, + { 151,-67193 }, { 152,-67193 }, { 153,-67193 }, { 154,-67193 }, { 155,-67193 }, + { 156,-67193 }, { 157,-67193 }, { 158,-67193 }, { 159,-67193 }, { 160,-67193 }, + { 161,-67193 }, { 162,-67193 }, { 163,-67193 }, { 164,-67193 }, { 165,-67193 }, + { 166,-67193 }, { 167,-67193 }, { 168,-67193 }, { 169,-67193 }, { 170,-67193 }, + { 171,-67193 }, { 172,-67193 }, { 173,-67193 }, { 174,-67193 }, { 175,-67193 }, + { 176,-67193 }, { 177,-67193 }, { 178,-67193 }, { 179,-67193 }, { 180,-67193 }, + { 181,-67193 }, { 182,-67193 }, { 183,-67193 }, { 184,-67193 }, { 185,-67193 }, + { 186,-67193 }, { 187,-67193 }, { 188,-67193 }, { 189,-67193 }, { 190,-67193 }, + + { 191,-67193 }, { 192,-67193 }, { 193,-67193 }, { 194,-67193 }, { 195,-67193 }, + { 196,-67193 }, { 197,-67193 }, { 198,-67193 }, { 199,-67193 }, { 200,-67193 }, + { 201,-67193 }, { 202,-67193 }, { 203,-67193 }, { 204,-67193 }, { 205,-67193 }, + { 206,-67193 }, { 207,-67193 }, { 208,-67193 }, { 209,-67193 }, { 210,-67193 }, + { 211,-67193 }, { 212,-67193 }, { 213,-67193 }, { 214,-67193 }, { 215,-67193 }, + { 216,-67193 }, { 217,-67193 }, { 218,-67193 }, { 219,-67193 }, { 220,-67193 }, + { 221,-67193 }, { 222,-67193 }, { 223,-67193 }, { 224,-67193 }, { 225,-67193 }, + { 226,-67193 }, { 227,-67193 }, { 228,-67193 }, { 229,-67193 }, { 230,-67193 }, + { 231,-67193 }, { 232,-67193 }, { 233,-67193 }, { 234,-67193 }, { 235,-67193 }, + { 236,-67193 }, { 237,-67193 }, { 238,-67193 }, { 239,-67193 }, { 240,-67193 }, + + { 241,-67193 }, { 242,-67193 }, { 243,-67193 }, { 244,-67193 }, { 245,-67193 }, + { 246,-67193 }, { 247,-67193 }, { 248,-67193 }, { 249,-67193 }, { 250,-67193 }, + { 251,-67193 }, { 252,-67193 }, { 253,-67193 }, { 254,-67193 }, { 255,-67193 }, + { 0, 131 }, { 0,24673 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-67450 }, + { 49,-67450 }, { 50,-67450 }, { 51,-67450 }, { 52,-67450 }, { 53,-67450 }, + { 54,-67450 }, { 55,-67450 }, { 56,-67450 }, { 57,-67450 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-67450 }, { 66,-67450 }, { 67,-67450 }, { 68,-67450 }, + { 69,-67450 }, { 70,-67450 }, { 71,-67450 }, { 72,-67450 }, { 73,-67450 }, + { 74,-67450 }, { 75,-67450 }, { 76,-67450 }, { 77,-67450 }, { 78,-67450 }, + { 79,-67450 }, { 80,-67450 }, { 81,-67450 }, { 82,-67450 }, { 83,-67450 }, + + { 84,7967 }, { 85,-67450 }, { 86,-67450 }, { 87,-67450 }, { 88,-67450 }, + { 89,-67450 }, { 90,-67450 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-67450 }, { 0, 0 }, { 97,-67450 }, { 98,-67450 }, + { 99,-67450 }, { 100,-67450 }, { 101,-67450 }, { 102,-67450 }, { 103,-67450 }, + { 104,-67450 }, { 105,-67450 }, { 106,-67450 }, { 107,-67450 }, { 108,-67450 }, + { 109,-67450 }, { 110,-67450 }, { 111,-67450 }, { 112,-67450 }, { 113,-67450 }, + { 114,-67450 }, { 115,-67450 }, { 116,7967 }, { 117,-67450 }, { 118,-67450 }, + { 119,-67450 }, { 120,-67450 }, { 121,-67450 }, { 122,-67450 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-67450 }, { 128,-67450 }, + { 129,-67450 }, { 130,-67450 }, { 131,-67450 }, { 132,-67450 }, { 133,-67450 }, + + { 134,-67450 }, { 135,-67450 }, { 136,-67450 }, { 137,-67450 }, { 138,-67450 }, + { 139,-67450 }, { 140,-67450 }, { 141,-67450 }, { 142,-67450 }, { 143,-67450 }, + { 144,-67450 }, { 145,-67450 }, { 146,-67450 }, { 147,-67450 }, { 148,-67450 }, + { 149,-67450 }, { 150,-67450 }, { 151,-67450 }, { 152,-67450 }, { 153,-67450 }, + { 154,-67450 }, { 155,-67450 }, { 156,-67450 }, { 157,-67450 }, { 158,-67450 }, + { 159,-67450 }, { 160,-67450 }, { 161,-67450 }, { 162,-67450 }, { 163,-67450 }, + { 164,-67450 }, { 165,-67450 }, { 166,-67450 }, { 167,-67450 }, { 168,-67450 }, + { 169,-67450 }, { 170,-67450 }, { 171,-67450 }, { 172,-67450 }, { 173,-67450 }, + { 174,-67450 }, { 175,-67450 }, { 176,-67450 }, { 177,-67450 }, { 178,-67450 }, + { 179,-67450 }, { 180,-67450 }, { 181,-67450 }, { 182,-67450 }, { 183,-67450 }, + + { 184,-67450 }, { 185,-67450 }, { 186,-67450 }, { 187,-67450 }, { 188,-67450 }, + { 189,-67450 }, { 190,-67450 }, { 191,-67450 }, { 192,-67450 }, { 193,-67450 }, + { 194,-67450 }, { 195,-67450 }, { 196,-67450 }, { 197,-67450 }, { 198,-67450 }, + { 199,-67450 }, { 200,-67450 }, { 201,-67450 }, { 202,-67450 }, { 203,-67450 }, + { 204,-67450 }, { 205,-67450 }, { 206,-67450 }, { 207,-67450 }, { 208,-67450 }, + { 209,-67450 }, { 210,-67450 }, { 211,-67450 }, { 212,-67450 }, { 213,-67450 }, + { 214,-67450 }, { 215,-67450 }, { 216,-67450 }, { 217,-67450 }, { 218,-67450 }, + { 219,-67450 }, { 220,-67450 }, { 221,-67450 }, { 222,-67450 }, { 223,-67450 }, + { 224,-67450 }, { 225,-67450 }, { 226,-67450 }, { 227,-67450 }, { 228,-67450 }, + { 229,-67450 }, { 230,-67450 }, { 231,-67450 }, { 232,-67450 }, { 233,-67450 }, + + { 234,-67450 }, { 235,-67450 }, { 236,-67450 }, { 237,-67450 }, { 238,-67450 }, + { 239,-67450 }, { 240,-67450 }, { 241,-67450 }, { 242,-67450 }, { 243,-67450 }, + { 244,-67450 }, { 245,-67450 }, { 246,-67450 }, { 247,-67450 }, { 248,-67450 }, + { 249,-67450 }, { 250,-67450 }, { 251,-67450 }, { 252,-67450 }, { 253,-67450 }, + { 254,-67450 }, { 255,-67450 }, { 0, 131 }, { 0,24416 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-67707 }, { 49,-67707 }, { 50,-67707 }, { 51,-67707 }, + { 52,-67707 }, { 53,-67707 }, { 54,-67707 }, { 55,-67707 }, { 56,-67707 }, + { 57,-67707 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-67707 }, { 66,-67707 }, + { 67,-67707 }, { 68,-67707 }, { 69,7967 }, { 70,-67707 }, { 71,-67707 }, + { 72,-67707 }, { 73,-67707 }, { 74,-67707 }, { 75,-67707 }, { 76,-67707 }, + + { 77,-67707 }, { 78,-67707 }, { 79,-67707 }, { 80,-67707 }, { 81,-67707 }, + { 82,-67707 }, { 83,-67707 }, { 84,-67707 }, { 85,-67707 }, { 86,-67707 }, + { 87,-67707 }, { 88,-67707 }, { 89,-67707 }, { 90,-67707 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-67707 }, { 0, 0 }, + { 97,-67707 }, { 98,-67707 }, { 99,-67707 }, { 100,-67707 }, { 101,7967 }, + { 102,-67707 }, { 103,-67707 }, { 104,-67707 }, { 105,-67707 }, { 106,-67707 }, + { 107,-67707 }, { 108,-67707 }, { 109,-67707 }, { 110,-67707 }, { 111,-67707 }, + { 112,-67707 }, { 113,-67707 }, { 114,-67707 }, { 115,-67707 }, { 116,-67707 }, + { 117,-67707 }, { 118,-67707 }, { 119,-67707 }, { 120,-67707 }, { 121,-67707 }, + { 122,-67707 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 127,-67707 }, { 128,-67707 }, { 129,-67707 }, { 130,-67707 }, { 131,-67707 }, + { 132,-67707 }, { 133,-67707 }, { 134,-67707 }, { 135,-67707 }, { 136,-67707 }, + { 137,-67707 }, { 138,-67707 }, { 139,-67707 }, { 140,-67707 }, { 141,-67707 }, + { 142,-67707 }, { 143,-67707 }, { 144,-67707 }, { 145,-67707 }, { 146,-67707 }, + { 147,-67707 }, { 148,-67707 }, { 149,-67707 }, { 150,-67707 }, { 151,-67707 }, + { 152,-67707 }, { 153,-67707 }, { 154,-67707 }, { 155,-67707 }, { 156,-67707 }, + { 157,-67707 }, { 158,-67707 }, { 159,-67707 }, { 160,-67707 }, { 161,-67707 }, + { 162,-67707 }, { 163,-67707 }, { 164,-67707 }, { 165,-67707 }, { 166,-67707 }, + { 167,-67707 }, { 168,-67707 }, { 169,-67707 }, { 170,-67707 }, { 171,-67707 }, + { 172,-67707 }, { 173,-67707 }, { 174,-67707 }, { 175,-67707 }, { 176,-67707 }, + + { 177,-67707 }, { 178,-67707 }, { 179,-67707 }, { 180,-67707 }, { 181,-67707 }, + { 182,-67707 }, { 183,-67707 }, { 184,-67707 }, { 185,-67707 }, { 186,-67707 }, + { 187,-67707 }, { 188,-67707 }, { 189,-67707 }, { 190,-67707 }, { 191,-67707 }, + { 192,-67707 }, { 193,-67707 }, { 194,-67707 }, { 195,-67707 }, { 196,-67707 }, + { 197,-67707 }, { 198,-67707 }, { 199,-67707 }, { 200,-67707 }, { 201,-67707 }, + { 202,-67707 }, { 203,-67707 }, { 204,-67707 }, { 205,-67707 }, { 206,-67707 }, + { 207,-67707 }, { 208,-67707 }, { 209,-67707 }, { 210,-67707 }, { 211,-67707 }, + { 212,-67707 }, { 213,-67707 }, { 214,-67707 }, { 215,-67707 }, { 216,-67707 }, + { 217,-67707 }, { 218,-67707 }, { 219,-67707 }, { 220,-67707 }, { 221,-67707 }, + { 222,-67707 }, { 223,-67707 }, { 224,-67707 }, { 225,-67707 }, { 226,-67707 }, + + { 227,-67707 }, { 228,-67707 }, { 229,-67707 }, { 230,-67707 }, { 231,-67707 }, + { 232,-67707 }, { 233,-67707 }, { 234,-67707 }, { 235,-67707 }, { 236,-67707 }, + { 237,-67707 }, { 238,-67707 }, { 239,-67707 }, { 240,-67707 }, { 241,-67707 }, + { 242,-67707 }, { 243,-67707 }, { 244,-67707 }, { 245,-67707 }, { 246,-67707 }, + { 247,-67707 }, { 248,-67707 }, { 249,-67707 }, { 250,-67707 }, { 251,-67707 }, + { 252,-67707 }, { 253,-67707 }, { 254,-67707 }, { 255,-67707 }, { 0, 131 }, + { 0,24159 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-67964 }, { 49,-67964 }, + { 50,-67964 }, { 51,-67964 }, { 52,-67964 }, { 53,-67964 }, { 54,-67964 }, + { 55,-67964 }, { 56,-67964 }, { 57,-67964 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-67964 }, { 66,-67964 }, { 67,-67964 }, { 68,-67964 }, { 69,7967 }, + + { 70,-67964 }, { 71,-67964 }, { 72,-67964 }, { 73,-67964 }, { 74,-67964 }, + { 75,-67964 }, { 76,-67964 }, { 77,-67964 }, { 78,-67964 }, { 79,-67964 }, + { 80,-67964 }, { 81,-67964 }, { 82,-67964 }, { 83,-67964 }, { 84,-67964 }, + { 85,-67964 }, { 86,-67964 }, { 87,-67964 }, { 88,-67964 }, { 89,-67964 }, + { 90,-67964 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-67964 }, { 0, 0 }, { 97,-67964 }, { 98,-67964 }, { 99,-67964 }, + { 100,-67964 }, { 101,7967 }, { 102,-67964 }, { 103,-67964 }, { 104,-67964 }, + { 105,-67964 }, { 106,-67964 }, { 107,-67964 }, { 108,-67964 }, { 109,-67964 }, + { 110,-67964 }, { 111,-67964 }, { 112,-67964 }, { 113,-67964 }, { 114,-67964 }, + { 115,-67964 }, { 116,-67964 }, { 117,-67964 }, { 118,-67964 }, { 119,-67964 }, + + { 120,-67964 }, { 121,-67964 }, { 122,-67964 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-67964 }, { 128,-67964 }, { 129,-67964 }, + { 130,-67964 }, { 131,-67964 }, { 132,-67964 }, { 133,-67964 }, { 134,-67964 }, + { 135,-67964 }, { 136,-67964 }, { 137,-67964 }, { 138,-67964 }, { 139,-67964 }, + { 140,-67964 }, { 141,-67964 }, { 142,-67964 }, { 143,-67964 }, { 144,-67964 }, + { 145,-67964 }, { 146,-67964 }, { 147,-67964 }, { 148,-67964 }, { 149,-67964 }, + { 150,-67964 }, { 151,-67964 }, { 152,-67964 }, { 153,-67964 }, { 154,-67964 }, + { 155,-67964 }, { 156,-67964 }, { 157,-67964 }, { 158,-67964 }, { 159,-67964 }, + { 160,-67964 }, { 161,-67964 }, { 162,-67964 }, { 163,-67964 }, { 164,-67964 }, + { 165,-67964 }, { 166,-67964 }, { 167,-67964 }, { 168,-67964 }, { 169,-67964 }, + + { 170,-67964 }, { 171,-67964 }, { 172,-67964 }, { 173,-67964 }, { 174,-67964 }, + { 175,-67964 }, { 176,-67964 }, { 177,-67964 }, { 178,-67964 }, { 179,-67964 }, + { 180,-67964 }, { 181,-67964 }, { 182,-67964 }, { 183,-67964 }, { 184,-67964 }, + { 185,-67964 }, { 186,-67964 }, { 187,-67964 }, { 188,-67964 }, { 189,-67964 }, + { 190,-67964 }, { 191,-67964 }, { 192,-67964 }, { 193,-67964 }, { 194,-67964 }, + { 195,-67964 }, { 196,-67964 }, { 197,-67964 }, { 198,-67964 }, { 199,-67964 }, + { 200,-67964 }, { 201,-67964 }, { 202,-67964 }, { 203,-67964 }, { 204,-67964 }, + { 205,-67964 }, { 206,-67964 }, { 207,-67964 }, { 208,-67964 }, { 209,-67964 }, + { 210,-67964 }, { 211,-67964 }, { 212,-67964 }, { 213,-67964 }, { 214,-67964 }, + { 215,-67964 }, { 216,-67964 }, { 217,-67964 }, { 218,-67964 }, { 219,-67964 }, + + { 220,-67964 }, { 221,-67964 }, { 222,-67964 }, { 223,-67964 }, { 224,-67964 }, + { 225,-67964 }, { 226,-67964 }, { 227,-67964 }, { 228,-67964 }, { 229,-67964 }, + { 230,-67964 }, { 231,-67964 }, { 232,-67964 }, { 233,-67964 }, { 234,-67964 }, + { 235,-67964 }, { 236,-67964 }, { 237,-67964 }, { 238,-67964 }, { 239,-67964 }, + { 240,-67964 }, { 241,-67964 }, { 242,-67964 }, { 243,-67964 }, { 244,-67964 }, + { 245,-67964 }, { 246,-67964 }, { 247,-67964 }, { 248,-67964 }, { 249,-67964 }, + { 250,-67964 }, { 251,-67964 }, { 252,-67964 }, { 253,-67964 }, { 254,-67964 }, + { 255,-67964 }, { 0, 43 }, { 0,23902 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-68221 }, { 49,-68221 }, { 50,-68221 }, { 51,-68221 }, { 52,-68221 }, + { 53,-68221 }, { 54,-68221 }, { 55,-68221 }, { 56,-68221 }, { 57,-68221 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 65,-68221 }, { 66,-68221 }, { 67,-68221 }, + { 68,-68221 }, { 69,-68221 }, { 70,-68221 }, { 71,-68221 }, { 72,-68221 }, + { 73,-68221 }, { 74,-68221 }, { 75,-68221 }, { 76,-68221 }, { 77,-68221 }, + { 78,-68221 }, { 79,-68221 }, { 80,-68221 }, { 81,-68221 }, { 82,-68221 }, + { 83,-68221 }, { 84,-68221 }, { 85,-68221 }, { 86,-68221 }, { 87,-68221 }, + { 88,-68221 }, { 89,-68221 }, { 90,-68221 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-68221 }, { 0, 0 }, { 97,-68221 }, + { 98,-68221 }, { 99,-68221 }, { 100,-68221 }, { 101,-68221 }, { 102,-68221 }, + { 103,-68221 }, { 104,-68221 }, { 105,-68221 }, { 106,-68221 }, { 107,-68221 }, + { 108,-68221 }, { 109,-68221 }, { 110,-68221 }, { 111,-68221 }, { 112,-68221 }, + + { 113,-68221 }, { 114,-68221 }, { 115,-68221 }, { 116,-68221 }, { 117,-68221 }, + { 118,-68221 }, { 119,-68221 }, { 120,-68221 }, { 121,-68221 }, { 122,-68221 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-68221 }, + { 128,-68221 }, { 129,-68221 }, { 130,-68221 }, { 131,-68221 }, { 132,-68221 }, + { 133,-68221 }, { 134,-68221 }, { 135,-68221 }, { 136,-68221 }, { 137,-68221 }, + { 138,-68221 }, { 139,-68221 }, { 140,-68221 }, { 141,-68221 }, { 142,-68221 }, + { 143,-68221 }, { 144,-68221 }, { 145,-68221 }, { 146,-68221 }, { 147,-68221 }, + { 148,-68221 }, { 149,-68221 }, { 150,-68221 }, { 151,-68221 }, { 152,-68221 }, + { 153,-68221 }, { 154,-68221 }, { 155,-68221 }, { 156,-68221 }, { 157,-68221 }, + { 158,-68221 }, { 159,-68221 }, { 160,-68221 }, { 161,-68221 }, { 162,-68221 }, + + { 163,-68221 }, { 164,-68221 }, { 165,-68221 }, { 166,-68221 }, { 167,-68221 }, + { 168,-68221 }, { 169,-68221 }, { 170,-68221 }, { 171,-68221 }, { 172,-68221 }, + { 173,-68221 }, { 174,-68221 }, { 175,-68221 }, { 176,-68221 }, { 177,-68221 }, + { 178,-68221 }, { 179,-68221 }, { 180,-68221 }, { 181,-68221 }, { 182,-68221 }, + { 183,-68221 }, { 184,-68221 }, { 185,-68221 }, { 186,-68221 }, { 187,-68221 }, + { 188,-68221 }, { 189,-68221 }, { 190,-68221 }, { 191,-68221 }, { 192,-68221 }, + { 193,-68221 }, { 194,-68221 }, { 195,-68221 }, { 196,-68221 }, { 197,-68221 }, + { 198,-68221 }, { 199,-68221 }, { 200,-68221 }, { 201,-68221 }, { 202,-68221 }, + { 203,-68221 }, { 204,-68221 }, { 205,-68221 }, { 206,-68221 }, { 207,-68221 }, + { 208,-68221 }, { 209,-68221 }, { 210,-68221 }, { 211,-68221 }, { 212,-68221 }, + + { 213,-68221 }, { 214,-68221 }, { 215,-68221 }, { 216,-68221 }, { 217,-68221 }, + { 218,-68221 }, { 219,-68221 }, { 220,-68221 }, { 221,-68221 }, { 222,-68221 }, + { 223,-68221 }, { 224,-68221 }, { 225,-68221 }, { 226,-68221 }, { 227,-68221 }, + { 228,-68221 }, { 229,-68221 }, { 230,-68221 }, { 231,-68221 }, { 232,-68221 }, + { 233,-68221 }, { 234,-68221 }, { 235,-68221 }, { 236,-68221 }, { 237,-68221 }, + { 238,-68221 }, { 239,-68221 }, { 240,-68221 }, { 241,-68221 }, { 242,-68221 }, + { 243,-68221 }, { 244,-68221 }, { 245,-68221 }, { 246,-68221 }, { 247,-68221 }, + { 248,-68221 }, { 249,-68221 }, { 250,-68221 }, { 251,-68221 }, { 252,-68221 }, + { 253,-68221 }, { 254,-68221 }, { 255,-68221 }, { 0, 49 }, { 0,23645 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-68478 }, { 49,-68478 }, { 50,-68478 }, + { 51,-68478 }, { 52,-68478 }, { 53,-68478 }, { 54,-68478 }, { 55,-68478 }, + + { 56,-68478 }, { 57,-68478 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-68478 }, + { 66,-68478 }, { 67,-68478 }, { 68,-68478 }, { 69,-68478 }, { 70,-68478 }, + { 71,-68478 }, { 72,-68478 }, { 73,-68478 }, { 74,-68478 }, { 75,-68478 }, + { 76,-68478 }, { 77,-68478 }, { 78,-68478 }, { 79,-68478 }, { 80,-68478 }, + { 81,-68478 }, { 82,-68478 }, { 83,-68478 }, { 84,-68478 }, { 85,-68478 }, + { 86,-68478 }, { 87,-68478 }, { 88,-68478 }, { 89,-68478 }, { 90,-68478 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-68478 }, + { 0, 0 }, { 97,-68478 }, { 98,-68478 }, { 99,-68478 }, { 100,-68478 }, + { 101,-68478 }, { 102,-68478 }, { 103,-68478 }, { 104,-68478 }, { 105,-68478 }, + + { 106,-68478 }, { 107,-68478 }, { 108,-68478 }, { 109,-68478 }, { 110,-68478 }, + { 111,-68478 }, { 112,-68478 }, { 113,-68478 }, { 114,-68478 }, { 115,-68478 }, + { 116,-68478 }, { 117,-68478 }, { 118,-68478 }, { 119,-68478 }, { 120,-68478 }, + { 121,-68478 }, { 122,-68478 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-68478 }, { 128,-68478 }, { 129,-68478 }, { 130,-68478 }, + { 131,-68478 }, { 132,-68478 }, { 133,-68478 }, { 134,-68478 }, { 135,-68478 }, + { 136,-68478 }, { 137,-68478 }, { 138,-68478 }, { 139,-68478 }, { 140,-68478 }, + { 141,-68478 }, { 142,-68478 }, { 143,-68478 }, { 144,-68478 }, { 145,-68478 }, + { 146,-68478 }, { 147,-68478 }, { 148,-68478 }, { 149,-68478 }, { 150,-68478 }, + { 151,-68478 }, { 152,-68478 }, { 153,-68478 }, { 154,-68478 }, { 155,-68478 }, + + { 156,-68478 }, { 157,-68478 }, { 158,-68478 }, { 159,-68478 }, { 160,-68478 }, + { 161,-68478 }, { 162,-68478 }, { 163,-68478 }, { 164,-68478 }, { 165,-68478 }, + { 166,-68478 }, { 167,-68478 }, { 168,-68478 }, { 169,-68478 }, { 170,-68478 }, + { 171,-68478 }, { 172,-68478 }, { 173,-68478 }, { 174,-68478 }, { 175,-68478 }, + { 176,-68478 }, { 177,-68478 }, { 178,-68478 }, { 179,-68478 }, { 180,-68478 }, + { 181,-68478 }, { 182,-68478 }, { 183,-68478 }, { 184,-68478 }, { 185,-68478 }, + { 186,-68478 }, { 187,-68478 }, { 188,-68478 }, { 189,-68478 }, { 190,-68478 }, + { 191,-68478 }, { 192,-68478 }, { 193,-68478 }, { 194,-68478 }, { 195,-68478 }, + { 196,-68478 }, { 197,-68478 }, { 198,-68478 }, { 199,-68478 }, { 200,-68478 }, + { 201,-68478 }, { 202,-68478 }, { 203,-68478 }, { 204,-68478 }, { 205,-68478 }, + + { 206,-68478 }, { 207,-68478 }, { 208,-68478 }, { 209,-68478 }, { 210,-68478 }, + { 211,-68478 }, { 212,-68478 }, { 213,-68478 }, { 214,-68478 }, { 215,-68478 }, + { 216,-68478 }, { 217,-68478 }, { 218,-68478 }, { 219,-68478 }, { 220,-68478 }, + { 221,-68478 }, { 222,-68478 }, { 223,-68478 }, { 224,-68478 }, { 225,-68478 }, + { 226,-68478 }, { 227,-68478 }, { 228,-68478 }, { 229,-68478 }, { 230,-68478 }, + { 231,-68478 }, { 232,-68478 }, { 233,-68478 }, { 234,-68478 }, { 235,-68478 }, + { 236,-68478 }, { 237,-68478 }, { 238,-68478 }, { 239,-68478 }, { 240,-68478 }, + { 241,-68478 }, { 242,-68478 }, { 243,-68478 }, { 244,-68478 }, { 245,-68478 }, + { 246,-68478 }, { 247,-68478 }, { 248,-68478 }, { 249,-68478 }, { 250,-68478 }, + { 251,-68478 }, { 252,-68478 }, { 253,-68478 }, { 254,-68478 }, { 255,-68478 }, + + { 0, 131 }, { 0,23388 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-68735 }, + + { 49,-68735 }, { 50,-68735 }, { 51,-68735 }, { 52,-68735 }, { 53,-68735 }, + { 54,-68735 }, { 55,-68735 }, { 56,-68735 }, { 57,-68735 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,7453 }, { 66,-68735 }, { 67,-68735 }, { 68,-68735 }, + { 69,-68735 }, { 70,-68735 }, { 71,-68735 }, { 72,-68735 }, { 73,-68735 }, + { 74,-68735 }, { 75,-68735 }, { 76,-68735 }, { 77,-68735 }, { 78,-68735 }, + { 79,-68735 }, { 80,-68735 }, { 81,-68735 }, { 82,-68735 }, { 83,-68735 }, + { 84,-68735 }, { 85,-68735 }, { 86,-68735 }, { 87,-68735 }, { 88,-68735 }, + { 89,-68735 }, { 90,-68735 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-68735 }, { 0, 0 }, { 97,7453 }, { 98,-68735 }, + + { 99,-68735 }, { 100,-68735 }, { 101,-68735 }, { 102,-68735 }, { 103,-68735 }, + { 104,-68735 }, { 105,-68735 }, { 106,-68735 }, { 107,-68735 }, { 108,-68735 }, + { 109,-68735 }, { 110,-68735 }, { 111,-68735 }, { 112,-68735 }, { 113,-68735 }, + { 114,-68735 }, { 115,-68735 }, { 116,-68735 }, { 117,-68735 }, { 118,-68735 }, + { 119,-68735 }, { 120,-68735 }, { 121,-68735 }, { 122,-68735 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-68735 }, { 128,-68735 }, + { 129,-68735 }, { 130,-68735 }, { 131,-68735 }, { 132,-68735 }, { 133,-68735 }, + { 134,-68735 }, { 135,-68735 }, { 136,-68735 }, { 137,-68735 }, { 138,-68735 }, + { 139,-68735 }, { 140,-68735 }, { 141,-68735 }, { 142,-68735 }, { 143,-68735 }, + { 144,-68735 }, { 145,-68735 }, { 146,-68735 }, { 147,-68735 }, { 148,-68735 }, + + { 149,-68735 }, { 150,-68735 }, { 151,-68735 }, { 152,-68735 }, { 153,-68735 }, + { 154,-68735 }, { 155,-68735 }, { 156,-68735 }, { 157,-68735 }, { 158,-68735 }, + { 159,-68735 }, { 160,-68735 }, { 161,-68735 }, { 162,-68735 }, { 163,-68735 }, + { 164,-68735 }, { 165,-68735 }, { 166,-68735 }, { 167,-68735 }, { 168,-68735 }, + { 169,-68735 }, { 170,-68735 }, { 171,-68735 }, { 172,-68735 }, { 173,-68735 }, + { 174,-68735 }, { 175,-68735 }, { 176,-68735 }, { 177,-68735 }, { 178,-68735 }, + { 179,-68735 }, { 180,-68735 }, { 181,-68735 }, { 182,-68735 }, { 183,-68735 }, + { 184,-68735 }, { 185,-68735 }, { 186,-68735 }, { 187,-68735 }, { 188,-68735 }, + { 189,-68735 }, { 190,-68735 }, { 191,-68735 }, { 192,-68735 }, { 193,-68735 }, + { 194,-68735 }, { 195,-68735 }, { 196,-68735 }, { 197,-68735 }, { 198,-68735 }, + + { 199,-68735 }, { 200,-68735 }, { 201,-68735 }, { 202,-68735 }, { 203,-68735 }, + { 204,-68735 }, { 205,-68735 }, { 206,-68735 }, { 207,-68735 }, { 208,-68735 }, + { 209,-68735 }, { 210,-68735 }, { 211,-68735 }, { 212,-68735 }, { 213,-68735 }, + { 214,-68735 }, { 215,-68735 }, { 216,-68735 }, { 217,-68735 }, { 218,-68735 }, + { 219,-68735 }, { 220,-68735 }, { 221,-68735 }, { 222,-68735 }, { 223,-68735 }, + { 224,-68735 }, { 225,-68735 }, { 226,-68735 }, { 227,-68735 }, { 228,-68735 }, + { 229,-68735 }, { 230,-68735 }, { 231,-68735 }, { 232,-68735 }, { 233,-68735 }, + { 234,-68735 }, { 235,-68735 }, { 236,-68735 }, { 237,-68735 }, { 238,-68735 }, + { 239,-68735 }, { 240,-68735 }, { 241,-68735 }, { 242,-68735 }, { 243,-68735 }, + { 244,-68735 }, { 245,-68735 }, { 246,-68735 }, { 247,-68735 }, { 248,-68735 }, + + { 249,-68735 }, { 250,-68735 }, { 251,-68735 }, { 252,-68735 }, { 253,-68735 }, + { 254,-68735 }, { 255,-68735 }, { 0, 131 }, { 0,23131 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-68992 }, { 49,-68992 }, { 50,-68992 }, { 51,-68992 }, + { 52,-68992 }, { 53,-68992 }, { 54,-68992 }, { 55,-68992 }, { 56,-68992 }, + { 57,-68992 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,7453 }, { 66,-68992 }, + { 67,-68992 }, { 68,-68992 }, { 69,-68992 }, { 70,-68992 }, { 71,-68992 }, + { 72,-68992 }, { 73,-68992 }, { 74,-68992 }, { 75,-68992 }, { 76,-68992 }, + { 77,-68992 }, { 78,-68992 }, { 79,-68992 }, { 80,-68992 }, { 81,-68992 }, + { 82,-68992 }, { 83,-68992 }, { 84,-68992 }, { 85,-68992 }, { 86,-68992 }, + { 87,-68992 }, { 88,-68992 }, { 89,-68992 }, { 90,-68992 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-68992 }, { 0, 0 }, + { 97,7453 }, { 98,-68992 }, { 99,-68992 }, { 100,-68992 }, { 101,-68992 }, + { 102,-68992 }, { 103,-68992 }, { 104,-68992 }, { 105,-68992 }, { 106,-68992 }, + { 107,-68992 }, { 108,-68992 }, { 109,-68992 }, { 110,-68992 }, { 111,-68992 }, + { 112,-68992 }, { 113,-68992 }, { 114,-68992 }, { 115,-68992 }, { 116,-68992 }, + { 117,-68992 }, { 118,-68992 }, { 119,-68992 }, { 120,-68992 }, { 121,-68992 }, + { 122,-68992 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-68992 }, { 128,-68992 }, { 129,-68992 }, { 130,-68992 }, { 131,-68992 }, + { 132,-68992 }, { 133,-68992 }, { 134,-68992 }, { 135,-68992 }, { 136,-68992 }, + { 137,-68992 }, { 138,-68992 }, { 139,-68992 }, { 140,-68992 }, { 141,-68992 }, + + { 142,-68992 }, { 143,-68992 }, { 144,-68992 }, { 145,-68992 }, { 146,-68992 }, + { 147,-68992 }, { 148,-68992 }, { 149,-68992 }, { 150,-68992 }, { 151,-68992 }, + { 152,-68992 }, { 153,-68992 }, { 154,-68992 }, { 155,-68992 }, { 156,-68992 }, + { 157,-68992 }, { 158,-68992 }, { 159,-68992 }, { 160,-68992 }, { 161,-68992 }, + { 162,-68992 }, { 163,-68992 }, { 164,-68992 }, { 165,-68992 }, { 166,-68992 }, + { 167,-68992 }, { 168,-68992 }, { 169,-68992 }, { 170,-68992 }, { 171,-68992 }, + { 172,-68992 }, { 173,-68992 }, { 174,-68992 }, { 175,-68992 }, { 176,-68992 }, + { 177,-68992 }, { 178,-68992 }, { 179,-68992 }, { 180,-68992 }, { 181,-68992 }, + { 182,-68992 }, { 183,-68992 }, { 184,-68992 }, { 185,-68992 }, { 186,-68992 }, + { 187,-68992 }, { 188,-68992 }, { 189,-68992 }, { 190,-68992 }, { 191,-68992 }, + + { 192,-68992 }, { 193,-68992 }, { 194,-68992 }, { 195,-68992 }, { 196,-68992 }, + { 197,-68992 }, { 198,-68992 }, { 199,-68992 }, { 200,-68992 }, { 201,-68992 }, + { 202,-68992 }, { 203,-68992 }, { 204,-68992 }, { 205,-68992 }, { 206,-68992 }, + { 207,-68992 }, { 208,-68992 }, { 209,-68992 }, { 210,-68992 }, { 211,-68992 }, + { 212,-68992 }, { 213,-68992 }, { 214,-68992 }, { 215,-68992 }, { 216,-68992 }, + { 217,-68992 }, { 218,-68992 }, { 219,-68992 }, { 220,-68992 }, { 221,-68992 }, + { 222,-68992 }, { 223,-68992 }, { 224,-68992 }, { 225,-68992 }, { 226,-68992 }, + { 227,-68992 }, { 228,-68992 }, { 229,-68992 }, { 230,-68992 }, { 231,-68992 }, + { 232,-68992 }, { 233,-68992 }, { 234,-68992 }, { 235,-68992 }, { 236,-68992 }, + { 237,-68992 }, { 238,-68992 }, { 239,-68992 }, { 240,-68992 }, { 241,-68992 }, + + { 242,-68992 }, { 243,-68992 }, { 244,-68992 }, { 245,-68992 }, { 246,-68992 }, + { 247,-68992 }, { 248,-68992 }, { 249,-68992 }, { 250,-68992 }, { 251,-68992 }, + { 252,-68992 }, { 253,-68992 }, { 254,-68992 }, { 255,-68992 }, { 0, 131 }, + { 0,22874 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-69249 }, { 49,-69249 }, + { 50,-69249 }, { 51,-69249 }, { 52,-69249 }, { 53,-69249 }, { 54,-69249 }, + { 55,-69249 }, { 56,-69249 }, { 57,-69249 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-69249 }, { 66,-69249 }, { 67,7453 }, { 68,-69249 }, { 69,-69249 }, + { 70,-69249 }, { 71,-69249 }, { 72,-69249 }, { 73,-69249 }, { 74,-69249 }, + { 75,-69249 }, { 76,-69249 }, { 77,-69249 }, { 78,-69249 }, { 79,-69249 }, + { 80,-69249 }, { 81,-69249 }, { 82,-69249 }, { 83,-69249 }, { 84,-69249 }, + + { 85,-69249 }, { 86,-69249 }, { 87,-69249 }, { 88,-69249 }, { 89,-69249 }, + { 90,-69249 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-69249 }, { 0, 0 }, { 97,-69249 }, { 98,-69249 }, { 99,7453 }, + { 100,-69249 }, { 101,-69249 }, { 102,-69249 }, { 103,-69249 }, { 104,-69249 }, + { 105,-69249 }, { 106,-69249 }, { 107,-69249 }, { 108,-69249 }, { 109,-69249 }, + { 110,-69249 }, { 111,-69249 }, { 112,-69249 }, { 113,-69249 }, { 114,-69249 }, + { 115,-69249 }, { 116,-69249 }, { 117,-69249 }, { 118,-69249 }, { 119,-69249 }, + { 120,-69249 }, { 121,-69249 }, { 122,-69249 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-69249 }, { 128,-69249 }, { 129,-69249 }, + { 130,-69249 }, { 131,-69249 }, { 132,-69249 }, { 133,-69249 }, { 134,-69249 }, + + { 135,-69249 }, { 136,-69249 }, { 137,-69249 }, { 138,-69249 }, { 139,-69249 }, + { 140,-69249 }, { 141,-69249 }, { 142,-69249 }, { 143,-69249 }, { 144,-69249 }, + { 145,-69249 }, { 146,-69249 }, { 147,-69249 }, { 148,-69249 }, { 149,-69249 }, + { 150,-69249 }, { 151,-69249 }, { 152,-69249 }, { 153,-69249 }, { 154,-69249 }, + { 155,-69249 }, { 156,-69249 }, { 157,-69249 }, { 158,-69249 }, { 159,-69249 }, + { 160,-69249 }, { 161,-69249 }, { 162,-69249 }, { 163,-69249 }, { 164,-69249 }, + { 165,-69249 }, { 166,-69249 }, { 167,-69249 }, { 168,-69249 }, { 169,-69249 }, + { 170,-69249 }, { 171,-69249 }, { 172,-69249 }, { 173,-69249 }, { 174,-69249 }, + { 175,-69249 }, { 176,-69249 }, { 177,-69249 }, { 178,-69249 }, { 179,-69249 }, + { 180,-69249 }, { 181,-69249 }, { 182,-69249 }, { 183,-69249 }, { 184,-69249 }, + + { 185,-69249 }, { 186,-69249 }, { 187,-69249 }, { 188,-69249 }, { 189,-69249 }, + { 190,-69249 }, { 191,-69249 }, { 192,-69249 }, { 193,-69249 }, { 194,-69249 }, + { 195,-69249 }, { 196,-69249 }, { 197,-69249 }, { 198,-69249 }, { 199,-69249 }, + { 200,-69249 }, { 201,-69249 }, { 202,-69249 }, { 203,-69249 }, { 204,-69249 }, + { 205,-69249 }, { 206,-69249 }, { 207,-69249 }, { 208,-69249 }, { 209,-69249 }, + { 210,-69249 }, { 211,-69249 }, { 212,-69249 }, { 213,-69249 }, { 214,-69249 }, + { 215,-69249 }, { 216,-69249 }, { 217,-69249 }, { 218,-69249 }, { 219,-69249 }, + { 220,-69249 }, { 221,-69249 }, { 222,-69249 }, { 223,-69249 }, { 224,-69249 }, + { 225,-69249 }, { 226,-69249 }, { 227,-69249 }, { 228,-69249 }, { 229,-69249 }, + { 230,-69249 }, { 231,-69249 }, { 232,-69249 }, { 233,-69249 }, { 234,-69249 }, + + { 235,-69249 }, { 236,-69249 }, { 237,-69249 }, { 238,-69249 }, { 239,-69249 }, + { 240,-69249 }, { 241,-69249 }, { 242,-69249 }, { 243,-69249 }, { 244,-69249 }, + { 245,-69249 }, { 246,-69249 }, { 247,-69249 }, { 248,-69249 }, { 249,-69249 }, + { 250,-69249 }, { 251,-69249 }, { 252,-69249 }, { 253,-69249 }, { 254,-69249 }, + { 255,-69249 }, { 0, 131 }, { 0,22617 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-69506 }, { 49,-69506 }, { 50,-69506 }, { 51,-69506 }, { 52,-69506 }, + { 53,-69506 }, { 54,-69506 }, { 55,-69506 }, { 56,-69506 }, { 57,-69506 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-69506 }, { 66,-69506 }, { 67,-69506 }, + { 68,-69506 }, { 69,7453 }, { 70,-69506 }, { 71,-69506 }, { 72,-69506 }, + { 73,-69506 }, { 74,-69506 }, { 75,-69506 }, { 76,-69506 }, { 77,-69506 }, + + { 78,-69506 }, { 79,-69506 }, { 80,-69506 }, { 81,-69506 }, { 82,-69506 }, + { 83,-69506 }, { 84,-69506 }, { 85,-69506 }, { 86,-69506 }, { 87,-69506 }, + { 88,-69506 }, { 89,-69506 }, { 90,-69506 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-69506 }, { 0, 0 }, { 97,-69506 }, + { 98,-69506 }, { 99,-69506 }, { 100,-69506 }, { 101,7453 }, { 102,-69506 }, + { 103,-69506 }, { 104,-69506 }, { 105,-69506 }, { 106,-69506 }, { 107,-69506 }, + { 108,-69506 }, { 109,-69506 }, { 110,-69506 }, { 111,-69506 }, { 112,-69506 }, + { 113,-69506 }, { 114,-69506 }, { 115,-69506 }, { 116,-69506 }, { 117,-69506 }, + { 118,-69506 }, { 119,-69506 }, { 120,-69506 }, { 121,-69506 }, { 122,-69506 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-69506 }, + + { 128,-69506 }, { 129,-69506 }, { 130,-69506 }, { 131,-69506 }, { 132,-69506 }, + { 133,-69506 }, { 134,-69506 }, { 135,-69506 }, { 136,-69506 }, { 137,-69506 }, + { 138,-69506 }, { 139,-69506 }, { 140,-69506 }, { 141,-69506 }, { 142,-69506 }, + { 143,-69506 }, { 144,-69506 }, { 145,-69506 }, { 146,-69506 }, { 147,-69506 }, + { 148,-69506 }, { 149,-69506 }, { 150,-69506 }, { 151,-69506 }, { 152,-69506 }, + { 153,-69506 }, { 154,-69506 }, { 155,-69506 }, { 156,-69506 }, { 157,-69506 }, + { 158,-69506 }, { 159,-69506 }, { 160,-69506 }, { 161,-69506 }, { 162,-69506 }, + { 163,-69506 }, { 164,-69506 }, { 165,-69506 }, { 166,-69506 }, { 167,-69506 }, + { 168,-69506 }, { 169,-69506 }, { 170,-69506 }, { 171,-69506 }, { 172,-69506 }, + { 173,-69506 }, { 174,-69506 }, { 175,-69506 }, { 176,-69506 }, { 177,-69506 }, + + { 178,-69506 }, { 179,-69506 }, { 180,-69506 }, { 181,-69506 }, { 182,-69506 }, + { 183,-69506 }, { 184,-69506 }, { 185,-69506 }, { 186,-69506 }, { 187,-69506 }, + { 188,-69506 }, { 189,-69506 }, { 190,-69506 }, { 191,-69506 }, { 192,-69506 }, + { 193,-69506 }, { 194,-69506 }, { 195,-69506 }, { 196,-69506 }, { 197,-69506 }, + { 198,-69506 }, { 199,-69506 }, { 200,-69506 }, { 201,-69506 }, { 202,-69506 }, + { 203,-69506 }, { 204,-69506 }, { 205,-69506 }, { 206,-69506 }, { 207,-69506 }, + { 208,-69506 }, { 209,-69506 }, { 210,-69506 }, { 211,-69506 }, { 212,-69506 }, + { 213,-69506 }, { 214,-69506 }, { 215,-69506 }, { 216,-69506 }, { 217,-69506 }, + { 218,-69506 }, { 219,-69506 }, { 220,-69506 }, { 221,-69506 }, { 222,-69506 }, + { 223,-69506 }, { 224,-69506 }, { 225,-69506 }, { 226,-69506 }, { 227,-69506 }, + + { 228,-69506 }, { 229,-69506 }, { 230,-69506 }, { 231,-69506 }, { 232,-69506 }, + { 233,-69506 }, { 234,-69506 }, { 235,-69506 }, { 236,-69506 }, { 237,-69506 }, + { 238,-69506 }, { 239,-69506 }, { 240,-69506 }, { 241,-69506 }, { 242,-69506 }, + { 243,-69506 }, { 244,-69506 }, { 245,-69506 }, { 246,-69506 }, { 247,-69506 }, + { 248,-69506 }, { 249,-69506 }, { 250,-69506 }, { 251,-69506 }, { 252,-69506 }, + { 253,-69506 }, { 254,-69506 }, { 255,-69506 }, { 0, 74 }, { 0,22360 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-69763 }, { 49,-69763 }, { 50,-69763 }, + { 51,-69763 }, { 52,-69763 }, { 53,-69763 }, { 54,-69763 }, { 55,-69763 }, + { 56,-69763 }, { 57,-69763 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-69763 }, + { 66,-69763 }, { 67,-69763 }, { 68,-69763 }, { 69,-69763 }, { 70,-69763 }, + + { 71,-69763 }, { 72,-69763 }, { 73,-69763 }, { 74,-69763 }, { 75,-69763 }, + { 76,-69763 }, { 77,-69763 }, { 78,-69763 }, { 79,-69763 }, { 80,-69763 }, + { 81,-69763 }, { 82,-69763 }, { 83,-69763 }, { 84,-69763 }, { 85,-69763 }, + { 86,-69763 }, { 87,-69763 }, { 88,-69763 }, { 89,-69763 }, { 90,-69763 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-69763 }, + { 0, 0 }, { 97,-69763 }, { 98,-69763 }, { 99,-69763 }, { 100,-69763 }, + { 101,-69763 }, { 102,-69763 }, { 103,-69763 }, { 104,-69763 }, { 105,-69763 }, + { 106,-69763 }, { 107,-69763 }, { 108,-69763 }, { 109,-69763 }, { 110,-69763 }, + { 111,-69763 }, { 112,-69763 }, { 113,-69763 }, { 114,-69763 }, { 115,-69763 }, + { 116,-69763 }, { 117,-69763 }, { 118,-69763 }, { 119,-69763 }, { 120,-69763 }, + + { 121,-69763 }, { 122,-69763 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-69763 }, { 128,-69763 }, { 129,-69763 }, { 130,-69763 }, + { 131,-69763 }, { 132,-69763 }, { 133,-69763 }, { 134,-69763 }, { 135,-69763 }, + { 136,-69763 }, { 137,-69763 }, { 138,-69763 }, { 139,-69763 }, { 140,-69763 }, + { 141,-69763 }, { 142,-69763 }, { 143,-69763 }, { 144,-69763 }, { 145,-69763 }, + { 146,-69763 }, { 147,-69763 }, { 148,-69763 }, { 149,-69763 }, { 150,-69763 }, + { 151,-69763 }, { 152,-69763 }, { 153,-69763 }, { 154,-69763 }, { 155,-69763 }, + { 156,-69763 }, { 157,-69763 }, { 158,-69763 }, { 159,-69763 }, { 160,-69763 }, + { 161,-69763 }, { 162,-69763 }, { 163,-69763 }, { 164,-69763 }, { 165,-69763 }, + { 166,-69763 }, { 167,-69763 }, { 168,-69763 }, { 169,-69763 }, { 170,-69763 }, + + { 171,-69763 }, { 172,-69763 }, { 173,-69763 }, { 174,-69763 }, { 175,-69763 }, + { 176,-69763 }, { 177,-69763 }, { 178,-69763 }, { 179,-69763 }, { 180,-69763 }, + { 181,-69763 }, { 182,-69763 }, { 183,-69763 }, { 184,-69763 }, { 185,-69763 }, + { 186,-69763 }, { 187,-69763 }, { 188,-69763 }, { 189,-69763 }, { 190,-69763 }, + { 191,-69763 }, { 192,-69763 }, { 193,-69763 }, { 194,-69763 }, { 195,-69763 }, + { 196,-69763 }, { 197,-69763 }, { 198,-69763 }, { 199,-69763 }, { 200,-69763 }, + { 201,-69763 }, { 202,-69763 }, { 203,-69763 }, { 204,-69763 }, { 205,-69763 }, + { 206,-69763 }, { 207,-69763 }, { 208,-69763 }, { 209,-69763 }, { 210,-69763 }, + { 211,-69763 }, { 212,-69763 }, { 213,-69763 }, { 214,-69763 }, { 215,-69763 }, + { 216,-69763 }, { 217,-69763 }, { 218,-69763 }, { 219,-69763 }, { 220,-69763 }, + + { 221,-69763 }, { 222,-69763 }, { 223,-69763 }, { 224,-69763 }, { 225,-69763 }, + { 226,-69763 }, { 227,-69763 }, { 228,-69763 }, { 229,-69763 }, { 230,-69763 }, + { 231,-69763 }, { 232,-69763 }, { 233,-69763 }, { 234,-69763 }, { 235,-69763 }, + { 236,-69763 }, { 237,-69763 }, { 238,-69763 }, { 239,-69763 }, { 240,-69763 }, + { 241,-69763 }, { 242,-69763 }, { 243,-69763 }, { 244,-69763 }, { 245,-69763 }, + { 246,-69763 }, { 247,-69763 }, { 248,-69763 }, { 249,-69763 }, { 250,-69763 }, + { 251,-69763 }, { 252,-69763 }, { 253,-69763 }, { 254,-69763 }, { 255,-69763 }, + { 0, 91 }, { 0,22103 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-70020 }, + { 49,-70020 }, { 50,-70020 }, { 51,-70020 }, { 52,-70020 }, { 53,-70020 }, + { 54,-70020 }, { 55,-70020 }, { 56,-70020 }, { 57,-70020 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 65,-70020 }, { 66,-70020 }, { 67,-70020 }, { 68,-70020 }, + { 69,-70020 }, { 70,-70020 }, { 71,-70020 }, { 72,-70020 }, { 73,-70020 }, + { 74,-70020 }, { 75,-70020 }, { 76,-70020 }, { 77,-70020 }, { 78,-70020 }, + { 79,-70020 }, { 80,-70020 }, { 81,-70020 }, { 82,-70020 }, { 83,-70020 }, + { 84,-70020 }, { 85,-70020 }, { 86,-70020 }, { 87,-70020 }, { 88,-70020 }, + { 89,-70020 }, { 90,-70020 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-70020 }, { 0, 0 }, { 97,-70020 }, { 98,-70020 }, + { 99,-70020 }, { 100,-70020 }, { 101,-70020 }, { 102,-70020 }, { 103,-70020 }, + { 104,-70020 }, { 105,-70020 }, { 106,-70020 }, { 107,-70020 }, { 108,-70020 }, + { 109,-70020 }, { 110,-70020 }, { 111,-70020 }, { 112,-70020 }, { 113,-70020 }, + + { 114,-70020 }, { 115,-70020 }, { 116,-70020 }, { 117,-70020 }, { 118,-70020 }, + { 119,-70020 }, { 120,-70020 }, { 121,-70020 }, { 122,-70020 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-70020 }, { 128,-70020 }, + { 129,-70020 }, { 130,-70020 }, { 131,-70020 }, { 132,-70020 }, { 133,-70020 }, + { 134,-70020 }, { 135,-70020 }, { 136,-70020 }, { 137,-70020 }, { 138,-70020 }, + { 139,-70020 }, { 140,-70020 }, { 141,-70020 }, { 142,-70020 }, { 143,-70020 }, + { 144,-70020 }, { 145,-70020 }, { 146,-70020 }, { 147,-70020 }, { 148,-70020 }, + { 149,-70020 }, { 150,-70020 }, { 151,-70020 }, { 152,-70020 }, { 153,-70020 }, + { 154,-70020 }, { 155,-70020 }, { 156,-70020 }, { 157,-70020 }, { 158,-70020 }, + { 159,-70020 }, { 160,-70020 }, { 161,-70020 }, { 162,-70020 }, { 163,-70020 }, + + { 164,-70020 }, { 165,-70020 }, { 166,-70020 }, { 167,-70020 }, { 168,-70020 }, + { 169,-70020 }, { 170,-70020 }, { 171,-70020 }, { 172,-70020 }, { 173,-70020 }, + { 174,-70020 }, { 175,-70020 }, { 176,-70020 }, { 177,-70020 }, { 178,-70020 }, + { 179,-70020 }, { 180,-70020 }, { 181,-70020 }, { 182,-70020 }, { 183,-70020 }, + { 184,-70020 }, { 185,-70020 }, { 186,-70020 }, { 187,-70020 }, { 188,-70020 }, + { 189,-70020 }, { 190,-70020 }, { 191,-70020 }, { 192,-70020 }, { 193,-70020 }, + { 194,-70020 }, { 195,-70020 }, { 196,-70020 }, { 197,-70020 }, { 198,-70020 }, + { 199,-70020 }, { 200,-70020 }, { 201,-70020 }, { 202,-70020 }, { 203,-70020 }, + { 204,-70020 }, { 205,-70020 }, { 206,-70020 }, { 207,-70020 }, { 208,-70020 }, + { 209,-70020 }, { 210,-70020 }, { 211,-70020 }, { 212,-70020 }, { 213,-70020 }, + + { 214,-70020 }, { 215,-70020 }, { 216,-70020 }, { 217,-70020 }, { 218,-70020 }, + { 219,-70020 }, { 220,-70020 }, { 221,-70020 }, { 222,-70020 }, { 223,-70020 }, + { 224,-70020 }, { 225,-70020 }, { 226,-70020 }, { 227,-70020 }, { 228,-70020 }, + { 229,-70020 }, { 230,-70020 }, { 231,-70020 }, { 232,-70020 }, { 233,-70020 }, + { 234,-70020 }, { 235,-70020 }, { 236,-70020 }, { 237,-70020 }, { 238,-70020 }, + { 239,-70020 }, { 240,-70020 }, { 241,-70020 }, { 242,-70020 }, { 243,-70020 }, + { 244,-70020 }, { 245,-70020 }, { 246,-70020 }, { 247,-70020 }, { 248,-70020 }, + { 249,-70020 }, { 250,-70020 }, { 251,-70020 }, { 252,-70020 }, { 253,-70020 }, + { 254,-70020 }, { 255,-70020 }, { 0, 41 }, { 0,21846 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-70277 }, { 49,-70277 }, { 50,-70277 }, { 51,-70277 }, + { 52,-70277 }, { 53,-70277 }, { 54,-70277 }, { 55,-70277 }, { 56,-70277 }, + + { 57,-70277 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-70277 }, { 66,-70277 }, + { 67,-70277 }, { 68,-70277 }, { 69,-70277 }, { 70,-70277 }, { 71,-70277 }, + { 72,-70277 }, { 73,-70277 }, { 74,-70277 }, { 75,-70277 }, { 76,-70277 }, + { 77,-70277 }, { 78,-70277 }, { 79,-70277 }, { 80,-70277 }, { 81,-70277 }, + { 82,-70277 }, { 83,-70277 }, { 84,-70277 }, { 85,-70277 }, { 86,-70277 }, + { 87,-70277 }, { 88,-70277 }, { 89,-70277 }, { 90,-70277 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-70277 }, { 0, 0 }, + { 97,-70277 }, { 98,-70277 }, { 99,-70277 }, { 100,-70277 }, { 101,-70277 }, + { 102,-70277 }, { 103,-70277 }, { 104,-70277 }, { 105,-70277 }, { 106,-70277 }, + + { 107,-70277 }, { 108,-70277 }, { 109,-70277 }, { 110,-70277 }, { 111,-70277 }, + { 112,-70277 }, { 113,-70277 }, { 114,-70277 }, { 115,-70277 }, { 116,-70277 }, + { 117,-70277 }, { 118,-70277 }, { 119,-70277 }, { 120,-70277 }, { 121,-70277 }, + { 122,-70277 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-70277 }, { 128,-70277 }, { 129,-70277 }, { 130,-70277 }, { 131,-70277 }, + { 132,-70277 }, { 133,-70277 }, { 134,-70277 }, { 135,-70277 }, { 136,-70277 }, + { 137,-70277 }, { 138,-70277 }, { 139,-70277 }, { 140,-70277 }, { 141,-70277 }, + { 142,-70277 }, { 143,-70277 }, { 144,-70277 }, { 145,-70277 }, { 146,-70277 }, + { 147,-70277 }, { 148,-70277 }, { 149,-70277 }, { 150,-70277 }, { 151,-70277 }, + { 152,-70277 }, { 153,-70277 }, { 154,-70277 }, { 155,-70277 }, { 156,-70277 }, + + { 157,-70277 }, { 158,-70277 }, { 159,-70277 }, { 160,-70277 }, { 161,-70277 }, + { 162,-70277 }, { 163,-70277 }, { 164,-70277 }, { 165,-70277 }, { 166,-70277 }, + { 167,-70277 }, { 168,-70277 }, { 169,-70277 }, { 170,-70277 }, { 171,-70277 }, + { 172,-70277 }, { 173,-70277 }, { 174,-70277 }, { 175,-70277 }, { 176,-70277 }, + { 177,-70277 }, { 178,-70277 }, { 179,-70277 }, { 180,-70277 }, { 181,-70277 }, + { 182,-70277 }, { 183,-70277 }, { 184,-70277 }, { 185,-70277 }, { 186,-70277 }, + { 187,-70277 }, { 188,-70277 }, { 189,-70277 }, { 190,-70277 }, { 191,-70277 }, + { 192,-70277 }, { 193,-70277 }, { 194,-70277 }, { 195,-70277 }, { 196,-70277 }, + { 197,-70277 }, { 198,-70277 }, { 199,-70277 }, { 200,-70277 }, { 201,-70277 }, + { 202,-70277 }, { 203,-70277 }, { 204,-70277 }, { 205,-70277 }, { 206,-70277 }, + + { 207,-70277 }, { 208,-70277 }, { 209,-70277 }, { 210,-70277 }, { 211,-70277 }, + { 212,-70277 }, { 213,-70277 }, { 214,-70277 }, { 215,-70277 }, { 216,-70277 }, + { 217,-70277 }, { 218,-70277 }, { 219,-70277 }, { 220,-70277 }, { 221,-70277 }, + { 222,-70277 }, { 223,-70277 }, { 224,-70277 }, { 225,-70277 }, { 226,-70277 }, + { 227,-70277 }, { 228,-70277 }, { 229,-70277 }, { 230,-70277 }, { 231,-70277 }, + { 232,-70277 }, { 233,-70277 }, { 234,-70277 }, { 235,-70277 }, { 236,-70277 }, + { 237,-70277 }, { 238,-70277 }, { 239,-70277 }, { 240,-70277 }, { 241,-70277 }, + { 242,-70277 }, { 243,-70277 }, { 244,-70277 }, { 245,-70277 }, { 246,-70277 }, + { 247,-70277 }, { 248,-70277 }, { 249,-70277 }, { 250,-70277 }, { 251,-70277 }, + { 252,-70277 }, { 253,-70277 }, { 254,-70277 }, { 255,-70277 }, { 0, 131 }, + + { 0,21589 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-70534 }, { 49,-70534 }, + + { 50,-70534 }, { 51,-70534 }, { 52,-70534 }, { 53,-70534 }, { 54,-70534 }, + { 55,-70534 }, { 56,-70534 }, { 57,-70534 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-70534 }, { 66,-70534 }, { 67,-70534 }, { 68,-70534 }, { 69,-70534 }, + { 70,-70534 }, { 71,-70534 }, { 72,-70534 }, { 73,-70534 }, { 74,-70534 }, + { 75,-70534 }, { 76,-70534 }, { 77,-70534 }, { 78,6682 }, { 79,-70534 }, + { 80,-70534 }, { 81,-70534 }, { 82,-70534 }, { 83,-70534 }, { 84,-70534 }, + { 85,-70534 }, { 86,-70534 }, { 87,-70534 }, { 88,-70534 }, { 89,-70534 }, + { 90,-70534 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-70534 }, { 0, 0 }, { 97,-70534 }, { 98,-70534 }, { 99,-70534 }, + + { 100,-70534 }, { 101,-70534 }, { 102,-70534 }, { 103,-70534 }, { 104,-70534 }, + { 105,-70534 }, { 106,-70534 }, { 107,-70534 }, { 108,-70534 }, { 109,-70534 }, + { 110,6682 }, { 111,-70534 }, { 112,-70534 }, { 113,-70534 }, { 114,-70534 }, + { 115,-70534 }, { 116,-70534 }, { 117,-70534 }, { 118,-70534 }, { 119,-70534 }, + { 120,-70534 }, { 121,-70534 }, { 122,-70534 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-70534 }, { 128,-70534 }, { 129,-70534 }, + { 130,-70534 }, { 131,-70534 }, { 132,-70534 }, { 133,-70534 }, { 134,-70534 }, + { 135,-70534 }, { 136,-70534 }, { 137,-70534 }, { 138,-70534 }, { 139,-70534 }, + { 140,-70534 }, { 141,-70534 }, { 142,-70534 }, { 143,-70534 }, { 144,-70534 }, + { 145,-70534 }, { 146,-70534 }, { 147,-70534 }, { 148,-70534 }, { 149,-70534 }, + + { 150,-70534 }, { 151,-70534 }, { 152,-70534 }, { 153,-70534 }, { 154,-70534 }, + { 155,-70534 }, { 156,-70534 }, { 157,-70534 }, { 158,-70534 }, { 159,-70534 }, + { 160,-70534 }, { 161,-70534 }, { 162,-70534 }, { 163,-70534 }, { 164,-70534 }, + { 165,-70534 }, { 166,-70534 }, { 167,-70534 }, { 168,-70534 }, { 169,-70534 }, + { 170,-70534 }, { 171,-70534 }, { 172,-70534 }, { 173,-70534 }, { 174,-70534 }, + { 175,-70534 }, { 176,-70534 }, { 177,-70534 }, { 178,-70534 }, { 179,-70534 }, + { 180,-70534 }, { 181,-70534 }, { 182,-70534 }, { 183,-70534 }, { 184,-70534 }, + { 185,-70534 }, { 186,-70534 }, { 187,-70534 }, { 188,-70534 }, { 189,-70534 }, + { 190,-70534 }, { 191,-70534 }, { 192,-70534 }, { 193,-70534 }, { 194,-70534 }, + { 195,-70534 }, { 196,-70534 }, { 197,-70534 }, { 198,-70534 }, { 199,-70534 }, + + { 200,-70534 }, { 201,-70534 }, { 202,-70534 }, { 203,-70534 }, { 204,-70534 }, + { 205,-70534 }, { 206,-70534 }, { 207,-70534 }, { 208,-70534 }, { 209,-70534 }, + { 210,-70534 }, { 211,-70534 }, { 212,-70534 }, { 213,-70534 }, { 214,-70534 }, + { 215,-70534 }, { 216,-70534 }, { 217,-70534 }, { 218,-70534 }, { 219,-70534 }, + { 220,-70534 }, { 221,-70534 }, { 222,-70534 }, { 223,-70534 }, { 224,-70534 }, + { 225,-70534 }, { 226,-70534 }, { 227,-70534 }, { 228,-70534 }, { 229,-70534 }, + { 230,-70534 }, { 231,-70534 }, { 232,-70534 }, { 233,-70534 }, { 234,-70534 }, + { 235,-70534 }, { 236,-70534 }, { 237,-70534 }, { 238,-70534 }, { 239,-70534 }, + { 240,-70534 }, { 241,-70534 }, { 242,-70534 }, { 243,-70534 }, { 244,-70534 }, + { 245,-70534 }, { 246,-70534 }, { 247,-70534 }, { 248,-70534 }, { 249,-70534 }, + + { 250,-70534 }, { 251,-70534 }, { 252,-70534 }, { 253,-70534 }, { 254,-70534 }, + { 255,-70534 }, { 0, 131 }, { 0,21332 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-70791 }, { 49,-70791 }, { 50,-70791 }, { 51,-70791 }, { 52,-70791 }, + { 53,-70791 }, { 54,-70791 }, { 55,-70791 }, { 56,-70791 }, { 57,-70791 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-70791 }, { 66,-70791 }, { 67,-70791 }, + { 68,-70791 }, { 69,-70791 }, { 70,-70791 }, { 71,-70791 }, { 72,-70791 }, + { 73,-70791 }, { 74,-70791 }, { 75,-70791 }, { 76,-70791 }, { 77,-70791 }, + { 78,6682 }, { 79,-70791 }, { 80,-70791 }, { 81,-70791 }, { 82,-70791 }, + { 83,-70791 }, { 84,-70791 }, { 85,-70791 }, { 86,-70791 }, { 87,-70791 }, + { 88,-70791 }, { 89,-70791 }, { 90,-70791 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 95,-70791 }, { 0, 0 }, { 97,-70791 }, + { 98,-70791 }, { 99,-70791 }, { 100,-70791 }, { 101,-70791 }, { 102,-70791 }, + { 103,-70791 }, { 104,-70791 }, { 105,-70791 }, { 106,-70791 }, { 107,-70791 }, + { 108,-70791 }, { 109,-70791 }, { 110,6682 }, { 111,-70791 }, { 112,-70791 }, + { 113,-70791 }, { 114,-70791 }, { 115,-70791 }, { 116,-70791 }, { 117,-70791 }, + { 118,-70791 }, { 119,-70791 }, { 120,-70791 }, { 121,-70791 }, { 122,-70791 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-70791 }, + { 128,-70791 }, { 129,-70791 }, { 130,-70791 }, { 131,-70791 }, { 132,-70791 }, + { 133,-70791 }, { 134,-70791 }, { 135,-70791 }, { 136,-70791 }, { 137,-70791 }, + { 138,-70791 }, { 139,-70791 }, { 140,-70791 }, { 141,-70791 }, { 142,-70791 }, + + { 143,-70791 }, { 144,-70791 }, { 145,-70791 }, { 146,-70791 }, { 147,-70791 }, + { 148,-70791 }, { 149,-70791 }, { 150,-70791 }, { 151,-70791 }, { 152,-70791 }, + { 153,-70791 }, { 154,-70791 }, { 155,-70791 }, { 156,-70791 }, { 157,-70791 }, + { 158,-70791 }, { 159,-70791 }, { 160,-70791 }, { 161,-70791 }, { 162,-70791 }, + { 163,-70791 }, { 164,-70791 }, { 165,-70791 }, { 166,-70791 }, { 167,-70791 }, + { 168,-70791 }, { 169,-70791 }, { 170,-70791 }, { 171,-70791 }, { 172,-70791 }, + { 173,-70791 }, { 174,-70791 }, { 175,-70791 }, { 176,-70791 }, { 177,-70791 }, + { 178,-70791 }, { 179,-70791 }, { 180,-70791 }, { 181,-70791 }, { 182,-70791 }, + { 183,-70791 }, { 184,-70791 }, { 185,-70791 }, { 186,-70791 }, { 187,-70791 }, + { 188,-70791 }, { 189,-70791 }, { 190,-70791 }, { 191,-70791 }, { 192,-70791 }, + + { 193,-70791 }, { 194,-70791 }, { 195,-70791 }, { 196,-70791 }, { 197,-70791 }, + { 198,-70791 }, { 199,-70791 }, { 200,-70791 }, { 201,-70791 }, { 202,-70791 }, + { 203,-70791 }, { 204,-70791 }, { 205,-70791 }, { 206,-70791 }, { 207,-70791 }, + { 208,-70791 }, { 209,-70791 }, { 210,-70791 }, { 211,-70791 }, { 212,-70791 }, + { 213,-70791 }, { 214,-70791 }, { 215,-70791 }, { 216,-70791 }, { 217,-70791 }, + { 218,-70791 }, { 219,-70791 }, { 220,-70791 }, { 221,-70791 }, { 222,-70791 }, + { 223,-70791 }, { 224,-70791 }, { 225,-70791 }, { 226,-70791 }, { 227,-70791 }, + { 228,-70791 }, { 229,-70791 }, { 230,-70791 }, { 231,-70791 }, { 232,-70791 }, + { 233,-70791 }, { 234,-70791 }, { 235,-70791 }, { 236,-70791 }, { 237,-70791 }, + { 238,-70791 }, { 239,-70791 }, { 240,-70791 }, { 241,-70791 }, { 242,-70791 }, + + { 243,-70791 }, { 244,-70791 }, { 245,-70791 }, { 246,-70791 }, { 247,-70791 }, + { 248,-70791 }, { 249,-70791 }, { 250,-70791 }, { 251,-70791 }, { 252,-70791 }, + { 253,-70791 }, { 254,-70791 }, { 255,-70791 }, { 0, 18 }, { 0,21075 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-71048 }, { 49,-71048 }, { 50,-71048 }, + { 51,-71048 }, { 52,-71048 }, { 53,-71048 }, { 54,-71048 }, { 55,-71048 }, + { 56,-71048 }, { 57,-71048 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-71048 }, + { 66,-71048 }, { 67,-71048 }, { 68,-71048 }, { 69,-71048 }, { 70,-71048 }, + { 71,-71048 }, { 72,-71048 }, { 73,-71048 }, { 74,-71048 }, { 75,-71048 }, + { 76,-71048 }, { 77,-71048 }, { 78,-71048 }, { 79,-71048 }, { 80,-71048 }, + { 81,-71048 }, { 82,-71048 }, { 83,-71048 }, { 84,-71048 }, { 85,-71048 }, + + { 86,-71048 }, { 87,-71048 }, { 88,-71048 }, { 89,-71048 }, { 90,-71048 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,6682 }, + { 0, 0 }, { 97,-71048 }, { 98,-71048 }, { 99,-71048 }, { 100,-71048 }, + { 101,-71048 }, { 102,-71048 }, { 103,-71048 }, { 104,-71048 }, { 105,-71048 }, + { 106,-71048 }, { 107,-71048 }, { 108,-71048 }, { 109,-71048 }, { 110,-71048 }, + { 111,-71048 }, { 112,-71048 }, { 113,-71048 }, { 114,-71048 }, { 115,-71048 }, + { 116,-71048 }, { 117,-71048 }, { 118,-71048 }, { 119,-71048 }, { 120,-71048 }, + { 121,-71048 }, { 122,-71048 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-71048 }, { 128,-71048 }, { 129,-71048 }, { 130,-71048 }, + { 131,-71048 }, { 132,-71048 }, { 133,-71048 }, { 134,-71048 }, { 135,-71048 }, + + { 136,-71048 }, { 137,-71048 }, { 138,-71048 }, { 139,-71048 }, { 140,-71048 }, + { 141,-71048 }, { 142,-71048 }, { 143,-71048 }, { 144,-71048 }, { 145,-71048 }, + { 146,-71048 }, { 147,-71048 }, { 148,-71048 }, { 149,-71048 }, { 150,-71048 }, + { 151,-71048 }, { 152,-71048 }, { 153,-71048 }, { 154,-71048 }, { 155,-71048 }, + { 156,-71048 }, { 157,-71048 }, { 158,-71048 }, { 159,-71048 }, { 160,-71048 }, + { 161,-71048 }, { 162,-71048 }, { 163,-71048 }, { 164,-71048 }, { 165,-71048 }, + { 166,-71048 }, { 167,-71048 }, { 168,-71048 }, { 169,-71048 }, { 170,-71048 }, + { 171,-71048 }, { 172,-71048 }, { 173,-71048 }, { 174,-71048 }, { 175,-71048 }, + { 176,-71048 }, { 177,-71048 }, { 178,-71048 }, { 179,-71048 }, { 180,-71048 }, + { 181,-71048 }, { 182,-71048 }, { 183,-71048 }, { 184,-71048 }, { 185,-71048 }, + + { 186,-71048 }, { 187,-71048 }, { 188,-71048 }, { 189,-71048 }, { 190,-71048 }, + { 191,-71048 }, { 192,-71048 }, { 193,-71048 }, { 194,-71048 }, { 195,-71048 }, + { 196,-71048 }, { 197,-71048 }, { 198,-71048 }, { 199,-71048 }, { 200,-71048 }, + { 201,-71048 }, { 202,-71048 }, { 203,-71048 }, { 204,-71048 }, { 205,-71048 }, + { 206,-71048 }, { 207,-71048 }, { 208,-71048 }, { 209,-71048 }, { 210,-71048 }, + { 211,-71048 }, { 212,-71048 }, { 213,-71048 }, { 214,-71048 }, { 215,-71048 }, + { 216,-71048 }, { 217,-71048 }, { 218,-71048 }, { 219,-71048 }, { 220,-71048 }, + { 221,-71048 }, { 222,-71048 }, { 223,-71048 }, { 224,-71048 }, { 225,-71048 }, + { 226,-71048 }, { 227,-71048 }, { 228,-71048 }, { 229,-71048 }, { 230,-71048 }, + { 231,-71048 }, { 232,-71048 }, { 233,-71048 }, { 234,-71048 }, { 235,-71048 }, + + { 236,-71048 }, { 237,-71048 }, { 238,-71048 }, { 239,-71048 }, { 240,-71048 }, + { 241,-71048 }, { 242,-71048 }, { 243,-71048 }, { 244,-71048 }, { 245,-71048 }, + { 246,-71048 }, { 247,-71048 }, { 248,-71048 }, { 249,-71048 }, { 250,-71048 }, + { 251,-71048 }, { 252,-71048 }, { 253,-71048 }, { 254,-71048 }, { 255,-71048 }, + { 0, 131 }, { 0,20818 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-71305 }, + { 49,-71305 }, { 50,-71305 }, { 51,-71305 }, { 52,-71305 }, { 53,-71305 }, + { 54,-71305 }, { 55,-71305 }, { 56,-71305 }, { 57,-71305 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-71305 }, { 66,-71305 }, { 67,-71305 }, { 68,-71305 }, + { 69,6682 }, { 70,-71305 }, { 71,-71305 }, { 72,-71305 }, { 73,-71305 }, + { 74,-71305 }, { 75,-71305 }, { 76,-71305 }, { 77,-71305 }, { 78,-71305 }, + + { 79,-71305 }, { 80,-71305 }, { 81,-71305 }, { 82,-71305 }, { 83,-71305 }, + { 84,-71305 }, { 85,-71305 }, { 86,-71305 }, { 87,-71305 }, { 88,-71305 }, + { 89,-71305 }, { 90,-71305 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-71305 }, { 0, 0 }, { 97,-71305 }, { 98,-71305 }, + { 99,-71305 }, { 100,-71305 }, { 101,6682 }, { 102,-71305 }, { 103,-71305 }, + { 104,-71305 }, { 105,-71305 }, { 106,-71305 }, { 107,-71305 }, { 108,-71305 }, + { 109,-71305 }, { 110,-71305 }, { 111,-71305 }, { 112,-71305 }, { 113,-71305 }, + { 114,-71305 }, { 115,-71305 }, { 116,-71305 }, { 117,-71305 }, { 118,-71305 }, + { 119,-71305 }, { 120,-71305 }, { 121,-71305 }, { 122,-71305 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-71305 }, { 128,-71305 }, + + { 129,-71305 }, { 130,-71305 }, { 131,-71305 }, { 132,-71305 }, { 133,-71305 }, + { 134,-71305 }, { 135,-71305 }, { 136,-71305 }, { 137,-71305 }, { 138,-71305 }, + { 139,-71305 }, { 140,-71305 }, { 141,-71305 }, { 142,-71305 }, { 143,-71305 }, + { 144,-71305 }, { 145,-71305 }, { 146,-71305 }, { 147,-71305 }, { 148,-71305 }, + { 149,-71305 }, { 150,-71305 }, { 151,-71305 }, { 152,-71305 }, { 153,-71305 }, + { 154,-71305 }, { 155,-71305 }, { 156,-71305 }, { 157,-71305 }, { 158,-71305 }, + { 159,-71305 }, { 160,-71305 }, { 161,-71305 }, { 162,-71305 }, { 163,-71305 }, + { 164,-71305 }, { 165,-71305 }, { 166,-71305 }, { 167,-71305 }, { 168,-71305 }, + { 169,-71305 }, { 170,-71305 }, { 171,-71305 }, { 172,-71305 }, { 173,-71305 }, + { 174,-71305 }, { 175,-71305 }, { 176,-71305 }, { 177,-71305 }, { 178,-71305 }, + + { 179,-71305 }, { 180,-71305 }, { 181,-71305 }, { 182,-71305 }, { 183,-71305 }, + { 184,-71305 }, { 185,-71305 }, { 186,-71305 }, { 187,-71305 }, { 188,-71305 }, + { 189,-71305 }, { 190,-71305 }, { 191,-71305 }, { 192,-71305 }, { 193,-71305 }, + { 194,-71305 }, { 195,-71305 }, { 196,-71305 }, { 197,-71305 }, { 198,-71305 }, + { 199,-71305 }, { 200,-71305 }, { 201,-71305 }, { 202,-71305 }, { 203,-71305 }, + { 204,-71305 }, { 205,-71305 }, { 206,-71305 }, { 207,-71305 }, { 208,-71305 }, + { 209,-71305 }, { 210,-71305 }, { 211,-71305 }, { 212,-71305 }, { 213,-71305 }, + { 214,-71305 }, { 215,-71305 }, { 216,-71305 }, { 217,-71305 }, { 218,-71305 }, + { 219,-71305 }, { 220,-71305 }, { 221,-71305 }, { 222,-71305 }, { 223,-71305 }, + { 224,-71305 }, { 225,-71305 }, { 226,-71305 }, { 227,-71305 }, { 228,-71305 }, + + { 229,-71305 }, { 230,-71305 }, { 231,-71305 }, { 232,-71305 }, { 233,-71305 }, + { 234,-71305 }, { 235,-71305 }, { 236,-71305 }, { 237,-71305 }, { 238,-71305 }, + { 239,-71305 }, { 240,-71305 }, { 241,-71305 }, { 242,-71305 }, { 243,-71305 }, + { 244,-71305 }, { 245,-71305 }, { 246,-71305 }, { 247,-71305 }, { 248,-71305 }, + { 249,-71305 }, { 250,-71305 }, { 251,-71305 }, { 252,-71305 }, { 253,-71305 }, + { 254,-71305 }, { 255,-71305 }, { 0, 131 }, { 0,20561 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-71562 }, { 49,-71562 }, { 50,-71562 }, { 51,-71562 }, + { 52,-71562 }, { 53,-71562 }, { 54,-71562 }, { 55,-71562 }, { 56,-71562 }, + { 57,-71562 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-71562 }, { 66,-71562 }, + { 67,-71562 }, { 68,-71562 }, { 69,-71562 }, { 70,-71562 }, { 71,-71562 }, + + { 72,-71562 }, { 73,-71562 }, { 74,-71562 }, { 75,-71562 }, { 76,-71562 }, + { 77,-71562 }, { 78,-71562 }, { 79,6682 }, { 80,-71562 }, { 81,-71562 }, + { 82,-71562 }, { 83,-71562 }, { 84,-71562 }, { 85,-71562 }, { 86,-71562 }, + { 87,-71562 }, { 88,-71562 }, { 89,-71562 }, { 90,-71562 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-71562 }, { 0, 0 }, + { 97,-71562 }, { 98,-71562 }, { 99,-71562 }, { 100,-71562 }, { 101,-71562 }, + { 102,-71562 }, { 103,-71562 }, { 104,-71562 }, { 105,-71562 }, { 106,-71562 }, + { 107,-71562 }, { 108,-71562 }, { 109,-71562 }, { 110,-71562 }, { 111,6682 }, + { 112,-71562 }, { 113,-71562 }, { 114,-71562 }, { 115,-71562 }, { 116,-71562 }, + { 117,-71562 }, { 118,-71562 }, { 119,-71562 }, { 120,-71562 }, { 121,-71562 }, + + { 122,-71562 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-71562 }, { 128,-71562 }, { 129,-71562 }, { 130,-71562 }, { 131,-71562 }, + { 132,-71562 }, { 133,-71562 }, { 134,-71562 }, { 135,-71562 }, { 136,-71562 }, + { 137,-71562 }, { 138,-71562 }, { 139,-71562 }, { 140,-71562 }, { 141,-71562 }, + { 142,-71562 }, { 143,-71562 }, { 144,-71562 }, { 145,-71562 }, { 146,-71562 }, + { 147,-71562 }, { 148,-71562 }, { 149,-71562 }, { 150,-71562 }, { 151,-71562 }, + { 152,-71562 }, { 153,-71562 }, { 154,-71562 }, { 155,-71562 }, { 156,-71562 }, + { 157,-71562 }, { 158,-71562 }, { 159,-71562 }, { 160,-71562 }, { 161,-71562 }, + { 162,-71562 }, { 163,-71562 }, { 164,-71562 }, { 165,-71562 }, { 166,-71562 }, + { 167,-71562 }, { 168,-71562 }, { 169,-71562 }, { 170,-71562 }, { 171,-71562 }, + + { 172,-71562 }, { 173,-71562 }, { 174,-71562 }, { 175,-71562 }, { 176,-71562 }, + { 177,-71562 }, { 178,-71562 }, { 179,-71562 }, { 180,-71562 }, { 181,-71562 }, + { 182,-71562 }, { 183,-71562 }, { 184,-71562 }, { 185,-71562 }, { 186,-71562 }, + { 187,-71562 }, { 188,-71562 }, { 189,-71562 }, { 190,-71562 }, { 191,-71562 }, + { 192,-71562 }, { 193,-71562 }, { 194,-71562 }, { 195,-71562 }, { 196,-71562 }, + { 197,-71562 }, { 198,-71562 }, { 199,-71562 }, { 200,-71562 }, { 201,-71562 }, + { 202,-71562 }, { 203,-71562 }, { 204,-71562 }, { 205,-71562 }, { 206,-71562 }, + { 207,-71562 }, { 208,-71562 }, { 209,-71562 }, { 210,-71562 }, { 211,-71562 }, + { 212,-71562 }, { 213,-71562 }, { 214,-71562 }, { 215,-71562 }, { 216,-71562 }, + { 217,-71562 }, { 218,-71562 }, { 219,-71562 }, { 220,-71562 }, { 221,-71562 }, + + { 222,-71562 }, { 223,-71562 }, { 224,-71562 }, { 225,-71562 }, { 226,-71562 }, + { 227,-71562 }, { 228,-71562 }, { 229,-71562 }, { 230,-71562 }, { 231,-71562 }, + { 232,-71562 }, { 233,-71562 }, { 234,-71562 }, { 235,-71562 }, { 236,-71562 }, + { 237,-71562 }, { 238,-71562 }, { 239,-71562 }, { 240,-71562 }, { 241,-71562 }, + { 242,-71562 }, { 243,-71562 }, { 244,-71562 }, { 245,-71562 }, { 246,-71562 }, + { 247,-71562 }, { 248,-71562 }, { 249,-71562 }, { 250,-71562 }, { 251,-71562 }, + { 252,-71562 }, { 253,-71562 }, { 254,-71562 }, { 255,-71562 }, { 0, 131 }, + { 0,20304 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-71819 }, { 49,-71819 }, + { 50,-71819 }, { 51,-71819 }, { 52,-71819 }, { 53,-71819 }, { 54,-71819 }, + { 55,-71819 }, { 56,-71819 }, { 57,-71819 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 65,-71819 }, { 66,-71819 }, { 67,6682 }, { 68,-71819 }, { 69,-71819 }, + { 70,-71819 }, { 71,-71819 }, { 72,-71819 }, { 73,-71819 }, { 74,-71819 }, + { 75,-71819 }, { 76,-71819 }, { 77,-71819 }, { 78,-71819 }, { 79,-71819 }, + { 80,-71819 }, { 81,-71819 }, { 82,-71819 }, { 83,-71819 }, { 84,-71819 }, + { 85,-71819 }, { 86,-71819 }, { 87,-71819 }, { 88,-71819 }, { 89,-71819 }, + { 90,-71819 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-71819 }, { 0, 0 }, { 97,-71819 }, { 98,-71819 }, { 99,6682 }, + { 100,-71819 }, { 101,-71819 }, { 102,-71819 }, { 103,-71819 }, { 104,-71819 }, + { 105,-71819 }, { 106,-71819 }, { 107,-71819 }, { 108,-71819 }, { 109,-71819 }, + { 110,-71819 }, { 111,-71819 }, { 112,-71819 }, { 113,-71819 }, { 114,-71819 }, + + { 115,-71819 }, { 116,-71819 }, { 117,-71819 }, { 118,-71819 }, { 119,-71819 }, + { 120,-71819 }, { 121,-71819 }, { 122,-71819 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-71819 }, { 128,-71819 }, { 129,-71819 }, + { 130,-71819 }, { 131,-71819 }, { 132,-71819 }, { 133,-71819 }, { 134,-71819 }, + { 135,-71819 }, { 136,-71819 }, { 137,-71819 }, { 138,-71819 }, { 139,-71819 }, + { 140,-71819 }, { 141,-71819 }, { 142,-71819 }, { 143,-71819 }, { 144,-71819 }, + { 145,-71819 }, { 146,-71819 }, { 147,-71819 }, { 148,-71819 }, { 149,-71819 }, + { 150,-71819 }, { 151,-71819 }, { 152,-71819 }, { 153,-71819 }, { 154,-71819 }, + { 155,-71819 }, { 156,-71819 }, { 157,-71819 }, { 158,-71819 }, { 159,-71819 }, + { 160,-71819 }, { 161,-71819 }, { 162,-71819 }, { 163,-71819 }, { 164,-71819 }, + + { 165,-71819 }, { 166,-71819 }, { 167,-71819 }, { 168,-71819 }, { 169,-71819 }, + { 170,-71819 }, { 171,-71819 }, { 172,-71819 }, { 173,-71819 }, { 174,-71819 }, + { 175,-71819 }, { 176,-71819 }, { 177,-71819 }, { 178,-71819 }, { 179,-71819 }, + { 180,-71819 }, { 181,-71819 }, { 182,-71819 }, { 183,-71819 }, { 184,-71819 }, + { 185,-71819 }, { 186,-71819 }, { 187,-71819 }, { 188,-71819 }, { 189,-71819 }, + { 190,-71819 }, { 191,-71819 }, { 192,-71819 }, { 193,-71819 }, { 194,-71819 }, + { 195,-71819 }, { 196,-71819 }, { 197,-71819 }, { 198,-71819 }, { 199,-71819 }, + { 200,-71819 }, { 201,-71819 }, { 202,-71819 }, { 203,-71819 }, { 204,-71819 }, + { 205,-71819 }, { 206,-71819 }, { 207,-71819 }, { 208,-71819 }, { 209,-71819 }, + { 210,-71819 }, { 211,-71819 }, { 212,-71819 }, { 213,-71819 }, { 214,-71819 }, + + { 215,-71819 }, { 216,-71819 }, { 217,-71819 }, { 218,-71819 }, { 219,-71819 }, + { 220,-71819 }, { 221,-71819 }, { 222,-71819 }, { 223,-71819 }, { 224,-71819 }, + { 225,-71819 }, { 226,-71819 }, { 227,-71819 }, { 228,-71819 }, { 229,-71819 }, + { 230,-71819 }, { 231,-71819 }, { 232,-71819 }, { 233,-71819 }, { 234,-71819 }, + { 235,-71819 }, { 236,-71819 }, { 237,-71819 }, { 238,-71819 }, { 239,-71819 }, + { 240,-71819 }, { 241,-71819 }, { 242,-71819 }, { 243,-71819 }, { 244,-71819 }, + { 245,-71819 }, { 246,-71819 }, { 247,-71819 }, { 248,-71819 }, { 249,-71819 }, + { 250,-71819 }, { 251,-71819 }, { 252,-71819 }, { 253,-71819 }, { 254,-71819 }, + { 255,-71819 }, { 0, 131 }, { 0,20047 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-72076 }, { 49,-72076 }, { 50,-72076 }, { 51,-72076 }, { 52,-72076 }, + { 53,-72076 }, { 54,-72076 }, { 55,-72076 }, { 56,-72076 }, { 57,-72076 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-72076 }, { 66,-72076 }, { 67,6682 }, + { 68,-72076 }, { 69,-72076 }, { 70,-72076 }, { 71,-72076 }, { 72,-72076 }, + { 73,-72076 }, { 74,-72076 }, { 75,-72076 }, { 76,-72076 }, { 77,-72076 }, + { 78,-72076 }, { 79,-72076 }, { 80,-72076 }, { 81,-72076 }, { 82,-72076 }, + { 83,-72076 }, { 84,-72076 }, { 85,-72076 }, { 86,-72076 }, { 87,-72076 }, + { 88,-72076 }, { 89,-72076 }, { 90,-72076 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-72076 }, { 0, 0 }, { 97,-72076 }, + { 98,-72076 }, { 99,6682 }, { 100,-72076 }, { 101,-72076 }, { 102,-72076 }, + { 103,-72076 }, { 104,-72076 }, { 105,-72076 }, { 106,-72076 }, { 107,-72076 }, + + { 108,-72076 }, { 109,-72076 }, { 110,-72076 }, { 111,-72076 }, { 112,-72076 }, + { 113,-72076 }, { 114,-72076 }, { 115,-72076 }, { 116,-72076 }, { 117,-72076 }, + { 118,-72076 }, { 119,-72076 }, { 120,-72076 }, { 121,-72076 }, { 122,-72076 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-72076 }, + { 128,-72076 }, { 129,-72076 }, { 130,-72076 }, { 131,-72076 }, { 132,-72076 }, + { 133,-72076 }, { 134,-72076 }, { 135,-72076 }, { 136,-72076 }, { 137,-72076 }, + { 138,-72076 }, { 139,-72076 }, { 140,-72076 }, { 141,-72076 }, { 142,-72076 }, + { 143,-72076 }, { 144,-72076 }, { 145,-72076 }, { 146,-72076 }, { 147,-72076 }, + { 148,-72076 }, { 149,-72076 }, { 150,-72076 }, { 151,-72076 }, { 152,-72076 }, + { 153,-72076 }, { 154,-72076 }, { 155,-72076 }, { 156,-72076 }, { 157,-72076 }, + + { 158,-72076 }, { 159,-72076 }, { 160,-72076 }, { 161,-72076 }, { 162,-72076 }, + { 163,-72076 }, { 164,-72076 }, { 165,-72076 }, { 166,-72076 }, { 167,-72076 }, + { 168,-72076 }, { 169,-72076 }, { 170,-72076 }, { 171,-72076 }, { 172,-72076 }, + { 173,-72076 }, { 174,-72076 }, { 175,-72076 }, { 176,-72076 }, { 177,-72076 }, + { 178,-72076 }, { 179,-72076 }, { 180,-72076 }, { 181,-72076 }, { 182,-72076 }, + { 183,-72076 }, { 184,-72076 }, { 185,-72076 }, { 186,-72076 }, { 187,-72076 }, + { 188,-72076 }, { 189,-72076 }, { 190,-72076 }, { 191,-72076 }, { 192,-72076 }, + { 193,-72076 }, { 194,-72076 }, { 195,-72076 }, { 196,-72076 }, { 197,-72076 }, + { 198,-72076 }, { 199,-72076 }, { 200,-72076 }, { 201,-72076 }, { 202,-72076 }, + { 203,-72076 }, { 204,-72076 }, { 205,-72076 }, { 206,-72076 }, { 207,-72076 }, + + { 208,-72076 }, { 209,-72076 }, { 210,-72076 }, { 211,-72076 }, { 212,-72076 }, + { 213,-72076 }, { 214,-72076 }, { 215,-72076 }, { 216,-72076 }, { 217,-72076 }, + { 218,-72076 }, { 219,-72076 }, { 220,-72076 }, { 221,-72076 }, { 222,-72076 }, + { 223,-72076 }, { 224,-72076 }, { 225,-72076 }, { 226,-72076 }, { 227,-72076 }, + { 228,-72076 }, { 229,-72076 }, { 230,-72076 }, { 231,-72076 }, { 232,-72076 }, + { 233,-72076 }, { 234,-72076 }, { 235,-72076 }, { 236,-72076 }, { 237,-72076 }, + { 238,-72076 }, { 239,-72076 }, { 240,-72076 }, { 241,-72076 }, { 242,-72076 }, + { 243,-72076 }, { 244,-72076 }, { 245,-72076 }, { 246,-72076 }, { 247,-72076 }, + { 248,-72076 }, { 249,-72076 }, { 250,-72076 }, { 251,-72076 }, { 252,-72076 }, + { 253,-72076 }, { 254,-72076 }, { 255,-72076 }, { 0, 64 }, { 0,19790 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-72333 }, { 49,-72333 }, { 50,-72333 }, + + { 51,-72333 }, { 52,-72333 }, { 53,-72333 }, { 54,-72333 }, { 55,-72333 }, + { 56,-72333 }, { 57,-72333 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-72333 }, + { 66,-72333 }, { 67,-72333 }, { 68,-72333 }, { 69,-72333 }, { 70,-72333 }, + { 71,-72333 }, { 72,-72333 }, { 73,-72333 }, { 74,-72333 }, { 75,-72333 }, + { 76,-72333 }, { 77,-72333 }, { 78,-72333 }, { 79,-72333 }, { 80,-72333 }, + { 81,-72333 }, { 82,-72333 }, { 83,-72333 }, { 84,-72333 }, { 85,-72333 }, + { 86,-72333 }, { 87,-72333 }, { 88,-72333 }, { 89,-72333 }, { 90,-72333 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-72333 }, + { 0, 0 }, { 97,-72333 }, { 98,-72333 }, { 99,-72333 }, { 100,-72333 }, + + { 101,-72333 }, { 102,-72333 }, { 103,-72333 }, { 104,-72333 }, { 105,-72333 }, + { 106,-72333 }, { 107,-72333 }, { 108,-72333 }, { 109,-72333 }, { 110,-72333 }, + { 111,-72333 }, { 112,-72333 }, { 113,-72333 }, { 114,-72333 }, { 115,-72333 }, + { 116,-72333 }, { 117,-72333 }, { 118,-72333 }, { 119,-72333 }, { 120,-72333 }, + { 121,-72333 }, { 122,-72333 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-72333 }, { 128,-72333 }, { 129,-72333 }, { 130,-72333 }, + { 131,-72333 }, { 132,-72333 }, { 133,-72333 }, { 134,-72333 }, { 135,-72333 }, + { 136,-72333 }, { 137,-72333 }, { 138,-72333 }, { 139,-72333 }, { 140,-72333 }, + { 141,-72333 }, { 142,-72333 }, { 143,-72333 }, { 144,-72333 }, { 145,-72333 }, + { 146,-72333 }, { 147,-72333 }, { 148,-72333 }, { 149,-72333 }, { 150,-72333 }, + + { 151,-72333 }, { 152,-72333 }, { 153,-72333 }, { 154,-72333 }, { 155,-72333 }, + { 156,-72333 }, { 157,-72333 }, { 158,-72333 }, { 159,-72333 }, { 160,-72333 }, + { 161,-72333 }, { 162,-72333 }, { 163,-72333 }, { 164,-72333 }, { 165,-72333 }, + { 166,-72333 }, { 167,-72333 }, { 168,-72333 }, { 169,-72333 }, { 170,-72333 }, + { 171,-72333 }, { 172,-72333 }, { 173,-72333 }, { 174,-72333 }, { 175,-72333 }, + { 176,-72333 }, { 177,-72333 }, { 178,-72333 }, { 179,-72333 }, { 180,-72333 }, + { 181,-72333 }, { 182,-72333 }, { 183,-72333 }, { 184,-72333 }, { 185,-72333 }, + { 186,-72333 }, { 187,-72333 }, { 188,-72333 }, { 189,-72333 }, { 190,-72333 }, + { 191,-72333 }, { 192,-72333 }, { 193,-72333 }, { 194,-72333 }, { 195,-72333 }, + { 196,-72333 }, { 197,-72333 }, { 198,-72333 }, { 199,-72333 }, { 200,-72333 }, + + { 201,-72333 }, { 202,-72333 }, { 203,-72333 }, { 204,-72333 }, { 205,-72333 }, + { 206,-72333 }, { 207,-72333 }, { 208,-72333 }, { 209,-72333 }, { 210,-72333 }, + { 211,-72333 }, { 212,-72333 }, { 213,-72333 }, { 214,-72333 }, { 215,-72333 }, + { 216,-72333 }, { 217,-72333 }, { 218,-72333 }, { 219,-72333 }, { 220,-72333 }, + { 221,-72333 }, { 222,-72333 }, { 223,-72333 }, { 224,-72333 }, { 225,-72333 }, + { 226,-72333 }, { 227,-72333 }, { 228,-72333 }, { 229,-72333 }, { 230,-72333 }, + { 231,-72333 }, { 232,-72333 }, { 233,-72333 }, { 234,-72333 }, { 235,-72333 }, + { 236,-72333 }, { 237,-72333 }, { 238,-72333 }, { 239,-72333 }, { 240,-72333 }, + { 241,-72333 }, { 242,-72333 }, { 243,-72333 }, { 244,-72333 }, { 245,-72333 }, + { 246,-72333 }, { 247,-72333 }, { 248,-72333 }, { 249,-72333 }, { 250,-72333 }, + + { 251,-72333 }, { 252,-72333 }, { 253,-72333 }, { 254,-72333 }, { 255,-72333 }, + { 0, 131 }, { 0,19533 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-72590 }, + { 49,-72590 }, { 50,-72590 }, { 51,-72590 }, { 52,-72590 }, { 53,-72590 }, + { 54,-72590 }, { 55,-72590 }, { 56,-72590 }, { 57,-72590 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-72590 }, { 66,-72590 }, { 67,-72590 }, { 68,-72590 }, + { 69,6425 }, { 70,-72590 }, { 71,-72590 }, { 72,-72590 }, { 73,-72590 }, + { 74,-72590 }, { 75,-72590 }, { 76,-72590 }, { 77,-72590 }, { 78,-72590 }, + { 79,-72590 }, { 80,-72590 }, { 81,-72590 }, { 82,-72590 }, { 83,-72590 }, + { 84,-72590 }, { 85,-72590 }, { 86,-72590 }, { 87,-72590 }, { 88,-72590 }, + { 89,-72590 }, { 90,-72590 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 95,-72590 }, { 0, 0 }, { 97,-72590 }, { 98,-72590 }, + { 99,-72590 }, { 100,-72590 }, { 101,6425 }, { 102,-72590 }, { 103,-72590 }, + { 104,-72590 }, { 105,-72590 }, { 106,-72590 }, { 107,-72590 }, { 108,-72590 }, + { 109,-72590 }, { 110,-72590 }, { 111,-72590 }, { 112,-72590 }, { 113,-72590 }, + { 114,-72590 }, { 115,-72590 }, { 116,-72590 }, { 117,-72590 }, { 118,-72590 }, + { 119,-72590 }, { 120,-72590 }, { 121,-72590 }, { 122,-72590 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-72590 }, { 128,-72590 }, + { 129,-72590 }, { 130,-72590 }, { 131,-72590 }, { 132,-72590 }, { 133,-72590 }, + { 134,-72590 }, { 135,-72590 }, { 136,-72590 }, { 137,-72590 }, { 138,-72590 }, + { 139,-72590 }, { 140,-72590 }, { 141,-72590 }, { 142,-72590 }, { 143,-72590 }, + + { 144,-72590 }, { 145,-72590 }, { 146,-72590 }, { 147,-72590 }, { 148,-72590 }, + { 149,-72590 }, { 150,-72590 }, { 151,-72590 }, { 152,-72590 }, { 153,-72590 }, + { 154,-72590 }, { 155,-72590 }, { 156,-72590 }, { 157,-72590 }, { 158,-72590 }, + { 159,-72590 }, { 160,-72590 }, { 161,-72590 }, { 162,-72590 }, { 163,-72590 }, + { 164,-72590 }, { 165,-72590 }, { 166,-72590 }, { 167,-72590 }, { 168,-72590 }, + { 169,-72590 }, { 170,-72590 }, { 171,-72590 }, { 172,-72590 }, { 173,-72590 }, + { 174,-72590 }, { 175,-72590 }, { 176,-72590 }, { 177,-72590 }, { 178,-72590 }, + { 179,-72590 }, { 180,-72590 }, { 181,-72590 }, { 182,-72590 }, { 183,-72590 }, + { 184,-72590 }, { 185,-72590 }, { 186,-72590 }, { 187,-72590 }, { 188,-72590 }, + { 189,-72590 }, { 190,-72590 }, { 191,-72590 }, { 192,-72590 }, { 193,-72590 }, + + { 194,-72590 }, { 195,-72590 }, { 196,-72590 }, { 197,-72590 }, { 198,-72590 }, + { 199,-72590 }, { 200,-72590 }, { 201,-72590 }, { 202,-72590 }, { 203,-72590 }, + { 204,-72590 }, { 205,-72590 }, { 206,-72590 }, { 207,-72590 }, { 208,-72590 }, + { 209,-72590 }, { 210,-72590 }, { 211,-72590 }, { 212,-72590 }, { 213,-72590 }, + { 214,-72590 }, { 215,-72590 }, { 216,-72590 }, { 217,-72590 }, { 218,-72590 }, + { 219,-72590 }, { 220,-72590 }, { 221,-72590 }, { 222,-72590 }, { 223,-72590 }, + { 224,-72590 }, { 225,-72590 }, { 226,-72590 }, { 227,-72590 }, { 228,-72590 }, + { 229,-72590 }, { 230,-72590 }, { 231,-72590 }, { 232,-72590 }, { 233,-72590 }, + { 234,-72590 }, { 235,-72590 }, { 236,-72590 }, { 237,-72590 }, { 238,-72590 }, + { 239,-72590 }, { 240,-72590 }, { 241,-72590 }, { 242,-72590 }, { 243,-72590 }, + + { 244,-72590 }, { 245,-72590 }, { 246,-72590 }, { 247,-72590 }, { 248,-72590 }, + { 249,-72590 }, { 250,-72590 }, { 251,-72590 }, { 252,-72590 }, { 253,-72590 }, + { 254,-72590 }, { 255,-72590 }, { 0, 21 }, { 0,19276 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-72847 }, { 49,-72847 }, { 50,-72847 }, { 51,-72847 }, + { 52,-72847 }, { 53,-72847 }, { 54,-72847 }, { 55,-72847 }, { 56,-72847 }, + { 57,-72847 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-72847 }, { 66,-72847 }, + { 67,-72847 }, { 68,-72847 }, { 69,-72847 }, { 70,-72847 }, { 71,-72847 }, + { 72,-72847 }, { 73,-72847 }, { 74,-72847 }, { 75,-72847 }, { 76,-72847 }, + { 77,-72847 }, { 78,-72847 }, { 79,-72847 }, { 80,-72847 }, { 81,-72847 }, + { 82,-72847 }, { 83,-72847 }, { 84,-72847 }, { 85,-72847 }, { 86,-72847 }, + + { 87,-72847 }, { 88,-72847 }, { 89,-72847 }, { 90,-72847 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,6425 }, { 0, 0 }, + { 97,-72847 }, { 98,-72847 }, { 99,-72847 }, { 100,-72847 }, { 101,-72847 }, + { 102,-72847 }, { 103,-72847 }, { 104,-72847 }, { 105,-72847 }, { 106,-72847 }, + { 107,-72847 }, { 108,-72847 }, { 109,-72847 }, { 110,-72847 }, { 111,-72847 }, + { 112,-72847 }, { 113,-72847 }, { 114,-72847 }, { 115,-72847 }, { 116,-72847 }, + { 117,-72847 }, { 118,-72847 }, { 119,-72847 }, { 120,-72847 }, { 121,-72847 }, + { 122,-72847 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-72847 }, { 128,-72847 }, { 129,-72847 }, { 130,-72847 }, { 131,-72847 }, + { 132,-72847 }, { 133,-72847 }, { 134,-72847 }, { 135,-72847 }, { 136,-72847 }, + + { 137,-72847 }, { 138,-72847 }, { 139,-72847 }, { 140,-72847 }, { 141,-72847 }, + { 142,-72847 }, { 143,-72847 }, { 144,-72847 }, { 145,-72847 }, { 146,-72847 }, + { 147,-72847 }, { 148,-72847 }, { 149,-72847 }, { 150,-72847 }, { 151,-72847 }, + { 152,-72847 }, { 153,-72847 }, { 154,-72847 }, { 155,-72847 }, { 156,-72847 }, + { 157,-72847 }, { 158,-72847 }, { 159,-72847 }, { 160,-72847 }, { 161,-72847 }, + { 162,-72847 }, { 163,-72847 }, { 164,-72847 }, { 165,-72847 }, { 166,-72847 }, + { 167,-72847 }, { 168,-72847 }, { 169,-72847 }, { 170,-72847 }, { 171,-72847 }, + { 172,-72847 }, { 173,-72847 }, { 174,-72847 }, { 175,-72847 }, { 176,-72847 }, + { 177,-72847 }, { 178,-72847 }, { 179,-72847 }, { 180,-72847 }, { 181,-72847 }, + { 182,-72847 }, { 183,-72847 }, { 184,-72847 }, { 185,-72847 }, { 186,-72847 }, + + { 187,-72847 }, { 188,-72847 }, { 189,-72847 }, { 190,-72847 }, { 191,-72847 }, + { 192,-72847 }, { 193,-72847 }, { 194,-72847 }, { 195,-72847 }, { 196,-72847 }, + { 197,-72847 }, { 198,-72847 }, { 199,-72847 }, { 200,-72847 }, { 201,-72847 }, + { 202,-72847 }, { 203,-72847 }, { 204,-72847 }, { 205,-72847 }, { 206,-72847 }, + { 207,-72847 }, { 208,-72847 }, { 209,-72847 }, { 210,-72847 }, { 211,-72847 }, + { 212,-72847 }, { 213,-72847 }, { 214,-72847 }, { 215,-72847 }, { 216,-72847 }, + { 217,-72847 }, { 218,-72847 }, { 219,-72847 }, { 220,-72847 }, { 221,-72847 }, + { 222,-72847 }, { 223,-72847 }, { 224,-72847 }, { 225,-72847 }, { 226,-72847 }, + { 227,-72847 }, { 228,-72847 }, { 229,-72847 }, { 230,-72847 }, { 231,-72847 }, + { 232,-72847 }, { 233,-72847 }, { 234,-72847 }, { 235,-72847 }, { 236,-72847 }, + + { 237,-72847 }, { 238,-72847 }, { 239,-72847 }, { 240,-72847 }, { 241,-72847 }, + { 242,-72847 }, { 243,-72847 }, { 244,-72847 }, { 245,-72847 }, { 246,-72847 }, + { 247,-72847 }, { 248,-72847 }, { 249,-72847 }, { 250,-72847 }, { 251,-72847 }, + { 252,-72847 }, { 253,-72847 }, { 254,-72847 }, { 255,-72847 }, { 0, 131 }, + { 0,19019 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-73104 }, { 49,-73104 }, + { 50,-73104 }, { 51,-73104 }, { 52,-73104 }, { 53,-73104 }, { 54,-73104 }, + { 55,-73104 }, { 56,-73104 }, { 57,-73104 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-73104 }, { 66,-73104 }, { 67,-73104 }, { 68,-73104 }, { 69,-73104 }, + { 70,-73104 }, { 71,-73104 }, { 72,-73104 }, { 73,-73104 }, { 74,-73104 }, + { 75,-73104 }, { 76,-73104 }, { 77,-73104 }, { 78,-73104 }, { 79,-73104 }, + + { 80,-73104 }, { 81,-73104 }, { 82,-73104 }, { 83,-73104 }, { 84,-73104 }, + { 85,-73104 }, { 86,-73104 }, { 87,-73104 }, { 88,-73104 }, { 89,-73104 }, + { 90,-73104 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,6425 }, { 0, 0 }, { 97,-73104 }, { 98,-73104 }, { 99,-73104 }, + { 100,-73104 }, { 101,-73104 }, { 102,-73104 }, { 103,-73104 }, { 104,-73104 }, + { 105,-73104 }, { 106,-73104 }, { 107,-73104 }, { 108,-73104 }, { 109,-73104 }, + { 110,-73104 }, { 111,-73104 }, { 112,-73104 }, { 113,-73104 }, { 114,-73104 }, + { 115,-73104 }, { 116,-73104 }, { 117,-73104 }, { 118,-73104 }, { 119,-73104 }, + { 120,-73104 }, { 121,-73104 }, { 122,-73104 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-73104 }, { 128,-73104 }, { 129,-73104 }, + + { 130,-73104 }, { 131,-73104 }, { 132,-73104 }, { 133,-73104 }, { 134,-73104 }, + { 135,-73104 }, { 136,-73104 }, { 137,-73104 }, { 138,-73104 }, { 139,-73104 }, + { 140,-73104 }, { 141,-73104 }, { 142,-73104 }, { 143,-73104 }, { 144,-73104 }, + { 145,-73104 }, { 146,-73104 }, { 147,-73104 }, { 148,-73104 }, { 149,-73104 }, + { 150,-73104 }, { 151,-73104 }, { 152,-73104 }, { 153,-73104 }, { 154,-73104 }, + { 155,-73104 }, { 156,-73104 }, { 157,-73104 }, { 158,-73104 }, { 159,-73104 }, + { 160,-73104 }, { 161,-73104 }, { 162,-73104 }, { 163,-73104 }, { 164,-73104 }, + { 165,-73104 }, { 166,-73104 }, { 167,-73104 }, { 168,-73104 }, { 169,-73104 }, + { 170,-73104 }, { 171,-73104 }, { 172,-73104 }, { 173,-73104 }, { 174,-73104 }, + { 175,-73104 }, { 176,-73104 }, { 177,-73104 }, { 178,-73104 }, { 179,-73104 }, + + { 180,-73104 }, { 181,-73104 }, { 182,-73104 }, { 183,-73104 }, { 184,-73104 }, + { 185,-73104 }, { 186,-73104 }, { 187,-73104 }, { 188,-73104 }, { 189,-73104 }, + { 190,-73104 }, { 191,-73104 }, { 192,-73104 }, { 193,-73104 }, { 194,-73104 }, + { 195,-73104 }, { 196,-73104 }, { 197,-73104 }, { 198,-73104 }, { 199,-73104 }, + { 200,-73104 }, { 201,-73104 }, { 202,-73104 }, { 203,-73104 }, { 204,-73104 }, + { 205,-73104 }, { 206,-73104 }, { 207,-73104 }, { 208,-73104 }, { 209,-73104 }, + { 210,-73104 }, { 211,-73104 }, { 212,-73104 }, { 213,-73104 }, { 214,-73104 }, + { 215,-73104 }, { 216,-73104 }, { 217,-73104 }, { 218,-73104 }, { 219,-73104 }, + { 220,-73104 }, { 221,-73104 }, { 222,-73104 }, { 223,-73104 }, { 224,-73104 }, + { 225,-73104 }, { 226,-73104 }, { 227,-73104 }, { 228,-73104 }, { 229,-73104 }, + + { 230,-73104 }, { 231,-73104 }, { 232,-73104 }, { 233,-73104 }, { 234,-73104 }, + { 235,-73104 }, { 236,-73104 }, { 237,-73104 }, { 238,-73104 }, { 239,-73104 }, + { 240,-73104 }, { 241,-73104 }, { 242,-73104 }, { 243,-73104 }, { 244,-73104 }, + { 245,-73104 }, { 246,-73104 }, { 247,-73104 }, { 248,-73104 }, { 249,-73104 }, + { 250,-73104 }, { 251,-73104 }, { 252,-73104 }, { 253,-73104 }, { 254,-73104 }, + { 255,-73104 }, { 0, 85 }, { 0,18762 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-73361 }, { 49,-73361 }, { 50,-73361 }, { 51,-73361 }, { 52,-73361 }, + { 53,-73361 }, { 54,-73361 }, { 55,-73361 }, { 56,-73361 }, { 57,-73361 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-73361 }, { 66,-73361 }, { 67,-73361 }, + { 68,-73361 }, { 69,-73361 }, { 70,-73361 }, { 71,-73361 }, { 72,-73361 }, + + { 73,-73361 }, { 74,-73361 }, { 75,-73361 }, { 76,-73361 }, { 77,-73361 }, + { 78,-73361 }, { 79,-73361 }, { 80,-73361 }, { 81,-73361 }, { 82,-73361 }, + { 83,-73361 }, { 84,-73361 }, { 85,-73361 }, { 86,-73361 }, { 87,-73361 }, + { 88,-73361 }, { 89,-73361 }, { 90,-73361 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-73361 }, { 0, 0 }, { 97,-73361 }, + { 98,-73361 }, { 99,-73361 }, { 100,-73361 }, { 101,-73361 }, { 102,-73361 }, + { 103,-73361 }, { 104,-73361 }, { 105,-73361 }, { 106,-73361 }, { 107,-73361 }, + { 108,-73361 }, { 109,-73361 }, { 110,-73361 }, { 111,-73361 }, { 112,-73361 }, + { 113,-73361 }, { 114,-73361 }, { 115,-73361 }, { 116,-73361 }, { 117,-73361 }, + { 118,-73361 }, { 119,-73361 }, { 120,-73361 }, { 121,-73361 }, { 122,-73361 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-73361 }, + { 128,-73361 }, { 129,-73361 }, { 130,-73361 }, { 131,-73361 }, { 132,-73361 }, + { 133,-73361 }, { 134,-73361 }, { 135,-73361 }, { 136,-73361 }, { 137,-73361 }, + { 138,-73361 }, { 139,-73361 }, { 140,-73361 }, { 141,-73361 }, { 142,-73361 }, + { 143,-73361 }, { 144,-73361 }, { 145,-73361 }, { 146,-73361 }, { 147,-73361 }, + { 148,-73361 }, { 149,-73361 }, { 150,-73361 }, { 151,-73361 }, { 152,-73361 }, + { 153,-73361 }, { 154,-73361 }, { 155,-73361 }, { 156,-73361 }, { 157,-73361 }, + { 158,-73361 }, { 159,-73361 }, { 160,-73361 }, { 161,-73361 }, { 162,-73361 }, + { 163,-73361 }, { 164,-73361 }, { 165,-73361 }, { 166,-73361 }, { 167,-73361 }, + { 168,-73361 }, { 169,-73361 }, { 170,-73361 }, { 171,-73361 }, { 172,-73361 }, + + { 173,-73361 }, { 174,-73361 }, { 175,-73361 }, { 176,-73361 }, { 177,-73361 }, + { 178,-73361 }, { 179,-73361 }, { 180,-73361 }, { 181,-73361 }, { 182,-73361 }, + { 183,-73361 }, { 184,-73361 }, { 185,-73361 }, { 186,-73361 }, { 187,-73361 }, + { 188,-73361 }, { 189,-73361 }, { 190,-73361 }, { 191,-73361 }, { 192,-73361 }, + { 193,-73361 }, { 194,-73361 }, { 195,-73361 }, { 196,-73361 }, { 197,-73361 }, + { 198,-73361 }, { 199,-73361 }, { 200,-73361 }, { 201,-73361 }, { 202,-73361 }, + { 203,-73361 }, { 204,-73361 }, { 205,-73361 }, { 206,-73361 }, { 207,-73361 }, + { 208,-73361 }, { 209,-73361 }, { 210,-73361 }, { 211,-73361 }, { 212,-73361 }, + { 213,-73361 }, { 214,-73361 }, { 215,-73361 }, { 216,-73361 }, { 217,-73361 }, + { 218,-73361 }, { 219,-73361 }, { 220,-73361 }, { 221,-73361 }, { 222,-73361 }, + + { 223,-73361 }, { 224,-73361 }, { 225,-73361 }, { 226,-73361 }, { 227,-73361 }, + { 228,-73361 }, { 229,-73361 }, { 230,-73361 }, { 231,-73361 }, { 232,-73361 }, + { 233,-73361 }, { 234,-73361 }, { 235,-73361 }, { 236,-73361 }, { 237,-73361 }, + { 238,-73361 }, { 239,-73361 }, { 240,-73361 }, { 241,-73361 }, { 242,-73361 }, + { 243,-73361 }, { 244,-73361 }, { 245,-73361 }, { 246,-73361 }, { 247,-73361 }, + { 248,-73361 }, { 249,-73361 }, { 250,-73361 }, { 251,-73361 }, { 252,-73361 }, + { 253,-73361 }, { 254,-73361 }, { 255,-73361 }, { 0, 131 }, { 0,18505 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-73618 }, { 49,-73618 }, { 50,-73618 }, + { 51,-73618 }, { 52,-73618 }, { 53,-73618 }, { 54,-73618 }, { 55,-73618 }, + { 56,-73618 }, { 57,-73618 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-73618 }, + + { 66,-73618 }, { 67,-73618 }, { 68,-73618 }, { 69,-73618 }, { 70,-73618 }, + { 71,-73618 }, { 72,-73618 }, { 73,-73618 }, { 74,-73618 }, { 75,-73618 }, + { 76,-73618 }, { 77,-73618 }, { 78,-73618 }, { 79,-73618 }, { 80,-73618 }, + { 81,-73618 }, { 82,-73618 }, { 83,-73618 }, { 84,-73618 }, { 85,-73618 }, + { 86,-73618 }, { 87,-73618 }, { 88,-73618 }, { 89,-73618 }, { 90,-73618 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,6168 }, + { 0, 0 }, { 97,-73618 }, { 98,-73618 }, { 99,-73618 }, { 100,-73618 }, + { 101,-73618 }, { 102,-73618 }, { 103,-73618 }, { 104,-73618 }, { 105,-73618 }, + { 106,-73618 }, { 107,-73618 }, { 108,-73618 }, { 109,-73618 }, { 110,-73618 }, + { 111,-73618 }, { 112,-73618 }, { 113,-73618 }, { 114,-73618 }, { 115,-73618 }, + + { 116,-73618 }, { 117,-73618 }, { 118,-73618 }, { 119,-73618 }, { 120,-73618 }, + { 121,-73618 }, { 122,-73618 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-73618 }, { 128,-73618 }, { 129,-73618 }, { 130,-73618 }, + { 131,-73618 }, { 132,-73618 }, { 133,-73618 }, { 134,-73618 }, { 135,-73618 }, + { 136,-73618 }, { 137,-73618 }, { 138,-73618 }, { 139,-73618 }, { 140,-73618 }, + { 141,-73618 }, { 142,-73618 }, { 143,-73618 }, { 144,-73618 }, { 145,-73618 }, + { 146,-73618 }, { 147,-73618 }, { 148,-73618 }, { 149,-73618 }, { 150,-73618 }, + { 151,-73618 }, { 152,-73618 }, { 153,-73618 }, { 154,-73618 }, { 155,-73618 }, + { 156,-73618 }, { 157,-73618 }, { 158,-73618 }, { 159,-73618 }, { 160,-73618 }, + { 161,-73618 }, { 162,-73618 }, { 163,-73618 }, { 164,-73618 }, { 165,-73618 }, + + { 166,-73618 }, { 167,-73618 }, { 168,-73618 }, { 169,-73618 }, { 170,-73618 }, + { 171,-73618 }, { 172,-73618 }, { 173,-73618 }, { 174,-73618 }, { 175,-73618 }, + { 176,-73618 }, { 177,-73618 }, { 178,-73618 }, { 179,-73618 }, { 180,-73618 }, + { 181,-73618 }, { 182,-73618 }, { 183,-73618 }, { 184,-73618 }, { 185,-73618 }, + { 186,-73618 }, { 187,-73618 }, { 188,-73618 }, { 189,-73618 }, { 190,-73618 }, + { 191,-73618 }, { 192,-73618 }, { 193,-73618 }, { 194,-73618 }, { 195,-73618 }, + { 196,-73618 }, { 197,-73618 }, { 198,-73618 }, { 199,-73618 }, { 200,-73618 }, + { 201,-73618 }, { 202,-73618 }, { 203,-73618 }, { 204,-73618 }, { 205,-73618 }, + { 206,-73618 }, { 207,-73618 }, { 208,-73618 }, { 209,-73618 }, { 210,-73618 }, + { 211,-73618 }, { 212,-73618 }, { 213,-73618 }, { 214,-73618 }, { 215,-73618 }, + + { 216,-73618 }, { 217,-73618 }, { 218,-73618 }, { 219,-73618 }, { 220,-73618 }, + { 221,-73618 }, { 222,-73618 }, { 223,-73618 }, { 224,-73618 }, { 225,-73618 }, + { 226,-73618 }, { 227,-73618 }, { 228,-73618 }, { 229,-73618 }, { 230,-73618 }, + { 231,-73618 }, { 232,-73618 }, { 233,-73618 }, { 234,-73618 }, { 235,-73618 }, + { 236,-73618 }, { 237,-73618 }, { 238,-73618 }, { 239,-73618 }, { 240,-73618 }, + { 241,-73618 }, { 242,-73618 }, { 243,-73618 }, { 244,-73618 }, { 245,-73618 }, + { 246,-73618 }, { 247,-73618 }, { 248,-73618 }, { 249,-73618 }, { 250,-73618 }, + { 251,-73618 }, { 252,-73618 }, { 253,-73618 }, { 254,-73618 }, { 255,-73618 }, + { 0, 131 }, { 0,18248 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-73875 }, + { 49,-73875 }, { 50,-73875 }, { 51,-73875 }, { 52,-73875 }, { 53,-73875 }, + { 54,-73875 }, { 55,-73875 }, { 56,-73875 }, { 57,-73875 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-73875 }, { 66,-73875 }, { 67,-73875 }, { 68,-73875 }, + { 69,-73875 }, { 70,-73875 }, { 71,-73875 }, { 72,-73875 }, { 73,6168 }, + { 74,-73875 }, { 75,-73875 }, { 76,-73875 }, { 77,-73875 }, { 78,-73875 }, + { 79,-73875 }, { 80,-73875 }, { 81,-73875 }, { 82,-73875 }, { 83,-73875 }, + { 84,-73875 }, { 85,-73875 }, { 86,-73875 }, { 87,-73875 }, { 88,-73875 }, + { 89,-73875 }, { 90,-73875 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-73875 }, { 0, 0 }, { 97,-73875 }, { 98,-73875 }, + { 99,-73875 }, { 100,-73875 }, { 101,-73875 }, { 102,-73875 }, { 103,-73875 }, + { 104,-73875 }, { 105,6168 }, { 106,-73875 }, { 107,-73875 }, { 108,-73875 }, + + { 109,-73875 }, { 110,-73875 }, { 111,-73875 }, { 112,-73875 }, { 113,-73875 }, + { 114,-73875 }, { 115,-73875 }, { 116,-73875 }, { 117,-73875 }, { 118,-73875 }, + { 119,-73875 }, { 120,-73875 }, { 121,-73875 }, { 122,-73875 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-73875 }, { 128,-73875 }, + { 129,-73875 }, { 130,-73875 }, { 131,-73875 }, { 132,-73875 }, { 133,-73875 }, + { 134,-73875 }, { 135,-73875 }, { 136,-73875 }, { 137,-73875 }, { 138,-73875 }, + { 139,-73875 }, { 140,-73875 }, { 141,-73875 }, { 142,-73875 }, { 143,-73875 }, + { 144,-73875 }, { 145,-73875 }, { 146,-73875 }, { 147,-73875 }, { 148,-73875 }, + { 149,-73875 }, { 150,-73875 }, { 151,-73875 }, { 152,-73875 }, { 153,-73875 }, + { 154,-73875 }, { 155,-73875 }, { 156,-73875 }, { 157,-73875 }, { 158,-73875 }, + + { 159,-73875 }, { 160,-73875 }, { 161,-73875 }, { 162,-73875 }, { 163,-73875 }, + { 164,-73875 }, { 165,-73875 }, { 166,-73875 }, { 167,-73875 }, { 168,-73875 }, + { 169,-73875 }, { 170,-73875 }, { 171,-73875 }, { 172,-73875 }, { 173,-73875 }, + { 174,-73875 }, { 175,-73875 }, { 176,-73875 }, { 177,-73875 }, { 178,-73875 }, + { 179,-73875 }, { 180,-73875 }, { 181,-73875 }, { 182,-73875 }, { 183,-73875 }, + { 184,-73875 }, { 185,-73875 }, { 186,-73875 }, { 187,-73875 }, { 188,-73875 }, + { 189,-73875 }, { 190,-73875 }, { 191,-73875 }, { 192,-73875 }, { 193,-73875 }, + { 194,-73875 }, { 195,-73875 }, { 196,-73875 }, { 197,-73875 }, { 198,-73875 }, + { 199,-73875 }, { 200,-73875 }, { 201,-73875 }, { 202,-73875 }, { 203,-73875 }, + { 204,-73875 }, { 205,-73875 }, { 206,-73875 }, { 207,-73875 }, { 208,-73875 }, + + { 209,-73875 }, { 210,-73875 }, { 211,-73875 }, { 212,-73875 }, { 213,-73875 }, + { 214,-73875 }, { 215,-73875 }, { 216,-73875 }, { 217,-73875 }, { 218,-73875 }, + { 219,-73875 }, { 220,-73875 }, { 221,-73875 }, { 222,-73875 }, { 223,-73875 }, + { 224,-73875 }, { 225,-73875 }, { 226,-73875 }, { 227,-73875 }, { 228,-73875 }, + { 229,-73875 }, { 230,-73875 }, { 231,-73875 }, { 232,-73875 }, { 233,-73875 }, + { 234,-73875 }, { 235,-73875 }, { 236,-73875 }, { 237,-73875 }, { 238,-73875 }, + { 239,-73875 }, { 240,-73875 }, { 241,-73875 }, { 242,-73875 }, { 243,-73875 }, + { 244,-73875 }, { 245,-73875 }, { 246,-73875 }, { 247,-73875 }, { 248,-73875 }, + { 249,-73875 }, { 250,-73875 }, { 251,-73875 }, { 252,-73875 }, { 253,-73875 }, + { 254,-73875 }, { 255,-73875 }, { 0, 131 }, { 0,17991 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-74132 }, { 49,-74132 }, { 50,-74132 }, { 51,-74132 }, + + { 52,-74132 }, { 53,-74132 }, { 54,-74132 }, { 55,-74132 }, { 56,-74132 }, + { 57,-74132 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-74132 }, { 66,-74132 }, + { 67,6168 }, { 68,-74132 }, { 69,-74132 }, { 70,-74132 }, { 71,-74132 }, + { 72,-74132 }, { 73,-74132 }, { 74,-74132 }, { 75,-74132 }, { 76,-74132 }, + { 77,-74132 }, { 78,-74132 }, { 79,-74132 }, { 80,-74132 }, { 81,-74132 }, + { 82,-74132 }, { 83,-74132 }, { 84,-74132 }, { 85,-74132 }, { 86,-74132 }, + { 87,-74132 }, { 88,-74132 }, { 89,-74132 }, { 90,-74132 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-74132 }, { 0, 0 }, + { 97,-74132 }, { 98,-74132 }, { 99,6168 }, { 100,-74132 }, { 101,-74132 }, + + { 102,-74132 }, { 103,-74132 }, { 104,-74132 }, { 105,-74132 }, { 106,-74132 }, + { 107,-74132 }, { 108,-74132 }, { 109,-74132 }, { 110,-74132 }, { 111,-74132 }, + { 112,-74132 }, { 113,-74132 }, { 114,-74132 }, { 115,-74132 }, { 116,-74132 }, + { 117,-74132 }, { 118,-74132 }, { 119,-74132 }, { 120,-74132 }, { 121,-74132 }, + { 122,-74132 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-74132 }, { 128,-74132 }, { 129,-74132 }, { 130,-74132 }, { 131,-74132 }, + { 132,-74132 }, { 133,-74132 }, { 134,-74132 }, { 135,-74132 }, { 136,-74132 }, + { 137,-74132 }, { 138,-74132 }, { 139,-74132 }, { 140,-74132 }, { 141,-74132 }, + { 142,-74132 }, { 143,-74132 }, { 144,-74132 }, { 145,-74132 }, { 146,-74132 }, + { 147,-74132 }, { 148,-74132 }, { 149,-74132 }, { 150,-74132 }, { 151,-74132 }, + + { 152,-74132 }, { 153,-74132 }, { 154,-74132 }, { 155,-74132 }, { 156,-74132 }, + { 157,-74132 }, { 158,-74132 }, { 159,-74132 }, { 160,-74132 }, { 161,-74132 }, + { 162,-74132 }, { 163,-74132 }, { 164,-74132 }, { 165,-74132 }, { 166,-74132 }, + { 167,-74132 }, { 168,-74132 }, { 169,-74132 }, { 170,-74132 }, { 171,-74132 }, + { 172,-74132 }, { 173,-74132 }, { 174,-74132 }, { 175,-74132 }, { 176,-74132 }, + { 177,-74132 }, { 178,-74132 }, { 179,-74132 }, { 180,-74132 }, { 181,-74132 }, + { 182,-74132 }, { 183,-74132 }, { 184,-74132 }, { 185,-74132 }, { 186,-74132 }, + { 187,-74132 }, { 188,-74132 }, { 189,-74132 }, { 190,-74132 }, { 191,-74132 }, + { 192,-74132 }, { 193,-74132 }, { 194,-74132 }, { 195,-74132 }, { 196,-74132 }, + { 197,-74132 }, { 198,-74132 }, { 199,-74132 }, { 200,-74132 }, { 201,-74132 }, + + { 202,-74132 }, { 203,-74132 }, { 204,-74132 }, { 205,-74132 }, { 206,-74132 }, + { 207,-74132 }, { 208,-74132 }, { 209,-74132 }, { 210,-74132 }, { 211,-74132 }, + { 212,-74132 }, { 213,-74132 }, { 214,-74132 }, { 215,-74132 }, { 216,-74132 }, + { 217,-74132 }, { 218,-74132 }, { 219,-74132 }, { 220,-74132 }, { 221,-74132 }, + { 222,-74132 }, { 223,-74132 }, { 224,-74132 }, { 225,-74132 }, { 226,-74132 }, + { 227,-74132 }, { 228,-74132 }, { 229,-74132 }, { 230,-74132 }, { 231,-74132 }, + { 232,-74132 }, { 233,-74132 }, { 234,-74132 }, { 235,-74132 }, { 236,-74132 }, + { 237,-74132 }, { 238,-74132 }, { 239,-74132 }, { 240,-74132 }, { 241,-74132 }, + { 242,-74132 }, { 243,-74132 }, { 244,-74132 }, { 245,-74132 }, { 246,-74132 }, + { 247,-74132 }, { 248,-74132 }, { 249,-74132 }, { 250,-74132 }, { 251,-74132 }, + + { 252,-74132 }, { 253,-74132 }, { 254,-74132 }, { 255,-74132 }, { 0, 131 }, + { 0,17734 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-74389 }, { 49,-74389 }, + { 50,-74389 }, { 51,-74389 }, { 52,-74389 }, { 53,-74389 }, { 54,-74389 }, + { 55,-74389 }, { 56,-74389 }, { 57,-74389 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-74389 }, { 66,-74389 }, { 67,-74389 }, { 68,-74389 }, { 69,-74389 }, + { 70,-74389 }, { 71,-74389 }, { 72,-74389 }, { 73,-74389 }, { 74,-74389 }, + { 75,-74389 }, { 76,-74389 }, { 77,-74389 }, { 78,-74389 }, { 79,-74389 }, + { 80,-74389 }, { 81,-74389 }, { 82,-74389 }, { 83,-74389 }, { 84,-74389 }, + { 85,-74389 }, { 86,-74389 }, { 87,-74389 }, { 88,-74389 }, { 89,-74389 }, + { 90,-74389 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 95,6168 }, { 0, 0 }, { 97,-74389 }, { 98,-74389 }, { 99,-74389 }, + { 100,-74389 }, { 101,-74389 }, { 102,-74389 }, { 103,-74389 }, { 104,-74389 }, + { 105,-74389 }, { 106,-74389 }, { 107,-74389 }, { 108,-74389 }, { 109,-74389 }, + { 110,-74389 }, { 111,-74389 }, { 112,-74389 }, { 113,-74389 }, { 114,-74389 }, + { 115,-74389 }, { 116,-74389 }, { 117,-74389 }, { 118,-74389 }, { 119,-74389 }, + { 120,-74389 }, { 121,-74389 }, { 122,-74389 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-74389 }, { 128,-74389 }, { 129,-74389 }, + { 130,-74389 }, { 131,-74389 }, { 132,-74389 }, { 133,-74389 }, { 134,-74389 }, + { 135,-74389 }, { 136,-74389 }, { 137,-74389 }, { 138,-74389 }, { 139,-74389 }, + { 140,-74389 }, { 141,-74389 }, { 142,-74389 }, { 143,-74389 }, { 144,-74389 }, + + { 145,-74389 }, { 146,-74389 }, { 147,-74389 }, { 148,-74389 }, { 149,-74389 }, + { 150,-74389 }, { 151,-74389 }, { 152,-74389 }, { 153,-74389 }, { 154,-74389 }, + { 155,-74389 }, { 156,-74389 }, { 157,-74389 }, { 158,-74389 }, { 159,-74389 }, + { 160,-74389 }, { 161,-74389 }, { 162,-74389 }, { 163,-74389 }, { 164,-74389 }, + { 165,-74389 }, { 166,-74389 }, { 167,-74389 }, { 168,-74389 }, { 169,-74389 }, + { 170,-74389 }, { 171,-74389 }, { 172,-74389 }, { 173,-74389 }, { 174,-74389 }, + { 175,-74389 }, { 176,-74389 }, { 177,-74389 }, { 178,-74389 }, { 179,-74389 }, + { 180,-74389 }, { 181,-74389 }, { 182,-74389 }, { 183,-74389 }, { 184,-74389 }, + { 185,-74389 }, { 186,-74389 }, { 187,-74389 }, { 188,-74389 }, { 189,-74389 }, + { 190,-74389 }, { 191,-74389 }, { 192,-74389 }, { 193,-74389 }, { 194,-74389 }, + + { 195,-74389 }, { 196,-74389 }, { 197,-74389 }, { 198,-74389 }, { 199,-74389 }, + { 200,-74389 }, { 201,-74389 }, { 202,-74389 }, { 203,-74389 }, { 204,-74389 }, + { 205,-74389 }, { 206,-74389 }, { 207,-74389 }, { 208,-74389 }, { 209,-74389 }, + { 210,-74389 }, { 211,-74389 }, { 212,-74389 }, { 213,-74389 }, { 214,-74389 }, + { 215,-74389 }, { 216,-74389 }, { 217,-74389 }, { 218,-74389 }, { 219,-74389 }, + { 220,-74389 }, { 221,-74389 }, { 222,-74389 }, { 223,-74389 }, { 224,-74389 }, + { 225,-74389 }, { 226,-74389 }, { 227,-74389 }, { 228,-74389 }, { 229,-74389 }, + { 230,-74389 }, { 231,-74389 }, { 232,-74389 }, { 233,-74389 }, { 234,-74389 }, + { 235,-74389 }, { 236,-74389 }, { 237,-74389 }, { 238,-74389 }, { 239,-74389 }, + { 240,-74389 }, { 241,-74389 }, { 242,-74389 }, { 243,-74389 }, { 244,-74389 }, + + { 245,-74389 }, { 246,-74389 }, { 247,-74389 }, { 248,-74389 }, { 249,-74389 }, + { 250,-74389 }, { 251,-74389 }, { 252,-74389 }, { 253,-74389 }, { 254,-74389 }, + { 255,-74389 }, { 0, 131 }, { 0,17477 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-74646 }, { 49,-74646 }, { 50,-74646 }, { 51,-74646 }, { 52,-74646 }, + { 53,-74646 }, { 54,-74646 }, { 55,-74646 }, { 56,-74646 }, { 57,-74646 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-74646 }, { 66,-74646 }, { 67,-74646 }, + { 68,6168 }, { 69,-74646 }, { 70,-74646 }, { 71,-74646 }, { 72,-74646 }, + { 73,-74646 }, { 74,-74646 }, { 75,-74646 }, { 76,-74646 }, { 77,-74646 }, + { 78,-74646 }, { 79,-74646 }, { 80,-74646 }, { 81,-74646 }, { 82,-74646 }, + { 83,-74646 }, { 84,-74646 }, { 85,-74646 }, { 86,-74646 }, { 87,-74646 }, + + { 88,-74646 }, { 89,-74646 }, { 90,-74646 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-74646 }, { 0, 0 }, { 97,-74646 }, + { 98,-74646 }, { 99,-74646 }, { 100,6168 }, { 101,-74646 }, { 102,-74646 }, + { 103,-74646 }, { 104,-74646 }, { 105,-74646 }, { 106,-74646 }, { 107,-74646 }, + { 108,-74646 }, { 109,-74646 }, { 110,-74646 }, { 111,-74646 }, { 112,-74646 }, + { 113,-74646 }, { 114,-74646 }, { 115,-74646 }, { 116,-74646 }, { 117,-74646 }, + { 118,-74646 }, { 119,-74646 }, { 120,-74646 }, { 121,-74646 }, { 122,-74646 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-74646 }, + { 128,-74646 }, { 129,-74646 }, { 130,-74646 }, { 131,-74646 }, { 132,-74646 }, + { 133,-74646 }, { 134,-74646 }, { 135,-74646 }, { 136,-74646 }, { 137,-74646 }, + + { 138,-74646 }, { 139,-74646 }, { 140,-74646 }, { 141,-74646 }, { 142,-74646 }, + { 143,-74646 }, { 144,-74646 }, { 145,-74646 }, { 146,-74646 }, { 147,-74646 }, + { 148,-74646 }, { 149,-74646 }, { 150,-74646 }, { 151,-74646 }, { 152,-74646 }, + { 153,-74646 }, { 154,-74646 }, { 155,-74646 }, { 156,-74646 }, { 157,-74646 }, + { 158,-74646 }, { 159,-74646 }, { 160,-74646 }, { 161,-74646 }, { 162,-74646 }, + { 163,-74646 }, { 164,-74646 }, { 165,-74646 }, { 166,-74646 }, { 167,-74646 }, + { 168,-74646 }, { 169,-74646 }, { 170,-74646 }, { 171,-74646 }, { 172,-74646 }, + { 173,-74646 }, { 174,-74646 }, { 175,-74646 }, { 176,-74646 }, { 177,-74646 }, + { 178,-74646 }, { 179,-74646 }, { 180,-74646 }, { 181,-74646 }, { 182,-74646 }, + { 183,-74646 }, { 184,-74646 }, { 185,-74646 }, { 186,-74646 }, { 187,-74646 }, + + { 188,-74646 }, { 189,-74646 }, { 190,-74646 }, { 191,-74646 }, { 192,-74646 }, + { 193,-74646 }, { 194,-74646 }, { 195,-74646 }, { 196,-74646 }, { 197,-74646 }, + { 198,-74646 }, { 199,-74646 }, { 200,-74646 }, { 201,-74646 }, { 202,-74646 }, + { 203,-74646 }, { 204,-74646 }, { 205,-74646 }, { 206,-74646 }, { 207,-74646 }, + { 208,-74646 }, { 209,-74646 }, { 210,-74646 }, { 211,-74646 }, { 212,-74646 }, + { 213,-74646 }, { 214,-74646 }, { 215,-74646 }, { 216,-74646 }, { 217,-74646 }, + { 218,-74646 }, { 219,-74646 }, { 220,-74646 }, { 221,-74646 }, { 222,-74646 }, + { 223,-74646 }, { 224,-74646 }, { 225,-74646 }, { 226,-74646 }, { 227,-74646 }, + { 228,-74646 }, { 229,-74646 }, { 230,-74646 }, { 231,-74646 }, { 232,-74646 }, + { 233,-74646 }, { 234,-74646 }, { 235,-74646 }, { 236,-74646 }, { 237,-74646 }, + + { 238,-74646 }, { 239,-74646 }, { 240,-74646 }, { 241,-74646 }, { 242,-74646 }, + { 243,-74646 }, { 244,-74646 }, { 245,-74646 }, { 246,-74646 }, { 247,-74646 }, + { 248,-74646 }, { 249,-74646 }, { 250,-74646 }, { 251,-74646 }, { 252,-74646 }, + { 253,-74646 }, { 254,-74646 }, { 255,-74646 }, { 0, 131 }, { 0,17220 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-74903 }, { 49,-74903 }, { 50,-74903 }, + { 51,-74903 }, { 52,-74903 }, { 53,-74903 }, { 54,-74903 }, { 55,-74903 }, + { 56,-74903 }, { 57,-74903 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-74903 }, + { 66,-74903 }, { 67,-74903 }, { 68,-74903 }, { 69,-74903 }, { 70,-74903 }, + { 71,-74903 }, { 72,-74903 }, { 73,-74903 }, { 74,-74903 }, { 75,-74903 }, + { 76,-74903 }, { 77,-74903 }, { 78,-74903 }, { 79,-74903 }, { 80,6168 }, + + { 81,-74903 }, { 82,-74903 }, { 83,-74903 }, { 84,-74903 }, { 85,-74903 }, + { 86,-74903 }, { 87,-74903 }, { 88,-74903 }, { 89,-74903 }, { 90,-74903 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-74903 }, + { 0, 0 }, { 97,-74903 }, { 98,-74903 }, { 99,-74903 }, { 100,-74903 }, + { 101,-74903 }, { 102,-74903 }, { 103,-74903 }, { 104,-74903 }, { 105,-74903 }, + { 106,-74903 }, { 107,-74903 }, { 108,-74903 }, { 109,-74903 }, { 110,-74903 }, + { 111,-74903 }, { 112,6168 }, { 113,-74903 }, { 114,-74903 }, { 115,-74903 }, + { 116,-74903 }, { 117,-74903 }, { 118,-74903 }, { 119,-74903 }, { 120,-74903 }, + { 121,-74903 }, { 122,-74903 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-74903 }, { 128,-74903 }, { 129,-74903 }, { 130,-74903 }, + + { 131,-74903 }, { 132,-74903 }, { 133,-74903 }, { 134,-74903 }, { 135,-74903 }, + { 136,-74903 }, { 137,-74903 }, { 138,-74903 }, { 139,-74903 }, { 140,-74903 }, + { 141,-74903 }, { 142,-74903 }, { 143,-74903 }, { 144,-74903 }, { 145,-74903 }, + { 146,-74903 }, { 147,-74903 }, { 148,-74903 }, { 149,-74903 }, { 150,-74903 }, + { 151,-74903 }, { 152,-74903 }, { 153,-74903 }, { 154,-74903 }, { 155,-74903 }, + { 156,-74903 }, { 157,-74903 }, { 158,-74903 }, { 159,-74903 }, { 160,-74903 }, + { 161,-74903 }, { 162,-74903 }, { 163,-74903 }, { 164,-74903 }, { 165,-74903 }, + { 166,-74903 }, { 167,-74903 }, { 168,-74903 }, { 169,-74903 }, { 170,-74903 }, + { 171,-74903 }, { 172,-74903 }, { 173,-74903 }, { 174,-74903 }, { 175,-74903 }, + { 176,-74903 }, { 177,-74903 }, { 178,-74903 }, { 179,-74903 }, { 180,-74903 }, + + { 181,-74903 }, { 182,-74903 }, { 183,-74903 }, { 184,-74903 }, { 185,-74903 }, + { 186,-74903 }, { 187,-74903 }, { 188,-74903 }, { 189,-74903 }, { 190,-74903 }, + { 191,-74903 }, { 192,-74903 }, { 193,-74903 }, { 194,-74903 }, { 195,-74903 }, + { 196,-74903 }, { 197,-74903 }, { 198,-74903 }, { 199,-74903 }, { 200,-74903 }, + { 201,-74903 }, { 202,-74903 }, { 203,-74903 }, { 204,-74903 }, { 205,-74903 }, + { 206,-74903 }, { 207,-74903 }, { 208,-74903 }, { 209,-74903 }, { 210,-74903 }, + { 211,-74903 }, { 212,-74903 }, { 213,-74903 }, { 214,-74903 }, { 215,-74903 }, + { 216,-74903 }, { 217,-74903 }, { 218,-74903 }, { 219,-74903 }, { 220,-74903 }, + { 221,-74903 }, { 222,-74903 }, { 223,-74903 }, { 224,-74903 }, { 225,-74903 }, + { 226,-74903 }, { 227,-74903 }, { 228,-74903 }, { 229,-74903 }, { 230,-74903 }, + + { 231,-74903 }, { 232,-74903 }, { 233,-74903 }, { 234,-74903 }, { 235,-74903 }, + { 236,-74903 }, { 237,-74903 }, { 238,-74903 }, { 239,-74903 }, { 240,-74903 }, + { 241,-74903 }, { 242,-74903 }, { 243,-74903 }, { 244,-74903 }, { 245,-74903 }, + { 246,-74903 }, { 247,-74903 }, { 248,-74903 }, { 249,-74903 }, { 250,-74903 }, + { 251,-74903 }, { 252,-74903 }, { 253,-74903 }, { 254,-74903 }, { 255,-74903 }, + { 0, 131 }, { 0,16963 }, { 0, 0 }, { 0,16961 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 9,6168 }, { 10,6168 }, { 0, 0 }, + { 0, 0 }, { 13,6168 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 32,6168 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-75160 }, + { 49,-75160 }, { 50,-75160 }, { 51,-75160 }, { 52,-75160 }, { 53,-75160 }, + { 54,-75160 }, { 55,-75160 }, { 56,-75160 }, { 57,-75160 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 62,-75177 }, { 65,-75160 }, { 66,-75160 }, { 67,-75160 }, { 68,-75160 }, + { 69,-75160 }, { 70,-75160 }, { 71,-75160 }, { 72,-75160 }, { 73,-75160 }, + + { 74,-75160 }, { 75,-75160 }, { 76,-75160 }, { 77,-75160 }, { 78,-75160 }, + { 79,-75160 }, { 80,-75160 }, { 81,-75160 }, { 82,-75160 }, { 83,-75160 }, + { 84,-75160 }, { 85,-75160 }, { 86,-75160 }, { 87,-75160 }, { 88,-75160 }, + { 89,-75160 }, { 90,-75160 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,6168 }, { 0, 0 }, { 97,-75160 }, { 98,-75160 }, + { 99,-75160 }, { 100,-75160 }, { 101,-75160 }, { 102,-75160 }, { 103,-75160 }, + { 104,-75160 }, { 105,-75160 }, { 106,-75160 }, { 107,-75160 }, { 108,-75160 }, + { 109,-75160 }, { 110,-75160 }, { 111,-75160 }, { 112,-75160 }, { 113,-75160 }, + { 114,-75160 }, { 115,-75160 }, { 116,-75160 }, { 117,-75160 }, { 118,-75160 }, + { 119,-75160 }, { 120,-75160 }, { 121,-75160 }, { 122,-75160 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-75160 }, { 128,-75160 }, + { 129,-75160 }, { 130,-75160 }, { 131,-75160 }, { 132,-75160 }, { 133,-75160 }, + { 134,-75160 }, { 135,-75160 }, { 136,-75160 }, { 137,-75160 }, { 138,-75160 }, + { 139,-75160 }, { 140,-75160 }, { 141,-75160 }, { 142,-75160 }, { 143,-75160 }, + { 144,-75160 }, { 145,-75160 }, { 146,-75160 }, { 147,-75160 }, { 148,-75160 }, + { 149,-75160 }, { 150,-75160 }, { 151,-75160 }, { 152,-75160 }, { 153,-75160 }, + { 154,-75160 }, { 155,-75160 }, { 156,-75160 }, { 157,-75160 }, { 158,-75160 }, + { 159,-75160 }, { 160,-75160 }, { 161,-75160 }, { 162,-75160 }, { 163,-75160 }, + { 164,-75160 }, { 165,-75160 }, { 166,-75160 }, { 167,-75160 }, { 168,-75160 }, + { 169,-75160 }, { 170,-75160 }, { 171,-75160 }, { 172,-75160 }, { 173,-75160 }, + + { 174,-75160 }, { 175,-75160 }, { 176,-75160 }, { 177,-75160 }, { 178,-75160 }, + { 179,-75160 }, { 180,-75160 }, { 181,-75160 }, { 182,-75160 }, { 183,-75160 }, + { 184,-75160 }, { 185,-75160 }, { 186,-75160 }, { 187,-75160 }, { 188,-75160 }, + { 189,-75160 }, { 190,-75160 }, { 191,-75160 }, { 192,-75160 }, { 193,-75160 }, + { 194,-75160 }, { 195,-75160 }, { 196,-75160 }, { 197,-75160 }, { 198,-75160 }, + { 199,-75160 }, { 200,-75160 }, { 201,-75160 }, { 202,-75160 }, { 203,-75160 }, + { 204,-75160 }, { 205,-75160 }, { 206,-75160 }, { 207,-75160 }, { 208,-75160 }, + { 209,-75160 }, { 210,-75160 }, { 211,-75160 }, { 212,-75160 }, { 213,-75160 }, + { 214,-75160 }, { 215,-75160 }, { 216,-75160 }, { 217,-75160 }, { 218,-75160 }, + { 219,-75160 }, { 220,-75160 }, { 221,-75160 }, { 222,-75160 }, { 223,-75160 }, + + { 224,-75160 }, { 225,-75160 }, { 226,-75160 }, { 227,-75160 }, { 228,-75160 }, + { 229,-75160 }, { 230,-75160 }, { 231,-75160 }, { 232,-75160 }, { 233,-75160 }, + { 234,-75160 }, { 235,-75160 }, { 236,-75160 }, { 237,-75160 }, { 238,-75160 }, + { 239,-75160 }, { 240,-75160 }, { 241,-75160 }, { 242,-75160 }, { 243,-75160 }, + { 244,-75160 }, { 245,-75160 }, { 246,-75160 }, { 247,-75160 }, { 248,-75160 }, + { 249,-75160 }, { 250,-75160 }, { 251,-75160 }, { 252,-75160 }, { 253,-75160 }, + { 254,-75160 }, { 255,-75160 }, { 0, 62 }, { 0,16706 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-75417 }, { 49,-75417 }, { 50,-75417 }, { 51,-75417 }, + { 52,-75417 }, { 53,-75417 }, { 54,-75417 }, { 55,-75417 }, { 56,-75417 }, + { 57,-75417 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-75417 }, { 66,-75417 }, + + { 67,-75417 }, { 68,-75417 }, { 69,-75417 }, { 70,-75417 }, { 71,-75417 }, + { 72,-75417 }, { 73,-75417 }, { 74,-75417 }, { 75,-75417 }, { 76,-75417 }, + { 77,-75417 }, { 78,-75417 }, { 79,-75417 }, { 80,-75417 }, { 81,-75417 }, + { 82,-75417 }, { 83,-75417 }, { 84,-75417 }, { 85,-75417 }, { 86,-75417 }, + { 87,-75417 }, { 88,-75417 }, { 89,-75417 }, { 90,-75417 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-75417 }, { 0, 0 }, + { 97,-75417 }, { 98,-75417 }, { 99,-75417 }, { 100,-75417 }, { 101,-75417 }, + { 102,-75417 }, { 103,-75417 }, { 104,-75417 }, { 105,-75417 }, { 106,-75417 }, + { 107,-75417 }, { 108,-75417 }, { 109,-75417 }, { 110,-75417 }, { 111,-75417 }, + { 112,-75417 }, { 113,-75417 }, { 114,-75417 }, { 115,-75417 }, { 116,-75417 }, + + { 117,-75417 }, { 118,-75417 }, { 119,-75417 }, { 120,-75417 }, { 121,-75417 }, + { 122,-75417 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-75417 }, { 128,-75417 }, { 129,-75417 }, { 130,-75417 }, { 131,-75417 }, + { 132,-75417 }, { 133,-75417 }, { 134,-75417 }, { 135,-75417 }, { 136,-75417 }, + { 137,-75417 }, { 138,-75417 }, { 139,-75417 }, { 140,-75417 }, { 141,-75417 }, + { 142,-75417 }, { 143,-75417 }, { 144,-75417 }, { 145,-75417 }, { 146,-75417 }, + { 147,-75417 }, { 148,-75417 }, { 149,-75417 }, { 150,-75417 }, { 151,-75417 }, + { 152,-75417 }, { 153,-75417 }, { 154,-75417 }, { 155,-75417 }, { 156,-75417 }, + { 157,-75417 }, { 158,-75417 }, { 159,-75417 }, { 160,-75417 }, { 161,-75417 }, + { 162,-75417 }, { 163,-75417 }, { 164,-75417 }, { 165,-75417 }, { 166,-75417 }, + + { 167,-75417 }, { 168,-75417 }, { 169,-75417 }, { 170,-75417 }, { 171,-75417 }, + { 172,-75417 }, { 173,-75417 }, { 174,-75417 }, { 175,-75417 }, { 176,-75417 }, + { 177,-75417 }, { 178,-75417 }, { 179,-75417 }, { 180,-75417 }, { 181,-75417 }, + { 182,-75417 }, { 183,-75417 }, { 184,-75417 }, { 185,-75417 }, { 186,-75417 }, + { 187,-75417 }, { 188,-75417 }, { 189,-75417 }, { 190,-75417 }, { 191,-75417 }, + { 192,-75417 }, { 193,-75417 }, { 194,-75417 }, { 195,-75417 }, { 196,-75417 }, + { 197,-75417 }, { 198,-75417 }, { 199,-75417 }, { 200,-75417 }, { 201,-75417 }, + { 202,-75417 }, { 203,-75417 }, { 204,-75417 }, { 205,-75417 }, { 206,-75417 }, + { 207,-75417 }, { 208,-75417 }, { 209,-75417 }, { 210,-75417 }, { 211,-75417 }, + { 212,-75417 }, { 213,-75417 }, { 214,-75417 }, { 215,-75417 }, { 216,-75417 }, + + { 217,-75417 }, { 218,-75417 }, { 219,-75417 }, { 220,-75417 }, { 221,-75417 }, + { 222,-75417 }, { 223,-75417 }, { 224,-75417 }, { 225,-75417 }, { 226,-75417 }, + { 227,-75417 }, { 228,-75417 }, { 229,-75417 }, { 230,-75417 }, { 231,-75417 }, + { 232,-75417 }, { 233,-75417 }, { 234,-75417 }, { 235,-75417 }, { 236,-75417 }, + { 237,-75417 }, { 238,-75417 }, { 239,-75417 }, { 240,-75417 }, { 241,-75417 }, + { 242,-75417 }, { 243,-75417 }, { 244,-75417 }, { 245,-75417 }, { 246,-75417 }, + { 247,-75417 }, { 248,-75417 }, { 249,-75417 }, { 250,-75417 }, { 251,-75417 }, + { 252,-75417 }, { 253,-75417 }, { 254,-75417 }, { 255,-75417 }, { 0, 87 }, + { 0,16449 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-75674 }, { 49,-75674 }, + { 50,-75674 }, { 51,-75674 }, { 52,-75674 }, { 53,-75674 }, { 54,-75674 }, + { 55,-75674 }, { 56,-75674 }, { 57,-75674 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-75674 }, { 66,-75674 }, { 67,-75674 }, { 68,-75674 }, { 69,-75674 }, + { 70,-75674 }, { 71,-75674 }, { 72,-75674 }, { 73,-75674 }, { 74,-75674 }, + { 75,-75674 }, { 76,-75674 }, { 77,-75674 }, { 78,-75674 }, { 79,-75674 }, + { 80,-75674 }, { 81,-75674 }, { 82,-75674 }, { 83,-75674 }, { 84,-75674 }, + { 85,-75674 }, { 86,-75674 }, { 87,-75674 }, { 88,-75674 }, { 89,-75674 }, + { 90,-75674 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-75674 }, { 0, 0 }, { 97,-75674 }, { 98,-75674 }, { 99,-75674 }, + { 100,-75674 }, { 101,-75674 }, { 102,-75674 }, { 103,-75674 }, { 104,-75674 }, + { 105,-75674 }, { 106,-75674 }, { 107,-75674 }, { 108,-75674 }, { 109,-75674 }, + + { 110,-75674 }, { 111,-75674 }, { 112,-75674 }, { 113,-75674 }, { 114,-75674 }, + { 115,-75674 }, { 116,-75674 }, { 117,-75674 }, { 118,-75674 }, { 119,-75674 }, + { 120,-75674 }, { 121,-75674 }, { 122,-75674 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-75674 }, { 128,-75674 }, { 129,-75674 }, + { 130,-75674 }, { 131,-75674 }, { 132,-75674 }, { 133,-75674 }, { 134,-75674 }, + { 135,-75674 }, { 136,-75674 }, { 137,-75674 }, { 138,-75674 }, { 139,-75674 }, + { 140,-75674 }, { 141,-75674 }, { 142,-75674 }, { 143,-75674 }, { 144,-75674 }, + { 145,-75674 }, { 146,-75674 }, { 147,-75674 }, { 148,-75674 }, { 149,-75674 }, + { 150,-75674 }, { 151,-75674 }, { 152,-75674 }, { 153,-75674 }, { 154,-75674 }, + { 155,-75674 }, { 156,-75674 }, { 157,-75674 }, { 158,-75674 }, { 159,-75674 }, + + { 160,-75674 }, { 161,-75674 }, { 162,-75674 }, { 163,-75674 }, { 164,-75674 }, + { 165,-75674 }, { 166,-75674 }, { 167,-75674 }, { 168,-75674 }, { 169,-75674 }, + { 170,-75674 }, { 171,-75674 }, { 172,-75674 }, { 173,-75674 }, { 174,-75674 }, + { 175,-75674 }, { 176,-75674 }, { 177,-75674 }, { 178,-75674 }, { 179,-75674 }, + { 180,-75674 }, { 181,-75674 }, { 182,-75674 }, { 183,-75674 }, { 184,-75674 }, + { 185,-75674 }, { 186,-75674 }, { 187,-75674 }, { 188,-75674 }, { 189,-75674 }, + { 190,-75674 }, { 191,-75674 }, { 192,-75674 }, { 193,-75674 }, { 194,-75674 }, + { 195,-75674 }, { 196,-75674 }, { 197,-75674 }, { 198,-75674 }, { 199,-75674 }, + { 200,-75674 }, { 201,-75674 }, { 202,-75674 }, { 203,-75674 }, { 204,-75674 }, + { 205,-75674 }, { 206,-75674 }, { 207,-75674 }, { 208,-75674 }, { 209,-75674 }, + + { 210,-75674 }, { 211,-75674 }, { 212,-75674 }, { 213,-75674 }, { 214,-75674 }, + { 215,-75674 }, { 216,-75674 }, { 217,-75674 }, { 218,-75674 }, { 219,-75674 }, + { 220,-75674 }, { 221,-75674 }, { 222,-75674 }, { 223,-75674 }, { 224,-75674 }, + { 225,-75674 }, { 226,-75674 }, { 227,-75674 }, { 228,-75674 }, { 229,-75674 }, + { 230,-75674 }, { 231,-75674 }, { 232,-75674 }, { 233,-75674 }, { 234,-75674 }, + { 235,-75674 }, { 236,-75674 }, { 237,-75674 }, { 238,-75674 }, { 239,-75674 }, + { 240,-75674 }, { 241,-75674 }, { 242,-75674 }, { 243,-75674 }, { 244,-75674 }, + { 245,-75674 }, { 246,-75674 }, { 247,-75674 }, { 248,-75674 }, { 249,-75674 }, + { 250,-75674 }, { 251,-75674 }, { 252,-75674 }, { 253,-75674 }, { 254,-75674 }, + { 255,-75674 }, { 0, 51 }, { 0,16192 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-75931 }, { 49,-75931 }, { 50,-75931 }, { 51,-75931 }, { 52,-75931 }, + + { 53,-75931 }, { 54,-75931 }, { 55,-75931 }, { 56,-75931 }, { 57,-75931 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-75931 }, { 66,-75931 }, { 67,-75931 }, + { 68,-75931 }, { 69,-75931 }, { 70,-75931 }, { 71,-75931 }, { 72,-75931 }, + { 73,-75931 }, { 74,-75931 }, { 75,-75931 }, { 76,-75931 }, { 77,-75931 }, + { 78,-75931 }, { 79,-75931 }, { 80,-75931 }, { 81,-75931 }, { 82,-75931 }, + { 83,-75931 }, { 84,-75931 }, { 85,-75931 }, { 86,-75931 }, { 87,-75931 }, + { 88,-75931 }, { 89,-75931 }, { 90,-75931 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-75931 }, { 0, 0 }, { 97,-75931 }, + { 98,-75931 }, { 99,-75931 }, { 100,-75931 }, { 101,-75931 }, { 102,-75931 }, + + { 103,-75931 }, { 104,-75931 }, { 105,-75931 }, { 106,-75931 }, { 107,-75931 }, + { 108,-75931 }, { 109,-75931 }, { 110,-75931 }, { 111,-75931 }, { 112,-75931 }, + { 113,-75931 }, { 114,-75931 }, { 115,-75931 }, { 116,-75931 }, { 117,-75931 }, + { 118,-75931 }, { 119,-75931 }, { 120,-75931 }, { 121,-75931 }, { 122,-75931 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-75931 }, + { 128,-75931 }, { 129,-75931 }, { 130,-75931 }, { 131,-75931 }, { 132,-75931 }, + { 133,-75931 }, { 134,-75931 }, { 135,-75931 }, { 136,-75931 }, { 137,-75931 }, + { 138,-75931 }, { 139,-75931 }, { 140,-75931 }, { 141,-75931 }, { 142,-75931 }, + { 143,-75931 }, { 144,-75931 }, { 145,-75931 }, { 146,-75931 }, { 147,-75931 }, + { 148,-75931 }, { 149,-75931 }, { 150,-75931 }, { 151,-75931 }, { 152,-75931 }, + + { 153,-75931 }, { 154,-75931 }, { 155,-75931 }, { 156,-75931 }, { 157,-75931 }, + { 158,-75931 }, { 159,-75931 }, { 160,-75931 }, { 161,-75931 }, { 162,-75931 }, + { 163,-75931 }, { 164,-75931 }, { 165,-75931 }, { 166,-75931 }, { 167,-75931 }, + { 168,-75931 }, { 169,-75931 }, { 170,-75931 }, { 171,-75931 }, { 172,-75931 }, + { 173,-75931 }, { 174,-75931 }, { 175,-75931 }, { 176,-75931 }, { 177,-75931 }, + { 178,-75931 }, { 179,-75931 }, { 180,-75931 }, { 181,-75931 }, { 182,-75931 }, + { 183,-75931 }, { 184,-75931 }, { 185,-75931 }, { 186,-75931 }, { 187,-75931 }, + { 188,-75931 }, { 189,-75931 }, { 190,-75931 }, { 191,-75931 }, { 192,-75931 }, + { 193,-75931 }, { 194,-75931 }, { 195,-75931 }, { 196,-75931 }, { 197,-75931 }, + { 198,-75931 }, { 199,-75931 }, { 200,-75931 }, { 201,-75931 }, { 202,-75931 }, + + { 203,-75931 }, { 204,-75931 }, { 205,-75931 }, { 206,-75931 }, { 207,-75931 }, + { 208,-75931 }, { 209,-75931 }, { 210,-75931 }, { 211,-75931 }, { 212,-75931 }, + { 213,-75931 }, { 214,-75931 }, { 215,-75931 }, { 216,-75931 }, { 217,-75931 }, + { 218,-75931 }, { 219,-75931 }, { 220,-75931 }, { 221,-75931 }, { 222,-75931 }, + { 223,-75931 }, { 224,-75931 }, { 225,-75931 }, { 226,-75931 }, { 227,-75931 }, + { 228,-75931 }, { 229,-75931 }, { 230,-75931 }, { 231,-75931 }, { 232,-75931 }, + { 233,-75931 }, { 234,-75931 }, { 235,-75931 }, { 236,-75931 }, { 237,-75931 }, + { 238,-75931 }, { 239,-75931 }, { 240,-75931 }, { 241,-75931 }, { 242,-75931 }, + { 243,-75931 }, { 244,-75931 }, { 245,-75931 }, { 246,-75931 }, { 247,-75931 }, + { 248,-75931 }, { 249,-75931 }, { 250,-75931 }, { 251,-75931 }, { 252,-75931 }, + + { 253,-75931 }, { 254,-75931 }, { 255,-75931 }, { 0, 131 }, { 0,15935 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 48,-76188 }, { 49,-76188 }, { 50,-76188 }, + { 51,-76188 }, { 52,-76188 }, { 53,-76188 }, { 54,-76188 }, { 55,-76188 }, + { 56,-76188 }, { 57,-76188 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-76188 }, + { 66,-76188 }, { 67,-76188 }, { 68,-76188 }, { 69,-76188 }, { 70,-76188 }, + { 71,-76188 }, { 72,-76188 }, { 73,-76188 }, { 74,-76188 }, { 75,-76188 }, + { 76,-76188 }, { 77,-76188 }, { 78,-76188 }, { 79,-76188 }, { 80,-76188 }, + { 81,-76188 }, { 82,5397 }, { 83,-76188 }, { 84,-76188 }, { 85,-76188 }, + { 86,-76188 }, { 87,-76188 }, { 88,-76188 }, { 89,-76188 }, { 90,-76188 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-76188 }, + + { 0, 0 }, { 97,-76188 }, { 98,-76188 }, { 99,-76188 }, { 100,-76188 }, + { 101,-76188 }, { 102,-76188 }, { 103,-76188 }, { 104,-76188 }, { 105,-76188 }, + { 106,-76188 }, { 107,-76188 }, { 108,-76188 }, { 109,-76188 }, { 110,-76188 }, + { 111,-76188 }, { 112,-76188 }, { 113,-76188 }, { 114,5397 }, { 115,-76188 }, + { 116,-76188 }, { 117,-76188 }, { 118,-76188 }, { 119,-76188 }, { 120,-76188 }, + { 121,-76188 }, { 122,-76188 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-76188 }, { 128,-76188 }, { 129,-76188 }, { 130,-76188 }, + { 131,-76188 }, { 132,-76188 }, { 133,-76188 }, { 134,-76188 }, { 135,-76188 }, + { 136,-76188 }, { 137,-76188 }, { 138,-76188 }, { 139,-76188 }, { 140,-76188 }, + { 141,-76188 }, { 142,-76188 }, { 143,-76188 }, { 144,-76188 }, { 145,-76188 }, + + { 146,-76188 }, { 147,-76188 }, { 148,-76188 }, { 149,-76188 }, { 150,-76188 }, + { 151,-76188 }, { 152,-76188 }, { 153,-76188 }, { 154,-76188 }, { 155,-76188 }, + { 156,-76188 }, { 157,-76188 }, { 158,-76188 }, { 159,-76188 }, { 160,-76188 }, + { 161,-76188 }, { 162,-76188 }, { 163,-76188 }, { 164,-76188 }, { 165,-76188 }, + { 166,-76188 }, { 167,-76188 }, { 168,-76188 }, { 169,-76188 }, { 170,-76188 }, + { 171,-76188 }, { 172,-76188 }, { 173,-76188 }, { 174,-76188 }, { 175,-76188 }, + { 176,-76188 }, { 177,-76188 }, { 178,-76188 }, { 179,-76188 }, { 180,-76188 }, + { 181,-76188 }, { 182,-76188 }, { 183,-76188 }, { 184,-76188 }, { 185,-76188 }, + { 186,-76188 }, { 187,-76188 }, { 188,-76188 }, { 189,-76188 }, { 190,-76188 }, + { 191,-76188 }, { 192,-76188 }, { 193,-76188 }, { 194,-76188 }, { 195,-76188 }, + + { 196,-76188 }, { 197,-76188 }, { 198,-76188 }, { 199,-76188 }, { 200,-76188 }, + { 201,-76188 }, { 202,-76188 }, { 203,-76188 }, { 204,-76188 }, { 205,-76188 }, + { 206,-76188 }, { 207,-76188 }, { 208,-76188 }, { 209,-76188 }, { 210,-76188 }, + { 211,-76188 }, { 212,-76188 }, { 213,-76188 }, { 214,-76188 }, { 215,-76188 }, + { 216,-76188 }, { 217,-76188 }, { 218,-76188 }, { 219,-76188 }, { 220,-76188 }, + { 221,-76188 }, { 222,-76188 }, { 223,-76188 }, { 224,-76188 }, { 225,-76188 }, + { 226,-76188 }, { 227,-76188 }, { 228,-76188 }, { 229,-76188 }, { 230,-76188 }, + { 231,-76188 }, { 232,-76188 }, { 233,-76188 }, { 234,-76188 }, { 235,-76188 }, + { 236,-76188 }, { 237,-76188 }, { 238,-76188 }, { 239,-76188 }, { 240,-76188 }, + { 241,-76188 }, { 242,-76188 }, { 243,-76188 }, { 244,-76188 }, { 245,-76188 }, + + { 246,-76188 }, { 247,-76188 }, { 248,-76188 }, { 249,-76188 }, { 250,-76188 }, + { 251,-76188 }, { 252,-76188 }, { 253,-76188 }, { 254,-76188 }, { 255,-76188 }, + { 0, 131 }, { 0,15678 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-76445 }, + { 49,-76445 }, { 50,-76445 }, { 51,-76445 }, { 52,-76445 }, { 53,-76445 }, + { 54,-76445 }, { 55,-76445 }, { 56,-76445 }, { 57,-76445 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-76445 }, { 66,-76445 }, { 67,5397 }, { 68,-76445 }, + { 69,-76445 }, { 70,-76445 }, { 71,-76445 }, { 72,-76445 }, { 73,-76445 }, + { 74,-76445 }, { 75,-76445 }, { 76,-76445 }, { 77,-76445 }, { 78,-76445 }, + { 79,-76445 }, { 80,-76445 }, { 81,-76445 }, { 82,-76445 }, { 83,-76445 }, + { 84,-76445 }, { 85,-76445 }, { 86,-76445 }, { 87,-76445 }, { 88,-76445 }, + + { 89,-76445 }, { 90,-76445 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-76445 }, { 0, 0 }, { 97,-76445 }, { 98,-76445 }, + { 99,5397 }, { 100,-76445 }, { 101,-76445 }, { 102,-76445 }, { 103,-76445 }, + { 104,-76445 }, { 105,-76445 }, { 106,-76445 }, { 107,-76445 }, { 108,-76445 }, + { 109,-76445 }, { 110,-76445 }, { 111,-76445 }, { 112,-76445 }, { 113,-76445 }, + { 114,-76445 }, { 115,-76445 }, { 116,-76445 }, { 117,-76445 }, { 118,-76445 }, + { 119,-76445 }, { 120,-76445 }, { 121,-76445 }, { 122,-76445 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-76445 }, { 128,-76445 }, + { 129,-76445 }, { 130,-76445 }, { 131,-76445 }, { 132,-76445 }, { 133,-76445 }, + { 134,-76445 }, { 135,-76445 }, { 136,-76445 }, { 137,-76445 }, { 138,-76445 }, + + { 139,-76445 }, { 140,-76445 }, { 141,-76445 }, { 142,-76445 }, { 143,-76445 }, + { 144,-76445 }, { 145,-76445 }, { 146,-76445 }, { 147,-76445 }, { 148,-76445 }, + { 149,-76445 }, { 150,-76445 }, { 151,-76445 }, { 152,-76445 }, { 153,-76445 }, + { 154,-76445 }, { 155,-76445 }, { 156,-76445 }, { 157,-76445 }, { 158,-76445 }, + { 159,-76445 }, { 160,-76445 }, { 161,-76445 }, { 162,-76445 }, { 163,-76445 }, + { 164,-76445 }, { 165,-76445 }, { 166,-76445 }, { 167,-76445 }, { 168,-76445 }, + { 169,-76445 }, { 170,-76445 }, { 171,-76445 }, { 172,-76445 }, { 173,-76445 }, + { 174,-76445 }, { 175,-76445 }, { 176,-76445 }, { 177,-76445 }, { 178,-76445 }, + { 179,-76445 }, { 180,-76445 }, { 181,-76445 }, { 182,-76445 }, { 183,-76445 }, + { 184,-76445 }, { 185,-76445 }, { 186,-76445 }, { 187,-76445 }, { 188,-76445 }, + + { 189,-76445 }, { 190,-76445 }, { 191,-76445 }, { 192,-76445 }, { 193,-76445 }, + { 194,-76445 }, { 195,-76445 }, { 196,-76445 }, { 197,-76445 }, { 198,-76445 }, + { 199,-76445 }, { 200,-76445 }, { 201,-76445 }, { 202,-76445 }, { 203,-76445 }, + { 204,-76445 }, { 205,-76445 }, { 206,-76445 }, { 207,-76445 }, { 208,-76445 }, + { 209,-76445 }, { 210,-76445 }, { 211,-76445 }, { 212,-76445 }, { 213,-76445 }, + { 214,-76445 }, { 215,-76445 }, { 216,-76445 }, { 217,-76445 }, { 218,-76445 }, + { 219,-76445 }, { 220,-76445 }, { 221,-76445 }, { 222,-76445 }, { 223,-76445 }, + { 224,-76445 }, { 225,-76445 }, { 226,-76445 }, { 227,-76445 }, { 228,-76445 }, + { 229,-76445 }, { 230,-76445 }, { 231,-76445 }, { 232,-76445 }, { 233,-76445 }, + { 234,-76445 }, { 235,-76445 }, { 236,-76445 }, { 237,-76445 }, { 238,-76445 }, + + { 239,-76445 }, { 240,-76445 }, { 241,-76445 }, { 242,-76445 }, { 243,-76445 }, + { 244,-76445 }, { 245,-76445 }, { 246,-76445 }, { 247,-76445 }, { 248,-76445 }, + { 249,-76445 }, { 250,-76445 }, { 251,-76445 }, { 252,-76445 }, { 253,-76445 }, + { 254,-76445 }, { 255,-76445 }, { 0, 131 }, { 0,15421 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-76702 }, { 49,-76702 }, { 50,-76702 }, { 51,-76702 }, + { 52,-76702 }, { 53,-76702 }, { 54,-76702 }, { 55,-76702 }, { 56,-76702 }, + { 57,-76702 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-76702 }, { 66,-76702 }, + { 67,-76702 }, { 68,-76702 }, { 69,-76702 }, { 70,-76702 }, { 71,-76702 }, + { 72,5397 }, { 73,-76702 }, { 74,-76702 }, { 75,-76702 }, { 76,-76702 }, + { 77,-76702 }, { 78,-76702 }, { 79,-76702 }, { 80,-76702 }, { 81,-76702 }, + + { 82,-76702 }, { 83,-76702 }, { 84,-76702 }, { 85,-76702 }, { 86,-76702 }, + { 87,-76702 }, { 88,-76702 }, { 89,-76702 }, { 90,-76702 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-76702 }, { 0, 0 }, + { 97,-76702 }, { 98,-76702 }, { 99,-76702 }, { 100,-76702 }, { 101,-76702 }, + { 102,-76702 }, { 103,-76702 }, { 104,5397 }, { 105,-76702 }, { 106,-76702 }, + { 107,-76702 }, { 108,-76702 }, { 109,-76702 }, { 110,-76702 }, { 111,-76702 }, + { 112,-76702 }, { 113,-76702 }, { 114,-76702 }, { 115,-76702 }, { 116,-76702 }, + { 117,-76702 }, { 118,-76702 }, { 119,-76702 }, { 120,-76702 }, { 121,-76702 }, + { 122,-76702 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-76702 }, { 128,-76702 }, { 129,-76702 }, { 130,-76702 }, { 131,-76702 }, + + { 132,-76702 }, { 133,-76702 }, { 134,-76702 }, { 135,-76702 }, { 136,-76702 }, + { 137,-76702 }, { 138,-76702 }, { 139,-76702 }, { 140,-76702 }, { 141,-76702 }, + { 142,-76702 }, { 143,-76702 }, { 144,-76702 }, { 145,-76702 }, { 146,-76702 }, + { 147,-76702 }, { 148,-76702 }, { 149,-76702 }, { 150,-76702 }, { 151,-76702 }, + { 152,-76702 }, { 153,-76702 }, { 154,-76702 }, { 155,-76702 }, { 156,-76702 }, + { 157,-76702 }, { 158,-76702 }, { 159,-76702 }, { 160,-76702 }, { 161,-76702 }, + { 162,-76702 }, { 163,-76702 }, { 164,-76702 }, { 165,-76702 }, { 166,-76702 }, + { 167,-76702 }, { 168,-76702 }, { 169,-76702 }, { 170,-76702 }, { 171,-76702 }, + { 172,-76702 }, { 173,-76702 }, { 174,-76702 }, { 175,-76702 }, { 176,-76702 }, + { 177,-76702 }, { 178,-76702 }, { 179,-76702 }, { 180,-76702 }, { 181,-76702 }, + + { 182,-76702 }, { 183,-76702 }, { 184,-76702 }, { 185,-76702 }, { 186,-76702 }, + { 187,-76702 }, { 188,-76702 }, { 189,-76702 }, { 190,-76702 }, { 191,-76702 }, + { 192,-76702 }, { 193,-76702 }, { 194,-76702 }, { 195,-76702 }, { 196,-76702 }, + { 197,-76702 }, { 198,-76702 }, { 199,-76702 }, { 200,-76702 }, { 201,-76702 }, + { 202,-76702 }, { 203,-76702 }, { 204,-76702 }, { 205,-76702 }, { 206,-76702 }, + { 207,-76702 }, { 208,-76702 }, { 209,-76702 }, { 210,-76702 }, { 211,-76702 }, + { 212,-76702 }, { 213,-76702 }, { 214,-76702 }, { 215,-76702 }, { 216,-76702 }, + { 217,-76702 }, { 218,-76702 }, { 219,-76702 }, { 220,-76702 }, { 221,-76702 }, + { 222,-76702 }, { 223,-76702 }, { 224,-76702 }, { 225,-76702 }, { 226,-76702 }, + { 227,-76702 }, { 228,-76702 }, { 229,-76702 }, { 230,-76702 }, { 231,-76702 }, + + { 232,-76702 }, { 233,-76702 }, { 234,-76702 }, { 235,-76702 }, { 236,-76702 }, + { 237,-76702 }, { 238,-76702 }, { 239,-76702 }, { 240,-76702 }, { 241,-76702 }, + { 242,-76702 }, { 243,-76702 }, { 244,-76702 }, { 245,-76702 }, { 246,-76702 }, + { 247,-76702 }, { 248,-76702 }, { 249,-76702 }, { 250,-76702 }, { 251,-76702 }, + { 252,-76702 }, { 253,-76702 }, { 254,-76702 }, { 255,-76702 }, { 0, 38 }, + { 0,15164 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-76959 }, { 49,-76959 }, + { 50,-76959 }, { 51,-76959 }, { 52,-76959 }, { 53,-76959 }, { 54,-76959 }, + { 55,-76959 }, { 56,-76959 }, { 57,-76959 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-76959 }, { 66,-76959 }, { 67,-76959 }, { 68,-76959 }, { 69,-76959 }, + { 70,-76959 }, { 71,-76959 }, { 72,-76959 }, { 73,-76959 }, { 74,-76959 }, + + { 75,-76959 }, { 76,-76959 }, { 77,-76959 }, { 78,-76959 }, { 79,-76959 }, + { 80,-76959 }, { 81,-76959 }, { 82,-76959 }, { 83,-76959 }, { 84,-76959 }, + { 85,-76959 }, { 86,-76959 }, { 87,-76959 }, { 88,-76959 }, { 89,-76959 }, + { 90,-76959 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-76959 }, { 0, 0 }, { 97,-76959 }, { 98,-76959 }, { 99,-76959 }, + { 100,-76959 }, { 101,-76959 }, { 102,-76959 }, { 103,-76959 }, { 104,-76959 }, + { 105,-76959 }, { 106,-76959 }, { 107,-76959 }, { 108,-76959 }, { 109,-76959 }, + { 110,-76959 }, { 111,-76959 }, { 112,-76959 }, { 113,-76959 }, { 114,-76959 }, + { 115,-76959 }, { 116,-76959 }, { 117,-76959 }, { 118,-76959 }, { 119,-76959 }, + { 120,-76959 }, { 121,-76959 }, { 122,-76959 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 127,-76959 }, { 128,-76959 }, { 129,-76959 }, + { 130,-76959 }, { 131,-76959 }, { 132,-76959 }, { 133,-76959 }, { 134,-76959 }, + { 135,-76959 }, { 136,-76959 }, { 137,-76959 }, { 138,-76959 }, { 139,-76959 }, + { 140,-76959 }, { 141,-76959 }, { 142,-76959 }, { 143,-76959 }, { 144,-76959 }, + { 145,-76959 }, { 146,-76959 }, { 147,-76959 }, { 148,-76959 }, { 149,-76959 }, + { 150,-76959 }, { 151,-76959 }, { 152,-76959 }, { 153,-76959 }, { 154,-76959 }, + { 155,-76959 }, { 156,-76959 }, { 157,-76959 }, { 158,-76959 }, { 159,-76959 }, + { 160,-76959 }, { 161,-76959 }, { 162,-76959 }, { 163,-76959 }, { 164,-76959 }, + { 165,-76959 }, { 166,-76959 }, { 167,-76959 }, { 168,-76959 }, { 169,-76959 }, + { 170,-76959 }, { 171,-76959 }, { 172,-76959 }, { 173,-76959 }, { 174,-76959 }, + + { 175,-76959 }, { 176,-76959 }, { 177,-76959 }, { 178,-76959 }, { 179,-76959 }, + { 180,-76959 }, { 181,-76959 }, { 182,-76959 }, { 183,-76959 }, { 184,-76959 }, + { 185,-76959 }, { 186,-76959 }, { 187,-76959 }, { 188,-76959 }, { 189,-76959 }, + { 190,-76959 }, { 191,-76959 }, { 192,-76959 }, { 193,-76959 }, { 194,-76959 }, + { 195,-76959 }, { 196,-76959 }, { 197,-76959 }, { 198,-76959 }, { 199,-76959 }, + { 200,-76959 }, { 201,-76959 }, { 202,-76959 }, { 203,-76959 }, { 204,-76959 }, + { 205,-76959 }, { 206,-76959 }, { 207,-76959 }, { 208,-76959 }, { 209,-76959 }, + { 210,-76959 }, { 211,-76959 }, { 212,-76959 }, { 213,-76959 }, { 214,-76959 }, + { 215,-76959 }, { 216,-76959 }, { 217,-76959 }, { 218,-76959 }, { 219,-76959 }, + { 220,-76959 }, { 221,-76959 }, { 222,-76959 }, { 223,-76959 }, { 224,-76959 }, + + { 225,-76959 }, { 226,-76959 }, { 227,-76959 }, { 228,-76959 }, { 229,-76959 }, + { 230,-76959 }, { 231,-76959 }, { 232,-76959 }, { 233,-76959 }, { 234,-76959 }, + { 235,-76959 }, { 236,-76959 }, { 237,-76959 }, { 238,-76959 }, { 239,-76959 }, + { 240,-76959 }, { 241,-76959 }, { 242,-76959 }, { 243,-76959 }, { 244,-76959 }, + { 245,-76959 }, { 246,-76959 }, { 247,-76959 }, { 248,-76959 }, { 249,-76959 }, + { 250,-76959 }, { 251,-76959 }, { 252,-76959 }, { 253,-76959 }, { 254,-76959 }, + { 255,-76959 }, { 0, 53 }, { 0,14907 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-77216 }, { 49,-77216 }, { 50,-77216 }, { 51,-77216 }, { 52,-77216 }, + { 53,-77216 }, { 54,-77216 }, { 55,-77216 }, { 56,-77216 }, { 57,-77216 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-77216 }, { 66,-77216 }, { 67,-77216 }, + + { 68,-77216 }, { 69,-77216 }, { 70,-77216 }, { 71,-77216 }, { 72,-77216 }, + { 73,-77216 }, { 74,-77216 }, { 75,-77216 }, { 76,-77216 }, { 77,-77216 }, + { 78,-77216 }, { 79,-77216 }, { 80,-77216 }, { 81,-77216 }, { 82,-77216 }, + { 83,-77216 }, { 84,-77216 }, { 85,-77216 }, { 86,-77216 }, { 87,-77216 }, + { 88,-77216 }, { 89,-77216 }, { 90,-77216 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-77216 }, { 0, 0 }, { 97,-77216 }, + { 98,-77216 }, { 99,-77216 }, { 100,-77216 }, { 101,-77216 }, { 102,-77216 }, + { 103,-77216 }, { 104,-77216 }, { 105,-77216 }, { 106,-77216 }, { 107,-77216 }, + { 108,-77216 }, { 109,-77216 }, { 110,-77216 }, { 111,-77216 }, { 112,-77216 }, + { 113,-77216 }, { 114,-77216 }, { 115,-77216 }, { 116,-77216 }, { 117,-77216 }, + + { 118,-77216 }, { 119,-77216 }, { 120,-77216 }, { 121,-77216 }, { 122,-77216 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-77216 }, + { 128,-77216 }, { 129,-77216 }, { 130,-77216 }, { 131,-77216 }, { 132,-77216 }, + { 133,-77216 }, { 134,-77216 }, { 135,-77216 }, { 136,-77216 }, { 137,-77216 }, + { 138,-77216 }, { 139,-77216 }, { 140,-77216 }, { 141,-77216 }, { 142,-77216 }, + { 143,-77216 }, { 144,-77216 }, { 145,-77216 }, { 146,-77216 }, { 147,-77216 }, + { 148,-77216 }, { 149,-77216 }, { 150,-77216 }, { 151,-77216 }, { 152,-77216 }, + { 153,-77216 }, { 154,-77216 }, { 155,-77216 }, { 156,-77216 }, { 157,-77216 }, + { 158,-77216 }, { 159,-77216 }, { 160,-77216 }, { 161,-77216 }, { 162,-77216 }, + { 163,-77216 }, { 164,-77216 }, { 165,-77216 }, { 166,-77216 }, { 167,-77216 }, + + { 168,-77216 }, { 169,-77216 }, { 170,-77216 }, { 171,-77216 }, { 172,-77216 }, + { 173,-77216 }, { 174,-77216 }, { 175,-77216 }, { 176,-77216 }, { 177,-77216 }, + { 178,-77216 }, { 179,-77216 }, { 180,-77216 }, { 181,-77216 }, { 182,-77216 }, + { 183,-77216 }, { 184,-77216 }, { 185,-77216 }, { 186,-77216 }, { 187,-77216 }, + { 188,-77216 }, { 189,-77216 }, { 190,-77216 }, { 191,-77216 }, { 192,-77216 }, + { 193,-77216 }, { 194,-77216 }, { 195,-77216 }, { 196,-77216 }, { 197,-77216 }, + { 198,-77216 }, { 199,-77216 }, { 200,-77216 }, { 201,-77216 }, { 202,-77216 }, + { 203,-77216 }, { 204,-77216 }, { 205,-77216 }, { 206,-77216 }, { 207,-77216 }, + { 208,-77216 }, { 209,-77216 }, { 210,-77216 }, { 211,-77216 }, { 212,-77216 }, + { 213,-77216 }, { 214,-77216 }, { 215,-77216 }, { 216,-77216 }, { 217,-77216 }, + + { 218,-77216 }, { 219,-77216 }, { 220,-77216 }, { 221,-77216 }, { 222,-77216 }, + { 223,-77216 }, { 224,-77216 }, { 225,-77216 }, { 226,-77216 }, { 227,-77216 }, + { 228,-77216 }, { 229,-77216 }, { 230,-77216 }, { 231,-77216 }, { 232,-77216 }, + { 233,-77216 }, { 234,-77216 }, { 235,-77216 }, { 236,-77216 }, { 237,-77216 }, + { 238,-77216 }, { 239,-77216 }, { 240,-77216 }, { 241,-77216 }, { 242,-77216 }, + { 243,-77216 }, { 244,-77216 }, { 245,-77216 }, { 246,-77216 }, { 247,-77216 }, + { 248,-77216 }, { 249,-77216 }, { 250,-77216 }, { 251,-77216 }, { 252,-77216 }, + { 253,-77216 }, { 254,-77216 }, { 255,-77216 }, { 0, 131 }, { 0,14650 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-77473 }, { 49,-77473 }, { 50,-77473 }, + { 51,-77473 }, { 52,-77473 }, { 53,-77473 }, { 54,-77473 }, { 55,-77473 }, + { 56,-77473 }, { 57,-77473 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-77473 }, + { 66,-77473 }, { 67,-77473 }, { 68,-77473 }, { 69,-77473 }, { 70,-77473 }, + { 71,-77473 }, { 72,-77473 }, { 73,-77473 }, { 74,-77473 }, { 75,-77473 }, + { 76,-77473 }, { 77,-77473 }, { 78,-77473 }, { 79,-77473 }, { 80,-77473 }, + { 81,-77473 }, { 82,-77473 }, { 83,-77473 }, { 84,4883 }, { 85,-77473 }, + { 86,-77473 }, { 87,-77473 }, { 88,-77473 }, { 89,-77473 }, { 90,-77473 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-77473 }, + { 0, 0 }, { 97,-77473 }, { 98,-77473 }, { 99,-77473 }, { 100,-77473 }, + { 101,-77473 }, { 102,-77473 }, { 103,-77473 }, { 104,-77473 }, { 105,-77473 }, + { 106,-77473 }, { 107,-77473 }, { 108,-77473 }, { 109,-77473 }, { 110,-77473 }, + + { 111,-77473 }, { 112,-77473 }, { 113,-77473 }, { 114,-77473 }, { 115,-77473 }, + { 116,4883 }, { 117,-77473 }, { 118,-77473 }, { 119,-77473 }, { 120,-77473 }, + { 121,-77473 }, { 122,-77473 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-77473 }, { 128,-77473 }, { 129,-77473 }, { 130,-77473 }, + { 131,-77473 }, { 132,-77473 }, { 133,-77473 }, { 134,-77473 }, { 135,-77473 }, + { 136,-77473 }, { 137,-77473 }, { 138,-77473 }, { 139,-77473 }, { 140,-77473 }, + { 141,-77473 }, { 142,-77473 }, { 143,-77473 }, { 144,-77473 }, { 145,-77473 }, + { 146,-77473 }, { 147,-77473 }, { 148,-77473 }, { 149,-77473 }, { 150,-77473 }, + { 151,-77473 }, { 152,-77473 }, { 153,-77473 }, { 154,-77473 }, { 155,-77473 }, + { 156,-77473 }, { 157,-77473 }, { 158,-77473 }, { 159,-77473 }, { 160,-77473 }, + + { 161,-77473 }, { 162,-77473 }, { 163,-77473 }, { 164,-77473 }, { 165,-77473 }, + { 166,-77473 }, { 167,-77473 }, { 168,-77473 }, { 169,-77473 }, { 170,-77473 }, + { 171,-77473 }, { 172,-77473 }, { 173,-77473 }, { 174,-77473 }, { 175,-77473 }, + { 176,-77473 }, { 177,-77473 }, { 178,-77473 }, { 179,-77473 }, { 180,-77473 }, + { 181,-77473 }, { 182,-77473 }, { 183,-77473 }, { 184,-77473 }, { 185,-77473 }, + { 186,-77473 }, { 187,-77473 }, { 188,-77473 }, { 189,-77473 }, { 190,-77473 }, + { 191,-77473 }, { 192,-77473 }, { 193,-77473 }, { 194,-77473 }, { 195,-77473 }, + { 196,-77473 }, { 197,-77473 }, { 198,-77473 }, { 199,-77473 }, { 200,-77473 }, + { 201,-77473 }, { 202,-77473 }, { 203,-77473 }, { 204,-77473 }, { 205,-77473 }, + { 206,-77473 }, { 207,-77473 }, { 208,-77473 }, { 209,-77473 }, { 210,-77473 }, + + { 211,-77473 }, { 212,-77473 }, { 213,-77473 }, { 214,-77473 }, { 215,-77473 }, + { 216,-77473 }, { 217,-77473 }, { 218,-77473 }, { 219,-77473 }, { 220,-77473 }, + { 221,-77473 }, { 222,-77473 }, { 223,-77473 }, { 224,-77473 }, { 225,-77473 }, + { 226,-77473 }, { 227,-77473 }, { 228,-77473 }, { 229,-77473 }, { 230,-77473 }, + { 231,-77473 }, { 232,-77473 }, { 233,-77473 }, { 234,-77473 }, { 235,-77473 }, + { 236,-77473 }, { 237,-77473 }, { 238,-77473 }, { 239,-77473 }, { 240,-77473 }, + { 241,-77473 }, { 242,-77473 }, { 243,-77473 }, { 244,-77473 }, { 245,-77473 }, + { 246,-77473 }, { 247,-77473 }, { 248,-77473 }, { 249,-77473 }, { 250,-77473 }, + { 251,-77473 }, { 252,-77473 }, { 253,-77473 }, { 254,-77473 }, { 255,-77473 }, + { 0, 131 }, { 0,14393 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-77730 }, + { 49,-77730 }, { 50,-77730 }, { 51,-77730 }, { 52,-77730 }, { 53,-77730 }, + + { 54,-77730 }, { 55,-77730 }, { 56,-77730 }, { 57,-77730 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-77730 }, { 66,-77730 }, { 67,-77730 }, { 68,-77730 }, + { 69,-77730 }, { 70,-77730 }, { 71,-77730 }, { 72,-77730 }, { 73,-77730 }, + { 74,-77730 }, { 75,-77730 }, { 76,-77730 }, { 77,-77730 }, { 78,-77730 }, + { 79,4883 }, { 80,-77730 }, { 81,-77730 }, { 82,-77730 }, { 83,-77730 }, + { 84,-77730 }, { 85,-77730 }, { 86,-77730 }, { 87,-77730 }, { 88,-77730 }, + { 89,-77730 }, { 90,-77730 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-77730 }, { 0, 0 }, { 97,-77730 }, { 98,-77730 }, + { 99,-77730 }, { 100,-77730 }, { 101,-77730 }, { 102,-77730 }, { 103,-77730 }, + + { 104,-77730 }, { 105,-77730 }, { 106,-77730 }, { 107,-77730 }, { 108,-77730 }, + { 109,-77730 }, { 110,-77730 }, { 111,4883 }, { 112,-77730 }, { 113,-77730 }, + { 114,-77730 }, { 115,-77730 }, { 116,-77730 }, { 117,-77730 }, { 118,-77730 }, + { 119,-77730 }, { 120,-77730 }, { 121,-77730 }, { 122,-77730 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-77730 }, { 128,-77730 }, + { 129,-77730 }, { 130,-77730 }, { 131,-77730 }, { 132,-77730 }, { 133,-77730 }, + { 134,-77730 }, { 135,-77730 }, { 136,-77730 }, { 137,-77730 }, { 138,-77730 }, + { 139,-77730 }, { 140,-77730 }, { 141,-77730 }, { 142,-77730 }, { 143,-77730 }, + { 144,-77730 }, { 145,-77730 }, { 146,-77730 }, { 147,-77730 }, { 148,-77730 }, + { 149,-77730 }, { 150,-77730 }, { 151,-77730 }, { 152,-77730 }, { 153,-77730 }, + + { 154,-77730 }, { 155,-77730 }, { 156,-77730 }, { 157,-77730 }, { 158,-77730 }, + { 159,-77730 }, { 160,-77730 }, { 161,-77730 }, { 162,-77730 }, { 163,-77730 }, + { 164,-77730 }, { 165,-77730 }, { 166,-77730 }, { 167,-77730 }, { 168,-77730 }, + { 169,-77730 }, { 170,-77730 }, { 171,-77730 }, { 172,-77730 }, { 173,-77730 }, + { 174,-77730 }, { 175,-77730 }, { 176,-77730 }, { 177,-77730 }, { 178,-77730 }, + { 179,-77730 }, { 180,-77730 }, { 181,-77730 }, { 182,-77730 }, { 183,-77730 }, + { 184,-77730 }, { 185,-77730 }, { 186,-77730 }, { 187,-77730 }, { 188,-77730 }, + { 189,-77730 }, { 190,-77730 }, { 191,-77730 }, { 192,-77730 }, { 193,-77730 }, + { 194,-77730 }, { 195,-77730 }, { 196,-77730 }, { 197,-77730 }, { 198,-77730 }, + { 199,-77730 }, { 200,-77730 }, { 201,-77730 }, { 202,-77730 }, { 203,-77730 }, + + { 204,-77730 }, { 205,-77730 }, { 206,-77730 }, { 207,-77730 }, { 208,-77730 }, + { 209,-77730 }, { 210,-77730 }, { 211,-77730 }, { 212,-77730 }, { 213,-77730 }, + { 214,-77730 }, { 215,-77730 }, { 216,-77730 }, { 217,-77730 }, { 218,-77730 }, + { 219,-77730 }, { 220,-77730 }, { 221,-77730 }, { 222,-77730 }, { 223,-77730 }, + { 224,-77730 }, { 225,-77730 }, { 226,-77730 }, { 227,-77730 }, { 228,-77730 }, + { 229,-77730 }, { 230,-77730 }, { 231,-77730 }, { 232,-77730 }, { 233,-77730 }, + { 234,-77730 }, { 235,-77730 }, { 236,-77730 }, { 237,-77730 }, { 238,-77730 }, + { 239,-77730 }, { 240,-77730 }, { 241,-77730 }, { 242,-77730 }, { 243,-77730 }, + { 244,-77730 }, { 245,-77730 }, { 246,-77730 }, { 247,-77730 }, { 248,-77730 }, + { 249,-77730 }, { 250,-77730 }, { 251,-77730 }, { 252,-77730 }, { 253,-77730 }, + + { 254,-77730 }, { 255,-77730 }, { 0, 131 }, { 0,14136 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 48,-77987 }, { 49,-77987 }, { 50,-77987 }, { 51,-77987 }, + { 52,-77987 }, { 53,-77987 }, { 54,-77987 }, { 55,-77987 }, { 56,-77987 }, + { 57,-77987 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-77987 }, { 66,-77987 }, + { 67,-77987 }, { 68,-77987 }, { 69,-77987 }, { 70,-77987 }, { 71,-77987 }, + { 72,-77987 }, { 73,-77987 }, { 74,-77987 }, { 75,-77987 }, { 76,-77987 }, + { 77,-77987 }, { 78,-77987 }, { 79,4883 }, { 80,-77987 }, { 81,-77987 }, + { 82,-77987 }, { 83,-77987 }, { 84,-77987 }, { 85,-77987 }, { 86,-77987 }, + { 87,-77987 }, { 88,-77987 }, { 89,-77987 }, { 90,-77987 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-77987 }, { 0, 0 }, + + { 97,-77987 }, { 98,-77987 }, { 99,-77987 }, { 100,-77987 }, { 101,-77987 }, + { 102,-77987 }, { 103,-77987 }, { 104,-77987 }, { 105,-77987 }, { 106,-77987 }, + { 107,-77987 }, { 108,-77987 }, { 109,-77987 }, { 110,-77987 }, { 111,4883 }, + { 112,-77987 }, { 113,-77987 }, { 114,-77987 }, { 115,-77987 }, { 116,-77987 }, + { 117,-77987 }, { 118,-77987 }, { 119,-77987 }, { 120,-77987 }, { 121,-77987 }, + { 122,-77987 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-77987 }, { 128,-77987 }, { 129,-77987 }, { 130,-77987 }, { 131,-77987 }, + { 132,-77987 }, { 133,-77987 }, { 134,-77987 }, { 135,-77987 }, { 136,-77987 }, + { 137,-77987 }, { 138,-77987 }, { 139,-77987 }, { 140,-77987 }, { 141,-77987 }, + { 142,-77987 }, { 143,-77987 }, { 144,-77987 }, { 145,-77987 }, { 146,-77987 }, + + { 147,-77987 }, { 148,-77987 }, { 149,-77987 }, { 150,-77987 }, { 151,-77987 }, + { 152,-77987 }, { 153,-77987 }, { 154,-77987 }, { 155,-77987 }, { 156,-77987 }, + { 157,-77987 }, { 158,-77987 }, { 159,-77987 }, { 160,-77987 }, { 161,-77987 }, + { 162,-77987 }, { 163,-77987 }, { 164,-77987 }, { 165,-77987 }, { 166,-77987 }, + { 167,-77987 }, { 168,-77987 }, { 169,-77987 }, { 170,-77987 }, { 171,-77987 }, + { 172,-77987 }, { 173,-77987 }, { 174,-77987 }, { 175,-77987 }, { 176,-77987 }, + { 177,-77987 }, { 178,-77987 }, { 179,-77987 }, { 180,-77987 }, { 181,-77987 }, + { 182,-77987 }, { 183,-77987 }, { 184,-77987 }, { 185,-77987 }, { 186,-77987 }, + { 187,-77987 }, { 188,-77987 }, { 189,-77987 }, { 190,-77987 }, { 191,-77987 }, + { 192,-77987 }, { 193,-77987 }, { 194,-77987 }, { 195,-77987 }, { 196,-77987 }, + + { 197,-77987 }, { 198,-77987 }, { 199,-77987 }, { 200,-77987 }, { 201,-77987 }, + { 202,-77987 }, { 203,-77987 }, { 204,-77987 }, { 205,-77987 }, { 206,-77987 }, + { 207,-77987 }, { 208,-77987 }, { 209,-77987 }, { 210,-77987 }, { 211,-77987 }, + { 212,-77987 }, { 213,-77987 }, { 214,-77987 }, { 215,-77987 }, { 216,-77987 }, + { 217,-77987 }, { 218,-77987 }, { 219,-77987 }, { 220,-77987 }, { 221,-77987 }, + { 222,-77987 }, { 223,-77987 }, { 224,-77987 }, { 225,-77987 }, { 226,-77987 }, + { 227,-77987 }, { 228,-77987 }, { 229,-77987 }, { 230,-77987 }, { 231,-77987 }, + { 232,-77987 }, { 233,-77987 }, { 234,-77987 }, { 235,-77987 }, { 236,-77987 }, + { 237,-77987 }, { 238,-77987 }, { 239,-77987 }, { 240,-77987 }, { 241,-77987 }, + { 242,-77987 }, { 243,-77987 }, { 244,-77987 }, { 245,-77987 }, { 246,-77987 }, + + { 247,-77987 }, { 248,-77987 }, { 249,-77987 }, { 250,-77987 }, { 251,-77987 }, + { 252,-77987 }, { 253,-77987 }, { 254,-77987 }, { 255,-77987 }, { 0, 131 }, + { 0,13879 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-78244 }, { 49,-78244 }, + { 50,-78244 }, { 51,-78244 }, { 52,-78244 }, { 53,-78244 }, { 54,-78244 }, + { 55,-78244 }, { 56,-78244 }, { 57,-78244 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-78244 }, { 66,-78244 }, { 67,-78244 }, { 68,-78244 }, { 69,-78244 }, + { 70,4883 }, { 71,-78244 }, { 72,-78244 }, { 73,-78244 }, { 74,-78244 }, + { 75,-78244 }, { 76,-78244 }, { 77,-78244 }, { 78,-78244 }, { 79,-78244 }, + { 80,-78244 }, { 81,-78244 }, { 82,-78244 }, { 83,-78244 }, { 84,-78244 }, + { 85,-78244 }, { 86,-78244 }, { 87,-78244 }, { 88,-78244 }, { 89,-78244 }, + + { 90,-78244 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-78244 }, { 0, 0 }, { 97,-78244 }, { 98,-78244 }, { 99,-78244 }, + { 100,-78244 }, { 101,-78244 }, { 102,4883 }, { 103,-78244 }, { 104,-78244 }, + { 105,-78244 }, { 106,-78244 }, { 107,-78244 }, { 108,-78244 }, { 109,-78244 }, + { 110,-78244 }, { 111,-78244 }, { 112,-78244 }, { 113,-78244 }, { 114,-78244 }, + { 115,-78244 }, { 116,-78244 }, { 117,-78244 }, { 118,-78244 }, { 119,-78244 }, + { 120,-78244 }, { 121,-78244 }, { 122,-78244 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-78244 }, { 128,-78244 }, { 129,-78244 }, + { 130,-78244 }, { 131,-78244 }, { 132,-78244 }, { 133,-78244 }, { 134,-78244 }, + { 135,-78244 }, { 136,-78244 }, { 137,-78244 }, { 138,-78244 }, { 139,-78244 }, + + { 140,-78244 }, { 141,-78244 }, { 142,-78244 }, { 143,-78244 }, { 144,-78244 }, + { 145,-78244 }, { 146,-78244 }, { 147,-78244 }, { 148,-78244 }, { 149,-78244 }, + { 150,-78244 }, { 151,-78244 }, { 152,-78244 }, { 153,-78244 }, { 154,-78244 }, + { 155,-78244 }, { 156,-78244 }, { 157,-78244 }, { 158,-78244 }, { 159,-78244 }, + { 160,-78244 }, { 161,-78244 }, { 162,-78244 }, { 163,-78244 }, { 164,-78244 }, + { 165,-78244 }, { 166,-78244 }, { 167,-78244 }, { 168,-78244 }, { 169,-78244 }, + { 170,-78244 }, { 171,-78244 }, { 172,-78244 }, { 173,-78244 }, { 174,-78244 }, + { 175,-78244 }, { 176,-78244 }, { 177,-78244 }, { 178,-78244 }, { 179,-78244 }, + { 180,-78244 }, { 181,-78244 }, { 182,-78244 }, { 183,-78244 }, { 184,-78244 }, + { 185,-78244 }, { 186,-78244 }, { 187,-78244 }, { 188,-78244 }, { 189,-78244 }, + + { 190,-78244 }, { 191,-78244 }, { 192,-78244 }, { 193,-78244 }, { 194,-78244 }, + { 195,-78244 }, { 196,-78244 }, { 197,-78244 }, { 198,-78244 }, { 199,-78244 }, + { 200,-78244 }, { 201,-78244 }, { 202,-78244 }, { 203,-78244 }, { 204,-78244 }, + { 205,-78244 }, { 206,-78244 }, { 207,-78244 }, { 208,-78244 }, { 209,-78244 }, + { 210,-78244 }, { 211,-78244 }, { 212,-78244 }, { 213,-78244 }, { 214,-78244 }, + { 215,-78244 }, { 216,-78244 }, { 217,-78244 }, { 218,-78244 }, { 219,-78244 }, + { 220,-78244 }, { 221,-78244 }, { 222,-78244 }, { 223,-78244 }, { 224,-78244 }, + { 225,-78244 }, { 226,-78244 }, { 227,-78244 }, { 228,-78244 }, { 229,-78244 }, + { 230,-78244 }, { 231,-78244 }, { 232,-78244 }, { 233,-78244 }, { 234,-78244 }, + { 235,-78244 }, { 236,-78244 }, { 237,-78244 }, { 238,-78244 }, { 239,-78244 }, + + { 240,-78244 }, { 241,-78244 }, { 242,-78244 }, { 243,-78244 }, { 244,-78244 }, + { 245,-78244 }, { 246,-78244 }, { 247,-78244 }, { 248,-78244 }, { 249,-78244 }, + { 250,-78244 }, { 251,-78244 }, { 252,-78244 }, { 253,-78244 }, { 254,-78244 }, + { 255,-78244 }, { 0, 131 }, { 0,13622 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-78501 }, { 49,-78501 }, { 50,-78501 }, { 51,-78501 }, { 52,-78501 }, + { 53,-78501 }, { 54,-78501 }, { 55,-78501 }, { 56,-78501 }, { 57,-78501 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-78501 }, { 66,-78501 }, { 67,-78501 }, + { 68,-78501 }, { 69,4883 }, { 70,-78501 }, { 71,-78501 }, { 72,-78501 }, + { 73,-78501 }, { 74,-78501 }, { 75,-78501 }, { 76,-78501 }, { 77,-78501 }, + { 78,-78501 }, { 79,-78501 }, { 80,-78501 }, { 81,-78501 }, { 82,-78501 }, + + { 83,-78501 }, { 84,-78501 }, { 85,-78501 }, { 86,-78501 }, { 87,-78501 }, + { 88,-78501 }, { 89,-78501 }, { 90,-78501 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-78501 }, { 0, 0 }, { 97,-78501 }, + { 98,-78501 }, { 99,-78501 }, { 100,-78501 }, { 101,4883 }, { 102,-78501 }, + { 103,-78501 }, { 104,-78501 }, { 105,-78501 }, { 106,-78501 }, { 107,-78501 }, + { 108,-78501 }, { 109,-78501 }, { 110,-78501 }, { 111,-78501 }, { 112,-78501 }, + { 113,-78501 }, { 114,-78501 }, { 115,-78501 }, { 116,-78501 }, { 117,-78501 }, + { 118,-78501 }, { 119,-78501 }, { 120,-78501 }, { 121,-78501 }, { 122,-78501 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-78501 }, + { 128,-78501 }, { 129,-78501 }, { 130,-78501 }, { 131,-78501 }, { 132,-78501 }, + + { 133,-78501 }, { 134,-78501 }, { 135,-78501 }, { 136,-78501 }, { 137,-78501 }, + { 138,-78501 }, { 139,-78501 }, { 140,-78501 }, { 141,-78501 }, { 142,-78501 }, + { 143,-78501 }, { 144,-78501 }, { 145,-78501 }, { 146,-78501 }, { 147,-78501 }, + { 148,-78501 }, { 149,-78501 }, { 150,-78501 }, { 151,-78501 }, { 152,-78501 }, + { 153,-78501 }, { 154,-78501 }, { 155,-78501 }, { 156,-78501 }, { 157,-78501 }, + { 158,-78501 }, { 159,-78501 }, { 160,-78501 }, { 161,-78501 }, { 162,-78501 }, + { 163,-78501 }, { 164,-78501 }, { 165,-78501 }, { 166,-78501 }, { 167,-78501 }, + { 168,-78501 }, { 169,-78501 }, { 170,-78501 }, { 171,-78501 }, { 172,-78501 }, + { 173,-78501 }, { 174,-78501 }, { 175,-78501 }, { 176,-78501 }, { 177,-78501 }, + { 178,-78501 }, { 179,-78501 }, { 180,-78501 }, { 181,-78501 }, { 182,-78501 }, + + { 183,-78501 }, { 184,-78501 }, { 185,-78501 }, { 186,-78501 }, { 187,-78501 }, + { 188,-78501 }, { 189,-78501 }, { 190,-78501 }, { 191,-78501 }, { 192,-78501 }, + { 193,-78501 }, { 194,-78501 }, { 195,-78501 }, { 196,-78501 }, { 197,-78501 }, + { 198,-78501 }, { 199,-78501 }, { 200,-78501 }, { 201,-78501 }, { 202,-78501 }, + { 203,-78501 }, { 204,-78501 }, { 205,-78501 }, { 206,-78501 }, { 207,-78501 }, + { 208,-78501 }, { 209,-78501 }, { 210,-78501 }, { 211,-78501 }, { 212,-78501 }, + { 213,-78501 }, { 214,-78501 }, { 215,-78501 }, { 216,-78501 }, { 217,-78501 }, + { 218,-78501 }, { 219,-78501 }, { 220,-78501 }, { 221,-78501 }, { 222,-78501 }, + { 223,-78501 }, { 224,-78501 }, { 225,-78501 }, { 226,-78501 }, { 227,-78501 }, + { 228,-78501 }, { 229,-78501 }, { 230,-78501 }, { 231,-78501 }, { 232,-78501 }, + + { 233,-78501 }, { 234,-78501 }, { 235,-78501 }, { 236,-78501 }, { 237,-78501 }, + { 238,-78501 }, { 239,-78501 }, { 240,-78501 }, { 241,-78501 }, { 242,-78501 }, + { 243,-78501 }, { 244,-78501 }, { 245,-78501 }, { 246,-78501 }, { 247,-78501 }, + { 248,-78501 }, { 249,-78501 }, { 250,-78501 }, { 251,-78501 }, { 252,-78501 }, + { 253,-78501 }, { 254,-78501 }, { 255,-78501 }, { 0, 131 }, { 0,13365 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-78758 }, { 49,-78758 }, { 50,-78758 }, + { 51,-78758 }, { 52,-78758 }, { 53,-78758 }, { 54,-78758 }, { 55,-78758 }, + { 56,-78758 }, { 57,-78758 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-78758 }, + { 66,-78758 }, { 67,-78758 }, { 68,-78758 }, { 69,4883 }, { 70,-78758 }, + { 71,-78758 }, { 72,-78758 }, { 73,-78758 }, { 74,-78758 }, { 75,-78758 }, + + { 76,-78758 }, { 77,-78758 }, { 78,-78758 }, { 79,-78758 }, { 80,-78758 }, + { 81,-78758 }, { 82,-78758 }, { 83,-78758 }, { 84,-78758 }, { 85,-78758 }, + { 86,-78758 }, { 87,-78758 }, { 88,-78758 }, { 89,-78758 }, { 90,-78758 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-78758 }, + { 0, 0 }, { 97,-78758 }, { 98,-78758 }, { 99,-78758 }, { 100,-78758 }, + { 101,4883 }, { 102,-78758 }, { 103,-78758 }, { 104,-78758 }, { 105,-78758 }, + { 106,-78758 }, { 107,-78758 }, { 108,-78758 }, { 109,-78758 }, { 110,-78758 }, + { 111,-78758 }, { 112,-78758 }, { 113,-78758 }, { 114,-78758 }, { 115,-78758 }, + { 116,-78758 }, { 117,-78758 }, { 118,-78758 }, { 119,-78758 }, { 120,-78758 }, + { 121,-78758 }, { 122,-78758 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 127,-78758 }, { 128,-78758 }, { 129,-78758 }, { 130,-78758 }, + { 131,-78758 }, { 132,-78758 }, { 133,-78758 }, { 134,-78758 }, { 135,-78758 }, + { 136,-78758 }, { 137,-78758 }, { 138,-78758 }, { 139,-78758 }, { 140,-78758 }, + { 141,-78758 }, { 142,-78758 }, { 143,-78758 }, { 144,-78758 }, { 145,-78758 }, + { 146,-78758 }, { 147,-78758 }, { 148,-78758 }, { 149,-78758 }, { 150,-78758 }, + { 151,-78758 }, { 152,-78758 }, { 153,-78758 }, { 154,-78758 }, { 155,-78758 }, + { 156,-78758 }, { 157,-78758 }, { 158,-78758 }, { 159,-78758 }, { 160,-78758 }, + { 161,-78758 }, { 162,-78758 }, { 163,-78758 }, { 164,-78758 }, { 165,-78758 }, + { 166,-78758 }, { 167,-78758 }, { 168,-78758 }, { 169,-78758 }, { 170,-78758 }, + { 171,-78758 }, { 172,-78758 }, { 173,-78758 }, { 174,-78758 }, { 175,-78758 }, + + { 176,-78758 }, { 177,-78758 }, { 178,-78758 }, { 179,-78758 }, { 180,-78758 }, + { 181,-78758 }, { 182,-78758 }, { 183,-78758 }, { 184,-78758 }, { 185,-78758 }, + { 186,-78758 }, { 187,-78758 }, { 188,-78758 }, { 189,-78758 }, { 190,-78758 }, + { 191,-78758 }, { 192,-78758 }, { 193,-78758 }, { 194,-78758 }, { 195,-78758 }, + { 196,-78758 }, { 197,-78758 }, { 198,-78758 }, { 199,-78758 }, { 200,-78758 }, + { 201,-78758 }, { 202,-78758 }, { 203,-78758 }, { 204,-78758 }, { 205,-78758 }, + { 206,-78758 }, { 207,-78758 }, { 208,-78758 }, { 209,-78758 }, { 210,-78758 }, + { 211,-78758 }, { 212,-78758 }, { 213,-78758 }, { 214,-78758 }, { 215,-78758 }, + { 216,-78758 }, { 217,-78758 }, { 218,-78758 }, { 219,-78758 }, { 220,-78758 }, + { 221,-78758 }, { 222,-78758 }, { 223,-78758 }, { 224,-78758 }, { 225,-78758 }, + + { 226,-78758 }, { 227,-78758 }, { 228,-78758 }, { 229,-78758 }, { 230,-78758 }, + { 231,-78758 }, { 232,-78758 }, { 233,-78758 }, { 234,-78758 }, { 235,-78758 }, + { 236,-78758 }, { 237,-78758 }, { 238,-78758 }, { 239,-78758 }, { 240,-78758 }, + { 241,-78758 }, { 242,-78758 }, { 243,-78758 }, { 244,-78758 }, { 245,-78758 }, + { 246,-78758 }, { 247,-78758 }, { 248,-78758 }, { 249,-78758 }, { 250,-78758 }, + { 251,-78758 }, { 252,-78758 }, { 253,-78758 }, { 254,-78758 }, { 255,-78758 }, + { 0, 131 }, { 0,13108 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-79015 }, + { 49,-79015 }, { 50,-79015 }, { 51,-79015 }, { 52,-79015 }, { 53,-79015 }, + { 54,-79015 }, { 55,-79015 }, { 56,-79015 }, { 57,-79015 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-79015 }, { 66,-79015 }, { 67,-79015 }, { 68,4883 }, + + { 69,-79015 }, { 70,-79015 }, { 71,-79015 }, { 72,-79015 }, { 73,-79015 }, + { 74,-79015 }, { 75,-79015 }, { 76,-79015 }, { 77,-79015 }, { 78,-79015 }, + { 79,-79015 }, { 80,-79015 }, { 81,-79015 }, { 82,-79015 }, { 83,-79015 }, + { 84,-79015 }, { 85,-79015 }, { 86,-79015 }, { 87,-79015 }, { 88,-79015 }, + { 89,-79015 }, { 90,-79015 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-79015 }, { 0, 0 }, { 97,-79015 }, { 98,-79015 }, + { 99,-79015 }, { 100,4883 }, { 101,-79015 }, { 102,-79015 }, { 103,-79015 }, + { 104,-79015 }, { 105,-79015 }, { 106,-79015 }, { 107,-79015 }, { 108,-79015 }, + { 109,-79015 }, { 110,-79015 }, { 111,-79015 }, { 112,-79015 }, { 113,-79015 }, + { 114,-79015 }, { 115,-79015 }, { 116,-79015 }, { 117,-79015 }, { 118,-79015 }, + + { 119,-79015 }, { 120,-79015 }, { 121,-79015 }, { 122,-79015 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-79015 }, { 128,-79015 }, + { 129,-79015 }, { 130,-79015 }, { 131,-79015 }, { 132,-79015 }, { 133,-79015 }, + { 134,-79015 }, { 135,-79015 }, { 136,-79015 }, { 137,-79015 }, { 138,-79015 }, + { 139,-79015 }, { 140,-79015 }, { 141,-79015 }, { 142,-79015 }, { 143,-79015 }, + { 144,-79015 }, { 145,-79015 }, { 146,-79015 }, { 147,-79015 }, { 148,-79015 }, + { 149,-79015 }, { 150,-79015 }, { 151,-79015 }, { 152,-79015 }, { 153,-79015 }, + { 154,-79015 }, { 155,-79015 }, { 156,-79015 }, { 157,-79015 }, { 158,-79015 }, + { 159,-79015 }, { 160,-79015 }, { 161,-79015 }, { 162,-79015 }, { 163,-79015 }, + { 164,-79015 }, { 165,-79015 }, { 166,-79015 }, { 167,-79015 }, { 168,-79015 }, + + { 169,-79015 }, { 170,-79015 }, { 171,-79015 }, { 172,-79015 }, { 173,-79015 }, + { 174,-79015 }, { 175,-79015 }, { 176,-79015 }, { 177,-79015 }, { 178,-79015 }, + { 179,-79015 }, { 180,-79015 }, { 181,-79015 }, { 182,-79015 }, { 183,-79015 }, + { 184,-79015 }, { 185,-79015 }, { 186,-79015 }, { 187,-79015 }, { 188,-79015 }, + { 189,-79015 }, { 190,-79015 }, { 191,-79015 }, { 192,-79015 }, { 193,-79015 }, + { 194,-79015 }, { 195,-79015 }, { 196,-79015 }, { 197,-79015 }, { 198,-79015 }, + { 199,-79015 }, { 200,-79015 }, { 201,-79015 }, { 202,-79015 }, { 203,-79015 }, + { 204,-79015 }, { 205,-79015 }, { 206,-79015 }, { 207,-79015 }, { 208,-79015 }, + { 209,-79015 }, { 210,-79015 }, { 211,-79015 }, { 212,-79015 }, { 213,-79015 }, + { 214,-79015 }, { 215,-79015 }, { 216,-79015 }, { 217,-79015 }, { 218,-79015 }, + + { 219,-79015 }, { 220,-79015 }, { 221,-79015 }, { 222,-79015 }, { 223,-79015 }, + { 224,-79015 }, { 225,-79015 }, { 226,-79015 }, { 227,-79015 }, { 228,-79015 }, + { 229,-79015 }, { 230,-79015 }, { 231,-79015 }, { 232,-79015 }, { 233,-79015 }, + { 234,-79015 }, { 235,-79015 }, { 236,-79015 }, { 237,-79015 }, { 238,-79015 }, + { 239,-79015 }, { 240,-79015 }, { 241,-79015 }, { 242,-79015 }, { 243,-79015 }, + { 244,-79015 }, { 245,-79015 }, { 246,-79015 }, { 247,-79015 }, { 248,-79015 }, + { 249,-79015 }, { 250,-79015 }, { 251,-79015 }, { 252,-79015 }, { 253,-79015 }, + { 254,-79015 }, { 255,-79015 }, { 0, 131 }, { 0,12851 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-79272 }, { 49,-79272 }, { 50,-79272 }, { 51,-79272 }, + { 52,-79272 }, { 53,-79272 }, { 54,-79272 }, { 55,-79272 }, { 56,-79272 }, + { 57,-79272 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-79272 }, { 66,-79272 }, + { 67,-79272 }, { 68,-79272 }, { 69,-79272 }, { 70,-79272 }, { 71,-79272 }, + { 72,-79272 }, { 73,-79272 }, { 74,-79272 }, { 75,-79272 }, { 76,-79272 }, + { 77,-79272 }, { 78,-79272 }, { 79,4883 }, { 80,-79272 }, { 81,-79272 }, + { 82,-79272 }, { 83,-79272 }, { 84,-79272 }, { 85,-79272 }, { 86,-79272 }, + { 87,-79272 }, { 88,-79272 }, { 89,-79272 }, { 90,-79272 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-79272 }, { 0, 0 }, + { 97,-79272 }, { 98,-79272 }, { 99,-79272 }, { 100,-79272 }, { 101,-79272 }, + { 102,-79272 }, { 103,-79272 }, { 104,-79272 }, { 105,-79272 }, { 106,-79272 }, + { 107,-79272 }, { 108,-79272 }, { 109,-79272 }, { 110,-79272 }, { 111,4883 }, + + { 112,-79272 }, { 113,-79272 }, { 114,-79272 }, { 115,-79272 }, { 116,-79272 }, + { 117,-79272 }, { 118,-79272 }, { 119,-79272 }, { 120,-79272 }, { 121,-79272 }, + { 122,-79272 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-79272 }, { 128,-79272 }, { 129,-79272 }, { 130,-79272 }, { 131,-79272 }, + { 132,-79272 }, { 133,-79272 }, { 134,-79272 }, { 135,-79272 }, { 136,-79272 }, + { 137,-79272 }, { 138,-79272 }, { 139,-79272 }, { 140,-79272 }, { 141,-79272 }, + { 142,-79272 }, { 143,-79272 }, { 144,-79272 }, { 145,-79272 }, { 146,-79272 }, + { 147,-79272 }, { 148,-79272 }, { 149,-79272 }, { 150,-79272 }, { 151,-79272 }, + { 152,-79272 }, { 153,-79272 }, { 154,-79272 }, { 155,-79272 }, { 156,-79272 }, + { 157,-79272 }, { 158,-79272 }, { 159,-79272 }, { 160,-79272 }, { 161,-79272 }, + + { 162,-79272 }, { 163,-79272 }, { 164,-79272 }, { 165,-79272 }, { 166,-79272 }, + { 167,-79272 }, { 168,-79272 }, { 169,-79272 }, { 170,-79272 }, { 171,-79272 }, + { 172,-79272 }, { 173,-79272 }, { 174,-79272 }, { 175,-79272 }, { 176,-79272 }, + { 177,-79272 }, { 178,-79272 }, { 179,-79272 }, { 180,-79272 }, { 181,-79272 }, + { 182,-79272 }, { 183,-79272 }, { 184,-79272 }, { 185,-79272 }, { 186,-79272 }, + { 187,-79272 }, { 188,-79272 }, { 189,-79272 }, { 190,-79272 }, { 191,-79272 }, + { 192,-79272 }, { 193,-79272 }, { 194,-79272 }, { 195,-79272 }, { 196,-79272 }, + { 197,-79272 }, { 198,-79272 }, { 199,-79272 }, { 200,-79272 }, { 201,-79272 }, + { 202,-79272 }, { 203,-79272 }, { 204,-79272 }, { 205,-79272 }, { 206,-79272 }, + { 207,-79272 }, { 208,-79272 }, { 209,-79272 }, { 210,-79272 }, { 211,-79272 }, + + { 212,-79272 }, { 213,-79272 }, { 214,-79272 }, { 215,-79272 }, { 216,-79272 }, + { 217,-79272 }, { 218,-79272 }, { 219,-79272 }, { 220,-79272 }, { 221,-79272 }, + { 222,-79272 }, { 223,-79272 }, { 224,-79272 }, { 225,-79272 }, { 226,-79272 }, + { 227,-79272 }, { 228,-79272 }, { 229,-79272 }, { 230,-79272 }, { 231,-79272 }, + { 232,-79272 }, { 233,-79272 }, { 234,-79272 }, { 235,-79272 }, { 236,-79272 }, + { 237,-79272 }, { 238,-79272 }, { 239,-79272 }, { 240,-79272 }, { 241,-79272 }, + { 242,-79272 }, { 243,-79272 }, { 244,-79272 }, { 245,-79272 }, { 246,-79272 }, + { 247,-79272 }, { 248,-79272 }, { 249,-79272 }, { 250,-79272 }, { 251,-79272 }, + { 252,-79272 }, { 253,-79272 }, { 254,-79272 }, { 255,-79272 }, { 0, 131 }, + { 0,12594 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-79529 }, { 49,-79529 }, + { 50,-79529 }, { 51,-79529 }, { 52,-79529 }, { 53,-79529 }, { 54,-79529 }, + + { 55,-79529 }, { 56,-79529 }, { 57,-79529 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-79529 }, { 66,-79529 }, { 67,-79529 }, { 68,-79529 }, { 69,-79529 }, + { 70,-79529 }, { 71,-79529 }, { 72,-79529 }, { 73,-79529 }, { 74,-79529 }, + { 75,-79529 }, { 76,-79529 }, { 77,-79529 }, { 78,-79529 }, { 79,-79529 }, + { 80,-79529 }, { 81,-79529 }, { 82,-79529 }, { 83,-79529 }, { 84,-79529 }, + { 85,-79529 }, { 86,-79529 }, { 87,-79529 }, { 88,-79529 }, { 89,-79529 }, + { 90,-79529 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,4883 }, { 0, 0 }, { 97,-79529 }, { 98,-79529 }, { 99,-79529 }, + { 100,-79529 }, { 101,-79529 }, { 102,-79529 }, { 103,-79529 }, { 104,-79529 }, + + { 105,-79529 }, { 106,-79529 }, { 107,-79529 }, { 108,-79529 }, { 109,-79529 }, + { 110,-79529 }, { 111,-79529 }, { 112,-79529 }, { 113,-79529 }, { 114,-79529 }, + { 115,-79529 }, { 116,-79529 }, { 117,-79529 }, { 118,-79529 }, { 119,-79529 }, + { 120,-79529 }, { 121,-79529 }, { 122,-79529 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-79529 }, { 128,-79529 }, { 129,-79529 }, + { 130,-79529 }, { 131,-79529 }, { 132,-79529 }, { 133,-79529 }, { 134,-79529 }, + { 135,-79529 }, { 136,-79529 }, { 137,-79529 }, { 138,-79529 }, { 139,-79529 }, + { 140,-79529 }, { 141,-79529 }, { 142,-79529 }, { 143,-79529 }, { 144,-79529 }, + { 145,-79529 }, { 146,-79529 }, { 147,-79529 }, { 148,-79529 }, { 149,-79529 }, + { 150,-79529 }, { 151,-79529 }, { 152,-79529 }, { 153,-79529 }, { 154,-79529 }, + + { 155,-79529 }, { 156,-79529 }, { 157,-79529 }, { 158,-79529 }, { 159,-79529 }, + { 160,-79529 }, { 161,-79529 }, { 162,-79529 }, { 163,-79529 }, { 164,-79529 }, + { 165,-79529 }, { 166,-79529 }, { 167,-79529 }, { 168,-79529 }, { 169,-79529 }, + { 170,-79529 }, { 171,-79529 }, { 172,-79529 }, { 173,-79529 }, { 174,-79529 }, + { 175,-79529 }, { 176,-79529 }, { 177,-79529 }, { 178,-79529 }, { 179,-79529 }, + { 180,-79529 }, { 181,-79529 }, { 182,-79529 }, { 183,-79529 }, { 184,-79529 }, + { 185,-79529 }, { 186,-79529 }, { 187,-79529 }, { 188,-79529 }, { 189,-79529 }, + { 190,-79529 }, { 191,-79529 }, { 192,-79529 }, { 193,-79529 }, { 194,-79529 }, + { 195,-79529 }, { 196,-79529 }, { 197,-79529 }, { 198,-79529 }, { 199,-79529 }, + { 200,-79529 }, { 201,-79529 }, { 202,-79529 }, { 203,-79529 }, { 204,-79529 }, + + { 205,-79529 }, { 206,-79529 }, { 207,-79529 }, { 208,-79529 }, { 209,-79529 }, + { 210,-79529 }, { 211,-79529 }, { 212,-79529 }, { 213,-79529 }, { 214,-79529 }, + { 215,-79529 }, { 216,-79529 }, { 217,-79529 }, { 218,-79529 }, { 219,-79529 }, + { 220,-79529 }, { 221,-79529 }, { 222,-79529 }, { 223,-79529 }, { 224,-79529 }, + { 225,-79529 }, { 226,-79529 }, { 227,-79529 }, { 228,-79529 }, { 229,-79529 }, + { 230,-79529 }, { 231,-79529 }, { 232,-79529 }, { 233,-79529 }, { 234,-79529 }, + { 235,-79529 }, { 236,-79529 }, { 237,-79529 }, { 238,-79529 }, { 239,-79529 }, + { 240,-79529 }, { 241,-79529 }, { 242,-79529 }, { 243,-79529 }, { 244,-79529 }, + { 245,-79529 }, { 246,-79529 }, { 247,-79529 }, { 248,-79529 }, { 249,-79529 }, + { 250,-79529 }, { 251,-79529 }, { 252,-79529 }, { 253,-79529 }, { 254,-79529 }, + + { 255,-79529 }, { 0, 82 }, { 0,12337 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 48,-79786 }, { 49,-79786 }, { 50,-79786 }, { 51,-79786 }, { 52,-79786 }, + { 53,-79786 }, { 54,-79786 }, { 55,-79786 }, { 56,-79786 }, { 57,-79786 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-79786 }, { 66,-79786 }, { 67,-79786 }, + { 68,-79786 }, { 69,-79786 }, { 70,-79786 }, { 71,-79786 }, { 72,-79786 }, + { 73,-79786 }, { 74,-79786 }, { 75,-79786 }, { 76,-79786 }, { 77,-79786 }, + { 78,-79786 }, { 79,-79786 }, { 80,-79786 }, { 81,-79786 }, { 82,-79786 }, + { 83,-79786 }, { 84,-79786 }, { 85,-79786 }, { 86,-79786 }, { 87,-79786 }, + { 88,-79786 }, { 89,-79786 }, { 90,-79786 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-79786 }, { 0, 0 }, { 97,-79786 }, + + { 98,-79786 }, { 99,-79786 }, { 100,-79786 }, { 101,-79786 }, { 102,-79786 }, + { 103,-79786 }, { 104,-79786 }, { 105,-79786 }, { 106,-79786 }, { 107,-79786 }, + { 108,-79786 }, { 109,-79786 }, { 110,-79786 }, { 111,-79786 }, { 112,-79786 }, + { 113,-79786 }, { 114,-79786 }, { 115,-79786 }, { 116,-79786 }, { 117,-79786 }, + { 118,-79786 }, { 119,-79786 }, { 120,-79786 }, { 121,-79786 }, { 122,-79786 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-79786 }, + { 128,-79786 }, { 129,-79786 }, { 130,-79786 }, { 131,-79786 }, { 132,-79786 }, + { 133,-79786 }, { 134,-79786 }, { 135,-79786 }, { 136,-79786 }, { 137,-79786 }, + { 138,-79786 }, { 139,-79786 }, { 140,-79786 }, { 141,-79786 }, { 142,-79786 }, + { 143,-79786 }, { 144,-79786 }, { 145,-79786 }, { 146,-79786 }, { 147,-79786 }, + + { 148,-79786 }, { 149,-79786 }, { 150,-79786 }, { 151,-79786 }, { 152,-79786 }, + { 153,-79786 }, { 154,-79786 }, { 155,-79786 }, { 156,-79786 }, { 157,-79786 }, + { 158,-79786 }, { 159,-79786 }, { 160,-79786 }, { 161,-79786 }, { 162,-79786 }, + { 163,-79786 }, { 164,-79786 }, { 165,-79786 }, { 166,-79786 }, { 167,-79786 }, + { 168,-79786 }, { 169,-79786 }, { 170,-79786 }, { 171,-79786 }, { 172,-79786 }, + { 173,-79786 }, { 174,-79786 }, { 175,-79786 }, { 176,-79786 }, { 177,-79786 }, + { 178,-79786 }, { 179,-79786 }, { 180,-79786 }, { 181,-79786 }, { 182,-79786 }, + { 183,-79786 }, { 184,-79786 }, { 185,-79786 }, { 186,-79786 }, { 187,-79786 }, + { 188,-79786 }, { 189,-79786 }, { 190,-79786 }, { 191,-79786 }, { 192,-79786 }, + { 193,-79786 }, { 194,-79786 }, { 195,-79786 }, { 196,-79786 }, { 197,-79786 }, + + { 198,-79786 }, { 199,-79786 }, { 200,-79786 }, { 201,-79786 }, { 202,-79786 }, + { 203,-79786 }, { 204,-79786 }, { 205,-79786 }, { 206,-79786 }, { 207,-79786 }, + { 208,-79786 }, { 209,-79786 }, { 210,-79786 }, { 211,-79786 }, { 212,-79786 }, + { 213,-79786 }, { 214,-79786 }, { 215,-79786 }, { 216,-79786 }, { 217,-79786 }, + { 218,-79786 }, { 219,-79786 }, { 220,-79786 }, { 221,-79786 }, { 222,-79786 }, + { 223,-79786 }, { 224,-79786 }, { 225,-79786 }, { 226,-79786 }, { 227,-79786 }, + { 228,-79786 }, { 229,-79786 }, { 230,-79786 }, { 231,-79786 }, { 232,-79786 }, + { 233,-79786 }, { 234,-79786 }, { 235,-79786 }, { 236,-79786 }, { 237,-79786 }, + { 238,-79786 }, { 239,-79786 }, { 240,-79786 }, { 241,-79786 }, { 242,-79786 }, + { 243,-79786 }, { 244,-79786 }, { 245,-79786 }, { 246,-79786 }, { 247,-79786 }, + + { 248,-79786 }, { 249,-79786 }, { 250,-79786 }, { 251,-79786 }, { 252,-79786 }, + { 253,-79786 }, { 254,-79786 }, { 255,-79786 }, { 0, 131 }, { 0,12080 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-80043 }, { 49,-80043 }, { 50,-80043 }, + { 51,-80043 }, { 52,-80043 }, { 53,-80043 }, { 54,-80043 }, { 55,-80043 }, + { 56,-80043 }, { 57,-80043 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-80043 }, + { 66,-80043 }, { 67,-80043 }, { 68,-80043 }, { 69,-80043 }, { 70,-80043 }, + { 71,-80043 }, { 72,-80043 }, { 73,-80043 }, { 74,-80043 }, { 75,-80043 }, + { 76,-80043 }, { 77,-80043 }, { 78,-80043 }, { 79,4626 }, { 80,-80043 }, + { 81,-80043 }, { 82,-80043 }, { 83,-80043 }, { 84,-80043 }, { 85,-80043 }, + { 86,-80043 }, { 87,-80043 }, { 88,-80043 }, { 89,-80043 }, { 90,-80043 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-80043 }, + { 0, 0 }, { 97,-80043 }, { 98,-80043 }, { 99,-80043 }, { 100,-80043 }, + { 101,-80043 }, { 102,-80043 }, { 103,-80043 }, { 104,-80043 }, { 105,-80043 }, + { 106,-80043 }, { 107,-80043 }, { 108,-80043 }, { 109,-80043 }, { 110,-80043 }, + { 111,4626 }, { 112,-80043 }, { 113,-80043 }, { 114,-80043 }, { 115,-80043 }, + { 116,-80043 }, { 117,-80043 }, { 118,-80043 }, { 119,-80043 }, { 120,-80043 }, + { 121,-80043 }, { 122,-80043 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-80043 }, { 128,-80043 }, { 129,-80043 }, { 130,-80043 }, + { 131,-80043 }, { 132,-80043 }, { 133,-80043 }, { 134,-80043 }, { 135,-80043 }, + { 136,-80043 }, { 137,-80043 }, { 138,-80043 }, { 139,-80043 }, { 140,-80043 }, + + { 141,-80043 }, { 142,-80043 }, { 143,-80043 }, { 144,-80043 }, { 145,-80043 }, + { 146,-80043 }, { 147,-80043 }, { 148,-80043 }, { 149,-80043 }, { 150,-80043 }, + { 151,-80043 }, { 152,-80043 }, { 153,-80043 }, { 154,-80043 }, { 155,-80043 }, + { 156,-80043 }, { 157,-80043 }, { 158,-80043 }, { 159,-80043 }, { 160,-80043 }, + { 161,-80043 }, { 162,-80043 }, { 163,-80043 }, { 164,-80043 }, { 165,-80043 }, + { 166,-80043 }, { 167,-80043 }, { 168,-80043 }, { 169,-80043 }, { 170,-80043 }, + { 171,-80043 }, { 172,-80043 }, { 173,-80043 }, { 174,-80043 }, { 175,-80043 }, + { 176,-80043 }, { 177,-80043 }, { 178,-80043 }, { 179,-80043 }, { 180,-80043 }, + { 181,-80043 }, { 182,-80043 }, { 183,-80043 }, { 184,-80043 }, { 185,-80043 }, + { 186,-80043 }, { 187,-80043 }, { 188,-80043 }, { 189,-80043 }, { 190,-80043 }, + + { 191,-80043 }, { 192,-80043 }, { 193,-80043 }, { 194,-80043 }, { 195,-80043 }, + { 196,-80043 }, { 197,-80043 }, { 198,-80043 }, { 199,-80043 }, { 200,-80043 }, + { 201,-80043 }, { 202,-80043 }, { 203,-80043 }, { 204,-80043 }, { 205,-80043 }, + { 206,-80043 }, { 207,-80043 }, { 208,-80043 }, { 209,-80043 }, { 210,-80043 }, + { 211,-80043 }, { 212,-80043 }, { 213,-80043 }, { 214,-80043 }, { 215,-80043 }, + { 216,-80043 }, { 217,-80043 }, { 218,-80043 }, { 219,-80043 }, { 220,-80043 }, + { 221,-80043 }, { 222,-80043 }, { 223,-80043 }, { 224,-80043 }, { 225,-80043 }, + { 226,-80043 }, { 227,-80043 }, { 228,-80043 }, { 229,-80043 }, { 230,-80043 }, + { 231,-80043 }, { 232,-80043 }, { 233,-80043 }, { 234,-80043 }, { 235,-80043 }, + { 236,-80043 }, { 237,-80043 }, { 238,-80043 }, { 239,-80043 }, { 240,-80043 }, + + { 241,-80043 }, { 242,-80043 }, { 243,-80043 }, { 244,-80043 }, { 245,-80043 }, + { 246,-80043 }, { 247,-80043 }, { 248,-80043 }, { 249,-80043 }, { 250,-80043 }, + { 251,-80043 }, { 252,-80043 }, { 253,-80043 }, { 254,-80043 }, { 255,-80043 }, + { 0, 131 }, { 0,11823 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-80300 }, + { 49,-80300 }, { 50,-80300 }, { 51,-80300 }, { 52,-80300 }, { 53,-80300 }, + { 54,-80300 }, { 55,-80300 }, { 56,-80300 }, { 57,-80300 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-80300 }, { 66,-80300 }, { 67,-80300 }, { 68,-80300 }, + { 69,-80300 }, { 70,-80300 }, { 71,-80300 }, { 72,-80300 }, { 73,-80300 }, + { 74,-80300 }, { 75,-80300 }, { 76,-80300 }, { 77,-80300 }, { 78,-80300 }, + { 79,4626 }, { 80,-80300 }, { 81,-80300 }, { 82,-80300 }, { 83,-80300 }, + + { 84,-80300 }, { 85,-80300 }, { 86,-80300 }, { 87,-80300 }, { 88,-80300 }, + { 89,-80300 }, { 90,-80300 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-80300 }, { 0, 0 }, { 97,-80300 }, { 98,-80300 }, + { 99,-80300 }, { 100,-80300 }, { 101,-80300 }, { 102,-80300 }, { 103,-80300 }, + { 104,-80300 }, { 105,-80300 }, { 106,-80300 }, { 107,-80300 }, { 108,-80300 }, + { 109,-80300 }, { 110,-80300 }, { 111,4626 }, { 112,-80300 }, { 113,-80300 }, + { 114,-80300 }, { 115,-80300 }, { 116,-80300 }, { 117,-80300 }, { 118,-80300 }, + { 119,-80300 }, { 120,-80300 }, { 121,-80300 }, { 122,-80300 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-80300 }, { 128,-80300 }, + { 129,-80300 }, { 130,-80300 }, { 131,-80300 }, { 132,-80300 }, { 133,-80300 }, + + { 134,-80300 }, { 135,-80300 }, { 136,-80300 }, { 137,-80300 }, { 138,-80300 }, + { 139,-80300 }, { 140,-80300 }, { 141,-80300 }, { 142,-80300 }, { 143,-80300 }, + { 144,-80300 }, { 145,-80300 }, { 146,-80300 }, { 147,-80300 }, { 148,-80300 }, + { 149,-80300 }, { 150,-80300 }, { 151,-80300 }, { 152,-80300 }, { 153,-80300 }, + { 154,-80300 }, { 155,-80300 }, { 156,-80300 }, { 157,-80300 }, { 158,-80300 }, + { 159,-80300 }, { 160,-80300 }, { 161,-80300 }, { 162,-80300 }, { 163,-80300 }, + { 164,-80300 }, { 165,-80300 }, { 166,-80300 }, { 167,-80300 }, { 168,-80300 }, + { 169,-80300 }, { 170,-80300 }, { 171,-80300 }, { 172,-80300 }, { 173,-80300 }, + { 174,-80300 }, { 175,-80300 }, { 176,-80300 }, { 177,-80300 }, { 178,-80300 }, + { 179,-80300 }, { 180,-80300 }, { 181,-80300 }, { 182,-80300 }, { 183,-80300 }, + + { 184,-80300 }, { 185,-80300 }, { 186,-80300 }, { 187,-80300 }, { 188,-80300 }, + { 189,-80300 }, { 190,-80300 }, { 191,-80300 }, { 192,-80300 }, { 193,-80300 }, + { 194,-80300 }, { 195,-80300 }, { 196,-80300 }, { 197,-80300 }, { 198,-80300 }, + { 199,-80300 }, { 200,-80300 }, { 201,-80300 }, { 202,-80300 }, { 203,-80300 }, + { 204,-80300 }, { 205,-80300 }, { 206,-80300 }, { 207,-80300 }, { 208,-80300 }, + { 209,-80300 }, { 210,-80300 }, { 211,-80300 }, { 212,-80300 }, { 213,-80300 }, + { 214,-80300 }, { 215,-80300 }, { 216,-80300 }, { 217,-80300 }, { 218,-80300 }, + { 219,-80300 }, { 220,-80300 }, { 221,-80300 }, { 222,-80300 }, { 223,-80300 }, + { 224,-80300 }, { 225,-80300 }, { 226,-80300 }, { 227,-80300 }, { 228,-80300 }, + { 229,-80300 }, { 230,-80300 }, { 231,-80300 }, { 232,-80300 }, { 233,-80300 }, + + { 234,-80300 }, { 235,-80300 }, { 236,-80300 }, { 237,-80300 }, { 238,-80300 }, + { 239,-80300 }, { 240,-80300 }, { 241,-80300 }, { 242,-80300 }, { 243,-80300 }, + { 244,-80300 }, { 245,-80300 }, { 246,-80300 }, { 247,-80300 }, { 248,-80300 }, + { 249,-80300 }, { 250,-80300 }, { 251,-80300 }, { 252,-80300 }, { 253,-80300 }, + { 254,-80300 }, { 255,-80300 }, { 0, 81 }, { 0,11566 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-80557 }, { 49,-80557 }, { 50,-80557 }, { 51,-80557 }, + { 52,-80557 }, { 53,-80557 }, { 54,-80557 }, { 55,-80557 }, { 56,-80557 }, + { 57,-80557 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-80557 }, { 66,-80557 }, + { 67,-80557 }, { 68,-80557 }, { 69,-80557 }, { 70,-80557 }, { 71,-80557 }, + { 72,-80557 }, { 73,-80557 }, { 74,-80557 }, { 75,-80557 }, { 76,-80557 }, + + { 77,-80557 }, { 78,-80557 }, { 79,-80557 }, { 80,-80557 }, { 81,-80557 }, + { 82,-80557 }, { 83,-80557 }, { 84,-80557 }, { 85,-80557 }, { 86,-80557 }, + { 87,-80557 }, { 88,-80557 }, { 89,-80557 }, { 90,-80557 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-80557 }, { 0, 0 }, + { 97,-80557 }, { 98,-80557 }, { 99,-80557 }, { 100,-80557 }, { 101,-80557 }, + { 102,-80557 }, { 103,-80557 }, { 104,-80557 }, { 105,-80557 }, { 106,-80557 }, + { 107,-80557 }, { 108,-80557 }, { 109,-80557 }, { 110,-80557 }, { 111,-80557 }, + { 112,-80557 }, { 113,-80557 }, { 114,-80557 }, { 115,-80557 }, { 116,-80557 }, + { 117,-80557 }, { 118,-80557 }, { 119,-80557 }, { 120,-80557 }, { 121,-80557 }, + { 122,-80557 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 127,-80557 }, { 128,-80557 }, { 129,-80557 }, { 130,-80557 }, { 131,-80557 }, + { 132,-80557 }, { 133,-80557 }, { 134,-80557 }, { 135,-80557 }, { 136,-80557 }, + { 137,-80557 }, { 138,-80557 }, { 139,-80557 }, { 140,-80557 }, { 141,-80557 }, + { 142,-80557 }, { 143,-80557 }, { 144,-80557 }, { 145,-80557 }, { 146,-80557 }, + { 147,-80557 }, { 148,-80557 }, { 149,-80557 }, { 150,-80557 }, { 151,-80557 }, + { 152,-80557 }, { 153,-80557 }, { 154,-80557 }, { 155,-80557 }, { 156,-80557 }, + { 157,-80557 }, { 158,-80557 }, { 159,-80557 }, { 160,-80557 }, { 161,-80557 }, + { 162,-80557 }, { 163,-80557 }, { 164,-80557 }, { 165,-80557 }, { 166,-80557 }, + { 167,-80557 }, { 168,-80557 }, { 169,-80557 }, { 170,-80557 }, { 171,-80557 }, + { 172,-80557 }, { 173,-80557 }, { 174,-80557 }, { 175,-80557 }, { 176,-80557 }, + + { 177,-80557 }, { 178,-80557 }, { 179,-80557 }, { 180,-80557 }, { 181,-80557 }, + { 182,-80557 }, { 183,-80557 }, { 184,-80557 }, { 185,-80557 }, { 186,-80557 }, + { 187,-80557 }, { 188,-80557 }, { 189,-80557 }, { 190,-80557 }, { 191,-80557 }, + { 192,-80557 }, { 193,-80557 }, { 194,-80557 }, { 195,-80557 }, { 196,-80557 }, + { 197,-80557 }, { 198,-80557 }, { 199,-80557 }, { 200,-80557 }, { 201,-80557 }, + { 202,-80557 }, { 203,-80557 }, { 204,-80557 }, { 205,-80557 }, { 206,-80557 }, + { 207,-80557 }, { 208,-80557 }, { 209,-80557 }, { 210,-80557 }, { 211,-80557 }, + { 212,-80557 }, { 213,-80557 }, { 214,-80557 }, { 215,-80557 }, { 216,-80557 }, + { 217,-80557 }, { 218,-80557 }, { 219,-80557 }, { 220,-80557 }, { 221,-80557 }, + { 222,-80557 }, { 223,-80557 }, { 224,-80557 }, { 225,-80557 }, { 226,-80557 }, + + { 227,-80557 }, { 228,-80557 }, { 229,-80557 }, { 230,-80557 }, { 231,-80557 }, + { 232,-80557 }, { 233,-80557 }, { 234,-80557 }, { 235,-80557 }, { 236,-80557 }, + { 237,-80557 }, { 238,-80557 }, { 239,-80557 }, { 240,-80557 }, { 241,-80557 }, + { 242,-80557 }, { 243,-80557 }, { 244,-80557 }, { 245,-80557 }, { 246,-80557 }, + { 247,-80557 }, { 248,-80557 }, { 249,-80557 }, { 250,-80557 }, { 251,-80557 }, + { 252,-80557 }, { 253,-80557 }, { 254,-80557 }, { 255,-80557 }, { 0, 131 }, + { 0,11309 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-80814 }, { 49,-80814 }, + { 50,-80814 }, { 51,-80814 }, { 52,-80814 }, { 53,-80814 }, { 54,-80814 }, + { 55,-80814 }, { 56,-80814 }, { 57,-80814 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-80814 }, { 66,-80814 }, { 67,-80814 }, { 68,-80814 }, { 69,-80814 }, + + { 70,-80814 }, { 71,-80814 }, { 72,-80814 }, { 73,-80814 }, { 74,-80814 }, + { 75,-80814 }, { 76,-80814 }, { 77,-80814 }, { 78,-80814 }, { 79,-80814 }, + { 80,-80814 }, { 81,-80814 }, { 82,-80814 }, { 83,-80814 }, { 84,-80814 }, + { 85,-80814 }, { 86,-80814 }, { 87,-80814 }, { 88,-80814 }, { 89,-80814 }, + { 90,-80814 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,4369 }, { 0, 0 }, { 97,-80814 }, { 98,-80814 }, { 99,-80814 }, + { 100,-80814 }, { 101,-80814 }, { 102,-80814 }, { 103,-80814 }, { 104,-80814 }, + { 105,-80814 }, { 106,-80814 }, { 107,-80814 }, { 108,-80814 }, { 109,-80814 }, + { 110,-80814 }, { 111,-80814 }, { 112,-80814 }, { 113,-80814 }, { 114,-80814 }, + { 115,-80814 }, { 116,-80814 }, { 117,-80814 }, { 118,-80814 }, { 119,-80814 }, + + { 120,-80814 }, { 121,-80814 }, { 122,-80814 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-80814 }, { 128,-80814 }, { 129,-80814 }, + { 130,-80814 }, { 131,-80814 }, { 132,-80814 }, { 133,-80814 }, { 134,-80814 }, + { 135,-80814 }, { 136,-80814 }, { 137,-80814 }, { 138,-80814 }, { 139,-80814 }, + { 140,-80814 }, { 141,-80814 }, { 142,-80814 }, { 143,-80814 }, { 144,-80814 }, + { 145,-80814 }, { 146,-80814 }, { 147,-80814 }, { 148,-80814 }, { 149,-80814 }, + { 150,-80814 }, { 151,-80814 }, { 152,-80814 }, { 153,-80814 }, { 154,-80814 }, + { 155,-80814 }, { 156,-80814 }, { 157,-80814 }, { 158,-80814 }, { 159,-80814 }, + { 160,-80814 }, { 161,-80814 }, { 162,-80814 }, { 163,-80814 }, { 164,-80814 }, + { 165,-80814 }, { 166,-80814 }, { 167,-80814 }, { 168,-80814 }, { 169,-80814 }, + + { 170,-80814 }, { 171,-80814 }, { 172,-80814 }, { 173,-80814 }, { 174,-80814 }, + { 175,-80814 }, { 176,-80814 }, { 177,-80814 }, { 178,-80814 }, { 179,-80814 }, + { 180,-80814 }, { 181,-80814 }, { 182,-80814 }, { 183,-80814 }, { 184,-80814 }, + { 185,-80814 }, { 186,-80814 }, { 187,-80814 }, { 188,-80814 }, { 189,-80814 }, + { 190,-80814 }, { 191,-80814 }, { 192,-80814 }, { 193,-80814 }, { 194,-80814 }, + { 195,-80814 }, { 196,-80814 }, { 197,-80814 }, { 198,-80814 }, { 199,-80814 }, + { 200,-80814 }, { 201,-80814 }, { 202,-80814 }, { 203,-80814 }, { 204,-80814 }, + { 205,-80814 }, { 206,-80814 }, { 207,-80814 }, { 208,-80814 }, { 209,-80814 }, + { 210,-80814 }, { 211,-80814 }, { 212,-80814 }, { 213,-80814 }, { 214,-80814 }, + { 215,-80814 }, { 216,-80814 }, { 217,-80814 }, { 218,-80814 }, { 219,-80814 }, + + { 220,-80814 }, { 221,-80814 }, { 222,-80814 }, { 223,-80814 }, { 224,-80814 }, + { 225,-80814 }, { 226,-80814 }, { 227,-80814 }, { 228,-80814 }, { 229,-80814 }, + { 230,-80814 }, { 231,-80814 }, { 232,-80814 }, { 233,-80814 }, { 234,-80814 }, + { 235,-80814 }, { 236,-80814 }, { 237,-80814 }, { 238,-80814 }, { 239,-80814 }, + { 240,-80814 }, { 241,-80814 }, { 242,-80814 }, { 243,-80814 }, { 244,-80814 }, + { 245,-80814 }, { 246,-80814 }, { 247,-80814 }, { 248,-80814 }, { 249,-80814 }, + { 250,-80814 }, { 251,-80814 }, { 252,-80814 }, { 253,-80814 }, { 254,-80814 }, + { 255,-80814 }, { 0, 131 }, { 0,11052 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-81071 }, { 49,-81071 }, { 50,-81071 }, { 51,-81071 }, { 52,-81071 }, + { 53,-81071 }, { 54,-81071 }, { 55,-81071 }, { 56,-81071 }, { 57,-81071 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 65,4369 }, { 66,-81071 }, { 67,-81071 }, + { 68,-81071 }, { 69,-81071 }, { 70,-81071 }, { 71,-81071 }, { 72,-81071 }, + { 73,-81071 }, { 74,-81071 }, { 75,-81071 }, { 76,-81071 }, { 77,-81071 }, + { 78,-81071 }, { 79,-81071 }, { 80,-81071 }, { 81,-81071 }, { 82,-81071 }, + { 83,-81071 }, { 84,-81071 }, { 85,-81071 }, { 86,-81071 }, { 87,-81071 }, + { 88,-81071 }, { 89,-81071 }, { 90,-81071 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-81071 }, { 0, 0 }, { 97,4369 }, + { 98,-81071 }, { 99,-81071 }, { 100,-81071 }, { 101,-81071 }, { 102,-81071 }, + { 103,-81071 }, { 104,-81071 }, { 105,-81071 }, { 106,-81071 }, { 107,-81071 }, + { 108,-81071 }, { 109,-81071 }, { 110,-81071 }, { 111,-81071 }, { 112,-81071 }, + + { 113,-81071 }, { 114,-81071 }, { 115,-81071 }, { 116,-81071 }, { 117,-81071 }, + { 118,-81071 }, { 119,-81071 }, { 120,-81071 }, { 121,-81071 }, { 122,-81071 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-81071 }, + { 128,-81071 }, { 129,-81071 }, { 130,-81071 }, { 131,-81071 }, { 132,-81071 }, + { 133,-81071 }, { 134,-81071 }, { 135,-81071 }, { 136,-81071 }, { 137,-81071 }, + { 138,-81071 }, { 139,-81071 }, { 140,-81071 }, { 141,-81071 }, { 142,-81071 }, + { 143,-81071 }, { 144,-81071 }, { 145,-81071 }, { 146,-81071 }, { 147,-81071 }, + { 148,-81071 }, { 149,-81071 }, { 150,-81071 }, { 151,-81071 }, { 152,-81071 }, + { 153,-81071 }, { 154,-81071 }, { 155,-81071 }, { 156,-81071 }, { 157,-81071 }, + { 158,-81071 }, { 159,-81071 }, { 160,-81071 }, { 161,-81071 }, { 162,-81071 }, + + { 163,-81071 }, { 164,-81071 }, { 165,-81071 }, { 166,-81071 }, { 167,-81071 }, + { 168,-81071 }, { 169,-81071 }, { 170,-81071 }, { 171,-81071 }, { 172,-81071 }, + { 173,-81071 }, { 174,-81071 }, { 175,-81071 }, { 176,-81071 }, { 177,-81071 }, + { 178,-81071 }, { 179,-81071 }, { 180,-81071 }, { 181,-81071 }, { 182,-81071 }, + { 183,-81071 }, { 184,-81071 }, { 185,-81071 }, { 186,-81071 }, { 187,-81071 }, + { 188,-81071 }, { 189,-81071 }, { 190,-81071 }, { 191,-81071 }, { 192,-81071 }, + { 193,-81071 }, { 194,-81071 }, { 195,-81071 }, { 196,-81071 }, { 197,-81071 }, + { 198,-81071 }, { 199,-81071 }, { 200,-81071 }, { 201,-81071 }, { 202,-81071 }, + { 203,-81071 }, { 204,-81071 }, { 205,-81071 }, { 206,-81071 }, { 207,-81071 }, + { 208,-81071 }, { 209,-81071 }, { 210,-81071 }, { 211,-81071 }, { 212,-81071 }, + + { 213,-81071 }, { 214,-81071 }, { 215,-81071 }, { 216,-81071 }, { 217,-81071 }, + { 218,-81071 }, { 219,-81071 }, { 220,-81071 }, { 221,-81071 }, { 222,-81071 }, + { 223,-81071 }, { 224,-81071 }, { 225,-81071 }, { 226,-81071 }, { 227,-81071 }, + { 228,-81071 }, { 229,-81071 }, { 230,-81071 }, { 231,-81071 }, { 232,-81071 }, + { 233,-81071 }, { 234,-81071 }, { 235,-81071 }, { 236,-81071 }, { 237,-81071 }, + { 238,-81071 }, { 239,-81071 }, { 240,-81071 }, { 241,-81071 }, { 242,-81071 }, + { 243,-81071 }, { 244,-81071 }, { 245,-81071 }, { 246,-81071 }, { 247,-81071 }, + { 248,-81071 }, { 249,-81071 }, { 250,-81071 }, { 251,-81071 }, { 252,-81071 }, + { 253,-81071 }, { 254,-81071 }, { 255,-81071 }, { 0, 131 }, { 0,10795 }, + { 0, 0 }, { 0,10793 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 9, 0 }, { 10, 0 }, { 0, 0 }, { 0, 0 }, { 13, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-81328 }, { 49,-81328 }, { 50,-81328 }, + { 51,-81328 }, { 52,-81328 }, { 53,-81328 }, { 54,-81328 }, { 55,-81328 }, + + { 56,-81328 }, { 57,-81328 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 62,-81345 }, { 65,-81328 }, + { 66,-81328 }, { 67,-81328 }, { 68,-81328 }, { 69,-81328 }, { 70,-81328 }, + { 71,-81328 }, { 72,-81328 }, { 73,-81328 }, { 74,-81328 }, { 75,-81328 }, + { 76,-81328 }, { 77,-81328 }, { 78,-81328 }, { 79,-81328 }, { 80,-81328 }, + { 81,-81328 }, { 82,-81328 }, { 83,-81328 }, { 84,-81328 }, { 85,-81328 }, + { 86,-81328 }, { 87,-81328 }, { 88,-81328 }, { 89,-81328 }, { 90,-81328 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,4369 }, + { 0, 0 }, { 97,-81328 }, { 98,-81328 }, { 99,-81328 }, { 100,-81328 }, + { 101,-81328 }, { 102,-81328 }, { 103,-81328 }, { 104,-81328 }, { 105,-81328 }, + + { 106,-81328 }, { 107,-81328 }, { 108,-81328 }, { 109,-81328 }, { 110,-81328 }, + { 111,-81328 }, { 112,-81328 }, { 113,-81328 }, { 114,-81328 }, { 115,-81328 }, + { 116,-81328 }, { 117,-81328 }, { 118,-81328 }, { 119,-81328 }, { 120,-81328 }, + { 121,-81328 }, { 122,-81328 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-81328 }, { 128,-81328 }, { 129,-81328 }, { 130,-81328 }, + { 131,-81328 }, { 132,-81328 }, { 133,-81328 }, { 134,-81328 }, { 135,-81328 }, + { 136,-81328 }, { 137,-81328 }, { 138,-81328 }, { 139,-81328 }, { 140,-81328 }, + { 141,-81328 }, { 142,-81328 }, { 143,-81328 }, { 144,-81328 }, { 145,-81328 }, + { 146,-81328 }, { 147,-81328 }, { 148,-81328 }, { 149,-81328 }, { 150,-81328 }, + { 151,-81328 }, { 152,-81328 }, { 153,-81328 }, { 154,-81328 }, { 155,-81328 }, + + { 156,-81328 }, { 157,-81328 }, { 158,-81328 }, { 159,-81328 }, { 160,-81328 }, + { 161,-81328 }, { 162,-81328 }, { 163,-81328 }, { 164,-81328 }, { 165,-81328 }, + { 166,-81328 }, { 167,-81328 }, { 168,-81328 }, { 169,-81328 }, { 170,-81328 }, + { 171,-81328 }, { 172,-81328 }, { 173,-81328 }, { 174,-81328 }, { 175,-81328 }, + { 176,-81328 }, { 177,-81328 }, { 178,-81328 }, { 179,-81328 }, { 180,-81328 }, + { 181,-81328 }, { 182,-81328 }, { 183,-81328 }, { 184,-81328 }, { 185,-81328 }, + { 186,-81328 }, { 187,-81328 }, { 188,-81328 }, { 189,-81328 }, { 190,-81328 }, + { 191,-81328 }, { 192,-81328 }, { 193,-81328 }, { 194,-81328 }, { 195,-81328 }, + { 196,-81328 }, { 197,-81328 }, { 198,-81328 }, { 199,-81328 }, { 200,-81328 }, + { 201,-81328 }, { 202,-81328 }, { 203,-81328 }, { 204,-81328 }, { 205,-81328 }, + + { 206,-81328 }, { 207,-81328 }, { 208,-81328 }, { 209,-81328 }, { 210,-81328 }, + { 211,-81328 }, { 212,-81328 }, { 213,-81328 }, { 214,-81328 }, { 215,-81328 }, + { 216,-81328 }, { 217,-81328 }, { 218,-81328 }, { 219,-81328 }, { 220,-81328 }, + { 221,-81328 }, { 222,-81328 }, { 223,-81328 }, { 224,-81328 }, { 225,-81328 }, + { 226,-81328 }, { 227,-81328 }, { 228,-81328 }, { 229,-81328 }, { 230,-81328 }, + { 231,-81328 }, { 232,-81328 }, { 233,-81328 }, { 234,-81328 }, { 235,-81328 }, + { 236,-81328 }, { 237,-81328 }, { 238,-81328 }, { 239,-81328 }, { 240,-81328 }, + { 241,-81328 }, { 242,-81328 }, { 243,-81328 }, { 244,-81328 }, { 245,-81328 }, + { 246,-81328 }, { 247,-81328 }, { 248,-81328 }, { 249,-81328 }, { 250,-81328 }, + { 251,-81328 }, { 252,-81328 }, { 253,-81328 }, { 254,-81328 }, { 255,-81328 }, + + { 0, 131 }, { 0,10538 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-81585 }, + + { 49,-81585 }, { 50,-81585 }, { 51,-81585 }, { 52,-81585 }, { 53,-81585 }, + { 54,-81585 }, { 55,-81585 }, { 56,-81585 }, { 57,-81585 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-81585 }, { 66,-81585 }, { 67,-81585 }, { 68,-81585 }, + { 69,4369 }, { 70,-81585 }, { 71,-81585 }, { 72,-81585 }, { 73,-81585 }, + { 74,-81585 }, { 75,-81585 }, { 76,-81585 }, { 77,-81585 }, { 78,-81585 }, + { 79,-81585 }, { 80,-81585 }, { 81,-81585 }, { 82,-81585 }, { 83,-81585 }, + { 84,-81585 }, { 85,-81585 }, { 86,-81585 }, { 87,-81585 }, { 88,-81585 }, + { 89,-81585 }, { 90,-81585 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-81585 }, { 0, 0 }, { 97,-81585 }, { 98,-81585 }, + + { 99,-81585 }, { 100,-81585 }, { 101,4369 }, { 102,-81585 }, { 103,-81585 }, + { 104,-81585 }, { 105,-81585 }, { 106,-81585 }, { 107,-81585 }, { 108,-81585 }, + { 109,-81585 }, { 110,-81585 }, { 111,-81585 }, { 112,-81585 }, { 113,-81585 }, + { 114,-81585 }, { 115,-81585 }, { 116,-81585 }, { 117,-81585 }, { 118,-81585 }, + { 119,-81585 }, { 120,-81585 }, { 121,-81585 }, { 122,-81585 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-81585 }, { 128,-81585 }, + { 129,-81585 }, { 130,-81585 }, { 131,-81585 }, { 132,-81585 }, { 133,-81585 }, + { 134,-81585 }, { 135,-81585 }, { 136,-81585 }, { 137,-81585 }, { 138,-81585 }, + { 139,-81585 }, { 140,-81585 }, { 141,-81585 }, { 142,-81585 }, { 143,-81585 }, + { 144,-81585 }, { 145,-81585 }, { 146,-81585 }, { 147,-81585 }, { 148,-81585 }, + + { 149,-81585 }, { 150,-81585 }, { 151,-81585 }, { 152,-81585 }, { 153,-81585 }, + { 154,-81585 }, { 155,-81585 }, { 156,-81585 }, { 157,-81585 }, { 158,-81585 }, + { 159,-81585 }, { 160,-81585 }, { 161,-81585 }, { 162,-81585 }, { 163,-81585 }, + { 164,-81585 }, { 165,-81585 }, { 166,-81585 }, { 167,-81585 }, { 168,-81585 }, + { 169,-81585 }, { 170,-81585 }, { 171,-81585 }, { 172,-81585 }, { 173,-81585 }, + { 174,-81585 }, { 175,-81585 }, { 176,-81585 }, { 177,-81585 }, { 178,-81585 }, + { 179,-81585 }, { 180,-81585 }, { 181,-81585 }, { 182,-81585 }, { 183,-81585 }, + { 184,-81585 }, { 185,-81585 }, { 186,-81585 }, { 187,-81585 }, { 188,-81585 }, + { 189,-81585 }, { 190,-81585 }, { 191,-81585 }, { 192,-81585 }, { 193,-81585 }, + { 194,-81585 }, { 195,-81585 }, { 196,-81585 }, { 197,-81585 }, { 198,-81585 }, + + { 199,-81585 }, { 200,-81585 }, { 201,-81585 }, { 202,-81585 }, { 203,-81585 }, + { 204,-81585 }, { 205,-81585 }, { 206,-81585 }, { 207,-81585 }, { 208,-81585 }, + { 209,-81585 }, { 210,-81585 }, { 211,-81585 }, { 212,-81585 }, { 213,-81585 }, + { 214,-81585 }, { 215,-81585 }, { 216,-81585 }, { 217,-81585 }, { 218,-81585 }, + { 219,-81585 }, { 220,-81585 }, { 221,-81585 }, { 222,-81585 }, { 223,-81585 }, + { 224,-81585 }, { 225,-81585 }, { 226,-81585 }, { 227,-81585 }, { 228,-81585 }, + { 229,-81585 }, { 230,-81585 }, { 231,-81585 }, { 232,-81585 }, { 233,-81585 }, + { 234,-81585 }, { 235,-81585 }, { 236,-81585 }, { 237,-81585 }, { 238,-81585 }, + { 239,-81585 }, { 240,-81585 }, { 241,-81585 }, { 242,-81585 }, { 243,-81585 }, + { 244,-81585 }, { 245,-81585 }, { 246,-81585 }, { 247,-81585 }, { 248,-81585 }, + + { 249,-81585 }, { 250,-81585 }, { 251,-81585 }, { 252,-81585 }, { 253,-81585 }, + { 254,-81585 }, { 255,-81585 }, { 0, 131 }, { 0,10281 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-81842 }, { 49,-81842 }, { 50,-81842 }, { 51,-81842 }, + { 52,-81842 }, { 53,-81842 }, { 54,-81842 }, { 55,-81842 }, { 56,-81842 }, + { 57,-81842 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-81842 }, { 66,-81842 }, + { 67,-81842 }, { 68,-81842 }, { 69,-81842 }, { 70,-81842 }, { 71,-81842 }, + { 72,4369 }, { 73,-81842 }, { 74,-81842 }, { 75,-81842 }, { 76,-81842 }, + { 77,-81842 }, { 78,-81842 }, { 79,-81842 }, { 80,-81842 }, { 81,-81842 }, + { 82,-81842 }, { 83,-81842 }, { 84,-81842 }, { 85,-81842 }, { 86,-81842 }, + { 87,-81842 }, { 88,-81842 }, { 89,-81842 }, { 90,-81842 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-81842 }, { 0, 0 }, + { 97,-81842 }, { 98,-81842 }, { 99,-81842 }, { 100,-81842 }, { 101,-81842 }, + { 102,-81842 }, { 103,-81842 }, { 104,4369 }, { 105,-81842 }, { 106,-81842 }, + { 107,-81842 }, { 108,-81842 }, { 109,-81842 }, { 110,-81842 }, { 111,-81842 }, + { 112,-81842 }, { 113,-81842 }, { 114,-81842 }, { 115,-81842 }, { 116,-81842 }, + { 117,-81842 }, { 118,-81842 }, { 119,-81842 }, { 120,-81842 }, { 121,-81842 }, + { 122,-81842 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-81842 }, { 128,-81842 }, { 129,-81842 }, { 130,-81842 }, { 131,-81842 }, + { 132,-81842 }, { 133,-81842 }, { 134,-81842 }, { 135,-81842 }, { 136,-81842 }, + { 137,-81842 }, { 138,-81842 }, { 139,-81842 }, { 140,-81842 }, { 141,-81842 }, + + { 142,-81842 }, { 143,-81842 }, { 144,-81842 }, { 145,-81842 }, { 146,-81842 }, + { 147,-81842 }, { 148,-81842 }, { 149,-81842 }, { 150,-81842 }, { 151,-81842 }, + { 152,-81842 }, { 153,-81842 }, { 154,-81842 }, { 155,-81842 }, { 156,-81842 }, + { 157,-81842 }, { 158,-81842 }, { 159,-81842 }, { 160,-81842 }, { 161,-81842 }, + { 162,-81842 }, { 163,-81842 }, { 164,-81842 }, { 165,-81842 }, { 166,-81842 }, + { 167,-81842 }, { 168,-81842 }, { 169,-81842 }, { 170,-81842 }, { 171,-81842 }, + { 172,-81842 }, { 173,-81842 }, { 174,-81842 }, { 175,-81842 }, { 176,-81842 }, + { 177,-81842 }, { 178,-81842 }, { 179,-81842 }, { 180,-81842 }, { 181,-81842 }, + { 182,-81842 }, { 183,-81842 }, { 184,-81842 }, { 185,-81842 }, { 186,-81842 }, + { 187,-81842 }, { 188,-81842 }, { 189,-81842 }, { 190,-81842 }, { 191,-81842 }, + + { 192,-81842 }, { 193,-81842 }, { 194,-81842 }, { 195,-81842 }, { 196,-81842 }, + { 197,-81842 }, { 198,-81842 }, { 199,-81842 }, { 200,-81842 }, { 201,-81842 }, + { 202,-81842 }, { 203,-81842 }, { 204,-81842 }, { 205,-81842 }, { 206,-81842 }, + { 207,-81842 }, { 208,-81842 }, { 209,-81842 }, { 210,-81842 }, { 211,-81842 }, + { 212,-81842 }, { 213,-81842 }, { 214,-81842 }, { 215,-81842 }, { 216,-81842 }, + { 217,-81842 }, { 218,-81842 }, { 219,-81842 }, { 220,-81842 }, { 221,-81842 }, + { 222,-81842 }, { 223,-81842 }, { 224,-81842 }, { 225,-81842 }, { 226,-81842 }, + { 227,-81842 }, { 228,-81842 }, { 229,-81842 }, { 230,-81842 }, { 231,-81842 }, + { 232,-81842 }, { 233,-81842 }, { 234,-81842 }, { 235,-81842 }, { 236,-81842 }, + { 237,-81842 }, { 238,-81842 }, { 239,-81842 }, { 240,-81842 }, { 241,-81842 }, + + { 242,-81842 }, { 243,-81842 }, { 244,-81842 }, { 245,-81842 }, { 246,-81842 }, + { 247,-81842 }, { 248,-81842 }, { 249,-81842 }, { 250,-81842 }, { 251,-81842 }, + { 252,-81842 }, { 253,-81842 }, { 254,-81842 }, { 255,-81842 }, { 0, 47 }, + { 0,10024 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-82099 }, { 49,-82099 }, + { 50,-82099 }, { 51,-82099 }, { 52,-82099 }, { 53,-82099 }, { 54,-82099 }, + { 55,-82099 }, { 56,-82099 }, { 57,-82099 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-82099 }, { 66,-82099 }, { 67,-82099 }, { 68,-82099 }, { 69,-82099 }, + { 70,-82099 }, { 71,-82099 }, { 72,-82099 }, { 73,-82099 }, { 74,-82099 }, + { 75,-82099 }, { 76,-82099 }, { 77,-82099 }, { 78,-82099 }, { 79,-82099 }, + { 80,-82099 }, { 81,-82099 }, { 82,-82099 }, { 83,-82099 }, { 84,-82099 }, + + { 85,-82099 }, { 86,-82099 }, { 87,-82099 }, { 88,-82099 }, { 89,-82099 }, + { 90,-82099 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-82099 }, { 0, 0 }, { 97,-82099 }, { 98,-82099 }, { 99,-82099 }, + { 100,-82099 }, { 101,-82099 }, { 102,-82099 }, { 103,-82099 }, { 104,-82099 }, + { 105,-82099 }, { 106,-82099 }, { 107,-82099 }, { 108,-82099 }, { 109,-82099 }, + { 110,-82099 }, { 111,-82099 }, { 112,-82099 }, { 113,-82099 }, { 114,-82099 }, + { 115,-82099 }, { 116,-82099 }, { 117,-82099 }, { 118,-82099 }, { 119,-82099 }, + { 120,-82099 }, { 121,-82099 }, { 122,-82099 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-82099 }, { 128,-82099 }, { 129,-82099 }, + { 130,-82099 }, { 131,-82099 }, { 132,-82099 }, { 133,-82099 }, { 134,-82099 }, + + { 135,-82099 }, { 136,-82099 }, { 137,-82099 }, { 138,-82099 }, { 139,-82099 }, + { 140,-82099 }, { 141,-82099 }, { 142,-82099 }, { 143,-82099 }, { 144,-82099 }, + { 145,-82099 }, { 146,-82099 }, { 147,-82099 }, { 148,-82099 }, { 149,-82099 }, + { 150,-82099 }, { 151,-82099 }, { 152,-82099 }, { 153,-82099 }, { 154,-82099 }, + { 155,-82099 }, { 156,-82099 }, { 157,-82099 }, { 158,-82099 }, { 159,-82099 }, + { 160,-82099 }, { 161,-82099 }, { 162,-82099 }, { 163,-82099 }, { 164,-82099 }, + { 165,-82099 }, { 166,-82099 }, { 167,-82099 }, { 168,-82099 }, { 169,-82099 }, + { 170,-82099 }, { 171,-82099 }, { 172,-82099 }, { 173,-82099 }, { 174,-82099 }, + { 175,-82099 }, { 176,-82099 }, { 177,-82099 }, { 178,-82099 }, { 179,-82099 }, + { 180,-82099 }, { 181,-82099 }, { 182,-82099 }, { 183,-82099 }, { 184,-82099 }, + + { 185,-82099 }, { 186,-82099 }, { 187,-82099 }, { 188,-82099 }, { 189,-82099 }, + { 190,-82099 }, { 191,-82099 }, { 192,-82099 }, { 193,-82099 }, { 194,-82099 }, + { 195,-82099 }, { 196,-82099 }, { 197,-82099 }, { 198,-82099 }, { 199,-82099 }, + { 200,-82099 }, { 201,-82099 }, { 202,-82099 }, { 203,-82099 }, { 204,-82099 }, + { 205,-82099 }, { 206,-82099 }, { 207,-82099 }, { 208,-82099 }, { 209,-82099 }, + { 210,-82099 }, { 211,-82099 }, { 212,-82099 }, { 213,-82099 }, { 214,-82099 }, + { 215,-82099 }, { 216,-82099 }, { 217,-82099 }, { 218,-82099 }, { 219,-82099 }, + { 220,-82099 }, { 221,-82099 }, { 222,-82099 }, { 223,-82099 }, { 224,-82099 }, + { 225,-82099 }, { 226,-82099 }, { 227,-82099 }, { 228,-82099 }, { 229,-82099 }, + { 230,-82099 }, { 231,-82099 }, { 232,-82099 }, { 233,-82099 }, { 234,-82099 }, + + { 235,-82099 }, { 236,-82099 }, { 237,-82099 }, { 238,-82099 }, { 239,-82099 }, + { 240,-82099 }, { 241,-82099 }, { 242,-82099 }, { 243,-82099 }, { 244,-82099 }, + { 245,-82099 }, { 246,-82099 }, { 247,-82099 }, { 248,-82099 }, { 249,-82099 }, + { 250,-82099 }, { 251,-82099 }, { 252,-82099 }, { 253,-82099 }, { 254,-82099 }, + { 255,-82099 }, { 0, 131 }, { 0,9767 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-82356 }, { 49,-82356 }, { 50,-82356 }, { 51,-82356 }, { 52,-82356 }, + { 53,-82356 }, { 54,-82356 }, { 55,-82356 }, { 56,-82356 }, { 57,-82356 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-82356 }, { 66,-82356 }, { 67,-82356 }, + { 68,-82356 }, { 69,-82356 }, { 70,-82356 }, { 71,-82356 }, { 72,-82356 }, + { 73,-82356 }, { 74,-82356 }, { 75,-82356 }, { 76,-82356 }, { 77,-82356 }, + + { 78,-82356 }, { 79,-82356 }, { 80,-82356 }, { 81,-82356 }, { 82,-82356 }, + { 83,4112 }, { 84,-82356 }, { 85,-82356 }, { 86,-82356 }, { 87,-82356 }, + { 88,-82356 }, { 89,-82356 }, { 90,-82356 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-82356 }, { 0, 0 }, { 97,-82356 }, + { 98,-82356 }, { 99,-82356 }, { 100,-82356 }, { 101,-82356 }, { 102,-82356 }, + { 103,-82356 }, { 104,-82356 }, { 105,-82356 }, { 106,-82356 }, { 107,-82356 }, + { 108,-82356 }, { 109,-82356 }, { 110,-82356 }, { 111,-82356 }, { 112,-82356 }, + { 113,-82356 }, { 114,-82356 }, { 115,4112 }, { 116,-82356 }, { 117,-82356 }, + { 118,-82356 }, { 119,-82356 }, { 120,-82356 }, { 121,-82356 }, { 122,-82356 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-82356 }, + + { 128,-82356 }, { 129,-82356 }, { 130,-82356 }, { 131,-82356 }, { 132,-82356 }, + { 133,-82356 }, { 134,-82356 }, { 135,-82356 }, { 136,-82356 }, { 137,-82356 }, + { 138,-82356 }, { 139,-82356 }, { 140,-82356 }, { 141,-82356 }, { 142,-82356 }, + { 143,-82356 }, { 144,-82356 }, { 145,-82356 }, { 146,-82356 }, { 147,-82356 }, + { 148,-82356 }, { 149,-82356 }, { 150,-82356 }, { 151,-82356 }, { 152,-82356 }, + { 153,-82356 }, { 154,-82356 }, { 155,-82356 }, { 156,-82356 }, { 157,-82356 }, + { 158,-82356 }, { 159,-82356 }, { 160,-82356 }, { 161,-82356 }, { 162,-82356 }, + { 163,-82356 }, { 164,-82356 }, { 165,-82356 }, { 166,-82356 }, { 167,-82356 }, + { 168,-82356 }, { 169,-82356 }, { 170,-82356 }, { 171,-82356 }, { 172,-82356 }, + { 173,-82356 }, { 174,-82356 }, { 175,-82356 }, { 176,-82356 }, { 177,-82356 }, + + { 178,-82356 }, { 179,-82356 }, { 180,-82356 }, { 181,-82356 }, { 182,-82356 }, + { 183,-82356 }, { 184,-82356 }, { 185,-82356 }, { 186,-82356 }, { 187,-82356 }, + { 188,-82356 }, { 189,-82356 }, { 190,-82356 }, { 191,-82356 }, { 192,-82356 }, + { 193,-82356 }, { 194,-82356 }, { 195,-82356 }, { 196,-82356 }, { 197,-82356 }, + { 198,-82356 }, { 199,-82356 }, { 200,-82356 }, { 201,-82356 }, { 202,-82356 }, + { 203,-82356 }, { 204,-82356 }, { 205,-82356 }, { 206,-82356 }, { 207,-82356 }, + { 208,-82356 }, { 209,-82356 }, { 210,-82356 }, { 211,-82356 }, { 212,-82356 }, + { 213,-82356 }, { 214,-82356 }, { 215,-82356 }, { 216,-82356 }, { 217,-82356 }, + { 218,-82356 }, { 219,-82356 }, { 220,-82356 }, { 221,-82356 }, { 222,-82356 }, + { 223,-82356 }, { 224,-82356 }, { 225,-82356 }, { 226,-82356 }, { 227,-82356 }, + + { 228,-82356 }, { 229,-82356 }, { 230,-82356 }, { 231,-82356 }, { 232,-82356 }, + { 233,-82356 }, { 234,-82356 }, { 235,-82356 }, { 236,-82356 }, { 237,-82356 }, + { 238,-82356 }, { 239,-82356 }, { 240,-82356 }, { 241,-82356 }, { 242,-82356 }, + { 243,-82356 }, { 244,-82356 }, { 245,-82356 }, { 246,-82356 }, { 247,-82356 }, + { 248,-82356 }, { 249,-82356 }, { 250,-82356 }, { 251,-82356 }, { 252,-82356 }, + { 253,-82356 }, { 254,-82356 }, { 255,-82356 }, { 0, 131 }, { 0,9510 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-82613 }, { 49,-82613 }, { 50,-82613 }, + { 51,-82613 }, { 52,-82613 }, { 53,-82613 }, { 54,-82613 }, { 55,-82613 }, + { 56,-82613 }, { 57,-82613 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-82613 }, + { 66,-82613 }, { 67,-82613 }, { 68,-82613 }, { 69,-82613 }, { 70,-82613 }, + + { 71,-82613 }, { 72,-82613 }, { 73,-82613 }, { 74,-82613 }, { 75,-82613 }, + { 76,-82613 }, { 77,-82613 }, { 78,4112 }, { 79,-82613 }, { 80,-82613 }, + { 81,-82613 }, { 82,-82613 }, { 83,-82613 }, { 84,-82613 }, { 85,-82613 }, + { 86,-82613 }, { 87,-82613 }, { 88,-82613 }, { 89,-82613 }, { 90,-82613 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-82613 }, + { 0, 0 }, { 97,-82613 }, { 98,-82613 }, { 99,-82613 }, { 100,-82613 }, + { 101,-82613 }, { 102,-82613 }, { 103,-82613 }, { 104,-82613 }, { 105,-82613 }, + { 106,-82613 }, { 107,-82613 }, { 108,-82613 }, { 109,-82613 }, { 110,4112 }, + { 111,-82613 }, { 112,-82613 }, { 113,-82613 }, { 114,-82613 }, { 115,-82613 }, + { 116,-82613 }, { 117,-82613 }, { 118,-82613 }, { 119,-82613 }, { 120,-82613 }, + + { 121,-82613 }, { 122,-82613 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-82613 }, { 128,-82613 }, { 129,-82613 }, { 130,-82613 }, + { 131,-82613 }, { 132,-82613 }, { 133,-82613 }, { 134,-82613 }, { 135,-82613 }, + { 136,-82613 }, { 137,-82613 }, { 138,-82613 }, { 139,-82613 }, { 140,-82613 }, + { 141,-82613 }, { 142,-82613 }, { 143,-82613 }, { 144,-82613 }, { 145,-82613 }, + { 146,-82613 }, { 147,-82613 }, { 148,-82613 }, { 149,-82613 }, { 150,-82613 }, + { 151,-82613 }, { 152,-82613 }, { 153,-82613 }, { 154,-82613 }, { 155,-82613 }, + { 156,-82613 }, { 157,-82613 }, { 158,-82613 }, { 159,-82613 }, { 160,-82613 }, + { 161,-82613 }, { 162,-82613 }, { 163,-82613 }, { 164,-82613 }, { 165,-82613 }, + { 166,-82613 }, { 167,-82613 }, { 168,-82613 }, { 169,-82613 }, { 170,-82613 }, + + { 171,-82613 }, { 172,-82613 }, { 173,-82613 }, { 174,-82613 }, { 175,-82613 }, + { 176,-82613 }, { 177,-82613 }, { 178,-82613 }, { 179,-82613 }, { 180,-82613 }, + { 181,-82613 }, { 182,-82613 }, { 183,-82613 }, { 184,-82613 }, { 185,-82613 }, + { 186,-82613 }, { 187,-82613 }, { 188,-82613 }, { 189,-82613 }, { 190,-82613 }, + { 191,-82613 }, { 192,-82613 }, { 193,-82613 }, { 194,-82613 }, { 195,-82613 }, + { 196,-82613 }, { 197,-82613 }, { 198,-82613 }, { 199,-82613 }, { 200,-82613 }, + { 201,-82613 }, { 202,-82613 }, { 203,-82613 }, { 204,-82613 }, { 205,-82613 }, + { 206,-82613 }, { 207,-82613 }, { 208,-82613 }, { 209,-82613 }, { 210,-82613 }, + { 211,-82613 }, { 212,-82613 }, { 213,-82613 }, { 214,-82613 }, { 215,-82613 }, + { 216,-82613 }, { 217,-82613 }, { 218,-82613 }, { 219,-82613 }, { 220,-82613 }, + + { 221,-82613 }, { 222,-82613 }, { 223,-82613 }, { 224,-82613 }, { 225,-82613 }, + { 226,-82613 }, { 227,-82613 }, { 228,-82613 }, { 229,-82613 }, { 230,-82613 }, + { 231,-82613 }, { 232,-82613 }, { 233,-82613 }, { 234,-82613 }, { 235,-82613 }, + { 236,-82613 }, { 237,-82613 }, { 238,-82613 }, { 239,-82613 }, { 240,-82613 }, + { 241,-82613 }, { 242,-82613 }, { 243,-82613 }, { 244,-82613 }, { 245,-82613 }, + { 246,-82613 }, { 247,-82613 }, { 248,-82613 }, { 249,-82613 }, { 250,-82613 }, + { 251,-82613 }, { 252,-82613 }, { 253,-82613 }, { 254,-82613 }, { 255,-82613 }, + { 0, 131 }, { 0,9253 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-82870 }, + { 49,-82870 }, { 50,-82870 }, { 51,-82870 }, { 52,-82870 }, { 53,-82870 }, + { 54,-82870 }, { 55,-82870 }, { 56,-82870 }, { 57,-82870 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 65,-82870 }, { 66,-82870 }, { 67,-82870 }, { 68,-82870 }, + { 69,-82870 }, { 70,4112 }, { 71,-82870 }, { 72,-82870 }, { 73,-82870 }, + { 74,-82870 }, { 75,-82870 }, { 76,-82870 }, { 77,-82870 }, { 78,-82870 }, + { 79,-82870 }, { 80,-82870 }, { 81,-82870 }, { 82,-82870 }, { 83,-82870 }, + { 84,-82870 }, { 85,-82870 }, { 86,-82870 }, { 87,-82870 }, { 88,-82870 }, + { 89,-82870 }, { 90,-82870 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-82870 }, { 0, 0 }, { 97,-82870 }, { 98,-82870 }, + { 99,-82870 }, { 100,-82870 }, { 101,-82870 }, { 102,4112 }, { 103,-82870 }, + { 104,-82870 }, { 105,-82870 }, { 106,-82870 }, { 107,-82870 }, { 108,-82870 }, + { 109,-82870 }, { 110,-82870 }, { 111,-82870 }, { 112,-82870 }, { 113,-82870 }, + + { 114,-82870 }, { 115,-82870 }, { 116,-82870 }, { 117,-82870 }, { 118,-82870 }, + { 119,-82870 }, { 120,-82870 }, { 121,-82870 }, { 122,-82870 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-82870 }, { 128,-82870 }, + { 129,-82870 }, { 130,-82870 }, { 131,-82870 }, { 132,-82870 }, { 133,-82870 }, + { 134,-82870 }, { 135,-82870 }, { 136,-82870 }, { 137,-82870 }, { 138,-82870 }, + { 139,-82870 }, { 140,-82870 }, { 141,-82870 }, { 142,-82870 }, { 143,-82870 }, + { 144,-82870 }, { 145,-82870 }, { 146,-82870 }, { 147,-82870 }, { 148,-82870 }, + { 149,-82870 }, { 150,-82870 }, { 151,-82870 }, { 152,-82870 }, { 153,-82870 }, + { 154,-82870 }, { 155,-82870 }, { 156,-82870 }, { 157,-82870 }, { 158,-82870 }, + { 159,-82870 }, { 160,-82870 }, { 161,-82870 }, { 162,-82870 }, { 163,-82870 }, + + { 164,-82870 }, { 165,-82870 }, { 166,-82870 }, { 167,-82870 }, { 168,-82870 }, + { 169,-82870 }, { 170,-82870 }, { 171,-82870 }, { 172,-82870 }, { 173,-82870 }, + { 174,-82870 }, { 175,-82870 }, { 176,-82870 }, { 177,-82870 }, { 178,-82870 }, + { 179,-82870 }, { 180,-82870 }, { 181,-82870 }, { 182,-82870 }, { 183,-82870 }, + { 184,-82870 }, { 185,-82870 }, { 186,-82870 }, { 187,-82870 }, { 188,-82870 }, + { 189,-82870 }, { 190,-82870 }, { 191,-82870 }, { 192,-82870 }, { 193,-82870 }, + { 194,-82870 }, { 195,-82870 }, { 196,-82870 }, { 197,-82870 }, { 198,-82870 }, + { 199,-82870 }, { 200,-82870 }, { 201,-82870 }, { 202,-82870 }, { 203,-82870 }, + { 204,-82870 }, { 205,-82870 }, { 206,-82870 }, { 207,-82870 }, { 208,-82870 }, + { 209,-82870 }, { 210,-82870 }, { 211,-82870 }, { 212,-82870 }, { 213,-82870 }, + + { 214,-82870 }, { 215,-82870 }, { 216,-82870 }, { 217,-82870 }, { 218,-82870 }, + { 219,-82870 }, { 220,-82870 }, { 221,-82870 }, { 222,-82870 }, { 223,-82870 }, + { 224,-82870 }, { 225,-82870 }, { 226,-82870 }, { 227,-82870 }, { 228,-82870 }, + { 229,-82870 }, { 230,-82870 }, { 231,-82870 }, { 232,-82870 }, { 233,-82870 }, + { 234,-82870 }, { 235,-82870 }, { 236,-82870 }, { 237,-82870 }, { 238,-82870 }, + { 239,-82870 }, { 240,-82870 }, { 241,-82870 }, { 242,-82870 }, { 243,-82870 }, + { 244,-82870 }, { 245,-82870 }, { 246,-82870 }, { 247,-82870 }, { 248,-82870 }, + { 249,-82870 }, { 250,-82870 }, { 251,-82870 }, { 252,-82870 }, { 253,-82870 }, + { 254,-82870 }, { 255,-82870 }, { 0, 86 }, { 0,8996 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-83127 }, { 49,-83127 }, { 50,-83127 }, { 51,-83127 }, + { 52,-83127 }, { 53,-83127 }, { 54,-83127 }, { 55,-83127 }, { 56,-83127 }, + + { 57,-83127 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-83127 }, { 66,-83127 }, + { 67,-83127 }, { 68,-83127 }, { 69,-83127 }, { 70,-83127 }, { 71,-83127 }, + { 72,-83127 }, { 73,-83127 }, { 74,-83127 }, { 75,-83127 }, { 76,-83127 }, + { 77,-83127 }, { 78,-83127 }, { 79,-83127 }, { 80,-83127 }, { 81,-83127 }, + { 82,-83127 }, { 83,-83127 }, { 84,-83127 }, { 85,-83127 }, { 86,-83127 }, + { 87,-83127 }, { 88,-83127 }, { 89,-83127 }, { 90,-83127 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-83127 }, { 0, 0 }, + { 97,-83127 }, { 98,-83127 }, { 99,-83127 }, { 100,-83127 }, { 101,-83127 }, + { 102,-83127 }, { 103,-83127 }, { 104,-83127 }, { 105,-83127 }, { 106,-83127 }, + + { 107,-83127 }, { 108,-83127 }, { 109,-83127 }, { 110,-83127 }, { 111,-83127 }, + { 112,-83127 }, { 113,-83127 }, { 114,-83127 }, { 115,-83127 }, { 116,-83127 }, + { 117,-83127 }, { 118,-83127 }, { 119,-83127 }, { 120,-83127 }, { 121,-83127 }, + { 122,-83127 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-83127 }, { 128,-83127 }, { 129,-83127 }, { 130,-83127 }, { 131,-83127 }, + { 132,-83127 }, { 133,-83127 }, { 134,-83127 }, { 135,-83127 }, { 136,-83127 }, + { 137,-83127 }, { 138,-83127 }, { 139,-83127 }, { 140,-83127 }, { 141,-83127 }, + { 142,-83127 }, { 143,-83127 }, { 144,-83127 }, { 145,-83127 }, { 146,-83127 }, + { 147,-83127 }, { 148,-83127 }, { 149,-83127 }, { 150,-83127 }, { 151,-83127 }, + { 152,-83127 }, { 153,-83127 }, { 154,-83127 }, { 155,-83127 }, { 156,-83127 }, + + { 157,-83127 }, { 158,-83127 }, { 159,-83127 }, { 160,-83127 }, { 161,-83127 }, + { 162,-83127 }, { 163,-83127 }, { 164,-83127 }, { 165,-83127 }, { 166,-83127 }, + { 167,-83127 }, { 168,-83127 }, { 169,-83127 }, { 170,-83127 }, { 171,-83127 }, + { 172,-83127 }, { 173,-83127 }, { 174,-83127 }, { 175,-83127 }, { 176,-83127 }, + { 177,-83127 }, { 178,-83127 }, { 179,-83127 }, { 180,-83127 }, { 181,-83127 }, + { 182,-83127 }, { 183,-83127 }, { 184,-83127 }, { 185,-83127 }, { 186,-83127 }, + { 187,-83127 }, { 188,-83127 }, { 189,-83127 }, { 190,-83127 }, { 191,-83127 }, + { 192,-83127 }, { 193,-83127 }, { 194,-83127 }, { 195,-83127 }, { 196,-83127 }, + { 197,-83127 }, { 198,-83127 }, { 199,-83127 }, { 200,-83127 }, { 201,-83127 }, + { 202,-83127 }, { 203,-83127 }, { 204,-83127 }, { 205,-83127 }, { 206,-83127 }, + + { 207,-83127 }, { 208,-83127 }, { 209,-83127 }, { 210,-83127 }, { 211,-83127 }, + { 212,-83127 }, { 213,-83127 }, { 214,-83127 }, { 215,-83127 }, { 216,-83127 }, + { 217,-83127 }, { 218,-83127 }, { 219,-83127 }, { 220,-83127 }, { 221,-83127 }, + { 222,-83127 }, { 223,-83127 }, { 224,-83127 }, { 225,-83127 }, { 226,-83127 }, + { 227,-83127 }, { 228,-83127 }, { 229,-83127 }, { 230,-83127 }, { 231,-83127 }, + { 232,-83127 }, { 233,-83127 }, { 234,-83127 }, { 235,-83127 }, { 236,-83127 }, + { 237,-83127 }, { 238,-83127 }, { 239,-83127 }, { 240,-83127 }, { 241,-83127 }, + { 242,-83127 }, { 243,-83127 }, { 244,-83127 }, { 245,-83127 }, { 246,-83127 }, + { 247,-83127 }, { 248,-83127 }, { 249,-83127 }, { 250,-83127 }, { 251,-83127 }, + { 252,-83127 }, { 253,-83127 }, { 254,-83127 }, { 255,-83127 }, { 0, 73 }, + + { 0,8739 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-83384 }, { 49,-83384 }, + + { 50,-83384 }, { 51,-83384 }, { 52,-83384 }, { 53,-83384 }, { 54,-83384 }, + { 55,-83384 }, { 56,-83384 }, { 57,-83384 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-83384 }, { 66,-83384 }, { 67,-83384 }, { 68,-83384 }, { 69,-83384 }, + { 70,-83384 }, { 71,-83384 }, { 72,-83384 }, { 73,-83384 }, { 74,-83384 }, + { 75,-83384 }, { 76,-83384 }, { 77,-83384 }, { 78,-83384 }, { 79,-83384 }, + { 80,-83384 }, { 81,-83384 }, { 82,-83384 }, { 83,-83384 }, { 84,-83384 }, + { 85,-83384 }, { 86,-83384 }, { 87,-83384 }, { 88,-83384 }, { 89,-83384 }, + { 90,-83384 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-83384 }, { 0, 0 }, { 97,-83384 }, { 98,-83384 }, { 99,-83384 }, + + { 100,-83384 }, { 101,-83384 }, { 102,-83384 }, { 103,-83384 }, { 104,-83384 }, + { 105,-83384 }, { 106,-83384 }, { 107,-83384 }, { 108,-83384 }, { 109,-83384 }, + { 110,-83384 }, { 111,-83384 }, { 112,-83384 }, { 113,-83384 }, { 114,-83384 }, + { 115,-83384 }, { 116,-83384 }, { 117,-83384 }, { 118,-83384 }, { 119,-83384 }, + { 120,-83384 }, { 121,-83384 }, { 122,-83384 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-83384 }, { 128,-83384 }, { 129,-83384 }, + { 130,-83384 }, { 131,-83384 }, { 132,-83384 }, { 133,-83384 }, { 134,-83384 }, + { 135,-83384 }, { 136,-83384 }, { 137,-83384 }, { 138,-83384 }, { 139,-83384 }, + { 140,-83384 }, { 141,-83384 }, { 142,-83384 }, { 143,-83384 }, { 144,-83384 }, + { 145,-83384 }, { 146,-83384 }, { 147,-83384 }, { 148,-83384 }, { 149,-83384 }, + + { 150,-83384 }, { 151,-83384 }, { 152,-83384 }, { 153,-83384 }, { 154,-83384 }, + { 155,-83384 }, { 156,-83384 }, { 157,-83384 }, { 158,-83384 }, { 159,-83384 }, + { 160,-83384 }, { 161,-83384 }, { 162,-83384 }, { 163,-83384 }, { 164,-83384 }, + { 165,-83384 }, { 166,-83384 }, { 167,-83384 }, { 168,-83384 }, { 169,-83384 }, + { 170,-83384 }, { 171,-83384 }, { 172,-83384 }, { 173,-83384 }, { 174,-83384 }, + { 175,-83384 }, { 176,-83384 }, { 177,-83384 }, { 178,-83384 }, { 179,-83384 }, + { 180,-83384 }, { 181,-83384 }, { 182,-83384 }, { 183,-83384 }, { 184,-83384 }, + { 185,-83384 }, { 186,-83384 }, { 187,-83384 }, { 188,-83384 }, { 189,-83384 }, + { 190,-83384 }, { 191,-83384 }, { 192,-83384 }, { 193,-83384 }, { 194,-83384 }, + { 195,-83384 }, { 196,-83384 }, { 197,-83384 }, { 198,-83384 }, { 199,-83384 }, + + { 200,-83384 }, { 201,-83384 }, { 202,-83384 }, { 203,-83384 }, { 204,-83384 }, + { 205,-83384 }, { 206,-83384 }, { 207,-83384 }, { 208,-83384 }, { 209,-83384 }, + { 210,-83384 }, { 211,-83384 }, { 212,-83384 }, { 213,-83384 }, { 214,-83384 }, + { 215,-83384 }, { 216,-83384 }, { 217,-83384 }, { 218,-83384 }, { 219,-83384 }, + { 220,-83384 }, { 221,-83384 }, { 222,-83384 }, { 223,-83384 }, { 224,-83384 }, + { 225,-83384 }, { 226,-83384 }, { 227,-83384 }, { 228,-83384 }, { 229,-83384 }, + { 230,-83384 }, { 231,-83384 }, { 232,-83384 }, { 233,-83384 }, { 234,-83384 }, + { 235,-83384 }, { 236,-83384 }, { 237,-83384 }, { 238,-83384 }, { 239,-83384 }, + { 240,-83384 }, { 241,-83384 }, { 242,-83384 }, { 243,-83384 }, { 244,-83384 }, + { 245,-83384 }, { 246,-83384 }, { 247,-83384 }, { 248,-83384 }, { 249,-83384 }, + + { 250,-83384 }, { 251,-83384 }, { 252,-83384 }, { 253,-83384 }, { 254,-83384 }, + { 255,-83384 }, { 0, 83 }, { 0,8482 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-83641 }, { 49,-83641 }, { 50,-83641 }, { 51,-83641 }, { 52,-83641 }, + { 53,-83641 }, { 54,-83641 }, { 55,-83641 }, { 56,-83641 }, { 57,-83641 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-83641 }, { 66,-83641 }, { 67,-83641 }, + { 68,-83641 }, { 69,-83641 }, { 70,-83641 }, { 71,-83641 }, { 72,-83641 }, + { 73,-83641 }, { 74,-83641 }, { 75,-83641 }, { 76,-83641 }, { 77,-83641 }, + { 78,-83641 }, { 79,-83641 }, { 80,-83641 }, { 81,-83641 }, { 82,-83641 }, + { 83,-83641 }, { 84,-83641 }, { 85,-83641 }, { 86,-83641 }, { 87,-83641 }, + { 88,-83641 }, { 89,-83641 }, { 90,-83641 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 95,-83641 }, { 0, 0 }, { 97,-83641 }, + { 98,-83641 }, { 99,-83641 }, { 100,-83641 }, { 101,-83641 }, { 102,-83641 }, + { 103,-83641 }, { 104,-83641 }, { 105,-83641 }, { 106,-83641 }, { 107,-83641 }, + { 108,-83641 }, { 109,-83641 }, { 110,-83641 }, { 111,-83641 }, { 112,-83641 }, + { 113,-83641 }, { 114,-83641 }, { 115,-83641 }, { 116,-83641 }, { 117,-83641 }, + { 118,-83641 }, { 119,-83641 }, { 120,-83641 }, { 121,-83641 }, { 122,-83641 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-83641 }, + { 128,-83641 }, { 129,-83641 }, { 130,-83641 }, { 131,-83641 }, { 132,-83641 }, + { 133,-83641 }, { 134,-83641 }, { 135,-83641 }, { 136,-83641 }, { 137,-83641 }, + { 138,-83641 }, { 139,-83641 }, { 140,-83641 }, { 141,-83641 }, { 142,-83641 }, + + { 143,-83641 }, { 144,-83641 }, { 145,-83641 }, { 146,-83641 }, { 147,-83641 }, + { 148,-83641 }, { 149,-83641 }, { 150,-83641 }, { 151,-83641 }, { 152,-83641 }, + { 153,-83641 }, { 154,-83641 }, { 155,-83641 }, { 156,-83641 }, { 157,-83641 }, + { 158,-83641 }, { 159,-83641 }, { 160,-83641 }, { 161,-83641 }, { 162,-83641 }, + { 163,-83641 }, { 164,-83641 }, { 165,-83641 }, { 166,-83641 }, { 167,-83641 }, + { 168,-83641 }, { 169,-83641 }, { 170,-83641 }, { 171,-83641 }, { 172,-83641 }, + { 173,-83641 }, { 174,-83641 }, { 175,-83641 }, { 176,-83641 }, { 177,-83641 }, + { 178,-83641 }, { 179,-83641 }, { 180,-83641 }, { 181,-83641 }, { 182,-83641 }, + { 183,-83641 }, { 184,-83641 }, { 185,-83641 }, { 186,-83641 }, { 187,-83641 }, + { 188,-83641 }, { 189,-83641 }, { 190,-83641 }, { 191,-83641 }, { 192,-83641 }, + + { 193,-83641 }, { 194,-83641 }, { 195,-83641 }, { 196,-83641 }, { 197,-83641 }, + { 198,-83641 }, { 199,-83641 }, { 200,-83641 }, { 201,-83641 }, { 202,-83641 }, + { 203,-83641 }, { 204,-83641 }, { 205,-83641 }, { 206,-83641 }, { 207,-83641 }, + { 208,-83641 }, { 209,-83641 }, { 210,-83641 }, { 211,-83641 }, { 212,-83641 }, + { 213,-83641 }, { 214,-83641 }, { 215,-83641 }, { 216,-83641 }, { 217,-83641 }, + { 218,-83641 }, { 219,-83641 }, { 220,-83641 }, { 221,-83641 }, { 222,-83641 }, + { 223,-83641 }, { 224,-83641 }, { 225,-83641 }, { 226,-83641 }, { 227,-83641 }, + { 228,-83641 }, { 229,-83641 }, { 230,-83641 }, { 231,-83641 }, { 232,-83641 }, + { 233,-83641 }, { 234,-83641 }, { 235,-83641 }, { 236,-83641 }, { 237,-83641 }, + { 238,-83641 }, { 239,-83641 }, { 240,-83641 }, { 241,-83641 }, { 242,-83641 }, + + { 243,-83641 }, { 244,-83641 }, { 245,-83641 }, { 246,-83641 }, { 247,-83641 }, + { 248,-83641 }, { 249,-83641 }, { 250,-83641 }, { 251,-83641 }, { 252,-83641 }, + { 253,-83641 }, { 254,-83641 }, { 255,-83641 }, { 0, 65 }, { 0,8225 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-83898 }, { 49,-83898 }, { 50,-83898 }, + { 51,-83898 }, { 52,-83898 }, { 53,-83898 }, { 54,-83898 }, { 55,-83898 }, + { 56,-83898 }, { 57,-83898 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-83898 }, + { 66,-83898 }, { 67,-83898 }, { 68,-83898 }, { 69,-83898 }, { 70,-83898 }, + { 71,-83898 }, { 72,-83898 }, { 73,-83898 }, { 74,-83898 }, { 75,-83898 }, + { 76,-83898 }, { 77,-83898 }, { 78,-83898 }, { 79,-83898 }, { 80,-83898 }, + { 81,-83898 }, { 82,-83898 }, { 83,-83898 }, { 84,-83898 }, { 85,-83898 }, + + { 86,-83898 }, { 87,-83898 }, { 88,-83898 }, { 89,-83898 }, { 90,-83898 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-83898 }, + { 0, 0 }, { 97,-83898 }, { 98,-83898 }, { 99,-83898 }, { 100,-83898 }, + { 101,-83898 }, { 102,-83898 }, { 103,-83898 }, { 104,-83898 }, { 105,-83898 }, + { 106,-83898 }, { 107,-83898 }, { 108,-83898 }, { 109,-83898 }, { 110,-83898 }, + { 111,-83898 }, { 112,-83898 }, { 113,-83898 }, { 114,-83898 }, { 115,-83898 }, + { 116,-83898 }, { 117,-83898 }, { 118,-83898 }, { 119,-83898 }, { 120,-83898 }, + { 121,-83898 }, { 122,-83898 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-83898 }, { 128,-83898 }, { 129,-83898 }, { 130,-83898 }, + { 131,-83898 }, { 132,-83898 }, { 133,-83898 }, { 134,-83898 }, { 135,-83898 }, + + { 136,-83898 }, { 137,-83898 }, { 138,-83898 }, { 139,-83898 }, { 140,-83898 }, + { 141,-83898 }, { 142,-83898 }, { 143,-83898 }, { 144,-83898 }, { 145,-83898 }, + { 146,-83898 }, { 147,-83898 }, { 148,-83898 }, { 149,-83898 }, { 150,-83898 }, + { 151,-83898 }, { 152,-83898 }, { 153,-83898 }, { 154,-83898 }, { 155,-83898 }, + { 156,-83898 }, { 157,-83898 }, { 158,-83898 }, { 159,-83898 }, { 160,-83898 }, + { 161,-83898 }, { 162,-83898 }, { 163,-83898 }, { 164,-83898 }, { 165,-83898 }, + { 166,-83898 }, { 167,-83898 }, { 168,-83898 }, { 169,-83898 }, { 170,-83898 }, + { 171,-83898 }, { 172,-83898 }, { 173,-83898 }, { 174,-83898 }, { 175,-83898 }, + { 176,-83898 }, { 177,-83898 }, { 178,-83898 }, { 179,-83898 }, { 180,-83898 }, + { 181,-83898 }, { 182,-83898 }, { 183,-83898 }, { 184,-83898 }, { 185,-83898 }, + + { 186,-83898 }, { 187,-83898 }, { 188,-83898 }, { 189,-83898 }, { 190,-83898 }, + { 191,-83898 }, { 192,-83898 }, { 193,-83898 }, { 194,-83898 }, { 195,-83898 }, + { 196,-83898 }, { 197,-83898 }, { 198,-83898 }, { 199,-83898 }, { 200,-83898 }, + { 201,-83898 }, { 202,-83898 }, { 203,-83898 }, { 204,-83898 }, { 205,-83898 }, + { 206,-83898 }, { 207,-83898 }, { 208,-83898 }, { 209,-83898 }, { 210,-83898 }, + { 211,-83898 }, { 212,-83898 }, { 213,-83898 }, { 214,-83898 }, { 215,-83898 }, + { 216,-83898 }, { 217,-83898 }, { 218,-83898 }, { 219,-83898 }, { 220,-83898 }, + { 221,-83898 }, { 222,-83898 }, { 223,-83898 }, { 224,-83898 }, { 225,-83898 }, + { 226,-83898 }, { 227,-83898 }, { 228,-83898 }, { 229,-83898 }, { 230,-83898 }, + { 231,-83898 }, { 232,-83898 }, { 233,-83898 }, { 234,-83898 }, { 235,-83898 }, + + { 236,-83898 }, { 237,-83898 }, { 238,-83898 }, { 239,-83898 }, { 240,-83898 }, + { 241,-83898 }, { 242,-83898 }, { 243,-83898 }, { 244,-83898 }, { 245,-83898 }, + { 246,-83898 }, { 247,-83898 }, { 248,-83898 }, { 249,-83898 }, { 250,-83898 }, + { 251,-83898 }, { 252,-83898 }, { 253,-83898 }, { 254,-83898 }, { 255,-83898 }, + { 0, 131 }, { 0,7968 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-84155 }, + { 49,-84155 }, { 50,-84155 }, { 51,-84155 }, { 52,-84155 }, { 53,-84155 }, + { 54,-84155 }, { 55,-84155 }, { 56,-84155 }, { 57,-84155 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-84155 }, { 66,-84155 }, { 67,-84155 }, { 68,-84155 }, + { 69,-84155 }, { 70,-84155 }, { 71,-84155 }, { 72,-84155 }, { 73,-84155 }, + { 74,-84155 }, { 75,-84155 }, { 76,-84155 }, { 77,-84155 }, { 78,3084 }, + + { 79,-84155 }, { 80,-84155 }, { 81,-84155 }, { 82,-84155 }, { 83,-84155 }, + { 84,-84155 }, { 85,-84155 }, { 86,-84155 }, { 87,-84155 }, { 88,-84155 }, + { 89,-84155 }, { 90,-84155 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-84155 }, { 0, 0 }, { 97,-84155 }, { 98,-84155 }, + { 99,-84155 }, { 100,-84155 }, { 101,-84155 }, { 102,-84155 }, { 103,-84155 }, + { 104,-84155 }, { 105,-84155 }, { 106,-84155 }, { 107,-84155 }, { 108,-84155 }, + { 109,-84155 }, { 110,3084 }, { 111,-84155 }, { 112,-84155 }, { 113,-84155 }, + { 114,-84155 }, { 115,-84155 }, { 116,-84155 }, { 117,-84155 }, { 118,-84155 }, + { 119,-84155 }, { 120,-84155 }, { 121,-84155 }, { 122,-84155 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-84155 }, { 128,-84155 }, + + { 129,-84155 }, { 130,-84155 }, { 131,-84155 }, { 132,-84155 }, { 133,-84155 }, + { 134,-84155 }, { 135,-84155 }, { 136,-84155 }, { 137,-84155 }, { 138,-84155 }, + { 139,-84155 }, { 140,-84155 }, { 141,-84155 }, { 142,-84155 }, { 143,-84155 }, + { 144,-84155 }, { 145,-84155 }, { 146,-84155 }, { 147,-84155 }, { 148,-84155 }, + { 149,-84155 }, { 150,-84155 }, { 151,-84155 }, { 152,-84155 }, { 153,-84155 }, + { 154,-84155 }, { 155,-84155 }, { 156,-84155 }, { 157,-84155 }, { 158,-84155 }, + { 159,-84155 }, { 160,-84155 }, { 161,-84155 }, { 162,-84155 }, { 163,-84155 }, + { 164,-84155 }, { 165,-84155 }, { 166,-84155 }, { 167,-84155 }, { 168,-84155 }, + { 169,-84155 }, { 170,-84155 }, { 171,-84155 }, { 172,-84155 }, { 173,-84155 }, + { 174,-84155 }, { 175,-84155 }, { 176,-84155 }, { 177,-84155 }, { 178,-84155 }, + + { 179,-84155 }, { 180,-84155 }, { 181,-84155 }, { 182,-84155 }, { 183,-84155 }, + { 184,-84155 }, { 185,-84155 }, { 186,-84155 }, { 187,-84155 }, { 188,-84155 }, + { 189,-84155 }, { 190,-84155 }, { 191,-84155 }, { 192,-84155 }, { 193,-84155 }, + { 194,-84155 }, { 195,-84155 }, { 196,-84155 }, { 197,-84155 }, { 198,-84155 }, + { 199,-84155 }, { 200,-84155 }, { 201,-84155 }, { 202,-84155 }, { 203,-84155 }, + { 204,-84155 }, { 205,-84155 }, { 206,-84155 }, { 207,-84155 }, { 208,-84155 }, + { 209,-84155 }, { 210,-84155 }, { 211,-84155 }, { 212,-84155 }, { 213,-84155 }, + { 214,-84155 }, { 215,-84155 }, { 216,-84155 }, { 217,-84155 }, { 218,-84155 }, + { 219,-84155 }, { 220,-84155 }, { 221,-84155 }, { 222,-84155 }, { 223,-84155 }, + { 224,-84155 }, { 225,-84155 }, { 226,-84155 }, { 227,-84155 }, { 228,-84155 }, + + { 229,-84155 }, { 230,-84155 }, { 231,-84155 }, { 232,-84155 }, { 233,-84155 }, + { 234,-84155 }, { 235,-84155 }, { 236,-84155 }, { 237,-84155 }, { 238,-84155 }, + { 239,-84155 }, { 240,-84155 }, { 241,-84155 }, { 242,-84155 }, { 243,-84155 }, + { 244,-84155 }, { 245,-84155 }, { 246,-84155 }, { 247,-84155 }, { 248,-84155 }, + { 249,-84155 }, { 250,-84155 }, { 251,-84155 }, { 252,-84155 }, { 253,-84155 }, + { 254,-84155 }, { 255,-84155 }, { 0, 78 }, { 0,7711 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-84412 }, { 49,-84412 }, { 50,-84412 }, { 51,-84412 }, + { 52,-84412 }, { 53,-84412 }, { 54,-84412 }, { 55,-84412 }, { 56,-84412 }, + { 57,-84412 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-84412 }, { 66,-84412 }, + { 67,-84412 }, { 68,-84412 }, { 69,-84412 }, { 70,-84412 }, { 71,-84412 }, + + { 72,-84412 }, { 73,-84412 }, { 74,-84412 }, { 75,-84412 }, { 76,-84412 }, + { 77,-84412 }, { 78,-84412 }, { 79,-84412 }, { 80,-84412 }, { 81,-84412 }, + { 82,-84412 }, { 83,-84412 }, { 84,-84412 }, { 85,-84412 }, { 86,-84412 }, + { 87,-84412 }, { 88,-84412 }, { 89,-84412 }, { 90,-84412 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-84412 }, { 0, 0 }, + { 97,-84412 }, { 98,-84412 }, { 99,-84412 }, { 100,-84412 }, { 101,-84412 }, + { 102,-84412 }, { 103,-84412 }, { 104,-84412 }, { 105,-84412 }, { 106,-84412 }, + { 107,-84412 }, { 108,-84412 }, { 109,-84412 }, { 110,-84412 }, { 111,-84412 }, + { 112,-84412 }, { 113,-84412 }, { 114,-84412 }, { 115,-84412 }, { 116,-84412 }, + { 117,-84412 }, { 118,-84412 }, { 119,-84412 }, { 120,-84412 }, { 121,-84412 }, + + { 122,-84412 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-84412 }, { 128,-84412 }, { 129,-84412 }, { 130,-84412 }, { 131,-84412 }, + { 132,-84412 }, { 133,-84412 }, { 134,-84412 }, { 135,-84412 }, { 136,-84412 }, + { 137,-84412 }, { 138,-84412 }, { 139,-84412 }, { 140,-84412 }, { 141,-84412 }, + { 142,-84412 }, { 143,-84412 }, { 144,-84412 }, { 145,-84412 }, { 146,-84412 }, + { 147,-84412 }, { 148,-84412 }, { 149,-84412 }, { 150,-84412 }, { 151,-84412 }, + { 152,-84412 }, { 153,-84412 }, { 154,-84412 }, { 155,-84412 }, { 156,-84412 }, + { 157,-84412 }, { 158,-84412 }, { 159,-84412 }, { 160,-84412 }, { 161,-84412 }, + { 162,-84412 }, { 163,-84412 }, { 164,-84412 }, { 165,-84412 }, { 166,-84412 }, + { 167,-84412 }, { 168,-84412 }, { 169,-84412 }, { 170,-84412 }, { 171,-84412 }, + + { 172,-84412 }, { 173,-84412 }, { 174,-84412 }, { 175,-84412 }, { 176,-84412 }, + { 177,-84412 }, { 178,-84412 }, { 179,-84412 }, { 180,-84412 }, { 181,-84412 }, + { 182,-84412 }, { 183,-84412 }, { 184,-84412 }, { 185,-84412 }, { 186,-84412 }, + { 187,-84412 }, { 188,-84412 }, { 189,-84412 }, { 190,-84412 }, { 191,-84412 }, + { 192,-84412 }, { 193,-84412 }, { 194,-84412 }, { 195,-84412 }, { 196,-84412 }, + { 197,-84412 }, { 198,-84412 }, { 199,-84412 }, { 200,-84412 }, { 201,-84412 }, + { 202,-84412 }, { 203,-84412 }, { 204,-84412 }, { 205,-84412 }, { 206,-84412 }, + { 207,-84412 }, { 208,-84412 }, { 209,-84412 }, { 210,-84412 }, { 211,-84412 }, + { 212,-84412 }, { 213,-84412 }, { 214,-84412 }, { 215,-84412 }, { 216,-84412 }, + { 217,-84412 }, { 218,-84412 }, { 219,-84412 }, { 220,-84412 }, { 221,-84412 }, + + { 222,-84412 }, { 223,-84412 }, { 224,-84412 }, { 225,-84412 }, { 226,-84412 }, + { 227,-84412 }, { 228,-84412 }, { 229,-84412 }, { 230,-84412 }, { 231,-84412 }, + { 232,-84412 }, { 233,-84412 }, { 234,-84412 }, { 235,-84412 }, { 236,-84412 }, + { 237,-84412 }, { 238,-84412 }, { 239,-84412 }, { 240,-84412 }, { 241,-84412 }, + { 242,-84412 }, { 243,-84412 }, { 244,-84412 }, { 245,-84412 }, { 246,-84412 }, + { 247,-84412 }, { 248,-84412 }, { 249,-84412 }, { 250,-84412 }, { 251,-84412 }, + { 252,-84412 }, { 253,-84412 }, { 254,-84412 }, { 255,-84412 }, { 0, 131 }, + { 0,7454 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-84669 }, { 49,-84669 }, + { 50,-84669 }, { 51,-84669 }, { 52,-84669 }, { 53,-84669 }, { 54,-84669 }, + { 55,-84669 }, { 56,-84669 }, { 57,-84669 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 65,-84669 }, { 66,-84669 }, { 67,-84669 }, { 68,-84669 }, { 69,-84669 }, + { 70,-84669 }, { 71,-84669 }, { 72,-84669 }, { 73,-84669 }, { 74,-84669 }, + { 75,-84669 }, { 76,-84669 }, { 77,-84669 }, { 78,2827 }, { 79,-84669 }, + { 80,-84669 }, { 81,-84669 }, { 82,-84669 }, { 83,-84669 }, { 84,-84669 }, + { 85,-84669 }, { 86,-84669 }, { 87,-84669 }, { 88,-84669 }, { 89,-84669 }, + { 90,-84669 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-84669 }, { 0, 0 }, { 97,-84669 }, { 98,-84669 }, { 99,-84669 }, + { 100,-84669 }, { 101,-84669 }, { 102,-84669 }, { 103,-84669 }, { 104,-84669 }, + { 105,-84669 }, { 106,-84669 }, { 107,-84669 }, { 108,-84669 }, { 109,-84669 }, + { 110,2827 }, { 111,-84669 }, { 112,-84669 }, { 113,-84669 }, { 114,-84669 }, + + { 115,-84669 }, { 116,-84669 }, { 117,-84669 }, { 118,-84669 }, { 119,-84669 }, + { 120,-84669 }, { 121,-84669 }, { 122,-84669 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-84669 }, { 128,-84669 }, { 129,-84669 }, + { 130,-84669 }, { 131,-84669 }, { 132,-84669 }, { 133,-84669 }, { 134,-84669 }, + { 135,-84669 }, { 136,-84669 }, { 137,-84669 }, { 138,-84669 }, { 139,-84669 }, + { 140,-84669 }, { 141,-84669 }, { 142,-84669 }, { 143,-84669 }, { 144,-84669 }, + { 145,-84669 }, { 146,-84669 }, { 147,-84669 }, { 148,-84669 }, { 149,-84669 }, + { 150,-84669 }, { 151,-84669 }, { 152,-84669 }, { 153,-84669 }, { 154,-84669 }, + { 155,-84669 }, { 156,-84669 }, { 157,-84669 }, { 158,-84669 }, { 159,-84669 }, + { 160,-84669 }, { 161,-84669 }, { 162,-84669 }, { 163,-84669 }, { 164,-84669 }, + + { 165,-84669 }, { 166,-84669 }, { 167,-84669 }, { 168,-84669 }, { 169,-84669 }, + { 170,-84669 }, { 171,-84669 }, { 172,-84669 }, { 173,-84669 }, { 174,-84669 }, + { 175,-84669 }, { 176,-84669 }, { 177,-84669 }, { 178,-84669 }, { 179,-84669 }, + { 180,-84669 }, { 181,-84669 }, { 182,-84669 }, { 183,-84669 }, { 184,-84669 }, + { 185,-84669 }, { 186,-84669 }, { 187,-84669 }, { 188,-84669 }, { 189,-84669 }, + { 190,-84669 }, { 191,-84669 }, { 192,-84669 }, { 193,-84669 }, { 194,-84669 }, + { 195,-84669 }, { 196,-84669 }, { 197,-84669 }, { 198,-84669 }, { 199,-84669 }, + { 200,-84669 }, { 201,-84669 }, { 202,-84669 }, { 203,-84669 }, { 204,-84669 }, + { 205,-84669 }, { 206,-84669 }, { 207,-84669 }, { 208,-84669 }, { 209,-84669 }, + { 210,-84669 }, { 211,-84669 }, { 212,-84669 }, { 213,-84669 }, { 214,-84669 }, + + { 215,-84669 }, { 216,-84669 }, { 217,-84669 }, { 218,-84669 }, { 219,-84669 }, + { 220,-84669 }, { 221,-84669 }, { 222,-84669 }, { 223,-84669 }, { 224,-84669 }, + { 225,-84669 }, { 226,-84669 }, { 227,-84669 }, { 228,-84669 }, { 229,-84669 }, + { 230,-84669 }, { 231,-84669 }, { 232,-84669 }, { 233,-84669 }, { 234,-84669 }, + { 235,-84669 }, { 236,-84669 }, { 237,-84669 }, { 238,-84669 }, { 239,-84669 }, + { 240,-84669 }, { 241,-84669 }, { 242,-84669 }, { 243,-84669 }, { 244,-84669 }, + { 245,-84669 }, { 246,-84669 }, { 247,-84669 }, { 248,-84669 }, { 249,-84669 }, + { 250,-84669 }, { 251,-84669 }, { 252,-84669 }, { 253,-84669 }, { 254,-84669 }, + { 255,-84669 }, { 0, 131 }, { 0,7197 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-84926 }, { 49,-84926 }, { 50,-84926 }, { 51,-84926 }, { 52,-84926 }, + { 53,-84926 }, { 54,-84926 }, { 55,-84926 }, { 56,-84926 }, { 57,-84926 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-84926 }, { 66,-84926 }, { 67,-84926 }, + { 68,-84926 }, { 69,-84926 }, { 70,-84926 }, { 71,-84926 }, { 72,-84926 }, + { 73,-84926 }, { 74,-84926 }, { 75,-84926 }, { 76,-84926 }, { 77,2827 }, + { 78,-84926 }, { 79,-84926 }, { 80,-84926 }, { 81,-84926 }, { 82,-84926 }, + { 83,-84926 }, { 84,-84926 }, { 85,-84926 }, { 86,-84926 }, { 87,-84926 }, + { 88,-84926 }, { 89,-84926 }, { 90,-84926 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-84926 }, { 0, 0 }, { 97,-84926 }, + { 98,-84926 }, { 99,-84926 }, { 100,-84926 }, { 101,-84926 }, { 102,-84926 }, + { 103,-84926 }, { 104,-84926 }, { 105,-84926 }, { 106,-84926 }, { 107,-84926 }, + + { 108,-84926 }, { 109,2827 }, { 110,-84926 }, { 111,-84926 }, { 112,-84926 }, + { 113,-84926 }, { 114,-84926 }, { 115,-84926 }, { 116,-84926 }, { 117,-84926 }, + { 118,-84926 }, { 119,-84926 }, { 120,-84926 }, { 121,-84926 }, { 122,-84926 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-84926 }, + { 128,-84926 }, { 129,-84926 }, { 130,-84926 }, { 131,-84926 }, { 132,-84926 }, + { 133,-84926 }, { 134,-84926 }, { 135,-84926 }, { 136,-84926 }, { 137,-84926 }, + { 138,-84926 }, { 139,-84926 }, { 140,-84926 }, { 141,-84926 }, { 142,-84926 }, + { 143,-84926 }, { 144,-84926 }, { 145,-84926 }, { 146,-84926 }, { 147,-84926 }, + { 148,-84926 }, { 149,-84926 }, { 150,-84926 }, { 151,-84926 }, { 152,-84926 }, + { 153,-84926 }, { 154,-84926 }, { 155,-84926 }, { 156,-84926 }, { 157,-84926 }, + + { 158,-84926 }, { 159,-84926 }, { 160,-84926 }, { 161,-84926 }, { 162,-84926 }, + { 163,-84926 }, { 164,-84926 }, { 165,-84926 }, { 166,-84926 }, { 167,-84926 }, + { 168,-84926 }, { 169,-84926 }, { 170,-84926 }, { 171,-84926 }, { 172,-84926 }, + { 173,-84926 }, { 174,-84926 }, { 175,-84926 }, { 176,-84926 }, { 177,-84926 }, + { 178,-84926 }, { 179,-84926 }, { 180,-84926 }, { 181,-84926 }, { 182,-84926 }, + { 183,-84926 }, { 184,-84926 }, { 185,-84926 }, { 186,-84926 }, { 187,-84926 }, + { 188,-84926 }, { 189,-84926 }, { 190,-84926 }, { 191,-84926 }, { 192,-84926 }, + { 193,-84926 }, { 194,-84926 }, { 195,-84926 }, { 196,-84926 }, { 197,-84926 }, + { 198,-84926 }, { 199,-84926 }, { 200,-84926 }, { 201,-84926 }, { 202,-84926 }, + { 203,-84926 }, { 204,-84926 }, { 205,-84926 }, { 206,-84926 }, { 207,-84926 }, + + { 208,-84926 }, { 209,-84926 }, { 210,-84926 }, { 211,-84926 }, { 212,-84926 }, + { 213,-84926 }, { 214,-84926 }, { 215,-84926 }, { 216,-84926 }, { 217,-84926 }, + { 218,-84926 }, { 219,-84926 }, { 220,-84926 }, { 221,-84926 }, { 222,-84926 }, + { 223,-84926 }, { 224,-84926 }, { 225,-84926 }, { 226,-84926 }, { 227,-84926 }, + { 228,-84926 }, { 229,-84926 }, { 230,-84926 }, { 231,-84926 }, { 232,-84926 }, + { 233,-84926 }, { 234,-84926 }, { 235,-84926 }, { 236,-84926 }, { 237,-84926 }, + { 238,-84926 }, { 239,-84926 }, { 240,-84926 }, { 241,-84926 }, { 242,-84926 }, + { 243,-84926 }, { 244,-84926 }, { 245,-84926 }, { 246,-84926 }, { 247,-84926 }, + { 248,-84926 }, { 249,-84926 }, { 250,-84926 }, { 251,-84926 }, { 252,-84926 }, + { 253,-84926 }, { 254,-84926 }, { 255,-84926 }, { 0, 131 }, { 0,6940 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-85183 }, { 49,-85183 }, { 50,-85183 }, + + { 51,-85183 }, { 52,-85183 }, { 53,-85183 }, { 54,-85183 }, { 55,-85183 }, + { 56,-85183 }, { 57,-85183 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-85183 }, + { 66,-85183 }, { 67,-85183 }, { 68,-85183 }, { 69,-85183 }, { 70,-85183 }, + { 71,-85183 }, { 72,-85183 }, { 73,-85183 }, { 74,-85183 }, { 75,-85183 }, + { 76,-85183 }, { 77,-85183 }, { 78,-85183 }, { 79,-85183 }, { 80,-85183 }, + { 81,-85183 }, { 82,-85183 }, { 83,-85183 }, { 84,-85183 }, { 85,-85183 }, + { 86,-85183 }, { 87,-85183 }, { 88,-85183 }, { 89,-85183 }, { 90,-85183 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,2827 }, + { 0, 0 }, { 97,-85183 }, { 98,-85183 }, { 99,-85183 }, { 100,-85183 }, + + { 101,-85183 }, { 102,-85183 }, { 103,-85183 }, { 104,-85183 }, { 105,-85183 }, + { 106,-85183 }, { 107,-85183 }, { 108,-85183 }, { 109,-85183 }, { 110,-85183 }, + { 111,-85183 }, { 112,-85183 }, { 113,-85183 }, { 114,-85183 }, { 115,-85183 }, + { 116,-85183 }, { 117,-85183 }, { 118,-85183 }, { 119,-85183 }, { 120,-85183 }, + { 121,-85183 }, { 122,-85183 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-85183 }, { 128,-85183 }, { 129,-85183 }, { 130,-85183 }, + { 131,-85183 }, { 132,-85183 }, { 133,-85183 }, { 134,-85183 }, { 135,-85183 }, + { 136,-85183 }, { 137,-85183 }, { 138,-85183 }, { 139,-85183 }, { 140,-85183 }, + { 141,-85183 }, { 142,-85183 }, { 143,-85183 }, { 144,-85183 }, { 145,-85183 }, + { 146,-85183 }, { 147,-85183 }, { 148,-85183 }, { 149,-85183 }, { 150,-85183 }, + + { 151,-85183 }, { 152,-85183 }, { 153,-85183 }, { 154,-85183 }, { 155,-85183 }, + { 156,-85183 }, { 157,-85183 }, { 158,-85183 }, { 159,-85183 }, { 160,-85183 }, + { 161,-85183 }, { 162,-85183 }, { 163,-85183 }, { 164,-85183 }, { 165,-85183 }, + { 166,-85183 }, { 167,-85183 }, { 168,-85183 }, { 169,-85183 }, { 170,-85183 }, + { 171,-85183 }, { 172,-85183 }, { 173,-85183 }, { 174,-85183 }, { 175,-85183 }, + { 176,-85183 }, { 177,-85183 }, { 178,-85183 }, { 179,-85183 }, { 180,-85183 }, + { 181,-85183 }, { 182,-85183 }, { 183,-85183 }, { 184,-85183 }, { 185,-85183 }, + { 186,-85183 }, { 187,-85183 }, { 188,-85183 }, { 189,-85183 }, { 190,-85183 }, + { 191,-85183 }, { 192,-85183 }, { 193,-85183 }, { 194,-85183 }, { 195,-85183 }, + { 196,-85183 }, { 197,-85183 }, { 198,-85183 }, { 199,-85183 }, { 200,-85183 }, + + { 201,-85183 }, { 202,-85183 }, { 203,-85183 }, { 204,-85183 }, { 205,-85183 }, + { 206,-85183 }, { 207,-85183 }, { 208,-85183 }, { 209,-85183 }, { 210,-85183 }, + { 211,-85183 }, { 212,-85183 }, { 213,-85183 }, { 214,-85183 }, { 215,-85183 }, + { 216,-85183 }, { 217,-85183 }, { 218,-85183 }, { 219,-85183 }, { 220,-85183 }, + { 221,-85183 }, { 222,-85183 }, { 223,-85183 }, { 224,-85183 }, { 225,-85183 }, + { 226,-85183 }, { 227,-85183 }, { 228,-85183 }, { 229,-85183 }, { 230,-85183 }, + { 231,-85183 }, { 232,-85183 }, { 233,-85183 }, { 234,-85183 }, { 235,-85183 }, + { 236,-85183 }, { 237,-85183 }, { 238,-85183 }, { 239,-85183 }, { 240,-85183 }, + { 241,-85183 }, { 242,-85183 }, { 243,-85183 }, { 244,-85183 }, { 245,-85183 }, + { 246,-85183 }, { 247,-85183 }, { 248,-85183 }, { 249,-85183 }, { 250,-85183 }, + + { 251,-85183 }, { 252,-85183 }, { 253,-85183 }, { 254,-85183 }, { 255,-85183 }, + { 0, 131 }, { 0,6683 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-85440 }, + { 49,-85440 }, { 50,-85440 }, { 51,-85440 }, { 52,-85440 }, { 53,-85440 }, + { 54,-85440 }, { 55,-85440 }, { 56,-85440 }, { 57,-85440 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-85440 }, { 66,-85440 }, { 67,2827 }, { 68,-85440 }, + { 69,-85440 }, { 70,-85440 }, { 71,-85440 }, { 72,-85440 }, { 73,-85440 }, + { 74,-85440 }, { 75,-85440 }, { 76,-85440 }, { 77,-85440 }, { 78,-85440 }, + { 79,-85440 }, { 80,-85440 }, { 81,-85440 }, { 82,-85440 }, { 83,-85440 }, + { 84,-85440 }, { 85,-85440 }, { 86,-85440 }, { 87,-85440 }, { 88,-85440 }, + { 89,-85440 }, { 90,-85440 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 95,-85440 }, { 0, 0 }, { 97,-85440 }, { 98,-85440 }, + { 99,2827 }, { 100,-85440 }, { 101,-85440 }, { 102,-85440 }, { 103,-85440 }, + { 104,-85440 }, { 105,-85440 }, { 106,-85440 }, { 107,-85440 }, { 108,-85440 }, + { 109,-85440 }, { 110,-85440 }, { 111,-85440 }, { 112,-85440 }, { 113,-85440 }, + { 114,-85440 }, { 115,-85440 }, { 116,-85440 }, { 117,-85440 }, { 118,-85440 }, + { 119,-85440 }, { 120,-85440 }, { 121,-85440 }, { 122,-85440 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-85440 }, { 128,-85440 }, + { 129,-85440 }, { 130,-85440 }, { 131,-85440 }, { 132,-85440 }, { 133,-85440 }, + { 134,-85440 }, { 135,-85440 }, { 136,-85440 }, { 137,-85440 }, { 138,-85440 }, + { 139,-85440 }, { 140,-85440 }, { 141,-85440 }, { 142,-85440 }, { 143,-85440 }, + + { 144,-85440 }, { 145,-85440 }, { 146,-85440 }, { 147,-85440 }, { 148,-85440 }, + { 149,-85440 }, { 150,-85440 }, { 151,-85440 }, { 152,-85440 }, { 153,-85440 }, + { 154,-85440 }, { 155,-85440 }, { 156,-85440 }, { 157,-85440 }, { 158,-85440 }, + { 159,-85440 }, { 160,-85440 }, { 161,-85440 }, { 162,-85440 }, { 163,-85440 }, + { 164,-85440 }, { 165,-85440 }, { 166,-85440 }, { 167,-85440 }, { 168,-85440 }, + { 169,-85440 }, { 170,-85440 }, { 171,-85440 }, { 172,-85440 }, { 173,-85440 }, + { 174,-85440 }, { 175,-85440 }, { 176,-85440 }, { 177,-85440 }, { 178,-85440 }, + { 179,-85440 }, { 180,-85440 }, { 181,-85440 }, { 182,-85440 }, { 183,-85440 }, + { 184,-85440 }, { 185,-85440 }, { 186,-85440 }, { 187,-85440 }, { 188,-85440 }, + { 189,-85440 }, { 190,-85440 }, { 191,-85440 }, { 192,-85440 }, { 193,-85440 }, + + { 194,-85440 }, { 195,-85440 }, { 196,-85440 }, { 197,-85440 }, { 198,-85440 }, + { 199,-85440 }, { 200,-85440 }, { 201,-85440 }, { 202,-85440 }, { 203,-85440 }, + { 204,-85440 }, { 205,-85440 }, { 206,-85440 }, { 207,-85440 }, { 208,-85440 }, + { 209,-85440 }, { 210,-85440 }, { 211,-85440 }, { 212,-85440 }, { 213,-85440 }, + { 214,-85440 }, { 215,-85440 }, { 216,-85440 }, { 217,-85440 }, { 218,-85440 }, + { 219,-85440 }, { 220,-85440 }, { 221,-85440 }, { 222,-85440 }, { 223,-85440 }, + { 224,-85440 }, { 225,-85440 }, { 226,-85440 }, { 227,-85440 }, { 228,-85440 }, + { 229,-85440 }, { 230,-85440 }, { 231,-85440 }, { 232,-85440 }, { 233,-85440 }, + { 234,-85440 }, { 235,-85440 }, { 236,-85440 }, { 237,-85440 }, { 238,-85440 }, + { 239,-85440 }, { 240,-85440 }, { 241,-85440 }, { 242,-85440 }, { 243,-85440 }, + + { 244,-85440 }, { 245,-85440 }, { 246,-85440 }, { 247,-85440 }, { 248,-85440 }, + { 249,-85440 }, { 250,-85440 }, { 251,-85440 }, { 252,-85440 }, { 253,-85440 }, + { 254,-85440 }, { 255,-85440 }, { 0, 89 }, { 0,6426 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-85697 }, { 49,-85697 }, { 50,-85697 }, { 51,-85697 }, + { 52,-85697 }, { 53,-85697 }, { 54,-85697 }, { 55,-85697 }, { 56,-85697 }, + { 57,-85697 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-85697 }, { 66,-85697 }, + { 67,-85697 }, { 68,-85697 }, { 69,-85697 }, { 70,-85697 }, { 71,-85697 }, + { 72,-85697 }, { 73,-85697 }, { 74,-85697 }, { 75,-85697 }, { 76,-85697 }, + { 77,-85697 }, { 78,-85697 }, { 79,-85697 }, { 80,-85697 }, { 81,-85697 }, + { 82,-85697 }, { 83,-85697 }, { 84,-85697 }, { 85,-85697 }, { 86,-85697 }, + + { 87,-85697 }, { 88,-85697 }, { 89,-85697 }, { 90,-85697 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-85697 }, { 0, 0 }, + { 97,-85697 }, { 98,-85697 }, { 99,-85697 }, { 100,-85697 }, { 101,-85697 }, + { 102,-85697 }, { 103,-85697 }, { 104,-85697 }, { 105,-85697 }, { 106,-85697 }, + { 107,-85697 }, { 108,-85697 }, { 109,-85697 }, { 110,-85697 }, { 111,-85697 }, + { 112,-85697 }, { 113,-85697 }, { 114,-85697 }, { 115,-85697 }, { 116,-85697 }, + { 117,-85697 }, { 118,-85697 }, { 119,-85697 }, { 120,-85697 }, { 121,-85697 }, + { 122,-85697 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-85697 }, { 128,-85697 }, { 129,-85697 }, { 130,-85697 }, { 131,-85697 }, + { 132,-85697 }, { 133,-85697 }, { 134,-85697 }, { 135,-85697 }, { 136,-85697 }, + + { 137,-85697 }, { 138,-85697 }, { 139,-85697 }, { 140,-85697 }, { 141,-85697 }, + { 142,-85697 }, { 143,-85697 }, { 144,-85697 }, { 145,-85697 }, { 146,-85697 }, + { 147,-85697 }, { 148,-85697 }, { 149,-85697 }, { 150,-85697 }, { 151,-85697 }, + { 152,-85697 }, { 153,-85697 }, { 154,-85697 }, { 155,-85697 }, { 156,-85697 }, + { 157,-85697 }, { 158,-85697 }, { 159,-85697 }, { 160,-85697 }, { 161,-85697 }, + { 162,-85697 }, { 163,-85697 }, { 164,-85697 }, { 165,-85697 }, { 166,-85697 }, + { 167,-85697 }, { 168,-85697 }, { 169,-85697 }, { 170,-85697 }, { 171,-85697 }, + { 172,-85697 }, { 173,-85697 }, { 174,-85697 }, { 175,-85697 }, { 176,-85697 }, + { 177,-85697 }, { 178,-85697 }, { 179,-85697 }, { 180,-85697 }, { 181,-85697 }, + { 182,-85697 }, { 183,-85697 }, { 184,-85697 }, { 185,-85697 }, { 186,-85697 }, + + { 187,-85697 }, { 188,-85697 }, { 189,-85697 }, { 190,-85697 }, { 191,-85697 }, + { 192,-85697 }, { 193,-85697 }, { 194,-85697 }, { 195,-85697 }, { 196,-85697 }, + { 197,-85697 }, { 198,-85697 }, { 199,-85697 }, { 200,-85697 }, { 201,-85697 }, + { 202,-85697 }, { 203,-85697 }, { 204,-85697 }, { 205,-85697 }, { 206,-85697 }, + { 207,-85697 }, { 208,-85697 }, { 209,-85697 }, { 210,-85697 }, { 211,-85697 }, + { 212,-85697 }, { 213,-85697 }, { 214,-85697 }, { 215,-85697 }, { 216,-85697 }, + { 217,-85697 }, { 218,-85697 }, { 219,-85697 }, { 220,-85697 }, { 221,-85697 }, + { 222,-85697 }, { 223,-85697 }, { 224,-85697 }, { 225,-85697 }, { 226,-85697 }, + { 227,-85697 }, { 228,-85697 }, { 229,-85697 }, { 230,-85697 }, { 231,-85697 }, + { 232,-85697 }, { 233,-85697 }, { 234,-85697 }, { 235,-85697 }, { 236,-85697 }, + + { 237,-85697 }, { 238,-85697 }, { 239,-85697 }, { 240,-85697 }, { 241,-85697 }, + { 242,-85697 }, { 243,-85697 }, { 244,-85697 }, { 245,-85697 }, { 246,-85697 }, + { 247,-85697 }, { 248,-85697 }, { 249,-85697 }, { 250,-85697 }, { 251,-85697 }, + { 252,-85697 }, { 253,-85697 }, { 254,-85697 }, { 255,-85697 }, { 0, 44 }, + { 0,6169 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-85954 }, { 49,-85954 }, + { 50,-85954 }, { 51,-85954 }, { 52,-85954 }, { 53,-85954 }, { 54,-85954 }, + { 55,-85954 }, { 56,-85954 }, { 57,-85954 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-85954 }, { 66,-85954 }, { 67,-85954 }, { 68,-85954 }, { 69,-85954 }, + { 70,-85954 }, { 71,-85954 }, { 72,-85954 }, { 73,-85954 }, { 74,-85954 }, + { 75,-85954 }, { 76,-85954 }, { 77,-85954 }, { 78,-85954 }, { 79,-85954 }, + + { 80,-85954 }, { 81,-85954 }, { 82,-85954 }, { 83,-85954 }, { 84,-85954 }, + { 85,-85954 }, { 86,-85954 }, { 87,-85954 }, { 88,-85954 }, { 89,-85954 }, + { 90,-85954 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-85954 }, { 0, 0 }, { 97,-85954 }, { 98,-85954 }, { 99,-85954 }, + { 100,-85954 }, { 101,-85954 }, { 102,-85954 }, { 103,-85954 }, { 104,-85954 }, + { 105,-85954 }, { 106,-85954 }, { 107,-85954 }, { 108,-85954 }, { 109,-85954 }, + { 110,-85954 }, { 111,-85954 }, { 112,-85954 }, { 113,-85954 }, { 114,-85954 }, + { 115,-85954 }, { 116,-85954 }, { 117,-85954 }, { 118,-85954 }, { 119,-85954 }, + { 120,-85954 }, { 121,-85954 }, { 122,-85954 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-85954 }, { 128,-85954 }, { 129,-85954 }, + + { 130,-85954 }, { 131,-85954 }, { 132,-85954 }, { 133,-85954 }, { 134,-85954 }, + { 135,-85954 }, { 136,-85954 }, { 137,-85954 }, { 138,-85954 }, { 139,-85954 }, + { 140,-85954 }, { 141,-85954 }, { 142,-85954 }, { 143,-85954 }, { 144,-85954 }, + { 145,-85954 }, { 146,-85954 }, { 147,-85954 }, { 148,-85954 }, { 149,-85954 }, + { 150,-85954 }, { 151,-85954 }, { 152,-85954 }, { 153,-85954 }, { 154,-85954 }, + { 155,-85954 }, { 156,-85954 }, { 157,-85954 }, { 158,-85954 }, { 159,-85954 }, + { 160,-85954 }, { 161,-85954 }, { 162,-85954 }, { 163,-85954 }, { 164,-85954 }, + { 165,-85954 }, { 166,-85954 }, { 167,-85954 }, { 168,-85954 }, { 169,-85954 }, + { 170,-85954 }, { 171,-85954 }, { 172,-85954 }, { 173,-85954 }, { 174,-85954 }, + { 175,-85954 }, { 176,-85954 }, { 177,-85954 }, { 178,-85954 }, { 179,-85954 }, + + { 180,-85954 }, { 181,-85954 }, { 182,-85954 }, { 183,-85954 }, { 184,-85954 }, + { 185,-85954 }, { 186,-85954 }, { 187,-85954 }, { 188,-85954 }, { 189,-85954 }, + { 190,-85954 }, { 191,-85954 }, { 192,-85954 }, { 193,-85954 }, { 194,-85954 }, + { 195,-85954 }, { 196,-85954 }, { 197,-85954 }, { 198,-85954 }, { 199,-85954 }, + { 200,-85954 }, { 201,-85954 }, { 202,-85954 }, { 203,-85954 }, { 204,-85954 }, + { 205,-85954 }, { 206,-85954 }, { 207,-85954 }, { 208,-85954 }, { 209,-85954 }, + { 210,-85954 }, { 211,-85954 }, { 212,-85954 }, { 213,-85954 }, { 214,-85954 }, + { 215,-85954 }, { 216,-85954 }, { 217,-85954 }, { 218,-85954 }, { 219,-85954 }, + { 220,-85954 }, { 221,-85954 }, { 222,-85954 }, { 223,-85954 }, { 224,-85954 }, + { 225,-85954 }, { 226,-85954 }, { 227,-85954 }, { 228,-85954 }, { 229,-85954 }, + + { 230,-85954 }, { 231,-85954 }, { 232,-85954 }, { 233,-85954 }, { 234,-85954 }, + { 235,-85954 }, { 236,-85954 }, { 237,-85954 }, { 238,-85954 }, { 239,-85954 }, + { 240,-85954 }, { 241,-85954 }, { 242,-85954 }, { 243,-85954 }, { 244,-85954 }, + { 245,-85954 }, { 246,-85954 }, { 247,-85954 }, { 248,-85954 }, { 249,-85954 }, + { 250,-85954 }, { 251,-85954 }, { 252,-85954 }, { 253,-85954 }, { 254,-85954 }, + { 255,-85954 }, { 0, 42 }, { 0,5912 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-86211 }, { 49,-86211 }, { 50,-86211 }, { 51,-86211 }, { 52,-86211 }, + { 53,-86211 }, { 54,-86211 }, { 55,-86211 }, { 56,-86211 }, { 57,-86211 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-86211 }, { 66,-86211 }, { 67,-86211 }, + { 68,-86211 }, { 69,-86211 }, { 70,-86211 }, { 71,-86211 }, { 72,-86211 }, + + { 73,-86211 }, { 74,-86211 }, { 75,-86211 }, { 76,-86211 }, { 77,-86211 }, + { 78,-86211 }, { 79,-86211 }, { 80,-86211 }, { 81,-86211 }, { 82,-86211 }, + { 83,-86211 }, { 84,-86211 }, { 85,-86211 }, { 86,-86211 }, { 87,-86211 }, + { 88,-86211 }, { 89,-86211 }, { 90,-86211 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-86211 }, { 0, 0 }, { 97,-86211 }, + { 98,-86211 }, { 99,-86211 }, { 100,-86211 }, { 101,-86211 }, { 102,-86211 }, + { 103,-86211 }, { 104,-86211 }, { 105,-86211 }, { 106,-86211 }, { 107,-86211 }, + { 108,-86211 }, { 109,-86211 }, { 110,-86211 }, { 111,-86211 }, { 112,-86211 }, + { 113,-86211 }, { 114,-86211 }, { 115,-86211 }, { 116,-86211 }, { 117,-86211 }, + { 118,-86211 }, { 119,-86211 }, { 120,-86211 }, { 121,-86211 }, { 122,-86211 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-86211 }, + { 128,-86211 }, { 129,-86211 }, { 130,-86211 }, { 131,-86211 }, { 132,-86211 }, + { 133,-86211 }, { 134,-86211 }, { 135,-86211 }, { 136,-86211 }, { 137,-86211 }, + { 138,-86211 }, { 139,-86211 }, { 140,-86211 }, { 141,-86211 }, { 142,-86211 }, + { 143,-86211 }, { 144,-86211 }, { 145,-86211 }, { 146,-86211 }, { 147,-86211 }, + { 148,-86211 }, { 149,-86211 }, { 150,-86211 }, { 151,-86211 }, { 152,-86211 }, + { 153,-86211 }, { 154,-86211 }, { 155,-86211 }, { 156,-86211 }, { 157,-86211 }, + { 158,-86211 }, { 159,-86211 }, { 160,-86211 }, { 161,-86211 }, { 162,-86211 }, + { 163,-86211 }, { 164,-86211 }, { 165,-86211 }, { 166,-86211 }, { 167,-86211 }, + { 168,-86211 }, { 169,-86211 }, { 170,-86211 }, { 171,-86211 }, { 172,-86211 }, + + { 173,-86211 }, { 174,-86211 }, { 175,-86211 }, { 176,-86211 }, { 177,-86211 }, + { 178,-86211 }, { 179,-86211 }, { 180,-86211 }, { 181,-86211 }, { 182,-86211 }, + { 183,-86211 }, { 184,-86211 }, { 185,-86211 }, { 186,-86211 }, { 187,-86211 }, + { 188,-86211 }, { 189,-86211 }, { 190,-86211 }, { 191,-86211 }, { 192,-86211 }, + { 193,-86211 }, { 194,-86211 }, { 195,-86211 }, { 196,-86211 }, { 197,-86211 }, + { 198,-86211 }, { 199,-86211 }, { 200,-86211 }, { 201,-86211 }, { 202,-86211 }, + { 203,-86211 }, { 204,-86211 }, { 205,-86211 }, { 206,-86211 }, { 207,-86211 }, + { 208,-86211 }, { 209,-86211 }, { 210,-86211 }, { 211,-86211 }, { 212,-86211 }, + { 213,-86211 }, { 214,-86211 }, { 215,-86211 }, { 216,-86211 }, { 217,-86211 }, + { 218,-86211 }, { 219,-86211 }, { 220,-86211 }, { 221,-86211 }, { 222,-86211 }, + + { 223,-86211 }, { 224,-86211 }, { 225,-86211 }, { 226,-86211 }, { 227,-86211 }, + { 228,-86211 }, { 229,-86211 }, { 230,-86211 }, { 231,-86211 }, { 232,-86211 }, + { 233,-86211 }, { 234,-86211 }, { 235,-86211 }, { 236,-86211 }, { 237,-86211 }, + { 238,-86211 }, { 239,-86211 }, { 240,-86211 }, { 241,-86211 }, { 242,-86211 }, + { 243,-86211 }, { 244,-86211 }, { 245,-86211 }, { 246,-86211 }, { 247,-86211 }, + { 248,-86211 }, { 249,-86211 }, { 250,-86211 }, { 251,-86211 }, { 252,-86211 }, + { 253,-86211 }, { 254,-86211 }, { 255,-86211 }, { 0, 75 }, { 0,5655 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-86468 }, { 49,-86468 }, { 50,-86468 }, + { 51,-86468 }, { 52,-86468 }, { 53,-86468 }, { 54,-86468 }, { 55,-86468 }, + { 56,-86468 }, { 57,-86468 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-86468 }, + + { 66,-86468 }, { 67,-86468 }, { 68,-86468 }, { 69,-86468 }, { 70,-86468 }, + { 71,-86468 }, { 72,-86468 }, { 73,-86468 }, { 74,-86468 }, { 75,-86468 }, + { 76,-86468 }, { 77,-86468 }, { 78,-86468 }, { 79,-86468 }, { 80,-86468 }, + { 81,-86468 }, { 82,-86468 }, { 83,-86468 }, { 84,-86468 }, { 85,-86468 }, + { 86,-86468 }, { 87,-86468 }, { 88,-86468 }, { 89,-86468 }, { 90,-86468 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-86468 }, + { 0, 0 }, { 97,-86468 }, { 98,-86468 }, { 99,-86468 }, { 100,-86468 }, + { 101,-86468 }, { 102,-86468 }, { 103,-86468 }, { 104,-86468 }, { 105,-86468 }, + { 106,-86468 }, { 107,-86468 }, { 108,-86468 }, { 109,-86468 }, { 110,-86468 }, + { 111,-86468 }, { 112,-86468 }, { 113,-86468 }, { 114,-86468 }, { 115,-86468 }, + + { 116,-86468 }, { 117,-86468 }, { 118,-86468 }, { 119,-86468 }, { 120,-86468 }, + { 121,-86468 }, { 122,-86468 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-86468 }, { 128,-86468 }, { 129,-86468 }, { 130,-86468 }, + { 131,-86468 }, { 132,-86468 }, { 133,-86468 }, { 134,-86468 }, { 135,-86468 }, + { 136,-86468 }, { 137,-86468 }, { 138,-86468 }, { 139,-86468 }, { 140,-86468 }, + { 141,-86468 }, { 142,-86468 }, { 143,-86468 }, { 144,-86468 }, { 145,-86468 }, + { 146,-86468 }, { 147,-86468 }, { 148,-86468 }, { 149,-86468 }, { 150,-86468 }, + { 151,-86468 }, { 152,-86468 }, { 153,-86468 }, { 154,-86468 }, { 155,-86468 }, + { 156,-86468 }, { 157,-86468 }, { 158,-86468 }, { 159,-86468 }, { 160,-86468 }, + { 161,-86468 }, { 162,-86468 }, { 163,-86468 }, { 164,-86468 }, { 165,-86468 }, + + { 166,-86468 }, { 167,-86468 }, { 168,-86468 }, { 169,-86468 }, { 170,-86468 }, + { 171,-86468 }, { 172,-86468 }, { 173,-86468 }, { 174,-86468 }, { 175,-86468 }, + { 176,-86468 }, { 177,-86468 }, { 178,-86468 }, { 179,-86468 }, { 180,-86468 }, + { 181,-86468 }, { 182,-86468 }, { 183,-86468 }, { 184,-86468 }, { 185,-86468 }, + { 186,-86468 }, { 187,-86468 }, { 188,-86468 }, { 189,-86468 }, { 190,-86468 }, + { 191,-86468 }, { 192,-86468 }, { 193,-86468 }, { 194,-86468 }, { 195,-86468 }, + { 196,-86468 }, { 197,-86468 }, { 198,-86468 }, { 199,-86468 }, { 200,-86468 }, + { 201,-86468 }, { 202,-86468 }, { 203,-86468 }, { 204,-86468 }, { 205,-86468 }, + { 206,-86468 }, { 207,-86468 }, { 208,-86468 }, { 209,-86468 }, { 210,-86468 }, + { 211,-86468 }, { 212,-86468 }, { 213,-86468 }, { 214,-86468 }, { 215,-86468 }, + + { 216,-86468 }, { 217,-86468 }, { 218,-86468 }, { 219,-86468 }, { 220,-86468 }, + { 221,-86468 }, { 222,-86468 }, { 223,-86468 }, { 224,-86468 }, { 225,-86468 }, + { 226,-86468 }, { 227,-86468 }, { 228,-86468 }, { 229,-86468 }, { 230,-86468 }, + { 231,-86468 }, { 232,-86468 }, { 233,-86468 }, { 234,-86468 }, { 235,-86468 }, + { 236,-86468 }, { 237,-86468 }, { 238,-86468 }, { 239,-86468 }, { 240,-86468 }, + { 241,-86468 }, { 242,-86468 }, { 243,-86468 }, { 244,-86468 }, { 245,-86468 }, + { 246,-86468 }, { 247,-86468 }, { 248,-86468 }, { 249,-86468 }, { 250,-86468 }, + { 251,-86468 }, { 252,-86468 }, { 253,-86468 }, { 254,-86468 }, { 255,-86468 }, + { 0, 131 }, { 0,5398 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-86725 }, + { 49,-86725 }, { 50,-86725 }, { 51,-86725 }, { 52,-86725 }, { 53,-86725 }, + { 54,-86725 }, { 55,-86725 }, { 56,-86725 }, { 57,-86725 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-86725 }, { 66,-86725 }, { 67,1799 }, { 68,-86725 }, + { 69,-86725 }, { 70,-86725 }, { 71,-86725 }, { 72,-86725 }, { 73,-86725 }, + { 74,-86725 }, { 75,-86725 }, { 76,-86725 }, { 77,-86725 }, { 78,-86725 }, + { 79,-86725 }, { 80,-86725 }, { 81,-86725 }, { 82,-86725 }, { 83,-86725 }, + { 84,-86725 }, { 85,-86725 }, { 86,-86725 }, { 87,-86725 }, { 88,-86725 }, + { 89,-86725 }, { 90,-86725 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-86725 }, { 0, 0 }, { 97,-86725 }, { 98,-86725 }, + { 99,1799 }, { 100,-86725 }, { 101,-86725 }, { 102,-86725 }, { 103,-86725 }, + { 104,-86725 }, { 105,-86725 }, { 106,-86725 }, { 107,-86725 }, { 108,-86725 }, + + { 109,-86725 }, { 110,-86725 }, { 111,-86725 }, { 112,-86725 }, { 113,-86725 }, + { 114,-86725 }, { 115,-86725 }, { 116,-86725 }, { 117,-86725 }, { 118,-86725 }, + { 119,-86725 }, { 120,-86725 }, { 121,-86725 }, { 122,-86725 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-86725 }, { 128,-86725 }, + { 129,-86725 }, { 130,-86725 }, { 131,-86725 }, { 132,-86725 }, { 133,-86725 }, + { 134,-86725 }, { 135,-86725 }, { 136,-86725 }, { 137,-86725 }, { 138,-86725 }, + { 139,-86725 }, { 140,-86725 }, { 141,-86725 }, { 142,-86725 }, { 143,-86725 }, + { 144,-86725 }, { 145,-86725 }, { 146,-86725 }, { 147,-86725 }, { 148,-86725 }, + { 149,-86725 }, { 150,-86725 }, { 151,-86725 }, { 152,-86725 }, { 153,-86725 }, + { 154,-86725 }, { 155,-86725 }, { 156,-86725 }, { 157,-86725 }, { 158,-86725 }, + + { 159,-86725 }, { 160,-86725 }, { 161,-86725 }, { 162,-86725 }, { 163,-86725 }, + { 164,-86725 }, { 165,-86725 }, { 166,-86725 }, { 167,-86725 }, { 168,-86725 }, + { 169,-86725 }, { 170,-86725 }, { 171,-86725 }, { 172,-86725 }, { 173,-86725 }, + { 174,-86725 }, { 175,-86725 }, { 176,-86725 }, { 177,-86725 }, { 178,-86725 }, + { 179,-86725 }, { 180,-86725 }, { 181,-86725 }, { 182,-86725 }, { 183,-86725 }, + { 184,-86725 }, { 185,-86725 }, { 186,-86725 }, { 187,-86725 }, { 188,-86725 }, + { 189,-86725 }, { 190,-86725 }, { 191,-86725 }, { 192,-86725 }, { 193,-86725 }, + { 194,-86725 }, { 195,-86725 }, { 196,-86725 }, { 197,-86725 }, { 198,-86725 }, + { 199,-86725 }, { 200,-86725 }, { 201,-86725 }, { 202,-86725 }, { 203,-86725 }, + { 204,-86725 }, { 205,-86725 }, { 206,-86725 }, { 207,-86725 }, { 208,-86725 }, + + { 209,-86725 }, { 210,-86725 }, { 211,-86725 }, { 212,-86725 }, { 213,-86725 }, + { 214,-86725 }, { 215,-86725 }, { 216,-86725 }, { 217,-86725 }, { 218,-86725 }, + { 219,-86725 }, { 220,-86725 }, { 221,-86725 }, { 222,-86725 }, { 223,-86725 }, + { 224,-86725 }, { 225,-86725 }, { 226,-86725 }, { 227,-86725 }, { 228,-86725 }, + { 229,-86725 }, { 230,-86725 }, { 231,-86725 }, { 232,-86725 }, { 233,-86725 }, + { 234,-86725 }, { 235,-86725 }, { 236,-86725 }, { 237,-86725 }, { 238,-86725 }, + { 239,-86725 }, { 240,-86725 }, { 241,-86725 }, { 242,-86725 }, { 243,-86725 }, + { 244,-86725 }, { 245,-86725 }, { 246,-86725 }, { 247,-86725 }, { 248,-86725 }, + { 249,-86725 }, { 250,-86725 }, { 251,-86725 }, { 252,-86725 }, { 253,-86725 }, + { 254,-86725 }, { 255,-86725 }, { 0, 27 }, { 0,5141 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-86982 }, { 49,-86982 }, { 50,-86982 }, { 51,-86982 }, + + { 52,-86982 }, { 53,-86982 }, { 54,-86982 }, { 55,-86982 }, { 56,-86982 }, + { 57,-86982 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-86982 }, { 66,-86982 }, + { 67,-86982 }, { 68,-86982 }, { 69,-86982 }, { 70,-86982 }, { 71,-86982 }, + { 72,-86982 }, { 73,-86982 }, { 74,-86982 }, { 75,-86982 }, { 76,-86982 }, + { 77,-86982 }, { 78,-86982 }, { 79,-86982 }, { 80,-86982 }, { 81,-86982 }, + { 82,-86982 }, { 83,-86982 }, { 84,-86982 }, { 85,-86982 }, { 86,-86982 }, + { 87,-86982 }, { 88,-86982 }, { 89,-86982 }, { 90,-86982 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-86982 }, { 0, 0 }, + { 97,-86982 }, { 98,-86982 }, { 99,-86982 }, { 100,-86982 }, { 101,-86982 }, + + { 102,-86982 }, { 103,-86982 }, { 104,-86982 }, { 105,-86982 }, { 106,-86982 }, + { 107,-86982 }, { 108,-86982 }, { 109,-86982 }, { 110,-86982 }, { 111,-86982 }, + { 112,-86982 }, { 113,-86982 }, { 114,-86982 }, { 115,-86982 }, { 116,-86982 }, + { 117,-86982 }, { 118,-86982 }, { 119,-86982 }, { 120,-86982 }, { 121,-86982 }, + { 122,-86982 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-86982 }, { 128,-86982 }, { 129,-86982 }, { 130,-86982 }, { 131,-86982 }, + { 132,-86982 }, { 133,-86982 }, { 134,-86982 }, { 135,-86982 }, { 136,-86982 }, + { 137,-86982 }, { 138,-86982 }, { 139,-86982 }, { 140,-86982 }, { 141,-86982 }, + { 142,-86982 }, { 143,-86982 }, { 144,-86982 }, { 145,-86982 }, { 146,-86982 }, + { 147,-86982 }, { 148,-86982 }, { 149,-86982 }, { 150,-86982 }, { 151,-86982 }, + + { 152,-86982 }, { 153,-86982 }, { 154,-86982 }, { 155,-86982 }, { 156,-86982 }, + { 157,-86982 }, { 158,-86982 }, { 159,-86982 }, { 160,-86982 }, { 161,-86982 }, + { 162,-86982 }, { 163,-86982 }, { 164,-86982 }, { 165,-86982 }, { 166,-86982 }, + { 167,-86982 }, { 168,-86982 }, { 169,-86982 }, { 170,-86982 }, { 171,-86982 }, + { 172,-86982 }, { 173,-86982 }, { 174,-86982 }, { 175,-86982 }, { 176,-86982 }, + { 177,-86982 }, { 178,-86982 }, { 179,-86982 }, { 180,-86982 }, { 181,-86982 }, + { 182,-86982 }, { 183,-86982 }, { 184,-86982 }, { 185,-86982 }, { 186,-86982 }, + { 187,-86982 }, { 188,-86982 }, { 189,-86982 }, { 190,-86982 }, { 191,-86982 }, + { 192,-86982 }, { 193,-86982 }, { 194,-86982 }, { 195,-86982 }, { 196,-86982 }, + { 197,-86982 }, { 198,-86982 }, { 199,-86982 }, { 200,-86982 }, { 201,-86982 }, + + { 202,-86982 }, { 203,-86982 }, { 204,-86982 }, { 205,-86982 }, { 206,-86982 }, + { 207,-86982 }, { 208,-86982 }, { 209,-86982 }, { 210,-86982 }, { 211,-86982 }, + { 212,-86982 }, { 213,-86982 }, { 214,-86982 }, { 215,-86982 }, { 216,-86982 }, + { 217,-86982 }, { 218,-86982 }, { 219,-86982 }, { 220,-86982 }, { 221,-86982 }, + { 222,-86982 }, { 223,-86982 }, { 224,-86982 }, { 225,-86982 }, { 226,-86982 }, + { 227,-86982 }, { 228,-86982 }, { 229,-86982 }, { 230,-86982 }, { 231,-86982 }, + { 232,-86982 }, { 233,-86982 }, { 234,-86982 }, { 235,-86982 }, { 236,-86982 }, + { 237,-86982 }, { 238,-86982 }, { 239,-86982 }, { 240,-86982 }, { 241,-86982 }, + { 242,-86982 }, { 243,-86982 }, { 244,-86982 }, { 245,-86982 }, { 246,-86982 }, + { 247,-86982 }, { 248,-86982 }, { 249,-86982 }, { 250,-86982 }, { 251,-86982 }, + + { 252,-86982 }, { 253,-86982 }, { 254,-86982 }, { 255,-86982 }, { 0, 131 }, + { 0,4884 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-87239 }, { 49,-87239 }, + { 50,-87239 }, { 51,-87239 }, { 52,-87239 }, { 53,-87239 }, { 54,-87239 }, + { 55,-87239 }, { 56,-87239 }, { 57,-87239 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-87239 }, { 66,-87239 }, { 67,1542 }, { 68,-87239 }, { 69,-87239 }, + { 70,-87239 }, { 71,-87239 }, { 72,-87239 }, { 73,-87239 }, { 74,-87239 }, + { 75,-87239 }, { 76,-87239 }, { 77,-87239 }, { 78,-87239 }, { 79,-87239 }, + { 80,-87239 }, { 81,-87239 }, { 82,-87239 }, { 83,-87239 }, { 84,-87239 }, + { 85,-87239 }, { 86,-87239 }, { 87,-87239 }, { 88,-87239 }, { 89,-87239 }, + { 90,-87239 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 95,-87239 }, { 0, 0 }, { 97,-87239 }, { 98,-87239 }, { 99,1542 }, + { 100,-87239 }, { 101,-87239 }, { 102,-87239 }, { 103,-87239 }, { 104,-87239 }, + { 105,-87239 }, { 106,-87239 }, { 107,-87239 }, { 108,-87239 }, { 109,-87239 }, + { 110,-87239 }, { 111,-87239 }, { 112,-87239 }, { 113,-87239 }, { 114,-87239 }, + { 115,-87239 }, { 116,-87239 }, { 117,-87239 }, { 118,-87239 }, { 119,-87239 }, + { 120,-87239 }, { 121,-87239 }, { 122,-87239 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-87239 }, { 128,-87239 }, { 129,-87239 }, + { 130,-87239 }, { 131,-87239 }, { 132,-87239 }, { 133,-87239 }, { 134,-87239 }, + { 135,-87239 }, { 136,-87239 }, { 137,-87239 }, { 138,-87239 }, { 139,-87239 }, + { 140,-87239 }, { 141,-87239 }, { 142,-87239 }, { 143,-87239 }, { 144,-87239 }, + + { 145,-87239 }, { 146,-87239 }, { 147,-87239 }, { 148,-87239 }, { 149,-87239 }, + { 150,-87239 }, { 151,-87239 }, { 152,-87239 }, { 153,-87239 }, { 154,-87239 }, + { 155,-87239 }, { 156,-87239 }, { 157,-87239 }, { 158,-87239 }, { 159,-87239 }, + { 160,-87239 }, { 161,-87239 }, { 162,-87239 }, { 163,-87239 }, { 164,-87239 }, + { 165,-87239 }, { 166,-87239 }, { 167,-87239 }, { 168,-87239 }, { 169,-87239 }, + { 170,-87239 }, { 171,-87239 }, { 172,-87239 }, { 173,-87239 }, { 174,-87239 }, + { 175,-87239 }, { 176,-87239 }, { 177,-87239 }, { 178,-87239 }, { 179,-87239 }, + { 180,-87239 }, { 181,-87239 }, { 182,-87239 }, { 183,-87239 }, { 184,-87239 }, + { 185,-87239 }, { 186,-87239 }, { 187,-87239 }, { 188,-87239 }, { 189,-87239 }, + { 190,-87239 }, { 191,-87239 }, { 192,-87239 }, { 193,-87239 }, { 194,-87239 }, + + { 195,-87239 }, { 196,-87239 }, { 197,-87239 }, { 198,-87239 }, { 199,-87239 }, + { 200,-87239 }, { 201,-87239 }, { 202,-87239 }, { 203,-87239 }, { 204,-87239 }, + { 205,-87239 }, { 206,-87239 }, { 207,-87239 }, { 208,-87239 }, { 209,-87239 }, + { 210,-87239 }, { 211,-87239 }, { 212,-87239 }, { 213,-87239 }, { 214,-87239 }, + { 215,-87239 }, { 216,-87239 }, { 217,-87239 }, { 218,-87239 }, { 219,-87239 }, + { 220,-87239 }, { 221,-87239 }, { 222,-87239 }, { 223,-87239 }, { 224,-87239 }, + { 225,-87239 }, { 226,-87239 }, { 227,-87239 }, { 228,-87239 }, { 229,-87239 }, + { 230,-87239 }, { 231,-87239 }, { 232,-87239 }, { 233,-87239 }, { 234,-87239 }, + { 235,-87239 }, { 236,-87239 }, { 237,-87239 }, { 238,-87239 }, { 239,-87239 }, + { 240,-87239 }, { 241,-87239 }, { 242,-87239 }, { 243,-87239 }, { 244,-87239 }, + + { 245,-87239 }, { 246,-87239 }, { 247,-87239 }, { 248,-87239 }, { 249,-87239 }, + { 250,-87239 }, { 251,-87239 }, { 252,-87239 }, { 253,-87239 }, { 254,-87239 }, + { 255,-87239 }, { 0, 131 }, { 0,4627 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-87496 }, { 49,-87496 }, { 50,-87496 }, { 51,-87496 }, { 52,-87496 }, + { 53,-87496 }, { 54,-87496 }, { 55,-87496 }, { 56,-87496 }, { 57,-87496 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-87496 }, { 66,-87496 }, { 67,-87496 }, + { 68,-87496 }, { 69,-87496 }, { 70,-87496 }, { 71,-87496 }, { 72,-87496 }, + { 73,-87496 }, { 74,-87496 }, { 75,-87496 }, { 76,-87496 }, { 77,-87496 }, + { 78,-87496 }, { 79,-87496 }, { 80,-87496 }, { 81,-87496 }, { 82,-87496 }, + { 83,-87496 }, { 84,-87496 }, { 85,-87496 }, { 86,-87496 }, { 87,-87496 }, + + { 88,-87496 }, { 89,-87496 }, { 90,-87496 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,1542 }, { 0, 0 }, { 97,-87496 }, + { 98,-87496 }, { 99,-87496 }, { 100,-87496 }, { 101,-87496 }, { 102,-87496 }, + { 103,-87496 }, { 104,-87496 }, { 105,-87496 }, { 106,-87496 }, { 107,-87496 }, + { 108,-87496 }, { 109,-87496 }, { 110,-87496 }, { 111,-87496 }, { 112,-87496 }, + { 113,-87496 }, { 114,-87496 }, { 115,-87496 }, { 116,-87496 }, { 117,-87496 }, + { 118,-87496 }, { 119,-87496 }, { 120,-87496 }, { 121,-87496 }, { 122,-87496 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-87496 }, + { 128,-87496 }, { 129,-87496 }, { 130,-87496 }, { 131,-87496 }, { 132,-87496 }, + { 133,-87496 }, { 134,-87496 }, { 135,-87496 }, { 136,-87496 }, { 137,-87496 }, + + { 138,-87496 }, { 139,-87496 }, { 140,-87496 }, { 141,-87496 }, { 142,-87496 }, + { 143,-87496 }, { 144,-87496 }, { 145,-87496 }, { 146,-87496 }, { 147,-87496 }, + { 148,-87496 }, { 149,-87496 }, { 150,-87496 }, { 151,-87496 }, { 152,-87496 }, + { 153,-87496 }, { 154,-87496 }, { 155,-87496 }, { 156,-87496 }, { 157,-87496 }, + { 158,-87496 }, { 159,-87496 }, { 160,-87496 }, { 161,-87496 }, { 162,-87496 }, + { 163,-87496 }, { 164,-87496 }, { 165,-87496 }, { 166,-87496 }, { 167,-87496 }, + { 168,-87496 }, { 169,-87496 }, { 170,-87496 }, { 171,-87496 }, { 172,-87496 }, + { 173,-87496 }, { 174,-87496 }, { 175,-87496 }, { 176,-87496 }, { 177,-87496 }, + { 178,-87496 }, { 179,-87496 }, { 180,-87496 }, { 181,-87496 }, { 182,-87496 }, + { 183,-87496 }, { 184,-87496 }, { 185,-87496 }, { 186,-87496 }, { 187,-87496 }, + + { 188,-87496 }, { 189,-87496 }, { 190,-87496 }, { 191,-87496 }, { 192,-87496 }, + { 193,-87496 }, { 194,-87496 }, { 195,-87496 }, { 196,-87496 }, { 197,-87496 }, + { 198,-87496 }, { 199,-87496 }, { 200,-87496 }, { 201,-87496 }, { 202,-87496 }, + { 203,-87496 }, { 204,-87496 }, { 205,-87496 }, { 206,-87496 }, { 207,-87496 }, + { 208,-87496 }, { 209,-87496 }, { 210,-87496 }, { 211,-87496 }, { 212,-87496 }, + { 213,-87496 }, { 214,-87496 }, { 215,-87496 }, { 216,-87496 }, { 217,-87496 }, + { 218,-87496 }, { 219,-87496 }, { 220,-87496 }, { 221,-87496 }, { 222,-87496 }, + { 223,-87496 }, { 224,-87496 }, { 225,-87496 }, { 226,-87496 }, { 227,-87496 }, + { 228,-87496 }, { 229,-87496 }, { 230,-87496 }, { 231,-87496 }, { 232,-87496 }, + { 233,-87496 }, { 234,-87496 }, { 235,-87496 }, { 236,-87496 }, { 237,-87496 }, + + { 238,-87496 }, { 239,-87496 }, { 240,-87496 }, { 241,-87496 }, { 242,-87496 }, + { 243,-87496 }, { 244,-87496 }, { 245,-87496 }, { 246,-87496 }, { 247,-87496 }, + { 248,-87496 }, { 249,-87496 }, { 250,-87496 }, { 251,-87496 }, { 252,-87496 }, + { 253,-87496 }, { 254,-87496 }, { 255,-87496 }, { 0, 131 }, { 0,4370 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-87753 }, { 49,-87753 }, { 50,-87753 }, + { 51,-87753 }, { 52,-87753 }, { 53,-87753 }, { 54,-87753 }, { 55,-87753 }, + { 56,-87753 }, { 57,-87753 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-87753 }, + { 66,-87753 }, { 67,-87753 }, { 68,-87753 }, { 69,-87753 }, { 70,-87753 }, + { 71,-87753 }, { 72,-87753 }, { 73,-87753 }, { 74,-87753 }, { 75,-87753 }, + { 76,-87753 }, { 77,-87753 }, { 78,-87753 }, { 79,-87753 }, { 80,1542 }, + + { 81,-87753 }, { 82,-87753 }, { 83,-87753 }, { 84,-87753 }, { 85,-87753 }, + { 86,-87753 }, { 87,-87753 }, { 88,-87753 }, { 89,-87753 }, { 90,-87753 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-87753 }, + { 0, 0 }, { 97,-87753 }, { 98,-87753 }, { 99,-87753 }, { 100,-87753 }, + { 101,-87753 }, { 102,-87753 }, { 103,-87753 }, { 104,-87753 }, { 105,-87753 }, + { 106,-87753 }, { 107,-87753 }, { 108,-87753 }, { 109,-87753 }, { 110,-87753 }, + { 111,-87753 }, { 112,1542 }, { 113,-87753 }, { 114,-87753 }, { 115,-87753 }, + { 116,-87753 }, { 117,-87753 }, { 118,-87753 }, { 119,-87753 }, { 120,-87753 }, + { 121,-87753 }, { 122,-87753 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-87753 }, { 128,-87753 }, { 129,-87753 }, { 130,-87753 }, + + { 131,-87753 }, { 132,-87753 }, { 133,-87753 }, { 134,-87753 }, { 135,-87753 }, + { 136,-87753 }, { 137,-87753 }, { 138,-87753 }, { 139,-87753 }, { 140,-87753 }, + { 141,-87753 }, { 142,-87753 }, { 143,-87753 }, { 144,-87753 }, { 145,-87753 }, + { 146,-87753 }, { 147,-87753 }, { 148,-87753 }, { 149,-87753 }, { 150,-87753 }, + { 151,-87753 }, { 152,-87753 }, { 153,-87753 }, { 154,-87753 }, { 155,-87753 }, + { 156,-87753 }, { 157,-87753 }, { 158,-87753 }, { 159,-87753 }, { 160,-87753 }, + { 161,-87753 }, { 162,-87753 }, { 163,-87753 }, { 164,-87753 }, { 165,-87753 }, + { 166,-87753 }, { 167,-87753 }, { 168,-87753 }, { 169,-87753 }, { 170,-87753 }, + { 171,-87753 }, { 172,-87753 }, { 173,-87753 }, { 174,-87753 }, { 175,-87753 }, + { 176,-87753 }, { 177,-87753 }, { 178,-87753 }, { 179,-87753 }, { 180,-87753 }, + + { 181,-87753 }, { 182,-87753 }, { 183,-87753 }, { 184,-87753 }, { 185,-87753 }, + { 186,-87753 }, { 187,-87753 }, { 188,-87753 }, { 189,-87753 }, { 190,-87753 }, + { 191,-87753 }, { 192,-87753 }, { 193,-87753 }, { 194,-87753 }, { 195,-87753 }, + { 196,-87753 }, { 197,-87753 }, { 198,-87753 }, { 199,-87753 }, { 200,-87753 }, + { 201,-87753 }, { 202,-87753 }, { 203,-87753 }, { 204,-87753 }, { 205,-87753 }, + { 206,-87753 }, { 207,-87753 }, { 208,-87753 }, { 209,-87753 }, { 210,-87753 }, + { 211,-87753 }, { 212,-87753 }, { 213,-87753 }, { 214,-87753 }, { 215,-87753 }, + { 216,-87753 }, { 217,-87753 }, { 218,-87753 }, { 219,-87753 }, { 220,-87753 }, + { 221,-87753 }, { 222,-87753 }, { 223,-87753 }, { 224,-87753 }, { 225,-87753 }, + { 226,-87753 }, { 227,-87753 }, { 228,-87753 }, { 229,-87753 }, { 230,-87753 }, + + { 231,-87753 }, { 232,-87753 }, { 233,-87753 }, { 234,-87753 }, { 235,-87753 }, + { 236,-87753 }, { 237,-87753 }, { 238,-87753 }, { 239,-87753 }, { 240,-87753 }, + { 241,-87753 }, { 242,-87753 }, { 243,-87753 }, { 244,-87753 }, { 245,-87753 }, + { 246,-87753 }, { 247,-87753 }, { 248,-87753 }, { 249,-87753 }, { 250,-87753 }, + { 251,-87753 }, { 252,-87753 }, { 253,-87753 }, { 254,-87753 }, { 255,-87753 }, + { 0, 79 }, { 0,4113 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-88010 }, + { 49,-88010 }, { 50,-88010 }, { 51,-88010 }, { 52,-88010 }, { 53,-88010 }, + { 54,-88010 }, { 55,-88010 }, { 56,-88010 }, { 57,-88010 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-88010 }, { 66,-88010 }, { 67,-88010 }, { 68,-88010 }, + { 69,-88010 }, { 70,-88010 }, { 71,-88010 }, { 72,-88010 }, { 73,-88010 }, + + { 74,-88010 }, { 75,-88010 }, { 76,-88010 }, { 77,-88010 }, { 78,-88010 }, + { 79,-88010 }, { 80,-88010 }, { 81,-88010 }, { 82,-88010 }, { 83,-88010 }, + { 84,-88010 }, { 85,-88010 }, { 86,-88010 }, { 87,-88010 }, { 88,-88010 }, + { 89,-88010 }, { 90,-88010 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-88010 }, { 0, 0 }, { 97,-88010 }, { 98,-88010 }, + { 99,-88010 }, { 100,-88010 }, { 101,-88010 }, { 102,-88010 }, { 103,-88010 }, + { 104,-88010 }, { 105,-88010 }, { 106,-88010 }, { 107,-88010 }, { 108,-88010 }, + { 109,-88010 }, { 110,-88010 }, { 111,-88010 }, { 112,-88010 }, { 113,-88010 }, + { 114,-88010 }, { 115,-88010 }, { 116,-88010 }, { 117,-88010 }, { 118,-88010 }, + { 119,-88010 }, { 120,-88010 }, { 121,-88010 }, { 122,-88010 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-88010 }, { 128,-88010 }, + { 129,-88010 }, { 130,-88010 }, { 131,-88010 }, { 132,-88010 }, { 133,-88010 }, + { 134,-88010 }, { 135,-88010 }, { 136,-88010 }, { 137,-88010 }, { 138,-88010 }, + { 139,-88010 }, { 140,-88010 }, { 141,-88010 }, { 142,-88010 }, { 143,-88010 }, + { 144,-88010 }, { 145,-88010 }, { 146,-88010 }, { 147,-88010 }, { 148,-88010 }, + { 149,-88010 }, { 150,-88010 }, { 151,-88010 }, { 152,-88010 }, { 153,-88010 }, + { 154,-88010 }, { 155,-88010 }, { 156,-88010 }, { 157,-88010 }, { 158,-88010 }, + { 159,-88010 }, { 160,-88010 }, { 161,-88010 }, { 162,-88010 }, { 163,-88010 }, + { 164,-88010 }, { 165,-88010 }, { 166,-88010 }, { 167,-88010 }, { 168,-88010 }, + { 169,-88010 }, { 170,-88010 }, { 171,-88010 }, { 172,-88010 }, { 173,-88010 }, + + { 174,-88010 }, { 175,-88010 }, { 176,-88010 }, { 177,-88010 }, { 178,-88010 }, + { 179,-88010 }, { 180,-88010 }, { 181,-88010 }, { 182,-88010 }, { 183,-88010 }, + { 184,-88010 }, { 185,-88010 }, { 186,-88010 }, { 187,-88010 }, { 188,-88010 }, + { 189,-88010 }, { 190,-88010 }, { 191,-88010 }, { 192,-88010 }, { 193,-88010 }, + { 194,-88010 }, { 195,-88010 }, { 196,-88010 }, { 197,-88010 }, { 198,-88010 }, + { 199,-88010 }, { 200,-88010 }, { 201,-88010 }, { 202,-88010 }, { 203,-88010 }, + { 204,-88010 }, { 205,-88010 }, { 206,-88010 }, { 207,-88010 }, { 208,-88010 }, + { 209,-88010 }, { 210,-88010 }, { 211,-88010 }, { 212,-88010 }, { 213,-88010 }, + { 214,-88010 }, { 215,-88010 }, { 216,-88010 }, { 217,-88010 }, { 218,-88010 }, + { 219,-88010 }, { 220,-88010 }, { 221,-88010 }, { 222,-88010 }, { 223,-88010 }, + + { 224,-88010 }, { 225,-88010 }, { 226,-88010 }, { 227,-88010 }, { 228,-88010 }, + { 229,-88010 }, { 230,-88010 }, { 231,-88010 }, { 232,-88010 }, { 233,-88010 }, + { 234,-88010 }, { 235,-88010 }, { 236,-88010 }, { 237,-88010 }, { 238,-88010 }, + { 239,-88010 }, { 240,-88010 }, { 241,-88010 }, { 242,-88010 }, { 243,-88010 }, + { 244,-88010 }, { 245,-88010 }, { 246,-88010 }, { 247,-88010 }, { 248,-88010 }, + { 249,-88010 }, { 250,-88010 }, { 251,-88010 }, { 252,-88010 }, { 253,-88010 }, + { 254,-88010 }, { 255,-88010 }, { 0, 131 }, { 0,3856 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-88267 }, { 49,-88267 }, { 50,-88267 }, { 51,-88267 }, + { 52,-88267 }, { 53,-88267 }, { 54,-88267 }, { 55,-88267 }, { 56,-88267 }, + { 57,-88267 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-88267 }, { 66,-88267 }, + + { 67,-88267 }, { 68,-88267 }, { 69,1285 }, { 70,-88267 }, { 71,-88267 }, + { 72,-88267 }, { 73,-88267 }, { 74,-88267 }, { 75,-88267 }, { 76,-88267 }, + { 77,-88267 }, { 78,-88267 }, { 79,-88267 }, { 80,-88267 }, { 81,-88267 }, + { 82,-88267 }, { 83,-88267 }, { 84,-88267 }, { 85,-88267 }, { 86,-88267 }, + { 87,-88267 }, { 88,-88267 }, { 89,-88267 }, { 90,-88267 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-88267 }, { 0, 0 }, + { 97,-88267 }, { 98,-88267 }, { 99,-88267 }, { 100,-88267 }, { 101,1285 }, + { 102,-88267 }, { 103,-88267 }, { 104,-88267 }, { 105,-88267 }, { 106,-88267 }, + { 107,-88267 }, { 108,-88267 }, { 109,-88267 }, { 110,-88267 }, { 111,-88267 }, + { 112,-88267 }, { 113,-88267 }, { 114,-88267 }, { 115,-88267 }, { 116,-88267 }, + + { 117,-88267 }, { 118,-88267 }, { 119,-88267 }, { 120,-88267 }, { 121,-88267 }, + { 122,-88267 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-88267 }, { 128,-88267 }, { 129,-88267 }, { 130,-88267 }, { 131,-88267 }, + { 132,-88267 }, { 133,-88267 }, { 134,-88267 }, { 135,-88267 }, { 136,-88267 }, + { 137,-88267 }, { 138,-88267 }, { 139,-88267 }, { 140,-88267 }, { 141,-88267 }, + { 142,-88267 }, { 143,-88267 }, { 144,-88267 }, { 145,-88267 }, { 146,-88267 }, + { 147,-88267 }, { 148,-88267 }, { 149,-88267 }, { 150,-88267 }, { 151,-88267 }, + { 152,-88267 }, { 153,-88267 }, { 154,-88267 }, { 155,-88267 }, { 156,-88267 }, + { 157,-88267 }, { 158,-88267 }, { 159,-88267 }, { 160,-88267 }, { 161,-88267 }, + { 162,-88267 }, { 163,-88267 }, { 164,-88267 }, { 165,-88267 }, { 166,-88267 }, + + { 167,-88267 }, { 168,-88267 }, { 169,-88267 }, { 170,-88267 }, { 171,-88267 }, + { 172,-88267 }, { 173,-88267 }, { 174,-88267 }, { 175,-88267 }, { 176,-88267 }, + { 177,-88267 }, { 178,-88267 }, { 179,-88267 }, { 180,-88267 }, { 181,-88267 }, + { 182,-88267 }, { 183,-88267 }, { 184,-88267 }, { 185,-88267 }, { 186,-88267 }, + { 187,-88267 }, { 188,-88267 }, { 189,-88267 }, { 190,-88267 }, { 191,-88267 }, + { 192,-88267 }, { 193,-88267 }, { 194,-88267 }, { 195,-88267 }, { 196,-88267 }, + { 197,-88267 }, { 198,-88267 }, { 199,-88267 }, { 200,-88267 }, { 201,-88267 }, + { 202,-88267 }, { 203,-88267 }, { 204,-88267 }, { 205,-88267 }, { 206,-88267 }, + { 207,-88267 }, { 208,-88267 }, { 209,-88267 }, { 210,-88267 }, { 211,-88267 }, + { 212,-88267 }, { 213,-88267 }, { 214,-88267 }, { 215,-88267 }, { 216,-88267 }, + + { 217,-88267 }, { 218,-88267 }, { 219,-88267 }, { 220,-88267 }, { 221,-88267 }, + { 222,-88267 }, { 223,-88267 }, { 224,-88267 }, { 225,-88267 }, { 226,-88267 }, + { 227,-88267 }, { 228,-88267 }, { 229,-88267 }, { 230,-88267 }, { 231,-88267 }, + { 232,-88267 }, { 233,-88267 }, { 234,-88267 }, { 235,-88267 }, { 236,-88267 }, + { 237,-88267 }, { 238,-88267 }, { 239,-88267 }, { 240,-88267 }, { 241,-88267 }, + { 242,-88267 }, { 243,-88267 }, { 244,-88267 }, { 245,-88267 }, { 246,-88267 }, + { 247,-88267 }, { 248,-88267 }, { 249,-88267 }, { 250,-88267 }, { 251,-88267 }, + { 252,-88267 }, { 253,-88267 }, { 254,-88267 }, { 255,-88267 }, { 0, 131 }, + { 0,3599 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-88524 }, { 49,-88524 }, + { 50,-88524 }, { 51,-88524 }, { 52,-88524 }, { 53,-88524 }, { 54,-88524 }, + { 55,-88524 }, { 56,-88524 }, { 57,-88524 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-88524 }, { 66,-88524 }, { 67,-88524 }, { 68,-88524 }, { 69,1285 }, + { 70,-88524 }, { 71,-88524 }, { 72,-88524 }, { 73,-88524 }, { 74,-88524 }, + { 75,-88524 }, { 76,-88524 }, { 77,-88524 }, { 78,-88524 }, { 79,-88524 }, + { 80,-88524 }, { 81,-88524 }, { 82,-88524 }, { 83,-88524 }, { 84,-88524 }, + { 85,-88524 }, { 86,-88524 }, { 87,-88524 }, { 88,-88524 }, { 89,-88524 }, + { 90,-88524 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-88524 }, { 0, 0 }, { 97,-88524 }, { 98,-88524 }, { 99,-88524 }, + { 100,-88524 }, { 101,1285 }, { 102,-88524 }, { 103,-88524 }, { 104,-88524 }, + { 105,-88524 }, { 106,-88524 }, { 107,-88524 }, { 108,-88524 }, { 109,-88524 }, + + { 110,-88524 }, { 111,-88524 }, { 112,-88524 }, { 113,-88524 }, { 114,-88524 }, + { 115,-88524 }, { 116,-88524 }, { 117,-88524 }, { 118,-88524 }, { 119,-88524 }, + { 120,-88524 }, { 121,-88524 }, { 122,-88524 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-88524 }, { 128,-88524 }, { 129,-88524 }, + { 130,-88524 }, { 131,-88524 }, { 132,-88524 }, { 133,-88524 }, { 134,-88524 }, + { 135,-88524 }, { 136,-88524 }, { 137,-88524 }, { 138,-88524 }, { 139,-88524 }, + { 140,-88524 }, { 141,-88524 }, { 142,-88524 }, { 143,-88524 }, { 144,-88524 }, + { 145,-88524 }, { 146,-88524 }, { 147,-88524 }, { 148,-88524 }, { 149,-88524 }, + { 150,-88524 }, { 151,-88524 }, { 152,-88524 }, { 153,-88524 }, { 154,-88524 }, + { 155,-88524 }, { 156,-88524 }, { 157,-88524 }, { 158,-88524 }, { 159,-88524 }, + + { 160,-88524 }, { 161,-88524 }, { 162,-88524 }, { 163,-88524 }, { 164,-88524 }, + { 165,-88524 }, { 166,-88524 }, { 167,-88524 }, { 168,-88524 }, { 169,-88524 }, + { 170,-88524 }, { 171,-88524 }, { 172,-88524 }, { 173,-88524 }, { 174,-88524 }, + { 175,-88524 }, { 176,-88524 }, { 177,-88524 }, { 178,-88524 }, { 179,-88524 }, + { 180,-88524 }, { 181,-88524 }, { 182,-88524 }, { 183,-88524 }, { 184,-88524 }, + { 185,-88524 }, { 186,-88524 }, { 187,-88524 }, { 188,-88524 }, { 189,-88524 }, + { 190,-88524 }, { 191,-88524 }, { 192,-88524 }, { 193,-88524 }, { 194,-88524 }, + { 195,-88524 }, { 196,-88524 }, { 197,-88524 }, { 198,-88524 }, { 199,-88524 }, + { 200,-88524 }, { 201,-88524 }, { 202,-88524 }, { 203,-88524 }, { 204,-88524 }, + { 205,-88524 }, { 206,-88524 }, { 207,-88524 }, { 208,-88524 }, { 209,-88524 }, + + { 210,-88524 }, { 211,-88524 }, { 212,-88524 }, { 213,-88524 }, { 214,-88524 }, + { 215,-88524 }, { 216,-88524 }, { 217,-88524 }, { 218,-88524 }, { 219,-88524 }, + { 220,-88524 }, { 221,-88524 }, { 222,-88524 }, { 223,-88524 }, { 224,-88524 }, + { 225,-88524 }, { 226,-88524 }, { 227,-88524 }, { 228,-88524 }, { 229,-88524 }, + { 230,-88524 }, { 231,-88524 }, { 232,-88524 }, { 233,-88524 }, { 234,-88524 }, + { 235,-88524 }, { 236,-88524 }, { 237,-88524 }, { 238,-88524 }, { 239,-88524 }, + { 240,-88524 }, { 241,-88524 }, { 242,-88524 }, { 243,-88524 }, { 244,-88524 }, + { 245,-88524 }, { 246,-88524 }, { 247,-88524 }, { 248,-88524 }, { 249,-88524 }, + { 250,-88524 }, { 251,-88524 }, { 252,-88524 }, { 253,-88524 }, { 254,-88524 }, + { 255,-88524 }, { 0, 131 }, { 0,3342 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-88781 }, { 49,-88781 }, { 50,-88781 }, { 51,-88781 }, { 52,-88781 }, + + { 53,-88781 }, { 54,-88781 }, { 55,-88781 }, { 56,-88781 }, { 57,-88781 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-88781 }, { 66,-88781 }, { 67,-88781 }, + { 68,-88781 }, { 69,1285 }, { 70,-88781 }, { 71,-88781 }, { 72,-88781 }, + { 73,-88781 }, { 74,-88781 }, { 75,-88781 }, { 76,-88781 }, { 77,-88781 }, + { 78,-88781 }, { 79,-88781 }, { 80,-88781 }, { 81,-88781 }, { 82,-88781 }, + { 83,-88781 }, { 84,-88781 }, { 85,-88781 }, { 86,-88781 }, { 87,-88781 }, + { 88,-88781 }, { 89,-88781 }, { 90,-88781 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-88781 }, { 0, 0 }, { 97,-88781 }, + { 98,-88781 }, { 99,-88781 }, { 100,-88781 }, { 101,1285 }, { 102,-88781 }, + + { 103,-88781 }, { 104,-88781 }, { 105,-88781 }, { 106,-88781 }, { 107,-88781 }, + { 108,-88781 }, { 109,-88781 }, { 110,-88781 }, { 111,-88781 }, { 112,-88781 }, + { 113,-88781 }, { 114,-88781 }, { 115,-88781 }, { 116,-88781 }, { 117,-88781 }, + { 118,-88781 }, { 119,-88781 }, { 120,-88781 }, { 121,-88781 }, { 122,-88781 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-88781 }, + { 128,-88781 }, { 129,-88781 }, { 130,-88781 }, { 131,-88781 }, { 132,-88781 }, + { 133,-88781 }, { 134,-88781 }, { 135,-88781 }, { 136,-88781 }, { 137,-88781 }, + { 138,-88781 }, { 139,-88781 }, { 140,-88781 }, { 141,-88781 }, { 142,-88781 }, + { 143,-88781 }, { 144,-88781 }, { 145,-88781 }, { 146,-88781 }, { 147,-88781 }, + { 148,-88781 }, { 149,-88781 }, { 150,-88781 }, { 151,-88781 }, { 152,-88781 }, + + { 153,-88781 }, { 154,-88781 }, { 155,-88781 }, { 156,-88781 }, { 157,-88781 }, + { 158,-88781 }, { 159,-88781 }, { 160,-88781 }, { 161,-88781 }, { 162,-88781 }, + { 163,-88781 }, { 164,-88781 }, { 165,-88781 }, { 166,-88781 }, { 167,-88781 }, + { 168,-88781 }, { 169,-88781 }, { 170,-88781 }, { 171,-88781 }, { 172,-88781 }, + { 173,-88781 }, { 174,-88781 }, { 175,-88781 }, { 176,-88781 }, { 177,-88781 }, + { 178,-88781 }, { 179,-88781 }, { 180,-88781 }, { 181,-88781 }, { 182,-88781 }, + { 183,-88781 }, { 184,-88781 }, { 185,-88781 }, { 186,-88781 }, { 187,-88781 }, + { 188,-88781 }, { 189,-88781 }, { 190,-88781 }, { 191,-88781 }, { 192,-88781 }, + { 193,-88781 }, { 194,-88781 }, { 195,-88781 }, { 196,-88781 }, { 197,-88781 }, + { 198,-88781 }, { 199,-88781 }, { 200,-88781 }, { 201,-88781 }, { 202,-88781 }, + + { 203,-88781 }, { 204,-88781 }, { 205,-88781 }, { 206,-88781 }, { 207,-88781 }, + { 208,-88781 }, { 209,-88781 }, { 210,-88781 }, { 211,-88781 }, { 212,-88781 }, + { 213,-88781 }, { 214,-88781 }, { 215,-88781 }, { 216,-88781 }, { 217,-88781 }, + { 218,-88781 }, { 219,-88781 }, { 220,-88781 }, { 221,-88781 }, { 222,-88781 }, + { 223,-88781 }, { 224,-88781 }, { 225,-88781 }, { 226,-88781 }, { 227,-88781 }, + { 228,-88781 }, { 229,-88781 }, { 230,-88781 }, { 231,-88781 }, { 232,-88781 }, + { 233,-88781 }, { 234,-88781 }, { 235,-88781 }, { 236,-88781 }, { 237,-88781 }, + { 238,-88781 }, { 239,-88781 }, { 240,-88781 }, { 241,-88781 }, { 242,-88781 }, + { 243,-88781 }, { 244,-88781 }, { 245,-88781 }, { 246,-88781 }, { 247,-88781 }, + { 248,-88781 }, { 249,-88781 }, { 250,-88781 }, { 251,-88781 }, { 252,-88781 }, + + { 253,-88781 }, { 254,-88781 }, { 255,-88781 }, { 0, 131 }, { 0,3085 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 48,-89038 }, { 49,-89038 }, { 50,-89038 }, + { 51,-89038 }, { 52,-89038 }, { 53,-89038 }, { 54,-89038 }, { 55,-89038 }, + { 56,-89038 }, { 57,-89038 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-89038 }, + { 66,-89038 }, { 67,-89038 }, { 68,-89038 }, { 69,-89038 }, { 70,-89038 }, + { 71,-89038 }, { 72,-89038 }, { 73,-89038 }, { 74,-89038 }, { 75,-89038 }, + { 76,-89038 }, { 77,-89038 }, { 78,-89038 }, { 79,-89038 }, { 80,-89038 }, + { 81,-89038 }, { 82,-89038 }, { 83,-89038 }, { 84,-89038 }, { 85,-89038 }, + { 86,-89038 }, { 87,-89038 }, { 88,-89038 }, { 89,-89038 }, { 90,-89038 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,1285 }, + + { 0, 0 }, { 97,-89038 }, { 98,-89038 }, { 99,-89038 }, { 100,-89038 }, + { 101,-89038 }, { 102,-89038 }, { 103,-89038 }, { 104,-89038 }, { 105,-89038 }, + { 106,-89038 }, { 107,-89038 }, { 108,-89038 }, { 109,-89038 }, { 110,-89038 }, + { 111,-89038 }, { 112,-89038 }, { 113,-89038 }, { 114,-89038 }, { 115,-89038 }, + { 116,-89038 }, { 117,-89038 }, { 118,-89038 }, { 119,-89038 }, { 120,-89038 }, + { 121,-89038 }, { 122,-89038 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-89038 }, { 128,-89038 }, { 129,-89038 }, { 130,-89038 }, + { 131,-89038 }, { 132,-89038 }, { 133,-89038 }, { 134,-89038 }, { 135,-89038 }, + { 136,-89038 }, { 137,-89038 }, { 138,-89038 }, { 139,-89038 }, { 140,-89038 }, + { 141,-89038 }, { 142,-89038 }, { 143,-89038 }, { 144,-89038 }, { 145,-89038 }, + + { 146,-89038 }, { 147,-89038 }, { 148,-89038 }, { 149,-89038 }, { 150,-89038 }, + { 151,-89038 }, { 152,-89038 }, { 153,-89038 }, { 154,-89038 }, { 155,-89038 }, + { 156,-89038 }, { 157,-89038 }, { 158,-89038 }, { 159,-89038 }, { 160,-89038 }, + { 161,-89038 }, { 162,-89038 }, { 163,-89038 }, { 164,-89038 }, { 165,-89038 }, + { 166,-89038 }, { 167,-89038 }, { 168,-89038 }, { 169,-89038 }, { 170,-89038 }, + { 171,-89038 }, { 172,-89038 }, { 173,-89038 }, { 174,-89038 }, { 175,-89038 }, + { 176,-89038 }, { 177,-89038 }, { 178,-89038 }, { 179,-89038 }, { 180,-89038 }, + { 181,-89038 }, { 182,-89038 }, { 183,-89038 }, { 184,-89038 }, { 185,-89038 }, + { 186,-89038 }, { 187,-89038 }, { 188,-89038 }, { 189,-89038 }, { 190,-89038 }, + { 191,-89038 }, { 192,-89038 }, { 193,-89038 }, { 194,-89038 }, { 195,-89038 }, + + { 196,-89038 }, { 197,-89038 }, { 198,-89038 }, { 199,-89038 }, { 200,-89038 }, + { 201,-89038 }, { 202,-89038 }, { 203,-89038 }, { 204,-89038 }, { 205,-89038 }, + { 206,-89038 }, { 207,-89038 }, { 208,-89038 }, { 209,-89038 }, { 210,-89038 }, + { 211,-89038 }, { 212,-89038 }, { 213,-89038 }, { 214,-89038 }, { 215,-89038 }, + { 216,-89038 }, { 217,-89038 }, { 218,-89038 }, { 219,-89038 }, { 220,-89038 }, + { 221,-89038 }, { 222,-89038 }, { 223,-89038 }, { 224,-89038 }, { 225,-89038 }, + { 226,-89038 }, { 227,-89038 }, { 228,-89038 }, { 229,-89038 }, { 230,-89038 }, + { 231,-89038 }, { 232,-89038 }, { 233,-89038 }, { 234,-89038 }, { 235,-89038 }, + { 236,-89038 }, { 237,-89038 }, { 238,-89038 }, { 239,-89038 }, { 240,-89038 }, + { 241,-89038 }, { 242,-89038 }, { 243,-89038 }, { 244,-89038 }, { 245,-89038 }, + + { 246,-89038 }, { 247,-89038 }, { 248,-89038 }, { 249,-89038 }, { 250,-89038 }, + { 251,-89038 }, { 252,-89038 }, { 253,-89038 }, { 254,-89038 }, { 255,-89038 }, + { 0, 131 }, { 0,2828 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-89295 }, + { 49,-89295 }, { 50,-89295 }, { 51,-89295 }, { 52,-89295 }, { 53,-89295 }, + { 54,-89295 }, { 55,-89295 }, { 56,-89295 }, { 57,-89295 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-89295 }, { 66,-89295 }, { 67,-89295 }, { 68,-89295 }, + { 69,-89295 }, { 70,-89295 }, { 71,-89295 }, { 72,-89295 }, { 73,1285 }, + { 74,-89295 }, { 75,-89295 }, { 76,-89295 }, { 77,-89295 }, { 78,-89295 }, + { 79,-89295 }, { 80,-89295 }, { 81,-89295 }, { 82,-89295 }, { 83,-89295 }, + { 84,-89295 }, { 85,-89295 }, { 86,-89295 }, { 87,-89295 }, { 88,-89295 }, + + { 89,-89295 }, { 90,-89295 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-89295 }, { 0, 0 }, { 97,-89295 }, { 98,-89295 }, + { 99,-89295 }, { 100,-89295 }, { 101,-89295 }, { 102,-89295 }, { 103,-89295 }, + { 104,-89295 }, { 105,1285 }, { 106,-89295 }, { 107,-89295 }, { 108,-89295 }, + { 109,-89295 }, { 110,-89295 }, { 111,-89295 }, { 112,-89295 }, { 113,-89295 }, + { 114,-89295 }, { 115,-89295 }, { 116,-89295 }, { 117,-89295 }, { 118,-89295 }, + { 119,-89295 }, { 120,-89295 }, { 121,-89295 }, { 122,-89295 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-89295 }, { 128,-89295 }, + { 129,-89295 }, { 130,-89295 }, { 131,-89295 }, { 132,-89295 }, { 133,-89295 }, + { 134,-89295 }, { 135,-89295 }, { 136,-89295 }, { 137,-89295 }, { 138,-89295 }, + + { 139,-89295 }, { 140,-89295 }, { 141,-89295 }, { 142,-89295 }, { 143,-89295 }, + { 144,-89295 }, { 145,-89295 }, { 146,-89295 }, { 147,-89295 }, { 148,-89295 }, + { 149,-89295 }, { 150,-89295 }, { 151,-89295 }, { 152,-89295 }, { 153,-89295 }, + { 154,-89295 }, { 155,-89295 }, { 156,-89295 }, { 157,-89295 }, { 158,-89295 }, + { 159,-89295 }, { 160,-89295 }, { 161,-89295 }, { 162,-89295 }, { 163,-89295 }, + { 164,-89295 }, { 165,-89295 }, { 166,-89295 }, { 167,-89295 }, { 168,-89295 }, + { 169,-89295 }, { 170,-89295 }, { 171,-89295 }, { 172,-89295 }, { 173,-89295 }, + { 174,-89295 }, { 175,-89295 }, { 176,-89295 }, { 177,-89295 }, { 178,-89295 }, + { 179,-89295 }, { 180,-89295 }, { 181,-89295 }, { 182,-89295 }, { 183,-89295 }, + { 184,-89295 }, { 185,-89295 }, { 186,-89295 }, { 187,-89295 }, { 188,-89295 }, + + { 189,-89295 }, { 190,-89295 }, { 191,-89295 }, { 192,-89295 }, { 193,-89295 }, + { 194,-89295 }, { 195,-89295 }, { 196,-89295 }, { 197,-89295 }, { 198,-89295 }, + { 199,-89295 }, { 200,-89295 }, { 201,-89295 }, { 202,-89295 }, { 203,-89295 }, + { 204,-89295 }, { 205,-89295 }, { 206,-89295 }, { 207,-89295 }, { 208,-89295 }, + { 209,-89295 }, { 210,-89295 }, { 211,-89295 }, { 212,-89295 }, { 213,-89295 }, + { 214,-89295 }, { 215,-89295 }, { 216,-89295 }, { 217,-89295 }, { 218,-89295 }, + { 219,-89295 }, { 220,-89295 }, { 221,-89295 }, { 222,-89295 }, { 223,-89295 }, + { 224,-89295 }, { 225,-89295 }, { 226,-89295 }, { 227,-89295 }, { 228,-89295 }, + { 229,-89295 }, { 230,-89295 }, { 231,-89295 }, { 232,-89295 }, { 233,-89295 }, + { 234,-89295 }, { 235,-89295 }, { 236,-89295 }, { 237,-89295 }, { 238,-89295 }, + + { 239,-89295 }, { 240,-89295 }, { 241,-89295 }, { 242,-89295 }, { 243,-89295 }, + { 244,-89295 }, { 245,-89295 }, { 246,-89295 }, { 247,-89295 }, { 248,-89295 }, + { 249,-89295 }, { 250,-89295 }, { 251,-89295 }, { 252,-89295 }, { 253,-89295 }, + { 254,-89295 }, { 255,-89295 }, { 0, 131 }, { 0,2571 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 48,-89552 }, { 49,-89552 }, { 50,-89552 }, { 51,-89552 }, + { 52,-89552 }, { 53,-89552 }, { 54,-89552 }, { 55,-89552 }, { 56,-89552 }, + { 57,-89552 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-89552 }, { 66,-89552 }, + { 67,-89552 }, { 68,-89552 }, { 69,-89552 }, { 70,-89552 }, { 71,-89552 }, + { 72,-89552 }, { 73,-89552 }, { 74,-89552 }, { 75,-89552 }, { 76,-89552 }, + { 77,-89552 }, { 78,-89552 }, { 79,-89552 }, { 80,-89552 }, { 81,-89552 }, + + { 82,-89552 }, { 83,-89552 }, { 84,-89552 }, { 85,-89552 }, { 86,-89552 }, + { 87,-89552 }, { 88,-89552 }, { 89,-89552 }, { 90,-89552 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,1285 }, { 0, 0 }, + { 97,-89552 }, { 98,-89552 }, { 99,-89552 }, { 100,-89552 }, { 101,-89552 }, + { 102,-89552 }, { 103,-89552 }, { 104,-89552 }, { 105,-89552 }, { 106,-89552 }, + { 107,-89552 }, { 108,-89552 }, { 109,-89552 }, { 110,-89552 }, { 111,-89552 }, + { 112,-89552 }, { 113,-89552 }, { 114,-89552 }, { 115,-89552 }, { 116,-89552 }, + { 117,-89552 }, { 118,-89552 }, { 119,-89552 }, { 120,-89552 }, { 121,-89552 }, + { 122,-89552 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-89552 }, { 128,-89552 }, { 129,-89552 }, { 130,-89552 }, { 131,-89552 }, + + { 132,-89552 }, { 133,-89552 }, { 134,-89552 }, { 135,-89552 }, { 136,-89552 }, + { 137,-89552 }, { 138,-89552 }, { 139,-89552 }, { 140,-89552 }, { 141,-89552 }, + { 142,-89552 }, { 143,-89552 }, { 144,-89552 }, { 145,-89552 }, { 146,-89552 }, + { 147,-89552 }, { 148,-89552 }, { 149,-89552 }, { 150,-89552 }, { 151,-89552 }, + { 152,-89552 }, { 153,-89552 }, { 154,-89552 }, { 155,-89552 }, { 156,-89552 }, + { 157,-89552 }, { 158,-89552 }, { 159,-89552 }, { 160,-89552 }, { 161,-89552 }, + { 162,-89552 }, { 163,-89552 }, { 164,-89552 }, { 165,-89552 }, { 166,-89552 }, + { 167,-89552 }, { 168,-89552 }, { 169,-89552 }, { 170,-89552 }, { 171,-89552 }, + { 172,-89552 }, { 173,-89552 }, { 174,-89552 }, { 175,-89552 }, { 176,-89552 }, + { 177,-89552 }, { 178,-89552 }, { 179,-89552 }, { 180,-89552 }, { 181,-89552 }, + + { 182,-89552 }, { 183,-89552 }, { 184,-89552 }, { 185,-89552 }, { 186,-89552 }, + { 187,-89552 }, { 188,-89552 }, { 189,-89552 }, { 190,-89552 }, { 191,-89552 }, + { 192,-89552 }, { 193,-89552 }, { 194,-89552 }, { 195,-89552 }, { 196,-89552 }, + { 197,-89552 }, { 198,-89552 }, { 199,-89552 }, { 200,-89552 }, { 201,-89552 }, + { 202,-89552 }, { 203,-89552 }, { 204,-89552 }, { 205,-89552 }, { 206,-89552 }, + { 207,-89552 }, { 208,-89552 }, { 209,-89552 }, { 210,-89552 }, { 211,-89552 }, + { 212,-89552 }, { 213,-89552 }, { 214,-89552 }, { 215,-89552 }, { 216,-89552 }, + { 217,-89552 }, { 218,-89552 }, { 219,-89552 }, { 220,-89552 }, { 221,-89552 }, + { 222,-89552 }, { 223,-89552 }, { 224,-89552 }, { 225,-89552 }, { 226,-89552 }, + { 227,-89552 }, { 228,-89552 }, { 229,-89552 }, { 230,-89552 }, { 231,-89552 }, + + { 232,-89552 }, { 233,-89552 }, { 234,-89552 }, { 235,-89552 }, { 236,-89552 }, + { 237,-89552 }, { 238,-89552 }, { 239,-89552 }, { 240,-89552 }, { 241,-89552 }, + { 242,-89552 }, { 243,-89552 }, { 244,-89552 }, { 245,-89552 }, { 246,-89552 }, + { 247,-89552 }, { 248,-89552 }, { 249,-89552 }, { 250,-89552 }, { 251,-89552 }, + { 252,-89552 }, { 253,-89552 }, { 254,-89552 }, { 255,-89552 }, { 0, 19 }, + { 0,2314 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-89809 }, { 49,-89809 }, + { 50,-89809 }, { 51,-89809 }, { 52,-89809 }, { 53,-89809 }, { 54,-89809 }, + { 55,-89809 }, { 56,-89809 }, { 57,-89809 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-89809 }, { 66,-89809 }, { 67,-89809 }, { 68,-89809 }, { 69,-89809 }, + { 70,-89809 }, { 71,-89809 }, { 72,-89809 }, { 73,-89809 }, { 74,-89809 }, + + { 75,-89809 }, { 76,-89809 }, { 77,-89809 }, { 78,-89809 }, { 79,-89809 }, + { 80,-89809 }, { 81,-89809 }, { 82,-89809 }, { 83,-89809 }, { 84,-89809 }, + { 85,-89809 }, { 86,-89809 }, { 87,-89809 }, { 88,-89809 }, { 89,-89809 }, + { 90,-89809 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-89809 }, { 0, 0 }, { 97,-89809 }, { 98,-89809 }, { 99,-89809 }, + { 100,-89809 }, { 101,-89809 }, { 102,-89809 }, { 103,-89809 }, { 104,-89809 }, + { 105,-89809 }, { 106,-89809 }, { 107,-89809 }, { 108,-89809 }, { 109,-89809 }, + { 110,-89809 }, { 111,-89809 }, { 112,-89809 }, { 113,-89809 }, { 114,-89809 }, + { 115,-89809 }, { 116,-89809 }, { 117,-89809 }, { 118,-89809 }, { 119,-89809 }, + { 120,-89809 }, { 121,-89809 }, { 122,-89809 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 127,-89809 }, { 128,-89809 }, { 129,-89809 }, + { 130,-89809 }, { 131,-89809 }, { 132,-89809 }, { 133,-89809 }, { 134,-89809 }, + { 135,-89809 }, { 136,-89809 }, { 137,-89809 }, { 138,-89809 }, { 139,-89809 }, + { 140,-89809 }, { 141,-89809 }, { 142,-89809 }, { 143,-89809 }, { 144,-89809 }, + { 145,-89809 }, { 146,-89809 }, { 147,-89809 }, { 148,-89809 }, { 149,-89809 }, + { 150,-89809 }, { 151,-89809 }, { 152,-89809 }, { 153,-89809 }, { 154,-89809 }, + { 155,-89809 }, { 156,-89809 }, { 157,-89809 }, { 158,-89809 }, { 159,-89809 }, + { 160,-89809 }, { 161,-89809 }, { 162,-89809 }, { 163,-89809 }, { 164,-89809 }, + { 165,-89809 }, { 166,-89809 }, { 167,-89809 }, { 168,-89809 }, { 169,-89809 }, + { 170,-89809 }, { 171,-89809 }, { 172,-89809 }, { 173,-89809 }, { 174,-89809 }, + + { 175,-89809 }, { 176,-89809 }, { 177,-89809 }, { 178,-89809 }, { 179,-89809 }, + { 180,-89809 }, { 181,-89809 }, { 182,-89809 }, { 183,-89809 }, { 184,-89809 }, + { 185,-89809 }, { 186,-89809 }, { 187,-89809 }, { 188,-89809 }, { 189,-89809 }, + { 190,-89809 }, { 191,-89809 }, { 192,-89809 }, { 193,-89809 }, { 194,-89809 }, + { 195,-89809 }, { 196,-89809 }, { 197,-89809 }, { 198,-89809 }, { 199,-89809 }, + { 200,-89809 }, { 201,-89809 }, { 202,-89809 }, { 203,-89809 }, { 204,-89809 }, + { 205,-89809 }, { 206,-89809 }, { 207,-89809 }, { 208,-89809 }, { 209,-89809 }, + { 210,-89809 }, { 211,-89809 }, { 212,-89809 }, { 213,-89809 }, { 214,-89809 }, + { 215,-89809 }, { 216,-89809 }, { 217,-89809 }, { 218,-89809 }, { 219,-89809 }, + { 220,-89809 }, { 221,-89809 }, { 222,-89809 }, { 223,-89809 }, { 224,-89809 }, + + { 225,-89809 }, { 226,-89809 }, { 227,-89809 }, { 228,-89809 }, { 229,-89809 }, + { 230,-89809 }, { 231,-89809 }, { 232,-89809 }, { 233,-89809 }, { 234,-89809 }, + { 235,-89809 }, { 236,-89809 }, { 237,-89809 }, { 238,-89809 }, { 239,-89809 }, + { 240,-89809 }, { 241,-89809 }, { 242,-89809 }, { 243,-89809 }, { 244,-89809 }, + { 245,-89809 }, { 246,-89809 }, { 247,-89809 }, { 248,-89809 }, { 249,-89809 }, + { 250,-89809 }, { 251,-89809 }, { 252,-89809 }, { 253,-89809 }, { 254,-89809 }, + { 255,-89809 }, { 0, 22 }, { 0,2057 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-90066 }, { 49,-90066 }, { 50,-90066 }, { 51,-90066 }, { 52,-90066 }, + { 53,-90066 }, { 54,-90066 }, { 55,-90066 }, { 56,-90066 }, { 57,-90066 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-90066 }, { 66,-90066 }, { 67,-90066 }, + + { 68,-90066 }, { 69,-90066 }, { 70,-90066 }, { 71,-90066 }, { 72,-90066 }, + { 73,-90066 }, { 74,-90066 }, { 75,-90066 }, { 76,-90066 }, { 77,-90066 }, + { 78,-90066 }, { 79,-90066 }, { 80,-90066 }, { 81,-90066 }, { 82,-90066 }, + { 83,-90066 }, { 84,-90066 }, { 85,-90066 }, { 86,-90066 }, { 87,-90066 }, + { 88,-90066 }, { 89,-90066 }, { 90,-90066 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-90066 }, { 0, 0 }, { 97,-90066 }, + { 98,-90066 }, { 99,-90066 }, { 100,-90066 }, { 101,-90066 }, { 102,-90066 }, + { 103,-90066 }, { 104,-90066 }, { 105,-90066 }, { 106,-90066 }, { 107,-90066 }, + { 108,-90066 }, { 109,-90066 }, { 110,-90066 }, { 111,-90066 }, { 112,-90066 }, + { 113,-90066 }, { 114,-90066 }, { 115,-90066 }, { 116,-90066 }, { 117,-90066 }, + + { 118,-90066 }, { 119,-90066 }, { 120,-90066 }, { 121,-90066 }, { 122,-90066 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-90066 }, + { 128,-90066 }, { 129,-90066 }, { 130,-90066 }, { 131,-90066 }, { 132,-90066 }, + { 133,-90066 }, { 134,-90066 }, { 135,-90066 }, { 136,-90066 }, { 137,-90066 }, + { 138,-90066 }, { 139,-90066 }, { 140,-90066 }, { 141,-90066 }, { 142,-90066 }, + { 143,-90066 }, { 144,-90066 }, { 145,-90066 }, { 146,-90066 }, { 147,-90066 }, + { 148,-90066 }, { 149,-90066 }, { 150,-90066 }, { 151,-90066 }, { 152,-90066 }, + { 153,-90066 }, { 154,-90066 }, { 155,-90066 }, { 156,-90066 }, { 157,-90066 }, + { 158,-90066 }, { 159,-90066 }, { 160,-90066 }, { 161,-90066 }, { 162,-90066 }, + { 163,-90066 }, { 164,-90066 }, { 165,-90066 }, { 166,-90066 }, { 167,-90066 }, + + { 168,-90066 }, { 169,-90066 }, { 170,-90066 }, { 171,-90066 }, { 172,-90066 }, + { 173,-90066 }, { 174,-90066 }, { 175,-90066 }, { 176,-90066 }, { 177,-90066 }, + { 178,-90066 }, { 179,-90066 }, { 180,-90066 }, { 181,-90066 }, { 182,-90066 }, + { 183,-90066 }, { 184,-90066 }, { 185,-90066 }, { 186,-90066 }, { 187,-90066 }, + { 188,-90066 }, { 189,-90066 }, { 190,-90066 }, { 191,-90066 }, { 192,-90066 }, + { 193,-90066 }, { 194,-90066 }, { 195,-90066 }, { 196,-90066 }, { 197,-90066 }, + { 198,-90066 }, { 199,-90066 }, { 200,-90066 }, { 201,-90066 }, { 202,-90066 }, + { 203,-90066 }, { 204,-90066 }, { 205,-90066 }, { 206,-90066 }, { 207,-90066 }, + { 208,-90066 }, { 209,-90066 }, { 210,-90066 }, { 211,-90066 }, { 212,-90066 }, + { 213,-90066 }, { 214,-90066 }, { 215,-90066 }, { 216,-90066 }, { 217,-90066 }, + + { 218,-90066 }, { 219,-90066 }, { 220,-90066 }, { 221,-90066 }, { 222,-90066 }, + { 223,-90066 }, { 224,-90066 }, { 225,-90066 }, { 226,-90066 }, { 227,-90066 }, + { 228,-90066 }, { 229,-90066 }, { 230,-90066 }, { 231,-90066 }, { 232,-90066 }, + { 233,-90066 }, { 234,-90066 }, { 235,-90066 }, { 236,-90066 }, { 237,-90066 }, + { 238,-90066 }, { 239,-90066 }, { 240,-90066 }, { 241,-90066 }, { 242,-90066 }, + { 243,-90066 }, { 244,-90066 }, { 245,-90066 }, { 246,-90066 }, { 247,-90066 }, + { 248,-90066 }, { 249,-90066 }, { 250,-90066 }, { 251,-90066 }, { 252,-90066 }, + { 253,-90066 }, { 254,-90066 }, { 255,-90066 }, { 0, 80 }, { 0,1800 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-90323 }, { 49,-90323 }, { 50,-90323 }, + { 51,-90323 }, { 52,-90323 }, { 53,-90323 }, { 54,-90323 }, { 55,-90323 }, + { 56,-90323 }, { 57,-90323 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-90323 }, + { 66,-90323 }, { 67,-90323 }, { 68,-90323 }, { 69,-90323 }, { 70,-90323 }, + { 71,-90323 }, { 72,-90323 }, { 73,-90323 }, { 74,-90323 }, { 75,-90323 }, + { 76,-90323 }, { 77,-90323 }, { 78,-90323 }, { 79,-90323 }, { 80,-90323 }, + { 81,-90323 }, { 82,-90323 }, { 83,-90323 }, { 84,-90323 }, { 85,-90323 }, + { 86,-90323 }, { 87,-90323 }, { 88,-90323 }, { 89,-90323 }, { 90,-90323 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-90323 }, + { 0, 0 }, { 97,-90323 }, { 98,-90323 }, { 99,-90323 }, { 100,-90323 }, + { 101,-90323 }, { 102,-90323 }, { 103,-90323 }, { 104,-90323 }, { 105,-90323 }, + { 106,-90323 }, { 107,-90323 }, { 108,-90323 }, { 109,-90323 }, { 110,-90323 }, + + { 111,-90323 }, { 112,-90323 }, { 113,-90323 }, { 114,-90323 }, { 115,-90323 }, + { 116,-90323 }, { 117,-90323 }, { 118,-90323 }, { 119,-90323 }, { 120,-90323 }, + { 121,-90323 }, { 122,-90323 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 127,-90323 }, { 128,-90323 }, { 129,-90323 }, { 130,-90323 }, + { 131,-90323 }, { 132,-90323 }, { 133,-90323 }, { 134,-90323 }, { 135,-90323 }, + { 136,-90323 }, { 137,-90323 }, { 138,-90323 }, { 139,-90323 }, { 140,-90323 }, + { 141,-90323 }, { 142,-90323 }, { 143,-90323 }, { 144,-90323 }, { 145,-90323 }, + { 146,-90323 }, { 147,-90323 }, { 148,-90323 }, { 149,-90323 }, { 150,-90323 }, + { 151,-90323 }, { 152,-90323 }, { 153,-90323 }, { 154,-90323 }, { 155,-90323 }, + { 156,-90323 }, { 157,-90323 }, { 158,-90323 }, { 159,-90323 }, { 160,-90323 }, + + { 161,-90323 }, { 162,-90323 }, { 163,-90323 }, { 164,-90323 }, { 165,-90323 }, + { 166,-90323 }, { 167,-90323 }, { 168,-90323 }, { 169,-90323 }, { 170,-90323 }, + { 171,-90323 }, { 172,-90323 }, { 173,-90323 }, { 174,-90323 }, { 175,-90323 }, + { 176,-90323 }, { 177,-90323 }, { 178,-90323 }, { 179,-90323 }, { 180,-90323 }, + { 181,-90323 }, { 182,-90323 }, { 183,-90323 }, { 184,-90323 }, { 185,-90323 }, + { 186,-90323 }, { 187,-90323 }, { 188,-90323 }, { 189,-90323 }, { 190,-90323 }, + { 191,-90323 }, { 192,-90323 }, { 193,-90323 }, { 194,-90323 }, { 195,-90323 }, + { 196,-90323 }, { 197,-90323 }, { 198,-90323 }, { 199,-90323 }, { 200,-90323 }, + { 201,-90323 }, { 202,-90323 }, { 203,-90323 }, { 204,-90323 }, { 205,-90323 }, + { 206,-90323 }, { 207,-90323 }, { 208,-90323 }, { 209,-90323 }, { 210,-90323 }, + + { 211,-90323 }, { 212,-90323 }, { 213,-90323 }, { 214,-90323 }, { 215,-90323 }, + { 216,-90323 }, { 217,-90323 }, { 218,-90323 }, { 219,-90323 }, { 220,-90323 }, + { 221,-90323 }, { 222,-90323 }, { 223,-90323 }, { 224,-90323 }, { 225,-90323 }, + { 226,-90323 }, { 227,-90323 }, { 228,-90323 }, { 229,-90323 }, { 230,-90323 }, + { 231,-90323 }, { 232,-90323 }, { 233,-90323 }, { 234,-90323 }, { 235,-90323 }, + { 236,-90323 }, { 237,-90323 }, { 238,-90323 }, { 239,-90323 }, { 240,-90323 }, + { 241,-90323 }, { 242,-90323 }, { 243,-90323 }, { 244,-90323 }, { 245,-90323 }, + { 246,-90323 }, { 247,-90323 }, { 248,-90323 }, { 249,-90323 }, { 250,-90323 }, + { 251,-90323 }, { 252,-90323 }, { 253,-90323 }, { 254,-90323 }, { 255,-90323 }, + { 0, 131 }, { 0,1543 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-90580 }, + { 49,-90580 }, { 50,-90580 }, { 51,-90580 }, { 52,-90580 }, { 53,-90580 }, + + { 54,-90580 }, { 55,-90580 }, { 56,-90580 }, { 57,-90580 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-90580 }, { 66,-90580 }, { 67,-90580 }, { 68,-90580 }, + { 69,-90580 }, { 70,-90580 }, { 71,-90580 }, { 72,-90580 }, { 73,-90580 }, + { 74,-90580 }, { 75,-90580 }, { 76, 514 }, { 77,-90580 }, { 78,-90580 }, + { 79,-90580 }, { 80,-90580 }, { 81,-90580 }, { 82,-90580 }, { 83,-90580 }, + { 84,-90580 }, { 85,-90580 }, { 86,-90580 }, { 87,-90580 }, { 88,-90580 }, + { 89,-90580 }, { 90,-90580 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-90580 }, { 0, 0 }, { 97,-90580 }, { 98,-90580 }, + { 99,-90580 }, { 100,-90580 }, { 101,-90580 }, { 102,-90580 }, { 103,-90580 }, + + { 104,-90580 }, { 105,-90580 }, { 106,-90580 }, { 107,-90580 }, { 108, 514 }, + { 109,-90580 }, { 110,-90580 }, { 111,-90580 }, { 112,-90580 }, { 113,-90580 }, + { 114,-90580 }, { 115,-90580 }, { 116,-90580 }, { 117,-90580 }, { 118,-90580 }, + { 119,-90580 }, { 120,-90580 }, { 121,-90580 }, { 122,-90580 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-90580 }, { 128,-90580 }, + { 129,-90580 }, { 130,-90580 }, { 131,-90580 }, { 132,-90580 }, { 133,-90580 }, + { 134,-90580 }, { 135,-90580 }, { 136,-90580 }, { 137,-90580 }, { 138,-90580 }, + { 139,-90580 }, { 140,-90580 }, { 141,-90580 }, { 142,-90580 }, { 143,-90580 }, + { 144,-90580 }, { 145,-90580 }, { 146,-90580 }, { 147,-90580 }, { 148,-90580 }, + { 149,-90580 }, { 150,-90580 }, { 151,-90580 }, { 152,-90580 }, { 153,-90580 }, + + { 154,-90580 }, { 155,-90580 }, { 156,-90580 }, { 157,-90580 }, { 158,-90580 }, + { 159,-90580 }, { 160,-90580 }, { 161,-90580 }, { 162,-90580 }, { 163,-90580 }, + { 164,-90580 }, { 165,-90580 }, { 166,-90580 }, { 167,-90580 }, { 168,-90580 }, + { 169,-90580 }, { 170,-90580 }, { 171,-90580 }, { 172,-90580 }, { 173,-90580 }, + { 174,-90580 }, { 175,-90580 }, { 176,-90580 }, { 177,-90580 }, { 178,-90580 }, + { 179,-90580 }, { 180,-90580 }, { 181,-90580 }, { 182,-90580 }, { 183,-90580 }, + { 184,-90580 }, { 185,-90580 }, { 186,-90580 }, { 187,-90580 }, { 188,-90580 }, + { 189,-90580 }, { 190,-90580 }, { 191,-90580 }, { 192,-90580 }, { 193,-90580 }, + { 194,-90580 }, { 195,-90580 }, { 196,-90580 }, { 197,-90580 }, { 198,-90580 }, + { 199,-90580 }, { 200,-90580 }, { 201,-90580 }, { 202,-90580 }, { 203,-90580 }, + + { 204,-90580 }, { 205,-90580 }, { 206,-90580 }, { 207,-90580 }, { 208,-90580 }, + { 209,-90580 }, { 210,-90580 }, { 211,-90580 }, { 212,-90580 }, { 213,-90580 }, + { 214,-90580 }, { 215,-90580 }, { 216,-90580 }, { 217,-90580 }, { 218,-90580 }, + { 219,-90580 }, { 220,-90580 }, { 221,-90580 }, { 222,-90580 }, { 223,-90580 }, + { 224,-90580 }, { 225,-90580 }, { 226,-90580 }, { 227,-90580 }, { 228,-90580 }, + { 229,-90580 }, { 230,-90580 }, { 231,-90580 }, { 232,-90580 }, { 233,-90580 }, + { 234,-90580 }, { 235,-90580 }, { 236,-90580 }, { 237,-90580 }, { 238,-90580 }, + { 239,-90580 }, { 240,-90580 }, { 241,-90580 }, { 242,-90580 }, { 243,-90580 }, + { 244,-90580 }, { 245,-90580 }, { 246,-90580 }, { 247,-90580 }, { 248,-90580 }, + { 249,-90580 }, { 250,-90580 }, { 251,-90580 }, { 252,-90580 }, { 253,-90580 }, + + { 254,-90580 }, { 255,-90580 }, { 0, 131 }, { 0,1286 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 48,-90837 }, { 49,-90837 }, { 50,-90837 }, { 51,-90837 }, + { 52,-90837 }, { 53,-90837 }, { 54,-90837 }, { 55,-90837 }, { 56,-90837 }, + { 57,-90837 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-90837 }, { 66,-90837 }, + { 67,-90837 }, { 68,-90837 }, { 69,-90837 }, { 70,-90837 }, { 71,-90837 }, + { 72,-90837 }, { 73,-90837 }, { 74,-90837 }, { 75,-90837 }, { 76,-90837 }, + { 77,-90837 }, { 78,-90837 }, { 79,-90837 }, { 80,-90837 }, { 81,-90837 }, + { 82,-90837 }, { 83,-90837 }, { 84,-90837 }, { 85,-90837 }, { 86,-90837 }, + { 87,-90837 }, { 88,-90837 }, { 89,-90837 }, { 90,-90837 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95, 514 }, { 0, 0 }, + + { 97,-90837 }, { 98,-90837 }, { 99,-90837 }, { 100,-90837 }, { 101,-90837 }, + { 102,-90837 }, { 103,-90837 }, { 104,-90837 }, { 105,-90837 }, { 106,-90837 }, + { 107,-90837 }, { 108,-90837 }, { 109,-90837 }, { 110,-90837 }, { 111,-90837 }, + { 112,-90837 }, { 113,-90837 }, { 114,-90837 }, { 115,-90837 }, { 116,-90837 }, + { 117,-90837 }, { 118,-90837 }, { 119,-90837 }, { 120,-90837 }, { 121,-90837 }, + { 122,-90837 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 127,-90837 }, { 128,-90837 }, { 129,-90837 }, { 130,-90837 }, { 131,-90837 }, + { 132,-90837 }, { 133,-90837 }, { 134,-90837 }, { 135,-90837 }, { 136,-90837 }, + { 137,-90837 }, { 138,-90837 }, { 139,-90837 }, { 140,-90837 }, { 141,-90837 }, + { 142,-90837 }, { 143,-90837 }, { 144,-90837 }, { 145,-90837 }, { 146,-90837 }, + + { 147,-90837 }, { 148,-90837 }, { 149,-90837 }, { 150,-90837 }, { 151,-90837 }, + { 152,-90837 }, { 153,-90837 }, { 154,-90837 }, { 155,-90837 }, { 156,-90837 }, + { 157,-90837 }, { 158,-90837 }, { 159,-90837 }, { 160,-90837 }, { 161,-90837 }, + { 162,-90837 }, { 163,-90837 }, { 164,-90837 }, { 165,-90837 }, { 166,-90837 }, + { 167,-90837 }, { 168,-90837 }, { 169,-90837 }, { 170,-90837 }, { 171,-90837 }, + { 172,-90837 }, { 173,-90837 }, { 174,-90837 }, { 175,-90837 }, { 176,-90837 }, + { 177,-90837 }, { 178,-90837 }, { 179,-90837 }, { 180,-90837 }, { 181,-90837 }, + { 182,-90837 }, { 183,-90837 }, { 184,-90837 }, { 185,-90837 }, { 186,-90837 }, + { 187,-90837 }, { 188,-90837 }, { 189,-90837 }, { 190,-90837 }, { 191,-90837 }, + { 192,-90837 }, { 193,-90837 }, { 194,-90837 }, { 195,-90837 }, { 196,-90837 }, + + { 197,-90837 }, { 198,-90837 }, { 199,-90837 }, { 200,-90837 }, { 201,-90837 }, + { 202,-90837 }, { 203,-90837 }, { 204,-90837 }, { 205,-90837 }, { 206,-90837 }, + { 207,-90837 }, { 208,-90837 }, { 209,-90837 }, { 210,-90837 }, { 211,-90837 }, + { 212,-90837 }, { 213,-90837 }, { 214,-90837 }, { 215,-90837 }, { 216,-90837 }, + { 217,-90837 }, { 218,-90837 }, { 219,-90837 }, { 220,-90837 }, { 221,-90837 }, + { 222,-90837 }, { 223,-90837 }, { 224,-90837 }, { 225,-90837 }, { 226,-90837 }, + { 227,-90837 }, { 228,-90837 }, { 229,-90837 }, { 230,-90837 }, { 231,-90837 }, + { 232,-90837 }, { 233,-90837 }, { 234,-90837 }, { 235,-90837 }, { 236,-90837 }, + { 237,-90837 }, { 238,-90837 }, { 239,-90837 }, { 240,-90837 }, { 241,-90837 }, + { 242,-90837 }, { 243,-90837 }, { 244,-90837 }, { 245,-90837 }, { 246,-90837 }, + + { 247,-90837 }, { 248,-90837 }, { 249,-90837 }, { 250,-90837 }, { 251,-90837 }, + { 252,-90837 }, { 253,-90837 }, { 254,-90837 }, { 255,-90837 }, { 0, 131 }, + { 0,1029 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-91094 }, { 49,-91094 }, + { 50,-91094 }, { 51,-91094 }, { 52,-91094 }, { 53,-91094 }, { 54,-91094 }, + { 55,-91094 }, { 56,-91094 }, { 57,-91094 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 65,-91094 }, { 66,-91094 }, { 67,-91094 }, { 68,-91094 }, { 69, 514 }, + { 70,-91094 }, { 71,-91094 }, { 72,-91094 }, { 73,-91094 }, { 74,-91094 }, + { 75,-91094 }, { 76,-91094 }, { 77,-91094 }, { 78,-91094 }, { 79,-91094 }, + { 80,-91094 }, { 81,-91094 }, { 82,-91094 }, { 83,-91094 }, { 84,-91094 }, + { 85,-91094 }, { 86,-91094 }, { 87,-91094 }, { 88,-91094 }, { 89,-91094 }, + + { 90,-91094 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 95,-91094 }, { 0, 0 }, { 97,-91094 }, { 98,-91094 }, { 99,-91094 }, + { 100,-91094 }, { 101, 514 }, { 102,-91094 }, { 103,-91094 }, { 104,-91094 }, + { 105,-91094 }, { 106,-91094 }, { 107,-91094 }, { 108,-91094 }, { 109,-91094 }, + { 110,-91094 }, { 111,-91094 }, { 112,-91094 }, { 113,-91094 }, { 114,-91094 }, + { 115,-91094 }, { 116,-91094 }, { 117,-91094 }, { 118,-91094 }, { 119,-91094 }, + { 120,-91094 }, { 121,-91094 }, { 122,-91094 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 127,-91094 }, { 128,-91094 }, { 129,-91094 }, + { 130,-91094 }, { 131,-91094 }, { 132,-91094 }, { 133,-91094 }, { 134,-91094 }, + { 135,-91094 }, { 136,-91094 }, { 137,-91094 }, { 138,-91094 }, { 139,-91094 }, + + { 140,-91094 }, { 141,-91094 }, { 142,-91094 }, { 143,-91094 }, { 144,-91094 }, + { 145,-91094 }, { 146,-91094 }, { 147,-91094 }, { 148,-91094 }, { 149,-91094 }, + { 150,-91094 }, { 151,-91094 }, { 152,-91094 }, { 153,-91094 }, { 154,-91094 }, + { 155,-91094 }, { 156,-91094 }, { 157,-91094 }, { 158,-91094 }, { 159,-91094 }, + { 160,-91094 }, { 161,-91094 }, { 162,-91094 }, { 163,-91094 }, { 164,-91094 }, + { 165,-91094 }, { 166,-91094 }, { 167,-91094 }, { 168,-91094 }, { 169,-91094 }, + { 170,-91094 }, { 171,-91094 }, { 172,-91094 }, { 173,-91094 }, { 174,-91094 }, + { 175,-91094 }, { 176,-91094 }, { 177,-91094 }, { 178,-91094 }, { 179,-91094 }, + { 180,-91094 }, { 181,-91094 }, { 182,-91094 }, { 183,-91094 }, { 184,-91094 }, + { 185,-91094 }, { 186,-91094 }, { 187,-91094 }, { 188,-91094 }, { 189,-91094 }, + + { 190,-91094 }, { 191,-91094 }, { 192,-91094 }, { 193,-91094 }, { 194,-91094 }, + { 195,-91094 }, { 196,-91094 }, { 197,-91094 }, { 198,-91094 }, { 199,-91094 }, + { 200,-91094 }, { 201,-91094 }, { 202,-91094 }, { 203,-91094 }, { 204,-91094 }, + { 205,-91094 }, { 206,-91094 }, { 207,-91094 }, { 208,-91094 }, { 209,-91094 }, + { 210,-91094 }, { 211,-91094 }, { 212,-91094 }, { 213,-91094 }, { 214,-91094 }, + { 215,-91094 }, { 216,-91094 }, { 217,-91094 }, { 218,-91094 }, { 219,-91094 }, + { 220,-91094 }, { 221,-91094 }, { 222,-91094 }, { 223,-91094 }, { 224,-91094 }, + { 225,-91094 }, { 226,-91094 }, { 227,-91094 }, { 228,-91094 }, { 229,-91094 }, + { 230,-91094 }, { 231,-91094 }, { 232,-91094 }, { 233,-91094 }, { 234,-91094 }, + { 235,-91094 }, { 236,-91094 }, { 237,-91094 }, { 238,-91094 }, { 239,-91094 }, + + { 240,-91094 }, { 241,-91094 }, { 242,-91094 }, { 243,-91094 }, { 244,-91094 }, + { 245,-91094 }, { 246,-91094 }, { 247,-91094 }, { 248,-91094 }, { 249,-91094 }, + { 250,-91094 }, { 251,-91094 }, { 252,-91094 }, { 253,-91094 }, { 254,-91094 }, + { 255,-91094 }, { 0, 84 }, { 0, 772 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 48,-91351 }, { 49,-91351 }, { 50,-91351 }, { 51,-91351 }, { 52,-91351 }, + { 53,-91351 }, { 54,-91351 }, { 55,-91351 }, { 56,-91351 }, { 57,-91351 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 65,-91351 }, { 66,-91351 }, { 67,-91351 }, + { 68,-91351 }, { 69,-91351 }, { 70,-91351 }, { 71,-91351 }, { 72,-91351 }, + { 73,-91351 }, { 74,-91351 }, { 75,-91351 }, { 76,-91351 }, { 77,-91351 }, + { 78,-91351 }, { 79,-91351 }, { 80,-91351 }, { 81,-91351 }, { 82,-91351 }, + + { 83,-91351 }, { 84,-91351 }, { 85,-91351 }, { 86,-91351 }, { 87,-91351 }, + { 88,-91351 }, { 89,-91351 }, { 90,-91351 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 95,-91351 }, { 0, 0 }, { 97,-91351 }, + { 98,-91351 }, { 99,-91351 }, { 100,-91351 }, { 101,-91351 }, { 102,-91351 }, + { 103,-91351 }, { 104,-91351 }, { 105,-91351 }, { 106,-91351 }, { 107,-91351 }, + { 108,-91351 }, { 109,-91351 }, { 110,-91351 }, { 111,-91351 }, { 112,-91351 }, + { 113,-91351 }, { 114,-91351 }, { 115,-91351 }, { 116,-91351 }, { 117,-91351 }, + { 118,-91351 }, { 119,-91351 }, { 120,-91351 }, { 121,-91351 }, { 122,-91351 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-91351 }, + { 128,-91351 }, { 129,-91351 }, { 130,-91351 }, { 131,-91351 }, { 132,-91351 }, + + { 133,-91351 }, { 134,-91351 }, { 135,-91351 }, { 136,-91351 }, { 137,-91351 }, + { 138,-91351 }, { 139,-91351 }, { 140,-91351 }, { 141,-91351 }, { 142,-91351 }, + { 143,-91351 }, { 144,-91351 }, { 145,-91351 }, { 146,-91351 }, { 147,-91351 }, + { 148,-91351 }, { 149,-91351 }, { 150,-91351 }, { 151,-91351 }, { 152,-91351 }, + { 153,-91351 }, { 154,-91351 }, { 155,-91351 }, { 156,-91351 }, { 157,-91351 }, + { 158,-91351 }, { 159,-91351 }, { 160,-91351 }, { 161,-91351 }, { 162,-91351 }, + { 163,-91351 }, { 164,-91351 }, { 165,-91351 }, { 166,-91351 }, { 167,-91351 }, + { 168,-91351 }, { 169,-91351 }, { 170,-91351 }, { 171,-91351 }, { 172,-91351 }, + { 173,-91351 }, { 174,-91351 }, { 175,-91351 }, { 176,-91351 }, { 177,-91351 }, + { 178,-91351 }, { 179,-91351 }, { 180,-91351 }, { 181,-91351 }, { 182,-91351 }, + + { 183,-91351 }, { 184,-91351 }, { 185,-91351 }, { 186,-91351 }, { 187,-91351 }, + { 188,-91351 }, { 189,-91351 }, { 190,-91351 }, { 191,-91351 }, { 192,-91351 }, + { 193,-91351 }, { 194,-91351 }, { 195,-91351 }, { 196,-91351 }, { 197,-91351 }, + { 198,-91351 }, { 199,-91351 }, { 200,-91351 }, { 201,-91351 }, { 202,-91351 }, + { 203,-91351 }, { 204,-91351 }, { 205,-91351 }, { 206,-91351 }, { 207,-91351 }, + { 208,-91351 }, { 209,-91351 }, { 210,-91351 }, { 211,-91351 }, { 212,-91351 }, + { 213,-91351 }, { 214,-91351 }, { 215,-91351 }, { 216,-91351 }, { 217,-91351 }, + { 218,-91351 }, { 219,-91351 }, { 220,-91351 }, { 221,-91351 }, { 222,-91351 }, + { 223,-91351 }, { 224,-91351 }, { 225,-91351 }, { 226,-91351 }, { 227,-91351 }, + { 228,-91351 }, { 229,-91351 }, { 230,-91351 }, { 231,-91351 }, { 232,-91351 }, + + { 233,-91351 }, { 234,-91351 }, { 235,-91351 }, { 236,-91351 }, { 237,-91351 }, + { 238,-91351 }, { 239,-91351 }, { 240,-91351 }, { 241,-91351 }, { 242,-91351 }, + { 243,-91351 }, { 244,-91351 }, { 245,-91351 }, { 246,-91351 }, { 247,-91351 }, + { 248,-91351 }, { 249,-91351 }, { 250,-91351 }, { 251,-91351 }, { 252,-91351 }, + { 253,-91351 }, { 254,-91351 }, { 255,-91351 }, { 0, 131 }, { 0, 515 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 48,-91608 }, { 49,-91608 }, { 50,-91608 }, + { 51,-91608 }, { 52,-91608 }, { 53,-91608 }, { 54,-91608 }, { 55,-91608 }, + { 56,-91608 }, { 57,-91608 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,-91608 }, + { 66,-91608 }, { 67,-91608 }, { 68,-91608 }, { 69,-91608 }, { 70,-91608 }, + { 71,-91608 }, { 72,-91608 }, { 73,-91608 }, { 74,-91608 }, { 75,-91608 }, + + { 76,-91608 }, { 77,-91608 }, { 78,-91608 }, { 79,-91608 }, { 80,-91608 }, + { 81,-91608 }, { 82, 257 }, { 83,-91608 }, { 84,-91608 }, { 85,-91608 }, + { 86,-91608 }, { 87,-91608 }, { 88,-91608 }, { 89,-91608 }, { 90,-91608 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,-91608 }, + { 0, 0 }, { 97,-91608 }, { 98,-91608 }, { 99,-91608 }, { 100,-91608 }, + { 101,-91608 }, { 102,-91608 }, { 103,-91608 }, { 104,-91608 }, { 105,-91608 }, + { 106,-91608 }, { 107,-91608 }, { 108,-91608 }, { 109,-91608 }, { 110,-91608 }, + { 111,-91608 }, { 112,-91608 }, { 113,-91608 }, { 114, 257 }, { 115,-91608 }, + { 116,-91608 }, { 117,-91608 }, { 118,-91608 }, { 119,-91608 }, { 120,-91608 }, + { 121,-91608 }, { 122,-91608 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 127,-91608 }, { 128,-91608 }, { 129,-91608 }, { 130,-91608 }, + { 131,-91608 }, { 132,-91608 }, { 133,-91608 }, { 134,-91608 }, { 135,-91608 }, + { 136,-91608 }, { 137,-91608 }, { 138,-91608 }, { 139,-91608 }, { 140,-91608 }, + { 141,-91608 }, { 142,-91608 }, { 143,-91608 }, { 144,-91608 }, { 145,-91608 }, + { 146,-91608 }, { 147,-91608 }, { 148,-91608 }, { 149,-91608 }, { 150,-91608 }, + { 151,-91608 }, { 152,-91608 }, { 153,-91608 }, { 154,-91608 }, { 155,-91608 }, + { 156,-91608 }, { 157,-91608 }, { 158,-91608 }, { 159,-91608 }, { 160,-91608 }, + { 161,-91608 }, { 162,-91608 }, { 163,-91608 }, { 164,-91608 }, { 165,-91608 }, + { 166,-91608 }, { 167,-91608 }, { 168,-91608 }, { 169,-91608 }, { 170,-91608 }, + { 171,-91608 }, { 172,-91608 }, { 173,-91608 }, { 174,-91608 }, { 175,-91608 }, + + { 176,-91608 }, { 177,-91608 }, { 178,-91608 }, { 179,-91608 }, { 180,-91608 }, + { 181,-91608 }, { 182,-91608 }, { 183,-91608 }, { 184,-91608 }, { 185,-91608 }, + { 186,-91608 }, { 187,-91608 }, { 188,-91608 }, { 189,-91608 }, { 190,-91608 }, + { 191,-91608 }, { 192,-91608 }, { 193,-91608 }, { 194,-91608 }, { 195,-91608 }, + { 196,-91608 }, { 197,-91608 }, { 198,-91608 }, { 199,-91608 }, { 200,-91608 }, + { 201,-91608 }, { 202,-91608 }, { 203,-91608 }, { 204,-91608 }, { 205,-91608 }, + { 206,-91608 }, { 207,-91608 }, { 208,-91608 }, { 209,-91608 }, { 210,-91608 }, + { 211,-91608 }, { 212,-91608 }, { 213,-91608 }, { 214,-91608 }, { 215,-91608 }, + { 216,-91608 }, { 217,-91608 }, { 218,-91608 }, { 219,-91608 }, { 220,-91608 }, + { 221,-91608 }, { 222,-91608 }, { 223,-91608 }, { 224,-91608 }, { 225,-91608 }, + + { 226,-91608 }, { 227,-91608 }, { 228,-91608 }, { 229,-91608 }, { 230,-91608 }, + { 231,-91608 }, { 232,-91608 }, { 233,-91608 }, { 234,-91608 }, { 235,-91608 }, + { 236,-91608 }, { 237,-91608 }, { 238,-91608 }, { 239,-91608 }, { 240,-91608 }, + { 241,-91608 }, { 242,-91608 }, { 243,-91608 }, { 244,-91608 }, { 245,-91608 }, + { 246,-91608 }, { 247,-91608 }, { 248,-91608 }, { 249,-91608 }, { 250,-91608 }, + { 251,-91608 }, { 252,-91608 }, { 253,-91608 }, { 254,-91608 }, { 255,-91608 }, + { 0, 71 }, { 0, 258 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,-91865 }, + { 49,-91865 }, { 50,-91865 }, { 51,-91865 }, { 52,-91865 }, { 53,-91865 }, + { 54,-91865 }, { 55,-91865 }, { 56,-91865 }, { 57,-91865 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 65,-91865 }, { 66,-91865 }, { 67,-91865 }, { 68,-91865 }, + + { 69,-91865 }, { 70,-91865 }, { 71,-91865 }, { 72,-91865 }, { 73,-91865 }, + { 74,-91865 }, { 75,-91865 }, { 76,-91865 }, { 77,-91865 }, { 78,-91865 }, + { 79,-91865 }, { 80,-91865 }, { 81,-91865 }, { 82,-91865 }, { 83,-91865 }, + { 84,-91865 }, { 85,-91865 }, { 86,-91865 }, { 87,-91865 }, { 88,-91865 }, + { 89,-91865 }, { 90,-91865 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 95,-91865 }, { 0, 0 }, { 97,-91865 }, { 98,-91865 }, + { 99,-91865 }, { 100,-91865 }, { 101,-91865 }, { 102,-91865 }, { 103,-91865 }, + { 104,-91865 }, { 105,-91865 }, { 106,-91865 }, { 107,-91865 }, { 108,-91865 }, + { 109,-91865 }, { 110,-91865 }, { 111,-91865 }, { 112,-91865 }, { 113,-91865 }, + { 114,-91865 }, { 115,-91865 }, { 116,-91865 }, { 117,-91865 }, { 118,-91865 }, + + { 119,-91865 }, { 120,-91865 }, { 121,-91865 }, { 122,-91865 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, { 127,-91865 }, { 128,-91865 }, + { 129,-91865 }, { 130,-91865 }, { 131,-91865 }, { 132,-91865 }, { 133,-91865 }, + { 134,-91865 }, { 135,-91865 }, { 136,-91865 }, { 137,-91865 }, { 138,-91865 }, + { 139,-91865 }, { 140,-91865 }, { 141,-91865 }, { 142,-91865 }, { 143,-91865 }, + { 144,-91865 }, { 145,-91865 }, { 146,-91865 }, { 147,-91865 }, { 148,-91865 }, + { 149,-91865 }, { 150,-91865 }, { 151,-91865 }, { 152,-91865 }, { 153,-91865 }, + { 154,-91865 }, { 155,-91865 }, { 156,-91865 }, { 157,-91865 }, { 158,-91865 }, + { 159,-91865 }, { 160,-91865 }, { 161,-91865 }, { 162,-91865 }, { 163,-91865 }, + { 164,-91865 }, { 165,-91865 }, { 166,-91865 }, { 167,-91865 }, { 168,-91865 }, + + { 169,-91865 }, { 170,-91865 }, { 171,-91865 }, { 172,-91865 }, { 173,-91865 }, + { 174,-91865 }, { 175,-91865 }, { 176,-91865 }, { 177,-91865 }, { 178,-91865 }, + { 179,-91865 }, { 180,-91865 }, { 181,-91865 }, { 182,-91865 }, { 183,-91865 }, + { 184,-91865 }, { 185,-91865 }, { 186,-91865 }, { 187,-91865 }, { 188,-91865 }, + { 189,-91865 }, { 190,-91865 }, { 191,-91865 }, { 192,-91865 }, { 193,-91865 }, + { 194,-91865 }, { 195,-91865 }, { 196,-91865 }, { 197,-91865 }, { 198,-91865 }, + { 199,-91865 }, { 200,-91865 }, { 201,-91865 }, { 202,-91865 }, { 203,-91865 }, + { 204,-91865 }, { 205,-91865 }, { 206,-91865 }, { 207,-91865 }, { 208,-91865 }, + { 209,-91865 }, { 210,-91865 }, { 211,-91865 }, { 212,-91865 }, { 213,-91865 }, + { 214,-91865 }, { 215,-91865 }, { 216,-91865 }, { 217,-91865 }, { 218,-91865 }, + + { 219,-91865 }, { 220,-91865 }, { 221,-91865 }, { 222,-91865 }, { 223,-91865 }, + { 224,-91865 }, { 225,-91865 }, { 226,-91865 }, { 227,-91865 }, { 228,-91865 }, + { 229,-91865 }, { 230,-91865 }, { 231,-91865 }, { 232,-91865 }, { 233,-91865 }, + { 234,-91865 }, { 235,-91865 }, { 236,-91865 }, { 237,-91865 }, { 238,-91865 }, + { 239,-91865 }, { 240,-91865 }, { 241,-91865 }, { 242,-91865 }, { 243,-91865 }, + { 244,-91865 }, { 245,-91865 }, { 246,-91865 }, { 247,-91865 }, { 248,-91865 }, + { 249,-91865 }, { 250,-91865 }, { 251,-91865 }, { 252,-91865 }, { 253,-91865 }, + { 254,-91865 }, { 255,-91865 }, { 0, 0 }, { 257, 144 }, { 1, 0 }, + }; + +static yyconst struct yy_trans_info *yy_start_state_list[23] = + { + &yy_transition[1], + &yy_transition[3], + &yy_transition[261], + &yy_transition[519], + &yy_transition[777], + &yy_transition[1035], + &yy_transition[1293], + &yy_transition[1551], + &yy_transition[1809], + &yy_transition[2067], + &yy_transition[2325], + &yy_transition[2583], + &yy_transition[2841], + &yy_transition[3099], + &yy_transition[3357], + &yy_transition[3615], + &yy_transition[3873], + &yy_transition[4131], + &yy_transition[4389], + &yy_transition[4647], + &yy_transition[4905], + &yy_transition[5163], + &yy_transition[5421], + } ; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() (yyg->yy_more_flag = 1) +#define YY_MORE_ADJ yyg->yy_more_len +#define YY_RESTORE_YY_MORE_OFFSET +#line 1 "scanner.l" +#line 2 "scanner.l" +#include "ast.hpp" +#define push_state(s) xhp_new_push_state(s, yyg) +#define pop_state() xhp_new_pop_state(yyg) +#define set_state(s) xhp_set_state(s, yyg) + +#define pttok(t, txt) \ + yyextra->token_list.push_back( \ + new xhpast::Token(t, txt, yyextra->list_size++)); \ + *yylval = new xhpast::Node(0, yyextra->list_size - 1); +#define ptok(t) \ + pttok(t, yytext); +#define tok(t) \ + ptok(t); \ + return yy_token(t, yyg) +#define YY_USER_INIT \ + if (yyextra->insert_token) { \ + yyg->yy_init = 0; \ + int ft = yyextra->insert_token; \ + yyextra->insert_token = 0; \ + return yy_token(ft, yyg); \ + } + +using namespace std; + +const char* yytokname(int tok); +static int yy_token(int tok, struct yyguts_t* yyg); +static void yy_scan_newlines(const char* text, struct yyguts_t* yyg); + +/* PHP allows IF or if */ +/* The different lexing states. Note that the transitions are done either +* in the lex actions, or in a generic manner in yy_token(). */ + + + + + + + + + + +#line 24439 "scanner.lex.cpp" + +#define INITIAL 0 +#define PHP 1 +#define PHP_COMMENT 2 +#define PHP_EOL_COMMENT 3 +#define PHP_DOC_COMMENT 4 +#define PHP_HEREDOC_START 5 +#define PHP_HEREDOC_NSTART 6 +#define PHP_HEREDOC_NEWLINE 7 +#define PHP_NO_RESERVED_WORDS 8 +#define PHP_NO_RESERVED_WORDS_PERSIST 9 +#define PHP_ 10 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +/* Holds the entire state of the reentrant scanner. */ +struct yyguts_t + { + + /* User-defined. Not touched by flex. */ + YY_EXTRA_TYPE yyextra_r; + + /* The rest are the same as the globals declared in the non-reentrant scanner. */ + FILE *yyin_r, *yyout_r; + size_t yy_buffer_stack_top; /**< index of top of stack. */ + size_t yy_buffer_stack_max; /**< capacity of stack. */ + YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ + char yy_hold_char; + int yy_n_chars; + int yyleng_r; + char *yy_c_buf_p; + int yy_init; + int yy_start; + int yy_did_buffer_switch_on_eof; + int yy_start_stack_ptr; + int yy_start_stack_depth; + int *yy_start_stack; + yy_state_type yy_last_accepting_state; + char* yy_last_accepting_cpos; + + int yylineno_r; + int yy_flex_debug_r; + + char *yytext_r; + int yy_more_flag; + int yy_more_len; + + YYSTYPE * yylval_r; + + }; /* end struct yyguts_t */ + +static int yy_init_globals (yyscan_t yyscanner ); + + /* This must go here because YYSTYPE and YYLTYPE are included + * from bison output in section 1.*/ + # define yylval yyg->yylval_r + +int xhpastlex_init (yyscan_t* scanner); + +int xhpastlex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int xhpastlex_destroy (yyscan_t yyscanner ); + +int xhpastget_debug (yyscan_t yyscanner ); + +void xhpastset_debug (int debug_flag ,yyscan_t yyscanner ); + +YY_EXTRA_TYPE xhpastget_extra (yyscan_t yyscanner ); + +void xhpastset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner ); + +FILE *xhpastget_in (yyscan_t yyscanner ); + +void xhpastset_in (FILE * in_str ,yyscan_t yyscanner ); + +FILE *xhpastget_out (yyscan_t yyscanner ); + +void xhpastset_out (FILE * out_str ,yyscan_t yyscanner ); + +int xhpastget_leng (yyscan_t yyscanner ); + +char *xhpastget_text (yyscan_t yyscanner ); + +int xhpastget_lineno (yyscan_t yyscanner ); + +void xhpastset_lineno (int line_number ,yyscan_t yyscanner ); + +YYSTYPE * xhpastget_lval (yyscan_t yyscanner ); + +void xhpastset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int xhpastwrap (yyscan_t yyscanner ); +#else +extern int xhpastwrap (yyscan_t yyscanner ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ,yyscan_t yyscanner); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (yyscan_t yyscanner ); +#else +static int input (yyscan_t yyscanner ); +#endif + +#endif + + static void yy_push_state (int new_state ,yyscan_t yyscanner); + + static void yy_pop_state (yyscan_t yyscanner ); + + static int yy_top_state (yyscan_t yyscanner ); + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else +#define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + errno=0; \ + while ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int xhpastlex \ + (YYSTYPE * yylval_param ,yyscan_t yyscanner); + +#define YY_DECL int xhpastlex \ + (YYSTYPE * yylval_param , yyscan_t yyscanner) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + +#line 67 "scanner.l" + + + /* Open / close PHP + inline HTML */ +#line 24681 "scanner.lex.cpp" + + yylval = yylval_param; + + if ( !yyg->yy_init ) + { + yyg->yy_init = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yyg->yy_start ) + yyg->yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + xhpastensure_buffer_stack (yyscanner); + YY_CURRENT_BUFFER_LVALUE = + xhpast_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); + } + + xhpast_load_buffer_state(yyscanner ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yyg->yy_more_len = 0; + if ( yyg->yy_more_flag ) + { + yyg->yy_more_len = yyg->yy_c_buf_p - yyg->yytext_ptr; + yyg->yy_more_flag = 0; + } + yy_cp = yyg->yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yyg->yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start_state_list[yyg->yy_start]; +yy_match: + { + register yyconst struct yy_trans_info *yy_trans_info; + + register YY_CHAR yy_c; + + for ( yy_c = YY_SC_TO_UI(*yy_cp); + (yy_trans_info = &yy_current_state[(unsigned int) yy_c])-> + yy_verify == yy_c; + yy_c = YY_SC_TO_UI(*++yy_cp) ) + { + yy_current_state += yy_trans_info->yy_nxt; + + if ( yy_current_state[-1].yy_nxt ) + { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + } + } + +yy_find_action: + yy_act = yy_current_state[-1].yy_nxt; + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = yyg->yy_hold_char; + yy_cp = yyg->yy_last_accepting_cpos + 1; + yy_current_state = yyg->yy_last_accepting_state; + goto yy_find_action; + +case 1: +/* rule 1 can match eol */ +*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */ +yyg->yy_c_buf_p = yy_cp = yy_bp + 5; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 71 "scanner.l" +{ + yy_scan_newlines(yytext + 5, yyg); + // the state transition will be done in yy_token() + tok(T_OPEN_TAG); + } + YY_BREAK +case 2: +YY_RULE_SETUP +#line 76 "scanner.l" +{ + tok(T_OPEN_TAG); + } + YY_BREAK +case 3: +YY_RULE_SETUP +#line 79 "scanner.l" +{ + tok(T_OPEN_TAG_WITH_ECHO); + } + YY_BREAK +case 4: +/* rule 4 can match eol */ +YY_RULE_SETUP +#line 82 "scanner.l" +{ + yy_scan_newlines(yytext, yyg); + tok(T_INLINE_HTML); + } + YY_BREAK + + +case 5: +/* rule 5 can match eol */ +YY_RULE_SETUP +#line 88 "scanner.l" +{ + yy_scan_newlines(yytext + 2, yyg); + tok(T_CLOSE_TAG); + } + YY_BREAK + +/* Comments and whitespace */ + +case 6: +YY_RULE_SETUP +#line 96 "scanner.l" +{ + push_state(PHP_EOL_COMMENT); + yymore(); + } + YY_BREAK +case 7: +/* rule 7 can match eol */ +YY_RULE_SETUP +#line 100 "scanner.l" +{ + yy_scan_newlines(yytext + 3, yyg); + push_state(PHP_DOC_COMMENT); + yymore(); + } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 105 "scanner.l" +{ + push_state(PHP_COMMENT); + yymore(); + } + YY_BREAK +case 9: +/* rule 9 can match eol */ +YY_RULE_SETUP +#line 109 "scanner.l" +{ + yy_scan_newlines(yytext, yyg); + ptok(T_WHITESPACE); + } + YY_BREAK + +case YY_STATE_EOF(PHP_EOL_COMMENT): +#line 114 "scanner.l" +{ + ptok(T_COMMENT); + pop_state(); +} + YY_BREAK + +case 10: +/* rule 10 can match eol */ +YY_RULE_SETUP +#line 119 "scanner.l" +{ + ++yyextra->lineno; + ptok(T_COMMENT); + pop_state(); + } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 124 "scanner.l" +yymore(); + YY_BREAK +case 12: +YY_RULE_SETUP +#line 125 "scanner.l" +{ + yyless(yyleng - 2); + ptok(T_COMMENT); + pop_state(); + } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 130 "scanner.l" +yymore(); + YY_BREAK + + +case 14: +/* rule 14 can match eol */ +YY_RULE_SETUP +#line 133 "scanner.l" +{ + ++yyextra->lineno; + yymore(); + } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 137 "scanner.l" +yymore(); + YY_BREAK + +case 16: +YY_RULE_SETUP +#line 139 "scanner.l" +{ + ptok(T_DOC_COMMENT); + pop_state(); +} + YY_BREAK +case YY_STATE_EOF(PHP_DOC_COMMENT): +#line 143 "scanner.l" +{ + ptok(T_DOC_COMMENT); + pop_state(); +} + YY_BREAK +case 17: +YY_RULE_SETUP +#line 147 "scanner.l" +{ + ptok(T_COMMENT); + pop_state(); +} + YY_BREAK +case YY_STATE_EOF(PHP_COMMENT): +#line 151 "scanner.l" +{ + ptok(T_COMMENT); + pop_state(); +} + YY_BREAK +/* Reserved words */ + +case 18: +YY_RULE_SETUP +#line 158 "scanner.l" +tok(T_INCLUDE); + YY_BREAK +case 19: +YY_RULE_SETUP +#line 159 "scanner.l" +tok(T_INCLUDE_ONCE); + YY_BREAK +case 20: +YY_RULE_SETUP +#line 160 "scanner.l" +tok(T_EVAL); + YY_BREAK +case 21: +YY_RULE_SETUP +#line 161 "scanner.l" +tok(T_REQUIRE); + YY_BREAK +case 22: +YY_RULE_SETUP +#line 162 "scanner.l" +tok(T_REQUIRE_ONCE); + YY_BREAK +case 23: +YY_RULE_SETUP +#line 163 "scanner.l" +tok(T_LOGICAL_OR); + YY_BREAK +case 24: +YY_RULE_SETUP +#line 164 "scanner.l" +tok(T_LOGICAL_XOR); + YY_BREAK +case 25: +YY_RULE_SETUP +#line 165 "scanner.l" +tok(T_LOGICAL_AND); + YY_BREAK +case 26: +YY_RULE_SETUP +#line 166 "scanner.l" +tok(T_PRINT); + YY_BREAK +case 27: +YY_RULE_SETUP +#line 167 "scanner.l" +tok(T_INSTANCEOF); + YY_BREAK +case 28: +YY_RULE_SETUP +#line 168 "scanner.l" +tok(T_NEW); + YY_BREAK +case 29: +YY_RULE_SETUP +#line 169 "scanner.l" +tok(T_CLONE); + YY_BREAK +case 30: +YY_RULE_SETUP +#line 170 "scanner.l" +tok(T_EXIT); + YY_BREAK +case 31: +YY_RULE_SETUP +#line 171 "scanner.l" +tok(T_IF); + YY_BREAK +case 32: +YY_RULE_SETUP +#line 172 "scanner.l" +tok(T_ELSEIF); + YY_BREAK +case 33: +YY_RULE_SETUP +#line 173 "scanner.l" +tok(T_ELSE); + YY_BREAK +case 34: +YY_RULE_SETUP +#line 174 "scanner.l" +tok(T_ENDIF); + YY_BREAK +case 35: +YY_RULE_SETUP +#line 175 "scanner.l" +tok(T_ECHO); + YY_BREAK +case 36: +YY_RULE_SETUP +#line 176 "scanner.l" +tok(T_DO); + YY_BREAK +case 37: +YY_RULE_SETUP +#line 177 "scanner.l" +tok(T_WHILE); + YY_BREAK +case 38: +YY_RULE_SETUP +#line 178 "scanner.l" +tok(T_ENDWHILE); + YY_BREAK +case 39: +YY_RULE_SETUP +#line 179 "scanner.l" +tok(T_FOR); + YY_BREAK +case 40: +YY_RULE_SETUP +#line 180 "scanner.l" +tok(T_ENDFOR); + YY_BREAK +case 41: +YY_RULE_SETUP +#line 181 "scanner.l" +tok(T_FOREACH); + YY_BREAK +case 42: +YY_RULE_SETUP +#line 182 "scanner.l" +tok(T_ENDFOREACH); + YY_BREAK +case 43: +YY_RULE_SETUP +#line 183 "scanner.l" +tok(T_DECLARE); + YY_BREAK +case 44: +YY_RULE_SETUP +#line 184 "scanner.l" +tok(T_ENDDECLARE); + YY_BREAK +case 45: +YY_RULE_SETUP +#line 185 "scanner.l" +tok(T_AS); + YY_BREAK +case 46: +YY_RULE_SETUP +#line 186 "scanner.l" +tok(T_SWITCH); + YY_BREAK +case 47: +YY_RULE_SETUP +#line 187 "scanner.l" +tok(T_ENDSWITCH); + YY_BREAK +case 48: +YY_RULE_SETUP +#line 188 "scanner.l" +tok(T_CASE); + YY_BREAK +case 49: +YY_RULE_SETUP +#line 189 "scanner.l" +tok(T_DEFAULT); + YY_BREAK +case 50: +YY_RULE_SETUP +#line 190 "scanner.l" +tok(T_BREAK); + YY_BREAK +case 51: +YY_RULE_SETUP +#line 191 "scanner.l" +tok(T_CONTINUE); + YY_BREAK +case 52: +YY_RULE_SETUP +#line 192 "scanner.l" +tok(T_GOTO); + YY_BREAK +case 53: +YY_RULE_SETUP +#line 193 "scanner.l" +tok(T_FUNCTION); + YY_BREAK +case 54: +YY_RULE_SETUP +#line 194 "scanner.l" +tok(T_CONST); + YY_BREAK +case 55: +YY_RULE_SETUP +#line 195 "scanner.l" +tok(T_RETURN); + YY_BREAK +case 56: +YY_RULE_SETUP +#line 196 "scanner.l" +tok(T_TRY); + YY_BREAK +case 57: +YY_RULE_SETUP +#line 197 "scanner.l" +tok(T_CATCH); + YY_BREAK +case 58: +YY_RULE_SETUP +#line 198 "scanner.l" +tok(T_THROW); + YY_BREAK +case 59: +YY_RULE_SETUP +#line 199 "scanner.l" +tok(T_USE); + YY_BREAK +case 60: +YY_RULE_SETUP +#line 200 "scanner.l" +tok(T_GLOBAL); + YY_BREAK +case 61: +YY_RULE_SETUP +#line 201 "scanner.l" +tok(T_STATIC); + YY_BREAK +case 62: +YY_RULE_SETUP +#line 202 "scanner.l" +tok(T_ABSTRACT); + YY_BREAK +case 63: +YY_RULE_SETUP +#line 203 "scanner.l" +tok(T_FINAL); + YY_BREAK +case 64: +YY_RULE_SETUP +#line 204 "scanner.l" +tok(T_PRIVATE); + YY_BREAK +case 65: +YY_RULE_SETUP +#line 205 "scanner.l" +tok(T_PROTECTED); + YY_BREAK +case 66: +YY_RULE_SETUP +#line 206 "scanner.l" +tok(T_PUBLIC); + YY_BREAK +case 67: +YY_RULE_SETUP +#line 207 "scanner.l" +tok(T_VAR); + YY_BREAK +case 68: +YY_RULE_SETUP +#line 208 "scanner.l" +tok(T_UNSET); + YY_BREAK +case 69: +YY_RULE_SETUP +#line 209 "scanner.l" +tok(T_ISSET); + YY_BREAK +case 70: +YY_RULE_SETUP +#line 210 "scanner.l" +tok(T_EMPTY); + YY_BREAK +case 71: +YY_RULE_SETUP +#line 211 "scanner.l" +tok(T_HALT_COMPILER); + YY_BREAK +case 72: +YY_RULE_SETUP +#line 212 "scanner.l" +tok(T_CLASS); + YY_BREAK +case 73: +YY_RULE_SETUP +#line 213 "scanner.l" +tok(T_INTERFACE); + YY_BREAK +case 74: +YY_RULE_SETUP +#line 214 "scanner.l" +tok(T_EXTENDS); + YY_BREAK +case 75: +YY_RULE_SETUP +#line 215 "scanner.l" +tok(T_IMPLEMENTS); + YY_BREAK +case 76: +YY_RULE_SETUP +#line 216 "scanner.l" +tok(T_LIST); + YY_BREAK +case 77: +YY_RULE_SETUP +#line 217 "scanner.l" +tok(T_ARRAY); + YY_BREAK +case 78: +YY_RULE_SETUP +#line 218 "scanner.l" +tok(T_CLASS_C); + YY_BREAK +case 79: +YY_RULE_SETUP +#line 219 "scanner.l" +tok(T_METHOD_C); + YY_BREAK +case 80: +YY_RULE_SETUP +#line 220 "scanner.l" +tok(T_FUNC_C); + YY_BREAK +case 81: +YY_RULE_SETUP +#line 221 "scanner.l" +tok(T_LINE); + YY_BREAK +case 82: +YY_RULE_SETUP +#line 222 "scanner.l" +tok(T_FILE); + YY_BREAK +case 83: +YY_RULE_SETUP +#line 223 "scanner.l" +tok(T_NAMESPACE); + YY_BREAK +case 84: +YY_RULE_SETUP +#line 224 "scanner.l" +tok(T_NS_C); + YY_BREAK +case 85: +YY_RULE_SETUP +#line 225 "scanner.l" +tok(T_DIR); + YY_BREAK +case 86: +YY_RULE_SETUP +#line 226 "scanner.l" +tok(T_INSTEADOF); + YY_BREAK +case 87: +YY_RULE_SETUP +#line 227 "scanner.l" +tok(T_CALLABLE); + YY_BREAK +case 88: +YY_RULE_SETUP +#line 228 "scanner.l" +tok(T_TRAIT); + YY_BREAK +case 89: +YY_RULE_SETUP +#line 229 "scanner.l" +tok(T_TRAIT_C); + YY_BREAK +case 90: +YY_RULE_SETUP +#line 230 "scanner.l" +tok(T_YIELD); + YY_BREAK +case 91: +YY_RULE_SETUP +#line 231 "scanner.l" +tok(T_FINALLY); + YY_BREAK + +/* Operators */ + +case 92: +YY_RULE_SETUP +#line 236 "scanner.l" +tok(T_PLUS_EQUAL); + YY_BREAK +case 93: +YY_RULE_SETUP +#line 237 "scanner.l" +tok(T_MINUS_EQUAL); + YY_BREAK +case 94: +YY_RULE_SETUP +#line 238 "scanner.l" +tok(T_MUL_EQUAL); + YY_BREAK +case 95: +YY_RULE_SETUP +#line 239 "scanner.l" +tok(T_DIV_EQUAL); + YY_BREAK +case 96: +YY_RULE_SETUP +#line 240 "scanner.l" +tok(T_CONCAT_EQUAL); + YY_BREAK +case 97: +YY_RULE_SETUP +#line 241 "scanner.l" +tok(T_MOD_EQUAL); + YY_BREAK +case 98: +YY_RULE_SETUP +#line 242 "scanner.l" +tok(T_AND_EQUAL); + YY_BREAK +case 99: +YY_RULE_SETUP +#line 243 "scanner.l" +tok(T_OR_EQUAL); + YY_BREAK +case 100: +YY_RULE_SETUP +#line 244 "scanner.l" +tok(T_XOR_EQUAL); + YY_BREAK +case 101: +YY_RULE_SETUP +#line 245 "scanner.l" +tok(T_SL_EQUAL); + YY_BREAK +case 102: +YY_RULE_SETUP +#line 246 "scanner.l" +tok(T_SR_EQUAL); + YY_BREAK +case 103: +YY_RULE_SETUP +#line 247 "scanner.l" +tok(T_BOOLEAN_OR); + YY_BREAK +case 104: +YY_RULE_SETUP +#line 248 "scanner.l" +tok(T_BOOLEAN_AND); + YY_BREAK +case 105: +YY_RULE_SETUP +#line 249 "scanner.l" +tok(T_IS_EQUAL); + YY_BREAK +case 106: +YY_RULE_SETUP +#line 250 "scanner.l" +tok(T_IS_NOT_EQUAL); + YY_BREAK +case 107: +YY_RULE_SETUP +#line 251 "scanner.l" +tok(T_IS_IDENTICAL); + YY_BREAK +case 108: +YY_RULE_SETUP +#line 252 "scanner.l" +tok(T_IS_NOT_IDENTICAL); + YY_BREAK +case 109: +YY_RULE_SETUP +#line 253 "scanner.l" +tok(T_IS_SMALLER_OR_EQUAL); + YY_BREAK +case 110: +YY_RULE_SETUP +#line 254 "scanner.l" +tok(T_IS_GREATER_OR_EQUAL); + YY_BREAK +case 111: +YY_RULE_SETUP +#line 255 "scanner.l" +tok(T_SL); + YY_BREAK +case 112: +YY_RULE_SETUP +#line 256 "scanner.l" +tok(T_SR); + YY_BREAK +case 113: +YY_RULE_SETUP +#line 257 "scanner.l" +tok(T_INC); + YY_BREAK +case 114: +YY_RULE_SETUP +#line 258 "scanner.l" +tok(T_DEC); + YY_BREAK +case 115: +YY_RULE_SETUP +#line 259 "scanner.l" +tok(T_OBJECT_OPERATOR); + YY_BREAK +case 116: +YY_RULE_SETUP +#line 260 "scanner.l" +tok(T_DOUBLE_ARROW); + YY_BREAK +case 117: +YY_RULE_SETUP +#line 261 "scanner.l" +tok(T_PAAMAYIM_NEKUDOTAYIM); + YY_BREAK +case 118: +YY_RULE_SETUP +#line 262 "scanner.l" +tok(T_NS_SEPARATOR); + YY_BREAK +case 119: +YY_RULE_SETUP +#line 263 "scanner.l" +tok(T_ELLIPSIS); + YY_BREAK +case 120: +YY_RULE_SETUP +#line 264 "scanner.l" +tok(T_COALESCE); + YY_BREAK +case 121: +YY_RULE_SETUP +#line 265 "scanner.l" +tok(T_SPACESHIP); + YY_BREAK + +/* Casts */ + +case 122: +YY_RULE_SETUP +#line 270 "scanner.l" +tok(T_INT_CAST); + YY_BREAK +case 123: +YY_RULE_SETUP +#line 271 "scanner.l" +tok(T_DOUBLE_CAST); + YY_BREAK +case 124: +YY_RULE_SETUP +#line 272 "scanner.l" +tok(T_STRING_CAST); + YY_BREAK +case 125: +YY_RULE_SETUP +#line 273 "scanner.l" +tok(T_ARRAY_CAST); + YY_BREAK +case 126: +YY_RULE_SETUP +#line 274 "scanner.l" +tok(T_OBJECT_CAST); + YY_BREAK +case 127: +YY_RULE_SETUP +#line 275 "scanner.l" +tok(T_BOOL_CAST); + YY_BREAK +case 128: +YY_RULE_SETUP +#line 276 "scanner.l" +tok(T_UNSET_CAST); + YY_BREAK + +/* Scalars (parsing these doesn't really matter since we just pass them + through literally) */ + +case 129: +YY_RULE_SETUP +#line 282 "scanner.l" +tok(T_LNUMBER); + YY_BREAK +case 130: +YY_RULE_SETUP +#line 283 "scanner.l" +tok(T_DNUMBER); + YY_BREAK +case 131: +YY_RULE_SETUP +#line 284 "scanner.l" +tok(T_STRING); + YY_BREAK +case 132: +YY_RULE_SETUP +#line 285 "scanner.l" +tok(T_VARIABLE); + YY_BREAK +case 133: +/* rule 133 can match eol */ +YY_RULE_SETUP +#line 286 "scanner.l" +{ + yy_scan_newlines(yytext, yyg); + tok(T_CONSTANT_ENCAPSED_STRING); + } + YY_BREAK +case 134: +/* rule 134 can match eol */ +YY_RULE_SETUP +#line 290 "scanner.l" +{ + yy_scan_newlines(yytext, yyg); + tok(T_BACKTICKS_EXPR); + } + YY_BREAK + +/* (HERE|NOW)DOC's */ +case 135: +YY_RULE_SETUP +#line 297 "scanner.l" +{ + push_state(PHP_HEREDOC_START); + yyextra->heredoc_yyleng = yyleng; + yymore(); +} + YY_BREAK + +case 136: +YY_RULE_SETUP +#line 303 "scanner.l" +{ + // Create a new string for the heredoc label. Since we're using yymore above + // yytext will actually start at the "<<<" and not the label. Use of + // heredoc_yyleng jumps past that. Then we add 1 to get past the " or '. The + // match is similar to calculate length. + yyextra->heredoc_label = string( + yytext + yyextra->heredoc_yyleng + 1, + yyleng - yyextra->heredoc_yyleng - 2); + set_state(PHP_HEREDOC_NSTART); + yyextra->heredoc_yyleng = yyleng; + yymore(); + } + YY_BREAK +case 137: +YY_RULE_SETUP +#line 315 "scanner.l" +{ + yyextra->heredoc_label = string(yytext + yyextra->heredoc_yyleng); + set_state(PHP_HEREDOC_NSTART); + yyextra->heredoc_yyleng = yyleng; + yymore(); + } + YY_BREAK + +case 138: +/* rule 138 can match eol */ +YY_RULE_SETUP +#line 322 "scanner.l" +{ + yyextra->heredoc_yyleng = yyleng; + set_state(PHP_HEREDOC_NEWLINE); + yymore(); +} + YY_BREAK + +case 139: +/* rule 139 can match eol */ +YY_RULE_SETUP +#line 328 "scanner.l" +{ + if (strncmp( + yyextra->heredoc_label.c_str(), + yytext + yyextra->heredoc_yyleng, yyextra->heredoc_label.size()) == 0) { + + switch (yytext[yyextra->heredoc_yyleng + yyextra->heredoc_label.size()]) { + case ';': case '\n': case '\r': + yyless( + yyleng - ( + yyleng - + yyextra->heredoc_yyleng - + yyextra->heredoc_label.size())); + pop_state(); + tok(T_HEREDOC); + } + } + ++yyextra->lineno; + yyextra->heredoc_yyleng = yyleng; + yymore(); + } + YY_BREAK +case 140: +YY_RULE_SETUP +#line 348 "scanner.l" +{ + yyextra->heredoc_yyleng = yyleng; + yymore(); + } + YY_BREAK +case 141: +/* rule 141 can match eol */ +YY_RULE_SETUP +#line 352 "scanner.l" +{ + ++yyextra->lineno; + yyextra->heredoc_yyleng = yyleng; + yymore(); + } + YY_BREAK + +/* Other */ +case 142: +/* rule 142 can match eol */ +YY_RULE_SETUP +#line 360 "scanner.l" +{ + tok(yytext[0]); + // fix unused function warnings + yy_top_state(NULL); + yyunput(0, 0, NULL); +} + YY_BREAK +case 143: +YY_RULE_SETUP +#line 367 "scanner.l" +YY_FATAL_ERROR( "flex scanner jammed" ); + YY_BREAK +#line 25653 "scanner.lex.cpp" +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(PHP): +case YY_STATE_EOF(PHP_HEREDOC_START): +case YY_STATE_EOF(PHP_HEREDOC_NSTART): +case YY_STATE_EOF(PHP_HEREDOC_NEWLINE): +case YY_STATE_EOF(PHP_NO_RESERVED_WORDS): +case YY_STATE_EOF(PHP_NO_RESERVED_WORDS_PERSIST): +case YY_STATE_EOF(PHP_): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yyg->yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * xhpastlex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( yyscanner ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner); + + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yyg->yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yyg->yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( yyscanner ) ) + { + case EOB_ACT_END_OF_FILE: + { + yyg->yy_did_buffer_switch_on_eof = 0; + + if ( xhpastwrap(yyscanner ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yyg->yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yyg->yy_c_buf_p = + yyg->yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( yyscanner ); + + yy_cp = yyg->yy_c_buf_p; + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yyg->yy_c_buf_p = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; + + yy_current_state = yy_get_previous_state( yyscanner ); + + yy_cp = yyg->yy_c_buf_p; + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of xhpastlex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = yyg->yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + + int yy_c_buf_p_offset = + (int) (yyg->yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + xhpastrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ,yyscanner ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + yyg->yy_n_chars, (size_t) num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + if ( yyg->yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + xhpastrestart(yyin ,yyscanner); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((yy_size_t) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) xhpastrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + + yyg->yy_n_chars += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (yyscan_t yyscanner) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + yy_current_state = yy_start_state_list[yyg->yy_start]; + + for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp ) + { + yy_current_state += yy_current_state[(*yy_cp ? YY_SC_TO_UI(*yy_cp) : 256)].yy_nxt; + if ( yy_current_state[-1].yy_nxt ) + { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner) +{ + register int yy_is_jam; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ + register char *yy_cp = yyg->yy_c_buf_p; + + register int yy_c = 256; + register yyconst struct yy_trans_info *yy_trans_info; + + yy_trans_info = &yy_current_state[(unsigned int) yy_c]; + yy_current_state += yy_trans_info->yy_nxt; + yy_is_jam = (yy_trans_info->yy_verify != yy_c); + + if ( ! yy_is_jam ) + { + if ( yy_current_state[-1].yy_nxt ) + { + yyg->yy_last_accepting_state = yy_current_state; + yyg->yy_last_accepting_cpos = yy_cp; + } + } + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp , yyscan_t yyscanner) +{ + register char *yy_cp; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + yy_cp = yyg->yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yyg->yy_hold_char; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yyg->yy_n_chars + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + yyg->yytext_ptr = yy_bp; + yyg->yy_hold_char = *yy_cp; + yyg->yy_c_buf_p = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (yyscan_t yyscanner) +#else + static int input (yyscan_t yyscanner) +#endif + +{ + int c; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + *yyg->yy_c_buf_p = yyg->yy_hold_char; + + if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) + /* This was really a NUL. */ + *yyg->yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yyg->yy_c_buf_p - yyg->yytext_ptr; + ++yyg->yy_c_buf_p; + + switch ( yy_get_next_buffer( yyscanner ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + xhpastrestart(yyin ,yyscanner); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( xhpastwrap(yyscanner ) ) + return EOF; + + if ( ! yyg->yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(yyscanner); +#else + return input(yyscanner); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yyg->yy_c_buf_p = yyg->yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */ + *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ + yyg->yy_hold_char = *++yyg->yy_c_buf_p; + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * @param yyscanner The scanner object. + * @note This function does not reset the start condition to @c INITIAL . + */ + void xhpastrestart (FILE * input_file , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( ! YY_CURRENT_BUFFER ){ + xhpastensure_buffer_stack (yyscanner); + YY_CURRENT_BUFFER_LVALUE = + xhpast_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); + } + + xhpast_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner); + xhpast_load_buffer_state(yyscanner ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * @param yyscanner The scanner object. + */ + void xhpast_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* TODO. We should be able to replace this entire function body + * with + * xhpastpop_buffer_state(); + * xhpastpush_buffer_state(new_buffer); + */ + xhpastensure_buffer_stack (yyscanner); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *yyg->yy_c_buf_p = yyg->yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + xhpast_load_buffer_state(yyscanner ); + + /* We don't actually know whether we did this switch during + * EOF (xhpastwrap()) processing, but the only time this flag + * is looked at is after xhpastwrap() is called, so it's safe + * to go ahead and always set it. + */ + yyg->yy_did_buffer_switch_on_eof = 1; +} + +static void xhpast_load_buffer_state (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + yyg->yy_hold_char = *yyg->yy_c_buf_p; +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * @param yyscanner The scanner object. + * @return the allocated buffer state. + */ + YY_BUFFER_STATE xhpast_create_buffer (FILE * file, int size , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) xhpastalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in xhpast_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) xhpastalloc(b->yy_buf_size + 2 ,yyscanner ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in xhpast_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + xhpast_init_buffer(b,file ,yyscanner); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with xhpast_create_buffer() + * @param yyscanner The scanner object. + */ + void xhpast_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + xhpastfree((void *) b->yy_ch_buf ,yyscanner ); + + xhpastfree((void *) b ,yyscanner ); +} + +#ifndef __cplusplus +extern int isatty (int ); +#endif /* __cplusplus */ + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a xhpastrestart() or at EOF. + */ + static void xhpast_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) + +{ + int oerrno = errno; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + xhpast_flush_buffer(b ,yyscanner); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then xhpast_init_buffer was _probably_ + * called from xhpastrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * @param yyscanner The scanner object. + */ + void xhpast_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + xhpast_load_buffer_state(yyscanner ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * @param yyscanner The scanner object. + */ +void xhpastpush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if (new_buffer == NULL) + return; + + xhpastensure_buffer_stack(yyscanner); + + /* This block is copied from xhpast_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *yyg->yy_c_buf_p = yyg->yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + yyg->yy_buffer_stack_top++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from xhpast_switch_to_buffer. */ + xhpast_load_buffer_state(yyscanner ); + yyg->yy_did_buffer_switch_on_eof = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * @param yyscanner The scanner object. + */ +void xhpastpop_buffer_state (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if (!YY_CURRENT_BUFFER) + return; + + xhpast_delete_buffer(YY_CURRENT_BUFFER ,yyscanner); + YY_CURRENT_BUFFER_LVALUE = NULL; + if (yyg->yy_buffer_stack_top > 0) + --yyg->yy_buffer_stack_top; + + if (YY_CURRENT_BUFFER) { + xhpast_load_buffer_state(yyscanner ); + yyg->yy_did_buffer_switch_on_eof = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void xhpastensure_buffer_stack (yyscan_t yyscanner) +{ + int num_to_alloc; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (!yyg->yy_buffer_stack) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + yyg->yy_buffer_stack = (struct yy_buffer_state**)xhpastalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + , yyscanner); + if ( ! yyg->yy_buffer_stack ) + YY_FATAL_ERROR( "out of dynamic memory in xhpastensure_buffer_stack()" ); + + memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + yyg->yy_buffer_stack_max = num_to_alloc; + yyg->yy_buffer_stack_top = 0; + return; + } + + if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = yyg->yy_buffer_stack_max + grow_size; + yyg->yy_buffer_stack = (struct yy_buffer_state**)xhpastrealloc + (yyg->yy_buffer_stack, + num_to_alloc * sizeof(struct yy_buffer_state*) + , yyscanner); + if ( ! yyg->yy_buffer_stack ) + YY_FATAL_ERROR( "out of dynamic memory in xhpastensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); + yyg->yy_buffer_stack_max = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE xhpast_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) xhpastalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in xhpast_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + xhpast_switch_to_buffer(b ,yyscanner ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to xhpastlex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * xhpast_scan_bytes() instead. + */ +YY_BUFFER_STATE xhpast_scan_string (yyconst char * yystr , yyscan_t yyscanner) +{ + + return xhpast_scan_bytes(yystr,strlen(yystr) ,yyscanner); +} + +/** Setup the input buffer state to scan the given bytes. The next call to xhpastlex() will + * scan from a @e copy of @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE xhpast_scan_bytes (yyconst char * yybytes, int _yybytes_len , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _yybytes_len + 2; + buf = (char *) xhpastalloc(n ,yyscanner ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in xhpast_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = xhpast_scan_buffer(buf,n ,yyscanner); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in xhpast_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + + static void yy_push_state (int new_state , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if ( yyg->yy_start_stack_ptr >= yyg->yy_start_stack_depth ) + { + yy_size_t new_size; + + yyg->yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yyg->yy_start_stack_depth * sizeof( int ); + + if ( ! yyg->yy_start_stack ) + yyg->yy_start_stack = (int *) xhpastalloc(new_size ,yyscanner ); + + else + yyg->yy_start_stack = (int *) xhpastrealloc((void *) yyg->yy_start_stack,new_size ,yyscanner ); + + if ( ! yyg->yy_start_stack ) + YY_FATAL_ERROR( "out of memory expanding start-condition stack" ); + } + + yyg->yy_start_stack[yyg->yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); +} + + static void yy_pop_state (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if ( --yyg->yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yyg->yy_start_stack[yyg->yy_start_stack_ptr]); +} + + static int yy_top_state (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyg->yy_start_stack[yyg->yy_start_stack_ptr - 1]; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = yyg->yy_hold_char; \ + yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ + yyg->yy_hold_char = *yyg->yy_c_buf_p; \ + *yyg->yy_c_buf_p = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the user-defined data for this scanner. + * @param yyscanner The scanner object. + */ +YY_EXTRA_TYPE xhpastget_extra (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyextra; +} + +/** Get the current line number. + * @param yyscanner The scanner object. + */ +int xhpastget_lineno (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (! YY_CURRENT_BUFFER) + return 0; + + return yylineno; +} + +/** Get the current column number. + * @param yyscanner The scanner object. + */ +int xhpastget_column (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (! YY_CURRENT_BUFFER) + return 0; + + return yycolumn; +} + +/** Get the input stream. + * @param yyscanner The scanner object. + */ +FILE *xhpastget_in (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyin; +} + +/** Get the output stream. + * @param yyscanner The scanner object. + */ +FILE *xhpastget_out (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyout; +} + +/** Get the length of the current token. + * @param yyscanner The scanner object. + */ +int xhpastget_leng (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyleng; +} + +/** Get the current token. + * @param yyscanner The scanner object. + */ + +char *xhpastget_text (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yytext; +} + +/** Set the user-defined data. This data is never touched by the scanner. + * @param user_defined The data to be associated with this scanner. + * @param yyscanner The scanner object. + */ +void xhpastset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyextra = user_defined ; +} + +/** Set the current line number. + * @param line_number + * @param yyscanner The scanner object. + */ +void xhpastset_lineno (int line_number , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* lineno is only valid if an input buffer exists. */ + if (! YY_CURRENT_BUFFER ) + yy_fatal_error( "xhpastset_lineno called with no buffer" , yyscanner); + + yylineno = line_number; +} + +/** Set the current column. + * @param line_number + * @param yyscanner The scanner object. + */ +void xhpastset_column (int column_no , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* column is only valid if an input buffer exists. */ + if (! YY_CURRENT_BUFFER ) + yy_fatal_error( "xhpastset_column called with no buffer" , yyscanner); + + yycolumn = column_no; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * @param yyscanner The scanner object. + * @see xhpast_switch_to_buffer + */ +void xhpastset_in (FILE * in_str , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyin = in_str ; +} + +void xhpastset_out (FILE * out_str , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyout = out_str ; +} + +int xhpastget_debug (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yy_flex_debug; +} + +void xhpastset_debug (int bdebug , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yy_flex_debug = bdebug ; +} + +/* Accessor methods for yylval and yylloc */ + +YYSTYPE * xhpastget_lval (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yylval; +} + +void xhpastset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yylval = yylval_param; +} + +/* User-visible API */ + +/* xhpastlex_init is special because it creates the scanner itself, so it is + * the ONLY reentrant function that doesn't take the scanner as the last argument. + * That's why we explicitly handle the declaration, instead of using our macros. + */ + +int xhpastlex_init(yyscan_t* ptr_yy_globals) + +{ + if (ptr_yy_globals == NULL){ + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) xhpastalloc ( sizeof( struct yyguts_t ), NULL ); + + if (*ptr_yy_globals == NULL){ + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + return yy_init_globals ( *ptr_yy_globals ); +} + +/* xhpastlex_init_extra has the same functionality as xhpastlex_init, but follows the + * convention of taking the scanner as the last argument. Note however, that + * this is a *pointer* to a scanner, as it will be allocated by this call (and + * is the reason, too, why this function also must handle its own declaration). + * The user defined value in the first argument will be available to xhpastalloc in + * the yyextra field. + */ + +int xhpastlex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals ) + +{ + struct yyguts_t dummy_yyguts; + + xhpastset_extra (yy_user_defined, &dummy_yyguts); + + if (ptr_yy_globals == NULL){ + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) xhpastalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); + + if (*ptr_yy_globals == NULL){ + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in + yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + xhpastset_extra (yy_user_defined, *ptr_yy_globals); + + return yy_init_globals ( *ptr_yy_globals ); +} + +static int yy_init_globals (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from xhpastlex_destroy(), so don't allocate here. + */ + + yyg->yy_buffer_stack = 0; + yyg->yy_buffer_stack_top = 0; + yyg->yy_buffer_stack_max = 0; + yyg->yy_c_buf_p = (char *) 0; + yyg->yy_init = 0; + yyg->yy_start = 0; + + yyg->yy_start_stack_ptr = 0; + yyg->yy_start_stack_depth = 0; + yyg->yy_start_stack = NULL; + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = (FILE *) 0; + yyout = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * xhpastlex_init() + */ + return 0; +} + +/* xhpastlex_destroy is for both reentrant and non-reentrant scanners. */ +int xhpastlex_destroy (yyscan_t yyscanner) +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + xhpast_delete_buffer(YY_CURRENT_BUFFER ,yyscanner ); + YY_CURRENT_BUFFER_LVALUE = NULL; + xhpastpop_buffer_state(yyscanner); + } + + /* Destroy the stack itself. */ + xhpastfree(yyg->yy_buffer_stack ,yyscanner); + yyg->yy_buffer_stack = NULL; + + /* Destroy the start condition stack. */ + xhpastfree(yyg->yy_start_stack ,yyscanner ); + yyg->yy_start_stack = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * xhpastlex() is called, initialization will occur. */ + yy_init_globals( yyscanner); + + /* Destroy the main struct (reentrant only). */ + xhpastfree ( yyscanner , yyscanner ); + yyscanner = NULL; + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *xhpastalloc (yy_size_t size , yyscan_t yyscanner) +{ + return (void *) malloc( size ); +} + +void *xhpastrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void xhpastfree (void * ptr , yyscan_t yyscanner) +{ + free( (char *) ptr ); /* see xhpastrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 367 "scanner.l" + + + +#ifdef DEBUG +static const char* yy_state_name(int state) { + switch (state) { + case INITIAL: + return "INITIAL"; + case PHP: + return "PHP"; + case PHP_COMMENT: + return "PHP_COMMENT"; + case PHP_EOL_COMMENT: + return "PHP_EOL_COMMENT"; + case PHP_DOC_COMMENT: + return "PHP_DOC_COMMENT"; + case PHP_HEREDOC_START: + return "PHP_HEREDOC_START"; + case PHP_HEREDOC_NSTART: + return "PHP_HEREDOC_NSTART"; + case PHP_HEREDOC_NEWLINE: + return "PHP_HEREDOC_NEWLINE"; + case PHP_NO_RESERVED_WORDS: + return "PHP_NO_RESERVED_WORDS"; + case PHP_NO_RESERVED_WORDS_PERSIST: + return "PHP_NO_RESERVED_WORDS_PERSIST"; + default: + return "???"; + } +} + +static void yy_log_token(int tok) { + const char* tokname = yytokname(tok); + if (tokname) { + fprintf(stderr, "--> %s\n", tokname); + } else { + fprintf(stderr, "--> '%c'\n", tok); + } +} +#endif + +static int yy_token(int tok, yyguts_t* yyg) { + if (YY_START == PHP_NO_RESERVED_WORDS) { + pop_state(); + } + + switch (tok) { + case T_OPEN_TAG: + case T_OPEN_TAG_WITH_ECHO: + case T_OPEN_TAG_FAKE: + push_state(PHP); + break; + + case T_CLOSE_TAG: + pop_state(); + // We need to return a ';', not a T_CLOSE_TAG, because a construct like + // "" is valid and there are about a billion parser rules + // which terminate with ';' so making a new rule like + // "semicolon_or_close_tag" would be hard. The token in yylval has the + // correct type and value, we just don't generate a node. + return ';'; + + // In PHP it's ok to use keywords such as 'if' as field names + // or function names. + case T_OBJECT_OPERATOR: + case T_FUNCTION: + push_state(PHP_NO_RESERVED_WORDS); + break; + + case T_PAAMAYIM_NEKUDOTAYIM: + push_state(PHP_NO_RESERVED_WORDS); + break; + } +#ifdef DEBUG + yy_log_token(tok); +#endif + return yyextra->last_token = tok; +} + +static inline void yy_scan_newlines(const char* text, struct yyguts_t* yyg) { + for (; *text; ++text) { + if (*text == '\r') { + if (text[1] == '\n') { + ++text; + } + ++yyextra->lineno; + } else if (*text == '\n') { + ++yyextra->lineno; + } + } +} + +void xhp_new_push_state(int s, struct yyguts_t* yyg) { +#ifdef DEBUG + fprintf( + stderr, + "--> PUSH(%s -> %s)\n", + yy_state_name(YY_START), + yy_state_name(s)); +#endif + yy_push_state(s, yyg); +} + +void xhp_new_pop_state(struct yyguts_t* yyg) { +#ifdef DEBUG + int s = YY_START; +#endif + yy_pop_state(yyg); +#ifdef DEBUG + fprintf( + stderr, + "--> POP(%s -> %s)\n", + yy_state_name(s), + yy_state_name(YY_START)); +#endif +} + +void xhp_set_state(int s, struct yyguts_t* yyg) { +#ifdef DEBUG + fprintf(stderr, "--> SET(%s)\n", yy_state_name(s)); +#endif + BEGIN(s); +} + +/* @generated */ diff --git a/support/xhpast/xhpast.cpp b/support/xhpast/xhpast.cpp new file mode 100644 --- /dev/null +++ b/support/xhpast/xhpast.cpp @@ -0,0 +1,121 @@ +#include "ast.hpp" +#include +#include +#include +using namespace std; + +int xhpastparse(void*, xhpast::Node **); + +int xhpast_process(std::string &in); +void print_node(xhpast::Node *node); + +int main(int argc, char* argv[]) { + if (argc != 1) { + // Coupling: modify also src/parser/xhpast/bin/PhutilXHPASTBinary.php + cout << "7.1.2\n"; + return 0; + } + + ifstream inputFile; + istream *inputStream; + inputStream = &cin; + + std::stringbuf sb; + *inputStream >> noskipws >> &sb; + std::string buffer = sb.str(); + inputFile.close(); + + return xhpast_process(buffer); +} + +int xhpast_process(std::string &in) { + + char *buffer; + in.reserve(in.size() + 1); + buffer = const_cast(in.c_str()); + buffer[in.size() + 1] = 0; // need double NULL for scan_buffer + + void* scanner; + yy_extra_type extra; + extra.insert_token = 0;//flags.eval ? T_OPEN_TAG_FAKE : 0; + + xhpast::Node *root = NULL; + + xhpastlex_init(&scanner); + xhpastset_extra(&extra, scanner); + xhpast_scan_buffer(buffer, in.size() + 2, scanner); + xhpastparse(scanner, &root); + xhpastlex_destroy(scanner); + + if (extra.terminated) { + fprintf( + stderr, + "XHPAST Parse Error: %s on line %d\n", + extra.error.c_str(), + (int)extra.lineno); + return 1; + } + + printf("{"); + printf("\"tree\":"); + if (root) { + // Extend the right token for the root node to the end of the concrete + // token stream. This ensure all tokens appear in the tree. If we don't + // do this and the file ends in tokens which don't go to the parser (like + // comments and whitespace) they won't be represented in the tree. + root->r_tok = (extra.token_list.size() - 1); + print_node(root); + } else { + printf("null"); + } + printf(","); + printf("\"stream\":"); + printf("["); + + if (!extra.token_list.empty()) { + for (xhpast::token_list_t::iterator ii = extra.token_list.begin();;) { + printf("[%d, %d]", (*ii)->type, (int)(*ii)->value.length()); + if (++ii != extra.token_list.end()) { + printf(","); + } else { + break; + } + } + } + printf("]"); + printf("}\n"); + + return 0; +} + +void print_node(xhpast::Node *node) { + int l = -1; + if (node->l_tok != -1) { + l = node->l_tok; + } + + if (l == -1) { + printf("[%u]", node->type); + } else { + int r = -1; + + if (node->r_tok != -1) { + r = node->r_tok; + } + + printf("[%u, %d, %d", node->type, l, r); + if (!node->children.empty()) { + printf(", ["); + for (xhpast::node_list_t::iterator ii = node->children.begin();;) { + print_node(*ii); + if (++ii != node->children.end()) { + printf(","); + } else { + break; + } + } + printf("]"); + } + printf("]"); + } +}