diff --git a/.arclint b/.arclint index d6233a0f..bcfb4034 100644 --- a/.arclint +++ b/.arclint @@ -36,12 +36,34 @@ "exclude": "(^resources/spelling/.*\\.json$)" }, "text": { - "type": "text" + "type": "text", + "exclude": [ + "(^src/(.*/)?__tests__/[^/]+/.*\\.(txt|json|expect)|/Makefile\\z)" + ] + }, + "text-without-length": { + "type": "text", + "include": [ + "(^src/(.*/)?__tests__/[^/]+/.*\\.(txt|json|expect))" + ], + "severity": { + "3": "disabled" + } + }, + "text-without-tabs": { + "type": "text", + "include": [ + "(/Makefile\\z)" + ], + "severity": { + "2": "disabled" + } }, "xhpast": { "type": "xhpast", "include": "(\\.php$)", - "standard": "phutil.xhpast" + "standard": "phutil.xhpast", + "xhpast.php-version": "5.5.0" } } } diff --git a/.gitignore b/.gitignore index 824a9e89..096c30cb 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,25 @@ # 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 + +# Generated shell completion rulesets. +/support/shell/rules/ diff --git a/bin/arc b/bin/arc index e125698b..51528ca0 100755 --- a/bin/arc +++ b/bin/arc @@ -1,21 +1,10 @@ -#!/usr/bin/env bash +#!/usr/bin/env php + + * + * 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 index 00000000..4197afe1 --- /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 index 00000000..2351cf60 --- /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 index 00000000..f6aa678e --- /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/resources/php/symbol-information.json b/resources/php/symbol-information.json new file mode 100644 index 00000000..0432cb7a --- /dev/null +++ b/resources/php/symbol-information.json @@ -0,0 +1,64365 @@ +{ + "@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 + }, + "random_int": { + "ext.name": "standard", + "ext.min": "7.0.0", + "ext.max": null, + "php.min": "7.0.0", + "php.max": null + }, + "random_bytes": { + "ext.name": "standard", + "ext.min": "7.0.0", + "ext.max": null, + "php.min": "7.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/shell/bash-completion b/resources/shell/bash-completion deleted file mode 100644 index 0ba9ef48..00000000 --- a/resources/shell/bash-completion +++ /dev/null @@ -1,26 +0,0 @@ -if [[ -n ${ZSH_VERSION-} ]]; then - autoload -U +X bashcompinit && bashcompinit -fi - -_arc () -{ - CUR="${COMP_WORDS[COMP_CWORD]}" - COMPREPLY=() - OPTS=$(echo | arc shell-complete --current ${COMP_CWORD} -- ${COMP_WORDS[@]}) - - if [ $? -ne 0 ]; then - return $? - fi - - if [ "$OPTS" = "FILE" ]; then - COMPREPLY=( $(compgen -f -- ${CUR}) ) - return 0 - fi - - if [ "$OPTS" = "ARGUMENT" ]; then - return 0 - fi - - COMPREPLY=( $(compgen -W "${OPTS}" -- ${CUR}) ) -} -complete -F _arc -o filenames arc diff --git a/resources/ssl/README b/resources/ssl/README new file mode 100644 index 00000000..4d5057f5 --- /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 index 00000000..76adf834 --- /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/scripts/__init_script__.php b/scripts/__init_script__.php index 377b1b4c..98de4ef9 100644 --- a/scripts/__init_script__.php +++ b/scripts/__init_script__.php @@ -1,58 +1,3 @@ setLocale(PhutilLocale::loadLocale('en_US')) - ->setTranslations(PhutilTranslation::getTranslationMapForLocale('en_US')); +require_once dirname(dirname(__FILE__)).'/support/init/init-script.php'; diff --git a/scripts/arcanist.php b/scripts/arcanist.php index b950dbbf..76aacb55 100755 --- a/scripts/arcanist.php +++ b/scripts/arcanist.php @@ -5,6 +5,43 @@ sanity_check_environment(); require_once dirname(__FILE__).'/__init_script__.php'; +/** + * Adjust 'include_path' to add locations where we'll search for libraries. + * We look in these places: + * + * - Next to 'arcanist/'. + * - Anywhere in the normal PHP 'include_path'. + * - Inside 'arcanist/externals/includes/'. + */ +function arcanist_adjust_php_include_path() { + // The 'arcanist/' directory. + $arcanist_dir = dirname(dirname(__FILE__)); + + // The parent directory of 'arcanist/'. + $parent_dir = dirname($arcanist_dir); + + // The 'arcanist/externals/includes/' directory. + $include_dir = implode( + DIRECTORY_SEPARATOR, + array( + $arcanist_dir, + 'externals', + 'includes', + )); + + $php_include_path = ini_get('include_path'); + $php_include_path = implode( + PATH_SEPARATOR, + array( + $parent_dir, + $php_include_path, + $include_dir, + )); + + ini_set('include_path', $php_include_path); +} +arcanist_adjust_php_include_path(); + ini_set('memory_limit', -1); $original_argv = $argv; @@ -18,9 +55,6 @@ $base_args->parsePartial( 'help' => pht('Load a libphutil library.'), 'repeat' => true, ), - array( - 'name' => 'skip-arcconfig', - ), array( 'name' => 'arcrc-file', 'param' => 'filename', @@ -36,15 +70,8 @@ $base_args->parsePartial( 'help' => pht('Use a specific authentication token.'), ), array( - 'name' => 'conduit-version', - 'param' => 'version', - 'help' => pht( - '(Developers) Mock client version in protocol handshake.'), - ), - array( - 'name' => 'conduit-timeout', - 'param' => 'timeout', - 'help' => pht('Set Conduit timeout (in seconds).'), + 'name' => 'anonymous', + 'help' => pht('Run workflow as a public user, without authenticating.'), ), array( 'name' => 'config', @@ -60,10 +87,8 @@ $config_trace_mode = $base_args->getArg('trace'); $force_conduit = $base_args->getArg('conduit-uri'); $force_token = $base_args->getArg('conduit-token'); -$force_conduit_version = $base_args->getArg('conduit-version'); -$conduit_timeout = $base_args->getArg('conduit-timeout'); -$skip_arcconfig = $base_args->getArg('skip-arcconfig'); $custom_arcrc = $base_args->getArg('arcrc-file'); +$is_anonymous = $base_args->getArg('anonymous'); $load = $base_args->getArg('load-phutil-library'); $help = $base_args->getArg('help'); $args = array_values($base_args->getUnconsumedArgumentVector()); @@ -81,7 +106,6 @@ try { csprintf('%Ls', $original_argv)); $libraries = array( - 'phutil', 'arcanist', ); @@ -116,12 +140,8 @@ try { $system_config = $configuration_manager->readSystemArcConfig(); $runtime_config = $configuration_manager->applyRuntimeArcConfig($base_args); - if ($skip_arcconfig) { - $working_copy = ArcanistWorkingCopyIdentity::newDummyWorkingCopy(); - } else { - $working_copy = - ArcanistWorkingCopyIdentity::newFromPath($working_directory); - } + $working_copy = + ArcanistWorkingCopyIdentity::newFromPath($working_directory); $configuration_manager->setWorkingCopyIdentity($working_copy); // Load additional libraries, which can provide new classes like configuration @@ -180,13 +200,7 @@ try { } $user_config = $configuration_manager->readUserConfigurationFile(); - - $config_class = $working_copy->getProjectConfig('arcanist_configuration'); - if ($config_class) { - $config = new $config_class(); - } else { - $config = new ArcanistConfiguration(); - } + $config = new ArcanistConfiguration(); $command = strtolower($args[0]); $args = array_slice($args, 1); @@ -206,13 +220,6 @@ try { // their behaviors. putenv('ARCANIST='.$command); - if ($force_conduit_version) { - $workflow->forceConduitVersion($force_conduit_version); - } - if ($conduit_timeout) { - $workflow->setConduitTimeout($conduit_timeout); - } - $need_working_copy = $workflow->requiresWorkingCopy(); $supported_vcs_types = $workflow->getSupportedRevisionControlSystems(); @@ -324,6 +331,10 @@ try { $conduit_token = $force_token; } + if ($is_anonymous) { + $conduit_token = null; + } + $description = implode(' ', $original_argv); $credentials = array( 'user' => $user_name, @@ -333,6 +344,12 @@ try { ); $workflow->setConduitCredentials($credentials); + $engine = id(new ArcanistConduitEngine()) + ->setConduitURI($conduit_uri) + ->setConduitToken($conduit_token); + + $workflow->setConduitEngine($engine); + if ($need_auth) { if ((!$user_name || !$certificate) && (!$conduit_token)) { $arc = 'arc'; @@ -409,7 +426,7 @@ try { fwrite(STDERR, phutil_console_format( "**%s** %s\n", pht('Usage Exception:'), - $ex->getMessage())); + rtrim($ex->getMessage()))); } if ($config) { diff --git a/src/__phutil_library_init__.php b/src/__phutil_library_init__.php index c5168d8d..44d51b82 100644 --- a/src/__phutil_library_init__.php +++ b/src/__phutil_library_init__.php @@ -1,3 +1,3 @@ 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', 'ArcanistAbstractMethodBodyXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistAbstractMethodBodyXHPASTLinterRule.php', 'ArcanistAbstractMethodBodyXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistAbstractMethodBodyXHPASTLinterRuleTestCase.php', 'ArcanistAbstractPrivateMethodXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistAbstractPrivateMethodXHPASTLinterRule.php', 'ArcanistAbstractPrivateMethodXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistAbstractPrivateMethodXHPASTLinterRuleTestCase.php', + 'ArcanistAlias' => 'toolset/ArcanistAlias.php', + 'ArcanistAliasEffect' => 'toolset/ArcanistAliasEffect.php', + 'ArcanistAliasEngine' => 'toolset/ArcanistAliasEngine.php', 'ArcanistAliasFunctionXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistAliasFunctionXHPASTLinterRule.php', 'ArcanistAliasFunctionXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistAliasFunctionXHPASTLinterRuleTestCase.php', - 'ArcanistAliasWorkflow' => 'workflow/ArcanistAliasWorkflow.php', + 'ArcanistAliasWorkflow' => 'toolset/workflow/ArcanistAliasWorkflow.php', + 'ArcanistAliasesConfigOption' => 'config/option/ArcanistAliasesConfigOption.php', 'ArcanistAmendWorkflow' => 'workflow/ArcanistAmendWorkflow.php', 'ArcanistAnoidWorkflow' => 'workflow/ArcanistAnoidWorkflow.php', + 'ArcanistArcConfigurationEngineExtension' => 'config/arc/ArcanistArcConfigurationEngineExtension.php', + 'ArcanistArcToolset' => 'toolset/ArcanistArcToolset.php', + 'ArcanistArcWorkflow' => 'toolset/workflow/ArcanistArcWorkflow.php', 'ArcanistArrayCombineXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistArrayCombineXHPASTLinterRule.php', 'ArcanistArrayCombineXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistArrayCombineXHPASTLinterRuleTestCase.php', 'ArcanistArrayIndexSpacingXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistArrayIndexSpacingXHPASTLinterRule.php', @@ -26,7 +39,6 @@ phutil_register_library_map(array( 'ArcanistArraySeparatorXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistArraySeparatorXHPASTLinterRuleTestCase.php', 'ArcanistArrayValueXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistArrayValueXHPASTLinterRule.php', 'ArcanistArrayValueXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistArrayValueXHPASTLinterRuleTestCase.php', - 'ArcanistBackoutWorkflow' => 'workflow/ArcanistBackoutWorkflow.php', 'ArcanistBaseCommitParser' => 'parser/ArcanistBaseCommitParser.php', 'ArcanistBaseCommitParserTestCase' => 'parser/__tests__/ArcanistBaseCommitParserTestCase.php', 'ArcanistBaseXHPASTLinter' => 'lint/linter/ArcanistBaseXHPASTLinter.php', @@ -40,8 +52,18 @@ phutil_register_library_map(array( 'ArcanistBookmarkWorkflow' => 'workflow/ArcanistBookmarkWorkflow.php', 'ArcanistBraceFormattingXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistBraceFormattingXHPASTLinterRule.php', 'ArcanistBraceFormattingXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistBraceFormattingXHPASTLinterRuleTestCase.php', + 'ArcanistBranchRef' => 'ref/ArcanistBranchRef.php', 'ArcanistBranchWorkflow' => 'workflow/ArcanistBranchWorkflow.php', - 'ArcanistBrowseWorkflow' => 'workflow/ArcanistBrowseWorkflow.php', + 'ArcanistBrowseCommitHardpointQuery' => 'browse/query/ArcanistBrowseCommitHardpointQuery.php', + 'ArcanistBrowseCommitURIHardpointQuery' => 'browse/query/ArcanistBrowseCommitURIHardpointQuery.php', + 'ArcanistBrowseObjectNameURIHardpointQuery' => 'browse/query/ArcanistBrowseObjectNameURIHardpointQuery.php', + 'ArcanistBrowsePathURIHardpointQuery' => 'browse/query/ArcanistBrowsePathURIHardpointQuery.php', + 'ArcanistBrowseRef' => 'browse/ref/ArcanistBrowseRef.php', + 'ArcanistBrowseRefInspector' => 'inspector/ArcanistBrowseRefInspector.php', + 'ArcanistBrowseRevisionURIHardpointQuery' => 'browse/query/ArcanistBrowseRevisionURIHardpointQuery.php', + 'ArcanistBrowseURIHardpointQuery' => 'browse/query/ArcanistBrowseURIHardpointQuery.php', + 'ArcanistBrowseURIRef' => 'browse/ref/ArcanistBrowseURIRef.php', + 'ArcanistBrowseWorkflow' => 'browse/workflow/ArcanistBrowseWorkflow.php', 'ArcanistBuildPlanRef' => 'ref/ArcanistBuildPlanRef.php', 'ArcanistBuildRef' => 'ref/ArcanistBuildRef.php', 'ArcanistBundle' => 'parser/ArcanistBundle.php', @@ -68,26 +90,39 @@ phutil_register_library_map(array( 'ArcanistClassNameLiteralXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistClassNameLiteralXHPASTLinterRule.php', 'ArcanistClassNameLiteralXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistClassNameLiteralXHPASTLinterRuleTestCase.php', 'ArcanistCloseRevisionWorkflow' => 'workflow/ArcanistCloseRevisionWorkflow.php', - 'ArcanistCloseWorkflow' => 'workflow/ArcanistCloseWorkflow.php', 'ArcanistClosureLinter' => 'lint/linter/ArcanistClosureLinter.php', 'ArcanistClosureLinterTestCase' => 'lint/linter/__tests__/ArcanistClosureLinterTestCase.php', 'ArcanistCoffeeLintLinter' => 'lint/linter/ArcanistCoffeeLintLinter.php', 'ArcanistCoffeeLintLinterTestCase' => 'lint/linter/__tests__/ArcanistCoffeeLintLinterTestCase.php', + 'ArcanistCommand' => 'toolset/command/ArcanistCommand.php', 'ArcanistCommentRemover' => 'parser/ArcanistCommentRemover.php', 'ArcanistCommentRemoverTestCase' => 'parser/__tests__/ArcanistCommentRemoverTestCase.php', 'ArcanistCommentSpacingXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistCommentSpacingXHPASTLinterRule.php', 'ArcanistCommentStyleXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistCommentStyleXHPASTLinterRule.php', 'ArcanistCommentStyleXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistCommentStyleXHPASTLinterRuleTestCase.php', + 'ArcanistCommitRef' => 'ref/commit/ArcanistCommitRef.php', + 'ArcanistCommitSymbolRef' => 'ref/commit/ArcanistCommitSymbolRef.php', + 'ArcanistCommitSymbolRefInspector' => 'ref/commit/ArcanistCommitSymbolRefInspector.php', + 'ArcanistCommitUpstreamHardpointQuery' => 'query/ArcanistCommitUpstreamHardpointQuery.php', 'ArcanistCommitWorkflow' => 'workflow/ArcanistCommitWorkflow.php', 'ArcanistCompilerLintRenderer' => 'lint/renderer/ArcanistCompilerLintRenderer.php', 'ArcanistComposerLinter' => 'lint/linter/ArcanistComposerLinter.php', 'ArcanistComprehensiveLintEngine' => 'lint/engine/ArcanistComprehensiveLintEngine.php', 'ArcanistConcatenationOperatorXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistConcatenationOperatorXHPASTLinterRule.php', 'ArcanistConcatenationOperatorXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistConcatenationOperatorXHPASTLinterRuleTestCase.php', + 'ArcanistConduitCall' => 'conduit/ArcanistConduitCall.php', + 'ArcanistConduitEngine' => 'conduit/ArcanistConduitEngine.php', + 'ArcanistConduitException' => 'conduit/ArcanistConduitException.php', + 'ArcanistConfigOption' => 'config/option/ArcanistConfigOption.php', 'ArcanistConfiguration' => 'configuration/ArcanistConfiguration.php', 'ArcanistConfigurationDrivenLintEngine' => 'lint/engine/ArcanistConfigurationDrivenLintEngine.php', 'ArcanistConfigurationDrivenUnitTestEngine' => 'unit/engine/ArcanistConfigurationDrivenUnitTestEngine.php', + 'ArcanistConfigurationEngine' => 'config/ArcanistConfigurationEngine.php', + 'ArcanistConfigurationEngineExtension' => 'config/ArcanistConfigurationEngineExtension.php', 'ArcanistConfigurationManager' => 'configuration/ArcanistConfigurationManager.php', + 'ArcanistConfigurationSource' => 'config/source/ArcanistConfigurationSource.php', + 'ArcanistConfigurationSourceList' => 'config/ArcanistConfigurationSourceList.php', + 'ArcanistConfigurationSourceValue' => 'config/ArcanistConfigurationSourceValue.php', 'ArcanistConsoleLintRenderer' => 'lint/renderer/ArcanistConsoleLintRenderer.php', 'ArcanistConsoleLintRendererTestCase' => 'lint/renderer/__tests__/ArcanistConsoleLintRendererTestCase.php', 'ArcanistConstructorParenthesesXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistConstructorParenthesesXHPASTLinterRule.php', @@ -107,8 +142,10 @@ phutil_register_library_map(array( 'ArcanistDeclarationParenthesesXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistDeclarationParenthesesXHPASTLinterRuleTestCase.php', 'ArcanistDefaultParametersXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistDefaultParametersXHPASTLinterRule.php', 'ArcanistDefaultParametersXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistDefaultParametersXHPASTLinterRuleTestCase.php', + 'ArcanistDefaultsConfigurationSource' => 'config/source/ArcanistDefaultsConfigurationSource.php', 'ArcanistDeprecationXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistDeprecationXHPASTLinterRule.php', 'ArcanistDeprecationXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistDeprecationXHPASTLinterRuleTestCase.php', + 'ArcanistDictionaryConfigurationSource' => 'config/source/ArcanistDictionaryConfigurationSource.php', 'ArcanistDiffByteSizeException' => 'exception/ArcanistDiffByteSizeException.php', 'ArcanistDiffChange' => 'parser/diff/ArcanistDiffChange.php', 'ArcanistDiffChangeType' => 'parser/diff/ArcanistDiffChangeType.php', @@ -123,6 +160,8 @@ phutil_register_library_map(array( 'ArcanistDifferentialDependencyGraph' => 'differential/ArcanistDifferentialDependencyGraph.php', 'ArcanistDifferentialRevisionHash' => 'differential/constants/ArcanistDifferentialRevisionHash.php', 'ArcanistDifferentialRevisionStatus' => 'differential/constants/ArcanistDifferentialRevisionStatus.php', + 'ArcanistDisplayRef' => 'ref/ArcanistDisplayRef.php', + 'ArcanistDisplayRefInterface' => 'ref/ArcanistDisplayRefInterface.php', 'ArcanistDoubleQuoteXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistDoubleQuoteXHPASTLinterRule.php', 'ArcanistDoubleQuoteXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistDoubleQuoteXHPASTLinterRuleTestCase.php', 'ArcanistDownloadWorkflow' => 'workflow/ArcanistDownloadWorkflow.php', @@ -145,12 +184,18 @@ phutil_register_library_map(array( 'ArcanistExternalLinterTestCase' => 'lint/linter/__tests__/ArcanistExternalLinterTestCase.php', 'ArcanistExtractUseXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistExtractUseXHPASTLinterRule.php', 'ArcanistExtractUseXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistExtractUseXHPASTLinterRuleTestCase.php', + 'ArcanistFeatureBaseWorkflow' => 'workflow/ArcanistFeatureBaseWorkflow.php', 'ArcanistFeatureWorkflow' => 'workflow/ArcanistFeatureWorkflow.php', + 'ArcanistFileConfigurationSource' => 'config/source/ArcanistFileConfigurationSource.php', 'ArcanistFileDataRef' => 'upload/ArcanistFileDataRef.php', + 'ArcanistFileRef' => 'ref/file/ArcanistFileRef.php', + 'ArcanistFileSymbolRef' => 'ref/file/ArcanistFileSymbolRef.php', 'ArcanistFileUploader' => 'upload/ArcanistFileUploader.php', 'ArcanistFilenameLinter' => 'lint/linter/ArcanistFilenameLinter.php', 'ArcanistFilenameLinterTestCase' => 'lint/linter/__tests__/ArcanistFilenameLinterTestCase.php', - 'ArcanistFlagWorkflow' => 'workflow/ArcanistFlagWorkflow.php', + 'ArcanistFilesystemAPI' => 'repository/api/ArcanistFilesystemAPI.php', + 'ArcanistFilesystemConfigurationSource' => 'config/source/ArcanistFilesystemConfigurationSource.php', + 'ArcanistFilesystemWorkingCopy' => 'workingcopy/ArcanistFilesystemWorkingCopy.php', 'ArcanistFlake8Linter' => 'lint/linter/ArcanistFlake8Linter.php', 'ArcanistFlake8LinterTestCase' => 'lint/linter/__tests__/ArcanistFlake8LinterTestCase.php', 'ArcanistFormattedStringXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistFormattedStringXHPASTLinterRule.php', @@ -162,8 +207,12 @@ phutil_register_library_map(array( 'ArcanistGeneratedLinterTestCase' => 'lint/linter/__tests__/ArcanistGeneratedLinterTestCase.php', 'ArcanistGetConfigWorkflow' => 'workflow/ArcanistGetConfigWorkflow.php', 'ArcanistGitAPI' => 'repository/api/ArcanistGitAPI.php', + 'ArcanistGitCommitMessageHardpointQuery' => 'query/ArcanistGitCommitMessageHardpointQuery.php', + 'ArcanistGitCommitSymbolCommitHardpointQuery' => 'ref/commit/ArcanistGitCommitSymbolCommitHardpointQuery.php', 'ArcanistGitLandEngine' => 'land/ArcanistGitLandEngine.php', 'ArcanistGitUpstreamPath' => 'repository/api/ArcanistGitUpstreamPath.php', + 'ArcanistGitWorkingCopy' => 'workingcopy/ArcanistGitWorkingCopy.php', + 'ArcanistGitWorkingCopyRevisionHardpointQuery' => 'query/ArcanistGitWorkingCopyRevisionHardpointQuery.php', 'ArcanistGlobalVariableXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistGlobalVariableXHPASTLinterRule.php', 'ArcanistGlobalVariableXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistGlobalVariableXHPASTLinterRuleTestCase.php', 'ArcanistGoLintLinter' => 'lint/linter/ArcanistGoLintLinter.php', @@ -172,7 +221,17 @@ phutil_register_library_map(array( 'ArcanistGoTestResultParserTestCase' => 'unit/parser/__tests__/ArcanistGoTestResultParserTestCase.php', 'ArcanistHLintLinter' => 'lint/linter/ArcanistHLintLinter.php', 'ArcanistHLintLinterTestCase' => 'lint/linter/__tests__/ArcanistHLintLinterTestCase.php', - 'ArcanistHelpWorkflow' => 'workflow/ArcanistHelpWorkflow.php', + 'ArcanistHardpoint' => 'hardpoint/ArcanistHardpoint.php', + 'ArcanistHardpointEngine' => 'hardpoint/ArcanistHardpointEngine.php', + 'ArcanistHardpointFutureList' => 'hardpoint/ArcanistHardpointFutureList.php', + 'ArcanistHardpointList' => 'hardpoint/ArcanistHardpointList.php', + 'ArcanistHardpointObject' => 'hardpoint/ArcanistHardpointObject.php', + 'ArcanistHardpointQuery' => 'hardpoint/ArcanistHardpointQuery.php', + 'ArcanistHardpointRequest' => 'hardpoint/ArcanistHardpointRequest.php', + 'ArcanistHardpointRequestList' => 'hardpoint/ArcanistHardpointRequestList.php', + 'ArcanistHardpointTask' => 'hardpoint/ArcanistHardpointTask.php', + 'ArcanistHardpointTaskResult' => 'hardpoint/ArcanistHardpointTaskResult.php', + 'ArcanistHelpWorkflow' => 'toolset/workflow/ArcanistHelpWorkflow.php', 'ArcanistHexadecimalNumericScalarCasingXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistHexadecimalNumericScalarCasingXHPASTLinterRule.php', 'ArcanistHexadecimalNumericScalarCasingXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistHexadecimalNumericScalarCasingXHPASTLinterRuleTestCase.php', 'ArcanistHgClientChannel' => 'hgdaemon/ArcanistHgClientChannel.php', @@ -191,6 +250,7 @@ phutil_register_library_map(array( 'ArcanistInlineHTMLXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistInlineHTMLXHPASTLinterRuleTestCase.php', 'ArcanistInnerFunctionXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistInnerFunctionXHPASTLinterRule.php', 'ArcanistInnerFunctionXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistInnerFunctionXHPASTLinterRuleTestCase.php', + 'ArcanistInspectWorkflow' => 'workflow/ArcanistInspectWorkflow.php', 'ArcanistInstallCertificateWorkflow' => 'workflow/ArcanistInstallCertificateWorkflow.php', 'ArcanistInstanceOfOperatorXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistInstanceOfOperatorXHPASTLinterRule.php', 'ArcanistInstanceofOperatorXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistInstanceofOperatorXHPASTLinterRuleTestCase.php', @@ -209,7 +269,6 @@ phutil_register_library_map(array( 'ArcanistJSHintLinter' => 'lint/linter/ArcanistJSHintLinter.php', 'ArcanistJSHintLinterTestCase' => 'lint/linter/__tests__/ArcanistJSHintLinterTestCase.php', 'ArcanistJSONLintLinter' => 'lint/linter/ArcanistJSONLintLinter.php', - 'ArcanistJSONLintLinterTestCase' => 'lint/linter/__tests__/ArcanistJSONLintLinterTestCase.php', 'ArcanistJSONLintRenderer' => 'lint/renderer/ArcanistJSONLintRenderer.php', 'ArcanistJSONLinter' => 'lint/linter/ArcanistJSONLinter.php', 'ArcanistJSONLinterTestCase' => 'lint/linter/__tests__/ArcanistJSONLinterTestCase.php', @@ -226,7 +285,6 @@ phutil_register_library_map(array( 'ArcanistLesscLinter' => 'lint/linter/ArcanistLesscLinter.php', 'ArcanistLesscLinterTestCase' => 'lint/linter/__tests__/ArcanistLesscLinterTestCase.php', 'ArcanistLiberateWorkflow' => 'workflow/ArcanistLiberateWorkflow.php', - 'ArcanistLibraryTestCase' => '__tests__/ArcanistLibraryTestCase.php', 'ArcanistLintEngine' => 'lint/engine/ArcanistLintEngine.php', 'ArcanistLintMessage' => 'lint/ArcanistLintMessage.php', 'ArcanistLintMessageTestCase' => 'lint/__tests__/ArcanistLintMessageTestCase.php', @@ -242,7 +300,11 @@ phutil_register_library_map(array( 'ArcanistLintersWorkflow' => 'workflow/ArcanistLintersWorkflow.php', 'ArcanistListAssignmentXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistListAssignmentXHPASTLinterRule.php', 'ArcanistListAssignmentXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistListAssignmentXHPASTLinterRuleTestCase.php', + 'ArcanistListConfigOption' => 'config/option/ArcanistListConfigOption.php', 'ArcanistListWorkflow' => 'workflow/ArcanistListWorkflow.php', + 'ArcanistLocalConfigurationSource' => 'config/source/ArcanistLocalConfigurationSource.php', + 'ArcanistLogEngine' => 'log/ArcanistLogEngine.php', + 'ArcanistLogMessage' => 'log/ArcanistLogMessage.php', 'ArcanistLogicalOperatorsXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistLogicalOperatorsXHPASTLinterRule.php', 'ArcanistLogicalOperatorsXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistLogicalOperatorsXHPASTLinterRuleTestCase.php', 'ArcanistLowercaseFunctionsXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistLowercaseFunctionsXHPASTLinterRule.php', @@ -250,8 +312,11 @@ phutil_register_library_map(array( 'ArcanistMercurialAPI' => 'repository/api/ArcanistMercurialAPI.php', 'ArcanistMercurialParser' => 'repository/parser/ArcanistMercurialParser.php', 'ArcanistMercurialParserTestCase' => 'repository/parser/__tests__/ArcanistMercurialParserTestCase.php', + 'ArcanistMercurialWorkingCopy' => 'workingcopy/ArcanistMercurialWorkingCopy.php', 'ArcanistMergeConflictLinter' => 'lint/linter/ArcanistMergeConflictLinter.php', 'ArcanistMergeConflictLinterTestCase' => 'lint/linter/__tests__/ArcanistMergeConflictLinterTestCase.php', + 'ArcanistMessageRevisionHardpointQuery' => 'query/ArcanistMessageRevisionHardpointQuery.php', + 'ArcanistMissingArgumentTerminatorException' => 'exception/ArcanistMissingArgumentTerminatorException.php', 'ArcanistMissingLinterException' => 'lint/linter/exception/ArcanistMissingLinterException.php', 'ArcanistModifierOrderingXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistModifierOrderingXHPASTLinterRule.php', 'ArcanistModifierOrderingXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistModifierOrderingXHPASTLinterRuleTestCase.php', @@ -269,7 +334,9 @@ phutil_register_library_map(array( 'ArcanistNoLintLinterTestCase' => 'lint/linter/__tests__/ArcanistNoLintLinterTestCase.php', 'ArcanistNoParentScopeXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistNoParentScopeXHPASTLinterRule.php', 'ArcanistNoParentScopeXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistNoParentScopeXHPASTLinterRuleTestCase.php', + 'ArcanistNoURIConduitException' => 'conduit/ArcanistNoURIConduitException.php', 'ArcanistNoneLintRenderer' => 'lint/renderer/ArcanistNoneLintRenderer.php', + 'ArcanistObjectListHardpoint' => 'hardpoint/ArcanistObjectListHardpoint.php', 'ArcanistObjectOperatorSpacingXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistObjectOperatorSpacingXHPASTLinterRule.php', 'ArcanistObjectOperatorSpacingXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistObjectOperatorSpacingXHPASTLinterRuleTestCase.php', 'ArcanistPEP8Linter' => 'lint/linter/ArcanistPEP8Linter.php', @@ -292,6 +359,8 @@ phutil_register_library_map(array( 'ArcanistParenthesesSpacingXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistParenthesesSpacingXHPASTLinterRuleTestCase.php', 'ArcanistParseStrUseXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistParseStrUseXHPASTLinterRule.php', 'ArcanistParseStrUseXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistParseStrUseXHPASTLinterRuleTestCase.php', + 'ArcanistPasteRef' => 'ref/paste/ArcanistPasteRef.php', + 'ArcanistPasteSymbolRef' => 'ref/paste/ArcanistPasteSymbolRef.php', 'ArcanistPasteWorkflow' => 'workflow/ArcanistPasteWorkflow.php', 'ArcanistPatchWorkflow' => 'workflow/ArcanistPatchWorkflow.php', 'ArcanistPhpLinter' => 'lint/linter/ArcanistPhpLinter.php', @@ -299,13 +368,14 @@ phutil_register_library_map(array( 'ArcanistPhpcsLinter' => 'lint/linter/ArcanistPhpcsLinter.php', 'ArcanistPhpcsLinterTestCase' => 'lint/linter/__tests__/ArcanistPhpcsLinterTestCase.php', 'ArcanistPhpunitTestResultParser' => 'unit/parser/ArcanistPhpunitTestResultParser.php', - 'ArcanistPhrequentWorkflow' => 'workflow/ArcanistPhrequentWorkflow.php', 'ArcanistPhutilLibraryLinter' => 'lint/linter/ArcanistPhutilLibraryLinter.php', + 'ArcanistPhutilWorkflow' => 'toolset/ArcanistPhutilWorkflow.php', 'ArcanistPhutilXHPASTLinterStandard' => 'lint/linter/standards/phutil/ArcanistPhutilXHPASTLinterStandard.php', 'ArcanistPlusOperatorOnStringsXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistPlusOperatorOnStringsXHPASTLinterRule.php', 'ArcanistPlusOperatorOnStringsXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistPlusOperatorOnStringsXHPASTLinterRuleTestCase.php', - 'ArcanistPregQuoteMisuseXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistPregQuoteMisuseXHPASTLinterRule.php', - 'ArcanistPregQuoteMisuseXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistPregQuoteMisuseXHPASTLinterRuleTestCase.php', + 'ArcanistProjectConfigurationSource' => 'config/source/ArcanistProjectConfigurationSource.php', + 'ArcanistPrompt' => 'toolset/ArcanistPrompt.php', + 'ArcanistPromptsWorkflow' => 'toolset/workflow/ArcanistPromptsWorkflow.php', 'ArcanistPublicPropertyXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistPublicPropertyXHPASTLinterRule.php', 'ArcanistPublicPropertyXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistPublicPropertyXHPASTLinterRuleTestCase.php', 'ArcanistPuppetLintLinter' => 'lint/linter/ArcanistPuppetLintLinter.php', @@ -316,20 +386,31 @@ phutil_register_library_map(array( 'ArcanistPyLintLinterTestCase' => 'lint/linter/__tests__/ArcanistPyLintLinterTestCase.php', 'ArcanistRaggedClassTreeEdgeXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistRaggedClassTreeEdgeXHPASTLinterRule.php', 'ArcanistRaggedClassTreeEdgeXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistRaggedClassTreeEdgeXHPASTLinterRuleTestCase.php', + 'ArcanistRef' => 'ref/ArcanistRef.php', + 'ArcanistRefInspector' => 'inspector/ArcanistRefInspector.php', 'ArcanistRepositoryAPI' => 'repository/api/ArcanistRepositoryAPI.php', 'ArcanistRepositoryAPIMiscTestCase' => 'repository/api/__tests__/ArcanistRepositoryAPIMiscTestCase.php', 'ArcanistRepositoryAPIStateTestCase' => 'repository/api/__tests__/ArcanistRepositoryAPIStateTestCase.php', + 'ArcanistRepositoryRef' => 'ref/ArcanistRepositoryRef.php', 'ArcanistReusedAsIteratorXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistReusedAsIteratorXHPASTLinterRule.php', 'ArcanistReusedAsIteratorXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistReusedAsIteratorXHPASTLinterRuleTestCase.php', 'ArcanistReusedIteratorReferenceXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistReusedIteratorReferenceXHPASTLinterRule.php', 'ArcanistReusedIteratorReferenceXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistReusedIteratorReferenceXHPASTLinterRuleTestCase.php', 'ArcanistReusedIteratorXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistReusedIteratorXHPASTLinterRule.php', 'ArcanistReusedIteratorXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistReusedIteratorXHPASTLinterRuleTestCase.php', - 'ArcanistRevertWorkflow' => 'workflow/ArcanistRevertWorkflow.php', + 'ArcanistRevisionCommitMessageHardpointQuery' => 'ref/revision/ArcanistRevisionCommitMessageHardpointQuery.php', + 'ArcanistRevisionRef' => 'ref/revision/ArcanistRevisionRef.php', + 'ArcanistRevisionRefSource' => 'ref/ArcanistRevisionRefSource.php', + 'ArcanistRevisionSymbolRef' => 'ref/revision/ArcanistRevisionSymbolRef.php', 'ArcanistRuboCopLinter' => 'lint/linter/ArcanistRuboCopLinter.php', 'ArcanistRuboCopLinterTestCase' => 'lint/linter/__tests__/ArcanistRuboCopLinterTestCase.php', 'ArcanistRubyLinter' => 'lint/linter/ArcanistRubyLinter.php', 'ArcanistRubyLinterTestCase' => 'lint/linter/__tests__/ArcanistRubyLinterTestCase.php', + 'ArcanistRuntime' => 'runtime/ArcanistRuntime.php', + 'ArcanistRuntimeConfigurationSource' => 'config/source/ArcanistRuntimeConfigurationSource.php', + 'ArcanistRuntimeHardpointQuery' => 'toolset/query/ArcanistRuntimeHardpointQuery.php', + 'ArcanistScalarConfigOption' => 'config/option/ArcanistScalarConfigOption.php', + 'ArcanistScalarHardpoint' => 'hardpoint/ArcanistScalarHardpoint.php', 'ArcanistScriptAndRegexLinter' => 'lint/linter/ArcanistScriptAndRegexLinter.php', 'ArcanistSelfClassReferenceXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistSelfClassReferenceXHPASTLinterRule.php', 'ArcanistSelfClassReferenceXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistSelfClassReferenceXHPASTLinterRuleTestCase.php', @@ -338,35 +419,45 @@ phutil_register_library_map(array( 'ArcanistSemicolonSpacingXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistSemicolonSpacingXHPASTLinterRule.php', 'ArcanistSemicolonSpacingXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistSemicolonSpacingXHPASTLinterRuleTestCase.php', 'ArcanistSetConfigWorkflow' => 'workflow/ArcanistSetConfigWorkflow.php', + 'ArcanistSetting' => 'configuration/ArcanistSetting.php', 'ArcanistSettings' => 'configuration/ArcanistSettings.php', - 'ArcanistShellCompleteWorkflow' => 'workflow/ArcanistShellCompleteWorkflow.php', + 'ArcanistShellCompleteWorkflow' => 'toolset/workflow/ArcanistShellCompleteWorkflow.php', + 'ArcanistSimpleSymbolHardpointQuery' => 'ref/simple/ArcanistSimpleSymbolHardpointQuery.php', + 'ArcanistSimpleSymbolRef' => 'ref/simple/ArcanistSimpleSymbolRef.php', + 'ArcanistSimpleSymbolRefInspector' => 'ref/simple/ArcanistSimpleSymbolRefInspector.php', 'ArcanistSingleLintEngine' => 'lint/engine/ArcanistSingleLintEngine.php', 'ArcanistSlownessXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistSlownessXHPASTLinterRule.php', 'ArcanistSlownessXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistSlownessXHPASTLinterRuleTestCase.php', 'ArcanistSpellingLinter' => 'lint/linter/ArcanistSpellingLinter.php', 'ArcanistSpellingLinterTestCase' => 'lint/linter/__tests__/ArcanistSpellingLinterTestCase.php', - 'ArcanistStartWorkflow' => 'workflow/ArcanistStartWorkflow.php', 'ArcanistStaticThisXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistStaticThisXHPASTLinterRule.php', 'ArcanistStaticThisXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistStaticThisXHPASTLinterRuleTestCase.php', - 'ArcanistStopWorkflow' => 'workflow/ArcanistStopWorkflow.php', + 'ArcanistStringConfigOption' => 'config/option/ArcanistStringConfigOption.php', 'ArcanistSubversionAPI' => 'repository/api/ArcanistSubversionAPI.php', + 'ArcanistSubversionWorkingCopy' => 'workingcopy/ArcanistSubversionWorkingCopy.php', 'ArcanistSummaryLintRenderer' => 'lint/renderer/ArcanistSummaryLintRenderer.php', + 'ArcanistSymbolEngine' => 'ref/symbol/ArcanistSymbolEngine.php', + 'ArcanistSymbolRef' => 'ref/symbol/ArcanistSymbolRef.php', 'ArcanistSyntaxErrorXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistSyntaxErrorXHPASTLinterRule.php', + 'ArcanistSystemConfigurationSource' => 'config/source/ArcanistSystemConfigurationSource.php', + 'ArcanistTaskRef' => 'ref/task/ArcanistTaskRef.php', + 'ArcanistTaskSymbolRef' => 'ref/task/ArcanistTaskSymbolRef.php', 'ArcanistTasksWorkflow' => 'workflow/ArcanistTasksWorkflow.php', 'ArcanistTautologicalExpressionXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistTautologicalExpressionXHPASTLinterRule.php', 'ArcanistTautologicalExpressionXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistTautologicalExpressionXHPASTLinterRuleTestCase.php', + 'ArcanistTerminalStringInterface' => 'xsprintf/ArcanistTerminalStringInterface.php', 'ArcanistTestResultParser' => 'unit/parser/ArcanistTestResultParser.php', 'ArcanistTestXHPASTLintSwitchHook' => 'lint/linter/__tests__/ArcanistTestXHPASTLintSwitchHook.php', 'ArcanistTextLinter' => 'lint/linter/ArcanistTextLinter.php', 'ArcanistTextLinterTestCase' => 'lint/linter/__tests__/ArcanistTextLinterTestCase.php', 'ArcanistThisReassignmentXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistThisReassignmentXHPASTLinterRule.php', 'ArcanistThisReassignmentXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistThisReassignmentXHPASTLinterRuleTestCase.php', - 'ArcanistTimeWorkflow' => 'workflow/ArcanistTimeWorkflow.php', 'ArcanistToStringExceptionXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistToStringExceptionXHPASTLinterRule.php', 'ArcanistToStringExceptionXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistToStringExceptionXHPASTLinterRuleTestCase.php', 'ArcanistTodoCommentXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistTodoCommentXHPASTLinterRule.php', 'ArcanistTodoCommentXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistTodoCommentXHPASTLinterRuleTestCase.php', 'ArcanistTodoWorkflow' => 'workflow/ArcanistTodoWorkflow.php', + 'ArcanistToolset' => 'toolset/ArcanistToolset.php', 'ArcanistUSEnglishTranslation' => 'internationalization/ArcanistUSEnglishTranslation.php', 'ArcanistUnableToParseXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistUnableToParseXHPASTLinterRule.php', 'ArcanistUnaryPostfixExpressionSpacingXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistUnaryPostfixExpressionSpacingXHPASTLinterRule.php', @@ -399,15 +490,31 @@ phutil_register_library_map(array( 'ArcanistUselessOverridingMethodXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistUselessOverridingMethodXHPASTLinterRule.php', 'ArcanistUselessOverridingMethodXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistUselessOverridingMethodXHPASTLinterRuleTestCase.php', 'ArcanistUserAbortException' => 'exception/usage/ArcanistUserAbortException.php', + 'ArcanistUserConfigurationSource' => 'config/source/ArcanistUserConfigurationSource.php', + 'ArcanistUserRef' => 'ref/user/ArcanistUserRef.php', + 'ArcanistUserSymbolHardpointQuery' => 'ref/user/ArcanistUserSymbolHardpointQuery.php', + 'ArcanistUserSymbolRef' => 'ref/user/ArcanistUserSymbolRef.php', + 'ArcanistUserSymbolRefInspector' => 'ref/user/ArcanistUserSymbolRefInspector.php', 'ArcanistVariableReferenceSpacingXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistVariableReferenceSpacingXHPASTLinterRule.php', 'ArcanistVariableReferenceSpacingXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistVariableReferenceSpacingXHPASTLinterRuleTestCase.php', 'ArcanistVariableVariableXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistVariableVariableXHPASTLinterRule.php', 'ArcanistVariableVariableXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistVariableVariableXHPASTLinterRuleTestCase.php', - 'ArcanistVersionWorkflow' => 'workflow/ArcanistVersionWorkflow.php', + 'ArcanistVectorHardpoint' => 'hardpoint/ArcanistVectorHardpoint.php', + 'ArcanistVersionWorkflow' => 'toolset/workflow/ArcanistVersionWorkflow.php', 'ArcanistWeldWorkflow' => 'workflow/ArcanistWeldWorkflow.php', 'ArcanistWhichWorkflow' => 'workflow/ArcanistWhichWorkflow.php', + 'ArcanistWildConfigOption' => 'config/option/ArcanistWildConfigOption.php', 'ArcanistWorkflow' => 'workflow/ArcanistWorkflow.php', + 'ArcanistWorkflowArgument' => 'toolset/ArcanistWorkflowArgument.php', + 'ArcanistWorkflowGitHardpointQuery' => 'query/ArcanistWorkflowGitHardpointQuery.php', + 'ArcanistWorkflowInformation' => 'toolset/ArcanistWorkflowInformation.php', + 'ArcanistWorkingCopy' => 'workingcopy/ArcanistWorkingCopy.php', + 'ArcanistWorkingCopyCommitHardpointQuery' => 'query/ArcanistWorkingCopyCommitHardpointQuery.php', + 'ArcanistWorkingCopyConfigurationSource' => 'config/source/ArcanistWorkingCopyConfigurationSource.php', 'ArcanistWorkingCopyIdentity' => 'workingcopyidentity/ArcanistWorkingCopyIdentity.php', + 'ArcanistWorkingCopyPath' => 'workingcopy/ArcanistWorkingCopyPath.php', + 'ArcanistWorkingCopyStateRef' => 'ref/ArcanistWorkingCopyStateRef.php', + 'ArcanistWorkingCopyStateRefInspector' => 'inspector/ArcanistWorkingCopyStateRefInspector.php', 'ArcanistXHPASTLintNamingHook' => 'lint/linter/xhpast/ArcanistXHPASTLintNamingHook.php', 'ArcanistXHPASTLintNamingHookTestCase' => 'lint/linter/xhpast/__tests__/ArcanistXHPASTLintNamingHookTestCase.php', 'ArcanistXHPASTLintSwitchHook' => 'lint/linter/xhpast/ArcanistXHPASTLintSwitchHook.php', @@ -418,31 +525,492 @@ phutil_register_library_map(array( 'ArcanistXMLLinter' => 'lint/linter/ArcanistXMLLinter.php', 'ArcanistXMLLinterTestCase' => 'lint/linter/__tests__/ArcanistXMLLinterTestCase.php', 'ArcanistXUnitTestResultParser' => 'unit/parser/ArcanistXUnitTestResultParser.php', + 'BaseHTTPFuture' => 'future/http/BaseHTTPFuture.php', 'CSharpToolsTestEngine' => 'unit/engine/CSharpToolsTestEngine.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', + 'ConduitSearchFuture' => 'conduit/ConduitSearchFuture.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', + 'FutureAgent' => 'conduit/FutureAgent.php', + 'FutureIterator' => 'future/FutureIterator.php', + 'FutureIteratorTestCase' => 'future/__tests__/FutureIteratorTestCase.php', + 'FuturePool' => 'future/FuturePool.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', 'NoseTestEngine' => 'unit/engine/NoseTestEngine.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', + 'PhageExecWorkflow' => 'phage/workflow/PhageExecWorkflow.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', + 'PhageToolset' => 'phage/toolset/PhageToolset.php', + 'PhageWorkflow' => 'phage/workflow/PhageWorkflow.php', + 'Phobject' => 'object/Phobject.php', + 'PhobjectTestCase' => 'object/__tests__/PhobjectTestCase.php', 'PhpunitTestEngine' => 'unit/engine/PhpunitTestEngine.php', 'PhpunitTestEngineTestCase' => 'unit/engine/__tests__/PhpunitTestEngineTestCase.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', + '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', + 'PhutilAsanaFuture' => 'future/asana/PhutilAsanaFuture.php', + 'PhutilBacktraceSignalHandler' => 'future/exec/PhutilBacktraceSignalHandler.php', + 'PhutilBallOfPHP' => 'phage/util/PhutilBallOfPHP.php', + 'PhutilBinaryAnalyzer' => 'filesystem/binary/PhutilBinaryAnalyzer.php', + 'PhutilBinaryAnalyzerTestCase' => 'filesystem/binary/__tests__/PhutilBinaryAnalyzerTestCase.php', + 'PhutilBootloader' => 'init/lib/PhutilBootloader.php', + 'PhutilBootloaderException' => 'init/lib/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', + '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', + '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', + 'PhutilConsoleProgressSink' => 'progress/PhutilConsoleProgressSink.php', + 'PhutilConsoleServer' => 'console/PhutilConsoleServer.php', + 'PhutilConsoleServerChannel' => 'console/PhutilConsoleServerChannel.php', + 'PhutilConsoleSkip' => 'console/view/PhutilConsoleSkip.php', + 'PhutilConsoleStdinNotInteractiveException' => 'console/PhutilConsoleStdinNotInteractiveException.php', + 'PhutilConsoleTable' => 'console/view/PhutilConsoleTable.php', + 'PhutilConsoleView' => 'console/view/PhutilConsoleView.php', + 'PhutilConsoleWarning' => 'console/view/PhutilConsoleWarning.php', + 'PhutilConsoleWrapTestCase' => 'console/__tests__/PhutilConsoleWrapTestCase.php', + 'PhutilCowsay' => 'utils/PhutilCowsay.php', + 'PhutilCowsayTestCase' => 'utils/__tests__/PhutilCowsayTestCase.php', + 'PhutilCsprintfTestCase' => 'xsprintf/__tests__/PhutilCsprintfTestCase.php', + 'PhutilCzechLocale' => 'internationalization/locales/PhutilCzechLocale.php', + 'PhutilDOMNode' => 'parser/html/PhutilDOMNode.php', + 'PhutilDeferredLog' => 'filesystem/PhutilDeferredLog.php', + 'PhutilDeferredLogTestCase' => 'filesystem/__tests__/PhutilDeferredLogTestCase.php', + 'PhutilDiffBinaryAnalyzer' => 'filesystem/binary/PhutilDiffBinaryAnalyzer.php', + 'PhutilDirectedScalarGraph' => 'utils/PhutilDirectedScalarGraph.php', + 'PhutilDirectoryFixture' => 'filesystem/PhutilDirectoryFixture.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', + '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', + 'PhutilExecChannel' => 'channel/PhutilExecChannel.php', + 'PhutilExecPassthru' => 'future/exec/PhutilExecPassthru.php', + 'PhutilExecutableFuture' => 'future/exec/PhutilExecutableFuture.php', + 'PhutilExecutionEnvironment' => 'utils/PhutilExecutionEnvironment.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', + 'PhutilGitHubFuture' => 'future/github/PhutilGitHubFuture.php', + 'PhutilGitHubResponse' => 'future/github/PhutilGitHubResponse.php', + 'PhutilGitURI' => 'parser/PhutilGitURI.php', + 'PhutilGitURITestCase' => 'parser/__tests__/PhutilGitURITestCase.php', + 'PhutilHTMLParser' => 'parser/html/PhutilHTMLParser.php', + 'PhutilHTMLParserTestCase' => 'parser/html/__tests__/PhutilHTMLParserTestCase.php', + 'PhutilHTTPEngineExtension' => 'future/http/PhutilHTTPEngineExtension.php', + 'PhutilHTTPResponse' => 'parser/http/PhutilHTTPResponse.php', + 'PhutilHTTPResponseParser' => 'parser/http/PhutilHTTPResponseParser.php', + 'PhutilHTTPResponseParserTestCase' => 'parser/http/__tests__/PhutilHTTPResponseParserTestCase.php', + 'PhutilHashingIterator' => 'utils/PhutilHashingIterator.php', + 'PhutilHashingIteratorTestCase' => 'utils/__tests__/PhutilHashingIteratorTestCase.php', + 'PhutilHelpArgumentWorkflow' => 'parser/argument/workflow/PhutilHelpArgumentWorkflow.php', + 'PhutilHgsprintfTestCase' => 'xsprintf/__tests__/PhutilHgsprintfTestCase.php', + 'PhutilINIParserException' => 'parser/exception/PhutilINIParserException.php', + 'PhutilIPAddress' => 'ip/PhutilIPAddress.php', + 'PhutilIPAddressTestCase' => 'ip/__tests__/PhutilIPAddressTestCase.php', + 'PhutilIPv4Address' => 'ip/PhutilIPv4Address.php', + 'PhutilIPv6Address' => 'ip/PhutilIPv6Address.php', + 'PhutilInteractiveEditor' => 'console/PhutilInteractiveEditor.php', + 'PhutilInvalidRuleParserGeneratorException' => 'parser/generator/exception/PhutilInvalidRuleParserGeneratorException.php', + 'PhutilInvalidStateException' => 'exception/PhutilInvalidStateException.php', + 'PhutilInvalidStateExceptionTestCase' => 'exception/__tests__/PhutilInvalidStateExceptionTestCase.php', + 'PhutilIrreducibleRuleParserGeneratorException' => 'parser/generator/exception/PhutilIrreducibleRuleParserGeneratorException.php', + 'PhutilJSON' => 'parser/PhutilJSON.php', + 'PhutilJSONFragmentLexer' => 'lexer/PhutilJSONFragmentLexer.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', + 'PhutilJavaFragmentLexer' => 'lexer/PhutilJavaFragmentLexer.php', + 'PhutilKoreanLocale' => 'internationalization/locales/PhutilKoreanLocale.php', + 'PhutilLanguageGuesser' => 'parser/PhutilLanguageGuesser.php', + 'PhutilLanguageGuesserTestCase' => 'parser/__tests__/PhutilLanguageGuesserTestCase.php', + 'PhutilLexer' => 'lexer/PhutilLexer.php', + 'PhutilLibraryConflictException' => 'init/lib/PhutilLibraryConflictException.php', + 'PhutilLibraryMapBuilder' => 'moduleutils/PhutilLibraryMapBuilder.php', + 'PhutilLibraryTestCase' => '__tests__/PhutilLibraryTestCase.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', + 'PhutilMercurialBinaryAnalyzer' => 'filesystem/binary/PhutilMercurialBinaryAnalyzer.php', + 'PhutilMethodNotImplementedException' => 'error/PhutilMethodNotImplementedException.php', + 'PhutilMetricsChannel' => 'channel/PhutilMetricsChannel.php', + 'PhutilMissingSymbolException' => 'init/lib/PhutilMissingSymbolException.php', + 'PhutilModuleUtilsTestCase' => 'init/lib/__tests__/PhutilModuleUtilsTestCase.php', + 'PhutilNumber' => 'internationalization/PhutilNumber.php', + 'PhutilOAuth1Future' => 'future/oauth/PhutilOAuth1Future.php', + 'PhutilOAuth1FutureTestCase' => 'future/oauth/__tests__/PhutilOAuth1FutureTestCase.php', + 'PhutilOpaqueEnvelope' => 'error/PhutilOpaqueEnvelope.php', + 'PhutilOpaqueEnvelopeKey' => 'error/PhutilOpaqueEnvelopeKey.php', + 'PhutilOpaqueEnvelopeTestCase' => 'error/__tests__/PhutilOpaqueEnvelopeTestCase.php', + 'PhutilPHPFragmentLexer' => 'lexer/PhutilPHPFragmentLexer.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', + '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', + 'PhutilProcessQuery' => 'filesystem/PhutilProcessQuery.php', + 'PhutilProcessRef' => 'filesystem/PhutilProcessRef.php', + 'PhutilProcessRefTestCase' => 'filesystem/__tests__/PhutilProcessRefTestCase.php', + 'PhutilProgressSink' => 'progress/PhutilProgressSink.php', + 'PhutilProtocolChannel' => 'channel/PhutilProtocolChannel.php', + 'PhutilProxyException' => 'error/PhutilProxyException.php', + 'PhutilProxyIterator' => 'utils/PhutilProxyIterator.php', + 'PhutilPygmentizeBinaryAnalyzer' => 'filesystem/binary/PhutilPygmentizeBinaryAnalyzer.php', + 'PhutilPythonFragmentLexer' => 'lexer/PhutilPythonFragmentLexer.php', + 'PhutilQueryStringParser' => 'parser/PhutilQueryStringParser.php', + 'PhutilQueryStringParserTestCase' => 'parser/__tests__/PhutilQueryStringParserTestCase.php', + 'PhutilRawEnglishLocale' => 'internationalization/locales/PhutilRawEnglishLocale.php', + 'PhutilReadableSerializer' => 'readableserializer/PhutilReadableSerializer.php', + 'PhutilReadableSerializerTestCase' => 'readableserializer/__tests__/PhutilReadableSerializerTestCase.php', + 'PhutilRope' => 'utils/PhutilRope.php', + 'PhutilRopeTestCase' => 'utils/__tests__/PhutilRopeTestCase.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', + 'PhutilSlackFuture' => 'future/slack/PhutilSlackFuture.php', + 'PhutilSocketChannel' => 'channel/PhutilSocketChannel.php', + 'PhutilSortVector' => 'utils/PhutilSortVector.php', + 'PhutilSpanishSpainLocale' => 'internationalization/locales/PhutilSpanishSpainLocale.php', + 'PhutilStreamIterator' => 'utils/PhutilStreamIterator.php', + 'PhutilSubversionBinaryAnalyzer' => 'filesystem/binary/PhutilSubversionBinaryAnalyzer.php', + 'PhutilSymbolLoader' => 'symbols/PhutilSymbolLoader.php', + 'PhutilSystem' => 'utils/PhutilSystem.php', + 'PhutilSystemTestCase' => 'utils/__tests__/PhutilSystemTestCase.php', + 'PhutilTerminalString' => 'xsprintf/PhutilTerminalString.php', 'PhutilTestCase' => 'unit/engine/phutil/PhutilTestCase.php', 'PhutilTestCaseTestCase' => 'unit/engine/phutil/testcase/PhutilTestCaseTestCase.php', + 'PhutilTestPhobject' => 'object/__tests__/PhutilTestPhobject.php', 'PhutilTestSkippedException' => 'unit/engine/phutil/testcase/PhutilTestSkippedException.php', 'PhutilTestTerminatedException' => 'unit/engine/phutil/testcase/PhutilTestTerminatedException.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', + 'PhutilTwitchFuture' => 'future/twitch/PhutilTwitchFuture.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', 'PhutilUnitTestEngine' => 'unit/engine/PhutilUnitTestEngine.php', 'PhutilUnitTestEngineTestCase' => 'unit/engine/__tests__/PhutilUnitTestEngineTestCase.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', + 'PhutilWordPressFuture' => 'future/wordpress/PhutilWordPressFuture.php', + 'PhutilXHPASTBinary' => 'parser/xhpast/bin/PhutilXHPASTBinary.php', 'PytestTestEngine' => 'unit/engine/PytestTestEngine.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', 'XUnitTestEngine' => 'unit/engine/XUnitTestEngine.php', 'XUnitTestResultParserTestCase' => 'unit/parser/__tests__/XUnitTestResultParserTestCase.php', + 'XsprintfUnknownConversionException' => 'xsprintf/exception/XsprintfUnknownConversionException.php', + ), + 'function' => array( + '__phutil_autoload' => 'init/init-library.php', + '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_same_keys' => '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', + '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_build_http_querystring' => 'utils/utils.php', + 'phutil_build_http_querystring_from_pairs' => 'utils/utils.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_decode_mime_header' => 'utils/utils.php', + 'phutil_deprecated' => 'init/lib/moduleutils.php', + 'phutil_describe_type' => 'utils/utils.php', + 'phutil_encode_log' => 'utils/utils.php', + 'phutil_error_listener_example' => 'error/phlog.php', + 'phutil_escape_uri' => 'utils/utils.php', + 'phutil_escape_uri_path_component' => 'utils/utils.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' => 'init/lib/moduleutils.php', + 'phutil_get_library_name_for_root' => 'init/lib/moduleutils.php', + 'phutil_get_library_root' => 'init/lib/moduleutils.php', + 'phutil_get_library_root_for_path' => 'init/lib/moduleutils.php', + 'phutil_get_signal_name' => 'future/exec/execx.php', + 'phutil_get_system_locale' => 'utils/utf8.php', + 'phutil_glue' => 'utils/utils.php', + 'phutil_hashes_are_identical' => 'utils/utils.php', + 'phutil_http_parameter_pair' => 'utils/utils.php', + 'phutil_ini_decode' => 'utils/utils.php', + 'phutil_is_hiphop_runtime' => 'utils/utils.php', + 'phutil_is_interactive' => 'utils/utils.php', + 'phutil_is_natural_list' => 'utils/utils.php', + 'phutil_is_noninteractive' => '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' => 'init/lib/moduleutils.php', + 'phutil_loggable_string' => 'utils/utils.php', + 'phutil_microseconds_since' => 'utils/utils.php', + 'phutil_parse_bytes' => 'utils/viewutils.php', + 'phutil_passthru' => 'future/exec/execx.php', + 'phutil_person' => 'internationalization/pht.php', + 'phutil_register_library' => 'init/lib/core.php', + 'phutil_register_library_map' => 'init/lib/core.php', + 'phutil_set_system_locale' => 'utils/utf8.php', + 'phutil_split_lines' => 'utils/utils.php', + 'phutil_string_cast' => 'utils/utils.php', + 'phutil_unescape_uri_path_component' => 'utils/utils.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', + 'tsprintf' => 'xsprintf/tsprintf.php', + 'urisprintf' => 'xsprintf/urisprintf.php', + 'vcsprintf' => 'xsprintf/csprintf.php', + 'vjsprintf' => 'xsprintf/jsprintf.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_regex' => 'xsprintf/pregsprintf.php', + 'xsprintf_terminal' => 'xsprintf/tsprintf.php', + 'xsprintf_uri' => 'xsprintf/urisprintf.php', ), - 'function' => array(), 'xmap' => array( + 'AASTNode' => 'Phobject', + 'AASTNodeList' => array( + 'Phobject', + 'Countable', + 'Iterator', + ), + 'AASTToken' => 'Phobject', + 'AASTTree' => 'Phobject', + 'AbstractDirectedGraph' => 'Phobject', + 'AbstractDirectedGraphTestCase' => 'PhutilTestCase', 'ArcanistAbstractMethodBodyXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistAbstractMethodBodyXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistAbstractPrivateMethodXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistAbstractPrivateMethodXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', + 'ArcanistAlias' => 'Phobject', + 'ArcanistAliasEffect' => 'Phobject', + 'ArcanistAliasEngine' => 'Phobject', 'ArcanistAliasFunctionXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistAliasFunctionXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistAliasWorkflow' => 'ArcanistWorkflow', - 'ArcanistAmendWorkflow' => 'ArcanistWorkflow', - 'ArcanistAnoidWorkflow' => 'ArcanistWorkflow', + 'ArcanistAliasesConfigOption' => 'ArcanistListConfigOption', + 'ArcanistAmendWorkflow' => 'ArcanistArcWorkflow', + 'ArcanistAnoidWorkflow' => 'ArcanistArcWorkflow', + 'ArcanistArcConfigurationEngineExtension' => 'ArcanistConfigurationEngineExtension', + 'ArcanistArcToolset' => 'ArcanistToolset', + 'ArcanistArcWorkflow' => 'ArcanistWorkflow', 'ArcanistArrayCombineXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistArrayCombineXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistArrayIndexSpacingXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', @@ -451,7 +1019,6 @@ phutil_register_library_map(array( 'ArcanistArraySeparatorXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistArrayValueXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistArrayValueXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', - 'ArcanistBackoutWorkflow' => 'ArcanistWorkflow', 'ArcanistBaseCommitParser' => 'Phobject', 'ArcanistBaseCommitParserTestCase' => 'PhutilTestCase', 'ArcanistBaseXHPASTLinter' => 'ArcanistFutureLinter', @@ -462,11 +1029,21 @@ phutil_register_library_map(array( 'ArcanistBlacklistedFunctionXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistBlacklistedFunctionXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistBlindlyTrustHTTPEngineExtension' => 'PhutilHTTPEngineExtension', - 'ArcanistBookmarkWorkflow' => 'ArcanistFeatureWorkflow', + 'ArcanistBookmarkWorkflow' => 'ArcanistFeatureBaseWorkflow', 'ArcanistBraceFormattingXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistBraceFormattingXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', - 'ArcanistBranchWorkflow' => 'ArcanistFeatureWorkflow', - 'ArcanistBrowseWorkflow' => 'ArcanistWorkflow', + 'ArcanistBranchRef' => 'ArcanistRef', + 'ArcanistBranchWorkflow' => 'ArcanistFeatureBaseWorkflow', + 'ArcanistBrowseCommitHardpointQuery' => 'ArcanistRuntimeHardpointQuery', + 'ArcanistBrowseCommitURIHardpointQuery' => 'ArcanistBrowseURIHardpointQuery', + 'ArcanistBrowseObjectNameURIHardpointQuery' => 'ArcanistBrowseURIHardpointQuery', + 'ArcanistBrowsePathURIHardpointQuery' => 'ArcanistBrowseURIHardpointQuery', + 'ArcanistBrowseRef' => 'ArcanistRef', + 'ArcanistBrowseRefInspector' => 'ArcanistRefInspector', + 'ArcanistBrowseRevisionURIHardpointQuery' => 'ArcanistBrowseURIHardpointQuery', + 'ArcanistBrowseURIHardpointQuery' => 'ArcanistRuntimeHardpointQuery', + 'ArcanistBrowseURIRef' => 'ArcanistRef', + 'ArcanistBrowseWorkflow' => 'ArcanistArcWorkflow', 'ArcanistBuildPlanRef' => 'Phobject', 'ArcanistBuildRef' => 'Phobject', 'ArcanistBundle' => 'Phobject', @@ -474,7 +1051,7 @@ phutil_register_library_map(array( 'ArcanistCSSLintLinter' => 'ArcanistExternalLinter', 'ArcanistCSSLintLinterTestCase' => 'ArcanistExternalLinterTestCase', 'ArcanistCSharpLinter' => 'ArcanistLinter', - 'ArcanistCallConduitWorkflow' => 'ArcanistWorkflow', + 'ArcanistCallConduitWorkflow' => 'ArcanistArcWorkflow', 'ArcanistCallParenthesesXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistCallParenthesesXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistCallTimePassByReferenceXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', @@ -493,26 +1070,39 @@ phutil_register_library_map(array( 'ArcanistClassNameLiteralXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistClassNameLiteralXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistCloseRevisionWorkflow' => 'ArcanistWorkflow', - 'ArcanistCloseWorkflow' => 'ArcanistWorkflow', 'ArcanistClosureLinter' => 'ArcanistExternalLinter', 'ArcanistClosureLinterTestCase' => 'ArcanistExternalLinterTestCase', 'ArcanistCoffeeLintLinter' => 'ArcanistExternalLinter', 'ArcanistCoffeeLintLinterTestCase' => 'ArcanistExternalLinterTestCase', + 'ArcanistCommand' => 'Phobject', 'ArcanistCommentRemover' => 'Phobject', 'ArcanistCommentRemoverTestCase' => 'PhutilTestCase', 'ArcanistCommentSpacingXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistCommentStyleXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistCommentStyleXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', + 'ArcanistCommitRef' => 'ArcanistRef', + 'ArcanistCommitSymbolRef' => 'ArcanistSymbolRef', + 'ArcanistCommitSymbolRefInspector' => 'ArcanistRefInspector', + 'ArcanistCommitUpstreamHardpointQuery' => 'ArcanistRuntimeHardpointQuery', 'ArcanistCommitWorkflow' => 'ArcanistWorkflow', 'ArcanistCompilerLintRenderer' => 'ArcanistLintRenderer', 'ArcanistComposerLinter' => 'ArcanistLinter', 'ArcanistComprehensiveLintEngine' => 'ArcanistLintEngine', 'ArcanistConcatenationOperatorXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistConcatenationOperatorXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', + 'ArcanistConduitCall' => 'Phobject', + 'ArcanistConduitEngine' => 'Phobject', + 'ArcanistConduitException' => 'Exception', + 'ArcanistConfigOption' => 'Phobject', 'ArcanistConfiguration' => 'Phobject', 'ArcanistConfigurationDrivenLintEngine' => 'ArcanistLintEngine', 'ArcanistConfigurationDrivenUnitTestEngine' => 'ArcanistUnitTestEngine', + 'ArcanistConfigurationEngine' => 'Phobject', + 'ArcanistConfigurationEngineExtension' => 'Phobject', 'ArcanistConfigurationManager' => 'Phobject', + 'ArcanistConfigurationSource' => 'Phobject', + 'ArcanistConfigurationSourceList' => 'Phobject', + 'ArcanistConfigurationSourceValue' => 'Phobject', 'ArcanistConsoleLintRenderer' => 'ArcanistLintRenderer', 'ArcanistConsoleLintRendererTestCase' => 'PhutilTestCase', 'ArcanistConstructorParenthesesXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', @@ -532,8 +1122,10 @@ phutil_register_library_map(array( 'ArcanistDeclarationParenthesesXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistDefaultParametersXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistDefaultParametersXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', + 'ArcanistDefaultsConfigurationSource' => 'ArcanistDictionaryConfigurationSource', 'ArcanistDeprecationXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistDeprecationXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', + 'ArcanistDictionaryConfigurationSource' => 'ArcanistConfigurationSource', 'ArcanistDiffByteSizeException' => 'Exception', 'ArcanistDiffChange' => 'Phobject', 'ArcanistDiffChangeType' => 'Phobject', @@ -548,9 +1140,13 @@ phutil_register_library_map(array( 'ArcanistDifferentialDependencyGraph' => 'AbstractDirectedGraph', 'ArcanistDifferentialRevisionHash' => 'Phobject', 'ArcanistDifferentialRevisionStatus' => 'Phobject', + 'ArcanistDisplayRef' => array( + 'Phobject', + 'ArcanistTerminalStringInterface', + ), 'ArcanistDoubleQuoteXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistDoubleQuoteXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', - 'ArcanistDownloadWorkflow' => 'ArcanistWorkflow', + 'ArcanistDownloadWorkflow' => 'ArcanistArcWorkflow', 'ArcanistDuplicateKeysInArrayXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistDuplicateKeysInArrayXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistDuplicateSwitchCaseXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', @@ -570,12 +1166,21 @@ phutil_register_library_map(array( 'ArcanistExternalLinterTestCase' => 'ArcanistLinterTestCase', 'ArcanistExtractUseXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistExtractUseXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', - 'ArcanistFeatureWorkflow' => 'ArcanistWorkflow', + 'ArcanistFeatureBaseWorkflow' => 'ArcanistArcWorkflow', + 'ArcanistFeatureWorkflow' => 'ArcanistFeatureBaseWorkflow', + 'ArcanistFileConfigurationSource' => 'ArcanistFilesystemConfigurationSource', 'ArcanistFileDataRef' => 'Phobject', + 'ArcanistFileRef' => array( + 'ArcanistRef', + 'ArcanistDisplayRefInterface', + ), + 'ArcanistFileSymbolRef' => 'ArcanistSimpleSymbolRef', 'ArcanistFileUploader' => 'Phobject', 'ArcanistFilenameLinter' => 'ArcanistLinter', 'ArcanistFilenameLinterTestCase' => 'ArcanistLinterTestCase', - 'ArcanistFlagWorkflow' => 'ArcanistWorkflow', + 'ArcanistFilesystemAPI' => 'ArcanistRepositoryAPI', + 'ArcanistFilesystemConfigurationSource' => 'ArcanistDictionaryConfigurationSource', + 'ArcanistFilesystemWorkingCopy' => 'ArcanistWorkingCopy', 'ArcanistFlake8Linter' => 'ArcanistExternalLinter', 'ArcanistFlake8LinterTestCase' => 'ArcanistExternalLinterTestCase', 'ArcanistFormattedStringXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', @@ -587,8 +1192,12 @@ phutil_register_library_map(array( 'ArcanistGeneratedLinterTestCase' => 'ArcanistLinterTestCase', 'ArcanistGetConfigWorkflow' => 'ArcanistWorkflow', 'ArcanistGitAPI' => 'ArcanistRepositoryAPI', + 'ArcanistGitCommitMessageHardpointQuery' => 'ArcanistWorkflowGitHardpointQuery', + 'ArcanistGitCommitSymbolCommitHardpointQuery' => 'ArcanistWorkflowGitHardpointQuery', 'ArcanistGitLandEngine' => 'ArcanistLandEngine', 'ArcanistGitUpstreamPath' => 'Phobject', + 'ArcanistGitWorkingCopy' => 'ArcanistWorkingCopy', + 'ArcanistGitWorkingCopyRevisionHardpointQuery' => 'ArcanistWorkflowGitHardpointQuery', 'ArcanistGlobalVariableXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistGlobalVariableXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistGoLintLinter' => 'ArcanistExternalLinter', @@ -597,6 +1206,16 @@ phutil_register_library_map(array( 'ArcanistGoTestResultParserTestCase' => 'PhutilTestCase', 'ArcanistHLintLinter' => 'ArcanistExternalLinter', 'ArcanistHLintLinterTestCase' => 'ArcanistExternalLinterTestCase', + 'ArcanistHardpoint' => 'Phobject', + 'ArcanistHardpointEngine' => 'Phobject', + 'ArcanistHardpointFutureList' => 'Phobject', + 'ArcanistHardpointList' => 'Phobject', + 'ArcanistHardpointObject' => 'Phobject', + 'ArcanistHardpointQuery' => 'Phobject', + 'ArcanistHardpointRequest' => 'Phobject', + 'ArcanistHardpointRequestList' => 'Phobject', + 'ArcanistHardpointTask' => 'Phobject', + 'ArcanistHardpointTaskResult' => 'Phobject', 'ArcanistHelpWorkflow' => 'ArcanistWorkflow', 'ArcanistHexadecimalNumericScalarCasingXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistHexadecimalNumericScalarCasingXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', @@ -616,6 +1235,7 @@ phutil_register_library_map(array( 'ArcanistInlineHTMLXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistInnerFunctionXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistInnerFunctionXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', + 'ArcanistInspectWorkflow' => 'ArcanistArcWorkflow', 'ArcanistInstallCertificateWorkflow' => 'ArcanistWorkflow', 'ArcanistInstanceOfOperatorXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistInstanceofOperatorXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', @@ -634,7 +1254,6 @@ phutil_register_library_map(array( 'ArcanistJSHintLinter' => 'ArcanistExternalLinter', 'ArcanistJSHintLinterTestCase' => 'ArcanistExternalLinterTestCase', 'ArcanistJSONLintLinter' => 'ArcanistExternalLinter', - 'ArcanistJSONLintLinterTestCase' => 'ArcanistExternalLinterTestCase', 'ArcanistJSONLintRenderer' => 'ArcanistLintRenderer', 'ArcanistJSONLinter' => 'ArcanistLinter', 'ArcanistJSONLinterTestCase' => 'ArcanistLinterTestCase', @@ -650,8 +1269,7 @@ phutil_register_library_map(array( 'ArcanistLanguageConstructParenthesesXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistLesscLinter' => 'ArcanistExternalLinter', 'ArcanistLesscLinterTestCase' => 'ArcanistExternalLinterTestCase', - 'ArcanistLiberateWorkflow' => 'ArcanistWorkflow', - 'ArcanistLibraryTestCase' => 'PhutilLibraryTestCase', + 'ArcanistLiberateWorkflow' => 'ArcanistArcWorkflow', 'ArcanistLintEngine' => 'Phobject', 'ArcanistLintMessage' => 'Phobject', 'ArcanistLintMessageTestCase' => 'PhutilTestCase', @@ -667,7 +1285,11 @@ phutil_register_library_map(array( 'ArcanistLintersWorkflow' => 'ArcanistWorkflow', 'ArcanistListAssignmentXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistListAssignmentXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', + 'ArcanistListConfigOption' => 'ArcanistConfigOption', 'ArcanistListWorkflow' => 'ArcanistWorkflow', + 'ArcanistLocalConfigurationSource' => 'ArcanistWorkingCopyConfigurationSource', + 'ArcanistLogEngine' => 'Phobject', + 'ArcanistLogMessage' => 'Phobject', 'ArcanistLogicalOperatorsXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistLogicalOperatorsXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistLowercaseFunctionsXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', @@ -675,8 +1297,11 @@ phutil_register_library_map(array( 'ArcanistMercurialAPI' => 'ArcanistRepositoryAPI', 'ArcanistMercurialParser' => 'Phobject', 'ArcanistMercurialParserTestCase' => 'PhutilTestCase', + 'ArcanistMercurialWorkingCopy' => 'ArcanistWorkingCopy', 'ArcanistMergeConflictLinter' => 'ArcanistLinter', 'ArcanistMergeConflictLinterTestCase' => 'ArcanistLinterTestCase', + 'ArcanistMessageRevisionHardpointQuery' => 'ArcanistRuntimeHardpointQuery', + 'ArcanistMissingArgumentTerminatorException' => 'Exception', 'ArcanistMissingLinterException' => 'Exception', 'ArcanistModifierOrderingXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistModifierOrderingXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', @@ -694,7 +1319,9 @@ phutil_register_library_map(array( 'ArcanistNoLintLinterTestCase' => 'ArcanistLinterTestCase', 'ArcanistNoParentScopeXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistNoParentScopeXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', + 'ArcanistNoURIConduitException' => 'ArcanistConduitException', 'ArcanistNoneLintRenderer' => 'ArcanistLintRenderer', + 'ArcanistObjectListHardpoint' => 'ArcanistHardpoint', 'ArcanistObjectOperatorSpacingXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistObjectOperatorSpacingXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistPEP8Linter' => 'ArcanistExternalLinter', @@ -717,20 +1344,26 @@ phutil_register_library_map(array( 'ArcanistParenthesesSpacingXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistParseStrUseXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistParseStrUseXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', - 'ArcanistPasteWorkflow' => 'ArcanistWorkflow', + 'ArcanistPasteRef' => array( + 'ArcanistRef', + 'ArcanistDisplayRefInterface', + ), + 'ArcanistPasteSymbolRef' => 'ArcanistSimpleSymbolRef', + 'ArcanistPasteWorkflow' => 'ArcanistArcWorkflow', 'ArcanistPatchWorkflow' => 'ArcanistWorkflow', 'ArcanistPhpLinter' => 'ArcanistExternalLinter', 'ArcanistPhpLinterTestCase' => 'ArcanistExternalLinterTestCase', 'ArcanistPhpcsLinter' => 'ArcanistExternalLinter', 'ArcanistPhpcsLinterTestCase' => 'ArcanistExternalLinterTestCase', 'ArcanistPhpunitTestResultParser' => 'ArcanistTestResultParser', - 'ArcanistPhrequentWorkflow' => 'ArcanistWorkflow', 'ArcanistPhutilLibraryLinter' => 'ArcanistLinter', + 'ArcanistPhutilWorkflow' => 'PhutilArgumentWorkflow', 'ArcanistPhutilXHPASTLinterStandard' => 'ArcanistLinterStandard', 'ArcanistPlusOperatorOnStringsXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistPlusOperatorOnStringsXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', - 'ArcanistPregQuoteMisuseXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', - 'ArcanistPregQuoteMisuseXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', + 'ArcanistProjectConfigurationSource' => 'ArcanistWorkingCopyConfigurationSource', + 'ArcanistPrompt' => 'Phobject', + 'ArcanistPromptsWorkflow' => 'ArcanistWorkflow', 'ArcanistPublicPropertyXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistPublicPropertyXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistPuppetLintLinter' => 'ArcanistExternalLinter', @@ -741,20 +1374,33 @@ phutil_register_library_map(array( 'ArcanistPyLintLinterTestCase' => 'ArcanistExternalLinterTestCase', 'ArcanistRaggedClassTreeEdgeXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistRaggedClassTreeEdgeXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', + 'ArcanistRef' => 'ArcanistHardpointObject', + 'ArcanistRefInspector' => 'Phobject', 'ArcanistRepositoryAPI' => 'Phobject', 'ArcanistRepositoryAPIMiscTestCase' => 'PhutilTestCase', 'ArcanistRepositoryAPIStateTestCase' => 'PhutilTestCase', + 'ArcanistRepositoryRef' => 'ArcanistRef', 'ArcanistReusedAsIteratorXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistReusedAsIteratorXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistReusedIteratorReferenceXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistReusedIteratorReferenceXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistReusedIteratorXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistReusedIteratorXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', - 'ArcanistRevertWorkflow' => 'ArcanistWorkflow', + 'ArcanistRevisionCommitMessageHardpointQuery' => 'ArcanistRuntimeHardpointQuery', + 'ArcanistRevisionRef' => array( + 'ArcanistRef', + 'ArcanistDisplayRefInterface', + ), + 'ArcanistRevisionRefSource' => 'Phobject', + 'ArcanistRevisionSymbolRef' => 'ArcanistSimpleSymbolRef', 'ArcanistRuboCopLinter' => 'ArcanistExternalLinter', 'ArcanistRuboCopLinterTestCase' => 'ArcanistExternalLinterTestCase', 'ArcanistRubyLinter' => 'ArcanistExternalLinter', 'ArcanistRubyLinterTestCase' => 'ArcanistExternalLinterTestCase', + 'ArcanistRuntimeConfigurationSource' => 'ArcanistDictionaryConfigurationSource', + 'ArcanistRuntimeHardpointQuery' => 'ArcanistHardpointQuery', + 'ArcanistScalarConfigOption' => 'ArcanistConfigOption', + 'ArcanistScalarHardpoint' => 'ArcanistHardpoint', 'ArcanistScriptAndRegexLinter' => 'ArcanistLinter', 'ArcanistSelfClassReferenceXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistSelfClassReferenceXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', @@ -763,20 +1409,32 @@ phutil_register_library_map(array( 'ArcanistSemicolonSpacingXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistSemicolonSpacingXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistSetConfigWorkflow' => 'ArcanistWorkflow', + 'ArcanistSetting' => 'Phobject', 'ArcanistSettings' => 'Phobject', 'ArcanistShellCompleteWorkflow' => 'ArcanistWorkflow', + 'ArcanistSimpleSymbolHardpointQuery' => 'ArcanistRuntimeHardpointQuery', + 'ArcanistSimpleSymbolRef' => 'ArcanistSymbolRef', + 'ArcanistSimpleSymbolRefInspector' => 'ArcanistRefInspector', 'ArcanistSingleLintEngine' => 'ArcanistLintEngine', 'ArcanistSlownessXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistSlownessXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistSpellingLinter' => 'ArcanistLinter', 'ArcanistSpellingLinterTestCase' => 'ArcanistLinterTestCase', - 'ArcanistStartWorkflow' => 'ArcanistPhrequentWorkflow', 'ArcanistStaticThisXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistStaticThisXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', - 'ArcanistStopWorkflow' => 'ArcanistPhrequentWorkflow', + 'ArcanistStringConfigOption' => 'ArcanistScalarConfigOption', 'ArcanistSubversionAPI' => 'ArcanistRepositoryAPI', + 'ArcanistSubversionWorkingCopy' => 'ArcanistWorkingCopy', 'ArcanistSummaryLintRenderer' => 'ArcanistLintRenderer', + 'ArcanistSymbolEngine' => 'Phobject', + 'ArcanistSymbolRef' => 'ArcanistRef', 'ArcanistSyntaxErrorXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', + 'ArcanistSystemConfigurationSource' => 'ArcanistFilesystemConfigurationSource', + 'ArcanistTaskRef' => array( + 'ArcanistRef', + 'ArcanistDisplayRefInterface', + ), + 'ArcanistTaskSymbolRef' => 'ArcanistSimpleSymbolRef', 'ArcanistTasksWorkflow' => 'ArcanistWorkflow', 'ArcanistTautologicalExpressionXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistTautologicalExpressionXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', @@ -786,12 +1444,12 @@ phutil_register_library_map(array( 'ArcanistTextLinterTestCase' => 'ArcanistLinterTestCase', 'ArcanistThisReassignmentXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistThisReassignmentXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', - 'ArcanistTimeWorkflow' => 'ArcanistPhrequentWorkflow', 'ArcanistToStringExceptionXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistToStringExceptionXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistTodoCommentXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistTodoCommentXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistTodoWorkflow' => 'ArcanistWorkflow', + 'ArcanistToolset' => 'Phobject', 'ArcanistUSEnglishTranslation' => 'PhutilTranslation', 'ArcanistUnableToParseXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistUnaryPostfixExpressionSpacingXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', @@ -816,23 +1474,42 @@ phutil_register_library_map(array( 'ArcanistUnnecessarySymbolAliasXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistUnsafeDynamicStringXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistUnsafeDynamicStringXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', - 'ArcanistUpgradeWorkflow' => 'ArcanistWorkflow', - 'ArcanistUploadWorkflow' => 'ArcanistWorkflow', + 'ArcanistUpgradeWorkflow' => 'ArcanistArcWorkflow', + 'ArcanistUploadWorkflow' => 'ArcanistArcWorkflow', 'ArcanistUsageException' => 'Exception', 'ArcanistUseStatementNamespacePrefixXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistUseStatementNamespacePrefixXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistUselessOverridingMethodXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistUselessOverridingMethodXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistUserAbortException' => 'ArcanistUsageException', + 'ArcanistUserConfigurationSource' => 'ArcanistFilesystemConfigurationSource', + 'ArcanistUserRef' => array( + 'ArcanistRef', + 'ArcanistDisplayRefInterface', + ), + 'ArcanistUserSymbolHardpointQuery' => 'ArcanistRuntimeHardpointQuery', + 'ArcanistUserSymbolRef' => 'ArcanistSymbolRef', + 'ArcanistUserSymbolRefInspector' => 'ArcanistRefInspector', 'ArcanistVariableReferenceSpacingXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistVariableReferenceSpacingXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', 'ArcanistVariableVariableXHPASTLinterRule' => 'ArcanistXHPASTLinterRule', 'ArcanistVariableVariableXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase', + 'ArcanistVectorHardpoint' => 'ArcanistHardpoint', 'ArcanistVersionWorkflow' => 'ArcanistWorkflow', - 'ArcanistWeldWorkflow' => 'ArcanistWorkflow', + 'ArcanistWeldWorkflow' => 'ArcanistArcWorkflow', 'ArcanistWhichWorkflow' => 'ArcanistWorkflow', + 'ArcanistWildConfigOption' => 'ArcanistConfigOption', 'ArcanistWorkflow' => 'Phobject', + 'ArcanistWorkflowArgument' => 'Phobject', + 'ArcanistWorkflowGitHardpointQuery' => 'ArcanistRuntimeHardpointQuery', + 'ArcanistWorkflowInformation' => 'Phobject', + 'ArcanistWorkingCopy' => 'Phobject', + 'ArcanistWorkingCopyCommitHardpointQuery' => 'ArcanistRuntimeHardpointQuery', + 'ArcanistWorkingCopyConfigurationSource' => 'ArcanistFilesystemConfigurationSource', 'ArcanistWorkingCopyIdentity' => 'Phobject', + 'ArcanistWorkingCopyPath' => 'Phobject', + 'ArcanistWorkingCopyStateRef' => 'ArcanistRef', + 'ArcanistWorkingCopyStateRefInspector' => 'ArcanistRefInspector', 'ArcanistXHPASTLintNamingHook' => 'Phobject', 'ArcanistXHPASTLintNamingHookTestCase' => 'PhutilTestCase', 'ArcanistXHPASTLintSwitchHook' => 'Phobject', @@ -843,18 +1520,356 @@ phutil_register_library_map(array( 'ArcanistXMLLinter' => 'ArcanistLinter', 'ArcanistXMLLinterTestCase' => 'ArcanistLinterTestCase', 'ArcanistXUnitTestResultParser' => 'Phobject', + 'BaseHTTPFuture' => 'Future', 'CSharpToolsTestEngine' => 'XUnitTestEngine', + 'CaseInsensitiveArray' => 'PhutilArray', + 'CaseInsensitiveArrayTestCase' => 'PhutilTestCase', + 'CommandException' => 'Exception', + 'ConduitClient' => 'Phobject', + 'ConduitClientException' => 'Exception', + 'ConduitClientTestCase' => 'PhutilTestCase', + 'ConduitFuture' => 'FutureProxy', + 'ConduitSearchFuture' => 'FutureAgent', + 'ExecFuture' => 'PhutilExecutableFuture', + 'ExecFutureTestCase' => 'PhutilTestCase', + 'ExecPassthruTestCase' => 'PhutilTestCase', + 'FileFinder' => 'Phobject', + 'FileFinderTestCase' => 'PhutilTestCase', + 'FileList' => 'Phobject', + 'Filesystem' => 'Phobject', + 'FilesystemException' => 'Exception', + 'FilesystemTestCase' => 'PhutilTestCase', + 'Future' => 'Phobject', + 'FutureAgent' => 'Future', + 'FutureIterator' => array( + 'Phobject', + 'Iterator', + ), + 'FutureIteratorTestCase' => 'PhutilTestCase', + 'FuturePool' => 'Phobject', + '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', 'NoseTestEngine' => 'ArcanistUnitTestEngine', + 'PHPASTParserTestCase' => 'PhutilTestCase', + 'PhageAction' => 'Phobject', + 'PhageAgentAction' => 'PhageAction', + 'PhageAgentBootloader' => 'Phobject', + 'PhageAgentTestCase' => 'PhutilTestCase', + 'PhageExecWorkflow' => 'PhageWorkflow', + 'PhageExecuteAction' => 'PhageAction', + 'PhageLocalAction' => 'PhageAgentAction', + 'PhagePHPAgent' => 'Phobject', + 'PhagePHPAgentBootloader' => 'PhageAgentBootloader', + 'PhagePlanAction' => 'PhageAction', + 'PhageToolset' => 'ArcanistToolset', + 'PhageWorkflow' => 'ArcanistWorkflow', + 'Phobject' => 'Iterator', + 'PhobjectTestCase' => 'PhutilTestCase', 'PhpunitTestEngine' => 'ArcanistUnitTestEngine', 'PhpunitTestEngineTestCase' => 'PhutilTestCase', + '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', + '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', + 'PhutilAsanaFuture' => 'FutureProxy', + 'PhutilBacktraceSignalHandler' => 'PhutilSignalHandler', + 'PhutilBallOfPHP' => 'Phobject', + 'PhutilBinaryAnalyzer' => 'Phobject', + 'PhutilBinaryAnalyzerTestCase' => 'PhutilTestCase', + 'PhutilBootloaderException' => 'Exception', + 'PhutilBritishEnglishLocale' => 'PhutilLocale', + 'PhutilBufferedIterator' => array( + 'Phobject', + 'Iterator', + ), + 'PhutilBufferedIteratorTestCase' => 'PhutilTestCase', + 'PhutilBugtraqParser' => 'Phobject', + 'PhutilBugtraqParserTestCase' => 'PhutilTestCase', + 'PhutilCIDRBlock' => 'Phobject', + 'PhutilCIDRList' => 'Phobject', + 'PhutilCallbackFilterIterator' => 'FilterIterator', + 'PhutilCallbackSignalHandler' => 'PhutilSignalHandler', + 'PhutilChannel' => 'Phobject', + 'PhutilChannelChannel' => 'PhutilChannel', + 'PhutilChannelTestCase' => 'PhutilTestCase', + 'PhutilChunkedIterator' => array( + 'Phobject', + 'Iterator', + ), + 'PhutilChunkedIteratorTestCase' => 'PhutilTestCase', + 'PhutilClassMapQuery' => 'Phobject', + 'PhutilCloudWatchMetric' => 'Phobject', + 'PhutilCommandString' => 'Phobject', + 'PhutilConsole' => 'Phobject', + 'PhutilConsoleBlock' => 'PhutilConsoleView', + 'PhutilConsoleError' => 'PhutilConsoleLogLine', + 'PhutilConsoleFormatter' => 'Phobject', + 'PhutilConsoleInfo' => 'PhutilConsoleLogLine', + 'PhutilConsoleList' => 'PhutilConsoleView', + 'PhutilConsoleLogLine' => 'PhutilConsoleView', + 'PhutilConsoleMessage' => 'Phobject', + 'PhutilConsoleMetrics' => 'Phobject', + 'PhutilConsoleMetricsSignalHandler' => 'PhutilSignalHandler', + 'PhutilConsoleProgressBar' => 'Phobject', + 'PhutilConsoleProgressSink' => 'PhutilProgressSink', + 'PhutilConsoleServer' => 'Phobject', + 'PhutilConsoleServerChannel' => 'PhutilChannelChannel', + 'PhutilConsoleSkip' => 'PhutilConsoleLogLine', + 'PhutilConsoleStdinNotInteractiveException' => 'Exception', + 'PhutilConsoleTable' => 'PhutilConsoleView', + 'PhutilConsoleView' => 'Phobject', + 'PhutilConsoleWarning' => 'PhutilConsoleLogLine', + 'PhutilConsoleWrapTestCase' => 'PhutilTestCase', + 'PhutilCowsay' => 'Phobject', + 'PhutilCowsayTestCase' => 'PhutilTestCase', + 'PhutilCsprintfTestCase' => 'PhutilTestCase', + 'PhutilCzechLocale' => 'PhutilLocale', + 'PhutilDOMNode' => 'Phobject', + 'PhutilDeferredLog' => 'Phobject', + 'PhutilDeferredLogTestCase' => 'PhutilTestCase', + 'PhutilDiffBinaryAnalyzer' => 'PhutilBinaryAnalyzer', + 'PhutilDirectedScalarGraph' => 'AbstractDirectedGraph', + 'PhutilDirectoryFixture' => 'Phobject', + 'PhutilDocblockParser' => 'Phobject', + 'PhutilDocblockParserTestCase' => 'PhutilTestCase', + 'PhutilEditDistanceMatrix' => 'Phobject', + 'PhutilEditDistanceMatrixTestCase' => 'PhutilTestCase', + 'PhutilEditorConfig' => 'Phobject', + 'PhutilEditorConfigTestCase' => 'PhutilTestCase', + 'PhutilEmailAddress' => 'Phobject', + 'PhutilEmailAddressTestCase' => 'PhutilTestCase', + 'PhutilEmojiLocale' => 'PhutilLocale', + 'PhutilEnglishCanadaLocale' => 'PhutilLocale', + 'PhutilErrorHandler' => 'Phobject', + 'PhutilErrorHandlerTestCase' => 'PhutilTestCase', + 'PhutilErrorTrap' => 'Phobject', + 'PhutilEvent' => 'Phobject', + 'PhutilEventConstants' => 'Phobject', + 'PhutilEventEngine' => 'Phobject', + 'PhutilEventListener' => 'Phobject', + 'PhutilEventType' => 'PhutilEventConstants', + 'PhutilExampleBufferedIterator' => 'PhutilBufferedIterator', + 'PhutilExecChannel' => 'PhutilChannel', + 'PhutilExecPassthru' => 'PhutilExecutableFuture', + 'PhutilExecutableFuture' => 'Future', + 'PhutilExecutionEnvironment' => 'Phobject', + 'PhutilFileLock' => 'PhutilLock', + 'PhutilFileLockTestCase' => 'PhutilTestCase', + 'PhutilFileTree' => 'Phobject', + 'PhutilFrenchLocale' => 'PhutilLocale', + 'PhutilGermanLocale' => 'PhutilLocale', + 'PhutilGitBinaryAnalyzer' => 'PhutilBinaryAnalyzer', + 'PhutilGitHubFuture' => 'FutureProxy', + 'PhutilGitHubResponse' => 'Phobject', + 'PhutilGitURI' => 'Phobject', + 'PhutilGitURITestCase' => 'PhutilTestCase', + 'PhutilHTMLParser' => 'Phobject', + 'PhutilHTMLParserTestCase' => 'PhutilTestCase', + 'PhutilHTTPEngineExtension' => 'Phobject', + 'PhutilHTTPResponse' => 'Phobject', + 'PhutilHTTPResponseParser' => 'Phobject', + 'PhutilHTTPResponseParserTestCase' => 'PhutilTestCase', + 'PhutilHashingIterator' => array( + 'PhutilProxyIterator', + 'Iterator', + ), + 'PhutilHashingIteratorTestCase' => 'PhutilTestCase', + 'PhutilHelpArgumentWorkflow' => 'PhutilArgumentWorkflow', + 'PhutilHgsprintfTestCase' => 'PhutilTestCase', + 'PhutilINIParserException' => 'Exception', + 'PhutilIPAddress' => 'Phobject', + 'PhutilIPAddressTestCase' => 'PhutilTestCase', + 'PhutilIPv4Address' => 'PhutilIPAddress', + 'PhutilIPv6Address' => 'PhutilIPAddress', + 'PhutilInteractiveEditor' => 'Phobject', + 'PhutilInvalidRuleParserGeneratorException' => 'PhutilParserGeneratorException', + 'PhutilInvalidStateException' => 'Exception', + 'PhutilInvalidStateExceptionTestCase' => 'PhutilTestCase', + 'PhutilIrreducibleRuleParserGeneratorException' => 'PhutilParserGeneratorException', + 'PhutilJSON' => 'Phobject', + 'PhutilJSONFragmentLexer' => 'PhutilLexer', + 'PhutilJSONParser' => 'Phobject', + 'PhutilJSONParserException' => 'Exception', + 'PhutilJSONParserTestCase' => 'PhutilTestCase', + 'PhutilJSONProtocolChannel' => 'PhutilProtocolChannel', + 'PhutilJSONProtocolChannelTestCase' => 'PhutilTestCase', + 'PhutilJSONTestCase' => 'PhutilTestCase', + 'PhutilJavaFragmentLexer' => 'PhutilLexer', + 'PhutilKoreanLocale' => 'PhutilLocale', + 'PhutilLanguageGuesser' => 'Phobject', + 'PhutilLanguageGuesserTestCase' => 'PhutilTestCase', + 'PhutilLexer' => 'Phobject', + 'PhutilLibraryConflictException' => 'Exception', + 'PhutilLibraryMapBuilder' => 'Phobject', + 'PhutilLibraryTestCase' => 'PhutilTestCase', + 'PhutilLocale' => 'Phobject', + 'PhutilLocaleTestCase' => 'PhutilTestCase', + 'PhutilLock' => 'Phobject', + 'PhutilLockException' => 'Exception', + 'PhutilLogFileChannel' => 'PhutilChannelChannel', + 'PhutilLunarPhase' => 'Phobject', + 'PhutilLunarPhaseTestCase' => 'PhutilTestCase', + 'PhutilMercurialBinaryAnalyzer' => 'PhutilBinaryAnalyzer', + 'PhutilMethodNotImplementedException' => 'Exception', + 'PhutilMetricsChannel' => 'PhutilChannelChannel', + 'PhutilMissingSymbolException' => 'Exception', + 'PhutilModuleUtilsTestCase' => 'PhutilTestCase', + 'PhutilNumber' => 'Phobject', + 'PhutilOAuth1Future' => 'FutureProxy', + 'PhutilOAuth1FutureTestCase' => 'PhutilTestCase', + 'PhutilOpaqueEnvelope' => 'Phobject', + 'PhutilOpaqueEnvelopeKey' => 'Phobject', + 'PhutilOpaqueEnvelopeTestCase' => 'PhutilTestCase', + 'PhutilPHPFragmentLexer' => 'PhutilLexer', + 'PhutilPHPFragmentLexerTestCase' => 'PhutilTestCase', + 'PhutilPHPObjectProtocolChannel' => 'PhutilProtocolChannel', + 'PhutilPHPObjectProtocolChannelTestCase' => 'PhutilTestCase', + 'PhutilParserGenerator' => 'Phobject', + 'PhutilParserGeneratorException' => 'Exception', + 'PhutilParserGeneratorTestCase' => 'PhutilTestCase', + 'PhutilPayPalAPIFuture' => 'FutureProxy', + 'PhutilPersonTest' => array( + 'Phobject', + 'PhutilPerson', + ), + 'PhutilPhtTestCase' => 'PhutilTestCase', + 'PhutilPirateEnglishLocale' => 'PhutilLocale', + 'PhutilPortugueseBrazilLocale' => 'PhutilLocale', + 'PhutilPortuguesePortugalLocale' => 'PhutilLocale', + 'PhutilPostmarkFuture' => 'FutureProxy', + 'PhutilPregsprintfTestCase' => 'PhutilTestCase', + 'PhutilProcessQuery' => 'Phobject', + 'PhutilProcessRef' => 'Phobject', + 'PhutilProcessRefTestCase' => 'PhutilTestCase', + 'PhutilProgressSink' => 'Phobject', + 'PhutilProtocolChannel' => 'PhutilChannelChannel', + 'PhutilProxyException' => 'Exception', + 'PhutilProxyIterator' => array( + 'Phobject', + 'Iterator', + ), + 'PhutilPygmentizeBinaryAnalyzer' => 'PhutilBinaryAnalyzer', + 'PhutilPythonFragmentLexer' => 'PhutilLexer', + 'PhutilQueryStringParser' => 'Phobject', + 'PhutilQueryStringParserTestCase' => 'PhutilTestCase', + 'PhutilRawEnglishLocale' => 'PhutilLocale', + 'PhutilReadableSerializer' => 'Phobject', + 'PhutilReadableSerializerTestCase' => 'PhutilTestCase', + 'PhutilRope' => 'Phobject', + 'PhutilRopeTestCase' => 'PhutilTestCase', + 'PhutilServiceProfiler' => 'Phobject', + 'PhutilShellLexer' => 'PhutilLexer', + 'PhutilShellLexerTestCase' => 'PhutilTestCase', + 'PhutilSignalHandler' => 'Phobject', + 'PhutilSignalRouter' => 'Phobject', + 'PhutilSimpleOptions' => 'Phobject', + 'PhutilSimpleOptionsLexer' => 'PhutilLexer', + 'PhutilSimpleOptionsLexerTestCase' => 'PhutilTestCase', + 'PhutilSimpleOptionsTestCase' => 'PhutilTestCase', + 'PhutilSimplifiedChineseLocale' => 'PhutilLocale', + 'PhutilSlackFuture' => 'FutureProxy', + 'PhutilSocketChannel' => 'PhutilChannel', + 'PhutilSortVector' => 'Phobject', + 'PhutilSpanishSpainLocale' => 'PhutilLocale', + 'PhutilStreamIterator' => array( + 'Phobject', + 'Iterator', + ), + 'PhutilSubversionBinaryAnalyzer' => 'PhutilBinaryAnalyzer', + 'PhutilSystem' => 'Phobject', + 'PhutilSystemTestCase' => 'PhutilTestCase', + 'PhutilTerminalString' => 'Phobject', 'PhutilTestCase' => 'Phobject', 'PhutilTestCaseTestCase' => 'PhutilTestCase', + 'PhutilTestPhobject' => 'Phobject', 'PhutilTestSkippedException' => 'Exception', 'PhutilTestTerminatedException' => 'Exception', + 'PhutilTraditionalChineseLocale' => 'PhutilLocale', + 'PhutilTranslation' => 'Phobject', + 'PhutilTranslationTestCase' => 'PhutilTestCase', + 'PhutilTranslator' => 'Phobject', + 'PhutilTranslatorTestCase' => 'PhutilTestCase', + 'PhutilTsprintfTestCase' => 'PhutilTestCase', + 'PhutilTwitchFuture' => 'FutureProxy', + 'PhutilTypeCheckException' => 'Exception', + 'PhutilTypeExtraParametersException' => 'Exception', + 'PhutilTypeLexer' => 'PhutilLexer', + 'PhutilTypeMissingParametersException' => 'Exception', + 'PhutilTypeSpec' => 'Phobject', + 'PhutilTypeSpecTestCase' => 'PhutilTestCase', + 'PhutilURI' => 'Phobject', + 'PhutilURITestCase' => 'PhutilTestCase', + 'PhutilUSEnglishLocale' => 'PhutilLocale', + 'PhutilUTF8StringTruncator' => 'Phobject', + 'PhutilUTF8TestCase' => 'PhutilTestCase', 'PhutilUnitTestEngine' => 'ArcanistUnitTestEngine', 'PhutilUnitTestEngineTestCase' => 'PhutilTestCase', + 'PhutilUnknownSymbolParserGeneratorException' => 'PhutilParserGeneratorException', + 'PhutilUnreachableRuleParserGeneratorException' => 'PhutilParserGeneratorException', + 'PhutilUnreachableTerminalParserGeneratorException' => 'PhutilParserGeneratorException', + 'PhutilUrisprintfTestCase' => 'PhutilTestCase', + 'PhutilUtilsTestCase' => 'PhutilTestCase', + 'PhutilVeryWowEnglishLocale' => 'PhutilLocale', + 'PhutilWordPressFuture' => 'FutureProxy', + 'PhutilXHPASTBinary' => 'Phobject', 'PytestTestEngine' => 'ArcanistUnitTestEngine', + 'TempFile' => 'Phobject', + 'TestAbstractDirectedGraph' => 'AbstractDirectedGraph', + 'XHPASTNode' => 'AASTNode', + 'XHPASTNodeTestCase' => 'PhutilTestCase', + 'XHPASTSyntaxErrorException' => 'Exception', + 'XHPASTToken' => 'AASTToken', + 'XHPASTTree' => 'AASTTree', + 'XHPASTTreeTestCase' => 'PhutilTestCase', 'XUnitTestEngine' => 'ArcanistUnitTestEngine', 'XUnitTestResultParserTestCase' => 'PhutilTestCase', + 'XsprintfUnknownConversionException' => 'InvalidArgumentException', ), )); diff --git a/src/__tests__/ArcanistLibraryTestCase.php b/src/__tests__/ArcanistLibraryTestCase.php deleted file mode 100644 index 472947e6..00000000 --- a/src/__tests__/ArcanistLibraryTestCase.php +++ /dev/null @@ -1,3 +0,0 @@ -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/browse/query/ArcanistBrowseCommitHardpointQuery.php b/src/browse/query/ArcanistBrowseCommitHardpointQuery.php new file mode 100644 index 00000000..431f9b8f --- /dev/null +++ b/src/browse/query/ArcanistBrowseCommitHardpointQuery.php @@ -0,0 +1,65 @@ +getRepositoryAPI(); + + $commit_map = array(); + foreach ($refs as $key => $ref) { + $token = $ref->getToken(); + + if ($token === '.') { + // Git resolves "." like HEAD, but we want to treat it as "browse the + // current directory" instead in all cases. + continue; + } + + // Always resolve the empty token; top-level loaders filter out + // irrelevant tokens before this stage. + if ($token === null) { + $token = $api->getHeadCommit(); + } + + // TODO: We should pull a full commit ref out of the API as soon as it + // is able to provide them. In particular, we currently miss Git tree + // hashes which reduces the accuracy of lookups. + + try { + $commit = $api->getCanonicalRevisionName($token); + if ($commit) { + $commit_map[$commit][] = $key; + } + } catch (Exception $ex) { + // Ignore anything we can't resolve. + } + } + + if (!$commit_map) { + yield $this->yieldMap(array()); + } + + $results = array(); + foreach ($commit_map as $commit_identifier => $ref_keys) { + foreach ($ref_keys as $key) { + $commit_ref = id(new ArcanistCommitRef()) + ->setCommitHash($commit_identifier); + $results[$key][] = $commit_ref; + } + } + + yield $this->yieldMap($results); + } + +} diff --git a/src/browse/query/ArcanistBrowseCommitURIHardpointQuery.php b/src/browse/query/ArcanistBrowseCommitURIHardpointQuery.php new file mode 100644 index 00000000..7567456c --- /dev/null +++ b/src/browse/query/ArcanistBrowseCommitURIHardpointQuery.php @@ -0,0 +1,49 @@ +getRefsWithSupportedTypes($refs); + if (!$refs) { + yield $this->yieldMap(array()); + } + + yield $this->yieldRequests( + $refs, + array( + ArcanistBrowseRef::HARDPOINT_COMMITREFS, + )); + + $commit_refs = array(); + foreach ($refs as $key => $ref) { + foreach ($ref->getCommitRefs() as $commit_ref) { + $commit_refs[] = $commit_ref; + } + } + + yield $this->yieldRequests( + $commit_refs, + array( + ArcanistCommitRef::HARDPOINT_UPSTREAM, + )); + + $results = array(); + foreach ($refs as $key => $ref) { + $commit_refs = $ref->getCommitRefs(); + foreach ($commit_refs as $commit_ref) { + $uri = $commit_ref->getURI(); + if ($uri !== null) { + $results[$key][] = $this->newBrowseURIRef() + ->setURI($uri); + } + } + } + + yield $this->yieldMap($results); + } + + +} diff --git a/src/browse/query/ArcanistBrowseObjectNameURIHardpointQuery.php b/src/browse/query/ArcanistBrowseObjectNameURIHardpointQuery.php new file mode 100644 index 00000000..c2ff847e --- /dev/null +++ b/src/browse/query/ArcanistBrowseObjectNameURIHardpointQuery.php @@ -0,0 +1,56 @@ +getRefsWithSupportedTypes($refs); + if (!$refs) { + yield $this->yieldMap(array()); + } + + $name_map = array(); + $token_set = array(); + foreach ($refs as $key => $ref) { + $token = $ref->getToken(); + if (!strlen($token)) { + continue; + } + + $name_map[$key] = $token; + $token_set[$token] = $token; + } + + if (!$token_set) { + yield $this->yieldMap(array()); + } + + $objects = (yield $this->yieldConduit( + 'phid.lookup', + array( + 'names' => $token_set, + ))); + + $result = array(); + foreach ($name_map as $ref_key => $token) { + $object = idx($objects, $token); + + if (!$object) { + continue; + } + + $uri = idx($object, 'uri'); + if (!strlen($uri)) { + continue; + } + + $result[$ref_key][] = $this->newBrowseURIRef() + ->setURI($object['uri']); + } + + yield $this->yieldMap($result); + } + +} diff --git a/src/browse/query/ArcanistBrowsePathURIHardpointQuery.php b/src/browse/query/ArcanistBrowsePathURIHardpointQuery.php new file mode 100644 index 00000000..f6faec2b --- /dev/null +++ b/src/browse/query/ArcanistBrowsePathURIHardpointQuery.php @@ -0,0 +1,74 @@ +getRefsWithSupportedTypes($refs); + if (!$refs) { + yield $this->yieldMap(array()); + } + + $repository_ref = (yield $this->yieldRepositoryRef()); + if (!$repository_ref) { + yield $this->yieldMap(array()); + } + + $working_copy = $this->getWorkingCopy(); + $working_root = $working_copy->getPath(); + + $results = array(); + foreach ($refs as $key => $ref) { + $is_path = $ref->hasType(self::BROWSETYPE); + + $path = $ref->getToken(); + if ($path === null) { + // If we're explicitly resolving no arguments as a path, treat it + // as the current working directory. + if ($is_path) { + $path = '.'; + } else { + continue; + } + } + + $lines = null; + $parts = explode(':', $path); + if (count($parts) > 1) { + $lines = array_pop($parts); + } + $path = implode(':', $parts); + + $full_path = Filesystem::resolvePath($path); + + if (!Filesystem::pathExists($full_path)) { + if (!$is_path) { + continue; + } + } + + if ($full_path == $working_root) { + $path = ''; + } else { + $path = Filesystem::readablePath($full_path, $working_root); + } + + $params = array( + 'path' => $path, + 'lines' => $lines, + 'branch' => $ref->getBranch(), + ); + + $uri = $repository_ref->newBrowseURI($params); + + $results[$key][] = $this->newBrowseURIRef() + ->setURI($uri); + } + + yield $this->yieldMap($results); + } + + +} diff --git a/src/browse/query/ArcanistBrowseRevisionURIHardpointQuery.php b/src/browse/query/ArcanistBrowseRevisionURIHardpointQuery.php new file mode 100644 index 00000000..13e87336 --- /dev/null +++ b/src/browse/query/ArcanistBrowseRevisionURIHardpointQuery.php @@ -0,0 +1,62 @@ +getRefsWithSupportedTypes($refs); + if (!$refs) { + yield $this->yieldMap(array()); + } + + yield $this->yieldRequests( + $refs, + array( + ArcanistBrowseRef::HARDPOINT_COMMITREFS, + )); + + $states = array(); + $map = array(); + foreach ($refs as $key => $ref) { + foreach ($ref->getCommitRefs() as $commit_ref) { + $hash = $commit_ref->getCommitHash(); + $states[$hash] = id(new ArcanistWorkingCopyStateRef()) + ->setCommitRef($commit_ref); + $map[$hash][] = $key; + } + } + + if (!$states) { + yield $this->yieldMap(array()); + } + + yield $this->yieldRequests( + $states, + array( + 'revisionRefs', + )); + + $results = array(); + foreach ($states as $hash => $state) { + foreach ($state->getRevisionRefs() as $revision) { + if ($revision->isClosed()) { + // Don't resolve closed revisions. + continue; + } + + $uri = $revision->getURI(); + + foreach ($map[$hash] as $key) { + $results[$key][] = $this->newBrowseURIRef() + ->setURI($uri); + } + } + } + + yield $this->yieldMap($results); + } + + +} diff --git a/src/browse/query/ArcanistBrowseURIHardpointQuery.php b/src/browse/query/ArcanistBrowseURIHardpointQuery.php new file mode 100644 index 00000000..65d1569f --- /dev/null +++ b/src/browse/query/ArcanistBrowseURIHardpointQuery.php @@ -0,0 +1,49 @@ +getPhobjectClassConstant('BROWSETYPE', 32); + } + + public function getHardpoints() { + return array( + ArcanistBrowseRef::HARDPOINT_URIS, + ); + } + + protected function canLoadRef(ArcanistRef $ref) { + return ($ref instanceof ArcanistBrowseRef); + } + + public function getRefsWithSupportedTypes(array $refs) { + $type = $this->getSupportedBrowseType(); + + foreach ($refs as $key => $ref) { + if ($ref->isUntyped()) { + continue; + } + + if ($ref->hasType($type)) { + continue; + } + + unset($refs[$key]); + } + + return $refs; + } + + public static function getAllBrowseQueries() { + return id(new PhutilClassMapQuery()) + ->setAncestorClass(__CLASS__) + ->execute(); + } + + final protected function newBrowseURIRef() { + return id(new ArcanistBrowseURIRef()) + ->setType($this->getSupportedBrowseType()); + } + +} diff --git a/src/browse/ref/ArcanistBrowseRef.php b/src/browse/ref/ArcanistBrowseRef.php new file mode 100644 index 00000000..f27def01 --- /dev/null +++ b/src/browse/ref/ArcanistBrowseRef.php @@ -0,0 +1,69 @@ +getToken()); + } + + protected function newHardpoints() { + return array( + $this->newVectorHardpoint(self::HARDPOINT_COMMITREFS), + $this->newVectorHardpoint(self::HARDPOINT_URIS), + ); + } + + public function setToken($token) { + $this->token = $token; + return $this; + } + + public function getToken() { + return $this->token; + } + + public function setTypes(array $types) { + $this->types = $types; + return $this; + } + + public function getTypes() { + return $this->types; + } + + public function hasType($type) { + $map = $this->getTypes(); + $map = array_fuse($map); + return isset($map[$type]); + } + + public function isUntyped() { + return !$this->types; + } + + public function setBranch($branch) { + $this->branch = $branch; + return $this; + } + + public function getBranch() { + return $this->branch; + } + + public function getURIs() { + return $this->getHardpoint(self::HARDPOINT_URIS); + } + + public function getCommitRefs() { + return $this->getHardpoint(self::HARDPOINT_COMMITREFS); + } + +} diff --git a/src/browse/ref/ArcanistBrowseURIRef.php b/src/browse/ref/ArcanistBrowseURIRef.php new file mode 100644 index 00000000..b83137f5 --- /dev/null +++ b/src/browse/ref/ArcanistBrowseURIRef.php @@ -0,0 +1,31 @@ +getURI()); + } + + public function setURI($uri) { + $this->uri = $uri; + return $this; + } + + public function getURI() { + return $this->uri; + } + + public function setType($type) { + $this->type = $type; + return $this; + } + + public function getType() { + return $this->type; + } + +} diff --git a/src/browse/workflow/ArcanistBrowseWorkflow.php b/src/browse/workflow/ArcanistBrowseWorkflow.php new file mode 100644 index 00000000..85143353 --- /dev/null +++ b/src/browse/workflow/ArcanistBrowseWorkflow.php @@ -0,0 +1,261 @@ +newWorkflowInformation() + ->setSynopsis(pht('Open a file or object in a local web browser.')) + ->addExample('**browse** [options] -- __target__ ...') + ->addExample('**browse** -- __file-name__') + ->addExample('**browse** -- __object-name__') + ->setHelp($help); + } + + public function getWorkflowArguments() { + return array( + $this->newWorkflowArgument('branch') + ->setParameter('branch-name') + ->setHelp( + pht( + 'Default branch name to view on server. Defaults to "%s".', + 'master')), + $this->newWorkflowArgument('types') + ->setParameter('type-list') + ->setHelp( + pht( + 'Force targets to be interpreted as naming particular types of '. + 'resources.')), + $this->newWorkflowArgument('force') + ->setHelp( + pht( + '(DEPRECATED) Obsolete, use "--types path" instead.')), + $this->newWorkflowArgument('targets') + ->setIsPathArgument(true) + ->setWildcard(true), + ); + } + + public function runWorkflow() { + $targets = $this->getArgument('targets'); + $targets = array_fuse($targets); + + if (!$targets) { + $refs = array( + new ArcanistBrowseRef(), + ); + } else { + $refs = array(); + foreach ($targets as $target) { + $refs[] = id(new ArcanistBrowseRef()) + ->setToken($target); + } + } + + $is_force = $this->getArgument('force'); + if ($is_force) { + // TODO: Remove this completely. + $this->writeWarn( + pht('DEPRECATED'), + pht( + 'Argument "--force" for "arc browse" is deprecated. Use '. + '"--type %s" instead.', + ArcanistBrowsePathURIHardpointQuery::BROWSETYPE)); + } + + $types = $this->getArgument('types'); + if ($types !== null) { + $types = preg_split('/[\s,]+/', $types); + } else { + if ($is_force) { + $types = array(ArcanistBrowsePathURIHardpointQuery::BROWSETYPE); + } else { + $types = array(); + } + } + + foreach ($refs as $ref) { + $ref->setTypes($types); + } + + $branch = $this->getArgument('branch'); + if ($branch) { + foreach ($refs as $ref) { + $ref->setBranch($branch); + } + } + + // TODO: The "Path" and "Commit" queries should regain the ability to warn + // when this command is not run in a working copy that belongs to a + // recognized repository, so they won't ever be able to resolve things. + + // TODO: When you run "arc browse" with no arguments, we should either + // take you to the repository home page or show help. + + // TODO: When you "arc browse something/like/a/path.c" but it does not + // exist on disk, it is not resolved unless you explicitly use "--type + // path". This should be explained more clearly again. + + $this->loadHardpoints( + $refs, + ArcanistBrowseRef::HARDPOINT_URIS); + + $zero_hits = array(); + $open_uris = array(); + $many_hits = array(); + foreach ($refs as $ref) { + $uris = $ref->getURIs(); + if (!$uris) { + $zero_hits[] = $ref; + } else if (count($uris) == 1) { + $open_uris[] = $ref; + } else { + $many_hits[] = $ref; + } + } + + $pick_map = array(); + $pick_selection = null; + $pick_id = 0; + if ($many_hits) { + foreach ($many_hits as $ref) { + $token = $ref->getToken(); + if (strlen($token)) { + $message = pht('Argument "%s" is ambiguous.', $token); + } else { + $message = pht('Default behavior is ambiguous.'); + } + + $this->writeWarn(pht('AMBIGUOUS'), $message); + } + + $is_single_ref = (count($refs) == 1); + + $table = id(new PhutilConsoleTable()); + + if ($is_single_ref) { + $table->addColumn('pick', array('title' => pht('Pick'))); + } else { + $table->addColumn('argument', array('title' => pht('Argument'))); + } + + $table + ->addColumn('type', array('title' => pht('Type'))) + ->addColumn('uri', array('title' => pht('URI'))); + + foreach ($many_hits as $ref) { + $token_display = $ref->getToken(); + if (!strlen($token)) { + $token_display = pht(''); + } + + foreach ($ref->getURIs() as $uri) { + ++$pick_id; + $pick_map[$pick_id] = $uri; + + $row = array( + 'pick' => $pick_id, + 'argument' => $token_display, + 'type' => $uri->getType(), + 'uri' => $uri->getURI(), + ); + + $table->addRow($row); + } + } + + $table->draw(); + + if ($is_single_ref) { + $pick_selection = phutil_console_select( + pht('Which URI do you want to open?'), + 1, + $pick_id); + $open_uris[] = $ref; + } else { + $this->writeInfo( + pht('CHOOSE'), + pht('Use "--types" to select between alternatives.')); + } + } + + // If anything failed to resolve, this is also an error. + if ($zero_hits) { + foreach ($zero_hits as $ref) { + $token = $ref->getToken(); + if ($token === null) { + echo tsprintf( + "%s\n", + pht( + 'Unable to resolve default browse target.')); + } else { + echo tsprintf( + "%s\n", + pht( + 'Unable to resolve argument "%s".', + $ref->getToken())); + } + } + } + + $uris = array(); + foreach ($open_uris as $ref) { + $ref_uris = $ref->getURIs(); + + if (count($ref_uris) > 1) { + foreach ($ref_uris as $uri_key => $uri) { + if ($pick_map[$pick_selection] !== $uri) { + unset($ref_uris[$uri_key]); + } + } + } + + $ref_uri = head($ref_uris); + + // TODO: "ArcanistRevisionRef", at least, may return a relative URI. + // If we get a relative URI, guess the correct absolute URI based on + // the Conduit URI. This might not be correct for Conduit over SSH. + + $raw_uri = $ref_uri->getURI(); + + $raw_uri = new PhutilURI($raw_uri); + if (!strlen($raw_uri->getDomain())) { + $base_uri = $this->getConduitEngine() + ->getConduitURI(); + + $raw_uri = id(new PhutilURI($base_uri)) + ->setPath($raw_uri->getPath()); + } + $raw_uri = phutil_string_cast($raw_uri); + + $uris[] = $raw_uri; + } + + $this->openURIsInBrowser($uris); + + return 0; + } + +} diff --git a/src/channel/PhutilChannel.php b/src/channel/PhutilChannel.php new file mode 100644 index 00000000..65ea544b --- /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 index 00000000..1ab99e30 --- /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 index 00000000..0d4e722b --- /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 index 00000000..bca414b4 --- /dev/null +++ b/src/channel/PhutilJSONProtocolChannel.php @@ -0,0 +1,118 @@ + + * + * ...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) { + if (!is_array($message)) { + throw new Exception( + pht( + 'JSON protocol message must be an array, got some other '. + 'type ("%s").', + phutil_describe_type($message))); + } + + $message = phutil_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); + + if (!preg_match('/^\d+\z/', $len)) { + $full_buffer = $len.$this->buf; + $full_length = strlen($full_buffer); + + throw new Exception( + pht( + 'Protocol channel expected %s-character, zero-padded '. + 'numeric frame length, got something else ("%s"). Full '. + 'buffer (of length %s) begins: %s', + new PhutilNumber(self::SIZE_LENGTH), + phutil_encode_log($len), + new PhutilNumber($full_length), + phutil_encode_log(substr($len.$this->buf, 0, 128)))); + } + + $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 index 00000000..ecc9cc17 --- /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 index 00000000..083e1d1a --- /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 index 00000000..d83d1747 --- /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 index 00000000..2e018fd8 --- /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 index 00000000..4bd2a47a --- /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 index 00000000..3b7ccbab --- /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 index 00000000..3bd0c124 --- /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 index 00000000..29999d53 --- /dev/null +++ b/src/channel/__tests__/PhutilPHPObjectProtocolChannelTestCase.php @@ -0,0 +1,67 @@ + 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() { + $bin = $this->getSupportExecutable('cat'); + $future = new ExecFuture('php -f %R', $bin); + + // 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/ArcanistConduitCall.php b/src/conduit/ArcanistConduitCall.php new file mode 100644 index 00000000..bd25ff19 --- /dev/null +++ b/src/conduit/ArcanistConduitCall.php @@ -0,0 +1,153 @@ +key = $key; + return $this; + } + + public function getKey() { + return $this->key; + } + + public function setEngine(ArcanistConduitEngine $engine) { + $this->engine = $engine; + return $this; + } + + public function getEngine() { + return $this->engine; + } + + public function setMethod($method) { + $this->method = $method; + return $this; + } + + public function getMethod() { + return $this->method; + } + + public function setParameters(array $parameters) { + $this->parameters = $parameters; + return $this; + } + + public function getParameters() { + return $this->parameters; + } + + private function newFuture() { + if ($this->future) { + throw new Exception( + pht( + 'Call has previously generated a future. Create a '. + 'new call object for each API method invocation.')); + } + + $method = $this->getMethod(); + $parameters = $this->getParameters(); + $future = $this->getEngine()->newFuture($this); + $this->future = $future; + + return $this->future; + } + + public function resolve() { + if (!$this->future) { + $this->newFuture(); + } + + return $this->resolveFuture(); + } + + private function resolveFuture() { + $future = $this->future; + + try { + $result = $future->resolve(); + } catch (ConduitClientException $ex) { + switch ($ex->getErrorCode()) { + case 'ERR-INVALID-SESSION': + if (!$this->getEngine()->getConduitToken()) { + $this->raiseLoginRequired(); + } + break; + case 'ERR-INVALID-AUTH': + $this->raiseInvalidAuth(); + break; + } + + throw $ex; + } + + return $result; + } + + private function raiseLoginRequired() { + $conduit_uri = $this->getEngine()->getConduitURI(); + $conduit_uri = new PhutilURI($conduit_uri); + $conduit_uri->setPath('/'); + + $conduit_domain = $conduit_uri->getDomain(); + + $block = id(new PhutilConsoleBlock()) + ->addParagraph( + tsprintf( + '** %s **', + pht('LOGIN REQUIRED'))) + ->addParagraph( + pht( + 'You are trying to connect to a server ("%s") that you do not '. + 'have any stored credentials for, but the command you are '. + 'running requires authentication.', + $conduit_domain)) + ->addParagraph( + pht( + 'To login and save credentials for this server, run this '. + 'command:')) + ->addParagraph( + tsprintf( + " $ arc install-certificate %s\n", + $conduit_uri)); + + throw new ArcanistUsageException($block->drawConsoleString()); + } + + private function raiseInvalidAuth() { + $conduit_uri = $this->getEngine()->getConduitURI(); + $conduit_uri = new PhutilURI($conduit_uri); + $conduit_uri->setPath('/'); + + $conduit_domain = $conduit_uri->getDomain(); + + $block = id(new PhutilConsoleBlock()) + ->addParagraph( + tsprintf( + '** %s **', + pht('INVALID CREDENTIALS'))) + ->addParagraph( + pht( + 'Your stored credentials for this server ("%s") are not valid.', + $conduit_domain)) + ->addParagraph( + pht( + 'To login and save valid credentials for this server, run this '. + 'command:')) + ->addParagraph( + tsprintf( + " $ arc install-certificate %s\n", + $conduit_uri)); + + throw new ArcanistUsageException($block->drawConsoleString()); + } + +} diff --git a/src/conduit/ArcanistConduitEngine.php b/src/conduit/ArcanistConduitEngine.php new file mode 100644 index 00000000..7817f52c --- /dev/null +++ b/src/conduit/ArcanistConduitEngine.php @@ -0,0 +1,108 @@ +conduitURI !== null); + } + + public function setConduitURI($conduit_uri) { + $this->conduitURI = $conduit_uri; + return $this; + } + + public function getConduitURI() { + return $this->conduitURI; + } + + public function setConduitToken($conduit_token) { + $this->conduitToken = $conduit_token; + return $this; + } + + public function getConduitToken() { + return $this->conduitToken; + } + + public function setConduitTimeout($conduit_timeout) { + $this->conduitTimeout = $conduit_timeout; + return $this; + } + + public function getConduitTimeout() { + return $this->conduitTimeout; + } + + public function newCall($method, array $parameters) { + if ($this->conduitURI == null) { + $this->raiseURIException(); + } + + return id(new ArcanistConduitCall()) + ->setEngine($this) + ->setMethod($method) + ->setParameters($parameters); + } + + public function resolveCall($method, array $parameters) { + return $this->newCall($method, $parameters)->resolve(); + } + + public function newFuture(ArcanistConduitCall $call) { + $method = $call->getMethod(); + $parameters = $call->getParameters(); + + $future = $this->getClient()->callMethod($method, $parameters); + + return $future; + } + + private function getClient() { + if (!$this->client) { + $conduit_uri = $this->getConduitURI(); + + $client = new ConduitClient($conduit_uri); + + $timeout = $this->getConduitTimeout(); + if ($timeout) { + $client->setTimeout($timeout); + } + + $token = $this->getConduitToken(); + if ($token) { + $client->setConduitToken($this->getConduitToken()); + } + } + + return $client; + } + + private function raiseURIException() { + $list = id(new PhutilConsoleList()) + ->addItem( + pht( + 'Run in a working copy with "phabricator.uri" set in ".arcconfig".')) + ->addItem( + pht( + 'Set a default URI with `arc set-config phabricator.uri `.')) + ->addItem( + pht( + 'Specify a URI explicitly with `--config phabricator.uri=`.')); + + $block = id(new PhutilConsoleBlock()) + ->addParagraph( + pht( + 'This command needs to communicate with Phabricator, but no '. + 'Phabricator URI is configured.')) + ->addList($list); + + throw new ArcanistUsageException($block->drawConsoleString()); + } + +} diff --git a/src/conduit/ArcanistConduitException.php b/src/conduit/ArcanistConduitException.php new file mode 100644 index 00000000..f17e2ae8 --- /dev/null +++ b/src/conduit/ArcanistConduitException.php @@ -0,0 +1,3 @@ +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 enableCapabilities(array $capabilities) { + $this->capabilities += array_fuse($capabilities); + 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); + $core_future->addHeader('Host', $this->getHostStringForHeader()); + + $core_future->setMethod('POST'); + $core_future->setTimeout($this->timeout); + + // See T13507. If possible, try to compress requests. To compress requests, + // we must have "gzencode()" available and the server needs to have + // asserted it has the "gzip" capability. + $can_gzip = + (function_exists('gzencode')) && + (isset($this->capabilities['gzip'])); + if ($can_gzip) { + $gzip_data = phutil_build_http_querystring($data); + $gzip_data = gzencode($gzip_data); + + $core_future->addHeader('Content-Encoding', 'gzip'); + $core_future->setData($gzip_data); + } else { + $core_future->setData($data); + } + + 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 (phutil_is_natural_list($data)) { + $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 index 00000000..87d93c88 --- /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 index 00000000..20c6906a --- /dev/null +++ b/src/conduit/ConduitFuture.php @@ -0,0 +1,90 @@ +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; + } + + $capabilities = array(); + foreach ($headers as $header) { + list($name, $value) = $header; + if (!strcasecmp($name, 'X-Conduit-Capabilities')) { + $capabilities = explode(' ', $value); + break; + } + } + + if ($capabilities) { + $this->client->enableCapabilities($capabilities); + } + + $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/ConduitSearchFuture.php b/src/conduit/ConduitSearchFuture.php new file mode 100644 index 00000000..03c394d9 --- /dev/null +++ b/src/conduit/ConduitSearchFuture.php @@ -0,0 +1,117 @@ +conduitEngine = $conduit_engine; + return $this; + } + + public function getConduitEngine() { + return $this->conduitEngine; + } + + public function setMethod($method) { + $this->method = $method; + return $this; + } + + public function getMethod() { + return $this->method; + } + + public function setConstraints(array $constraints) { + $this->constraints = $constraints; + return $this; + } + + public function getConstraints() { + return $this->constraints; + } + + public function setAttachments(array $attachments) { + $this->attachments = $attachments; + return $this; + } + + public function getAttachments() { + return $this->attachments; + } + + public function isReady() { + if ($this->hasResult()) { + return true; + } + + $futures = $this->getFutures(); + $future = head($futures); + + if (!$future) { + $future = $this->newFuture(); + } + + if (!$future->isReady()) { + $this->setFutures(array($future)); + return false; + } else { + $this->setFutures(array()); + } + + $result = $future->resolve(); + + foreach ($this->readResults($result) as $object) { + $this->objects[] = $object; + } + + $cursor = idxv($result, array('cursor', 'after')); + + if ($cursor === null) { + $this->setResult($this->objects); + return true; + } + + $this->cursor = $cursor; + $future = $this->newFuture(); + $this->setFutures(array($future)); + + return false; + } + + private function newFuture() { + $engine = $this->getConduitEngine(); + + $method = $this->getMethod(); + $constraints = $this->getConstraints(); + + $parameters = array( + 'constraints' => $constraints, + ); + + if ($this->attachments) { + $parameters['attachments'] = $this->attachments; + } + + if ($this->cursor !== null) { + $parameters['after'] = (string)$this->cursor; + } + + $conduit_call = $engine->newCall($method, $parameters); + $conduit_future = $engine->newFuture($conduit_call); + + return $conduit_future; + } + + private function readResults(array $data) { + return idx($data, 'data'); + } + +} diff --git a/src/conduit/FutureAgent.php b/src/conduit/FutureAgent.php new file mode 100644 index 00000000..6000c6b2 --- /dev/null +++ b/src/conduit/FutureAgent.php @@ -0,0 +1,38 @@ +futures = $futures; + } + + final protected function getFutures() { + return $this->futures; + } + + final public function getReadSockets() { + $sockets = array(); + foreach ($this->getFutures() as $future) { + foreach ($future->getReadSockets() as $read_socket) { + $sockets[] = $read_socket; + } + } + + return $sockets; + } + + final public function getWriteSockets() { + $sockets = array(); + foreach ($this->getFutures() as $future) { + foreach ($future->getWriteSockets() as $read_socket) { + $sockets[] = $read_socket; + } + } + + return $sockets; + } + +} diff --git a/src/conduit/__tests__/ConduitClientTestCase.php b/src/conduit/__tests__/ConduitClientTestCase.php new file mode 100644 index 00000000..1a0d3100 --- /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/config/ArcanistConfigurationEngine.php b/src/config/ArcanistConfigurationEngine.php new file mode 100644 index 00000000..81f24eb5 --- /dev/null +++ b/src/config/ArcanistConfigurationEngine.php @@ -0,0 +1,231 @@ +workingCopy = $working_copy; + return $this; + } + + public function getWorkingCopy() { + return $this->workingCopy; + } + + public function setArguments(PhutilArgumentParser $arguments) { + $this->arguments = $arguments; + return $this; + } + + public function getArguments() { + if (!$this->arguments) { + throw new PhutilInvalidStateException('setArguments'); + } + return $this->arguments; + } + + public function newConfigurationSourceList() { + $list = new ArcanistConfigurationSourceList(); + + $list->addSource(new ArcanistDefaultsConfigurationSource()); + + $arguments = $this->getArguments(); + + // If the invoker has provided one or more configuration files with + // "--config-file" arguments, read those files instead of the system + // and user configuration files. Otherwise, read the system and user + // configuration files. + + $config_files = $arguments->getArg('config-file'); + if ($config_files) { + foreach ($config_files as $config_file) { + $list->addSource(new ArcanistFileConfigurationSource($config_file)); + } + } else { + $system_path = $this->getSystemConfigurationFilePath(); + $list->addSource(new ArcanistSystemConfigurationSource($system_path)); + + $user_path = $this->getUserConfigurationFilePath(); + $list->addSource(new ArcanistUserConfigurationSource($user_path)); + } + + + // If we're running in a working copy, load the ".arcconfig" and any + // local configuration. + $working_copy = $this->getWorkingCopy(); + if ($working_copy) { + $project_path = $working_copy->getProjectConfigurationFilePath(); + if ($project_path !== null) { + $list->addSource(new ArcanistProjectConfigurationSource($project_path)); + } + + $local_path = $working_copy->getLocalConfigurationFilePath(); + if ($local_path !== null) { + $list->addSource(new ArcanistLocalConfigurationSource($local_path)); + } + } + + // If the invoker has provided "--config" arguments, parse those now. + $runtime_args = $arguments->getArg('config'); + if ($runtime_args) { + $list->addSource(new ArcanistRuntimeConfigurationSource($runtime_args)); + } + + return $list; + } + + private function getSystemConfigurationFilePath() { + if (phutil_is_windows()) { + return Filesystem::resolvePath( + 'Phabricator/Arcanist/config', + getenv('ProgramData')); + } else { + return '/etc/arcconfig'; + } + } + + private function getUserConfigurationFilePath() { + if (phutil_is_windows()) { + return getenv('APPDATA').'/.arcrc'; + } else { + return getenv('HOME').'/.arcrc'; + } + } + + public function newDefaults() { + $map = $this->newConfigOptionsMap(); + return mpull($map, 'getDefaultValue'); + } + + public function newConfigOptionsMap() { + $extensions = $this->newEngineExtensions(); + + $map = array(); + $alias_map = array(); + foreach ($extensions as $extension) { + $options = $extension->newConfigurationOptions(); + + foreach ($options as $option) { + $key = $option->getKey(); + + $this->validateConfigOptionKey($key, $extension); + + if (isset($map[$key])) { + throw new Exception( + pht( + 'Configuration option ("%s") defined by extension "%s" '. + 'conflicts with an existing option. Each option must have '. + 'a unique key.', + $key, + get_class($extension))); + } + + if (isset($alias_map[$key])) { + throw new Exception( + pht( + 'Configuration option ("%s") defined by extension "%s" '. + 'conflicts with an alias for another option ("%s"). The '. + 'key and aliases of each option must be unique.', + $key, + get_class($extension), + $alias_map[$key]->getKey())); + } + + $map[$key] = $option; + + foreach ($option->getAliases() as $alias) { + $this->validateConfigOptionKey($alias, $extension, $key); + + if (isset($map[$alias])) { + throw new Exception( + pht( + 'Configuration option ("%s") defined by extension "%s" '. + 'has an alias ("%s") which conflicts with an existing '. + 'option. The key and aliases of each option must be '. + 'unique.', + $key, + get_class($extension), + $alias)); + } + + if (isset($alias_map[$alias])) { + throw new Exception( + pht( + 'Configuration option ("%s") defined by extension "%s" '. + 'has an alias ("%s") which conflicts with the alias of '. + 'another configuration option ("%s"). The key and aliases '. + 'of each option must be unique.', + $key, + get_class($extension), + $alias, + $alias_map[$alias]->getKey())); + } + + $alias_map[$alias] = $option; + } + } + } + + return $map; + } + + private function validateConfigOptionKey( + $key, + ArcanistConfigurationEngineExtension $extension, + $is_alias_of = null) { + + $reserved = array( + // The presence of this key is used to detect old "~/.arcrc" files, so + // configuration options may not use it. + 'config', + ); + $reserved = array_fuse($reserved); + + if (isset($reserved[$key])) { + throw new Exception( + pht( + 'Extension ("%s") defines invalid configuration with key "%s". '. + 'This key is reserved.', + get_class($extension), + $key)); + } + + $is_ok = preg_match('(^[a-z][a-z0-9._-]{2,}\z)', $key); + if (!$is_ok) { + if ($is_alias_of === null) { + throw new Exception( + pht( + 'Extension ("%s") defines invalid configuration with key "%s". '. + 'Configuration keys: may only contain lowercase letters, '. + 'numbers, hyphens, underscores, and periods; must start with a '. + 'letter; and must be at least three characters long.', + get_class($extension), + $key)); + } else { + throw new Exception( + pht( + 'Extension ("%s") defines invalid alias ("%s") for configuration '. + 'key ("%s"). Configuration keys and aliases: may only contain '. + 'lowercase letters, numbers, hyphens, underscores, and periods; '. + 'must start with a letter; and must be at least three characters '. + 'long.', + get_class($extension), + $key, + $is_alias_of)); + } + } + } + + private function newEngineExtensions() { + return id(new PhutilClassMapQuery()) + ->setAncestorClass('ArcanistConfigurationEngineExtension') + ->setUniqueMethod('getExtensionKey') + ->setContinueOnFailure(true) + ->execute(); + } + +} diff --git a/src/config/ArcanistConfigurationEngineExtension.php b/src/config/ArcanistConfigurationEngineExtension.php new file mode 100644 index 00000000..26566b93 --- /dev/null +++ b/src/config/ArcanistConfigurationEngineExtension.php @@ -0,0 +1,10 @@ +getPhobjectClassConstant('EXTENSIONKEY'); + } + +} diff --git a/src/config/ArcanistConfigurationSourceList.php b/src/config/ArcanistConfigurationSourceList.php new file mode 100644 index 00000000..f5516c51 --- /dev/null +++ b/src/config/ArcanistConfigurationSourceList.php @@ -0,0 +1,202 @@ +sources[] = $source; + return $this; + } + + public function getSources() { + return $this->sources; + } + + private function getSourcesWithScopes($scopes) { + if ($scopes !== null) { + $scopes = array_fuse($scopes); + } + + $results = array(); + foreach ($this->getSources() as $source) { + if ($scopes !== null) { + $scope = $source->getConfigurationSourceScope(); + if ($scope === null) { + continue; + } + if (!isset($scopes[$scope])) { + continue; + } + } + + $results[] = $source; + } + + return $results; + } + + public function getWritableSourceFromScope($scope) { + $sources = $this->getSourcesWithScopes(array($scope)); + + $writable = array(); + foreach ($sources as $source) { + if (!$source->isWritableConfigurationSource()) { + continue; + } + + $writable[] = $source; + } + + if (!$writable) { + throw new Exception( + pht( + 'Unable to write configuration: there is no writable configuration '. + 'source in the "%s" scope.', + $scope)); + } + + if (count($writable) > 1) { + throw new Exception( + pht( + 'Unable to write configuration: more than one writable source '. + 'exists in the "%s" scope.', + $scope)); + } + + return head($writable); + } + + public function getConfig($key) { + $option = $this->getConfigOption($key); + $values = $this->getStorageValueList($key); + return $option->getValueFromStorageValueList($values); + } + + public function getConfigFromScopes($key, array $scopes) { + $option = $this->getConfigOption($key); + $values = $this->getStorageValueListFromScopes($key, $scopes); + return $option->getValueFromStorageValueList($values); + } + + public function getStorageValueList($key) { + return $this->getStorageValueListFromScopes($key, null); + } + + private function getStorageValueListFromScopes($key, $scopes) { + $values = array(); + + foreach ($this->getSourcesWithScopes($scopes) as $source) { + if ($source->hasValueForKey($key)) { + $value = $source->getValueForKey($key); + $values[] = new ArcanistConfigurationSourceValue( + $source, + $source->getValueForKey($key)); + } + } + + return $values; + } + + public function getConfigOption($key) { + $options = $this->getConfigOptions(); + + if (!isset($options[$key])) { + throw new Exception( + pht( + 'Configuration option ("%s") is unrecognized. You can only read '. + 'recognized configuration options.', + $key)); + } + + return $options[$key]; + } + + public function setConfigOptions(array $config_options) { + assert_instances_of($config_options, 'ArcanistConfigOption'); + + $config_options = mpull($config_options, null, 'getKey'); + $this->configOptions = $config_options; + + return $this; + } + + public function getConfigOptions() { + if ($this->configOptions === null) { + throw new PhutilInvalidStateException('setConfigOptions'); + } + + return $this->configOptions; + } + + public function validateConfiguration(ArcanistRuntime $runtime) { + $options = $this->getConfigOptions(); + + $aliases = array(); + foreach ($options as $key => $option) { + foreach ($option->getAliases() as $alias) { + $aliases[$alias] = $key; + } + } + + // TOOLSETS: Handle the case where config specifies both a value and an + // alias for that value. The alias should be ignored and we should emit + // a warning. This also needs to be implemented when actually reading + // configuration. + + $value_lists = array(); + foreach ($this->getSources() as $source) { + $keys = $source->getAllKeys(); + foreach ($keys as $key) { + $resolved_key = idx($aliases, $key, $key); + $option = idx($options, $resolved_key); + + // If there's no option object for this config, this value is + // unrecognized. Sources are free to handle this however they want: + // for config files we emit a warning; for "--config" we fatal. + + if (!$option) { + $source->didReadUnknownOption($runtime, $key); + continue; + } + + $raw_value = $source->getValueForKey($key); + + // Make sure we can convert whatever value the configuration source is + // providing into a legitimate runtime value. + try { + $value = $raw_value; + if ($source->isStringSource()) { + $value = $option->getStorageValueFromStringValue($value); + } + $option->getValueFromStorageValue($value); + + $value_lists[$resolved_key][] = new ArcanistConfigurationSourceValue( + $source, + $raw_value); + } catch (Exception $ex) { + throw new PhutilProxyException( + pht( + 'Configuration value ("%s") defined in source "%s" is not '. + 'valid.', + $key, + $source->getSourceDisplayName()), + $ex); + } + } + } + + // Make sure each value list can be merged. + foreach ($value_lists as $key => $value_list) { + try { + $options[$key]->getValueFromStorageValueList($value_list); + } catch (Exception $ex) { + throw $ex; + } + } + + } + +} diff --git a/src/config/ArcanistConfigurationSourceValue.php b/src/config/ArcanistConfigurationSourceValue.php new file mode 100644 index 00000000..6a3340b9 --- /dev/null +++ b/src/config/ArcanistConfigurationSourceValue.php @@ -0,0 +1,22 @@ +source = $source; + $this->value = $value; + } + + public function getConfigurationSource() { + return $this->source; + } + + public function getValue() { + return $this->value; + } + +} diff --git a/src/config/arc/ArcanistArcConfigurationEngineExtension.php b/src/config/arc/ArcanistArcConfigurationEngineExtension.php new file mode 100644 index 00000000..a7219be8 --- /dev/null +++ b/src/config/arc/ArcanistArcConfigurationEngineExtension.php @@ -0,0 +1,151 @@ + array( + 'type' => 'list', + 'legacy' => 'phutil_libraries', + 'help' => pht( + 'A list of paths to phutil libraries that should be loaded at '. + 'startup. This can be used to make classes available, like lint '. + 'or unit test engines.'), + 'default' => array(), + 'example' => '["/var/arc/customlib/src"]', + ), + + 'arc.feature.start.default' => array( + 'type' => 'string', + 'help' => pht( + 'The name of the default branch to create the new feature branch '. + 'off of.'), + 'example' => '"develop"', + ), + 'arc.land.onto.default' => array( + 'type' => 'string', + 'help' => pht( + 'The name of the default branch to land changes onto when '. + '`%s` is run.', + 'arc land'), + 'example' => '"develop"', + ), + + 'arc.autostash' => array( + 'type' => 'bool', + 'help' => pht( + 'Whether %s should permit the automatic stashing of changes in the '. + 'working directory when requiring a clean working copy. This option '. + 'should only be used when users understand how to restore their '. + 'working directory from the local stash if an Arcanist operation '. + 'causes an unrecoverable error.', + 'arc'), + 'default' => false, + 'example' => 'false', + ), + + 'history.immutable' => array( + 'type' => 'bool', + 'legacy' => 'immutable_history', + 'help' => pht( + 'If true, %s will never change repository history (e.g., through '. + 'amending or rebasing). Defaults to true in Mercurial and false in '. + 'Git. This setting has no effect in Subversion.', + 'arc'), + 'example' => 'false', + ), + 'editor' => array( + 'type' => 'string', + 'help' => pht( + 'Command to use to invoke an interactive editor, like `%s` or `%s`. '. + 'This setting overrides the %s environmental variable.', + 'nano', + 'vim', + 'EDITOR'), + 'example' => '"nano"', + ), + 'https.cabundle' => array( + 'type' => 'string', + 'help' => pht( + "Path to a custom CA bundle file to be used for arcanist's cURL ". + "calls. This is used primarily when your conduit endpoint is ". + "behind HTTPS signed by your organization's internal CA."), + 'example' => 'support/yourca.pem', + ), + 'browser' => array( + 'type' => 'string', + 'help' => pht('Command to use to invoke a web browser.'), + 'example' => '"gnome-www-browser"', + ), +*/ + + + + return array( + id(new ArcanistStringConfigOption()) + ->setKey('base') + ->setSummary(pht('Ruleset for selecting commit ranges.')) + ->setHelp( + pht( + 'Base commit ruleset to invoke when determining the start of a '. + 'commit range. See "Arcanist User Guide: Commit Ranges" for '. + 'details.')) + ->setExamples( + array( + 'arc:amended, arc:prompt', + )), + id(new ArcanistStringConfigOption()) + ->setKey('repository') + ->setAliases( + array( + 'repository.callsign', + )) + ->setSummary(pht('Repository for the current working copy.')) + ->setHelp( + pht( + 'Associate the working copy with a specific Phabricator '. + 'repository. Normally, `arc` can figure this association out on '. + 'its own, but if your setup is unusual you can use this option '. + 'to tell it what the desired value is.')) + ->setExamples( + array( + 'libexample', + 'XYZ', + 'R123', + '123', + )), + id(new ArcanistStringConfigOption()) + ->setKey('phabricator.uri') + ->setAliases( + array( + 'conduit_uri', + 'default', + )) + ->setSummary(pht('Phabricator install to connect to.')) + ->setHelp( + pht( + 'Associates this working copy with a specific installation of '. + 'Phabricator.')) + ->setExamples( + array( + 'https://phabricator.mycompany.com/', + )), + id(new ArcanistAliasesConfigOption()) + ->setKey(self::KEY_ALIASES) + ->setDefaultValue(array()) + ->setSummary(pht('List of command aliases.')) + ->setHelp( + pht( + 'Configured command aliases. Use the "alias" workflow to define '. + 'aliases.')), + ); + } + +} diff --git a/src/config/option/ArcanistAliasesConfigOption.php b/src/config/option/ArcanistAliasesConfigOption.php new file mode 100644 index 00000000..536650dc --- /dev/null +++ b/src/config/option/ArcanistAliasesConfigOption.php @@ -0,0 +1,47 @@ +'; + } + + public function getValueFromStorageValue($value) { + if (!is_array($value)) { + throw new Exception(pht('Expected a list or dictionary!')); + } + + $aliases = array(); + foreach ($value as $key => $spec) { + $aliases[] = ArcanistAlias::newFromConfig($key, $spec); + } + + return $aliases; + } + + protected function didReadStorageValueList(array $list) { + assert_instances_of($list, 'ArcanistConfigurationSourceValue'); + + $results = array(); + foreach ($list as $spec) { + $source = $spec->getConfigurationSource(); + $value = $spec->getValue(); + + $value->setConfigurationSource($source); + + $results[] = $value; + } + + return $results; + } + + public function getDisplayValueFromValue($value) { + return pht('Use the "alias" workflow to review aliases.'); + } + + public function getStorageValueFromValue($value) { + return mpull($value, 'getStorageDictionary'); + } + +} diff --git a/src/config/option/ArcanistConfigOption.php b/src/config/option/ArcanistConfigOption.php new file mode 100644 index 00000000..40ea1fcc --- /dev/null +++ b/src/config/option/ArcanistConfigOption.php @@ -0,0 +1,100 @@ +key = $key; + return $this; + } + + public function getKey() { + return $this->key; + } + + public function setAliases($aliases) { + $this->aliases = $aliases; + return $this; + } + + public function getAliases() { + return $this->aliases; + } + + public function setSummary($summary) { + $this->summary = $summary; + return $this; + } + + public function getSummary() { + return $this->summary; + } + + public function setHelp($help) { + $this->help = $help; + return $this; + } + + public function getHelp() { + return $this->help; + } + + public function setExamples(array $examples) { + $this->examples = $examples; + return $this; + } + + public function getExamples() { + return $this->examples; + } + + public function setDefaultValue($default_value) { + $this->defaultValue = $default_value; + return $this; + } + + public function getDefaultValue() { + return $this->defaultValue; + } + + abstract public function getType(); + + abstract public function getValueFromStorageValueList(array $list); + abstract public function getValueFromStorageValue($value); + abstract public function getDisplayValueFromValue($value); + abstract public function getStorageValueFromValue($value); + + public function getStorageValueFromStringValue($value) { + throw new Exception( + pht( + 'This configuration option ("%s") does not support runtime definition '. + 'with "--config".', + $this->getKey())); + } + + protected function getStorageValueFromSourceValue( + ArcanistConfigurationSourceValue $source_value) { + + $value = $source_value->getValue(); + $source = $source_value->getConfigurationSource(); + + if ($source->isStringSource()) { + $value = $this->getStorageValueFromStringValue($value); + } + + return $value; + } + + public function writeValue(ArcanistConfigurationSource $source, $value) { + $value = $this->getStorageValueFromValue($value); + $source->setStorageValueForKey($this->getKey(), $value); + } + +} diff --git a/src/config/option/ArcanistListConfigOption.php b/src/config/option/ArcanistListConfigOption.php new file mode 100644 index 00000000..f8d5edf0 --- /dev/null +++ b/src/config/option/ArcanistListConfigOption.php @@ -0,0 +1,32 @@ +getConfigurationSource(); + $storage_value = $this->getStorageValueFromSourceValue($source_value); + + $items = $this->getValueFromStorageValue($storage_value); + foreach ($items as $item) { + $result_list[] = new ArcanistConfigurationSourceValue( + $source, + $item); + } + } + + $result_list = $this->didReadStorageValueList($result_list); + + return $result_list; + } + + protected function didReadStorageValueList(array $list) { + assert_instances_of($list, 'ArcanistConfigurationSourceValue'); + return mpull($list, 'getValue'); + } + +} diff --git a/src/config/option/ArcanistScalarConfigOption.php b/src/config/option/ArcanistScalarConfigOption.php new file mode 100644 index 00000000..9ccda1e6 --- /dev/null +++ b/src/config/option/ArcanistScalarConfigOption.php @@ -0,0 +1,19 @@ +getStorageValueFromSourceValue($source_value); + + return $this->getValueFromStorageValue($storage_value); + } + + public function getValueFromStorageValue($value) { + return $value; + } + +} diff --git a/src/config/option/ArcanistStringConfigOption.php b/src/config/option/ArcanistStringConfigOption.php new file mode 100644 index 00000000..a6da4627 --- /dev/null +++ b/src/config/option/ArcanistStringConfigOption.php @@ -0,0 +1,22 @@ +getStorageValueFromSourceValue($source_value); + + return $this->getValueFromStorageValue($storage_value); + } + + public function getValueFromStorageValue($value) { + return $value; + } + + public function getStorageValueFromValue($value) { + return $value; + } + +} diff --git a/src/config/source/ArcanistConfigurationSource.php b/src/config/source/ArcanistConfigurationSource.php new file mode 100644 index 00000000..0ede49e1 --- /dev/null +++ b/src/config/source/ArcanistConfigurationSource.php @@ -0,0 +1,39 @@ +getLogEngine()->writeWarning( + pht('UNKNOWN CONFIGURATION'), + pht( + 'Ignoring unrecognized configuration option ("%s") from source: %s.', + $key, + $this->getSourceDisplayName())); + } + +} diff --git a/src/config/source/ArcanistDefaultsConfigurationSource.php b/src/config/source/ArcanistDefaultsConfigurationSource.php new file mode 100644 index 00000000..3052d180 --- /dev/null +++ b/src/config/source/ArcanistDefaultsConfigurationSource.php @@ -0,0 +1,17 @@ +newDefaults(); + + parent::__construct($values); + } + +} diff --git a/src/config/source/ArcanistDictionaryConfigurationSource.php b/src/config/source/ArcanistDictionaryConfigurationSource.php new file mode 100644 index 00000000..a281ecb0 --- /dev/null +++ b/src/config/source/ArcanistDictionaryConfigurationSource.php @@ -0,0 +1,44 @@ +values = $dictionary; + } + + public function getAllKeys() { + return array_keys($this->values); + } + + public function hasValueForKey($key) { + return array_key_exists($key, $this->values); + } + + public function getValueForKey($key) { + if (!$this->hasValueForKey($key)) { + throw new Exception( + pht( + 'Configuration source ("%s") has no value for key ("%s").', + get_class($this), + $key)); + } + + return $this->values[$key]; + } + + public function setStorageValueForKey($key, $value) { + $this->values[$key] = $value; + + $this->writeToStorage($this->values); + + return $this; + } + + protected function writeToStorage($values) { + throw new PhutilMethodNotImplementedException(); + } + +} diff --git a/src/config/source/ArcanistFileConfigurationSource.php b/src/config/source/ArcanistFileConfigurationSource.php new file mode 100644 index 00000000..60c5fa28 --- /dev/null +++ b/src/config/source/ArcanistFileConfigurationSource.php @@ -0,0 +1,10 @@ +path = $path; + + $values = array(); + if (Filesystem::pathExists($path)) { + $contents = Filesystem::readFile($path); + if (strlen(trim($contents))) { + $values = phutil_json_decode($contents); + } + } + + $values = $this->didReadFilesystemValues($values); + + parent::__construct($values); + } + + public function getPath() { + return $this->path; + } + + public function getSourceDisplayName() { + return pht('%s (%s)', $this->getFileKindDisplayName(), $this->getPath()); + } + + abstract public function getFileKindDisplayName(); + + protected function didReadFilesystemValues(array $values) { + return $values; + } + + protected function writeToStorage($values) { + $content = id(new PhutilJSON()) + ->encodeFormatted($values); + + Filesystem::writeFile($this->path, $content); + } + +} diff --git a/src/config/source/ArcanistLocalConfigurationSource.php b/src/config/source/ArcanistLocalConfigurationSource.php new file mode 100644 index 00000000..f5c94944 --- /dev/null +++ b/src/config/source/ArcanistLocalConfigurationSource.php @@ -0,0 +1,10 @@ +writeLog( - "[%s: 'arc %s' -> $ %s]", - pht('alias'), - $command, - $shell_cmd); - - if ($args) { - $err = phutil_passthru('%C %Ls', $shell_cmd, $args); - } else { - $err = phutil_passthru('%C', $shell_cmd); - } - - exit($err); - } - - // Run arc command aliases. - if ($new_command) { - $workflow = $this->buildWorkflow($new_command); - if ($workflow) { - $console->writeLog( - "[%s: 'arc %s' -> 'arc %s']\n", - pht('alias'), - $command, - $full_alias); - $command = $new_command; - return $workflow; - } - } - $all = array_keys($this->buildAllWorkflows()); // We haven't found a real command or an alias, so try to locate a command diff --git a/src/configuration/ArcanistConfigurationManager.php b/src/configuration/ArcanistConfigurationManager.php index 0d0a92e7..f1391a8b 100644 --- a/src/configuration/ArcanistConfigurationManager.php +++ b/src/configuration/ArcanistConfigurationManager.php @@ -270,7 +270,13 @@ final class ArcanistConfigurationManager extends Phobject { } public function readUserArcConfig() { - return idx($this->readUserConfigurationFile(), 'config', array()); + $config = $this->readUserConfigurationFile(); + + if (isset($config['config'])) { + $config = $config['config']; + } + + return $config; } public function writeUserArcConfig(array $options) { diff --git a/src/configuration/ArcanistSetting.php b/src/configuration/ArcanistSetting.php new file mode 100644 index 00000000..ff32239f --- /dev/null +++ b/src/configuration/ArcanistSetting.php @@ -0,0 +1,48 @@ +getPhobjectClassConstant('SETTINGKEY', 32); + } + + public function getAliases() { + return array(); + } + + abstract public function getHelp(); + abstract public function getType(); + + public function getExample() { + return null; + } + + final public function getLegacyDictionary() { + $result = array( + 'type' => $this->getType(), + 'help' => $this->getHelp(), + ); + + $example = $this->getExample(); + if ($example !== null) { + $result['example'] = $example; + } + + $aliases = $this->getAliases(); + if ($aliases) { + $result['legacy'] = head($aliases); + } + + return $result; + } + + final public static function getAllSettings() { + return id(new PhutilClassMapQuery()) + ->setAncestorClass(__CLASS__) + ->setUniqueMethod('getSettingKey') + ->setSortMethod('getSettingKey') + ->execute(); + } + +} diff --git a/src/configuration/ArcanistSettings.php b/src/configuration/ArcanistSettings.php index fdf68259..496d3771 100644 --- a/src/configuration/ArcanistSettings.php +++ b/src/configuration/ArcanistSettings.php @@ -3,7 +3,7 @@ final class ArcanistSettings extends Phobject { private function getOptions() { - return array( + $legacy_builtins = array( 'default' => array( 'type' => 'string', 'help' => pht( @@ -80,19 +80,6 @@ final class ArcanistSettings extends Phobject { 'arc land'), 'example' => '"develop"', ), - 'arc.lint.cache' => array( - 'type' => 'bool', - 'help' => pht( - 'Enable the lint cache by default. When enabled, `%s` attempts to '. - 'use cached results if possible. Currently, the cache is not always '. - 'invalidated correctly and may cause `%s` to report incorrect '. - 'results, particularly while developing linters. This is probably '. - 'worth enabling only if your linters are very slow.', - 'arc lint', - 'arc lint'), - 'default' => false, - 'example' => 'false', - ), 'history.immutable' => array( 'type' => 'bool', 'legacy' => 'immutable_history', @@ -121,14 +108,6 @@ final class ArcanistSettings extends Phobject { "behind HTTPS signed by your organization's internal CA."), 'example' => 'support/yourca.pem', ), - 'https.blindly-trust-domains' => array( - 'type' => 'list', - 'help' => pht( - 'List of domains to blindly trust SSL certificates for. '. - 'Disables peer verification.'), - 'default' => array(), - 'example' => '["secure.mycompany.com"]', - ), 'browser' => array( 'type' => 'string', 'help' => pht('Command to use to invoke a web browser.'), @@ -140,16 +119,6 @@ final class ArcanistSettings extends Phobject { 'default' => array(), 'example' => '["ExampleEventListener"]', ), - 'http.basicauth.user' => array( - 'type' => 'string', - 'help' => pht('Username to use for basic auth over HTTP transports.'), - 'example' => '"bob"', - ), - 'http.basicauth.pass' => array( - 'type' => 'string', - 'help' => pht('Password to use for basic auth over HTTP transports.'), - 'example' => '"bobhasasecret"', - ), 'arc.autostash' => array( 'type' => 'bool', 'help' => pht( @@ -168,6 +137,16 @@ final class ArcanistSettings extends Phobject { 'Configured command aliases. Use "arc alias" to define aliases.'), ), ); + + $settings = ArcanistSetting::getAllSettings(); + foreach ($settings as $key => $setting) { + $settings[$key] = $setting->getLegacyDictionary(); + } + + $results = $settings + $legacy_builtins; + ksort($results); + + return $results; } private function getOption($key) { diff --git a/src/console/PhutilConsole.php b/src/console/PhutilConsole.php new file mode 100644 index 00000000..5d646f7c --- /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 index 00000000..d380c961 --- /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 index 00000000..21debd0e --- /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 index 00000000..6cd30ed7 --- /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 index 00000000..17ac2339 --- /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 index 00000000..8ef10026 --- /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 index 00000000..3bcb3290 --- /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 index 00000000..5e300b30 --- /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) { + // See T13297. On macOS, "vi" and "vim" may exit with errors even though + // the edit succeeded. If the binary is "vi" or "vim" and we get an exit + // code, we perform an additional test on the binary. + $vi_binaries = array( + 'vi' => true, + 'vim' => true, + ); + + $binary = basename($editor); + if (isset($vi_binaries[$binary])) { + // This runs "Q" (an invalid command), then "q" (a valid command, + // meaning "quit"). Vim binaries with behavior that makes them poor + // interactive editors will exit "1". + list($diagnostic_err) = exec_manual('%R +Q +q', $binary); + + // If we get an error back, the binary is badly behaved. Ignore the + // original error and assume it's not meaningful, since it just + // indicates the user made a typo in a command when editing + // interactively, which is routine and unconcerning. + if ($diagnostic_err) { + $err = 0; + } + } + } + + 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 index 00000000..98297da4 --- /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 index 00000000..e3052232 --- /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 index 00000000..ecd42dbc --- /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 index 00000000..a05d75c6 --- /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 index 00000000..a05d75c6 --- /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 index 00000000..9d4677a5 --- /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 index 00000000..3938db8e --- /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 index 00000000..8677ea84 --- /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 index 00000000..8677ea84 --- /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 index 00000000..731d1557 --- /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 index 00000000..182cf5e3 --- /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 index 00000000..a4fa98d5 --- /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 index 00000000..ae60270b --- /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 index 00000000..7daa899e --- /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 index 00000000..cdbd42a1 --- /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 index 00000000..b2593133 --- /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 index 00000000..85f5b8f9 --- /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 index 00000000..d6994b5c --- /dev/null +++ b/src/console/view/PhutilConsoleWarning.php @@ -0,0 +1,10 @@ +'; - $highlight_c = ''; - - $depth_in = ''; - $depth_out = ''; - - $is_html = false; - if ($str instanceof PhutilSafeHTML) { - $is_html = true; - $str = $str->getHTMLContent(); - } - - $n = strlen($str); - for ($i = 0; $i < $n; $i++) { - - if ($p == $e) { - do { - if (empty($intra_stack)) { - $buf .= substr($str, $i); - break 2; - } - $stack = array_shift($intra_stack); - $s = $e; - $e += $stack[1]; - } while ($stack[0] === 0); - - switch ($stack[0]) { - case '>': - $open_tag = $depth_in; - break; - case '<': - $open_tag = $depth_out; - break; - default: - $open_tag = $highlight_o; - break; - } - } - - if (!$highlight && !$tag && !$ent && $p == $s) { - $buf .= $open_tag; - $highlight = true; - } - - if ($str[$i] == '<') { - $tag = true; - if ($highlight) { - $buf .= $highlight_c; - } - } - - if (!$tag) { - if ($str[$i] == '&') { - $ent = true; - } - if ($ent && $str[$i] == ';') { - $ent = false; - } - if (!$ent) { - $p++; - } - } - - $buf .= $str[$i]; - - if ($tag && $str[$i] == '>') { - $tag = false; - if ($highlight) { - $buf .= $open_tag; - } - } - - if ($highlight && ($p == $e || $i == $n - 1)) { - $buf .= $highlight_c; - $highlight = false; - } - } - - if ($is_html) { - return phutil_safe_html($buf); - } - - return $buf; - } - private static function collapseIntralineRuns($runs) { $count = count($runs); for ($ii = 0; $ii < $count - 1; $ii++) { diff --git a/src/differential/ArcanistDifferentialCommitMessage.php b/src/differential/ArcanistDifferentialCommitMessage.php index b76011f5..912ee4be 100644 --- a/src/differential/ArcanistDifferentialCommitMessage.php +++ b/src/differential/ArcanistDifferentialCommitMessage.php @@ -8,6 +8,7 @@ final class ArcanistDifferentialCommitMessage extends Phobject { private $rawCorpus; private $revisionID; private $fields = array(); + private $xactions = null; private $gitSVNBaseRevision; private $gitSVNBasePath; @@ -37,6 +38,13 @@ final class ArcanistDifferentialCommitMessage extends Phobject { return $this->revisionID; } + public function getRevisionMonogram() { + if ($this->revisionID) { + return 'D'.$this->revisionID; + } + return null; + } + public function pullDataFromConduit( ConduitClient $conduit, $partial = false) { @@ -50,6 +58,9 @@ final class ArcanistDifferentialCommitMessage extends Phobject { $this->fields = $result['fields']; + // NOTE: This does not exist prior to late October 2017. + $this->xactions = idx($result, 'transactions'); + if (!empty($result['errors'])) { throw new ArcanistDifferentialCommitMessageParserException( $result['errors']); @@ -93,6 +104,10 @@ final class ArcanistDifferentialCommitMessage extends Phobject { return md5($fields); } + public function getTransactions() { + return $this->xactions; + } + /** * Extract the revision ID from a commit message. * diff --git a/src/docs/article/aws.diviner b/src/docs/article/aws.diviner new file mode 100644 index 00000000..9504336f --- /dev/null +++ b/src/docs/article/aws.diviner @@ -0,0 +1,8 @@ +@title Using Amazon Web Services APIs +@group aws + +Don't use them. + += Mega Alpha = + +NOTE: These APIs are really sketchy right now. diff --git a/src/docs/article/command_execution.diviner b/src/docs/article/command_execution.diviner new file mode 100644 index 00000000..8d4b7d0e --- /dev/null +++ b/src/docs/article/command_execution.diviner @@ -0,0 +1,64 @@ +@title Command Execution +@group exec + +This document describes best practices for executing system commands in PHP +using libphutil. + += Overview = + +PHP has several built-in mechanisms for executing system commands, like +`exec()`, `system()`, and the backtick operator. However, these mechanisms +often make it difficult to get all the information you need to handle error +conditions, properly escaping commands is cumbersome, and they do not provide +more advanced features like parallel execution and timeouts. + +This document describes how to use the APIs in libphutil to execute commands +without encountering these problems. + += Simple Commands: `execx()` and `exec_manual()` = + +@{function:execx} and @{function:exec_manual} are replacements for `exec()`, +`system()`, `shell_exec()`, and the backtick operator. The APIs look like this: + + list($stdout, $stderr) = execx('ls %s', $path); + list($err, $stdout, $stderr) = exec_manual('ls %s', $path); + +The major advantages of these methods over the `exec()` family are that you can +easily check return codes, capture both stdout and stderr, and use a simple +`sprintf()`-style formatting string to properly escape commands. + +@{function:execx} will throw a @{class:CommandException} if the command you +execute terminates with a nonzero exit code, while @{function:exec_manual} +returns the error code. If you use @{function:exec_manual}, you must manually +check the error code. + += Advanced Commands: `ExecFutures` = + +If you need more advanced features like parallel execution, command timeouts, +and asynchronous I/O, use @{class:ExecFuture}. + + $future = new ExecFuture('ls %s', $path); + list($stdout, $stderr) = $future->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 index 00000000..9f14e2bf --- /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 index 00000000..119cdedc --- /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 index 00000000..2933b8db --- /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 index 00000000..5df44461 --- /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 index 00000000..c37b91a4 --- /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 index 00000000..c76b7437 --- /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 index 00000000..deb6ee16 --- /dev/null +++ b/src/error/PhutilErrorHandler.php @@ -0,0 +1,623 @@ +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; + } + + // See T13499. If this is a user error arising from "trigger_error()" or + // similar, route it through normal error handling: this is probably the + // best match to authorial intent, since the code could choose to throw + // an exception instead if it wanted that behavior. Phabricator does not + // use "trigger_error()" so we never normally expect to reach this + // block in first-party code. + + if (($num === E_USER_ERROR) || + ($num === E_USER_WARNING) || + ($num === E_USER_NOTICE)) { + + $trace = debug_backtrace(); + array_shift($trace); + self::dispatchErrorMessage( + self::ERROR, + $str, + array( + 'file' => $file, + 'line' => $line, + 'context' => $ctx, + 'error_code' => $num, + 'trace' => $trace, + )); + + return; + } + + // 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); + } + + // Convert undefined indexes into exceptions. + if (preg_match('/^Undefined index: /', $str)) { + throw new RuntimeException($str); + } + + // Convert undefined offsets into exceptions. + if (preg_match('/^Undefined offset: /', $str)) { + throw new RuntimeException($str); + } + + // See T13499. Convert all other runtime errors not handled in a more + // specific way into runtime exceptions. + throw new RuntimeException($str); + } + + /** + * 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 '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 index 00000000..94d291d0 --- /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 index 00000000..2970e34d --- /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 index 00000000..ea01ee4e --- /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 index 00000000..4f477ae8 --- /dev/null +++ b/src/error/PhutilProxyException.php @@ -0,0 +1,37 @@ +previousException = $previous; + + // This may be an "Exception" or a "Throwable". The "__construct()" method + // for the Exception is documented as taking an Exception, not a Throwable. + // Although passing a Throwable appears to work in PHP 7.3, don't risk it. + $is_exception = ($previous instanceof Exception); + + if (version_compare(PHP_VERSION, '5.3.0', '>=') && $is_exception) { + 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 index 00000000..760f410a --- /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 index 00000000..ba416ce6 --- /dev/null +++ b/src/error/__tests__/PhutilOpaqueEnvelopeTestCase.php @@ -0,0 +1,62 @@ +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, $signpost); + } catch (Exception $ex) { + $trace = $ex->getTrace(); + + // NOTE: The entire trace may be very large and contain complex + // recursive datastructures. Look at only the last few frames: we expect + // to see the signpost value but not the secret. + $trace = array_slice($trace, 0, 2); + $trace = print_r($trace, true); + + $this->assertTrue(strpos($trace, $signpost) !== false); + $this->assertFalse(strpos($trace, $secret)); + } + + $backtrace = $this->getBacktrace($envelope, $signpost); + $backtrace = array_slice($backtrace, 0, 2); + + $this->assertTrue(strpos($trace, $signpost) !== false); + $this->assertFalse(strpos(print_r($backtrace, true), $secret)); + + $this->assertEqual($secret, $envelope->openEnvelope()); + } + + private function throwTrace($v, $w) { + throw new Exception('!'); + } + + private function getBacktrace($v, $w) { + return debug_backtrace(); + } + +} diff --git a/src/error/phlog.php b/src/error/phlog.php new file mode 100644 index 00000000..105e0740 --- /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) || ($event instanceof Throwable)) { + $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 index 00000000..9297b201 --- /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 index 00000000..8c822103 --- /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 index 00000000..e4925e50 --- /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 index 00000000..ede347fb --- /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 index 00000000..6c94487d --- /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 index 00000000..6b1dbbb4 --- /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 index 00000000..656c92de --- /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 index 00000000..79a030b8 --- /dev/null +++ b/src/filesystem/Filesystem.php @@ -0,0 +1,1274 @@ +> 3]; + } + + return $result; + } + + + /** + * Generate a random integer value in a given range. + * + * This method uses less-entropic random sources under older versions of PHP. + * + * @param int Minimum value, inclusive. + * @param int Maximum value, inclusive. + */ + public static function readRandomInteger($min, $max) { + if (!is_int($min)) { + throw new Exception(pht('Minimum value must be an integer.')); + } + + if (!is_int($max)) { + throw new Exception(pht('Maximum value must be an integer.')); + } + + if ($min > $max) { + throw new Exception( + pht( + 'Minimum ("%d") must not be greater than maximum ("%d").', + $min, + $max)); + } + + // Under PHP 7.2.0 and newer, we can just use "random_int()". This function + // is intended to generate cryptographically usable entropy. + if (function_exists('random_int')) { + return random_int($min, $max); + } + + // We could find a stronger source for this, but correctly converting raw + // bytes to an integer range without biases is fairly hard and it seems + // like we're more likely to get that wrong than suffer a PRNG prediction + // issue by falling back to "mt_rand()". + + if (($max - $min) > mt_getrandmax()) { + throw new Exception( + pht('mt_rand() range is smaller than the requested range.')); + } + + $result = mt_rand($min, $max); + if (!is_int($result)) { + throw new Exception(pht('Bad return value from mt_rand().')); + } + + 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. + + // We're also normalizing path separators to whatever is normal for the + // environment. + + if (phutil_is_windows()) { + $parts = trim($path, '/\\'); + $parts = preg_split('([/\\\\])', $parts); + + // Normalize the directory separators in the path. If we find a parent + // below, we'll overwrite this with a better resolved path. + $path = str_replace('/', '\\', $path); + } else { + $parts = trim($path, '/'); + $parts = explode('/', $parts); + } + + while ($parts) { + 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); + } + + public static function concatenatePaths(array $components) { + $components = implode(DIRECTORY_SEPARATOR, $components); + + // Replace any extra sequences of directory separators with a single + // separator, so we don't end up with "path//to///thing.c". + $components = preg_replace( + '('.preg_quote(DIRECTORY_SEPARATOR).'{2,})', + DIRECTORY_SEPARATOR, + $components); + + return $components; + } + +/* -( 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)) { + return; + } + + // Before we claim that the path doesn't exist, try to find a parent we + // don't have "+x" on. If we find one, tailor the error message so we don't + // say "does not exist" in cases where the path does exist, we just don't + // have permission to test its existence. + foreach (self::walkToRoot($path) as $parent) { + if (!self::pathExists($parent)) { + continue; + } + + if (!is_dir($parent)) { + continue; + } + + if (phutil_is_windows()) { + // Do nothing. On Windows, there's no obvious equivalent to the + // check below because "is_executable(...)" always appears to return + // "false" for any directory. + } else if (!is_executable($parent)) { + // On Linux, note that we don't need read permission ("+r") on parent + // directories to determine that a path exists, only execute ("+x"). + throw new FilesystemException( + $path, + pht( + 'Filesystem path "%s" can not be accessed because a parent '. + 'directory ("%s") is not executable (the current process does '. + 'not have "+x" permission).', + $path, + $parent)); + } + } + + throw new FilesystemException( + $path, + pht( + 'Filesystem path "%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 index 00000000..cc464ff7 --- /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 index 00000000..2193eb3c --- /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 .= phutil_encode_log($map[$c]); + } 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 index 00000000..8eb4c14a --- /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 index 00000000..e8dd07f4 --- /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 index 00000000..a2486e36 --- /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 index 00000000..f152b521 --- /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 index 00000000..6361bc49 --- /dev/null +++ b/src/filesystem/PhutilLockException.php @@ -0,0 +1,16 @@ +hint = $hint; + return $this; + } + + public function getHint() { + return $this->hint; + } + +} diff --git a/src/filesystem/PhutilProcessQuery.php b/src/filesystem/PhutilProcessQuery.php new file mode 100644 index 00000000..558d3379 --- /dev/null +++ b/src/filesystem/PhutilProcessQuery.php @@ -0,0 +1,125 @@ +isOverseer = $is_overseer; + return $this; + } + + public function withInstances(array $instances) { + $this->instances = $instances; + return $this; + } + + public function execute() { + if (phutil_is_windows()) { + throw new Exception( + pht( + 'Querying system processes is not currently supported on '. + 'Windows.')); + } + + // TODO: See T12827. This formulation likely does not work properly on + // Solaris. + + list($processes) = execx('ps -o pid,command -a -x -w -w -w'); + $processes = phutil_split_lines($processes, false); + + $refs = array(); + foreach ($processes as $process) { + $parts = preg_split('/\s+/', trim($process), 2); + list($pid, $command) = $parts; + + $ref = id(new PhutilProcessRef()) + ->setPID((int)$pid); + + $argv = $this->getArgv($pid, $command); + $ref->setArgv($argv); + + // If this is an overseer and the command has a "-l" ("Label") argument, + // the argument contains the "PHABRICATOR_INSTANCE" value for the daemon. + // Parse it out and annotate the process. + $instance = null; + if ($ref->getIsOverseer()) { + $matches = null; + if (preg_match('/-l (\S+)/', $command, $matches)) { + $instance = $matches[1]; + } + } + + $ref->setInstance($instance); + + $refs[] = $ref; + } + + if ($this->isOverseer !== null) { + foreach ($refs as $key => $ref) { + if ($ref->getIsOverseer() !== $this->isOverseer) { + unset($refs[$key]); + } + } + } + + if ($this->instances) { + $instances_map = array_fuse($this->instances); + foreach ($refs as $key => $ref) { + if (!isset($instances_map[$ref->getInstance()])) { + unset($refs[$key]); + } + } + } + + return array_values($refs); + } + + private function getArgv($pid, $command) { + + // In the output of "ps", arguments in process titles are not escaped, so + // we can not distinguish between the processes created by running these + // commands by looking only at the output of "ps": + // + // echo 'a b' + // echo a b + // + // Both commands will have the same process title in the output of "ps". + + // This means we may split the command incorrectly in the general case, + // and this misparsing may be important if the process binary resides in + // a directory with spaces in its path and we're trying to identify which + // binary a process is running. + + // On Ubuntu, and likely most other Linux systems, we can get a raw + // command line from "/proc" with arguments delimited by "\0". + + // On macOS, there's no "/proc" and we don't currently have a robust way + // to split the process command in a way that parses spaces properly, so + // fall back to a best effort based on the output of "ps". This is almost + // always correct, since it is uncommon to put binaries under paths with + // spaces in them. + + $proc_cmdline = sprintf('/proc/%d/cmdline', $pid); + try { + $argv = Filesystem::readFile($proc_cmdline); + $argv = explode("\0", $argv); + + // The output itself is terminated with "\0", so remove the final empty + // argument. + if (last($argv) === '') { + array_pop($argv); + } + + return $argv; + } catch (Exception $ex) { + // If we fail to read "/proc", fall through to less reliable methods. + } + + // If we haven't found a better source, just split the "ps" output on + // spaces. + return preg_split('/\s+/', $command); + } +} diff --git a/src/filesystem/PhutilProcessRef.php b/src/filesystem/PhutilProcessRef.php new file mode 100644 index 00000000..dabc6483 --- /dev/null +++ b/src/filesystem/PhutilProcessRef.php @@ -0,0 +1,85 @@ +pid = $pid; + return $this; + } + + public function getPID() { + return $this->pid; + } + + public function getCommand() { + if (!$this->command) { + $this->command = phutil_string_cast(csprintf('%LR', $this->argv)); + } + + return $this->command; + } + + public function getIsOverseer() { + if ($this->isOverseer === null) { + $this->isOverseer = $this->getCommandMatch( + array( + array('phd-daemon'), + array('php', 'phd-daemon'), + )); + } + + return $this->isOverseer; + } + + public function setInstance($instance) { + $this->instance = $instance; + return $this; + } + + public function getInstance() { + return $this->instance; + } + + private function getCommandMatch(array $patterns) { + $argv = $this->getArgv(); + + foreach ($patterns as $pattern) { + $pattern = array_values($pattern); + $is_match = true; + for ($ii = 0; $ii < count($pattern); $ii++) { + if (!isset($argv[$ii])) { + $is_match = false; + break; + } + + if (basename($argv[$ii]) !== $pattern[$ii]) { + $is_match = false; + break; + } + } + + if ($is_match) { + return true; + } + } + + return false; + } + + public function setArgv(array $argv) { + $this->argv = $argv; + return $this; + } + + public function getArgv() { + return $this->argv; + } + +} diff --git a/src/filesystem/TempFile.php b/src/filesystem/TempFile.php new file mode 100644 index 00000000..895b7a2b --- /dev/null +++ b/src/filesystem/TempFile.php @@ -0,0 +1,116 @@ +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 index 00000000..d0a7459f --- /dev/null +++ b/src/filesystem/__tests__/FileFinderTestCase.php @@ -0,0 +1,243 @@ +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() { + if (phutil_is_windows()) { + // We can't write files with "\" since this is the path separator. + // We can't write files with "*" since Windows rejects them. + // This doesn't leave us too many interesting paths to test, so just + // skip this test case under Windows. + $this->assertSkipped( + pht( + 'Windows can not write files with sufficiently absurd names.')); + } + + // 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 index 00000000..a3aff733 --- /dev/null +++ b/src/filesystem/__tests__/FilesystemTestCase.php @@ -0,0 +1,222 @@ +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; + + // On Windows, paths will have backslashes rather than forward slashes. + // Normalize our expectations to the path format for the environment. + foreach ($expected as $key => $epath) { + $expected[$key] = str_replace('/', DIRECTORY_SEPARATOR, $epath); + } + + $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))); + } + } + + public function testRandomIntegers() { + $valid_ranges = array( + array(5, 5), + array(-1, 1), + array(0, 10000), + array(0, 999999999), + array(-65535, 65536), + ); + + foreach ($valid_ranges as $case) { + list($min, $max) = $case; + + $result = Filesystem::readRandomInteger($min, $max); + + $this->assertTrue($min <= $result, pht('%d <= %d', $min, $result)); + $this->assertTrue($max >= $result, pht('%d >= %d', $max, $result)); + } + + $invalid_ranges = array( + array('1', '2'), + array(1.0, 2.0), + array(5, 3), + ); + + foreach ($invalid_ranges as $case) { + list($min, $max) = $case; + + $caught = null; + try { + Filesystem::readRandomInteger($min, $max); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue($caught instanceof Exception); + } + } + +} diff --git a/src/filesystem/__tests__/PhutilDeferredLogTestCase.php b/src/filesystem/__tests__/PhutilDeferredLogTestCase.php new file mode 100644 index 00000000..1d129871 --- /dev/null +++ b/src/filesystem/__tests__/PhutilDeferredLogTestCase.php @@ -0,0 +1,147 @@ +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 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 index 00000000..6d91205f --- /dev/null +++ b/src/filesystem/__tests__/PhutilFileLockTestCase.php @@ -0,0 +1,190 @@ +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(/* ... */) { + $argv = func_get_args(); + $bin = $this->getSupportExecutable('lock'); + + if (phutil_is_windows()) { + $future = new ExecFuture('php -f %R -- %Ls', $bin, $argv); + } else { + // 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 -f %R -- %Ls', $bin, $argv); + } + + $future->start(); + + return $future; + } + +} diff --git a/src/filesystem/__tests__/PhutilProcessRefTestCase.php b/src/filesystem/__tests__/PhutilProcessRefTestCase.php new file mode 100644 index 00000000..1c542ee7 --- /dev/null +++ b/src/filesystem/__tests__/PhutilProcessRefTestCase.php @@ -0,0 +1,59 @@ +setArgv($argv); + + $actual = $ref->getIsOverseer(); + + $this->assertEqual( + $expect, + $actual, + pht('argv: %s', implode(' ', $argv))); + } + } + +} diff --git a/src/filesystem/__tests__/data/.hidden.txt b/src/filesystem/__tests__/data/.hidden.txt new file mode 100644 index 00000000..f414c299 --- /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 index 00000000..5c6507c7 --- /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 index 00000000..bce1946c --- /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 index 00000000..6e8ebc4f --- /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 index 00000000..2dbbec48 --- /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 index 00000000..2dbbec48 --- /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 index 00000000..bce1946c --- /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 index 00000000..bce1946c --- /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 index 00000000..bce1946c --- /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 index 00000000..bce1946c --- /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 index 00000000..3ab30909 --- /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 index 00000000..4c4cabd8 --- /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 index 00000000..608be001 --- /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 index 00000000..94496cdd --- /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 index 00000000..c54151f1 --- /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 index 00000000..e04c4074 --- /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 index 00000000..90d40737 --- /dev/null +++ b/src/filesystem/linesofalarge/__tests__/LinesOfALargeExecFutureTestCase.php @@ -0,0 +1,64 @@ +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) { + $bin = $this->getSupportExecutable('cat'); + $future = new ExecFuture('php -f %R', $bin); + + $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 index 00000000..94fcbb2a --- /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 index 00000000..7ac13258 --- /dev/null +++ b/src/future/Future.php @@ -0,0 +1,253 @@ +resolve()" is no longer '. + 'supported. Update the caller so it no longer passes a '. + 'timeout.')); + } + + if ($this->hasException()) { + throw $this->getException(); + } + + if (!$this->hasResult()) { + $graph = new FutureIterator(array($this)); + $graph->resolveAll(); + } + + return $this->getResult(); + } + + final public function startFuture() { + if ($this->hasStarted) { + throw new Exception( + pht( + 'Future has already started; futures can not start more '. + 'than once.')); + } + $this->hasStarted = true; + + $this->startServiceProfiler(); + $this->isReady(); + } + + final public function updateFuture() { + if ($this->hasException()) { + return; + } + + if ($this->hasResult()) { + return; + } + + try { + $this->isReady(); + } catch (Exception $ex) { + $this->setException($ex); + } catch (Throwable $ex) { + $this->setException($ex); + } + } + + final public function endFuture() { + if (!$this->hasException() && !$this->hasResult()) { + throw new Exception( + pht( + 'Trying to end a future which has no exception and no result. '. + 'Futures must resolve before they can be ended.')); + } + + if ($this->hasEnded) { + throw new Exception( + pht( + 'Future has already ended; futures can not end more '. + 'than once.')); + } + $this->hasEnded = true; + + $this->endServiceProfiler(); + } + + private function startServiceProfiler() { + + // NOTE: This is a soft dependency so that we don't need to build the + // ServiceProfiler into the Phage agent. Normally, this class is always + // available. + + if (!class_exists('PhutilServiceProfiler')) { + return; + } + + $params = $this->getServiceProfilerStartParameters(); + + $profiler = PhutilServiceProfiler::getInstance(); + $call_id = $profiler->beginServiceCall($params); + + $this->serviceProfilerCallID = $call_id; + } + + private function endServiceProfiler() { + $call_id = $this->serviceProfilerCallID; + if ($call_id === null) { + return; + } + + $params = $this->getServiceProfilerResultParameters(); + + $profiler = PhutilServiceProfiler::getInstance(); + $profiler->endServiceCall($call_id, $params); + } + + protected function getServiceProfilerStartParameters() { + return array(); + } + + protected function getServiceProfilerResultParameters() { + return array(); + } + + + /** + * 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(); + } + + + /** + * 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; + } + + /** + * Retrieve the final result of the future. + * + * @return wild Final resolution of this future. + */ + final protected function getResult() { + if (!$this->hasResult()) { + throw new Exception( + pht( + 'Future has not yet resolved. Resolve futures before retrieving '. + 'results.')); + } + + return $this->result; + } + + final protected function setResult($result) { + if ($this->hasResult()) { + throw new Exception( + pht( + 'Future has already resolved. Futures may not resolve more than '. + 'once.')); + } + + $this->hasResult = true; + $this->result = $result; + + return $this; + } + + final public function hasResult() { + return $this->hasResult; + } + + final private function setException($exception) { + // NOTE: The parameter may be an Exception or a Throwable. + $this->exception = $exception; + return $this; + } + + final private function getException() { + return $this->exception; + } + + final public function hasException() { + return ($this->exception !== null); + } + + final public function setFutureKey($key) { + if ($this->futureKey !== null) { + throw new Exception( + pht( + 'Future already has a key ("%s") assigned.', + $key)); + } + + $this->futureKey = $key; + + return $this; + } + + final public function getFutureKey() { + if ($this->futureKey === null) { + $this->futureKey = sprintf('Future/%d', self::$nextKey++); + } + + return $this->futureKey; + } + +} diff --git a/src/future/FutureIterator.php b/src/future/FutureIterator.php new file mode 100644 index 00000000..e33282c8 --- /dev/null +++ b/src/future/FutureIterator.php @@ -0,0 +1,464 @@ + 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 { + + private $hold = array(); + private $wait = array(); + private $work = array(); + + private $futures = array(); + private $key; + + private $limit; + + private $timeout; + private $isTimeout = false; + private $hasRewound = 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'); + + foreach ($futures as $map_key => $future) { + $future->setFutureKey($map_key); + $this->addFuture($future); + } + } + + + /** + * Block until all futures resolve. + * + * @return void + * @task basics + */ + public function resolveAll() { + // If a caller breaks out of a "foreach" and then calls "resolveAll()", + // interpret it to mean that we should iterate over whatever futures + // remain. + + if ($this->hasRewound) { + while ($this->valid()) { + $this->next(); + } + } else { + iterator_to_array($this); + } + } + + /** + * 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 = $future->getFutureKey(); + + if (isset($this->futures[$key])) { + throw new Exception( + pht( + 'This future graph already has a future with key "%s". Each '. + 'future must have a unique key.', + $key)); + } + + $this->futures[$key] = $future; + $this->hold[$key] = $key; + + 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; + } + + + public function setMaximumWorkingSetSize($limit) { + $this->limit = $limit; + return $this; + } + + public function getMaximumWorkingSetSize() { + return $this->limit; + } + +/* -( Iterator Interface )------------------------------------------------- */ + + + /** + * @task iterator + */ + public function rewind() { + if ($this->hasRewound) { + throw new Exception( + pht('Future graphs can not be rewound.')); + } + $this->hasRewound = true; + + $this->next(); + } + + /** + * @task iterator + */ + public function next() { + $this->key = null; + + $this->updateWorkingSet(); + + if (!$this->work) { + return; + } + + $start = microtime(true); + $timeout = $this->timeout; + $this->isTimeout = false; + + $working_set = array_select_keys($this->futures, $this->work); + + while (true) { + // Update every future first. This is a no-op on futures which have + // already resolved or failed, but we want to give futures an + // opportunity to make progress even if we can resolve something. + + foreach ($working_set as $future_key => $future) { + $future->updateFuture(); + } + + // Check if any future has resolved or failed. If we have any such + // futures, we'll return the first one from the iterator. + + $resolve_key = null; + foreach ($working_set as $future_key => $future) { + if ($future->hasException()) { + $resolve_key = $future_key; + break; + } + + if ($future->hasResult()) { + $resolve_key = $future_key; + break; + } + } + + // We've found a future to resolve, so we're done here for now. + + if ($resolve_key !== null) { + $this->moveFutureToDone($resolve_key); + return; + } + + // We don't have any futures to resolve yet. Check if we're reached + // an update interval. + + $wait_time = 1; + if ($timeout !== null) { + $elapsed = microtime(true) - $start; + + if ($elapsed > $timeout) { + $this->isTimeout = true; + return; + } + + $wait_time = min($wait_time, $timeout - $elapsed); + } + + // We're going to wait. If possible, we'd like to wait with sockets. + // If we can't, we'll just sleep. + + $read_sockets = array(); + $write_sockets = array(); + foreach ($working_set as $future_key => $future) { + $sockets = $future->getReadSockets(); + foreach ($sockets as $socket) { + $read_sockets[] = $socket; + } + + $sockets = $future->getWriteSockets(); + foreach ($sockets as $socket) { + $write_sockets[] = $socket; + } + } + + $use_sockets = ($read_sockets || $write_sockets); + if ($use_sockets) { + foreach ($working_set as $future) { + $wait_time = min($wait_time, $future->getDefaultWait()); + } + $this->waitForSockets($read_sockets, $write_sockets, $wait_time); + } else { + usleep(1000); + } + } + } + + /** + * @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 updateWorkingSet() { + $limit = $this->getMaximumWorkingSetSize(); + $work_count = count($this->work); + + // If we're already working on the maximum number of futures, we just have + // to wait for something to resolve. There's no benefit to updating the + // queue since we can never make any meaningful progress. + + if ($limit) { + if ($work_count >= $limit) { + return; + } + } + + // If any futures that are currently held are no longer blocked by + // dependencies, move them from "hold" to "wait". + + foreach ($this->hold as $future_key) { + if (!$this->canMoveFutureToWait($future_key)) { + continue; + } + + $this->moveFutureToWait($future_key); + } + + $wait_count = count($this->wait); + $hold_count = count($this->hold); + + if (!$work_count && !$wait_count && $hold_count) { + throw new Exception( + pht( + 'Future graph is stalled: some futures are held, but no futures '. + 'are waiting or working. The graph can never resolve.')); + } + + // Figure out how many futures we can start. If we don't have a limit, + // we can start every waiting future. If we do have a limit, we can only + // start as many futures as we have slots for. + + if ($limit) { + $work_limit = min($limit, $wait_count); + } else { + $work_limit = $wait_count; + } + + // If we're ready to start futures, start them now. + + if ($work_limit) { + foreach ($this->wait as $future_key) { + $this->moveFutureToWork($future_key); + + $work_limit--; + if (!$work_limit) { + return; + } + } + } + + } + + private function canMoveFutureToWait($future_key) { + return true; + } + + private function moveFutureToWait($future_key) { + unset($this->hold[$future_key]); + $this->wait[$future_key] = $future_key; + } + + private function moveFutureToWork($future_key) { + unset($this->wait[$future_key]); + $this->work[$future_key] = $future_key; + + $this->futures[$future_key]->startFuture(); + } + + private function moveFutureToDone($future_key) { + $this->key = $future_key; + unset($this->work[$future_key]); + + // Before we return, do another working set update so we start any + // futures that are ready to go as soon as we can. + + $this->updateWorkingSet(); + + $this->futures[$future_key]->endFuture(); + } + + /** + * 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 + */ + private function waitForSockets( + array $read_list, + array $write_list, + $timeout = 1.0) { + + static $handler_installed = false; + + if (!$handler_installed) { + // 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!')); + } + } + $handler_installed = 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. + } + + +} diff --git a/src/future/FuturePool.php b/src/future/FuturePool.php new file mode 100644 index 00000000..78dbe55d --- /dev/null +++ b/src/future/FuturePool.php @@ -0,0 +1,71 @@ +iteratorTemplate = new FutureIterator(array()); + } + + public function getIteratorTemplate() { + return $this->iteratorTemplate; + } + + public function addFuture(Future $future) { + $future_key = $future->getFutureKey(); + + if (!isset($this->futures[$future_key])) { + if (!$this->iterator) { + $this->iterator = clone $this->getIteratorTemplate(); + $this->shouldRewind = true; + } + + $iterator = $this->iterator; + $iterator->addFuture($future); + + $this->futures[$future_key] = $future; + } + + return $this; + } + + public function getFutures() { + return $this->futures; + } + + public function hasFutures() { + return (bool)$this->futures; + } + + public function resolve() { + $iterator = $this->iterator; + + if (!$iterator) { + return null; + } + + if ($this->shouldRewind) { + $iterator->rewind(); + $this->shouldRewind = false; + } else { + $iterator->next(); + } + + if ($iterator->valid()) { + $future_key = $iterator->key(); + if ($future_key !== null) { + unset($this->futures[$future_key]); + } + return $iterator->current(); + } else { + $this->iterator = null; + return null; + } + } + +} diff --git a/src/future/FutureProxy.php b/src/future/FutureProxy.php new file mode 100644 index 00000000..77c8c5bb --- /dev/null +++ b/src/future/FutureProxy.php @@ -0,0 +1,76 @@ +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() { + if ($this->hasResult()) { + return true; + } + + $proxied = $this->getProxiedFuture(); + + $is_ready = $proxied->isReady(); + + if ($proxied->hasResult()) { + $result = $proxied->getResult(); + $result = $this->didReceiveResult($result); + $this->setResult($result); + } + + return $is_ready; + } + + public function resolve() { + $this->getProxiedFuture()->resolve(); + $this->isReady(); + return $this->getResult(); + } + + public function getReadSockets() { + return $this->getProxiedFuture()->getReadSockets(); + } + + public function getWriteSockets() { + return $this->getProxiedFuture()->getWriteSockets(); + } + + public function start() { + $this->getProxiedFuture()->start(); + return $this; + } + + protected function getServiceProfilerStartParameters() { + return $this->getProxiedFuture()->getServiceProfilerStartParameters(); + } + + protected function getServiceProfilerResultParameters() { + return $this->getProxiedFuture()->getServiceProfilerResultParameters(); + } + + abstract protected function didReceiveResult($result); + +} diff --git a/src/future/ImmediateFuture.php b/src/future/ImmediateFuture.php new file mode 100644 index 00000000..b2dbc4a9 --- /dev/null +++ b/src/future/ImmediateFuture.php @@ -0,0 +1,17 @@ +setResult($result); + } + + public function isReady() { + return true; + } + +} diff --git a/src/future/__tests__/FutureIteratorTestCase.php b/src/future/__tests__/FutureIteratorTestCase.php new file mode 100644 index 00000000..6590583c --- /dev/null +++ b/src/future/__tests__/FutureIteratorTestCase.php @@ -0,0 +1,25 @@ +getSupportExecutable('cat'); + + $future1 = new ExecFuture('php -f %R', $bin); + $future2 = new ExecFuture('php -f %R', $bin); + + $iterator = new FutureIterator(array($future1)); + $iterator->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 index 00000000..32dfa217 --- /dev/null +++ b/src/future/asana/PhutilAsanaFuture.php @@ -0,0 +1,105 @@ +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; + } + + public function setTimeout($timeout) { + $this->timeout = $timeout; + return $this; + } + + public function getTimeout() { + return $this->timeout; + } + + 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); + + $timeout = $this->getTimeout(); + if ($timeout !== null) { + $future->setTimeout($timeout); + } + + $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 index 00000000..084b46fc --- /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 index 00000000..d8e02374 --- /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 index 00000000..19a56fa3 --- /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 index 00000000..7646c7b6 --- /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 index 00000000..16fd3632 --- /dev/null +++ b/src/future/aws/PhutilAWSFuture.php @@ -0,0 +1,170 @@ +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}/", $params)) + ->setPath($path); + + $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 index 00000000..de00a508 --- /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 index 00000000..86c322b8 --- /dev/null +++ b/src/future/aws/PhutilAWSv4Signature.php @@ -0,0 +1,265 @@ +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->getQueryParamsAsMap(); + + ksort($params); + $canonical_parameters = phutil_build_http_querystring($params); + + 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 index 00000000..2a589393 --- /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 index 00000000..b6b56b56 --- /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 index 00000000..b7f56617 --- /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 index 00000000..f2f1e8d6 --- /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 index 00000000..fab9af10 --- /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 index 00000000..35d32538 --- /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 index 00000000..199bf125 --- /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 index 00000000..a83b86b5 --- /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 index 00000000..48911930 --- /dev/null +++ b/src/future/exec/ExecFuture.php @@ -0,0 +1,984 @@ + array('pipe', 'r'), // stdin + 1 => array('pipe', 'w'), // stdout + 2 => array('pipe', 'w'), // stderr + ); + + protected function didConstruct() { + $this->stdin = new PhutilRope(); + } + +/* -( Command Information )------------------------------------------------ */ + + + /** + * 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; + } + + +/* -( 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. + * + * 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() { + $result = $this->resolve(); + return $this->raiseResultError($result); + } + + /** + * 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() { + list($stdout, $stderr) = $this->resolvex(); + if (strlen($stderr)) { + $cmd = $this->getCommand(); + 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->getCommand(); + 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->hasResult()) { + $signal = 9; + + if ($this->proc) { + proc_terminate($this->proc, $signal); + } + + $this->closeProcess(); + + $result = array( + 128 + $signal, + $this->stdout, + $this->stderr, + ); + + $this->recordResult($result); + } + + return $this->getResult(); + } + + private function recordResult(array $result) { + $resolve_on_error = $this->getResolveOnError(); + if (!$resolve_on_error) { + $result = $this->raiseResultError($result); + } + + $this->setResult($result); + } + + private function raiseResultError($result) { + list($err, $stdout, $stderr) = $result; + + if ($err) { + $cmd = $this->getCommand(); + + if ($this->getWasKilledByTimeout()) { + // NOTE: The timeout can be a float and PhutilNumber only handles + // integers, so just use "%s" to render it. + $message = pht( + 'Command killed by timeout after running for more than %s seconds.', + $this->terminateTimeout); + } else { + $message = pht('Command failed with error #%d!', $err); + } + + throw new CommandException( + $message, + $cmd, + $err, + $stdout, + $stderr); + } + + return array($stdout, $stderr); + } + + +/* -( 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 a soft dependencies on PhutilErrorTrap here, to avoid + // the need to build it into the Phage agent. Under normal circumstances, + // this class are always available. + + if (!$this->pipes) { + $is_windows = phutil_is_windows(); + + if (!$this->start) { + // We might already have started the timer via initiating resolution. + $this->start = microtime(true); + } + + $unmasked_command = $this->getCommand(); + $unmasked_command = $unmasked_command->getUnmaskedString(); + + $pipes = array(); + + 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 ($is_windows) { + $stdout_file = new TempFile(); + $stderr_file = new TempFile(); + + $stdout_handle = fopen($stdout_file, 'wb'); + if (!$stdout_handle) { + throw new Exception( + pht( + 'Unable to open stdout temporary file ("%s") for writing.', + $stdout_file)); + } + + $stderr_handle = fopen($stderr_file, 'wb'); + if (!$stderr_handle) { + throw new Exception( + pht( + 'Unable to open stderr temporary file ("%s") for writing.', + $stderr_file)); + } + + $spec = array( + 0 => self::$descriptorSpec[0], + 1 => $stdout_handle, + 2 => $stderr_handle, + ); + } + + $proc = @proc_open( + $unmasked_command, + $spec, + $pipes, + $cwd, + $env, + array( + 'bypass_shell' => true, + )); + + if ($trap) { + $err = $trap->getErrorsAsString(); + $trap->destroy(); + } else { + $err = error_get_last(); + if ($err) { + $err = $err['message']; + } + } + + if ($is_windows) { + fclose($stdout_handle); + fclose($stderr_handle); + } + + if (!is_resource($proc)) { + // When you run an invalid command on a Linux system, the "proc_open()" + // works and then the process (really a "/bin/sh -c ...") exits after + // it fails to resolve the command. + + // When you run an invalid command on a Windows system, we bypass the + // shell and the "proc_open()" itself fails. See also T13504. Fail the + // future immediately, acting as though it exited with an error code + // for consistency with Linux. + + $result = array( + 1, + '', + pht( + 'Call to "proc_open()" to open a subprocess failed: %s', + $err), + ); + + $this->recordResult($result); + + return true; + } + + if ($is_windows) { + $stdout_handle = fopen($stdout_file, 'rb'); + if (!$stdout_handle) { + throw new Exception( + pht( + 'Unable to open stdout temporary file ("%s") for reading.', + $stdout_file)); + } + + $stderr_handle = fopen($stderr_file, 'rb'); + if (!$stderr_handle) { + throw new Exception( + pht( + 'Unable to open stderr temporary file ("%s") for reading.', + $stderr_file)); + } + + $pipes = array( + 0 => $pipes[0], + 1 => $stdout_handle, + 2 => $stderr_handle, + ); + + $this->windowsStdoutTempFile = $stdout_file; + $this->windowsStderrTempFile = $stderr_file; + } + + $this->pipes = $pipes; + $this->proc = $proc; + + list($stdin, $stdout, $stderr) = $pipes; + + if (!$is_windows) { + + // On Windows, we redirect process standard output and standard error + // through temporary files. Files don't block, so we don't need to make + // these streams nonblocking. + + 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) { + $signal_info = null; + + // 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']) { + $signo = $status['termsig']; + + $err = 128 + $signo; + + $signal_info = pht( + "\n\n", + phutil_get_signal_name($signo), + $signo); + } + } + + $result = array( + $err, + $this->stdout, + $signal_info.$this->stderr, + ); + + $this->recordResult($result); + + $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; + + unset($this->windowsStdoutTempFile); + unset($this->windowsStderrTempFile); + } + + + /** + * 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; + } + } + } + + protected function getServiceProfilerStartParameters() { + return array( + 'type' => 'exec', + 'command' => phutil_string_cast($this->getCommand()), + ); + } + + protected function getServiceProfilerResultParameters() { + if ($this->hasResult()) { + $result = $this->getResult(); + $err = idx($result, 0); + } else { + $err = null; + } + + return array( + 'err' => $err, + ); + } + + +} diff --git a/src/future/exec/PhutilBacktraceSignalHandler.php b/src/future/exec/PhutilBacktraceSignalHandler.php new file mode 100644 index 00000000..131a54bc --- /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 index 00000000..2cde5472 --- /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 index 00000000..45675c8d --- /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 index 00000000..6dec0f2a --- /dev/null +++ b/src/future/exec/PhutilExecPassthru.php @@ -0,0 +1,129 @@ +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 { + + +/* -( Executing Passthru Commands )---------------------------------------- */ + + + /** + * Execute this command. + * + * @return int Error code returned by the subprocess. + * + * @task command + */ + public function execute() { + $command = $this->getCommand(); + + $spec = array(STDIN, STDOUT, STDERR); + $pipes = array(); + + $unmasked_command = $command->getUnmaskedString(); + + 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)) { + // See T13504. When "proc_open()" is given a command with a binary + // that isn't available on Windows with "bypass_shell", the function + // fails entirely. + if (phutil_is_windows()) { + $err = 1; + } else { + throw new Exception( + pht( + 'Failed to passthru %s: %s', + 'proc_open()', + $errors)); + } + } else { + $err = proc_close($proc); + } + + 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->hasResult()) { + $result = $this->execute(); + $this->setResult($result); + } + + return true; + } + + + + protected function getServiceProfilerStartParameters() { + return array( + 'type' => 'exec', + 'subtype' => 'passthru', + 'command' => phutil_string_cast($this->getCommand()), + ); + } + + protected function getServiceProfilerResultParameters() { + if ($this->hasResult()) { + $err = $this->getResult(); + } else { + $err = null; + } + + return array( + 'err' => $err, + ); + } + +} diff --git a/src/future/exec/PhutilExecutableFuture.php b/src/future/exec/PhutilExecutableFuture.php new file mode 100644 index 00000000..663ce567 --- /dev/null +++ b/src/future/exec/PhutilExecutableFuture.php @@ -0,0 +1,231 @@ +command = $pattern; + } else { + $this->command = call_user_func_array('csprintf', $args); + } + + $this->didConstruct(); + } + + protected function didConstruct() { + return; + } + + final public function setResolveOnError($resolve_on_error) { + $this->resolveOnError = $resolve_on_error; + return $this; + } + + final public function getResolveOnError() { + return $this->resolveOnError; + } + + final public function getCommand() { + return $this->command; + } + + /** + * Set environmental variables for the command. + * + * By default, variables are added to the environment of this process. You + * can optionally wipe the environment and pass only the specified values. + * + * // Env will have "X" and current env ("PATH", etc.) + * $exec->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 = phutil_string_cast($cwd); + + try { + Filesystem::assertExists($cwd); + } catch (FilesystemException $ex) { + throw new PhutilProxyException( + pht( + 'Unable to run a command in directory "%s".', + $cwd), + $ex); + } + + if (!is_dir($cwd)) { + throw new Exception( + pht( + 'Preparing to run a command in directory "%s", but that path is '. + 'not a directory.', + $cwd)); + } + + // Although you don't technically need read permission to "chdir()" into + // a directory, it is almost certainly a mistake to execute a subprocess + // in a CWD we can't read. Refuse to do this. If callers have some + // exceptionally clever scheme up their sleeves they can always have the + // subprocess "cd" or "chdir()" explicitly. + + if (!is_readable($cwd)) { + throw new Exception( + pht( + 'Preparing to run a command in directory "%s", but that directory '. + 'is not readable (the current process does not have "+r" '. + 'permission).', + $cwd)); + } + + + if (phutil_is_windows()) { + // Do nothing. On Windows, calling "is_executable(...)" on a directory + // always appears to return "false". Skip this check under Windows. + } else if (!is_executable($cwd)) { + throw new Exception( + pht( + 'Preparing to run a command in directory "%s", but that directory '. + 'is not executable (the current process does not have "+x" '. + 'permission).', + $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 index 00000000..d0ffb9db --- /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 index 00000000..690ccee0 --- /dev/null +++ b/src/future/exec/__tests__/ExecFutureTestCase.php @@ -0,0 +1,220 @@ +newCat() + ->write('') + ->resolvex(); + + $this->assertEqual('', $stdout); + } + + private function newCat() { + $bin = $this->getSupportExecutable('cat'); + return new ExecFuture('php -f %R', $bin); + } + + private function newSleep($duration) { + $bin = $this->getSupportExecutable('sleep'); + return new ExecFuture('php -f %R -- %s', $bin, $duration); + } + + public function testKeepPipe() { + // NOTE: This is mostly testing the semantics of $keep_pipe in write(). + + list($stdout) = $this->newCat() + ->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) = $this->newCat()->write($data)->resolvex(); + + $this->assertEqual($data, $stdout); + } + + public function testBufferLimit() { + $data = str_repeat('x', 1024 * 1024); + list($stdout) = $this->newCat() + ->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 + // resolution timeout, which are somewhat similar but not identical. + + $future = $this->newSleep(32000); + $future->setTimeout(32000); + + // We expect this to return in 0.01s. + $iterator = (new FutureIterator(array($future))) + ->setUpdateInterval(0.01); + foreach ($iterator as $resolved_result) { + $result = $resolved_result; + break; + } + $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); + $iterator->resolveAll(); + } + + public function testTerminateWithoutStart() { + // We never start this future, but it should be fine to kill a future from + // any state. + $future = $this->newSleep(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 = $this->newSleep(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[] = $this->newSleep(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. + $bin = $this->getSupportExecutable('echo'); + + $future = new ExecFuture('php -f %R -- quack', $bin); + $future->resolve(); + $future->resolvex(); + list($err) = $future->resolveKill(); + + $this->assertEqual(0, $err); + } + + public function testEscaping() { + $inputs = array( + 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', + '!@#$%^&*()-=_+`~,.<>/?[]{};\':"|', + '', + ' ', + 'x y', + '%PATH%', + '"', + '""', + 'a "b" c', + '\\', + '\\a', + 'a\\', + '\\a\\', + 'a\\a', + '\\\\', + '\\"', + ); + + $bin = $this->getSupportExecutable('echo'); + + foreach ($inputs as $input) { + if (!is_array($input)) { + $input = array($input); + } + + list($stdout) = execx( + 'php -f %R -- %Ls', + $bin, + $input); + + $stdout = explode("\n", $stdout); + $output = array(); + foreach ($stdout as $line) { + $output[] = stripcslashes($line); + } + + $this->assertEqual( + $input, + $output, + pht( + 'Arguments are preserved for input: %s', + implode(' ', $input))); + } + } + + public function testReadBuffering() { + $str_len_8 = 'abcdefgh'; + $str_len_4 = 'abcd'; + + // This is a write/read with no read buffer. + $future = $this->newCat(); + $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 = $this->newCat(); + $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 index 00000000..cba1b768 --- /dev/null +++ b/src/future/exec/__tests__/ExecPassthruTestCase.php @@ -0,0 +1,18 @@ +getSupportExecutable('exit'); + + $exec = new PhutilExecPassthru('php -f %R', $bin); + $err = $exec->execute(); + $this->assertEqual(0, $err); + } + +} diff --git a/src/future/exec/execx.php b/src/future/exec/execx.php new file mode 100644 index 00000000..bde37d29 --- /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 index 00000000..c6b23def --- /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 index 00000000..e379dadd --- /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 index 00000000..14562ebe --- /dev/null +++ b/src/future/http/BaseHTTPFuture.php @@ -0,0 +1,458 @@ +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; + private $disableContentDecoding; + +/* -( 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(phutil_build_http_querystring($data)); + } + + public function setDisableContentDecoding($disable_decoding) { + $this->disableContentDecoding = $disable_decoding; + return $this; + } + + public function getDisableContentDecoding() { + return $this->disableContentDecoding; + } + + +/* -( 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; + } + } + + if (!$this->getDisableContentDecoding()) { + $content_encoding = null; + foreach ($headers as $header) { + list($name, $value) = $header; + $name = phutil_utf8_strtolower($name); + if (!strcasecmp($name, 'Content-Encoding')) { + $content_encoding = $value; + break; + } + } + + switch ($content_encoding) { + case 'gzip': + $decoded_body = @gzdecode($body); + if ($decoded_body === false) { + return $this->buildMalformedResult($raw_response); + } + $body = $decoded_body; + 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 index 00000000..91dd709a --- /dev/null +++ b/src/future/http/HTTPFuture.php @@ -0,0 +1,303 @@ +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; + } + } + + 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->setResult( + $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->setResult( + $this->buildErrorResult( + HTTPFutureTransportResponseStatus::ERROR_TIMEOUT)); + } else if (!$this->stateConnected) { + $this->setResult( + $this->buildErrorResult( + HTTPFutureTransportResponseStatus::ERROR_CONNECTION_REFUSED)); + } else if (!$this->stateWriteComplete) { + $this->setResult( + $this->buildErrorResult( + HTTPFutureTransportResponseStatus::ERROR_CONNECTION_FAILED)); + } else { + $this->setResult($this->parseRawHTTPResponse($this->response)); + } + + 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 = phutil_build_http_querystring($data); + if (strpos($uri, '?') !== false) { + $uri .= '&'.$data; + } else { + $uri .= '?'.$data; + } + $data = ''; + } + } else { + if (is_array($data)) { + $data = phutil_build_http_querystring($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; + } + + protected function getServiceProfilerStartParameters() { + return array( + 'type' => 'http', + 'uri' => phutil_string_cast($this->getURI()), + ); + } + +} diff --git a/src/future/http/HTTPSFuture.php b/src/future/http/HTTPSFuture.php new file mode 100644 index 00000000..5b9dd7b0 --- /dev/null +++ b/src/future/http/HTTPSFuture.php @@ -0,0 +1,841 @@ +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; + } + } + + public function setDownloadPath($download_path) { + $this->downloadPath = $download_path; + + if (Filesystem::pathExists($download_path)) { + throw new Exception( + pht( + 'Specified download path "%s" already exists, refusing to '. + 'overwrite.')); + } + + return $this; + } + + public function setProgressSink(PhutilProgressSink $progress_sink) { + $this->progressSink = $progress_sink; + return $this; + } + + public function getProgressSink() { + return $this->progressSink; + } + + /** + * 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 ($this->hasResult()) { + return true; + } + + $uri = $this->getURI(); + $domain = id(new PhutilURI($uri))->getDomain(); + + $is_download = $this->isDownload(); + + // See T13396. For now, use the streaming response parser only if we're + // downloading the response to disk. + $use_streaming_parser = (bool)$is_download; + + if (!$this->handle) { + $uri_object = new PhutilURI($uri); + $proxy = PhutilHTTPEngineExtension::buildHTTPProxyURI($uri_object); + + // TODO: Currently, the "proxy" is not passed to the ServiceProfiler + // because of changes to how ServiceProfiler is integrated. It would + // be nice to pass it again. + + 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; + $saw_accept = false; + for ($ii = 0; $ii < count($headers); $ii++) { + list($name, $value) = $headers[$ii]; + $headers[$ii] = $name.': '.$value; + if (!strcasecmp($name, 'Expect')) { + $saw_expect = true; + } + if (!strcasecmp($name, 'Accept-Encoding')) { + $saw_accept = 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:'; + } + + if (!$saw_accept) { + if (!$use_streaming_parser) { + if ($this->canAcceptGzip()) { + $headers[] = 'Accept-Encoding: gzip'; + } + } + } + + 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('arcanist')); + $caroot = $caroot.'/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); + + // See T13391. Recent versions of cURL default to "HTTP/2" on some + // connections, but do not support HTTP/2 proxies. Until HTTP/2 + // stabilizes, force HTTP/1.1 explicitly. + curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + + if ($proxy) { + curl_setopt($curl, CURLOPT_PROXY, (string)$proxy); + } + + if ($is_download) { + $this->downloadHandle = @fopen($this->downloadPath, 'wb+'); + if (!$this->downloadHandle) { + throw new Exception( + pht( + 'Failed to open filesystem path "%s" for writing.', + $this->downloadPath)); + } + } + + if ($use_streaming_parser) { + $streaming_parser = id(new PhutilHTTPResponseParser()) + ->setFollowLocationHeaders($this->getFollowLocation()); + + if ($this->downloadHandle) { + $streaming_parser->setWriteHandle($this->downloadHandle); + } + + $progress_sink = $this->getProgressSink(); + if ($progress_sink) { + $streaming_parser->setProgressSink($progress_sink); + } + + $this->parser = $streaming_parser; + } + } 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->setResult(array($status, $body, $headers)); + } else if ($this->parser) { + $streaming_parser = $this->parser; + try { + $responses = $streaming_parser->getResponses(); + $final_response = last($responses); + $result = array( + $final_response->getStatus(), + $final_response->getBody(), + $final_response->getHeaders(), + ); + } catch (HTTPFutureParseResponseStatus $ex) { + $result = array($ex, null, array()); + } + + $this->setResult($result); + } 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->setResult($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; + } + + if ($is_download) { + if ($this->downloadHandle) { + fflush($this->downloadHandle); + fclose($this->downloadHandle); + $this->downloadHandle = null; + } + } + + $sink = $this->getProgressSink(); + if ($sink) { + $status = head($this->getResult()); + if ($status->isError()) { + $sink->didFailWork(); + } else { + $sink->didCompleteWork(); + } + } + + 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) { + if ($this->parser) { + $this->parser->readBytes($data); + } else { + $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() { + if ($this->isDownload()) { + throw new Exception( + pht( + 'You can not read the result buffer while streaming results '. + 'to disk: there is no in-memory buffer to read.')); + } + + if ($this->parser) { + throw new Exception( + pht( + 'Streaming reads are not currently supported by the streaming '. + 'parser.')); + } + + $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() { + if ($this->isDownload()) { + throw new Exception( + pht( + 'You can not discard the result buffer while streaming results '. + 'to disk: there is no in-memory buffer to discard.')); + } + + if ($this->parser) { + throw new Exception( + pht( + 'Buffer discards are not currently supported by the streaming '. + 'parser.')); + } + + $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 = phutil_build_http_querystring($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; + } + + private function isDownload() { + return ($this->downloadPath !== null); + } + + protected function getServiceProfilerStartParameters() { + return array( + 'type' => 'http', + 'uri' => phutil_string_cast($this->getURI()), + ); + } + + private function canAcceptGzip() { + return function_exists('gzdecode'); + } + +} diff --git a/src/future/http/PhutilHTTPEngineExtension.php b/src/future/http/PhutilHTTPEngineExtension.php new file mode 100644 index 00000000..6c1beb9f --- /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 index 00000000..50c61805 --- /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 index 00000000..d6e35f89 --- /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 index 00000000..09a0ff7b --- /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 index 00000000..5bf68f0d --- /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 index 00000000..76649c50 --- /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 index 00000000..084ae6f9 --- /dev/null +++ b/src/future/oauth/PhutilOAuth1Future.php @@ -0,0 +1,306 @@ +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 setTimeout($timeout) { + $this->timeout = $timeout; + return $this; + } + + public function getTimeout() { + return $this->timeout; + } + + 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->getQueryParamsAsMap() + + $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(); + + $timeout = $this->getTimeout(); + if ($timeout !== null) { + $future->setTimeout($timeout); + } + + $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->removeAllQueryParams(); + + $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 index 00000000..3ba41302 --- /dev/null +++ b/src/future/oauth/__tests__/PhutilOAuth1FutureTestCase.php @@ -0,0 +1,163 @@ +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() { + if (!function_exists('openssl_pkey_get_private')) { + $this->assertSkipped( + pht('Required "openssl" extension is not installed.')); + } + + // 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 index 00000000..8e5b46b5 --- /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 index 00000000..23c21f47 --- /dev/null +++ b/src/future/postmark/PhutilPostmarkFuture.php @@ -0,0 +1,100 @@ +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; + } + + public function setTimeout($timeout) { + $this->timeout = $timeout; + return $this; + } + + public function getTimeout() { + return $this->timeout; + } + + 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'); + + $timeout = $this->getTimeout(); + if ($timeout) { + $future->setTimeout($timeout); + } + + $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/slack/PhutilSlackFuture.php b/src/future/slack/PhutilSlackFuture.php new file mode 100644 index 00000000..7ae8b0b1 --- /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->replaceQueryParam('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 index 00000000..9dc06c34 --- /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->replaceQueryParam('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 index 00000000..e2ea8199 --- /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/hardpoint/ArcanistHardpoint.php b/src/hardpoint/ArcanistHardpoint.php new file mode 100644 index 00000000..46cb430d --- /dev/null +++ b/src/hardpoint/ArcanistHardpoint.php @@ -0,0 +1,32 @@ +hardpointKey = $hardpoint_key; + return $this; + } + + public function getHardpointKey() { + return $this->hardpointKey; + } + + abstract public function isVectorHardpoint(); + + public function mergeHardpointValues( + ArcanistHardpointObject $object, + $old, + $new) { + + throw new Exception( + pht( + 'Hardpoint ("%s", of type "%s") does not support merging '. + 'values.', + $this->getHardpointKey(), + get_class($this))); + } + +} diff --git a/src/hardpoint/ArcanistHardpointEngine.php b/src/hardpoint/ArcanistHardpointEngine.php new file mode 100644 index 00000000..ad15bcd5 --- /dev/null +++ b/src/hardpoint/ArcanistHardpointEngine.php @@ -0,0 +1,237 @@ +queries = $queries; + $this->queryHardpointMap = null; + + return $this; + } + + private function getQueriesForHardpoint($hardpoint) { + if ($this->queryHardpointMap === null) { + $map = array(); + + foreach ($this->queries as $query_key => $query) { + $query->setHardpointEngine($this); + + $hardpoints = $query->getHardpoints(); + + foreach ($hardpoints as $query_hardpoint) { + $map[$query_hardpoint][$query_key] = $query; + } + } + + $this->queryHardpointMap = $map; + } + + return idx($this->queryHardpointMap, $hardpoint, array()); + } + + public function requestHardpoints(array $objects, array $requests) { + assert_instances_of($objects, 'ArcanistHardpointObject'); + + $results = array(); + foreach ($requests as $request) { + $request = ArcanistHardpointRequest::newFromSpecification($request) + ->setEngine($this) + ->setObjects($objects); + + $this->requests[] = $request; + + $this->startRequest($request); + + $results[] = $request; + } + + return ArcanistHardpointRequestList::newFromRequests($results); + } + + private function startRequest(ArcanistHardpointRequest $request) { + $objects = $request->getObjects(); + $hardpoint = $request->getHardpoint(); + + $queries = $this->getQueriesForHardpoint($hardpoint); + + $load = array(); + foreach ($objects as $object_key => $object) { + if (!$object->hasHardpoint($hardpoint)) { + throw new Exception( + pht( + 'Object (with key "%s", of type "%s") has no hardpoint "%s". '. + 'Hardpoints on this object are: %s.', + $object_key, + phutil_describe_type($object), + $hardpoint, + $object->getHardpointList()->getHardpointListForDisplay())); + } + + // If the object already has the hardpoint attached, we don't have to + // do anything. Throw the object away. + + if ($object->hasAttachedHardpoint($hardpoint)) { + unset($objects[$object_key]); + continue; + } + + $any_query = false; + foreach ($queries as $query_key => $query) { + if (!$query->canLoadObject($object)) { + continue; + } + + $any_query = true; + $load[$query_key][$object_key] = $object; + } + + if (!$any_query) { + throw new Exception( + pht( + 'No query exists which can load hardpoint "%s" for object '. + '(with key "%s" of type "%s").', + $hardpoint, + $object_key, + phutil_describe_type($object))); + } + } + + if (!$objects) { + return; + } + + $any_object = head($objects); + $list = $object->getHardpointList(); + $definition = $list->getHardpointDefinition($any_object, $hardpoint); + + $is_vector = ($definition->isVectorHardpoint()); + + if ($is_vector) { + foreach ($objects as $object) { + $object->attachHardpoint($hardpoint, array()); + } + } + + $request->setHardpointDefinition($definition); + + foreach ($load as $query_key => $object_map) { + $query = id(clone $queries[$query_key]); + + $task = $request->newTask() + ->setQuery($query) + ->setObjects($object_map); + } + } + + public function waitForRequests(array $wait_requests) { + foreach ($wait_requests as $wait_key => $wait_request) { + if ($wait_request->getEngine() !== $this) { + throw new Exception( + pht( + 'Attempting to wait on a hardpoint request (with index "%s", for '. + 'hardpoint "%s") that is part of a different engine.', + $wait_key, + $wait_request->getHardpoint())); + } + } + + while (true) { + $any_progress = false; + foreach ($this->requests as $req_key => $request) { + $did_update = $request->updateTasks(); + if ($did_update) { + $any_progress = true; + } + } + + // If we made progress by directly executing requests, continue + // excuting them until we stop making progress. We want to queue all + // reachable futures before we wait on futures. + + if ($any_progress) { + continue; + } + + foreach ($this->requests as $request_key => $request) { + if ($request->isComplete()) { + unset($this->requests[$request_key]); + } + } + + if (!$this->requests) { + break; + } + + $resolved_key = $this->updateFutures(); + + if ($resolved_key === null) { + throw new Exception( + pht( + 'Hardpoint engine can not resolve: no request made progress '. + 'during the last update cycle and there are no futures '. + 'awaiting resolution.')); + } + } + } + + private function updateFutures() { + $iterator = $this->futureIterator; + + $is_rewind = false; + $wait_futures = $this->waitFutures; + if ($wait_futures) { + if (!$this->futureIterator) { + $iterator = new FutureIterator(array()); + foreach ($wait_futures as $wait_future) { + $iterator->addFuture($wait_future); + } + $is_rewind = true; + $this->futureIterator = $iterator; + } else { + foreach ($wait_futures as $wait_future) { + $iterator->addFuture($wait_future); + } + } + $this->waitFutures = array(); + } + + $resolved_key = null; + if ($iterator) { + if ($is_rewind) { + $iterator->rewind(); + } else { + $iterator->next(); + } + + if ($iterator->valid()) { + $resolved_key = $iterator->key(); + } else { + $this->futureIterator = null; + } + } + + return $resolved_key; + } + + public function addFutures(array $futures) { + assert_instances_of($futures, 'Future'); + $this->waitFutures += mpull($futures, null, 'getFutureKey'); + + // TODO: We could reasonably add these futures to the iterator + // immediately and start them here, instead of waiting. + + return $this; + } + +} diff --git a/src/hardpoint/ArcanistHardpointFutureList.php b/src/hardpoint/ArcanistHardpointFutureList.php new file mode 100644 index 00000000..76b112f6 --- /dev/null +++ b/src/hardpoint/ArcanistHardpointFutureList.php @@ -0,0 +1,31 @@ +futures = $futures; + + return $object; + } + + public function getFutures() { + return $this->futures; + } + + public function setSendResult($send_result) { + $this->sendResult = $send_result; + return $this; + } + + public function getSendResult() { + return $this->sendResult; + } + +} diff --git a/src/hardpoint/ArcanistHardpointList.php b/src/hardpoint/ArcanistHardpointList.php new file mode 100644 index 00000000..bc44bdde --- /dev/null +++ b/src/hardpoint/ArcanistHardpointList.php @@ -0,0 +1,125 @@ + $hardpoint) { + $key = $hardpoint->getHardpointKey(); + + if (!strlen($key)) { + throw new Exception( + pht( + 'Hardpoint (at index "%s") has no hardpoint key. Each hardpoint '. + 'must have a key that is unique among hardpoints on the object.', + $idx)); + } + + if (isset($map[$key])) { + throw new Exception( + pht( + 'Hardpoint (at index "%s") has the same key ("%s") as an earlier '. + 'hardpoint. Each hardpoint must have a key that is unique '. + 'among hardpoints on the object.')); + } + + $map[$key] = $hardpoint; + } + + $this->hardpoints = $map; + + return $this; + } + + public function hasHardpoint($object, $hardpoint) { + return isset($this->hardpoints[$hardpoint]); + } + + public function hasAttachedHardpoint($object, $hardpoint) { + return isset($this->attached[$hardpoint]); + } + + public function getHardpoints() { + return $this->hardpoints; + } + + public function getHardpointDefinition($object, $hardpoint) { + if (!$this->hasHardpoint($object, $hardpoint)) { + throw new Exception( + pht( + 'Hardpoint ("%s") is not registered on this object (of type "%s") '. + 'so the definition object does not exist. Hardpoints are: %s.', + $hardpoint, + phutil_describe_type($object), + $this->getHardpointListForDisplay())); + } + + return $this->hardpoints[$hardpoint]; + } + + public function getHardpoint($object, $hardpoint) { + if (!$this->hasHardpoint($object, $hardpoint)) { + throw new Exception( + pht( + 'Hardpoint ("%s") is not registered on this object (of type "%s"). '. + 'Hardpoints are: %s.', + $hardpoint, + phutil_describe_type($object), + $this->getHardpointListForDisplay())); + } + + if (!$this->hasAttachedHardpoint($object, $hardpoint)) { + throw new Exception( + pht( + 'Hardpoint data (for hardpoint "%s") is not attached.', + $hardpoint)); + } + + return $this->data[$hardpoint]; + } + + public function setHardpointValue($object, $hardpoint, $value) { + if (!$this->hasHardpoint($object, $hardpoint)) { + throw new Exception( + pht( + 'Hardpoint ("%s") is not registered on this object (of type "%s"). '. + 'Hardpoints are: %s.', + $hardpoint, + phutil_describe_type($object), + $this->getHardpointListforDisplay())); + } + + $this->attached[$hardpoint] = true; + $this->data[$hardpoint] = $value; + } + + public function attachHardpoint($object, $hardpoint, $value) { + if ($this->hasAttachedHardpoint($object, $hardpoint)) { + throw new Exception( + pht( + 'Hardpoint ("%s") already has attached data.', + $hardpoint)); + } + + $this->setHardpointValue($object, $hardpoint, $value); + } + + public function getHardpointListForDisplay() { + $list = array_keys($this->hardpoints); + + if ($list) { + sort($list); + return implode(', ', $list); + } + + return pht(''); + } + +} diff --git a/src/hardpoint/ArcanistHardpointObject.php b/src/hardpoint/ArcanistHardpointObject.php new file mode 100644 index 00000000..93a3bac9 --- /dev/null +++ b/src/hardpoint/ArcanistHardpointObject.php @@ -0,0 +1,99 @@ +getHardpointList()->getHardpoint( + $this, + $hardpoint); + } + + final public function attachHardpoint($hardpoint, $value) { + $this->getHardpointList()->attachHardpoint( + $this, + $hardpoint, + $value); + + return $this; + } + + final public function mergeHardpoint($hardpoint, $value) { + $hardpoint_list = $this->getHardpointList(); + $hardpoint_def = $hardpoint_list->getHardpointDefinition( + $this, + $hardpoint); + + $old_value = $this->getHardpoint($hardpoint); + $new_value = $hardpoint_def->mergeHardpointValues( + $this, + $old_value, + $value); + + $hardpoint_list->setHardpointValue( + $this, + $hardpoint, + $new_value); + + return $this; + } + + final public function hasHardpoint($hardpoint) { + return $this->getHardpointList()->hasHardpoint($this, $hardpoint); + } + + final public function hasAttachedHardpoint($hardpoint) { + return $this->getHardpointList()->hasAttachedHardpoint( + $this, + $hardpoint); + } + + protected function newHardpoints() { + return array(); + } + + final protected function newHardpoint($hardpoint_key) { + return id(new ArcanistScalarHardpoint()) + ->setHardpointKey($hardpoint_key); + } + + final protected function newVectorHardpoint($hardpoint_key) { + return id(new ArcanistVectorHardpoint()) + ->setHardpointKey($hardpoint_key); + } + + final protected function newTemplateHardpoint( + $hardpoint_key, + ArcanistHardpoint $template) { + + return id(clone $template) + ->setHardpointKey($hardpoint_key); + } + + + final public function getHardpointList() { + if ($this->hardpointList === null) { + $list = $this->newHardpointList(); + + // TODO: Cache the hardpoint list with the class name as a key? If so, + // it needs to be purged when the request cache is purged. + + $hardpoints = $this->newHardpoints(); + + // TODO: Verify the hardpoints list is structured properly. + + $list->setHardpoints($hardpoints); + + $this->hardpointList = $list; + } + + return $this->hardpointList; + } + + private function newHardpointList() { + return new ArcanistHardpointList(); + } + +} diff --git a/src/hardpoint/ArcanistHardpointQuery.php b/src/hardpoint/ArcanistHardpointQuery.php new file mode 100644 index 00000000..bcbbed74 --- /dev/null +++ b/src/hardpoint/ArcanistHardpointQuery.php @@ -0,0 +1,36 @@ +hardpointEngine = $engine; + return $this; + } + + final public function getHardpointEngine() { + return $this->hardpointEngine; + } + + abstract public function getHardpoints(); + abstract public function canLoadObject(ArcanistHardpointObject $object); + abstract public function loadHardpoint(array $objects, $hardpoint); + + final protected function yieldFuture(Future $future) { + return $this->yieldFutures(array($future)) + ->setSendResult(true); + } + + final protected function yieldFutures(array $futures) { + return ArcanistHardpointFutureList::newFromFutures($futures); + } + + final protected function yieldRequests(array $objects, $requests) { + $engine = $this->getHardpointEngine(); + $requests = $engine->requestHardpoints($objects, $requests); + return $requests; + } + +} diff --git a/src/hardpoint/ArcanistHardpointRequest.php b/src/hardpoint/ArcanistHardpointRequest.php new file mode 100644 index 00000000..d52e2428 --- /dev/null +++ b/src/hardpoint/ArcanistHardpointRequest.php @@ -0,0 +1,132 @@ +setHardpoint($spec); + } + + throw new Exception( + pht( + 'Unknown Hardpoint request specification (of type "%s").', + phutil_describe_type($spec))); + } + + public function setEngine(ArcanistHardpointEngine $engine) { + $this->engine = $engine; + return $this; + } + + public function getEngine() { + return $this->engine; + } + + public function setHardpoint($hardpoint) { + $this->hardpoint = $hardpoint; + return $this; + } + + public function getHardpoint() { + return $this->hardpoint; + } + + public function setObjects(array $objects) { + $this->objects = $objects; + return $this; + } + + public function getObjects() { + return $this->objects; + } + + public function newTask() { + $task = id(new ArcanistHardpointTask()) + ->setRequest($this); + + $this->tasks[] = $task; + $this->isComplete = false; + + return $task; + } + + public function isComplete() { + return $this->isComplete; + } + + public function getTasks() { + return $this->tasks; + } + + public function updateTasks() { + $any_progress = false; + + foreach ($this->tasks as $task) { + $did_update = $task->updateTask(); + if ($did_update) { + $any_progress = true; + } + } + + foreach ($this->tasks as $task_key => $task) { + if ($task->isComplete()) { + unset($this->tasks[$task_key]); + } + } + + if (!$this->tasks) { + + // TODO: We can skip or modify this check if the hardpoint is a vector + // hardpoint. + + $objects = $this->getObjects(); + $hardpoint = $this->getHardpoint(); + foreach ($objects as $object) { + if (!$object->hasAttachedHardpoint($hardpoint)) { + throw new Exception( + pht( + 'Unable to load hardpoint "%s" for object (of type "%s"). '. + 'All hardpoint query tasks resolved but none attached '. + 'a value to the hardpoint.', + $hardpoint, + phutil_describe_type($object))); + } + } + + // We may arrive here if a request is queued that can be satisfied + // immediately, most often because it requests hardpoints which are + // already attached. We don't have to do any work, so we have no tasks + // to update or complete and can complete the request immediately. + if (!$this->isComplete) { + $any_progress = true; + } + + $this->isComplete = true; + } + + return $any_progress; + } + + + public function setHardpointDefinition($hardpoint_definition) { + $this->hardpointDefinition = $hardpoint_definition; + return $this; + } + + public function getHardpointDefinition() { + return $this->hardpointDefinition; + } + +} diff --git a/src/hardpoint/ArcanistHardpointRequestList.php b/src/hardpoint/ArcanistHardpointRequestList.php new file mode 100644 index 00000000..e691fe12 --- /dev/null +++ b/src/hardpoint/ArcanistHardpointRequestList.php @@ -0,0 +1,21 @@ +requests = $requests; + + return $object; + } + + public function getRequests() { + return $this->requests; + } + +} diff --git a/src/hardpoint/ArcanistHardpointTask.php b/src/hardpoint/ArcanistHardpointTask.php new file mode 100644 index 00000000..e78e0737 --- /dev/null +++ b/src/hardpoint/ArcanistHardpointTask.php @@ -0,0 +1,268 @@ +request = $request; + return $this; + } + + public function getRequest() { + return $this->request; + } + + public function setQuery(ArcanistHardpointQuery $query) { + $this->query = $query; + return $this; + } + + public function getQuery() { + return $this->query; + } + + public function setObjects(array $objects) { + $this->objects = $objects; + return $this; + } + + public function getObjects() { + return $this->objects; + } + + public function isComplete() { + return $this->isComplete; + } + + public function updateTask() { + if ($this->isComplete()) { + return false; + } + + // If we're blocked by other requests, we have to wait for them to + // resolve. + if ($this->getBlockingRequests()) { + return false; + } + + // If we're blocked by futures, we have to wait for them to resolve. + if ($this->getBlockingFutures()) { + return false; + } + + $query = $this->getQuery(); + + // If we've previously produced a generator, iterate it. + + if ($this->generator) { + $generator = $this->generator; + + $has_send = false; + $send_value = null; + + // If our last iteration generated a single future and it was marked to + // be sent back to the generator, resolve the future (it should already + // be ready to resolve) and send the result. + + if ($this->sendFuture) { + $has_send = true; + $future = $this->sendFuture; + $this->sendFuture = null; + + $send_value = $future->resolve(); + } + + if ($has_send && !$this->hasRewound) { + throw new Exception( + pht( + 'Generator has never rewound, but has a value to send. This '. + 'is invalid.')); + } + + if (!$this->hasRewound) { + $this->hasRewound = true; + $generator->rewind(); + } else if ($has_send) { + $generator->send($send_value); + } else { + $generator->next(); + } + + $generator_result = null; + if ($generator->valid()) { + $result = $generator->current(); + + if ($result instanceof Future) { + $result = new ArcanistHardpointFutureList($result); + } + + if ($result instanceof ArcanistHardpointFutureList) { + $futures = $result->getFutures(); + $is_send = $result->getSendResult(); + + $this->getRequest()->getEngine()->addFutures($futures); + + foreach ($futures as $future) { + $this->blockingFutures[] = $future; + } + + if ($is_send) { + if (count($futures) === 1) { + $this->sendFuture = head($futures); + } else { + throw new Exception( + pht( + 'Hardpoint future list is marked to send results to the '. + 'generator, but the list does not have exactly one future '. + '(it has %s).', + phutil_count($futures))); + } + } + + return true; + } + + $is_request = ($result instanceof ArcanistHardpointRequest); + $is_request_list = ($result instanceof ArcanistHardpointRequestList); + if ($is_request || $is_request_list) { + if ($is_request) { + $request_list = array($result); + } else { + $request_list = $result->getRequests(); + } + + // TODO: Make sure these requests have already been added to the + // engine. + + foreach ($request_list as $blocking_request) { + $this->blockingRequests[] = $blocking_request; + } + + return true; + } + + if ($result instanceof ArcanistHardpointTaskResult) { + $generator_result = $result; + } else { + throw new Exception( + pht( + 'Hardpoint generator (for query "%s") yielded an unexpected '. + 'value (of type "%s").', + get_class($query), + phutil_describe_type($result))); + } + } + + $this->generator = null; + + if ($generator_result !== null) { + $result = $generator_result->getValue(); + } else { + $result = $generator->getReturn(); + + if ($result instanceof ArcanistHardpointTaskResult) { + throw new Exception( + pht( + 'Generator (for query "%s") returned an '. + '"ArcanistHardpointTaskResult" object, which is not a valid '. + 'thing to return from a generator.'. + "\n\n". + 'This almost always means the generator implementation has a '. + '"return $this->yield..." statement which should be '. + 'a "yield $this->yield..." instead.', + get_class($query))); + } + } + + $this->attachResult($result); + + return true; + } + + $objects = $this->getObjects(); + $hardpoint = $this->getRequest()->getHardpoint(); + + $result = $query->loadHardpoint($objects, $hardpoint); + if ($result instanceof Generator) { + $this->generator = $result; + $this->hasRewound = false; + + // If we produced a generator, we can attempt to iterate it immediately. + return $this->updateTask(); + } + + $this->attachResult($result); + + return true; + } + + public function getBlockingRequests() { + $blocking = array(); + + foreach ($this->blockingRequests as $key => $request) { + if (!$request->isComplete()) { + $blocking[$key] = $request; + } + } + + $this->blockingRequests = $blocking; + + return $blocking; + } + + public function getBlockingFutures() { + $blocking = array(); + + foreach ($this->blockingFutures as $key => $future) { + if (!$future->hasResult() && !$future->hasException()) { + $blocking[$key] = $future; + } + } + + $this->blockingFutures = $blocking; + + return $blocking; + } + + private function attachResult($result) { + $objects = $this->getObjects(); + $hardpoint = $this->getRequest()->getHardpoint(); + + $definition = $this->getRequest()->getHardpointDefinition(); + $is_vector = $definition->isVectorHardpoint(); + + foreach ($result as $object_key => $value) { + if (!isset($objects[$object_key])) { + throw new Exception( + pht( + 'Bad object key ("%s").', + $object_key)); + } + + $object = $objects[$object_key]; + + if ($is_vector) { + $object->mergeHardpoint($hardpoint, $value); + } else { + if (!$object->hasAttachedHardpoint($hardpoint)) { + $object->attachHardpoint($hardpoint, $value); + } + } + } + + $this->isComplete = true; + } + +} diff --git a/src/hardpoint/ArcanistHardpointTaskResult.php b/src/hardpoint/ArcanistHardpointTaskResult.php new file mode 100644 index 00000000..ca124ce9 --- /dev/null +++ b/src/hardpoint/ArcanistHardpointTaskResult.php @@ -0,0 +1,16 @@ +value = $value; + } + + public function getValue() { + return $this->value; + } + +} diff --git a/src/hardpoint/ArcanistObjectListHardpoint.php b/src/hardpoint/ArcanistObjectListHardpoint.php new file mode 100644 index 00000000..d7fd7701 --- /dev/null +++ b/src/hardpoint/ArcanistObjectListHardpoint.php @@ -0,0 +1,25 @@ +getPHID(); + if (!isset($old[$phid])) { + $old[$phid] = $item; + } + } + + return $old; + } + +} diff --git a/src/hardpoint/ArcanistScalarHardpoint.php b/src/hardpoint/ArcanistScalarHardpoint.php new file mode 100644 index 00000000..d9adbd0b --- /dev/null +++ b/src/hardpoint/ArcanistScalarHardpoint.php @@ -0,0 +1,10 @@ +setType('class') + ->setName($class_name) + ->selectAndLoadSymbols(); + + if (!$symbols) { + throw new PhutilMissingSymbolException( + $class_name, + 'class or interface', + sprintf( + 'The class or interface "%s" is not defined in the library '. + 'map of any loaded library.', + $class_name)); + } + } 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); + +PhutilBootloader::newLibrary('arcanist', dirname(dirname(__FILE__))); diff --git a/src/init/lib/PhutilBootloader.php b/src/init/lib/PhutilBootloader.php new file mode 100644 index 00000000..ab6bd587 --- /dev/null +++ b/src/init/lib/PhutilBootloader.php @@ -0,0 +1,336 @@ +registerLibrary($name, $path); + } + + public static function getInstance() { + if (!self::$instance) { + self::$instance = new PhutilBootloader(); + } + return self::$instance; + } + + private function __construct() { + // This method intentionally left blank. + } + + public function getClassTree() { + return $this->classTree; + } + + public function registerInMemoryLibrary($name, $map) { + $this->registeredLibraries[$name] = "memory:$name"; + $this->inMemoryMaps[$name] = $map; + + $this->getLibraryMap($name); + } + + public function registerLibrary($name, $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; + + // If we're loading libphutil itself, load the utility functions first so + // we can safely call functions like "id()" when handling errors. In + // particular, this improves error behavior when "utils.php" itself can + // not load. + if ($name === 'arcanist') { + $root = $this->getLibraryRoot('arcanist'); + $this->executeInclude($root.'/utils/utils.php'); + } + + // 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 loadLibrarySource($library, $source) { + $path = $this->getLibraryRoot($library).'/'.$source; + $this->executeInclude($path); + } + + public function loadLibrary($path) { + $this->executeInclude($path.'/__phutil_library_init__.php'); + } + + 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/init/lib/PhutilBootloaderException.php b/src/init/lib/PhutilBootloaderException.php new file mode 100644 index 00000000..e9a74166 --- /dev/null +++ b/src/init/lib/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/init/lib/PhutilMissingSymbolException.php b/src/init/lib/PhutilMissingSymbolException.php new file mode 100644 index 00000000..5b315a57 --- /dev/null +++ b/src/init/lib/PhutilMissingSymbolException.php @@ -0,0 +1,29 @@ +assertEqual('arcanist', phutil_get_current_library_name()); + } + +} diff --git a/src/init/lib/core.php b/src/init/lib/core.php new file mode 100644 index 00000000..c0b0a14f --- /dev/null +++ b/src/init/lib/core.php @@ -0,0 +1,10 @@ +registerLibrary($library, $path); +} + +function phutil_register_library_map(array $map) { + PhutilBootloader::getInstance()->registerLibraryMap($map); +} diff --git a/src/init/lib/moduleutils.php b/src/init/lib/moduleutils.php new file mode 100644 index 00000000..aba95f5b --- /dev/null +++ b/src/init/lib/moduleutils.php @@ -0,0 +1,53 @@ +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, + )); +} + +function phutil_load_library($path) { + PhutilBootloader::getInstance()->loadLibrary($path); +} diff --git a/src/inspector/ArcanistBrowseRefInspector.php b/src/inspector/ArcanistBrowseRefInspector.php new file mode 100644 index 00000000..21fa4b9b --- /dev/null +++ b/src/inspector/ArcanistBrowseRefInspector.php @@ -0,0 +1,22 @@ +setToken($argv[0]); + } + +} diff --git a/src/inspector/ArcanistRefInspector.php b/src/inspector/ArcanistRefInspector.php new file mode 100644 index 00000000..8115b12d --- /dev/null +++ b/src/inspector/ArcanistRefInspector.php @@ -0,0 +1,29 @@ +setAncestorClass(__CLASS__) + ->execute(); + + $results = array(); + + foreach ($base_inspectors as $base_inspector) { + foreach ($base_inspector->newInspectors() as $inspector) { + $results[] = $inspector; + } + } + + return mpull($results, null, 'getInspectFunctionName'); + } + +} diff --git a/src/inspector/ArcanistWorkingCopyStateRefInspector.php b/src/inspector/ArcanistWorkingCopyStateRefInspector.php new file mode 100644 index 00000000..a08a3265 --- /dev/null +++ b/src/inspector/ArcanistWorkingCopyStateRefInspector.php @@ -0,0 +1,26 @@ +setCommitHash($commit_hash); + + return id(new ArcanistWorkingCopyStateRef()) + ->setCommitRef($commit_ref); + } + +} diff --git a/src/internationalization/ArcanistUSEnglishTranslation.php b/src/internationalization/ArcanistUSEnglishTranslation.php index f8d01ee9..bfbc40c5 100644 --- a/src/internationalization/ArcanistUSEnglishTranslation.php +++ b/src/internationalization/ArcanistUSEnglishTranslation.php @@ -81,6 +81,11 @@ final class ArcanistUSEnglishTranslation extends PhutilTranslation { 'This commit will be landed:', 'These commits will be landed:', ), + + 'Updated %s librarie(s).' => array( + 'Updated library.', + 'Updated %s libraries.', + ), ); } diff --git a/src/internationalization/PhutilLocale.php b/src/internationalization/PhutilLocale.php new file mode 100644 index 00000000..3ef2524e --- /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 index 00000000..c906f88c --- /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 index 00000000..9f66afb0 --- /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 index 00000000..c2b0984a --- /dev/null +++ b/src/internationalization/PhutilTranslator.php @@ -0,0 +1,275 @@ +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; + } + + /** + * @phutil-external-symbol class PhutilSafeHTML + * @phutil-external-symbol class PhutilSafeHTMLProducerInterface + * @phutil-external-symbol function phutil_escape_html + * @phutil-external-symbol function phutil_safe_html + */ + 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 index 00000000..1027d2ed --- /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 index 00000000..953fcd23 --- /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 index 00000000..fed12b1d --- /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 index 00000000..50ddb311 --- /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 index 00000000..4a2e90cc --- /dev/null +++ b/src/internationalization/__tests__/PhutilTranslatorTestCase.php @@ -0,0 +1,200 @@ +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 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)); + } + } + } + + 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 index 00000000..8298d493 --- /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 index 00000000..e142130f --- /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 index 00000000..963940fa --- /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 index 00000000..e55d42bf --- /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 index 00000000..c7e703ea --- /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 index 00000000..ee10b4c5 --- /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 index 00000000..28dc3ea0 --- /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 index 00000000..eb7ada00 --- /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 index 00000000..1363fea8 --- /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 index 00000000..f704e48f --- /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 index 00000000..fbc082e9 --- /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', 'kt'), + 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 index 00000000..36cc897c --- /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 index 00000000..1d6ce3f6 --- /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 index 00000000..efcc9ac6 --- /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 index 00000000..d4e8c523 --- /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 index 00000000..c83c19d4 --- /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 index 00000000..0ebe88a8 --- /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 index 00000000..33dde736 --- /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 index 00000000..eeff827e --- /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 index 00000000..599f1933 --- /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 index 00000000..a701c8f0 --- /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 index 00000000..59067bcc --- /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 index 00000000..3ce2fabe --- /dev/null +++ b/src/lexer/__tests__/php/symbols.txt @@ -0,0 +1,8 @@ +enableAsyncLint = $enable_async_lint; - return $this; - } - - final public function getEnableAsyncLint() { - return $this->enableAsyncLint; - } - final public function loadData($path) { if (!isset($this->fileData[$path])) { $disk_path = $this->getFilePathOnDisk($path); diff --git a/src/lint/linter/ArcanistFutureLinter.php b/src/lint/linter/ArcanistFutureLinter.php index e9df8371..7fad5a55 100644 --- a/src/lint/linter/ArcanistFutureLinter.php +++ b/src/lint/linter/ArcanistFutureLinter.php @@ -15,7 +15,8 @@ abstract class ArcanistFutureLinter extends ArcanistLinter { $limit = $this->getFuturesLimit(); $this->futures = id(new FutureIterator(array()))->limit($limit); foreach ($this->buildFutures($paths) as $path => $future) { - $this->futures->addFuture($future, $path); + $future->setFutureKey($path); + $this->futures->addFuture($future); } } diff --git a/src/lint/linter/ArcanistPhutilLibraryLinter.php b/src/lint/linter/ArcanistPhutilLibraryLinter.php index 917c7938..7c71625f 100644 --- a/src/lint/linter/ArcanistPhutilLibraryLinter.php +++ b/src/lint/linter/ArcanistPhutilLibraryLinter.php @@ -179,7 +179,7 @@ final class ArcanistPhutilLibraryLinter extends ArcanistLinter { continue; } - $libphutil_root = dirname(phutil_get_library_root('phutil')); + $libphutil_root = dirname(phutil_get_library_root('arcanist')); $this->raiseLintInLibrary( $library, diff --git a/src/lint/linter/__tests__/ArcanistJSONLintLinterTestCase.php b/src/lint/linter/__tests__/ArcanistJSONLintLinterTestCase.php deleted file mode 100644 index a81935e5..00000000 --- a/src/lint/linter/__tests__/ArcanistJSONLintLinterTestCase.php +++ /dev/null @@ -1,10 +0,0 @@ -executeTestsInDirectory(dirname(__FILE__).'/jsonlint/'); - } - -} diff --git a/src/lint/linter/__tests__/ArcanistJSONLinterTestCase.php b/src/lint/linter/__tests__/ArcanistJSONLinterTestCase.php index 5f8c12d4..a221d906 100644 --- a/src/lint/linter/__tests__/ArcanistJSONLinterTestCase.php +++ b/src/lint/linter/__tests__/ArcanistJSONLinterTestCase.php @@ -3,7 +3,7 @@ final class ArcanistJSONLinterTestCase extends ArcanistLinterTestCase { public function testLinter() { - $this->executeTestsInDirectory(dirname(__FILE__).'/jsonlint/'); + $this->executeTestsInDirectory(dirname(__FILE__).'/json/'); } } diff --git a/src/lint/linter/__tests__/jsonlint/1.lint-test b/src/lint/linter/__tests__/json/1.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/1.lint-test rename to src/lint/linter/__tests__/json/1.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/10.lint-test b/src/lint/linter/__tests__/json/10.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/10.lint-test rename to src/lint/linter/__tests__/json/10.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/11.lint-test b/src/lint/linter/__tests__/json/11.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/11.lint-test rename to src/lint/linter/__tests__/json/11.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/12.lint-test b/src/lint/linter/__tests__/json/12.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/12.lint-test rename to src/lint/linter/__tests__/json/12.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/13.lint-test b/src/lint/linter/__tests__/json/13.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/13.lint-test rename to src/lint/linter/__tests__/json/13.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/14.lint-test b/src/lint/linter/__tests__/json/14.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/14.lint-test rename to src/lint/linter/__tests__/json/14.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/15.lint-test b/src/lint/linter/__tests__/json/15.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/15.lint-test rename to src/lint/linter/__tests__/json/15.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/16.lint-test b/src/lint/linter/__tests__/json/16.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/16.lint-test rename to src/lint/linter/__tests__/json/16.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/17.lint-test b/src/lint/linter/__tests__/json/17.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/17.lint-test rename to src/lint/linter/__tests__/json/17.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/19.lint-test b/src/lint/linter/__tests__/json/19.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/19.lint-test rename to src/lint/linter/__tests__/json/19.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/2.lint-test b/src/lint/linter/__tests__/json/2.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/2.lint-test rename to src/lint/linter/__tests__/json/2.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/20.lint-test b/src/lint/linter/__tests__/json/20.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/20.lint-test rename to src/lint/linter/__tests__/json/20.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/21.lint-test b/src/lint/linter/__tests__/json/21.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/21.lint-test rename to src/lint/linter/__tests__/json/21.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/22.lint-test b/src/lint/linter/__tests__/json/22.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/22.lint-test rename to src/lint/linter/__tests__/json/22.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/23.lint-test b/src/lint/linter/__tests__/json/23.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/23.lint-test rename to src/lint/linter/__tests__/json/23.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/24.lint-test b/src/lint/linter/__tests__/json/24.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/24.lint-test rename to src/lint/linter/__tests__/json/24.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/25.lint-test b/src/lint/linter/__tests__/json/25.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/25.lint-test rename to src/lint/linter/__tests__/json/25.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/26.lint-test b/src/lint/linter/__tests__/json/26.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/26.lint-test rename to src/lint/linter/__tests__/json/26.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/27.lint-test b/src/lint/linter/__tests__/json/27.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/27.lint-test rename to src/lint/linter/__tests__/json/27.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/28.lint-test b/src/lint/linter/__tests__/json/28.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/28.lint-test rename to src/lint/linter/__tests__/json/28.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/29.lint-test b/src/lint/linter/__tests__/json/29.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/29.lint-test rename to src/lint/linter/__tests__/json/29.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/3.lint-test b/src/lint/linter/__tests__/json/3.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/3.lint-test rename to src/lint/linter/__tests__/json/3.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/30.lint-test b/src/lint/linter/__tests__/json/30.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/30.lint-test rename to src/lint/linter/__tests__/json/30.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/31.lint-test b/src/lint/linter/__tests__/json/31.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/31.lint-test rename to src/lint/linter/__tests__/json/31.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/32.lint-test b/src/lint/linter/__tests__/json/32.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/32.lint-test rename to src/lint/linter/__tests__/json/32.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/33.lint-test b/src/lint/linter/__tests__/json/33.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/33.lint-test rename to src/lint/linter/__tests__/json/33.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/34.lint-test b/src/lint/linter/__tests__/json/34.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/34.lint-test rename to src/lint/linter/__tests__/json/34.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/4.lint-test b/src/lint/linter/__tests__/json/4.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/4.lint-test rename to src/lint/linter/__tests__/json/4.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/5.lint-test b/src/lint/linter/__tests__/json/5.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/5.lint-test rename to src/lint/linter/__tests__/json/5.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/6.lint-test b/src/lint/linter/__tests__/json/6.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/6.lint-test rename to src/lint/linter/__tests__/json/6.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/7.lint-test b/src/lint/linter/__tests__/json/7.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/7.lint-test rename to src/lint/linter/__tests__/json/7.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/8.lint-test b/src/lint/linter/__tests__/json/8.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/8.lint-test rename to src/lint/linter/__tests__/json/8.lint-test diff --git a/src/lint/linter/__tests__/jsonlint/9.lint-test b/src/lint/linter/__tests__/json/9.lint-test similarity index 100% rename from src/lint/linter/__tests__/jsonlint/9.lint-test rename to src/lint/linter/__tests__/json/9.lint-test diff --git a/src/lint/linter/xhpast/rules/ArcanistClassNameLiteralXHPASTLinterRule.php b/src/lint/linter/xhpast/rules/ArcanistClassNameLiteralXHPASTLinterRule.php index 288fc05c..6d9da91b 100644 --- a/src/lint/linter/xhpast/rules/ArcanistClassNameLiteralXHPASTLinterRule.php +++ b/src/lint/linter/xhpast/rules/ArcanistClassNameLiteralXHPASTLinterRule.php @@ -34,7 +34,20 @@ final class ArcanistClassNameLiteralXHPASTLinterRule $replacement = '__CLASS__'; } - $regex = '/\b'.preg_quote($class_name, '/').'\b/'; + // NOTE: We're only warning when the entire string content is the + // class name. It's okay to hard-code the class name as part of a + // longer string, like an error or exception message. + + // Sometimes the class name (like "Filesystem") is also a valid part + // of the message, which makes this warning a false positive. + + // Even when we're generating a true positive by detecting a class + // name in part of a longer string, the cost of an error message + // being out-of-date is generally very small (mild confusion, but + // no incorrect beahavior) and using "__CLASS__" in errors is often + // clunky. + + $regex = '(^'.preg_quote($class_name).'$)'; if (!preg_match($regex, $contents)) { continue; } @@ -42,8 +55,7 @@ final class ArcanistClassNameLiteralXHPASTLinterRule $this->raiseLintAtNode( $string, pht( - "Don't hard-code class names, use `%s` instead.", - '__CLASS__'), + 'Prefer "__CLASS__" over hard-coded class names.'), $replacement); } } diff --git a/src/lint/linter/xhpast/rules/ArcanistImplodeArgumentOrderXHPASTLinterRule.php b/src/lint/linter/xhpast/rules/ArcanistImplodeArgumentOrderXHPASTLinterRule.php index db881813..1abb9396 100644 --- a/src/lint/linter/xhpast/rules/ArcanistImplodeArgumentOrderXHPASTLinterRule.php +++ b/src/lint/linter/xhpast/rules/ArcanistImplodeArgumentOrderXHPASTLinterRule.php @@ -23,7 +23,17 @@ final class ArcanistImplodeArgumentOrderXHPASTLinterRule } $parameter = $parameters->getChildByIndex(1); - if (!$parameter->isStaticScalar()) { + + // If the value is a static scalar, like a string literal, it's probably + // the glue. + $is_scalar = $parameter->isStaticScalar(); + + // If the value is a constant, like "DIRECTORY_SEPARATOR", it's probably + // the glue. + $is_constant = ($parameter->getTypeName() === 'n_SYMBOL_NAME'); + + $looks_like_glue = ($is_scalar || $is_constant); + if (!$looks_like_glue) { continue; } diff --git a/src/lint/linter/xhpast/rules/ArcanistPHPCompatibilityXHPASTLinterRule.php b/src/lint/linter/xhpast/rules/ArcanistPHPCompatibilityXHPASTLinterRule.php index f3dd662e..743d1484 100644 --- a/src/lint/linter/xhpast/rules/ArcanistPHPCompatibilityXHPASTLinterRule.php +++ b/src/lint/linter/xhpast/rules/ArcanistPHPCompatibilityXHPASTLinterRule.php @@ -17,8 +17,8 @@ final class ArcanistPHPCompatibilityXHPASTLinterRule } if ($compat_info === null) { - $target = phutil_get_library_root('phutil'). - '/../resources/php_compat_info.json'; + $target = phutil_get_library_root('arcanist'). + '/../resources/php/symbol-information.json'; $compat_info = phutil_json_decode(Filesystem::readFile($target)); } diff --git a/src/lint/linter/xhpast/rules/ArcanistPregQuoteMisuseXHPASTLinterRule.php b/src/lint/linter/xhpast/rules/ArcanistPregQuoteMisuseXHPASTLinterRule.php deleted file mode 100644 index de5b522f..00000000 --- a/src/lint/linter/xhpast/rules/ArcanistPregQuoteMisuseXHPASTLinterRule.php +++ /dev/null @@ -1,42 +0,0 @@ -getFunctionCalls($root, array('preg_quote')); - - foreach ($function_calls as $call) { - $parameter_list = $call->getChildOfType(1, 'n_CALL_PARAMETER_LIST'); - if (count($parameter_list->getChildren()) !== 2) { - $this->raiseLintAtNode( - $call, - pht( - 'If you use pattern delimiters that require escaping '. - '(such as `%s`, but not `%s`) then you should pass two '. - 'arguments to %s, so that %s knows which delimiter to escape.', - '//', - '()', - 'preg_quote', - 'preg_quote')); - } - } - } - -} diff --git a/src/lint/linter/xhpast/rules/__tests__/ArcanistPregQuoteMisuseXHPASTLinterRuleTestCase.php b/src/lint/linter/xhpast/rules/__tests__/ArcanistPregQuoteMisuseXHPASTLinterRuleTestCase.php deleted file mode 100644 index 47838fdd..00000000 --- a/src/lint/linter/xhpast/rules/__tests__/ArcanistPregQuoteMisuseXHPASTLinterRuleTestCase.php +++ /dev/null @@ -1,10 +0,0 @@ -executeTestsInDirectory(dirname(__FILE__).'/preg_quote-misuse/'); - } - -} diff --git a/src/lint/linter/xhpast/rules/__tests__/ArcanistXHPASTLinterRuleTestCase.php b/src/lint/linter/xhpast/rules/__tests__/ArcanistXHPASTLinterRuleTestCase.php index faf349bf..da3590c4 100644 --- a/src/lint/linter/xhpast/rules/__tests__/ArcanistXHPASTLinterRuleTestCase.php +++ b/src/lint/linter/xhpast/rules/__tests__/ArcanistXHPASTLinterRuleTestCase.php @@ -29,6 +29,8 @@ abstract class ArcanistXHPASTLinterRuleTestCase * @return ArcanistXHPASTLinterRule */ protected function getLinterRule() { + $this->assertExecutable('xhpast'); + $class = get_class($this); $matches = null; diff --git a/src/lint/linter/xhpast/rules/__tests__/class-name-literal/class-name-literal.lint-test b/src/lint/linter/xhpast/rules/__tests__/class-name-literal/class-name-literal.lint-test index 66bd140b..0182d151 100644 --- a/src/lint/linter/xhpast/rules/__tests__/class-name-literal/class-name-literal.lint-test +++ b/src/lint/linter/xhpast/rules/__tests__/class-name-literal/class-name-literal.lint-test @@ -6,10 +6,15 @@ class MyClass { } public function someOtherMethod() { - $x = 'MyClass is awesome'; + $x = 'MyClass'; $y = 'MyClassIsAwesome'; + $z = 'MyClass is awesome'; return __CLASS__; } + + public function throwAnException() { + throw new Exception('MyClass is throwing an exception!'); + } } $c = new class { @@ -29,10 +34,15 @@ class MyClass { } public function someOtherMethod() { - $x = 'MyClass is awesome'; + $x = __CLASS__; $y = 'MyClassIsAwesome'; + $z = 'MyClass is awesome'; return __CLASS__; } + + public function throwAnException() { + throw new Exception('MyClass is throwing an exception!'); + } } $c = new class { diff --git a/src/lint/linter/xhpast/rules/__tests__/implode-argument-order/implode.lint-test b/src/lint/linter/xhpast/rules/__tests__/implode-argument-order/implode.lint-test index 18995143..d2e6a655 100644 --- a/src/lint/linter/xhpast/rules/__tests__/implode-argument-order/implode.lint-test +++ b/src/lint/linter/xhpast/rules/__tests__/implode-argument-order/implode.lint-test @@ -14,5 +14,10 @@ implode(); implode($x); implode($x, $y, $z); +// This should raise a warning by guessing that "DIRECTORY_SEPARATOR" is +// glue. +implode($path_list, DIRECTORY_SEPARATOR); + ~~~~~~~~~~ error:7:1:XHP129:Implode With Glue First +error:19:1:XHP129:Implode With Glue First diff --git a/src/lint/linter/xhpast/rules/__tests__/preg_quote-misuse/preg_quote-misuse.lint-test b/src/lint/linter/xhpast/rules/__tests__/preg_quote-misuse/preg_quote-misuse.lint-test deleted file mode 100644 index 4df4f718..00000000 --- a/src/lint/linter/xhpast/rules/__tests__/preg_quote-misuse/preg_quote-misuse.lint-test +++ /dev/null @@ -1,11 +0,0 @@ -writer = new XMLWriter(); - $this->writer->openMemory(); - $this->writer->setIndent(true); - $this->writer->setIndentString(' '); + private function getWriter() { + if (!$this->writer) { + $xml_extension = 'XMLWriter'; + + if (!extension_loaded($xml_extension)) { + throw new Exception( + pht( + 'Lint can not be output into "%s" format because the PHP "%s" '. + 'extension is not installed. Install the extension or choose a '. + 'different output format.', + self::RENDERERKEY, + $xml_extension)); + } + + $writer = new XMLWriter(); + $writer->openMemory(); + $writer->setIndent(true); + $writer->setIndentString(' '); + + $this->writer = $writer; + } + + return $this->writer; } - public function renderPreamble() { - $this->writer->startDocument('1.0', 'UTF-8'); - $this->writer->startElement('checkstyle'); - $this->writer->writeAttribute('version', '4.3'); - return $this->writer->flush(); + public function willRenderResults() { + $writer = $this->getWriter(); + + $writer->startDocument('1.0', 'UTF-8'); + $writer->startElement('checkstyle'); + $writer->writeAttribute('version', '4.3'); + $this->writeOut($writer->flush()); } public function renderLintResult(ArcanistLintResult $result) { - $this->writer->startElement('file'); - $this->writer->writeAttribute('name', $result->getPath()); + $writer = $this->getWriter(); + + $writer->startElement('file'); + $writer->writeAttribute('name', $result->getPath()); foreach ($result->getMessages() as $message) { - $this->writer->startElement('error'); + $writer->startElement('error'); - $this->writer->writeAttribute('line', $message->getLine()); - $this->writer->writeAttribute('column', $message->getChar()); - $this->writer->writeAttribute('severity', + $writer->writeAttribute('line', $message->getLine()); + $writer->writeAttribute('column', $message->getChar()); + $writer->writeAttribute('severity', $this->getStringForSeverity($message->getSeverity())); - $this->writer->writeAttribute('message', $message->getDescription()); - $this->writer->writeAttribute('source', $message->getCode()); + $writer->writeAttribute('message', $message->getDescription()); + $writer->writeAttribute('source', $message->getCode()); - $this->writer->endElement(); + $writer->endElement(); } - $this->writer->endElement(); - return $this->writer->flush(); + $writer->endElement(); + $this->writeOut($writer->flush()); } - public function renderOkayResult() { - return ''; - } + public function didRenderResults() { + $writer = $this->getWriter(); - public function renderPostamble() { - $this->writer->endElement(); - $this->writer->endDocument(); - return $this->writer->flush(); + $writer->endElement(); + $writer->endDocument(); + $this->writeOut($writer->flush()); } private function getStringForSeverity($severity) { diff --git a/src/lint/renderer/ArcanistCompilerLintRenderer.php b/src/lint/renderer/ArcanistCompilerLintRenderer.php index 264750b1..947274d4 100644 --- a/src/lint/renderer/ArcanistCompilerLintRenderer.php +++ b/src/lint/renderer/ArcanistCompilerLintRenderer.php @@ -1,10 +1,9 @@ getMessages(); @@ -25,11 +24,7 @@ final class ArcanistCompilerLintRenderer extends ArcanistLintRenderer { $description); } - return implode('', $lines); - } - - public function renderOkayResult() { - return ''; + $this->writeOut(implode('', $lines)); } } diff --git a/src/lint/renderer/ArcanistConsoleLintRenderer.php b/src/lint/renderer/ArcanistConsoleLintRenderer.php index 4862f47f..5b99e7c5 100644 --- a/src/lint/renderer/ArcanistConsoleLintRenderer.php +++ b/src/lint/renderer/ArcanistConsoleLintRenderer.php @@ -1,17 +1,10 @@ showAutofixPatches = $show_autofix_patches; - return $this; - } + private $testableMode; public function setTestableMode($testable_mode) { $this->testableMode = $testable_mode; @@ -22,6 +15,38 @@ final class ArcanistConsoleLintRenderer extends ArcanistLintRenderer { return $this->testableMode; } + public function supportsPatching() { + return true; + } + + public function renderResultCode($result_code) { + if ($result_code == ArcanistLintWorkflow::RESULT_OKAY) { + $view = new PhutilConsoleInfo( + pht('OKAY'), + pht('No lint messages.')); + $this->writeOut($view->drawConsoleString()); + } + } + + public function promptForPatch( + ArcanistLintResult $result, + $old_path, + $new_path) { + + if ($old_path === null) { + $old_path = '/dev/null'; + } + + list($err, $stdout) = exec_manual('diff -u %s %s', $old_path, $new_path); + $this->writeOut($stdout); + + $prompt = pht( + 'Apply this patch to %s?', + tsprintf('__%s__', $result->getPath())); + + return phutil_console_confirm($prompt, $default_no = false); + } + public function renderLintResult(ArcanistLintResult $result) { $messages = $result->getMessages(); $path = $result->getPath(); @@ -31,10 +56,6 @@ final class ArcanistConsoleLintRenderer extends ArcanistLintRenderer { $text = array(); foreach ($messages as $message) { - if (!$this->showAutofixPatches && $message->isAutofix()) { - continue; - } - if ($message->isError()) { $color = 'red'; } else { @@ -77,9 +98,7 @@ final class ArcanistConsoleLintRenderer extends ArcanistLintRenderer { pht( 'Lint for %s:', phutil_console_format('__%s__', $path))); - return $prefix.implode("\n", $text); - } else { - return null; + $this->writeOut($prefix.implode("\n", $text)); } } @@ -288,13 +307,6 @@ final class ArcanistConsoleLintRenderer extends ArcanistLintRenderer { $data); } - public function renderOkayResult() { - return phutil_console_format( - "** %s ** %s\n", - pht('OKAY'), - pht('No lint warnings.')); - } - private function newOffsetMap($data) { $lines = phutil_split_lines($data); diff --git a/src/lint/renderer/ArcanistJSONLintRenderer.php b/src/lint/renderer/ArcanistJSONLintRenderer.php index 04432344..034ade8d 100644 --- a/src/lint/renderer/ArcanistJSONLintRenderer.php +++ b/src/lint/renderer/ArcanistJSONLintRenderer.php @@ -1,10 +1,9 @@ writeOut(json_encode($output)."\n"); } } diff --git a/src/lint/renderer/ArcanistLintRenderer.php b/src/lint/renderer/ArcanistLintRenderer.php index f153967d..1999fa6f 100644 --- a/src/lint/renderer/ArcanistLintRenderer.php +++ b/src/lint/renderer/ArcanistLintRenderer.php @@ -1,19 +1,61 @@ getPhobjectClassConstant('RENDERERKEY'); + } + + final public static function getAllRenderers() { + return id(new PhutilClassMapQuery()) + ->setAncestorClass(__CLASS__) + ->setUniqueMethod('getRendererKey') + ->execute(); + } + + final public function setOutputPath($path) { + $this->output = $path; + return $this; + } + + + /** + * Does this renderer support applying lint patches? + * + * @return bool True if patches should be applied when using this renderer. + */ + public function supportsPatching() { + return false; + } + + public function willRenderResults() { + return null; + } + + public function didRenderResults() { + return null; + } + + public function renderResultCode($result_code) { + return null; + } + + public function handleException(Exception $ex) { + throw $ex; } abstract public function renderLintResult(ArcanistLintResult $result); - abstract public function renderOkayResult(); - public function renderPostamble() { - return ''; + protected function writeOut($message) { + if ($this->output) { + Filesystem::appendFile($this->output, $message); + } else { + echo $message; + } + + return $this; } } diff --git a/src/lint/renderer/ArcanistNoneLintRenderer.php b/src/lint/renderer/ArcanistNoneLintRenderer.php index ce74e395..c28e2cb0 100644 --- a/src/lint/renderer/ArcanistNoneLintRenderer.php +++ b/src/lint/renderer/ArcanistNoneLintRenderer.php @@ -2,12 +2,10 @@ final class ArcanistNoneLintRenderer extends ArcanistLintRenderer { - public function renderLintResult(ArcanistLintResult $result) { - return ''; - } + const RENDERERKEY = 'none'; - public function renderOkayResult() { - return ''; + public function renderLintResult(ArcanistLintResult $result) { + return null; } } diff --git a/src/lint/renderer/ArcanistSummaryLintRenderer.php b/src/lint/renderer/ArcanistSummaryLintRenderer.php index 92eed3a4..22c6aba0 100644 --- a/src/lint/renderer/ArcanistSummaryLintRenderer.php +++ b/src/lint/renderer/ArcanistSummaryLintRenderer.php @@ -1,10 +1,9 @@ getMessages(); $path = $result->getPath(); @@ -19,14 +18,16 @@ final class ArcanistSummaryLintRenderer extends ArcanistLintRenderer { $text[] = "{$path}:{$line}:{$severity}: {$name}\n"; } - return implode('', $text); + $this->writeOut(implode('', $text)); } - public function renderOkayResult() { - return phutil_console_format( - "** %s ** %s\n", - pht('OKAY'), - pht('No lint warnings.')); + public function renderResultCode($result_code) { + if ($result_code == ArcanistLintWorkflow::RESULT_OKAY) { + $view = new PhutilConsoleInfo( + pht('OKAY'), + pht('No lint messages.')); + $this->writeOut($view->drawConsoleString()); + } } } diff --git a/src/lint/renderer/__tests__/ArcanistConsoleLintRendererTestCase.php b/src/lint/renderer/__tests__/ArcanistConsoleLintRendererTestCase.php index f65e40c9..98149a58 100644 --- a/src/lint/renderer/__tests__/ArcanistConsoleLintRendererTestCase.php +++ b/src/lint/renderer/__tests__/ArcanistConsoleLintRendererTestCase.php @@ -205,7 +205,13 @@ EOTEXT; try { PhutilConsoleFormatter::disableANSI(true); - $actual = $renderer->renderLintResult($result); + + $tmp = new TempFile(); + $renderer->setOutputPath($tmp); + $renderer->renderLintResult($result); + $actual = Filesystem::readFile($tmp); + unset($tmp); + PhutilConsoleFormatter::disableANSI(false); } catch (Exception $ex) { PhutilConsoleFormatter::disableANSI(false); diff --git a/src/log/ArcanistLogEngine.php b/src/log/ArcanistLogEngine.php new file mode 100644 index 00000000..11f6918b --- /dev/null +++ b/src/log/ArcanistLogEngine.php @@ -0,0 +1,105 @@ +showTraceMessages = $show_trace_messages; + return $this; + } + + public function getShowTraceMessages() { + return $this->showTraceMessages; + } + + public function newMessage() { + return new ArcanistLogMessage(); + } + + private function writeBytes($bytes) { + fprintf(STDERR, '%s', $bytes); + return $this; + } + + public function writeNewline() { + return $this->writeBytes("\n"); + } + + public function writeMessage(ArcanistLogMessage $message) { + $color = $message->getColor(); + + $this->writeBytes( + tsprintf( + "** %s ** %s\n", + $message->getLabel(), + $message->getMessage())); + + return $message; + } + + public function writeWarning($label, $message) { + return $this->writeMessage( + $this->newMessage() + ->setColor('yellow') + ->setLabel($label) + ->setMessage($message)); + } + + public function writeError($label, $message) { + return $this->writeMessage( + $this->newMessage() + ->setColor('red') + ->setLabel($label) + ->setMessage($message)); + } + + public function writeSuccess($label, $message) { + return $this->writeMessage( + $this->newMessage() + ->setColor('green') + ->setLabel($label) + ->setMessage($message)); + } + + public function writeStatus($label, $message) { + return $this->writeMessage( + $this->newMessage() + ->setColor('blue') + ->setLabel($label) + ->setMessage($message)); + } + + public function writeTrace($label, $message) { + $trace = $this->newMessage() + ->setColor('magenta') + ->setLabel($label) + ->setMessage($message); + + if ($this->getShowTraceMessages()) { + $this->writeMessage($trace); + } + + return $trace; + } + + public function writeHint($label, $message) { + return $this->writeMessage( + $this->newMessage() + ->setColor('cyan') + ->setLabel($label) + ->setMessage($message)); + } + + public function writeWaitingForInput() { + if (!phutil_is_interactive()) { + return; + } + + $this->writeStatus( + pht('INPUT'), + pht('Waiting for input on stdin...')); + } + +} diff --git a/src/log/ArcanistLogMessage.php b/src/log/ArcanistLogMessage.php new file mode 100644 index 00000000..66d516d3 --- /dev/null +++ b/src/log/ArcanistLogMessage.php @@ -0,0 +1,47 @@ +label = $label; + return $this; + } + + public function getLabel() { + return $this->label; + } + + public function setColor($color) { + $this->color = $color; + return $this; + } + + public function getColor() { + return $this->color; + } + + public function setChannel($channel) { + $this->channel = $channel; + return $this; + } + + public function getChannel() { + return $this->channel; + } + + public function setMessage($message) { + $this->message = $message; + return $this; + } + + public function getMessage() { + return $this->message; + } + +} diff --git a/src/moduleutils/PhutilLibraryMapBuilder.php b/src/moduleutils/PhutilLibraryMapBuilder.php new file mode 100644 index 00000000..c036ed4c --- /dev/null +++ b/src/moduleutils/PhutilLibraryMapBuilder.php @@ -0,0 +1,514 @@ +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 + * `extract-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 `extract-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__).'/../../support/lib/extract-symbols.php'; + + return new ExecFuture('php -f %R -- --ugly %R', $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(); + + $extensions_dir = 'extensions/'; + $extensions_len = strlen($extensions_dir); + + $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; + } + + // Ignore files in the extensions/ directory. + if (!strncmp($file, $extensions_dir, $extensions_len)) { + 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, + // `extract-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/object/Phobject.php b/src/object/Phobject.php new file mode 100644 index 00000000..0a7a59ee --- /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 index 00000000..d401b481 --- /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 index 00000000..7bd5b81b --- /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 index 00000000..a1eda282 --- /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 index 00000000..d2bf93a3 --- /dev/null +++ b/src/parser/PhutilEditorConfig.php @@ -0,0 +1,201 @@ + 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(); + + // Normalize directory separators to "/". The ".editorconfig" standard + // uses only "/" as a directory separator, not "\". + $path = str_replace(DIRECTORY_SEPARATOR, '/', $path); + + foreach ($configs as $config) { + list($path_prefix, $editorconfig) = $config; + + // Normalize path separators, as above. + $path_prefix = str_replace(DIRECTORY_SEPARATOR, '/', $path_prefix); + + 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; + $paths = Filesystem::walkToRoot($path, $this->root); + foreach ($paths as $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; + } + } + + return $configs; + } + +} diff --git a/src/parser/PhutilEmailAddress.php b/src/parser/PhutilEmailAddress.php new file mode 100644 index 00000000..6acda756 --- /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 index 00000000..cfe5530f --- /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 index 00000000..0bcc4f76 --- /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 (phutil_is_natural_list($value)) { + 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 index 00000000..3b06f4b2 --- /dev/null +++ b/src/parser/PhutilJSONParser.php @@ -0,0 +1,64 @@ +allowDuplicateKeys = $allow_duplicate_keys; + return $this; + } + + public function parse($json) { + $arcanist_root = phutil_get_library_root('arcanist'); + $jsonlint_root = $arcanist_root.'/../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 index 00000000..7b0dc6fc --- /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 index 00000000..f084adb7 --- /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/PhutilQueryStringParser.php b/src/parser/PhutilQueryStringParser.php new file mode 100644 index 00000000..90f67f64 --- /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 index 00000000..bcb25a4c --- /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 index 00000000..c49fccf4 --- /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 && !phutil_is_natural_list($value)) { + 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 && phutil_is_natural_list($value)) { + 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 index 00000000..7ddd3074 --- /dev/null +++ b/src/parser/PhutilURI.php @@ -0,0 +1,559 @@ +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; + + $this->initializeQueryParams(phutil_string_cast($uri), $params); + + return; + } + + $uri = phutil_string_cast($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) { + $pairs = id(new PhutilQueryStringParser()) + ->parseQueryStringToPairList($query); + + foreach ($pairs as $pair) { + list($key, $value) = $pair; + $this->appendQueryParam($key, $value); + } + } + $this->fragment = idx($parts, 'fragment', ''); + + $this->type = $type; + + $this->initializeQueryParams($uri, $params); + } + + 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 = '?'.phutil_build_http_querystring_from_pairs($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; + } + + /** + * @deprecated + */ + public function setQueryParam($key, $value) { + // To set, we replace the first matching key with the new value, then + // remove all other matching keys. This replaces the old value and retains + // the parameter order. + + $is_null = ($value === null); + + // Typecheck and cast the key before we compare it to existing keys. This + // raises an early exception if the key has a bad type. + list($key) = phutil_http_parameter_pair($key, ''); + + $found = false; + foreach ($this->query as $list_key => $pair) { + list($k, $v) = $pair; + + if ($k !== $key) { + continue; + } + + if ($found) { + unset($this->query[$list_key]); + continue; + } + + $found = true; + + if ($is_null) { + unset($this->query[$list_key]); + } else { + $this->insertQueryParam($key, $value, $list_key); + } + } + + $this->query = array_values($this->query); + + // If we didn't find an existing place to put it, add it to the end. + if (!$found) { + if (!$is_null) { + $this->appendQueryParam($key, $value); + } + } + + return $this; + } + + /** + * @deprecated + */ + public function setQueryParams(array $params) { + $this->query = array(); + + foreach ($params as $k => $v) { + $this->appendQueryParam($k, $v); + } + + return $this; + } + + /** + * @deprecated + */ + public function getQueryParams() { + $map = array(); + + foreach ($this->query as $pair) { + list($k, $v) = $pair; + $map[$k] = $v; + } + + return $map; + } + + public function getQueryParamsAsMap() { + $map = array(); + + foreach ($this->query as $pair) { + list($k, $v) = $pair; + + if (isset($map[$k])) { + throw new Exception( + pht( + 'Query parameters include a duplicate key ("%s") and can not be '. + 'nondestructively represented as a map.', + $k)); + } + + $map[$k] = $v; + } + + return $map; + } + + public function getQueryParamsAsPairList() { + return $this->query; + } + + public function appendQueryParam($key, $value) { + return $this->insertQueryParam($key, $value); + } + + public function removeAllQueryParams() { + $this->query = array(); + return $this; + } + + public function removeQueryParam($remove_key) { + list($remove_key) = phutil_http_parameter_pair($remove_key, ''); + + foreach ($this->query as $idx => $pair) { + list($key, $value) = $pair; + + if ($key !== $remove_key) { + continue; + } + + unset($this->query[$idx]); + } + + $this->query = array_values($this->query); + + return $this; + } + + public function replaceQueryParam($replace_key, $replace_value) { + if ($replace_value === null) { + throw new InvalidArgumentException( + pht( + 'Value provided to "replaceQueryParam()" for key "%s" is NULL. '. + 'Use "removeQueryParam()" to remove a query parameter.', + $replace_key)); + } + + $this->removeQueryParam($replace_key); + $this->appendQueryParam($replace_key, $replace_value); + return $this; + } + + private function insertQueryParam($key, $value, $idx = null) { + list($key, $value) = phutil_http_parameter_pair($key, $value); + + if ($idx === null) { + $this->query[] = array($key, $value); + } else { + $this->query[$idx] = array($key, $value); + } + + return $this; + } + + private function initializeQueryParams($uri, array $params) { + $have_params = array(); + foreach ($this->query as $pair) { + list($key) = $pair; + $have_params[$key] = true; + } + + foreach ($params as $key => $value) { + if (isset($have_params[$key])) { + throw new InvalidArgumentException( + pht( + 'You are trying to construct an ambiguous URI: query parameter '. + '"%s" is present in both the string argument ("%s") and the map '. + 'argument.', + $key, + $uri)); + } + + if ($value === null) { + continue; + } + + $this->appendQueryParam($key, $value); + } + + return $this; + } + + 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->replaceQueryParam($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 index 00000000..984289ac --- /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 index 00000000..c0fefc07 --- /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 index 00000000..38557fa3 --- /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 index 00000000..f2c4158b --- /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 index 00000000..91f05115 --- /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 index 00000000..e24a75cb --- /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 index 00000000..295d7b55 --- /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 index 00000000..9eaa402a --- /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 index 00000000..d82ef6ec --- /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__/PhutilQueryStringParserTestCase.php b/src/parser/__tests__/PhutilQueryStringParserTestCase.php new file mode 100644 index 00000000..fff19f61 --- /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 index 00000000..5e751a65 --- /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 index 00000000..c294c5b6 --- /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 index 00000000..c9c881ce --- /dev/null +++ b/src/parser/__tests__/PhutilURITestCase.php @@ -0,0 +1,417 @@ +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( + array( + 'query', + 'value', + ), + ), + $uri->getQueryParamsAsPairList(), + '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->getQueryParamsAsPairList(), + 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( + array( + 'x', + '/', + ), + ), + $uri->getQueryParamsAsPairList()); + + // 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); + } + + public function testDuplicateKeys() { + $uri = new PhutilURI('http://www.example.com/?x=1&x=2'); + $this->assertEqual( + 'http://www.example.com/?x=1&x=2', + (string)$uri); + + $uri->appendQueryParam('x', '3'); + $this->assertEqual( + 'http://www.example.com/?x=1&x=2&x=3', + (string)$uri); + + $uri->replaceQueryParam('x', '4'); + $this->assertEqual( + 'http://www.example.com/?x=4', + (string)$uri); + + $uri->removeQueryParam('x'); + $this->assertEqual( + 'http://www.example.com/', + (string)$uri); + + $uri->appendQueryParam('a', 'a'); + $uri->appendQueryParam('b', 'b'); + $uri->appendQueryParam('c', 'c'); + $uri->appendQueryParam('b', 'd'); + + $this->assertEqual( + 'http://www.example.com/?a=a&b=b&c=c&b=d', + (string)$uri); + + $uri->replaceQueryParam('b', 'e'); + $this->assertEqual( + 'http://www.example.com/?a=a&c=c&b=e', + (string)$uri, + pht( + 'Replacing a parameter should overwrite other instances of the key.')); + } + + public function testBadHTTPParameters() { + $uri = new PhutilURI('http://www.example.com/'); + + $caught = null; + try { + $uri->replaceQueryParam(array(), 'x'); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue( + (bool)$caught, + pht('Nonscalar HTTP keys should throw.')); + + $caught = null; + try { + $uri->replaceQueryParam('x', array()); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue( + (bool)$caught, + pht('Nonscalar HTTP values should throw.')); + } + + public function testHTTPParameterTypes() { + // Whether you pass an integer or string, "0" should always be the same + // query parameter. + + $uri = new PhutilURI('http://www.example.com/'); + + $uri->appendQueryParam(0, 'a'); + $uri->appendQueryParam('0', 'b'); + $this->assertEqual( + 'http://www.example.com/?0=a&0=b', + (string)$uri); + + $uri->replaceQueryParam(0, 'c'); + $this->assertEqual( + 'http://www.example.com/?0=c', + (string)$uri); + + $uri->replaceQueryParam(0, 'a'); + $uri->appendQueryParam('0', 'b'); + $this->assertEqual( + 'http://www.example.com/?0=a&0=b', + (string)$uri); + + $uri->replaceQueryParam('0', 'c'); + $this->assertEqual( + 'http://www.example.com/?0=c', + (string)$uri); + } + + public function testGetQueryParamsAsMap() { + $uri = new PhutilURI('http://www.example.com/?x=1&x=2'); + + $caught = null; + try { + $map = $uri->getQueryParamsAsMap(); + } catch (Exception $ex) { + $caught = $ex; + } + + $this->assertTrue((bool)$caught); + } + + public function testQueryURIConstruction() { + $uri = new PhutilURI('http://example.com/', array('y' => '1')); + $this->assertEqual( + 'http://example.com/?y=1', + (string)$uri); + + $uri = new PhutilURI('http://example.com/?x=2', array('y' => '1')); + $this->assertEqual( + 'http://example.com/?x=2&y=1', + (string)$uri); + + $caught = null; + try { + $uri = new PhutilURI('http://example.com/?y=3', array('y' => '1')); + } catch (InvalidArgumentException $ex) { + $caught = $ex; + } + $this->assertTrue((bool)$caught); + + $uri = new PhutilURI('http://example.com/?a=1', array('b' => '2')); + $uri = new PhutilURI($uri, array('c' => '3')); + + $this->assertEqual( + 'http://example.com/?a=1&b=2&c=3', + (string)$uri); + } + +} diff --git a/src/parser/__tests__/docblock/embedded-specials.docblock b/src/parser/__tests__/docblock/embedded-specials.docblock new file mode 100644 index 00000000..e2e1b60c --- /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 index 00000000..6dc8cca1 --- /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 index 00000000..766dc49c --- /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 index 00000000..dc683fce --- /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 index 00000000..e3f36df3 --- /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 index 00000000..2e31a7fc --- /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 index 00000000..c70caa16 --- /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 index 00000000..a57547c6 --- /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 index 00000000..d3791892 --- /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 index 00000000..1eaa1c62 --- /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 index 00000000..45b39039 --- /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 index 00000000..7f37bdc4 --- /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 index 00000000..78b36ca0 --- /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 index 00000000..e69de29b diff --git a/src/parser/__tests__/editorconfig/subdir/.editorconfig b/src/parser/__tests__/editorconfig/subdir/.editorconfig new file mode 100644 index 00000000..c949bed7 --- /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 index 00000000..5b3330c2 --- /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 index 00000000..4e1afee5 --- /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 index 00000000..ef8dfc11 --- /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 index 00000000..ac42ce92 --- /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 index 00000000..775eaf8f --- /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 index 00000000..eb4e3ce1 --- /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 index 00000000..faf3bfd2 --- /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 index 00000000..c0f8198a --- /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 index 00000000..90017edb --- /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 index 00000000..56ca75a9 --- /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 index 00000000..ab2b32bb --- /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 index 00000000..92f76f2a --- /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 index 00000000..aebe9ced --- /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 index 00000000..2f1e1319 --- /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 index 00000000..81f86cde --- /dev/null +++ b/src/parser/argument/PhutilArgumentParser.php @@ -0,0 +1,989 @@ +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; + private $requireArgumentTerminator = false; + private $sawTerminator = false; + + 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); + + // Wildcard arguments have a name like "argv", but we don't want to + // parse a corresponding flag like "--argv". Filter them out before + // building a list of available flags. + $non_wildcard = array(); + foreach ($specs as $spec_key => $spec) { + if ($spec->getWildcard()) { + continue; + } + + $non_wildcard[$spec_key] = $spec; + } + + $specs_by_name = mpull($non_wildcard, null, 'getName'); + $specs_by_short = mpull($non_wildcard, 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". + $this->sawTerminator = true; + 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); + + $should_autocorrect = $this->shouldAutocorrect(); + if (count($corrections) == 1 && $should_autocorrect) { + $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 we have remaining unconsumed arguments other than a single "--", + // fail. + $argv = $this->filterWildcardArgv($this->argv); + if ($argv) { + throw new PhutilArgumentUsageException( + pht( + 'Unrecognized argument "%s".', + head($argv))); + } + + if ($this->getRequireArgumentTerminator()) { + if (!$this->sawTerminator) { + throw new ArcanistMissingArgumentTerminatorException(); + } + } + + 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)); + + $should_autocorrect = $this->shouldAutocorrect(); + if (count($corrected) == 1 && $should_autocorrect) { + $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 "--xprofile", you must install XHProf.')); + } + + 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; + } + + public function setWorkflows($workflows) { + $workflows = mpull($workflows, null, 'getName'); + $this->workflows = $workflows; + return $this; + } + + public function getWorkflows() { + return $this->workflows; + } + + +/* -( Command Help )------------------------------------------------------- */ + + public function setRequireArgumentTerminator($require) { + $this->requireArgumentTerminator = $require; + return $this; + } + + public function getRequireArgumentTerminator() { + return $this->requireArgumentTerminator; + } + + 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); + } + + private function shouldAutocorrect() { + return !phutil_is_noninteractive(); + } + +} diff --git a/src/parser/argument/PhutilArgumentSpecification.php b/src/parser/argument/PhutilArgumentSpecification.php new file mode 100644 index 00000000..71e583b1 --- /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 index 00000000..dd999123 --- /dev/null +++ b/src/parser/argument/PhutilArgumentSpellingCorrector.php @@ -0,0 +1,155 @@ +setInsertCost(4) + ->setDeleteCost(4) + ->setReplaceCost(3) + ->setTransposeCost(2); + + return id(new self()) + ->setEditDistanceMatrix($matrix) + ->setMode(self::MODE_COMMANDS) + ->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) + ->setMode(self::MODE_FLAGS) + ->setMaximumDistance($max_distance); + } + + public function setMode($mode) { + $this->mode = $mode; + return $this; + } + + public function getMode() { + return $this->mode; + } + + 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'); + } + + // If we're correcting commands, never correct an input which begins + // with "-", since this is almost certainly intended to be a flag. + if ($this->getMode() === self::MODE_COMMANDS) { + if (preg_match('/^-/', $input)) { + return array(); + } + } + + $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 index 00000000..5d722f29 --- /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 index 00000000..f49ad365 --- /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 index 00000000..ce0e23ec --- /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 index 00000000..9927a577 --- /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 index 00000000..7257f68f --- /dev/null +++ b/src/parser/argument/workflow/PhutilHelpArgumentWorkflow.php @@ -0,0 +1,97 @@ +runtime = $runtime; + return $this; + } + + public function getRuntime() { + return $this->runtime; + } + + protected function didConstruct() { + $this->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'); + + $runtime = $this->getRuntime(); + if ($runtime) { + $toolset = $runtime->getToolset(); + if ($toolset->getToolsetKey() === 'arc') { + $workflows = $args->getWorkflows(); + + $legacy = array(); + + $legacy[] = new ArcanistCloseRevisionWorkflow(); + $legacy[] = new ArcanistCommitWorkflow(); + $legacy[] = new ArcanistCoverWorkflow(); + $legacy[] = new ArcanistDiffWorkflow(); + $legacy[] = new ArcanistExportWorkflow(); + $legacy[] = new ArcanistGetConfigWorkflow(); + $legacy[] = new ArcanistSetConfigWorkflow(); + $legacy[] = new ArcanistInstallCertificateWorkflow(); + $legacy[] = new ArcanistLandWorkflow(); + $legacy[] = new ArcanistLintersWorkflow(); + $legacy[] = new ArcanistLintWorkflow(); + $legacy[] = new ArcanistListWorkflow(); + $legacy[] = new ArcanistPatchWorkflow(); + $legacy[] = new ArcanistPasteWorkflow(); + $legacy[] = new ArcanistTasksWorkflow(); + $legacy[] = new ArcanistTodoWorkflow(); + $legacy[] = new ArcanistUnitWorkflow(); + $legacy[] = new ArcanistWhichWorkflow(); + + foreach ($legacy as $workflow) { + // If this workflow has been updated but not removed from the list + // above yet, just skip it. + if ($workflow instanceof ArcanistArcWorkflow) { + continue; + } + + $workflows[] = $workflow->newLegacyPhutilWorkflow(); + } + + $args->setWorkflows($workflows); + } + } + + 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/exception/PhutilINIParserException.php b/src/parser/exception/PhutilINIParserException.php new file mode 100644 index 00000000..22a4c8ac --- /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 index 00000000..b23494b7 --- /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 index 00000000..c37b1da0 --- /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 index 00000000..c37a9a71 --- /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 index 00000000..74f86c24 --- /dev/null +++ b/src/parser/generator/exception/PhutilInvalidRuleParserGeneratorException.php @@ -0,0 +1,4 @@ +content = $content; + return $this; + } + + public function getContent() { + return $this->content; + } + + public function isContentNode() { + return ($this->content !== null); + } + + public function setTagName($tag_name) { + $this->tagName = $tag_name; + return $this; + } + + public function getTagName() { + return $this->tagName; + } + + public function appendChild(PhutilDOMNode $node) { + $node->parentNode = $this; + $this->children[] = $node; + return $this; + } + + public function getChildren() { + return $this->children; + } + + public function getParentNode() { + return $this->parentNode; + } + + public function setAttributes(array $attributes) { + $this->attributes = $attributes; + return $this; + } + + public function getAttributes() { + return $this->attributes; + } + + public function setRawHead($raw_string) { + $this->rawHead = $raw_string; + return $this; + } + + public function setRawTail($raw_tail) { + $this->rawTail = $raw_tail; + return $this; + } + + public function newRawString() { + $raw = array(); + $raw[] = $this->rawHead; + + foreach ($this->getChildren() as $child) { + $raw[] = $child->newRawString(); + } + + $raw[] = $this->rawTail; + + return implode('', $raw); + } + + public function toDictionary() { + if ($this->isContentNode()) { + return array( + 'content' => $this->content, + ); + } else { + $children = array(); + + foreach ($this->getChildren() as $child) { + $children[] = $child->toDictionary(); + } + + return array( + 'tag' => $this->getTagName(), + 'attributes' => $this->getAttributes(), + 'children' => $children, + ); + } + } + + /** + * Get a list of the children of a given DOM node, treating unexpected + * tags as if they were raw content. + */ + public function selectChildrenWithTags(array $tag_list) { + $tag_map = array_fuse($tag_list); + + $nodes = array(); + foreach ($this->getChildren() as $child) { + // If this is already a content node, just keep it as-is. + if ($child->isContentNode()) { + $nodes[] = $child; + continue; + } + + $tag_name = $child->getTagName(); + + // If this is a tag that we're allowing, keep it as-is. + if (isset($tag_map[$tag_name])) { + $nodes[] = $child; + continue; + } + + // Otherwise, this is some other tag. Convert it into a content + // node. + + $raw_string = $child->newRawString(); + + $nodes[] = id(new self()) + ->setContent($raw_string) + ->setRawHead($raw_string); + } + + return $this->mergeContentNodes($nodes); + } + + public function newRawContentString() { + $content_node = $this->selectChildrenWithTags(array()); + + if (!$content_node) { + return ''; + } + + return head($content_node)->newRawString(); + } + + public function mergeContent() { + $this->children = $this->mergeContentNodes($this->children); + + foreach ($this->getChildren() as $child) { + $child->parentNode = $this; + $child->mergeContent(); + } + + return $this; + } + + /** + * Given a list of nodes, combine sequences of multiple adjacent content + * nodes into single nodes. + */ + private function mergeContentNodes(array $nodes) { + $list = array(); + $content_block = array(); + foreach ($nodes as $node) { + if ($node->isContentNode()) { + $content_block[] = $node; + continue; + } + + $list[] = $content_block; + $content_block = array(); + + $list[] = $node; + } + + $list[] = $content_block; + + $results = array(); + foreach ($list as $item) { + if (!is_array($item)) { + $results[] = $item; + continue; + } + + if (!$item) { + continue; + } + + $parts = array(); + foreach ($item as $content_node) { + $parts[] = $content_node->newRawString(); + } + $parts = implode('', $parts); + + if (!strlen($parts)) { + continue; + } + + $results[] = id(new self()) + ->setContent($parts) + ->setRawHead($parts); + } + + return $results; + } + +} diff --git a/src/parser/html/PhutilHTMLParser.php b/src/parser/html/PhutilHTMLParser.php new file mode 100644 index 00000000..66e82a55 --- /dev/null +++ b/src/parser/html/PhutilHTMLParser.php @@ -0,0 +1,434 @@ +"). Non-tag + // content is anything else. + + $segment_pos = 0; + $segments = array(); + $in_tag = false; + + for ($ii = 0; $ii < strlen($corpus); $ii++) { + $c = $corpus[$ii]; + + if ($in_tag && ($c === '>')) { + if ($segment_pos !== null) { + $segments[] = array( + 'tag' => $in_tag, + 'pos' => $segment_pos, + 'end' => $ii + 1, + ); + } + + $segment_pos = $ii + 1; + $in_tag = false; + continue; + } + + // When we encounter a "<", we start a new tag whether we're already in + // a tag or not. We want to parse "1 < 2" as a single tag with + // the content "1 < 2". + + if ($c === '<') { + $segments[] = array( + 'tag' => false, + 'pos' => $segment_pos, + 'end' => $ii, + ); + + $segment_pos = $ii; + $in_tag = true; + continue; + } + } + + // Add whatever content was left at the end of the string. If we were in + // a tag but did not find a closing ">", we treat this as normal content. + $segments[] = array( + 'tag' => false, + 'pos' => $segment_pos, + 'end' => $ii, + ); + + // Slice the marked segments out of the raw corpus so we get a list of + // "tag" strings and a list of "non-tag" strings. + + $parts = array(); + $corpus_length = strlen($corpus); + foreach ($segments as $segment) { + $tag = $segment['tag']; + $pos = $segment['pos']; + $len = $segment['end'] - $pos; + + // If this is a tag, we'll drop the "<" at the beginning and the ">" + // at the end here. + if ($tag) { + $slice_pos = $pos + 1; + $slice_len = $len - 2; + } else { + $slice_pos = $pos; + $slice_len = $len; + } + + if (($slice_pos < $corpus_length) && ($slice_len > 0)) { + $content = substr($corpus, $slice_pos, $slice_len); + } else { + $content = ''; + } + + $parts[] = array( + 'tag' => $tag, + 'pos' => $pos, + 'len' => $len, + 'content' => $content, + ); + } + + $root = new PhutilDOMNode(); + $this->setCursor($root); + + foreach ($parts as $part) { + $tag = $this->newTagDOMNode($part); + + if ($tag !== null) { + continue; + } + + $content = $part['content']; + + // If this part is a tag, restore the angle brackets. + if ($part['tag']) { + $content = '<'.$content.'>'; + } + + $node = id(new PhutilDOMNode()) + ->setContent($content) + ->setRawHead($content); + + $this->getCursor()->appendChild($node); + } + + $root->mergeContent(); + + return $root; + } + + private function newTagDOMNode(array $part) { + if (!$part['tag']) { + return null; + } + + $raw_content = $part['content']; + $content = $raw_content; + + $content = trim($content); + $content_len = strlen($content); + + // If the tag content begins with "/", like "", strip the slash + // off and mark this as a closing tag. + $is_close = false; + if ($content_len > 0 && $content[0] === '/') { + $is_close = true; + $content = substr($content, 1); + $content = trim($content); + $content_len = strlen($content); + } + + // If the tag content ends with "/", like "", strip the slash off + // and mark this as self-closing. + $self_close = false; + if ($content_len > 0 && $content[$content_len - 1] === '/') { + $self_close = true; + $content = substr($content, 0, $content_len - 1); + $content = trim($content); + $content_len = strlen($content); + } + + // If this tag is both a closing tag and a self-closing tag, it is + // not formatted correctly. Treat it as content. + if ($self_close && $is_close) { + return null; + } + + // Now, split the rest of the tag into the tag name and tag attributes. + $pieces = preg_split('/\s+/', $content, 2); + $tag_name = $pieces[0]; + + if (count($pieces) > 1) { + $attributes = $pieces[1]; + } else { + $attributes = ''; + } + + // If there's no tag name, this tag is not valid. Treat it as content. + if (!strlen($tag_name)) { + return null; + } + + // If this is a closing tag with attributes, it's not valid. Treat it + // as content. + if ($is_close && strlen($attributes)) { + return null; + } + + $tag_name = phutil_utf8_strtolower($tag_name); + + // If we find a valid closing tag, try to find a matching tag on the stack. + // If we find a matching tag, close it. + // If we do not find a matching tag, treat the closing tag as content. + if ($is_close) { + $cursor = $this->getCursor(); + + while ($cursor) { + if ($cursor->getTagName() === $tag_name) { + // Add this raw content to the raw content of the tag we're closing. + $cursor->setRawTail('<'.$raw_content.'>'); + + $parent = $cursor->getParentNode(); + $this->setCursor($parent); + + return true; + } + $cursor = $cursor->getParentNode(); + } + + return null; + } + + if (strlen($attributes)) { + $attribute_map = $this->parseAttributes($attributes); + // If the attributes can't be parsed, treat the tag as content. + if ($attribute_map === null) { + return null; + } + } else { + $attribute_map = array(); + } + + $node = id(new PhutilDOMNode()) + ->setTagName($tag_name) + ->setAttributes($attribute_map) + ->setRawHead('<'.$raw_content.'>'); + + $cursor = $this->getCursor(); + $cursor->appendChild($node); + + if (!$self_close) { + $this->setCursor($node); + } + + return $node; + } + + private function setCursor(PhutilDOMNode $cursor) { + $this->cursor = $cursor; + return $this; + } + + private function getCursor() { + return $this->cursor; + } + + private function parseAttributes($attributes) { + $state = 'key'; + + $whitespace = array( + ' ' => true, + "\n" => true, + "\t" => true, + "\r" => true, + ); + + $map = array(); + $len = strlen($attributes); + $key_pos = null; + for ($ii = 0; $ii < $len; $ii++) { + $c = $attributes[$ii]; + $is_space = isset($whitespace[$c]); + + switch ($state) { + case 'key': + // We're looking for the start of an attribute name. + + // Skip over any whitespace. + if ($is_space) { + break; + } + + // If we see "". + if (isset($map[$name_value])) { + return null; + } + } + + // If we find an "=", that's the end of the name. Next, we're going + // to parse a value. + if ($c === '=') { + $state = 'value'; + break; + } + + // If we find whitespace, that's the end of the name. We're going + // to look for an "=". + if ($is_space) { + $state = 'equals'; + break; + } + + break; + case 'equals': + // We've parsed the name of an attribute and are looking for an + // "=" character. + + // Skip over any whitespace. + if ($is_space) { + break; + } + + // This is the "=" we're looking for, so we're good to go. + if ($c === '=') { + $state = 'value'; + break; + } + + // If this is anything else, this is an attribute name with no + // value. Treat it as "true" and move on. This corresponds to an + // input like "". + $map[$name_value] = true; + $name_pos = $ii; + $state = 'name'; + break; + case 'value': + // We've parsed an "=" and are looking for the start of a value. + + // Skip over any whitespace. + if ($is_space) { + break; + } + + // Don't accept "parseDocument($input); + + // We're just testing the child list of the root node since this + // reduces the amount of boilerplate in the test cases. + $list = array(); + foreach ($document->getChildren() as $child) { + $list[] = $child->toDictionary(); + } + + $this->assertEqual( + $expect, + $list, + pht('DOM tree for "%s".', $test)); + } + } + + public function testSelectChildrenWithTags() { + $input = 'x'; + $document = id(new PhutilHTMLParser()) + ->parseDocument($input); + + $children = $document->selectChildrenWithTags(array('a')); + + $list = array(); + foreach ($children as $child) { + $list[] = $child->toDictionary(); + } + + $this->assertEqual( + array( + array( + 'tag' => 'a', + 'attributes' => array(), + 'children' => array(), + ), + array( + 'content' => '', + ), + array( + 'tag' => 'a', + 'attributes' => array(), + 'children' => array(), + ), + array( + 'content' => '', + ), + array( + 'tag' => 'a', + 'attributes' => array(), + 'children' => array(), + ), + array( + 'content' => '', + ), + array( + 'tag' => 'a', + 'attributes' => array(), + 'children' => array(), + ), + array( + 'content' => 'x', + ), + array( + 'tag' => 'a', + 'attributes' => array(), + 'children' => array(), + ), + array( + 'content' => '', + ), + ), + $list, + pht('Child selection of: %s.', $input)); + } + +} diff --git a/src/parser/html/__tests__/data/attributes-basic.txt b/src/parser/html/__tests__/data/attributes-basic.txt new file mode 100644 index 00000000..040647da --- /dev/null +++ b/src/parser/html/__tests__/data/attributes-basic.txt @@ -0,0 +1,13 @@ + +~~~~~~~~~~ +[ + { + "tag": "a", + "attributes": { + "b": "1", + "c": true, + "d": "e" + }, + "children": [] + } +] diff --git a/src/parser/html/__tests__/data/content-angle.txt b/src/parser/html/__tests__/data/content-angle.txt new file mode 100644 index 00000000..d2573320 --- /dev/null +++ b/src/parser/html/__tests__/data/content-angle.txt @@ -0,0 +1,7 @@ +o< quack +~~~~~~~~~~ +[ + { + "content": "o< quack" + } +] diff --git a/src/parser/html/__tests__/data/content-simple.txt b/src/parser/html/__tests__/data/content-simple.txt new file mode 100644 index 00000000..6ecf430b --- /dev/null +++ b/src/parser/html/__tests__/data/content-simple.txt @@ -0,0 +1,7 @@ +quack +~~~~~~~~~~ +[ + { + "content": "quack" + } +] diff --git a/src/parser/html/__tests__/data/tag-angle.txt b/src/parser/html/__tests__/data/tag-angle.txt new file mode 100644 index 00000000..00ad9a2b --- /dev/null +++ b/src/parser/html/__tests__/data/tag-angle.txt @@ -0,0 +1,13 @@ +1 < 2 +~~~~~~~~~~ +[ + { + "tag": "math", + "attributes": {}, + "children": [ + { + "content": "1 < 2" + } + ] + } +] diff --git a/src/parser/html/__tests__/data/tag-mismatch.txt b/src/parser/html/__tests__/data/tag-mismatch.txt new file mode 100644 index 00000000..e04b40e6 --- /dev/null +++ b/src/parser/html/__tests__/data/tag-mismatch.txt @@ -0,0 +1,21 @@ + +~~~~~~~~~~ +[ + { + "tag": "a", + "attributes": {}, + "children": [ + { + "tag": "b", + "attributes": {}, + "children": [ + { + "tag": "c", + "attributes": {}, + "children": [] + } + ] + } + ] + } +] diff --git a/src/parser/html/__tests__/data/tag-simple.txt b/src/parser/html/__tests__/data/tag-simple.txt new file mode 100644 index 00000000..fcf07d40 --- /dev/null +++ b/src/parser/html/__tests__/data/tag-simple.txt @@ -0,0 +1,135 @@ + + +< a/> + + +< a /> +< a / > + + +< a>< /a> +< a >< /a > + + +< a>< / a> +< a >< / a > +~~~~~~~~~~ +[ + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + }, + { + "content": "\n" + }, + { + "tag": "a", + "attributes": {}, + "children": [] + } +] diff --git a/src/parser/html/__tests__/data/tag-table.txt b/src/parser/html/__tests__/data/tag-table.txt new file mode 100644 index 00000000..ec6106ed --- /dev/null +++ b/src/parser/html/__tests__/data/tag-table.txt @@ -0,0 +1,39 @@ +
ab
+~~~~~~~~~~ +[ + { + "tag": "table", + "attributes": {}, + "children": [ + { + "tag": "tr", + "attributes": {}, + "children": [ + { + "tag": "td", + "attributes": {}, + "children": [ + { + "content": "a" + } + ] + }, + { + "tag": "td", + "attributes": {}, + "children": [ + { + "content": "b" + } + ] + }, + { + "tag": "td", + "attributes": {}, + "children": [] + } + ] + } + ] + } +] diff --git a/src/parser/http/PhutilHTTPResponse.php b/src/parser/http/PhutilHTTPResponse.php new file mode 100644 index 00000000..756847a7 --- /dev/null +++ b/src/parser/http/PhutilHTTPResponse.php @@ -0,0 +1,62 @@ +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) { + if ($this->writeHandle !== null) { + $result = @fwrite($this->writeHandle, $bytes); + if ($result !== strlen($bytes)) { + throw new Exception( + pht('Failed to write response to disk. (Maybe the disk is full?)')); + } + } else { + $this->body->append($bytes); + } + } + + public function getBody() { + if ($this->writeHandle !== null) { + return null; + } + + return $this->body->getAsString(); + } + + public function setWriteHandle($write_handle) { + $this->writeHandle = $write_handle; + return $this; + } + + public function getWriteHandle() { + return $this->writeHandle; + } + +} diff --git a/src/parser/http/PhutilHTTPResponseParser.php b/src/parser/http/PhutilHTTPResponseParser.php new file mode 100644 index 00000000..0197d006 --- /dev/null +++ b/src/parser/http/PhutilHTTPResponseParser.php @@ -0,0 +1,207 @@ +followLocationHeaders = $follow_location_headers; + return $this; + } + + public function getFollowLocationHeaders() { + return $this->followLocationHeaders; + } + + public function setWriteHandle($write_handle) { + $this->writeHandle = $write_handle; + return $this; + } + + public function getWriteHandle() { + return $this->writeHandle; + } + + public function setProgressSink(PhutilProgressSink $progress_sink) { + $this->progressSink = $progress_sink; + return $this; + } + + public function getProgressSink() { + return $this->progressSink; + } + + 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->newHTTPResponse() + ->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)) { + $bytes = $this->buffer; + $this->buffer = ''; + + $this->response->appendBody($bytes); + + $sink = $this->getProgressSink(); + if ($sink) { + $sink->didMakeProgress(strlen($bytes)); + } + } + 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(); + + $write_handle = $this->getWriteHandle(); + if ($write_handle) { + $response->setWriteHandle($write_handle); + } + + $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 index 00000000..7b5e373a --- /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 index 00000000..45f64221 --- /dev/null +++ b/src/parser/xhpast/__tests__/PHPASTParserTestCase.php @@ -0,0 +1,330 @@ +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': + $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 { + $stdout = phutil_json_decode($stdout); + } catch (PhutilJSONParserException $ex) { + throw new PhutilProxyException( + pht( + 'Output for test file "%s" is not valid JSON.', + $name), + $ex); + } + + $stdout_nice = $this->newReadableAST($stdout, $data); + + $this->assertEqual( + $expect, + $stdout_nice, + pht('Parser output for "%s".', $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; + default: + throw new Exception( + pht( + 'Unknown PHPAST parser test type "%s"!', + $type)); + } + } + + /** + * Build a human-readable, stable, relatively diff-able string representing + * an AST (both the node tree itself and the accompanying token stream) for + * use in unit tests. + */ + private function newReadableAST(array $data, $source) { + $tree = new XHPASTTree($data['tree'], $data['stream'], $source); + + $root = $tree->getRootNode(); + + $depth = 0; + $list = $this->newReadableTreeLines($root, $depth); + + return implode('', $list); + } + + private function newReadableTreeLines(AASTNode $node, $depth) { + $out = array(); + + try { + $type_name = $node->getTypeName(); + } catch (Exception $ex) { + $type_name = sprintf('', $node->getTypeID()); + } + + $out[] = $this->newBlock($depth, '*', $type_name); + + $tokens = $node->getTokens(); + + if ($tokens) { + $l = head_key($tokens); + $r = last_key($tokens); + } else { + $l = null; + $r = null; + } + + $items = array(); + + $child_token_map = array(); + + $children = $node->getChildren(); + foreach ($children as $child) { + $child_tokens = $child->getTokens(); + + if ($child_tokens) { + $child_l = head_key($child_tokens); + $child_r = last_key($child_tokens); + } else { + $child_l = null; + $child_r = null; + } + + if ($l !== null) { + for ($ii = $l; $ii < $child_l; $ii++) { + $items[] = $tokens[$ii]; + } + } + + $items[] = $child; + + if ($child_r !== null) { + // NOTE: In some cases, child nodes do not appear in token order. + // That is, the 4th child of a node may use tokens that appear + // between children 2 and 3. Ideally, we wouldn't have cases of + // this and wouldn't have a positional AST. + + // Work around this by: never moving the token cursor backwards; and + // explicitly preventing tokens appearing in any child from being + // printed at top level. + + for ($ii = $child_l; $ii <= $child_r; $ii++) { + if (!isset($tokens[$ii])) { + continue; + } + $child_token_map[$tokens[$ii]->getTokenID()] = true; + } + + $l = max($l, $child_r + 1); + } else { + $l = null; + } + } + + if ($l !== null) { + for ($ii = $l; $ii <= $r; $ii++) { + $items[] = $tokens[$ii]; + } + } + + // See above. If we have tokens in the list which are part of a + // child node that appears later, remove them now. + foreach ($items as $key => $item) { + if ($item instanceof AASTToken) { + $token = $item; + $token_id = $token->getTokenID(); + + if (isset($child_token_map[$token_id])) { + unset($items[$key]); + } + } + } + + foreach ($items as $item) { + if ($item instanceof AASTNode) { + $lines = $this->newReadableTreeLines($item, $depth + 1); + foreach ($lines as $line) { + $out[] = $line; + } + } else { + $token_value = $item->getValue(); + + $out[] = $this->newBlock($depth + 1, '>', $token_value); + } + } + + return $out; + } + + private function newBlock($depth, $type, $text) { + $output_width = 80; + $usable_width = ($output_width - $depth - 2); + + $must_escape = false; + + // We must escape the text if it isn't just simple printable characters. + if (preg_match('/[ \\\\\\r\\n\\t\\"]/', $text)) { + $must_escape = true; + } + + // We must escape the text if it has trailing whitespace. + if (preg_match('/ \z/', $text)) { + $must_escape = true; + } + + // We must escape the text if it won't fit on a single line. + if (strlen($text) > $usable_width) { + $must_escape = true; + } + + if (!$must_escape) { + $lines = array($text); + } else { + $vector = phutil_utf8v_combined($text); + + $escape_map = array( + "\r" => '\\r', + "\n" => '\\n', + "\t" => '\\t', + '"' => '\\"', + '\\' => '\\', + ); + + $escaped = array(); + foreach ($vector as $key => $word) { + if (isset($escape_map[$word])) { + $vector[$key] = $escape_map[$word]; + } + } + + + $line_l = '"'; + $line_r = '"'; + + $max_width = ($usable_width - strlen($line_l) - strlen($line_r)); + + $line = ''; + $len = 0; + + $lines = array(); + foreach ($vector as $word) { + $word_length = phutil_utf8_console_strlen($word); + + if ($len + $word_length > $max_width) { + $lines[] = $line_l.$line.$line_r; + + $line = ''; + $len = 0; + } + + $line .= $word; + $len += $word_length; + } + + $lines[] = $line_l.$line.$line_r; + } + + $is_first = true; + $indent = str_repeat(' ', $depth); + + $output = array(); + foreach ($lines as $line) { + if ($is_first) { + $marker = $type; + $is_first = false; + } else { + $marker = '.'; + } + + $output[] = sprintf( + "%s%s %s\n", + $indent, + $marker, + $line); + } + + return implode('', $output); + } + +} diff --git a/src/parser/xhpast/__tests__/data/a-self-test.php.test b/src/parser/xhpast/__tests__/data/a-self-test.php.test new file mode 100644 index 00000000..c089f2d2 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/a-self-test.php.test @@ -0,0 +1,45 @@ + "\n\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $the_senate + > " " + * n_OPERATOR + > = + > " " + * n_HEREDOC + > "<< ; + > "\n\n" diff --git a/src/parser/xhpast/__tests__/data/anonymous_class.php.test b/src/parser/xhpast/__tests__/data/anonymous_class.php.test new file mode 100644 index 00000000..83ee6b00 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/anonymous_class.php.test @@ -0,0 +1,132 @@ +num = $num; + } +}; +~~~~~~~~~~ +pass +~~~~~~~~~~ +* n_PROGRAM + * n_STATEMENT_LIST + * n_OPEN_TAG + > "\n\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $a + > " " + * n_OPERATOR + > = + > " " + * n_NEW + > new + > " " + > class + > " " + * n_CLASS_DECLARATION + * n_EMPTY + * n_EMPTY + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + * n_EMPTY + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $b + > " " + * n_OPERATOR + > = + > " " + * n_NEW + > new + > " " + > class + > " " + * n_CLASS_DECLARATION + * n_EMPTY + * n_EMPTY + * n_EXTENDS_LIST + > extends + > " " + * n_CLASS_NAME + > c + > " " + * n_IMPLEMENTS_LIST + > implements + > " " + * n_CLASS_NAME + > d + > " " + * n_STATEMENT_LIST + > { + > "\n " + * n_STATEMENT + * n_CLASS_MEMBER_DECLARATION_LIST + * n_CLASS_MEMBER_MODIFIER_LIST + * n_STRING + > private + > " " + * n_CLASS_MEMBER_DECLARATION + * n_VARIABLE + > $num + * n_EMPTY + > ; + > "\n\n " + * n_STATEMENT + * n_METHOD_DECLARATION + * n_METHOD_MODIFIER_LIST + * n_STRING + > public + * n_EMPTY + * n_STRING + > __construct + * n_DECLARATION_PARAMETER_LIST + > ( + * n_DECLARATION_PARAMETER + * n_EMPTY + * n_VARIABLE + > $num + * n_EMPTY + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > "\n " + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_OBJECT_PROPERTY_ACCESS + * n_VARIABLE + > $this + > -> + * n_STRING + > num + > " " + * n_OPERATOR + > = + > " " + * n_VARIABLE + > $num + > ; + > "\n " + > } + > "\n" + > } + * n_CALL_PARAMETER_LIST + > ( + * n_NUMERIC_SCALAR + > 10 + > ) + > ; + > "\n" diff --git a/src/parser/xhpast/__tests__/data/base-fail-syntax.php.test b/src/parser/xhpast/__tests__/data/base-fail-syntax.php.test new file mode 100644 index 00000000..ed46e0f5 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/base-fail-syntax.php.test @@ -0,0 +1,3 @@ + "\n" diff --git a/src/parser/xhpast/__tests__/data/call-time-pass-by-ref.php.test b/src/parser/xhpast/__tests__/data/call-time-pass-by-ref.php.test new file mode 100644 index 00000000..a924b320 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/call-time-pass-by-ref.php.test @@ -0,0 +1,22 @@ + " " + * n_STATEMENT + * n_FUNCTION_CALL + * n_SYMBOL_NAME + > f + * n_CALL_PARAMETER_LIST + > ( + * n_VARIABLE_REFERENCE + > & + * n_VARIABLE + > $v + > ) + > ; + > "\n" diff --git a/src/parser/xhpast/__tests__/data/namespace.php.test b/src/parser/xhpast/__tests__/data/namespace.php.test new file mode 100644 index 00000000..b1de0e24 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/namespace.php.test @@ -0,0 +1,93 @@ + "\n\n" + * n_STATEMENT + * n_NAMESPACE + > namespace + > " " + * n_SYMBOL_NAME + > A + * n_EMPTY + > ; + > "\n\n" + * n_STATEMENT + * n_CLASS_DECLARATION + * n_CLASS_ATTRIBUTES + > class + > " " + * n_CLASS_NAME + > B + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n\n" + * n_STATEMENT + * n_NAMESPACE + > namespace + > " " + * n_SYMBOL_NAME + > A + > "\" + > B + > "\" + > C + > " " + * n_STATEMENT_LIST + > { + > "\n " + * n_STATEMENT + * n_CLASS_DECLARATION + * n_CLASS_ATTRIBUTES + > class + > " " + * n_CLASS_NAME + > D + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + > } + > "\n\n" + * n_STATEMENT + * n_NAMESPACE + * n_EMPTY + * n_STATEMENT_LIST + > { + > "\n " + * n_STATEMENT + * n_CLASS_DECLARATION + * n_CLASS_ATTRIBUTES + > class + > " " + * n_CLASS_NAME + > A + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + > } + > "\n" diff --git a/src/parser/xhpast/__tests__/data/operator-coalesce.php.test b/src/parser/xhpast/__tests__/data/operator-coalesce.php.test new file mode 100644 index 00000000..73981b5a --- /dev/null +++ b/src/parser/xhpast/__tests__/data/operator-coalesce.php.test @@ -0,0 +1,29 @@ + "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_NUMERIC_SCALAR + > 1 + > " " + * n_OPERATOR + > ?? + > " " + * n_BINARY_EXPRESSION + * n_NUMERIC_SCALAR + > 2 + > " " + * n_OPERATOR + > ?? + > " " + * n_NUMERIC_SCALAR + > 3 + > ; + > "\n" diff --git a/src/parser/xhpast/__tests__/data/operator-spaceship-nonassoc.php.test b/src/parser/xhpast/__tests__/data/operator-spaceship-nonassoc.php.test new file mode 100644 index 00000000..a3de5417 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/operator-spaceship-nonassoc.php.test @@ -0,0 +1,4 @@ + 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 index 00000000..5c2d2e58 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/operator-spaceship.php.test @@ -0,0 +1,22 @@ + 2; +~~~~~~~~~~ +pass +~~~~~~~~~~ +* n_PROGRAM + * n_STATEMENT_LIST + * n_OPEN_TAG + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_NUMERIC_SCALAR + > 1 + > " " + * n_OPERATOR + > <=> + > " " + * n_NUMERIC_SCALAR + > 2 + > ; + > "\n" 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 index 00000000..16ea4751 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/optional-parameter.php.test @@ -0,0 +1,60 @@ + "\n\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > a + * n_DECLARATION_PARAMETER_LIST + > ( + > ? + * n_DECLARATION_PARAMETER + * n_NULLABLE_TYPE + * n_CLASS_NAME + > int + > " " + * n_VARIABLE + > $x + * n_EMPTY + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > b + * n_DECLARATION_PARAMETER_LIST + > ( + > ? + * n_DECLARATION_PARAMETER + * n_NULLABLE_TYPE + * n_CLASS_NAME + > SomeClass + > " " + * n_VARIABLE + > $x + * n_EMPTY + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" diff --git a/src/parser/xhpast/__tests__/data/php-access-on-instanciation-invalid.test b/src/parser/xhpast/__tests__/data/php-access-on-instanciation-invalid.test new file mode 100644 index 00000000..9b1b3d22 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-access-on-instanciation-invalid.test @@ -0,0 +1,13 @@ +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 index 00000000..580fa60d --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-access-on-instanciation.test @@ -0,0 +1,145 @@ +b; + +$e = (new a)->c(); + +(new a)->b; + +(new a)->c(); +~~~~~~~~~~ +pass +~~~~~~~~~~ +* n_PROGRAM + * n_STATEMENT_LIST + * n_OPEN_TAG + > "\n\n" + * n_STATEMENT + * n_CLASS_DECLARATION + * n_CLASS_ATTRIBUTES + > class + > " " + * n_CLASS_NAME + > a + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > "\n " + * n_STATEMENT + * n_CLASS_MEMBER_DECLARATION_LIST + * n_CLASS_MEMBER_MODIFIER_LIST + * n_STRING + > public + > " " + * n_CLASS_MEMBER_DECLARATION + * n_VARIABLE + > $b + * n_EMPTY + > ; + > "\n\n " + * n_STATEMENT + * n_METHOD_DECLARATION + * n_METHOD_MODIFIER_LIST + * n_STRING + > public + * n_EMPTY + * n_STRING + > c + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > " " + > } + > "\n" + > } + > "\n\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $d + > " " + * n_OPERATOR + > = + > " " + * n_OBJECT_PROPERTY_ACCESS + * n_NEW + > ( + > new + > " " + * n_CLASS_NAME + > a + * n_EMPTY + > -> + * n_STRING + > b + > ; + > "\n\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $e + > " " + * n_OPERATOR + > = + > " " + * n_METHOD_CALL + * n_OBJECT_PROPERTY_ACCESS + * n_NEW + > ( + > new + > " " + * n_CLASS_NAME + > a + * n_EMPTY + > -> + * n_STRING + > c + * n_CALL_PARAMETER_LIST + > ( + > ) + > ; + > "\n\n" + * n_STATEMENT + * n_OBJECT_PROPERTY_ACCESS + * n_NEW + > ( + > new + > " " + * n_CLASS_NAME + > a + * n_EMPTY + > -> + * n_STRING + > b + > ; + > "\n\n" + * n_STATEMENT + * n_METHOD_CALL + * n_OBJECT_PROPERTY_ACCESS + * n_NEW + > ( + > new + > " " + * n_CLASS_NAME + > a + * n_EMPTY + > -> + * n_STRING + > c + * n_CALL_PARAMETER_LIST + > ( + > ) + > ; + > "\n" 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 index 00000000..46d11d21 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-array-dereference-2.test @@ -0,0 +1,43 @@ +getStatus()['running']) { + // do something +} +~~~~~~~~~~ +pass +~~~~~~~~~~ +* n_PROGRAM + * n_STATEMENT_LIST + * n_OPEN_TAG + > "\n\n" + * n_STATEMENT + * n_CONDITION_LIST + * n_IF + > if + > " " + * n_CONTROL_CONDITION + > ( + * n_METHOD_CALL + * n_OBJECT_PROPERTY_ACCESS + * n_VARIABLE + > $j + > -> + * n_STRING + > getStatus + * n_INDEX_ACCESS + * n_CALL_PARAMETER_LIST + > ( + > ) + > [ + * n_STRING_SCALAR + > 'running' + > ] + > ) + > " " + * n_STATEMENT_LIST + > { + > "\n " + > "// do something\n" + > } + > "\n" 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 index 00000000..beb098ac --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-array-dereference-3.test @@ -0,0 +1,45 @@ + "\n" + * n_STATEMENT + * n_CONDITION_LIST + * n_IF + > if + > " " + * n_CONTROL_CONDITION + > ( + * n_FUNCTION_CALL + * n_SYMBOL_NAME + > isset + * n_CALL_PARAMETER_LIST + > ( + * n_INDEX_ACCESS + * n_FUNCTION_CALL + * n_CLASS_STATIC_ACCESS + * n_CLASS_NAME + > self + > :: + * n_STRING + > getSearchStates + * n_CALL_PARAMETER_LIST + > ( + > ) + > [ + * n_VARIABLE + > $state + > ] + > ) + > ) + > " " + * n_STATEMENT_LIST + > { + > " " + > } + > "\n" diff --git a/src/parser/xhpast/__tests__/data/php-array-dereference-4.test b/src/parser/xhpast/__tests__/data/php-array-dereference-4.test new file mode 100644 index 00000000..ded857db --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-array-dereference-4.test @@ -0,0 +1,35 @@ + "\n" + * n_STATEMENT + * n_INDEX_ACCESS + * n_CLASS_STATIC_ACCESS + * n_CLASS_NAME + > XHPASTNode + > :: + * n_STRING + > NODE_TYPES + > [ + * n_STRING_SCALAR + > 'n_PROGRAM' + > ] + > ; + > "\n" + * n_STATEMENT + * n_INDEX_ACCESS + * n_STRING + > PHP_VERSION + > [ + * n_NUMERIC_SCALAR + > 0 + > ] + > ; + > "\n" diff --git a/src/parser/xhpast/__tests__/data/php-array-dereference.test b/src/parser/xhpast/__tests__/data/php-array-dereference.test new file mode 100644 index 00000000..2c1c1151 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-array-dereference.test @@ -0,0 +1,145 @@ + "\n\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > foo + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > "\n " + * n_STATEMENT + * n_RETURN + > return + > " " + * n_ARRAY_LITERAL + * n_ARRAY_VALUE_LIST + > [ + * n_ARRAY_VALUE + * n_EMPTY + * n_NUMERIC_SCALAR + > 1 + > , + * n_ARRAY_VALUE + * n_EMPTY + * n_NUMERIC_SCALAR + > 2 + > , + * n_ARRAY_VALUE + * n_EMPTY + * n_NUMERIC_SCALAR + > 3 + > ] + > ; + > "\n" + > } + > "\n\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $i + > " " + * n_OPERATOR + > = + > " " + * n_NUMERIC_SCALAR + > 1 + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > = + > " " + * n_INDEX_ACCESS + * n_FUNCTION_CALL + * n_SYMBOL_NAME + > foo + * n_CALL_PARAMETER_LIST + > ( + > ) + > [ + * n_NUMERIC_SCALAR + > 2 + > ] + > ; + > "\n\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $y + > " " + * n_OPERATOR + > = + > " " + * n_INDEX_ACCESS + * n_FUNCTION_CALL + * n_SYMBOL_NAME + > foo + * n_CALL_PARAMETER_LIST + > ( + > ) + > [ + * n_VARIABLE + > $i + > ] + > ; + > "\n\n" + * n_STATEMENT + * n_CONDITION_LIST + * n_IF + > if + > " " + * n_CONTROL_CONDITION + > ( + * n_FUNCTION_CALL + * n_SYMBOL_NAME + > isset + * n_CALL_PARAMETER_LIST + > ( + * n_INDEX_ACCESS + * n_FUNCTION_CALL + * n_SYMBOL_NAME + > foo + * n_CALL_PARAMETER_LIST + > ( + > ) + > [ + * n_NUMERIC_SCALAR + > 0 + > ] + > ) + > ) + > " " + * n_STATEMENT_LIST + > { + > " " + > } + > "\n" diff --git a/src/parser/xhpast/__tests__/data/php-binary-literal.php.test b/src/parser/xhpast/__tests__/data/php-binary-literal.php.test new file mode 100644 index 00000000..6d783319 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-binary-literal.php.test @@ -0,0 +1,13 @@ + " " + * n_STATEMENT + * n_NUMERIC_SCALAR + > 0b10 + > ; diff --git a/src/parser/xhpast/__tests__/data/php-callable-typehint.php.test b/src/parser/xhpast/__tests__/data/php-callable-typehint.php.test new file mode 100644 index 00000000..2153d006 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-callable-typehint.php.test @@ -0,0 +1,33 @@ + "\n\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > f + * n_DECLARATION_PARAMETER_LIST + > ( + * n_DECLARATION_PARAMETER + * n_TYPE_NAME + > callable + > " " + * n_VARIABLE + > $c + * n_EMPTY + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" diff --git a/src/parser/xhpast/__tests__/data/php-class-expr.php.test b/src/parser/xhpast/__tests__/data/php-class-expr.php.test new file mode 100644 index 00000000..97726be7 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-class-expr.php.test @@ -0,0 +1,5 @@ + "\n\n" + > "# comment\n" + > "// comment\n" + > "/* comment */" + > "\n" + > "/**\n * comment\n */" + > "\n" + > "/* unterminated comment\n" diff --git a/src/parser/xhpast/__tests__/data/php-empty-heredoc.php.test b/src/parser/xhpast/__tests__/data/php-empty-heredoc.php.test new file mode 100644 index 00000000..905cf11b --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-empty-heredoc.php.test @@ -0,0 +1,24 @@ + "\n\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $a + > " " + * n_OPERATOR + > = + > " " + * n_HEREDOC + > "<< ; + > "\n" diff --git a/src/parser/xhpast/__tests__/data/php-finally.php.test b/src/parser/xhpast/__tests__/data/php-finally.php.test new file mode 100644 index 00000000..49fd798a --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-finally.php.test @@ -0,0 +1,36 @@ + " " + * n_STATEMENT + * n_TRY + > try + > " " + * n_STATEMENT_LIST + > { + > } + > " " + * n_CATCH_LIST + * n_CATCH + > catch + > " " + > ( + * n_CLASS_NAME + > C + > " " + * n_VARIABLE + > $x + > ) + > " " + * n_STATEMENT_LIST + > { + > } + > " " + * n_FINALLY + * n_STATEMENT_LIST + > "\n" diff --git a/src/parser/xhpast/__tests__/data/php-foreach-list.php.test b/src/parser/xhpast/__tests__/data/php-foreach-list.php.test new file mode 100644 index 00000000..df3b1216 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-foreach-list.php.test @@ -0,0 +1,3 @@ + " " + * n_STATEMENT + * n_INDEX_ACCESS + * n_ARRAY_LITERAL + * n_ARRAY_VALUE_LIST + > [ + * n_ARRAY_VALUE + * n_EMPTY + * n_NUMERIC_SCALAR + > 1 + > ] + > [ + * n_NUMERIC_SCALAR + > 0 + > ] + > ; + > " " + * n_STATEMENT + * n_INDEX_ACCESS + * n_STRING_SCALAR + > "\"X\"" + > [ + * n_NUMERIC_SCALAR + > 0 + > ] + > ; + > "\n" diff --git a/src/parser/xhpast/__tests__/data/php-literals.php.test b/src/parser/xhpast/__tests__/data/php-literals.php.test new file mode 100644 index 00000000..91811b5e --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-literals.php.test @@ -0,0 +1,88 @@ + "\n\n" + * n_STATEMENT + * n_NUMERIC_SCALAR + > 1 + > ; + > "\n" + * n_STATEMENT + * n_NUMERIC_SCALAR + > 1.1 + > ; + > "\n" + * n_STATEMENT + * n_UNARY_PREFIX_EXPRESSION + * n_OPERATOR + > - + * n_NUMERIC_SCALAR + > 1 + > ; + > "\n" + * n_STATEMENT + * n_UNARY_PREFIX_EXPRESSION + * n_OPERATOR + > - + * n_NUMERIC_SCALAR + > 1.1 + > ; + > "\n" + * n_STATEMENT + * n_NUMERIC_SCALAR + > 1e1 + > ; + > "\n" + * n_STATEMENT + * n_NUMERIC_SCALAR + > 0xFF + > ; + > "\n" + * n_STATEMENT + * n_STRING_SCALAR + > 'a' + > ; + > "\n" + * n_STATEMENT + * n_STRING_SCALAR + > "\"a\"" + > ; + > "\n" + * n_STATEMENT + * n_BACKTICKS_EXPRESSION + > `a` + > ; + > "\n" + * n_STATEMENT + * n_STRING_SCALAR + > b'a' + > ; + > "\n" + * n_STATEMENT + * n_STRING_SCALAR + > "b\"a\"" + > ; + > "\n" + * n_LABEL + * n_STRING + > lbl + > : + > "\n" diff --git a/src/parser/xhpast/__tests__/data/php-nested-quotes.test b/src/parser/xhpast/__tests__/data/php-nested-quotes.test new file mode 100644 index 00000000..19712b56 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-nested-quotes.test @@ -0,0 +1,5 @@ + " " + * n_STATEMENT + * n_TRY + > try + > " " + * n_STATEMENT_LIST + > { + > } + * n_CATCH_LIST + * n_FINALLY + * n_STATEMENT_LIST + > "\n" diff --git a/src/parser/xhpast/__tests__/data/php-short-array.php.test b/src/parser/xhpast/__tests__/data/php-short-array.php.test new file mode 100644 index 00000000..58f8da99 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-short-array.php.test @@ -0,0 +1,16 @@ + " " + * n_STATEMENT + * n_ARRAY_LITERAL + * n_ARRAY_VALUE_LIST + > [ + > ] + > ; + > "\n" diff --git a/src/parser/xhpast/__tests__/data/php-syntax.php.test b/src/parser/xhpast/__tests__/data/php-syntax.php.test new file mode 100644 index 00000000..5172d414 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-syntax.php.test @@ -0,0 +1,2492 @@ + $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 +~~~~~~~~~~ +* n_PROGRAM + * n_STATEMENT_LIST + * n_OPEN_TAG + > "\n\n" + * n_STATEMENT + * n_NUMERIC_SCALAR + > 1 + > ; + > "\n" + * n_STATEMENT + * n_ARRAY_LITERAL + > array + * n_ARRAY_VALUE_LIST + > ( + * n_ARRAY_VALUE + * n_EMPTY + * n_NUMERIC_SCALAR + > 1 + > ) + > ; + > "\n\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > f + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > f1 + * n_DECLARATION_PARAMETER_LIST + > ( + * n_DECLARATION_PARAMETER + * n_EMPTY + * n_VARIABLE + > $x + * n_EMPTY + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_REFERENCE + > & + * n_STRING + > f2 + * n_DECLARATION_PARAMETER_LIST + > ( + * n_DECLARATION_PARAMETER + * n_EMPTY + * n_VARIABLE + > $x + * n_EMPTY + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > f3 + * n_DECLARATION_PARAMETER_LIST + > ( + * n_DECLARATION_PARAMETER + * n_EMPTY + * n_VARIABLE_REFERENCE + > & + * n_VARIABLE + > $x + * n_EMPTY + > $x + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_REFERENCE + > & + * n_STRING + > f4 + * n_DECLARATION_PARAMETER_LIST + > ( + * n_DECLARATION_PARAMETER + * n_EMPTY + * n_VARIABLE_REFERENCE + > & + * n_VARIABLE + > $x + * n_EMPTY + > $x + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > f5 + * n_DECLARATION_PARAMETER_LIST + > ( + * n_DECLARATION_PARAMETER + * n_CLASS_NAME + > C + > " " + * n_VARIABLE + > $x + * n_EMPTY + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > f6 + * n_DECLARATION_PARAMETER_LIST + > ( + * n_DECLARATION_PARAMETER + * n_TYPE_NAME + > array + > " " + * n_VARIABLE + > $x + * n_EMPTY + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > f7 + * n_DECLARATION_PARAMETER_LIST + > ( + * n_DECLARATION_PARAMETER + * n_TYPE_NAME + > array + > " " + * n_VARIABLE + > $x + > " " + > = + > " " + * n_ARRAY_LITERAL + > array + * n_ARRAY_VALUE_LIST + > ( + > ) + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > f8 + * n_DECLARATION_PARAMETER_LIST + > ( + * n_DECLARATION_PARAMETER + * n_EMPTY + * n_VARIABLE + > $x + > " " + > = + > " " + * n_SYMBOL_NAME + > null + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > f9 + * n_DECLARATION_PARAMETER_LIST + > ( + * n_DECLARATION_PARAMETER + * n_CLASS_NAME + > C + > " " + * n_VARIABLE + > $x + > " " + > = + > " " + * n_SYMBOL_NAME + > null + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n\n" + * n_STATEMENT + * n_CLASS_DECLARATION + * n_CLASS_ATTRIBUTES + > class + > " " + * n_CLASS_NAME + > A + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_CLASS_DECLARATION + * n_CLASS_ATTRIBUTES + > class + > " " + * n_CLASS_NAME + > B + > " " + * n_EXTENDS_LIST + > extends + > " " + * n_CLASS_NAME + > C + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_CLASS_DECLARATION + * n_CLASS_ATTRIBUTES + > class + > " " + * n_CLASS_NAME + > D + > " " + * n_EXTENDS_LIST + > extends + > " " + * n_CLASS_NAME + > E + > " " + * n_IMPLEMENTS_LIST + > implements + > " " + * n_CLASS_NAME + > F + > " " + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_CLASS_DECLARATION + * n_CLASS_ATTRIBUTES + > class + > " " + * n_CLASS_NAME + > G + > " " + * n_EXTENDS_LIST + > extends + > " " + * n_CLASS_NAME + > H + > " " + * n_IMPLEMENTS_LIST + > implements + > " " + * n_CLASS_NAME + > J + > , + > " " + * n_CLASS_NAME + > K + > " " + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_CLASS_DECLARATION + * n_CLASS_ATTRIBUTES + * n_STRING + > final + > " " + > class + > " " + * n_CLASS_NAME + > L + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_CLASS_DECLARATION + * n_CLASS_ATTRIBUTES + * n_STRING + > abstract + > " " + > class + > " " + * n_CLASS_NAME + > M + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n\n" + * n_STATEMENT + * n_CLASS_DECLARATION + * n_CLASS_ATTRIBUTES + * n_STRING + > final + > " " + > class + > " " + * n_CLASS_NAME + > T + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > "\n " + * n_STATEMENT + * n_CLASS_CONSTANT_DECLARATION_LIST + > const + > " " + * n_CLASS_CONSTANT_DECLARATION + * n_STRING + > C + > " " + > = + > " " + * n_NUMERIC_SCALAR + > 1 + > ; + > "\n " + * n_STATEMENT + * n_CLASS_CONSTANT_DECLARATION_LIST + > const + > " " + * n_CLASS_CONSTANT_DECLARATION + * n_STRING + > D + > " " + > = + > " " + * n_NUMERIC_SCALAR + > 1 + > , + > " " + * n_CLASS_CONSTANT_DECLARATION + * n_STRING + > E + > " " + > = + > " " + * n_NUMERIC_SCALAR + > 1 + > ; + > "\n\n " + * n_STATEMENT + * n_CLASS_MEMBER_DECLARATION_LIST + * n_CLASS_MEMBER_MODIFIER_LIST + * n_STRING + > var + > " " + * n_CLASS_MEMBER_DECLARATION + * n_VARIABLE + > $f + * n_EMPTY + > ; + > "\n " + * n_STATEMENT + * n_CLASS_MEMBER_DECLARATION_LIST + * n_CLASS_MEMBER_MODIFIER_LIST + * n_STRING + > var + > " " + * n_CLASS_MEMBER_DECLARATION + * n_VARIABLE + > $g + * n_EMPTY + > , + > " " + * n_CLASS_MEMBER_DECLARATION + * n_VARIABLE + > $h + * n_EMPTY + > ; + > "\n " + * n_STATEMENT + * n_CLASS_MEMBER_DECLARATION_LIST + * n_CLASS_MEMBER_MODIFIER_LIST + * n_STRING + > public + > " " + * n_CLASS_MEMBER_DECLARATION + * n_VARIABLE + > $i + * n_EMPTY + > ; + > "\n " + * n_STATEMENT + * n_CLASS_MEMBER_DECLARATION_LIST + * n_CLASS_MEMBER_MODIFIER_LIST + * n_STRING + > protected + > " " + * n_CLASS_MEMBER_DECLARATION + * n_VARIABLE + > $j + * n_EMPTY + > , + > " " + * n_CLASS_MEMBER_DECLARATION + * n_VARIABLE + > $k + * n_EMPTY + > ; + > "\n " + * n_STATEMENT + * n_CLASS_MEMBER_DECLARATION_LIST + * n_CLASS_MEMBER_MODIFIER_LIST + * n_STRING + > private + > " " + * n_CLASS_MEMBER_DECLARATION + * n_VARIABLE + > $l + > " " + > = + > " " + * n_NUMERIC_SCALAR + > 3 + > ; + > "\n " + * n_STATEMENT + * n_CLASS_MEMBER_DECLARATION_LIST + * n_CLASS_MEMBER_MODIFIER_LIST + * n_STRING + > public + > " " + * n_STRING + > static + > " " + * n_CLASS_MEMBER_DECLARATION + * n_VARIABLE + > $m + > " " + > = + > " " + * n_NUMERIC_SCALAR + > 4 + > , + > " " + * n_CLASS_MEMBER_DECLARATION + * n_VARIABLE + > $n + > " " + > = + > " " + * n_NUMERIC_SCALAR + > 5 + > ; + > "\n\n\n " + * n_STATEMENT + * n_METHOD_DECLARATION + * n_METHOD_MODIFIER_LIST + * n_EMPTY + * n_STRING + > m + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n " + * n_STATEMENT + * n_METHOD_DECLARATION + * n_METHOD_MODIFIER_LIST + * n_STRING + > public + * n_EMPTY + * n_STRING + > m2 + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n " + * n_STATEMENT + * n_METHOD_DECLARATION + * n_METHOD_MODIFIER_LIST + * n_STRING + > protected + * n_EMPTY + * n_STRING + > m3 + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n " + * n_STATEMENT + * n_METHOD_DECLARATION + * n_METHOD_MODIFIER_LIST + * n_STRING + > private + * n_EMPTY + * n_STRING + > m4 + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n " + * n_STATEMENT + * n_METHOD_DECLARATION + * n_METHOD_MODIFIER_LIST + * n_REFERENCE + > & + * n_STRING + > n + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n " + * n_STATEMENT + * n_METHOD_DECLARATION + * n_METHOD_MODIFIER_LIST + * n_STRING + > static + * n_EMPTY + * n_STRING + > n1 + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + > } + > "\n\n" + * n_STATEMENT + * n_CLASS_DECLARATION + * n_CLASS_ATTRIBUTES + * n_STRING + > abstract + > " " + > class + > " " + * n_CLASS_NAME + > U + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > "\n " + * n_STATEMENT + * n_METHOD_DECLARATION + * n_METHOD_MODIFIER_LIST + * n_STRING + > abstract + * n_EMPTY + * n_STRING + > v + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_EMPTY + * n_EMPTY + > ; + > "\n" + > } + > "\n\n" + * n_STATEMENT + * n_INTERFACE_DECLARATION + * n_CLASS_ATTRIBUTES + * n_CLASS_NAME + > N + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_INTERFACE_DECLARATION + * n_CLASS_ATTRIBUTES + * n_CLASS_NAME + > O + > " " + * n_EXTENDS_LIST + > extends + > " " + * n_CLASS_NAME + > P + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_INTERFACE_DECLARATION + * n_CLASS_ATTRIBUTES + * n_CLASS_NAME + > Q + > " " + * n_EXTENDS_LIST + > extends + > " " + * n_CLASS_NAME + > R + > , + > " " + * n_CLASS_NAME + > S + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n\n" + * n_STATEMENT + * n_USE_LIST + > use + > " " + * n_USE + * n_SYMBOL_NAME + > z + * n_EMPTY + > ; + > "\n" + * n_STATEMENT + * n_USE_LIST + > use + > " " + * n_USE + * n_SYMBOL_NAME + > aa + * n_EMPTY + > , + > " " + * n_USE + * n_SYMBOL_NAME + > ab + * n_EMPTY + > ; + > "\n" + * n_STATEMENT + * n_USE_LIST + > use + > " " + * n_USE + * n_SYMBOL_NAME + > qq + > " " + > as + > " " + * n_STRING + > rr + > , + > " " + * n_USE + * n_SYMBOL_NAME + > mm + > " " + > as + > " " + * n_STRING + > nn + > , + > " " + * n_USE + * n_SYMBOL_NAME + > "\" + > oo + * n_EMPTY + > , + > " " + * n_USE + * n_SYMBOL_NAME + > "\" + > pp + > " " + > as + > " " + * n_STRING + > qq + > ; + > "\n" + * n_STATEMENT + * n_CONSTANT_DECLARATION_LIST + > const + > " " + * n_CONSTANT_DECLARATION + * n_STRING + > F + > " " + > = + > " " + * n_NUMERIC_SCALAR + > 1 + > ; + > "\n" + * n_STATEMENT + * n_CONSTANT_DECLARATION_LIST + > const + > " " + * n_CONSTANT_DECLARATION + * n_STRING + > G + > " " + > = + > " " + * n_NUMERIC_SCALAR + > 2 + > , + > " " + * n_CONSTANT_DECLARATION + * n_STRING + > H + > " " + > = + > " " + * n_NUMERIC_SCALAR + > 3 + > ; + > "\n" + * n_LABEL + * n_STRING + > lbl + > : + > "\n\n" + * n_STATEMENT + * n_CONDITION_LIST + * n_IF + > if + > " " + * n_CONTROL_CONDITION + > ( + * n_NUMERIC_SCALAR + > 1 + > ) + > " " + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_CONDITION_LIST + * n_IF + > if + > " " + * n_CONTROL_CONDITION + > ( + * n_NUMERIC_SCALAR + > 1 + > ) + > " " + * n_STATEMENT_LIST + > { + > } + > " " + * n_ELSE + > else + > " " + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_CONDITION_LIST + * n_IF + > if + > " " + * n_CONTROL_CONDITION + > ( + * n_NUMERIC_SCALAR + > 1 + > ) + > " " + * n_STATEMENT_LIST + > { + > } + > " " + * n_ELSEIF + > elseif + > " " + * n_CONTROL_CONDITION + > ( + * n_NUMERIC_SCALAR + > 2 + > ) + > " " + * n_STATEMENT_LIST + > { + > } + > " " + * n_ELSE + > else + > " " + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_CONDITION_LIST + * n_IF + > if + > " " + * n_CONTROL_CONDITION + > ( + * n_NUMERIC_SCALAR + > 1 + > ) + > " " + * n_STATEMENT_LIST + > { + > } + > " " + * n_ELSEIF + > elseif + > " " + * n_CONTROL_CONDITION + > ( + * n_NUMERIC_SCALAR + > 2 + > ) + > " " + * n_STATEMENT_LIST + > { + > } + > " " + * n_ELSEIF + > elseif + > " " + * n_CONTROL_CONDITION + > ( + * n_NUMERIC_SCALAR + > 3 + > ) + > " " + * n_STATEMENT_LIST + > { + > } + > "\n\n" + * n_STATEMENT + * n_CONDITION_LIST + * n_IF + > if + > " " + * n_CONTROL_CONDITION + > ( + * n_NUMERIC_SCALAR + > 1 + > ) + * n_STATEMENT_LIST + * n_EMPTY + > ; + > "\n\n" + * n_STATEMENT + * n_CONDITION_LIST + * n_IF + > if + > " " + * n_CONTROL_CONDITION + > ( + * n_NUMERIC_SCALAR + > 1 + > ) + * n_STATEMENT_LIST + > : + > "\n" + * n_ELSE + * n_STATEMENT_LIST + > : + > "\n" + > endif + > ; + > "\n\n" + * n_STATEMENT + * n_CONDITION_LIST + * n_IF + > if + > " " + * n_CONTROL_CONDITION + > ( + * n_NUMERIC_SCALAR + > 1 + > ) + * n_STATEMENT_LIST + > : + > "\n" + * n_ELSEIF + > elseif + > " " + > ( + * n_NUMERIC_SCALAR + > 2 + * n_STATEMENT_LIST + * n_EMPTY + > ; + > "\n\n" + * n_STATEMENT + * n_CONDITION_LIST + * n_IF + > if + > " " + * n_CONTROL_CONDITION + > ( + * n_NUMERIC_SCALAR + > 1 + > ) + * n_STATEMENT_LIST + > : + > "\n" + * n_ELSEIF + > elseif + > " " + > ( + * n_NUMERIC_SCALAR + > 2 + * n_STATEMENT_LIST + > ) + > : + > "\n" + * n_ELSEIF + > elseif + > " " + > ( + * n_NUMERIC_SCALAR + > 3 + * n_STATEMENT_LIST + * n_EMPTY + > ; + > "\n\n" + * n_STATEMENT + * n_WHILE + > while + > " " + * n_CONTROL_CONDITION + > ( + * n_NUMERIC_SCALAR + > 1 + > ) + > " " + * n_STATEMENT_LIST + > { + > } + > "\n\n" + * n_STATEMENT + * n_WHILE + > while + > " " + * n_CONTROL_CONDITION + > ( + * n_NUMERIC_SCALAR + > 1 + > ) + * n_STATEMENT_LIST + > : + > "\n" + > endwhile + > ; + > "\n\n" + * n_STATEMENT + * n_DO_WHILE + > do + > " " + * n_STATEMENT_LIST + > { + > } + > " " + > while + > " " + * n_CONTROL_CONDITION + > ( + * n_NUMERIC_SCALAR + > 1 + > ) + > ; + > "\n\n\n" + * n_STATEMENT + * n_FOR + > for + > " " + * n_FOR_EXPRESSION + * n_EMPTY + * n_EMPTY + * n_EMPTY + > " " + * n_STATEMENT_LIST + > { + > } + > "\n\n" + * n_STATEMENT + * n_FOR + > for + > " " + * n_FOR_EXPRESSION + * n_EMPTY + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > : + > "\n" + > endfor + > ; + > "\n\n" + * n_STATEMENT + * n_SWITCH + > switch + > " " + * n_CONTROL_CONDITION + > ( + * n_NUMERIC_SCALAR + > 1 + > ) + > " " + * n_STATEMENT_LIST + > { + > "\n " + * n_CASE + > case + > " " + * n_NUMERIC_SCALAR + > 1 + > : + > "\n " + * n_STATEMENT_LIST + * n_STATEMENT + * n_BREAK + * n_EMPTY + > ; + > "\n " + * n_CASE + > case + > " " + * n_NUMERIC_SCALAR + > 2 + > ; + > "\n " + * n_STATEMENT_LIST + * n_STATEMENT + * n_BREAK + * n_EMPTY + > ; + > "\n " + * n_DEFAULT + > default + > : + > "\n " + * n_STATEMENT_LIST + * n_STATEMENT + * n_CONTINUE + * n_EMPTY + > ; + > "\n" + > } + > "\n\n" + * n_STATEMENT + * n_SWITCH + > switch + * n_CONTROL_CONDITION + > ( + * n_NUMERIC_SCALAR + > 1 + > ) + > " " + * n_STATEMENT_LIST + > { + * n_STATEMENT + > ; + > } + > "\n" + * n_STATEMENT + * n_SWITCH + > switch + * n_CONTROL_CONDITION + > ( + * n_NUMERIC_SCALAR + > 1 + > ) + * n_STATEMENT_LIST + > : + > "\n" + > endswitch + > ; + > "\n\n" + * n_STATEMENT + * n_BREAK + * n_EMPTY + > ; + > "\n" + * n_STATEMENT + * n_BREAK + > break + > " " + * n_NUMERIC_SCALAR + > 1 + > ; + > "\n" + * n_STATEMENT + * n_CONTINUE + * n_EMPTY + > ; + > "\n" + * n_STATEMENT + * n_CONTINUE + > continue + > " " + * n_NUMERIC_SCALAR + > 1 + > ; + > "\n" + * n_STATEMENT + * n_RETURN + * n_EMPTY + > ; + > "\n" + * n_STATEMENT + * n_RETURN + > return + > " " + * n_NUMERIC_SCALAR + > 1 + > ; + > "\n" + * n_STATEMENT + * n_RETURN + > return + > " " + * n_VARIABLE + > $x + > ; + > "\n\n" + * n_STATEMENT + * n_GLOBAL_DECLARATION_LIST + > global + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_GLOBAL_DECLARATION_LIST + > global + > " " + * n_VARIABLE + > $x + > , + > " " + * n_VARIABLE + > $y + > ; + > "\n" + * n_STATEMENT + * n_GLOBAL_DECLARATION_LIST + > global + > " " + * n_VARIABLE_VARIABLE + > $ + * n_VARIABLE + > $q + > ; + > "\n" + * n_STATEMENT + * n_GLOBAL_DECLARATION_LIST + > global + > " " + * n_VARIABLE_VARIABLE + > $ + > { + * n_CONCATENATION_LIST + * n_VARIABLE + > $z + * n_OPERATOR + > . + * n_VARIABLE + > $z + > } + > ; + > "\n" + * n_STATEMENT + * n_STATIC_DECLARATION_LIST + > static + > " " + * n_STATIC_DECLARATION + * n_VARIABLE + > $x + * n_EMPTY + > ; + > "\n" + * n_STATEMENT + * n_STATIC_DECLARATION_LIST + > static + > " " + * n_STATIC_DECLARATION + * n_VARIABLE + > $x + * n_EMPTY + > , + > " " + * n_STATIC_DECLARATION + * n_VARIABLE + > $y + * n_EMPTY + > ; + > "\n\n" + * n_STATEMENT + * n_ECHO_LIST + > echo + > " " + * n_NUMERIC_SCALAR + > 1 + > ; + > "\n" + * n_STATEMENT + * n_ECHO_LIST + > echo + > " " + * n_NUMERIC_SCALAR + > 1 + > , + > " " + * n_NUMERIC_SCALAR + > 2 + > ; + > "\n\n" + * n_STATEMENT + * n_UNSET_LIST + > unset + > ( + * n_VARIABLE + > $a + > , + > " " + * n_VARIABLE + > $b + > ) + > ; + > "\n\n" + * n_STATEMENT + * n_FOREACH + > foreach + > " " + * n_FOREACH_EXPRESSION + > ( + * n_VARIABLE + > $x + * n_EMPTY + * n_VARIABLE + > $y + > ) + > " " + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_FOREACH + > foreach + > " " + * n_FOREACH_EXPRESSION + > ( + * n_VARIABLE + > $x + > " " + > as + > " " + * n_VARIABLE + > $k + > " " + > => + > " " + * n_VARIABLE + > $y + > ) + > " " + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_FOREACH + > foreach + > " " + * n_FOREACH_EXPRESSION + > ( + * n_VARIABLE + > $x + > " " + > as + > " " + * n_VARIABLE + > $k + > " " + > => + > " " + * n_VARIABLE_REFERENCE + > & + * n_VARIABLE + > $y + > ) + > " " + * n_STATEMENT_LIST + > { + > } + > "\n\n" + * n_STATEMENT + * n_FOREACH + > foreach + > " " + * n_FOREACH_EXPRESSION + > ( + * n_ARRAY_LITERAL + > array + * n_ARRAY_VALUE_LIST + > ( + > ) + * n_EMPTY + * n_VARIABLE + > $x + > ) + > " " + * n_STATEMENT_LIST + > { + > } + > "\n" + * n_STATEMENT + * n_FOREACH + > foreach + > " " + * n_FOREACH_EXPRESSION + > ( + * n_ARRAY_LITERAL + > array + * n_ARRAY_VALUE_LIST + > ( + > ) + > " " + > as + > " " + * n_VARIABLE + > $k + > " " + > => + > " " + * n_VARIABLE + > $y + > ) + > " " + * n_STATEMENT_LIST + > { + > } + > "\n\n" + * n_STATEMENT + * n_FOREACH + > foreach + > " " + * n_FOREACH_EXPRESSION + > ( + * n_VARIABLE + > $x + * n_EMPTY + * n_VARIABLE + > $y + > ) + * n_STATEMENT_LIST + > : + > "\n" + > endforeach + > ; + > "\n\n" + * n_STATEMENT + * n_DECLARE + > declare + > ( + * n_DECLARE_DECLARATION_LIST + * n_DECLARE_DECLARATION + * n_STRING + > x + > = + * n_NUMERIC_SCALAR + > 1 + > ) + * n_STATEMENT + * n_EMPTY + > "\n\n" + * n_STATEMENT + * n_DECLARE + > declare + > ( + * n_DECLARE_DECLARATION_LIST + * n_DECLARE_DECLARATION + * n_STRING + > y + > = + * n_NUMERIC_SCALAR + > 1 + > ) + > " " + * n_STATEMENT_LIST + > { + > "\n" + > } + > "\n\n" + * n_STATEMENT + * n_DECLARE + > declare + > ( + * n_DECLARE_DECLARATION_LIST + * n_DECLARE_DECLARATION + * n_STRING + > z + > = + * n_NUMERIC_SCALAR + > 1 + > ) + * n_STATEMENT_LIST + > : + > "\n" + > enddeclare + > ; + > "\n\n" + * n_STATEMENT + * n_TRY + > try + > " " + * n_STATEMENT_LIST + > { + > } + > " " + * n_CATCH_LIST + * n_CATCH + > catch + > " " + > ( + * n_CLASS_NAME + > C + > " " + * n_VARIABLE + > $x + > ) + > " " + * n_STATEMENT_LIST + > { + > } + * n_EMPTY + > "\n" + * n_STATEMENT + * n_TRY + > try + > " " + * n_STATEMENT_LIST + > { + > } + > " " + * n_CATCH_LIST + * n_CATCH + > catch + > " " + > ( + * n_CLASS_NAME + > C + > " " + * n_VARIABLE + > $x + > ) + > " " + * n_STATEMENT_LIST + > { + > } + > " " + * n_CATCH + > catch + > " " + > ( + * n_CLASS_NAME + > D + > " " + * n_VARIABLE + > $x + > ) + > " " + * n_STATEMENT_LIST + > { + > } + * n_EMPTY + > "\n\n" + * n_STATEMENT + * n_THROW + > throw + > " " + * n_NUMERIC_SCALAR + > 1 + > ; + > "\n\n" + * n_STATEMENT + * n_UNARY_PREFIX_EXPRESSION + * n_OPERATOR + > clone + > " " + * n_VARIABLE + > $q + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > + + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > - + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > * + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > / + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_CONCATENATION_LIST + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > . + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > % + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > & + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > | + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > ^ + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > << + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > >> + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_UNARY_POSTFIX_EXPRESSION + * n_VARIABLE + > $x + * n_OPERATOR + > ++ + > ; + > "\n" + * n_STATEMENT + * n_UNARY_PREFIX_EXPRESSION + * n_OPERATOR + > ++ + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_UNARY_POSTFIX_EXPRESSION + * n_VARIABLE + > $x + * n_OPERATOR + > -- + > ; + > "\n" + * n_STATEMENT + * n_UNARY_PREFIX_EXPRESSION + * n_OPERATOR + > -- + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_UNARY_PREFIX_EXPRESSION + * n_OPERATOR + > + + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_UNARY_PREFIX_EXPRESSION + * n_OPERATOR + > - + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_UNARY_PREFIX_EXPRESSION + * n_OPERATOR + > ! + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_UNARY_PREFIX_EXPRESSION + * n_OPERATOR + > ~ + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > == + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > === + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > != + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > !== + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > = + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > < + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > <= + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > > + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > >= + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > instanceof + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_PARENTHETICAL_EXPRESSION + > ( + * n_VARIABLE + > $x + > ) + > ; + > "\n" + * n_STATEMENT + * n_PARENTHETICAL_EXPRESSION + > ( + * n_TERNARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > ? + > " " + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > : + > " " + * n_VARIABLE + > $x + > ) + > ; + > "\n" + * n_STATEMENT + * n_PARENTHETICAL_EXPRESSION + > ( + * n_TERNARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > ? + * n_EMPTY + * n_OPERATOR + > : + > " " + * n_VARIABLE + > $x + > ) + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > || + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > && + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > and + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > or + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > xor + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > += + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > -= + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > *= + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > /= + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > .= + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > %= + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > &= + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > |= + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > ^= + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > <<= + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $x + > " " + * n_OPERATOR + > >>= + > " " + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_CAST_EXPRESSION + * n_CAST + > (int) + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_CAST_EXPRESSION + * n_CAST + > (double) + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_CAST_EXPRESSION + * n_CAST + > (string) + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_CAST_EXPRESSION + * n_CAST + > (binary) + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_CAST_EXPRESSION + * n_CAST + > (array) + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_CAST_EXPRESSION + * n_CAST + > (object) + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_CAST_EXPRESSION + * n_CAST + > (bool) + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_CAST_EXPRESSION + * n_CAST + > (unset) + * n_VARIABLE + > $x + > ; + > "\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_INDEX_ACCESS + * n_VARIABLE + > $x + * n_EMPTY + > " " + * n_OPERATOR + > = + > " " + * n_VARIABLE + > $x + > ; + > "\n\n" + * n_STATEMENT + * n_UNARY_PREFIX_EXPRESSION + * n_OPERATOR + > @ + * n_VARIABLE + > $x + > ; + > "\n\n" + * n_STATEMENT + * n_MAGIC_SCALAR + > __LINE__ + > ; + > "\n" + * n_STATEMENT + * n_MAGIC_SCALAR + > __FILE__ + > ; + > "\n" + * n_STATEMENT + * n_MAGIC_SCALAR + > __DIR__ + > ; + > "\n" + * n_STATEMENT + * n_MAGIC_SCALAR + > __CLASS__ + > ; + > "\n" + * n_STATEMENT + * n_MAGIC_SCALAR + > __METHOD__ + > ; + > "\n" + * n_STATEMENT + * n_MAGIC_SCALAR + > __FUNCTION__ + > ; + > "\n" + * n_STATEMENT + * n_MAGIC_SCALAR + > __NAMESPACE__ + > ; + > "\n\n" + * n_STATEMENT + * n_GOTO + > goto + > " " + * n_STRING + > lbl + > ; + > "\n" 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 index 00000000..ae0412ee --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-tags.php.test @@ -0,0 +1,48 @@ + + + +
+ +~~~~~~~~~~ +pass, comment="Omits ASP tags since parser support is off as built." +~~~~~~~~~~ +* n_PROGRAM + * n_STATEMENT_LIST + * n_OPEN_TAG + > " " + * n_STATEMENT + * n_NUMERIC_SCALAR + > 1 + > ; + > " " + * n_STATEMENT + * n_EMPTY + * n_OPEN_TAG + > " " + * n_STATEMENT + * n_NUMERIC_SCALAR + > 1 + > ; + > " " + * n_STATEMENT + * n_EMPTY + * n_OPEN_TAG + > " " + * n_STATEMENT + * n_NUMERIC_SCALAR + > 1 + > ; + > " " + * n_STATEMENT + * n_EMPTY + * n_INLINE_HTML + > < + * n_INLINE_HTML + > "a />\n" + * n_INLINE_HTML + > < + * n_INLINE_HTML + > "b ?>\n" 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 index 00000000..dadffde5 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-traits.php.test @@ -0,0 +1,215 @@ + "\n\n" + * n_STATEMENT + * n_CLASS_DECLARATION + * n_CLASS_ATTRIBUTES + * n_STRING + > trait + > " " + * n_CLASS_NAME + > T + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > "\n " + * n_STATEMENT + * n_METHOD_DECLARATION + * n_METHOD_MODIFIER_LIST + * n_EMPTY + * n_STRING + > f + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > } + > "\n" + > } + > "\n\n" + * n_STATEMENT + * n_CLASS_DECLARATION + * n_CLASS_ATTRIBUTES + > class + > " " + * n_CLASS_NAME + > C + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > "\n " + * n_TRAIT_USE + > use + > " " + * n_CLASS_NAME + > T + * n_EMPTY + > ; + > "\n" + > } + > "\n\n" + * n_STATEMENT + * n_CLASS_DECLARATION + * n_CLASS_ATTRIBUTES + > class + > " " + * n_CLASS_NAME + > D + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > "\n " + * n_TRAIT_USE + > use + > " " + * n_CLASS_NAME + > T + > , + > " " + * n_CLASS_NAME + > U + * n_EMPTY + > ; + > "\n" + > } + > "\n\n" + * n_STATEMENT + * n_CLASS_DECLARATION + * n_CLASS_ATTRIBUTES + > class + > " " + * n_CLASS_NAME + > E + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > "\n " + * n_TRAIT_USE + > use + > " " + * n_CLASS_NAME + > T + > , + > " " + * n_CLASS_NAME + > U + > " " + * n_TRAIT_ADAPTATION_LIST + > { + > "\n " + * n_TRAIT_INSTEADOF + * n_TRAIT_METHOD_REFERENCE + > T + > :: + > x + > " " + > insteadof + > " " + * n_TRAIT_REFERENCE_LIST + * n_CLASS_NAME + > U + > ; + > "\n " + * n_TRAIT_AS + * n_TRAIT_METHOD_REFERENCE + > T + > :: + > x + * n_EMPTY + * n_STRING + > y + > ; + > "\n " + * n_TRAIT_AS + * n_TRAIT_METHOD_REFERENCE + > T + > :: + > z + > " " + > as + > " " + * n_METHOD_MODIFIER_LIST + * n_STRING + > private + > " " + * n_STRING + > z + > ; + > "\n " + > } + > "\n" + > } + > "\n\n" + * n_STATEMENT + * n_CLASS_DECLARATION + * n_CLASS_ATTRIBUTES + > class + > " " + * n_CLASS_NAME + > F + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > "\n " + * n_TRAIT_USE + > use + > " " + * n_CLASS_NAME + > Q + > " " + * n_TRAIT_ADAPTATION_LIST + > { + > " " + * n_TRAIT_AS + * n_TRAIT_METHOD_REFERENCE + * n_STRING + > q + > " " + > as + > " " + * n_STRING + > protected + * n_EMPTY + > " " + > } + > "\n" + > } + > "\n" diff --git a/src/parser/xhpast/__tests__/data/php-try-no-catch-or-finally.test b/src/parser/xhpast/__tests__/data/php-try-no-catch-or-finally.test new file mode 100644 index 00000000..f95f26e2 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/php-try-no-catch-or-finally.test @@ -0,0 +1,3 @@ + $z; + + $data = (yield $a); + $data = (yield $b => $c); +} +~~~~~~~~~~ +pass +~~~~~~~~~~ +* n_PROGRAM + * n_STATEMENT_LIST + * n_OPEN_TAG + > "\n\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > g + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > "\n " + * n_STATEMENT + * n_YIELD + * n_EMPTY + * n_EMPTY + > ; + > "\n " + * n_STATEMENT + * n_YIELD + > yield + > " " + * n_VARIABLE + * n_EMPTY + > ; + > "\n " + * n_STATEMENT + * n_YIELD + > yield + > " " + * n_VARIABLE + > $y + > " " + > => + > " " + * n_VARIABLE + > $z + > ; + > "\n\n " + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $data + > " " + * n_OPERATOR + > = + > " " + * n_YIELD + > ( + > yield + > " " + * n_VARIABLE + * n_EMPTY + > ) + > ; + > "\n " + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $data + > " " + * n_OPERATOR + > = + > " " + * n_YIELD + > ( + > yield + > " " + * n_VARIABLE + > $b + > " " + > => + > " " + * n_VARIABLE + > $c + > ) + > ; + > "\n" + > } + > "\n" 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 index 00000000..25160b77 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/return-type.php.test @@ -0,0 +1,440 @@ + "\n\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > a + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_CLASS_NAME + > string + > " " + * n_STATEMENT_LIST + > { + > } + > "\n\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > b + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_TYPE_NAME + > array + > " " + * n_STATEMENT_LIST + > { + > } + > "\n\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > c + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_TYPE_NAME + > callable + > " " + * n_STATEMENT_LIST + > { + > } + > "\n\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > d + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_NULLABLE_TYPE + * n_CLASS_NAME + > string + > " " + * n_STATEMENT_LIST + > { + > } + > "\n\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > e + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_CLASS_NAME + > void + > " " + * n_STATEMENT_LIST + > { + > } + > "\n\n" + > "// TODO: This shouldn't technically be allowed as it will cause a fatal er" + . "ror.\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > f + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_NULLABLE_TYPE + * n_CLASS_NAME + > void + > " " + * n_STATEMENT_LIST + > { + > } + > "\n\n" + * n_STATEMENT + * n_CLASS_DECLARATION + * n_CLASS_ATTRIBUTES + > class + > " " + * n_CLASS_NAME + > a + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > "\n " + * n_STATEMENT + * n_METHOD_DECLARATION + * n_METHOD_MODIFIER_LIST + * n_EMPTY + * n_STRING + > b + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_CLASS_NAME + > string + > " " + * n_STATEMENT_LIST + > { + > } + > "\n " + * n_STATEMENT + * n_METHOD_DECLARATION + * n_METHOD_MODIFIER_LIST + * n_EMPTY + * n_STRING + > c + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_TYPE_NAME + > array + > " " + * n_STATEMENT_LIST + > { + > } + > "\n " + * n_STATEMENT + * n_METHOD_DECLARATION + * n_METHOD_MODIFIER_LIST + * n_EMPTY + * n_STRING + > d + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_TYPE_NAME + > callable + > " " + * n_STATEMENT_LIST + > { + > } + > "\n" + > } + > "\n\n" + * n_STATEMENT + * n_BINARY_EXPRESSION + * n_VARIABLE + > $funcs + > " " + * n_OPERATOR + > = + > " " + * n_ARRAY_LITERAL + * n_ARRAY_VALUE_LIST + > [ + > "\n " + * n_ARRAY_VALUE + * n_EMPTY + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_EMPTY + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_CLASS_NAME + > string + > " " + * n_STATEMENT_LIST + > { + > } + > , + > "\n " + * n_ARRAY_VALUE + * n_EMPTY + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_EMPTY + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_TYPE_NAME + > array + > " " + * n_STATEMENT_LIST + > { + > } + > , + > "\n " + * n_ARRAY_VALUE + * n_EMPTY + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_EMPTY + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_TYPE_NAME + > callable + > " " + * n_STATEMENT_LIST + > { + > } + > , + > "\n " + * n_ARRAY_VALUE + * n_EMPTY + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_EMPTY + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_NULLABLE_TYPE + * n_CLASS_NAME + > string + > " " + * n_STATEMENT_LIST + > { + > } + > , + > "\n " + * n_ARRAY_VALUE + * n_EMPTY + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_EMPTY + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_CLASS_NAME + > void + > " " + * n_STATEMENT_LIST + > { + > } + > , + > "\n\n " + * n_ARRAY_VALUE + * n_EMPTY + * n_FUNCTION_DECLARATION + * n_STRING + > static + * n_EMPTY + * n_EMPTY + * n_EMPTY + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_CLASS_NAME + > string + > " " + * n_STATEMENT_LIST + > { + > } + > , + > "\n " + * n_ARRAY_VALUE + * n_EMPTY + * n_FUNCTION_DECLARATION + * n_STRING + > static + * n_EMPTY + * n_EMPTY + * n_EMPTY + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_TYPE_NAME + > array + > " " + * n_STATEMENT_LIST + > { + > } + > , + > "\n " + * n_ARRAY_VALUE + * n_EMPTY + * n_FUNCTION_DECLARATION + * n_STRING + > static + * n_EMPTY + * n_EMPTY + * n_EMPTY + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_TYPE_NAME + > callable + > " " + * n_STATEMENT_LIST + > { + > } + > , + > "\n " + * n_ARRAY_VALUE + * n_EMPTY + * n_FUNCTION_DECLARATION + * n_STRING + > static + * n_EMPTY + * n_EMPTY + * n_EMPTY + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_NULLABLE_TYPE + * n_CLASS_NAME + > string + > " " + * n_STATEMENT_LIST + > { + > } + > , + > "\n " + * n_ARRAY_VALUE + * n_EMPTY + * n_FUNCTION_DECLARATION + * n_STRING + > static + * n_EMPTY + * n_EMPTY + * n_EMPTY + * n_DECLARATION_PARAMETER_LIST + > ( + > ) + * n_EMPTY + * n_DECLARATION_RETURN + * n_CLASS_NAME + > void + > " " + * n_STATEMENT_LIST + > { + > } + > , + > "\n" + > ] + > ; + > "\n\n" diff --git a/src/parser/xhpast/__tests__/data/unpack-fail.php.test b/src/parser/xhpast/__tests__/data/unpack-fail.php.test new file mode 100644 index 00000000..8349ad73 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/unpack-fail.php.test @@ -0,0 +1,4 @@ + "\n\n" + * n_STATEMENT + * n_USE_LIST + > use + > " " + * n_USE + * n_SYMBOL_NAME + > A + * n_EMPTY + > ; + > "\n" + * n_STATEMENT + * n_USE_LIST + > use + > " " + * n_USE + * n_SYMBOL_NAME + > "\" + > B + * n_EMPTY + > ; + > "\n" + * n_STATEMENT + * n_USE_LIST + > use + > " " + * n_USE + * n_SYMBOL_NAME + > C + > " " + > as + > " " + * n_STRING + > D + > ; + > "\n" + * n_STATEMENT + * n_USE_LIST + > use + > " " + * n_USE + * n_SYMBOL_NAME + > E + * n_EMPTY + > , + > " " + * n_USE + * n_SYMBOL_NAME + > F + * n_EMPTY + > ; + > "\n" + * n_STATEMENT + * n_USE_LIST + > use + > " " + * n_USE + * n_SYMBOL_NAME + > G + * n_EMPTY + > , + > " " + * n_USE + * n_SYMBOL_NAME + > H + > " " + > as + > " " + * n_STRING + > I + > ; + > "\n" diff --git a/src/parser/xhpast/__tests__/data/variadic.php.test b/src/parser/xhpast/__tests__/data/variadic.php.test new file mode 100644 index 00000000..579fd7eb --- /dev/null +++ b/src/parser/xhpast/__tests__/data/variadic.php.test @@ -0,0 +1,170 @@ + "\n\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > a + * n_DECLARATION_PARAMETER_LIST + > ( + * n_DECLARATION_PARAMETER + * n_EMPTY + * n_UNPACK + > ... + * n_VARIABLE + > $a + * n_EMPTY + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > " " + > } + > "\n\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > b + * n_DECLARATION_PARAMETER_LIST + > ( + * n_DECLARATION_PARAMETER + * n_EMPTY + * n_VARIABLE_REFERENCE + > & + * n_UNPACK + > ... + * n_VARIABLE + > $a + * n_EMPTY + > ... + > $a + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > " " + > } + > "\n\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > c + * n_DECLARATION_PARAMETER_LIST + > ( + * n_DECLARATION_PARAMETER + * n_CLASS_NAME + > Type + > " " + * n_UNPACK + > ... + * n_VARIABLE + > $a + * n_EMPTY + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > " " + > } + > "\n\n" + * n_STATEMENT + * n_FUNCTION_DECLARATION + * n_EMPTY + * n_EMPTY + * n_STRING + > d + * n_DECLARATION_PARAMETER_LIST + > ( + * n_DECLARATION_PARAMETER + * n_CLASS_NAME + > Type + > " " + * n_VARIABLE_REFERENCE + > & + * n_UNPACK + > ... + * n_VARIABLE + > $a + * n_EMPTY + > ... + > $a + > ) + * n_EMPTY + * n_EMPTY + * n_STATEMENT_LIST + > { + > " " + > } + > "\n\n" + * n_STATEMENT + * n_FUNCTION_CALL + * n_SYMBOL_NAME + > a + * n_CALL_PARAMETER_LIST + > ( + * n_UNPACK + > ... + * n_ARRAY_LITERAL + * n_ARRAY_VALUE_LIST + > [ + * n_ARRAY_VALUE + * n_EMPTY + * n_NUMERIC_SCALAR + > 1 + > , + > " " + * n_ARRAY_VALUE + * n_EMPTY + * n_NUMERIC_SCALAR + > 2 + > , + > " " + * n_ARRAY_VALUE + * n_EMPTY + * n_NUMERIC_SCALAR + > 3 + > ] + > ) + > ; + > "\n\n" + * n_STATEMENT + * n_FUNCTION_CALL + * n_SYMBOL_NAME + > b + * n_CALL_PARAMETER_LIST + > ( + * n_UNPACK + > ... + * n_VARIABLE + > $foo + > ) + > ; + > "\n\n" diff --git a/src/parser/xhpast/__tests__/data/yyinitdepth.php.test b/src/parser/xhpast/__tests__/data/yyinitdepth.php.test new file mode 100644 index 00000000..bd8db585 --- /dev/null +++ b/src/parser/xhpast/__tests__/data/yyinitdepth.php.test @@ -0,0 +1,65 @@ + $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 index 00000000..0f0f9911 --- /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 index 00000000..395b07ff --- /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 index 00000000..6013c8b1 --- /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 index 00000000..2fa08a89 --- /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 index 00000000..8e4ecbb1 --- /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 index 00000000..dfea2c14 --- /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 index 00000000..b9864a17 --- /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/bin/xhpast.exe b/src/parser/xhpast/bin/xhpast.exe new file mode 100644 index 00000000..ab691840 Binary files /dev/null and b/src/parser/xhpast/bin/xhpast.exe differ diff --git a/src/parser/xhpast/parser_nodes.php b/src/parser/xhpast/parser_nodes.php new file mode 100644 index 00000000..b2b1b834 --- /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 index 00000000..83021901 --- /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 index 00000000..1e0c43b6 --- /dev/null +++ b/src/phage/__tests__/PhageAgentTestCase.php @@ -0,0 +1,53 @@ +assertSkipped(pht('Phage does not target Windows.')); + } + + return $this->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 index 00000000..a18b0f0c --- /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 index 00000000..9a84b476 --- /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 index 00000000..811b2892 --- /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 index 00000000..bf4ab24b --- /dev/null +++ b/src/phage/action/PhageLocalAction.php @@ -0,0 +1,20 @@ +setCWD($bin_dir); + + return $future; + } + +} diff --git a/src/phage/action/PhagePlanAction.php b/src/phage/action/PhagePlanAction.php new file mode 100644 index 00000000..222800de --- /dev/null +++ b/src/phage/action/PhagePlanAction.php @@ -0,0 +1,55 @@ +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 index 00000000..1682f275 --- /dev/null +++ b/src/phage/agent/PhagePHPAgent.php @@ -0,0 +1,166 @@ +stdin = $stdin; + } + + public function execute() { + $future_pool = $this->getFuturePool(); + + while (true) { + if ($future_pool->hasFutures()) { + while ($future_pool->hasFutures()) { + $future = $future_pool->resolve(); + + if ($future === null) { + foreach ($future_pool->getFutures() as $read_future) { + $this->readFuture($read_future); + } + break; + } + + $this->resolveFuture($future); + } + } else { + PhutilChannel::waitForAny(array($this->getMaster())); + } + + $this->processInput(); + } + } + + private function getFuturePool() { + if (!$this->futurePool) { + $this->futurePool = $this->newFuturePool(); + } + return $this->futurePool; + } + + private function newFuturePool() { + $future_pool = new FuturePool(); + + $future_pool->getIteratorTemplate() + ->setUpdateInterval(0.050); + + return $future_pool; + } + + 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->setFutureKey($key); + + $this->getFuturePool() + ->addFuture($future); + break; + case 'EXIT': + $this->terminateAgent(); + break; + } + } + + private function readFuture(ExecFuture $future) { + $master = $this->getMaster(); + $key = $future->getFutureKey(); + + 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(ExecFuture $future) { + $key = $future->getFutureKey(); + $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(), + )); + } + + public function __destruct() { + $this->terminateAgent(); + } + + private function terminateAgent() { + $pool = $this->getFuturePool(); + + foreach ($pool->getFutures() as $future) { + $future->resolveKill(); + } + + exit(0); + } + +} diff --git a/src/phage/bootloader/PhageAgentBootloader.php b/src/phage/bootloader/PhageAgentBootloader.php new file mode 100644 index 00000000..d99b4aa3 --- /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/FuturePool.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('arcanist'); + 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/toolset/PhageToolset.php b/src/phage/toolset/PhageToolset.php new file mode 100644 index 00000000..bbe812f9 --- /dev/null +++ b/src/phage/toolset/PhageToolset.php @@ -0,0 +1,7 @@ +parts[] = substr($data, 6); + return $this; + } + + public function addText($text) { + $this->parts[] = $text; + } + + public function toString() { + return implode('', $this->parts); + } + +} diff --git a/src/phage/workflow/PhageExecWorkflow.php b/src/phage/workflow/PhageExecWorkflow.php new file mode 100644 index 00000000..1208457b --- /dev/null +++ b/src/phage/workflow/PhageExecWorkflow.php @@ -0,0 +1,69 @@ +newWorkflowArgument('argv') + ->setHelp(pht('Command to execute.')) + ->setWildcard(true), + ); + } + + public function getWorkflowInformation() { + return $this->newWorkflowInformation() + ->setSynopsis(pht('Execute a Phage subprocess.')); + } + + protected function runWorkflow() { + $argv = $this->getArgument('argv'); + if (!$argv) { + throw new PhutilArgumentUsageException( + pht( + 'Specify a command to execute using one or more arguments.')); + } + + // This workflow is just a thin wrapper around running a subprocess as + // its own process group leader. + // + // If the Phage parent process executes a subprocess and that subprocess + // does not turn itself into a process group leader, sending "^C" to the + // parent process will also send the signal to the subprocess. Phage + // handles SIGINT as an input and we don't want it to propagate to children + // by default. + // + // Some versions of Linux have a binary named "setsid" which does the same + // thing, but this binary doesn't exist on macOS. + + // NOTE: This calls is documented as ever being able to fail. For now, + // trust the documentation? + + $pid = posix_getpid(); + + $pgid = posix_getpgid($pid); + if ($pgid === false) { + throw new Exception(pht('Call to "posix_getpgid(...)" failed!')); + } + + // If this process was run directly from a shell with "phage exec ...", + // we'll already be the process group leader. In this case, we don't need + // to become the leader of a new session (and the call will fail if we + // try). + + $is_leader = ($pid === $pgid); + if (!$is_leader) { + $sid = posix_setsid(); + if ($sid === -1) { + throw new Exception(pht('Call to "posix_setsid()" failed!')); + } + } + + return phutil_passthru('exec -- %Ls', $argv); + } + +} diff --git a/src/phage/workflow/PhageWorkflow.php b/src/phage/workflow/PhageWorkflow.php new file mode 100644 index 00000000..3999876e --- /dev/null +++ b/src/phage/workflow/PhageWorkflow.php @@ -0,0 +1,11 @@ +getToolsetKey(); + return ($key === PhageToolset::TOOLSETKEY); + } + +} diff --git a/src/progress/PhutilConsoleProgressSink.php b/src/progress/PhutilConsoleProgressSink.php new file mode 100644 index 00000000..11a61895 --- /dev/null +++ b/src/progress/PhutilConsoleProgressSink.php @@ -0,0 +1,115 @@ +shouldPublishToConsole()) { + return; + } + + $completed = $this->getCompletedWork(); + $total = $this->getTotalWork(); + + if ($total !== null) { + $percent = ($completed / $total); + $percent = min(1, $percent); + $percent = max(0, $percent); + } else { + $percent = null; + } + + // TODO: In TTY mode, draw a nice ASCII progress bar. + + if ($percent !== null) { + $marker = sprintf('% 3.1f%%', 100 * $percent); + } else { + $marker = sprintf('% 16d', $completed); + } + + $message = pht('[%s] Working...', $marker); + + if ($this->isTTY()) { + $this->overwriteLine($message); + } else { + $this->printLine($message."\n"); + } + + $this->didPublishToConsole(); + } + + protected function publishCompletion() { + $this->printLine("\n"); + } + + protected function publishFailure() { + $this->printLine("\n"); + } + + private function shouldPublishToConsole() { + if (!$this->lastUpdate) { + return true; + } + + // Limit the number of times per second we actually write to the console. + if ($this->isTTY()) { + $writes_per_second = 5; + } else { + $writes_per_second = 0.5; + } + + $now = microtime(true); + if (($now - $this->lastUpdate) < (1.0 / $writes_per_second)) { + return false; + } + + return true; + } + + private function didPublishToConsole() { + $this->lastUpdate = microtime(true); + } + + private function isTTY() { + if ($this->isTTY === null) { + $this->isTTY = (function_exists('posix_isatty') && posix_isatty(STDERR)); + } + return $this->isTTY; + } + + private function getWidth() { + if ($this->width === null) { + $width = phutil_console_get_terminal_width(); + $width = min(nonempty($width, 78), 78); + $this->width = $width; + } + + return $this->width; + } + + private function overwriteLine($line) { + $head = "\r"; + $tail = ''; + + if ($this->lineWidth) { + $line_len = strlen($line); + + if ($line_len < $this->lineWidth) { + $tail = str_repeat(' ', $this->lineWidth - $line_len); + } + + $this->lineWidth = strlen($line); + } + + $this->printLine($head.$line.$tail); + } + + private function printLine($line) { + fprintf(STDERR, '%s', $line); + } +} diff --git a/src/progress/PhutilProgressSink.php b/src/progress/PhutilProgressSink.php new file mode 100644 index 00000000..8b2a5065 --- /dev/null +++ b/src/progress/PhutilProgressSink.php @@ -0,0 +1,54 @@ +isRunning = true; + } + + public function __destruct() { + if ($this->isRunning) { + $this->didFailWork(); + } + } + + final public function setTotalWork($total_work) { + $this->totalWork = $total_work; + return $this; + } + + final public function getTotalWork() { + return $this->totalWork; + } + + final public function getCompletedWork() { + return $this->completedWork; + } + + final public function didMakeProgress($amount = 1) { + if ($this->isRunning) { + $this->completedWork += $amount; + $this->publishProgress(); + } + } + + final public function didCompleteWork() { + $this->isRunning = false; + $this->publishCompletion(); + } + + final public function didFailWork() { + $this->isRunning = false; + $this->publishFailure(); + } + + abstract protected function publishProgress(); + abstract protected function publishCompletion(); + abstract protected function publishFailure(); + +} diff --git a/src/query/ArcanistCommitUpstreamHardpointQuery.php b/src/query/ArcanistCommitUpstreamHardpointQuery.php new file mode 100644 index 00000000..3ab734b6 --- /dev/null +++ b/src/query/ArcanistCommitUpstreamHardpointQuery.php @@ -0,0 +1,53 @@ +yieldRepositoryRef()); + if (!$repository_ref) { + yield $this->yieldValue($refs, null); + } + $repository_phid = $repository_ref->getPHID(); + + $commit_map = array(); + foreach ($refs as $key => $ref) { + $hash = $ref->getCommitHash(); + $commit_map[$hash][] = $key; + } + + $commit_info = (yield $this->yieldConduit( + 'diffusion.querycommits', + array( + 'repositoryPHID' => $repository_phid, + 'names' => array_keys($commit_map), + ))); + + $results = array(); + foreach ($commit_map as $hash => $keys) { + $commit_phid = idx($commit_info['identifierMap'], $hash); + if ($commit_phid) { + $commit_data = idx($commit_info['data'], $commit_phid); + } else { + $commit_data = null; + } + + foreach ($keys as $key) { + $results[$key] = $commit_data; + } + } + + yield $this->yieldMap($results); + } + +} diff --git a/src/query/ArcanistGitCommitMessageHardpointQuery.php b/src/query/ArcanistGitCommitMessageHardpointQuery.php new file mode 100644 index 00000000..fd5b1659 --- /dev/null +++ b/src/query/ArcanistGitCommitMessageHardpointQuery.php @@ -0,0 +1,48 @@ +getRepositoryAPI(); + + $hashes = mpull($refs, 'getCommitHash'); + $unique_hashes = array_fuse($hashes); + + // TODO: Update this to use "%B", see T5028. We can also bulk-resolve + // these with "git show --quiet --format=... hash hash hash ... --". + + $futures = array(); + foreach ($unique_hashes as $hash) { + $futures[$hash] = $api->execFutureLocal( + 'log -n1 --format=%s %s --', + '%s%n%n%b', + $hash); + } + + yield $this->yieldFutures($futures); + + $messages = array(); + foreach ($futures as $hash => $future) { + list($stdout) = $future->resolvex(); + $messages[$hash] = $stdout; + } + + foreach ($hashes as $ref_key => $hash) { + $hashes[$ref_key] = $messages[$hash]; + } + + yield $this->yieldMap($hashes); + } + +} diff --git a/src/query/ArcanistGitWorkingCopyRevisionHardpointQuery.php b/src/query/ArcanistGitWorkingCopyRevisionHardpointQuery.php new file mode 100644 index 00000000..044843d7 --- /dev/null +++ b/src/query/ArcanistGitWorkingCopyRevisionHardpointQuery.php @@ -0,0 +1,81 @@ +yieldRequests( + $refs, + array( + ArcanistWorkingCopyStateRef::HARDPOINT_COMMITREF, + )); + + $hashes = array(); + $map = array(); + foreach ($refs as $ref_key => $ref) { + $commit = $ref->getCommitRef(); + + $commit_hashes = array(); + + $commit_hashes[] = array( + 'gtcm', + $commit->getCommitHash(), + ); + + if ($commit->getTreeHash()) { + $commit_hashes[] = array( + 'gttr', + $commit->getTreeHash(), + ); + } + + foreach ($commit_hashes as $hash) { + $hashes[] = $hash; + $hash_key = $this->getHashKey($hash); + $map[$hash_key][$ref_key] = $ref; + } + } + + $results = array_fill_keys(array_keys($refs), array()); + if ($hashes) { + $revisions = (yield $this->yieldConduit( + 'differential.query', + array( + 'commitHashes' => $hashes, + ))); + + foreach ($revisions as $dict) { + $revision_hashes = idx($dict, 'hashes'); + if (!$revision_hashes) { + continue; + } + + $revision_ref = ArcanistRevisionRef::newFromConduitQuery($dict); + foreach ($revision_hashes as $revision_hash) { + $hash_key = $this->getHashKey($revision_hash); + $state_refs = idx($map, $hash_key, array()); + foreach ($state_refs as $ref_key => $state_ref) { + $results[$ref_key][] = $revision_ref; + } + } + } + } + + yield $this->yieldMap($results); + } + + private function getHashKey(array $hash) { + return $hash[0].':'.$hash[1]; + } + +} diff --git a/src/query/ArcanistMessageRevisionHardpointQuery.php b/src/query/ArcanistMessageRevisionHardpointQuery.php new file mode 100644 index 00000000..d2076ed3 --- /dev/null +++ b/src/query/ArcanistMessageRevisionHardpointQuery.php @@ -0,0 +1,76 @@ +yieldRequests( + $refs, + array( + ArcanistWorkingCopyStateRef::HARDPOINT_COMMITREF, + )); + + $commit_refs = array(); + foreach ($refs as $ref) { + $commit_refs[] = $ref->getCommitRef(); + } + + yield $this->yieldRequests( + $commit_refs, + array( + ArcanistCommitRef::HARDPOINT_MESSAGE, + )); + + $map = array(); + foreach ($refs as $ref_key => $ref) { + $commit_ref = $ref->getCommitRef(); + $corpus = $commit_ref->getMessage(); + + $id = null; + try { + $message = ArcanistDifferentialCommitMessage::newFromRawCorpus($corpus); + $id = $message->getRevisionID(); + } catch (ArcanistUsageException $ex) { + continue; + } + + if (!$id) { + continue; + } + + $map[$id][$ref_key] = $ref; + } + + $results = array(); + if ($map) { + $revisions = (yield $this->yieldConduitSearch( + 'differential.revision.search', + array( + 'ids' => array_keys($map), + ))); + + foreach ($revisions as $dict) { + $revision_ref = ArcanistRevisionRef::newFromConduit($dict); + $id = $dict['id']; + + $state_refs = idx($map, $id, array()); + foreach ($state_refs as $ref_key => $state_ref) { + $results[$ref_key][] = $revision_ref; + } + } + } + + yield $this->yieldMap($results); + } + +} diff --git a/src/query/ArcanistWorkflowGitHardpointQuery.php b/src/query/ArcanistWorkflowGitHardpointQuery.php new file mode 100644 index 00000000..43a0b7d6 --- /dev/null +++ b/src/query/ArcanistWorkflowGitHardpointQuery.php @@ -0,0 +1,11 @@ +getRepositoryAPI(); + return ($api instanceof ArcanistGitAPI); + } + +} diff --git a/src/query/ArcanistWorkingCopyCommitHardpointQuery.php b/src/query/ArcanistWorkingCopyCommitHardpointQuery.php new file mode 100644 index 00000000..9f2b4672 --- /dev/null +++ b/src/query/ArcanistWorkingCopyCommitHardpointQuery.php @@ -0,0 +1,39 @@ +yieldRequests( + $refs, + array( + ArcanistWorkingCopyStateRef::HARDPOINT_BRANCHREF, + )); + + $branch_refs = mpull($refs, 'getBranchRef'); + + yield $this->yieldRequests( + $branch_refs, + array( + ArcanistBranchRef::HARDPOINT_COMMITREF, + )); + + $results = array(); + foreach ($refs as $key => $ref) { + $results[$key] = $ref->getBranchRef()->getCommitRef(); + } + + yield $this->yieldMap($results); + } + +} diff --git a/src/readableserializer/PhutilReadableSerializer.php b/src/readableserializer/PhutilReadableSerializer.php new file mode 100644 index 00000000..7ef9d844 --- /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 index 00000000..b38368a4 --- /dev/null +++ b/src/readableserializer/__tests__/PhutilReadableSerializerTestCase.php @@ -0,0 +1,23 @@ +assertEqual( + $expect, + PhutilReadableSerializer::printableValue($value)); + } + } + +} diff --git a/src/ref/ArcanistBranchRef.php b/src/ref/ArcanistBranchRef.php new file mode 100644 index 00000000..067e5a2e --- /dev/null +++ b/src/ref/ArcanistBranchRef.php @@ -0,0 +1,57 @@ +getBranchName()); + } + + protected function newHardpoints() { + return array( + $this->newHardpoint(self::HARDPOINT_COMMITREF), + ); + } + + public function setBranchName($branch_name) { + $this->branchName = $branch_name; + return $this; + } + + public function getBranchName() { + return $this->branchName; + } + + public function setRefName($ref_name) { + $this->refName = $ref_name; + return $this; + } + + public function getRefName() { + return $this->refName; + } + + public function setIsCurrentBranch($is_current_branch) { + $this->isCurrentBranch = $is_current_branch; + return $this; + } + + public function getIsCurrentBranch() { + return $this->isCurrentBranch; + } + + public function attachCommitRef(ArcanistCommitRef $ref) { + return $this->attachHardpoint(self::HARDPOINT_COMMITREF, $ref); + } + + public function getCommitRef() { + return $this->getHardpoint(self::HARDPOINT_COMMITREF); + } + +} diff --git a/src/ref/ArcanistDisplayRef.php b/src/ref/ArcanistDisplayRef.php new file mode 100644 index 00000000..c4e7a5d5 --- /dev/null +++ b/src/ref/ArcanistDisplayRef.php @@ -0,0 +1,89 @@ +ref = $ref; + return $this; + } + + public function getRef() { + return $this->ref; + } + + public function setURI($uri) { + $this->uri = $uri; + return $this; + } + + public function getURI() { + return $this->uri; + } + + public function newTerminalString() { + $ref = $this->getRef(); + + if ($ref instanceof ArcanistDisplayRefInterface) { + $object_name = $ref->getDisplayRefObjectName(); + $title = $ref->getDisplayRefTitle(); + } else { + $object_name = null; + $title = $ref->getRefDisplayName(); + } + + if ($object_name !== null) { + $reserve_width = phutil_utf8_console_strlen($object_name) + 1; + } else { + $reserve_width = 0; + } + + $marker_width = 6; + $display_width = phutil_console_get_terminal_width(); + + $usable_width = ($display_width - $marker_width - $reserve_width); + + // If the terminal is extremely narrow, don't degrade so much that the + // output is completely unusable. + $usable_width = max($usable_width, 16); + + // TODO: This should truncate based on console display width, not + // glyphs, but there's currently no "setMaximumConsoleCharacterWidth()". + + $title = id(new PhutilUTF8StringTruncator()) + ->setMaximumGlyphs($usable_width) + ->truncateString($title); + + if ($object_name !== null) { + if (strlen($title)) { + $display_text = tsprintf('**%s** %s', $object_name, $title); + } else { + $display_text = tsprintf('**%s**', $object_name); + } + } else { + $display_text = $title; + } + + $ref = $this->getRef(); + $output = array(); + + $output[] = tsprintf( + "** * ** %s\n", + $display_text); + + $uri = $this->getURI(); + if ($uri !== null) { + $output[] = tsprintf( + "** :// ** __%s__\n", + $uri); + } + + return $output; + } + +} diff --git a/src/ref/ArcanistDisplayRefInterface.php b/src/ref/ArcanistDisplayRefInterface.php new file mode 100644 index 00000000..550763ec --- /dev/null +++ b/src/ref/ArcanistDisplayRefInterface.php @@ -0,0 +1,8 @@ +setRef($this); + } +} diff --git a/src/ref/ArcanistRepositoryRef.php b/src/ref/ArcanistRepositoryRef.php new file mode 100644 index 00000000..e7e7a2ee --- /dev/null +++ b/src/ref/ArcanistRepositoryRef.php @@ -0,0 +1,75 @@ +phid = $phid; + return $this; + } + + public function getPHID() { + return $this->phid; + } + + public function setBrowseURI($browse_uri) { + $this->browseURI = $browse_uri; + return $this; + } + + public function newBrowseURI(array $params) { + PhutilTypeSpec::checkMap( + $params, + array( + 'path' => 'optional string|null', + 'branch' => 'optional string|null', + 'lines' => 'optional string|null', + )); + + foreach ($params as $key => $value) { + if (!strlen($value)) { + unset($params[$key]); + } + } + + $defaults = array( + 'path' => '/', + 'branch' => $this->getDefaultBranch(), + 'lines' => null, + ); + + $params = $params + $defaults; + + $uri_base = $this->browseURI; + $uri_base = rtrim($uri_base, '/'); + + $uri_branch = phutil_escape_uri_path_component($params['branch']); + + $uri_path = ltrim($params['path'], '/'); + $uri_path = phutil_escape_uri($uri_path); + + $uri_lines = null; + if ($params['lines']) { + $uri_lines = '$'.phutil_escape_uri($params['lines']); + } + + // TODO: This construction, which includes a branch, is probably wrong for + // Subversion. + + return "{$uri_base}/browse/{$uri_branch}/{$uri_path}{$uri_lines}"; + } + + public function getDefaultBranch() { + // TODO: This should read from the remote, and is not correct for + // Mercurial anyway, as "default" would be a better default branch. + return 'master'; + } + +} diff --git a/src/ref/ArcanistRevisionRefSource.php b/src/ref/ArcanistRevisionRefSource.php new file mode 100644 index 00000000..0f3e5b8d --- /dev/null +++ b/src/ref/ArcanistRevisionRefSource.php @@ -0,0 +1,4 @@ +newHardpoint(self::HARDPOINT_COMMITREF), + $this->newTemplateHardpoint(self::HARDPOINT_REVISIONREFS, $object_list), + ); + } + + // TODO: This should be "attachCommitRef()". + public function setCommitRef(ArcanistCommitRef $commit_ref) { + return $this->attachHardpoint(self::HARDPOINT_COMMITREF, $commit_ref); + } + + public function getCommitRef() { + return $this->getHardpoint(self::HARDPOINT_COMMITREF); + } + + public function getRevisionRefs() { + return $this->getHardpoint(self::HARDPOINT_REVISIONREFS); + } + + public function getRevisionRef() { + if ($this->hasAmbiguousRevisionRefs()) { + throw new Exception( + pht('State has multiple ambiguous revisions refs.')); + } + + $refs = $this->getRevisionRefs(); + if ($refs) { + return head($refs); + } + + return null; + } + + public function hasAmbiguousRevisionRefs() { + return (count($this->getRevisionRefs()) > 1); + } + +} diff --git a/src/ref/commit/ArcanistCommitRef.php b/src/ref/commit/ArcanistCommitRef.php new file mode 100644 index 00000000..d5ff3cb7 --- /dev/null +++ b/src/ref/commit/ArcanistCommitRef.php @@ -0,0 +1,93 @@ +getCommitHash()); + } + + protected function newHardpoints() { + return array( + $this->newHardpoint(self::HARDPOINT_MESSAGE), + $this->newHardpoint(self::HARDPOINT_UPSTREAM), + ); + } + + public function setCommitHash($commit_hash) { + $this->commitHash = $commit_hash; + return $this; + } + + public function getCommitHash() { + return $this->commitHash; + } + + public function setTreeHash($tree_hash) { + $this->treeHash = $tree_hash; + return $this; + } + + public function getTreeHash() { + return $this->treeHash; + } + + public function setCommitEpoch($commit_epoch) { + $this->commitEpoch = $commit_epoch; + return $this; + } + + public function getCommitEpoch() { + return $this->commitEpoch; + } + + public function setAuthorEpoch($author_epoch) { + $this->authorEpoch = $author_epoch; + return $this; + } + + public function getAuthorEpoch() { + return $this->authorEpoch; + } + + public function getSummary() { + $message = $this->getMessage(); + + $message = trim($message); + $lines = phutil_split_lines($message, false); + + return head($lines); + } + + public function attachMessage($message) { + return $this->attachHardpoint(self::HARDPOINT_MESSAGE, $message); + } + + public function getMessage() { + return $this->getHardpoint(self::HARDPOINT_MESSAGE); + } + + public function getURI() { + return $this->getUpstreamProperty('uri'); + } + + private function getUpstreamProperty($key, $default = null) { + $upstream = $this->getHardpoint(self::HARDPOINT_UPSTREAM); + + if (!$upstream) { + return $default; + } + + return idx($upstream, $key, $default); + } + +} diff --git a/src/ref/commit/ArcanistCommitSymbolRef.php b/src/ref/commit/ArcanistCommitSymbolRef.php new file mode 100644 index 00000000..0685e16a --- /dev/null +++ b/src/ref/commit/ArcanistCommitSymbolRef.php @@ -0,0 +1,10 @@ +getSymbol()); + } + +} diff --git a/src/ref/commit/ArcanistCommitSymbolRefInspector.php b/src/ref/commit/ArcanistCommitSymbolRefInspector.php new file mode 100644 index 00000000..fd87d104 --- /dev/null +++ b/src/ref/commit/ArcanistCommitSymbolRefInspector.php @@ -0,0 +1,22 @@ +setSymbol($argv[0]); + } + +} diff --git a/src/ref/commit/ArcanistGitCommitSymbolCommitHardpointQuery.php b/src/ref/commit/ArcanistGitCommitSymbolCommitHardpointQuery.php new file mode 100644 index 00000000..63d93c11 --- /dev/null +++ b/src/ref/commit/ArcanistGitCommitSymbolCommitHardpointQuery.php @@ -0,0 +1,103 @@ + $ref) { + $symbol_map[$key] = $ref->getSymbol(); + } + + $symbol_set = array_fuse($symbol_map); + foreach ($symbol_set as $symbol) { + $this->validateSymbol($symbol); + } + + $api = $this->getRepositoryAPI(); + + $symbol_list = implode("\n", $symbol_set); + + $future = $api->newFuture('cat-file --batch-check --') + ->write($symbol_list); + + list($stdout) = (yield $this->yieldFuture($future)); + + $lines = phutil_split_lines($stdout, $retain_endings = false); + + if (count($lines) !== count($symbol_set)) { + throw new Exception( + pht( + 'Execution of "git cat-file --batch-check" emitted an unexpected '. + 'number of lines, expected %s but got %s.', + phutil_count($symbol_set), + phutil_count($lines))); + } + + $hash_map = array(); + + $pairs = array_combine($symbol_set, $lines); + foreach ($pairs as $symbol => $line) { + $parts = explode(' ', $line, 3); + + if (count($parts) < 2) { + throw new Exception( + pht( + 'Execution of "git cat-file --batch-check" emitted an '. + 'unexpected line ("%s").', + $line)); + } + + list($hash, $type) = $parts; + + // NOTE: For now, symbols which map to tags (which, in turn, map to + // commits) are ignored here. + + if ($type !== 'commit') { + $hash_map[$symbol] = null; + continue; + } + + $hash_map[$symbol] = $hash; + } + + $results = array(); + foreach ($symbol_map as $key => $symbol) { + $results[$key] = $hash_map[$symbol]; + } + + foreach ($results as $key => $result) { + if ($result === null) { + continue; + } + + $ref = id(new ArcanistCommitRef()) + ->setCommitHash($result); + + $results[$key] = $ref; + } + + yield $this->yieldMap($results); + } + + private function validateSymbol($symbol) { + if (strpos($symbol, "\n") !== false) { + throw new Exception( + pht( + 'Commit symbol "%s" contains a newline. This is not a valid '. + 'character in a Git commit symbol.', + addcslashes($symbol, "\\\n"))); + } + } + +} diff --git a/src/ref/file/ArcanistFileRef.php b/src/ref/file/ArcanistFileRef.php new file mode 100644 index 00000000..de588bd0 --- /dev/null +++ b/src/ref/file/ArcanistFileRef.php @@ -0,0 +1,52 @@ +getMonogram()); + } + + public static function newFromConduit(array $parameters) { + $ref = new self(); + $ref->parameters = $parameters; + return $ref; + } + + public function getID() { + return idx($this->parameters, 'id'); + } + + public function getPHID() { + return idx($this->parameters, 'phid'); + } + + public function getName() { + return idxv($this->parameters, array('fields', 'name')); + } + + public function getDataURI() { + return idxv($this->parameters, array('fields', 'dataURI')); + } + + public function getSize() { + return idxv($this->parameters, array('fields', 'size')); + } + + public function getMonogram() { + return 'F'.$this->getID(); + } + + public function getDisplayRefObjectName() { + return $this->getMonogram(); + } + + public function getDisplayRefTitle() { + return $this->getName(); + } + +} diff --git a/src/ref/file/ArcanistFileSymbolRef.php b/src/ref/file/ArcanistFileSymbolRef.php new file mode 100644 index 00000000..aa4abf4e --- /dev/null +++ b/src/ref/file/ArcanistFileSymbolRef.php @@ -0,0 +1,30 @@ +getSymbol()); + } + + protected function getSimpleSymbolPrefixPattern() { + return '[Ff]?'; + } + + protected function getSimpleSymbolPHIDType() { + return 'FILE'; + } + + public function getSimpleSymbolConduitSearchMethodName() { + return 'file.search'; + } + + public function getSimpleSymbolInspectFunctionName() { + return 'file'; + } + + public function newSimpleSymbolObjectRef() { + return new ArcanistFileRef(); + } + +} diff --git a/src/ref/paste/ArcanistPasteRef.php b/src/ref/paste/ArcanistPasteRef.php new file mode 100644 index 00000000..04c8630d --- /dev/null +++ b/src/ref/paste/ArcanistPasteRef.php @@ -0,0 +1,52 @@ +getMonogram()); + } + + public static function newFromConduit(array $parameters) { + $ref = new self(); + $ref->parameters = $parameters; + return $ref; + } + + public function getID() { + return idx($this->parameters, 'id'); + } + + public function getPHID() { + return idx($this->parameters, 'phid'); + } + + public function getTitle() { + return idxv($this->parameters, array('fields', 'title')); + } + + public function getURI() { + return idxv($this->parameters, array('fields', 'uri')); + } + + public function getContent() { + return idxv($this->parameters, array('attachments', 'content', 'content')); + } + + public function getMonogram() { + return 'P'.$this->getID(); + } + + public function getDisplayRefObjectName() { + return $this->getMonogram(); + } + + public function getDisplayRefTitle() { + return $this->getTitle(); + } + +} diff --git a/src/ref/paste/ArcanistPasteSymbolRef.php b/src/ref/paste/ArcanistPasteSymbolRef.php new file mode 100644 index 00000000..47953edf --- /dev/null +++ b/src/ref/paste/ArcanistPasteSymbolRef.php @@ -0,0 +1,36 @@ +getSymbol()); + } + + protected function getSimpleSymbolPrefixPattern() { + return '[Pp]?'; + } + + protected function getSimpleSymbolPHIDType() { + return 'PSTE'; + } + + public function getSimpleSymbolConduitSearchMethodName() { + return 'paste.search'; + } + + public function getSimpleSymbolConduitSearchAttachments() { + return array( + 'content' => true, + ); + } + + public function getSimpleSymbolInspectFunctionName() { + return 'paste'; + } + + public function newSimpleSymbolObjectRef() { + return new ArcanistPasteRef(); + } + +} diff --git a/src/ref/revision/ArcanistRevisionCommitMessageHardpointQuery.php b/src/ref/revision/ArcanistRevisionCommitMessageHardpointQuery.php new file mode 100644 index 00000000..29a6ca29 --- /dev/null +++ b/src/ref/revision/ArcanistRevisionCommitMessageHardpointQuery.php @@ -0,0 +1,37 @@ +getRepositoryAPI(); + + // NOTE: This is not efficient, but no bulk API exists at time of + // writing and no callers bulk-load this data. + + $results = array(); + foreach ($refs as $key => $ref) { + $message = (yield $this->yieldConduit( + 'differential.getcommitmessage', + array( + 'revision_id' => $ref->getID(), + 'edit' => false, + ))); + + $results[$key] = $message; + } + + yield $this->yieldMap($results); + } + +} diff --git a/src/ref/revision/ArcanistRevisionRef.php b/src/ref/revision/ArcanistRevisionRef.php new file mode 100644 index 00000000..96b05d45 --- /dev/null +++ b/src/ref/revision/ArcanistRevisionRef.php @@ -0,0 +1,125 @@ +getMonogram()); + } + + protected function newHardpoints() { + return array( + $this->newHardpoint(self::HARDPOINT_COMMITMESSAGE), + ); + } + + public static function newFromConduit(array $dict) { + $ref = new self(); + $ref->parameters = $dict; + return $ref; + } + + public static function newFromConduitQuery(array $dict) { + // Mangle an older "differential.query" result to look like a modern + // "differential.revision.search" result. + + $status_name = idx($dict, 'statusName'); + + switch ($status_name) { + case 'Abandoned': + case 'Closed': + $is_closed = true; + break; + default: + $is_closed = false; + break; + } + + $dict['fields'] = array( + 'uri' => idx($dict, 'uri'), + 'title' => idx($dict, 'title'), + 'authorPHID' => idx($dict, 'authorPHID'), + 'status' => array( + 'name' => $status_name, + 'closed' => $is_closed, + ), + ); + + return self::newFromConduit($dict); + } + + public function getMonogram() { + return 'D'.$this->getID(); + } + + public function getStatusDisplayName() { + return idxv($this->parameters, array('fields', 'status', 'name')); + } + + public function isClosed() { + return idxv($this->parameters, array('fields', 'status', 'closed')); + } + + public function getURI() { + $uri = idxv($this->parameters, array('fields', 'uri')); + + if ($uri === null) { + // TODO: The "uri" field was added at the same time as this callsite, + // so we may not have it yet if the server is running an older version + // of Phabricator. Fake our way through. + + $uri = '/'.$this->getMonogram(); + } + + return $uri; + } + + public function getFullName() { + return pht('%s: %s', $this->getMonogram(), $this->getName()); + } + + public function getID() { + return (int)idx($this->parameters, 'id'); + } + + public function getPHID() { + return idx($this->parameters, 'phid'); + } + + public function getName() { + return idxv($this->parameters, array('fields', 'title')); + } + + public function getAuthorPHID() { + return idxv($this->parameters, array('fields', 'authorPHID')); + } + + public function addSource(ArcanistRevisionRefSource $source) { + $this->sources[] = $source; + return $this; + } + + public function getSources() { + return $this->sources; + } + + public function getCommitMessage() { + return $this->getHardpoint(self::HARDPOINT_COMMITMESSAGE); + } + + public function getDisplayRefObjectName() { + return $this->getMonogram(); + } + + public function getDisplayRefTitle() { + return $this->getName(); + } + +} diff --git a/src/ref/revision/ArcanistRevisionSymbolRef.php b/src/ref/revision/ArcanistRevisionSymbolRef.php new file mode 100644 index 00000000..484d871f --- /dev/null +++ b/src/ref/revision/ArcanistRevisionSymbolRef.php @@ -0,0 +1,30 @@ +getSymbol()); + } + + protected function getSimpleSymbolPrefixPattern() { + return '[Dd]?'; + } + + protected function getSimpleSymbolPHIDType() { + return 'DREV'; + } + + public function getSimpleSymbolConduitSearchMethodName() { + return 'differential.revision.search'; + } + + public function getSimpleSymbolInspectFunctionName() { + return 'revision'; + } + + public function newSimpleSymbolObjectRef() { + return new ArcanistRevisionRef(); + } + +} diff --git a/src/ref/simple/ArcanistSimpleSymbolHardpointQuery.php b/src/ref/simple/ArcanistSimpleSymbolHardpointQuery.php new file mode 100644 index 00000000..c1bacf04 --- /dev/null +++ b/src/ref/simple/ArcanistSimpleSymbolHardpointQuery.php @@ -0,0 +1,103 @@ + $ref) { + switch ($ref->getSymbolType()) { + case ArcanistSimpleSymbolRef::TYPE_ID: + $id_map[$key] = $ref->getSymbol(); + break; + case ArcanistSimpleSymbolRef::TYPE_PHID: + $phid_map[$key] = $ref->getSymbol(); + break; + } + } + + $template_ref = head($refs); + + $conduit_method = + $template_ref->getSimpleSymbolConduitSearchMethodName(); + $conduit_attachments = + $template_ref->getSimpleSymbolConduitSearchAttachments(); + + $futures = array(); + + if ($id_map) { + $id_future = $this->newConduitSearch( + $conduit_method, + array( + 'ids' => array_values(array_fuse($id_map)), + ), + $conduit_attachments); + + $futures[] = $id_future; + } else { + $id_future = null; + } + + if ($phid_map) { + $phid_future = $this->newConduitSearch( + $ref->getSimpleSymbolConduitSearchMethodName(), + array( + 'phids' => array_values(array_fuse($phid_map)), + ), + $conduit_attachments); + + $futures[] = $phid_future; + } else { + $phid_future = null; + } + + yield $this->yieldFutures($futures); + + $result_map = array(); + + if ($id_future) { + $id_results = $id_future->resolve(); + $id_results = ipull($id_results, null, 'id'); + + foreach ($id_map as $key => $id) { + $result_map[$key] = idx($id_results, $id); + } + } + + if ($phid_future) { + $phid_results = $phid_future->resolve(); + $phid_results = ipull($phid_results, null, 'phid'); + + foreach ($phid_map as $key => $phid) { + $result_map[$key] = idx($phid_results, $phid); + } + } + + $object_ref = $template_ref->newSimpleSymbolObjectRef(); + + foreach ($result_map as $key => $raw_result) { + if ($raw_result === null) { + continue; + } + + $result_map[$key] = call_user_func_array( + array(get_class($object_ref), 'newFromConduit'), + array($raw_result)); + } + + yield $this->yieldMap($result_map); + } + +} diff --git a/src/ref/simple/ArcanistSimpleSymbolRef.php b/src/ref/simple/ArcanistSimpleSymbolRef.php new file mode 100644 index 00000000..05f01238 --- /dev/null +++ b/src/ref/simple/ArcanistSimpleSymbolRef.php @@ -0,0 +1,58 @@ +type), + ); + } + + final public function getSymbolType() { + return $this->type; + } + + final protected function resolveSymbol($symbol) { + $matches = null; + + $prefix_pattern = $this->getSimpleSymbolPrefixPattern(); + $id_pattern = '(^'.$prefix_pattern.'([1-9]\d*)\z)'; + + $is_id = preg_match($id_pattern, $symbol, $matches); + if ($is_id) { + $this->type = self::TYPE_ID; + return (int)$matches[1]; + } + + $phid_type = $this->getSimpleSymbolPHIDType(); + $phid_type = preg_quote($phid_type); + $phid_pattern = '(^PHID-'.$phid_type.'-\S+\z)'; + $is_phid = preg_match($phid_pattern, $symbol, $matches); + if ($is_phid) { + $this->type = self::TYPE_PHID; + return $matches[0]; + } + + throw new PhutilArgumentUsageException( + pht( + 'The format of symbol "%s" is unrecognized. Expected a '. + 'monogram like "X123", or an ID like "123", or a PHID.', + $symbol)); + } + + abstract protected function getSimpleSymbolPrefixPattern(); + abstract protected function getSimpleSymbolPHIDType(); + abstract public function getSimpleSymbolConduitSearchMethodName(); + abstract public function getSimpleSymbolInspectFunctionName(); + + public function getSimpleSymbolConduitSearchAttachments() { + return array(); + } + +} diff --git a/src/ref/simple/ArcanistSimpleSymbolRefInspector.php b/src/ref/simple/ArcanistSimpleSymbolRefInspector.php new file mode 100644 index 00000000..5fed8967 --- /dev/null +++ b/src/ref/simple/ArcanistSimpleSymbolRefInspector.php @@ -0,0 +1,47 @@ +setAncestorClass('ArcanistSimpleSymbolRef') + ->execute(); + + $inspectors = array(); + foreach ($refs as $ref) { + $inspectors[] = id(new self()) + ->setTemplateRef($ref); + } + + return $inspectors; + } + + public function setTemplateRef(ArcanistSimpleSymbolRef $template_ref) { + $this->templateRef = $template_ref; + return $this; + } + + public function getTemplateRef() { + return $this->templateRef; + } + + public function getInspectFunctionName() { + return $this->getTemplateRef()->getSimpleSymbolInspectFunctionName(); + } + + public function newInspectRef(array $argv) { + if (count($argv) !== 1) { + throw new PhutilArgumentUsageException( + pht( + 'Expected exactly one argument to "%s(...)" with a symbol.', + $this->getInspectFunctionName())); + } + + return id(clone $this->getTemplateRef()) + ->setSymbol($argv[0]); + } + +} diff --git a/src/ref/symbol/ArcanistSymbolEngine.php b/src/ref/symbol/ArcanistSymbolEngine.php new file mode 100644 index 00000000..74fa09a0 --- /dev/null +++ b/src/ref/symbol/ArcanistSymbolEngine.php @@ -0,0 +1,100 @@ +workflow = $workflow; + return $this; + } + + public function getWorkflow() { + return $this->workflow; + } + + public function loadRevisionForSymbol($symbol) { + $refs = $this->loadRevisionsForSymbols(array($symbol)); + return head($refs)->getObject(); + } + + public function loadRevisionsForSymbols(array $symbols) { + return $this->loadRefsForSymbols( + new ArcanistRevisionSymbolRef(), + $symbols); + } + + public function loadUserForSymbol($symbol) { + $refs = $this->loadUsersForSymbols(array($symbol)); + return head($refs)->getObject(); + } + + public function loadUsersForSymbols(array $symbols) { + return $this->loadRefsForSymbols( + new ArcanistUserSymbolRef(), + $symbols); + } + + public function loadCommitForSymbol($symbol) { + $refs = $this->loadCommitsForSymbols(array($symbol)); + return head($refs)->getObject(); + } + + public function loadCommitsForSymbols(array $symbols) { + return $this->loadRefsForSymbols( + new ArcanistCommitSymbolRef(), + $symbols); + } + + public function loadFileForSymbol($symbol) { + $refs = $this->loadFilesForSymbols(array($symbol)); + return head($refs)->getObject(); + } + + public function loadFilesForSymbols(array $symbols) { + return $this->loadRefsForSymbols( + new ArcanistFileSymbolRef(), + $symbols); + } + + public function loadPasteForSymbol($symbol) { + $refs = $this->loadPastesForSymbols(array($symbol)); + return head($refs)->getObject(); + } + + public function loadPastesForSymbols(array $symbols) { + return $this->loadRefsForSymbols( + new ArcanistPasteSymbolRef(), + $symbols); + } + + public function loadRefsForSymbols( + ArcanistSymbolRef $template, + array $symbols) { + + $refs = array(); + $load_refs = array(); + foreach ($symbols as $symbol) { + $ref = id(clone $template) + ->setSymbol($symbol); + + $ref_key = $ref->getSymbolEngineCacheKey(); + if (!isset($this->refs[$ref_key])) { + $this->refs[$ref_key] = $ref; + $load_refs[] = $ref; + } + + $refs[$symbol] = $ref; + } + + $workflow = $this->getWorkflow(); + if ($load_refs) { + $workflow->loadHardpoints($refs, ArcanistSymbolRef::HARDPOINT_OBJECT); + } + + return $refs; + } + +} diff --git a/src/ref/symbol/ArcanistSymbolRef.php b/src/ref/symbol/ArcanistSymbolRef.php new file mode 100644 index 00000000..8ee5f3c4 --- /dev/null +++ b/src/ref/symbol/ArcanistSymbolRef.php @@ -0,0 +1,61 @@ +newHardpoint(self::HARDPOINT_OBJECT), + ); + } + + final public function setSymbol($symbol) { + $symbol = $this->resolveSymbol($symbol); + + $this->symbol = $symbol; + return $this; + } + + final public function getSymbol() { + return $this->symbol; + } + + final public function getSymbolEngineCacheKey() { + if ($this->cacheKey === null) { + $parts = array(); + $parts[] = sprintf('class(%s)', get_class($this)); + + foreach ($this->newCacheKeyParts() as $part) { + $parts[] = $part; + } + + $parts[] = $this->getSymbol(); + + $this->cacheKey = implode('.', $parts); + } + + return $this->cacheKey; + } + + protected function newCacheKeyParts() { + return array(); + } + + final public function attachObject(ArcanistRef $object) { + return $this->attachHardpoint(self::HARDPOINT_OBJECT, $object); + } + + final public function getObject() { + return $this->getHardpoint(self::HARDPOINT_OBJECT); + } + + protected function resolveSymbol($symbol) { + return $symbol; + } + +} diff --git a/src/ref/task/ArcanistTaskRef.php b/src/ref/task/ArcanistTaskRef.php new file mode 100644 index 00000000..d446b8df --- /dev/null +++ b/src/ref/task/ArcanistTaskRef.php @@ -0,0 +1,44 @@ +getMonogram()); + } + + public static function newFromConduit(array $parameters) { + $ref = new self(); + $ref->parameters = $parameters; + return $ref; + } + + public function getID() { + return idx($this->parameters, 'id'); + } + + public function getPHID() { + return idx($this->parameters, 'phid'); + } + + public function getName() { + return idxv($this->parameters, array('fields', 'name')); + } + + public function getMonogram() { + return 'T'.$this->getID(); + } + + public function getDisplayRefObjectName() { + return $this->getMonogram(); + } + + public function getDisplayRefTitle() { + return $this->getName(); + } + +} diff --git a/src/ref/task/ArcanistTaskSymbolRef.php b/src/ref/task/ArcanistTaskSymbolRef.php new file mode 100644 index 00000000..c0b379d8 --- /dev/null +++ b/src/ref/task/ArcanistTaskSymbolRef.php @@ -0,0 +1,30 @@ +getSymbol()); + } + + protected function getSimpleSymbolPrefixPattern() { + return '[Tt]?'; + } + + protected function getSimpleSymbolPHIDType() { + return 'TASK'; + } + + public function getSimpleSymbolConduitSearchMethodName() { + return 'maniphest.search'; + } + + public function getSimpleSymbolInspectFunctionName() { + return 'task'; + } + + public function newSimpleSymbolObjectRef() { + return new ArcanistTaskRef(); + } + +} diff --git a/src/ref/user/ArcanistUserRef.php b/src/ref/user/ArcanistUserRef.php new file mode 100644 index 00000000..0d27ca6b --- /dev/null +++ b/src/ref/user/ArcanistUserRef.php @@ -0,0 +1,66 @@ +getMonogram()); + } + + public static function newFromConduit(array $parameters) { + $ref = new self(); + $ref->parameters = $parameters; + return $ref; + } + + public static function newFromConduitWhoami(array $parameters) { + // NOTE: The "user.whoami" call returns a different structure than + // "user.search". Mangle the data so it looks similar. + + $parameters['fields'] = array( + 'username' => idx($parameters, 'userName'), + 'realName' => idx($parameters, 'realName'), + ); + + return self::newFromConduit($parameters); + } + + public function getID() { + return idx($this->parameters, 'id'); + } + + public function getPHID() { + return idx($this->parameters, 'phid'); + } + + public function getMonogram() { + return '@'.$this->getUsername(); + } + + public function getUsername() { + return idxv($this->parameters, array('fields', 'username')); + } + + public function getRealName() { + return idxv($this->parameters, array('fields', 'realName')); + } + + public function getDisplayRefObjectName() { + return $this->getMonogram(); + } + + public function getDisplayRefTitle() { + $real_name = $this->getRealName(); + + if (strlen($real_name)) { + $real_name = sprintf('(%s)', $real_name); + } + + return $real_name; + } + +} diff --git a/src/ref/user/ArcanistUserSymbolHardpointQuery.php b/src/ref/user/ArcanistUserSymbolHardpointQuery.php new file mode 100644 index 00000000..c363109e --- /dev/null +++ b/src/ref/user/ArcanistUserSymbolHardpointQuery.php @@ -0,0 +1,155 @@ + $ref) { + switch ($ref->getSymbolType()) { + case ArcanistUserSymbolRef::TYPE_ID: + $id_map[$key] = $ref->getSymbol(); + break; + case ArcanistUserSymbolRef::TYPE_PHID: + $phid_map[$key] = $ref->getSymbol(); + break; + case ArcanistUserSymbolRef::TYPE_USERNAME: + $username_map[$key] = $ref->getSymbol(); + break; + case ArcanistUserSymbolRef::TYPE_FUNCTION: + $symbol = $ref->getSymbol(); + if ($symbol !== 'viewer()') { + throw new Exception( + pht( + 'Only the function "viewer()" is supported.')); + } + $function_map[$key] = $symbol; + break; + } + } + + $futures = array(); + + if ($function_map) { + // The only function we support is "viewer()". + $function_future = $this->newConduit( + 'user.whoami', + array()); + + $futures[] = $function_future; + } else { + $function_future = null; + } + + if ($id_map) { + $id_future = $this->newConduitSearch( + 'user.search', + array( + 'ids' => array_values(array_fuse($id_map)), + )); + + $futures[] = $id_future; + } else { + $id_future = null; + } + + if ($phid_map) { + $phid_future = $this->newConduitSearch( + 'user.search', + array( + 'phids' => array_values(array_fuse($phid_map)), + )); + + $futures[] = $phid_future; + } else { + $phid_future = null; + } + + if ($username_map) { + $username_future = $this->newConduitSearch( + 'user.search', + array( + 'usernames' => array_values(array_fuse($username_map)), + )); + + $futures[] = $username_future; + } else { + $username_future = null; + } + + yield $this->yieldFutures($futures); + + $result_map = array(); + + if ($id_future) { + $id_results = $id_future->resolve(); + $id_results = ipull($id_results, null, 'id'); + + foreach ($id_map as $key => $id) { + $result_map[$key] = idx($id_results, $id); + } + } + + if ($phid_future) { + $phid_results = $phid_future->resolve(); + $phid_results = ipull($phid_results, null, 'phid'); + + foreach ($phid_map as $key => $phid) { + $result_map[$key] = idx($phid_results, $phid); + } + } + + if ($username_future) { + $raw_results = $username_future->resolve(); + + $username_results = array(); + foreach ($raw_results as $raw_result) { + $username = idxv($raw_result, array('fields', 'username')); + $username_results[$username] = $raw_result; + } + + foreach ($username_map as $key => $username) { + $result_map[$key] = idx($username_results, $username); + } + } + + foreach ($result_map as $key => $raw_result) { + if ($raw_result === null) { + continue; + } + + $result_map[$key] = ArcanistUserRef::newFromConduit($raw_result); + } + + if ($function_future) { + $raw_result = $function_future->resolve(); + + if ($raw_result === null) { + $function_ref = null; + } else { + $function_ref = ArcanistUserRef::newFromConduitWhoami($raw_result); + } + + foreach ($function_map as $key => $function) { + $result_map[$key] = $function_ref; + } + } + + yield $this->yieldMap($result_map); + } + +} diff --git a/src/ref/user/ArcanistUserSymbolRef.php b/src/ref/user/ArcanistUserSymbolRef.php new file mode 100644 index 00000000..b293d08a --- /dev/null +++ b/src/ref/user/ArcanistUserSymbolRef.php @@ -0,0 +1,62 @@ +getSymbol()); + } + + protected function newCacheKeyParts() { + return array( + sprintf('type(%s)', $this->type), + ); + } + + public function getSymbolType() { + return $this->type; + } + + protected function resolveSymbol($symbol) { + $matches = null; + + $is_id = preg_match('/^([1-9]\d*)\z/', $symbol, $matches); + if ($is_id) { + $this->type = self::TYPE_ID; + return (int)$matches[1]; + } + + $is_phid = preg_match('/^PHID-USER-\S+\z/', $symbol, $matches); + if ($is_phid) { + $this->type = self::TYPE_PHID; + return $matches[0]; + } + + $is_function = preg_match('/^\S+\(\s*\)\s*\z/', $symbol, $matches); + if ($is_function) { + $this->type = self::TYPE_FUNCTION; + return $matches[0]; + } + + $is_username = preg_match('/^@?(\S+)\z/', $symbol, $matches); + if ($is_username) { + $this->type = self::TYPE_USERNAME; + return $matches[1]; + } + + throw new PhutilArgumentUsageException( + pht( + 'The format of user symbol "%s" is unrecognized. Expected a '. + 'username like "alice" or "@alice", or a user PHID, or a user '. + 'ID, or a special function like "viewer()".', + $symbol)); + } + +} diff --git a/src/ref/user/ArcanistUserSymbolRefInspector.php b/src/ref/user/ArcanistUserSymbolRefInspector.php new file mode 100644 index 00000000..9ba4621f --- /dev/null +++ b/src/ref/user/ArcanistUserSymbolRefInspector.php @@ -0,0 +1,22 @@ +setSymbol($argv[0]); + } + +} diff --git a/src/repository/api/ArcanistFilesystemAPI.php b/src/repository/api/ArcanistFilesystemAPI.php new file mode 100644 index 00000000..198e0470 --- /dev/null +++ b/src/repository/api/ArcanistFilesystemAPI.php @@ -0,0 +1,102 @@ +setCWD($this->getPath()); + return $future; + } + + public function supportsCommitRanges() { + throw new PhutilMethodNotImplementedException(); + } + +} diff --git a/src/repository/api/ArcanistGitAPI.php b/src/repository/api/ArcanistGitAPI.php index 6e8dfd0b..b69c30b4 100644 --- a/src/repository/api/ArcanistGitAPI.php +++ b/src/repository/api/ArcanistGitAPI.php @@ -1090,6 +1090,7 @@ final class ArcanistGitAPI extends ArcanistRepositoryAPI { $result[] = array( 'current' => ($branch === $current), 'name' => $branch, + 'ref' => $ref, 'hash' => $hash, 'tree' => $tree, 'epoch' => (int)$epoch, @@ -1102,19 +1103,48 @@ final class ArcanistGitAPI extends ArcanistRepositoryAPI { return $result; } + public function getAllBranchRefs() { + $branches = $this->getAllBranches(); + + $refs = array(); + foreach ($branches as $branch) { + $commit_ref = $this->newCommitRef() + ->setCommitHash($branch['hash']) + ->setTreeHash($branch['tree']) + ->setCommitEpoch($branch['epoch']) + ->attachMessage($branch['text']); + + $refs[] = $this->newBranchRef() + ->setBranchName($branch['name']) + ->setRefName($branch['ref']) + ->setIsCurrentBranch($branch['current']) + ->attachCommitRef($commit_ref); + } + + return $refs; + } + + public function getBaseCommitRef() { + $base_commit = $this->getBaseCommit(); + + if ($base_commit === self::GIT_MAGIC_ROOT_COMMIT) { + return null; + } + + $base_message = $this->getCommitMessage($base_commit); + + // TODO: We should also pull the tree hash. + + return $this->newCommitRef() + ->setCommitHash($base_commit) + ->attachMessage($base_message); + } + public function getWorkingCopyRevision() { list($stdout) = $this->execxLocal('rev-parse HEAD'); return rtrim($stdout, "\n"); } - public function getUnderlyingWorkingCopyRevision() { - list($err, $stdout) = $this->execManualLocal('svn find-rev HEAD'); - if (!$err && $stdout) { - return rtrim($stdout, "\n"); - } - return $this->getWorkingCopyRevision(); - } - public function isHistoryDefaultImmutable() { return false; } @@ -1151,26 +1181,6 @@ final class ArcanistGitAPI extends ArcanistRepositoryAPI { return $parser->parseDiff($diff); } - public function supportsLocalBranchMerge() { - return true; - } - - public function performLocalBranchMerge($branch, $message) { - if (!$branch) { - throw new ArcanistUsageException( - pht('Under git, you must specify the branch you want to merge.')); - } - $err = phutil_passthru( - '(cd %s && git merge --no-ff -m %s %s)', - $this->getPath(), - $message, - $branch); - - if ($err) { - throw new ArcanistUsageException(pht('Merge failed!')); - } - } - public function getFinalizedRevisionMessage() { return pht( "You may now push this commit upstream, as appropriate (e.g. with ". @@ -1268,19 +1278,6 @@ final class ArcanistGitAPI extends ArcanistRepositoryAPI { return trim($summary); } - public function backoutCommit($commit_hash) { - $this->execxLocal('revert %s -n --no-edit', $commit_hash); - $this->reloadWorkingCopy(); - if (!$this->getUncommittedStatus()) { - throw new ArcanistUsageException( - pht('%s has already been reverted.', $commit_hash)); - } - } - - public function getBackoutMessage($commit_hash) { - return pht('This reverts commit %s.', $commit_hash); - } - public function isGitSubversionRepo() { return Filesystem::pathExists($this->getPath('.git/svn')); } @@ -1677,4 +1674,8 @@ final class ArcanistGitAPI extends ArcanistRepositoryAPI { return null; } + protected function newCurrentCommitSymbol() { + return 'HEAD'; + } + } diff --git a/src/repository/api/ArcanistMercurialAPI.php b/src/repository/api/ArcanistMercurialAPI.php index 7aaa04f7..1a2db585 100644 --- a/src/repository/api/ArcanistMercurialAPI.php +++ b/src/repository/api/ArcanistMercurialAPI.php @@ -13,36 +13,29 @@ final class ArcanistMercurialAPI extends ArcanistRepositoryAPI { private $supportsPhases; protected function buildLocalFuture(array $argv) { - // Mercurial has a "defaults" feature which basically breaks automation by - // allowing the user to add random flags to any command. This feature is - // "deprecated" and "a bad idea" that you should "forget ... existed" - // according to project lead Matt Mackall: - // - // http://markmail.org/message/hl3d6eprubmkkqh5 - // - // There is an HGPLAIN environmental variable which enables "plain mode" - // and hopefully disables this stuff. + $env = $this->getMercurialEnvironmentVariables(); - if (phutil_is_windows()) { - $argv[0] = 'set HGPLAIN=1 & hg '.$argv[0]; - } else { - $argv[0] = 'HGPLAIN=1 hg '.$argv[0]; - } + $argv[0] = 'hg '.$argv[0]; + + $future = newv('ExecFuture', $argv) + ->setEnv($env) + ->setCWD($this->getPath()); - $future = newv('ExecFuture', $argv); - $future->setCWD($this->getPath()); return $future; } public function execPassthru($pattern /* , ... */) { $args = func_get_args(); - if (phutil_is_windows()) { - $args[0] = 'hg '.$args[0]; - } else { - $args[0] = 'HGPLAIN=1 hg '.$args[0]; - } - return call_user_func_array('phutil_passthru', $args); + $env = $this->getMercurialEnvironmentVariables(); + + $args[0] = 'hg '.$args[0]; + + $passthru = newv('PhutilExecPassthru', $args) + ->setEnv($env) + ->setCWD($this->getPath()); + + return $passthru->resolve(); } public function getSourceControlSystemName() { @@ -564,6 +557,33 @@ final class ArcanistMercurialAPI extends ArcanistRepositoryAPI { return $return; } + public function getAllBranchRefs() { + $branches = $this->getAllBranches(); + + $refs = array(); + foreach ($branches as $branch) { + $refs[] = $this->newBranchRef() + ->setBranchName($branch['name']) + ->setIsCurrentBranch($branch['current']); + } + + return $refs; + } + + public function getBaseCommitRef() { + $base_commit = $this->getBaseCommit(); + + if ($base_commit === 'null') { + return null; + } + + $base_message = $this->getCommitMessage($base_commit); + + return $this->newCommitRef() + ->setCommitHash($base_commit) + ->attachMessage($base_message); + } + public function hasLocalCommit($commit) { try { $this->getCanonicalRevisionName($commit); @@ -589,29 +609,6 @@ final class ArcanistMercurialAPI extends ArcanistRepositoryAPI { return $parser->parseDiff($diff); } - public function supportsLocalBranchMerge() { - return true; - } - - public function performLocalBranchMerge($branch, $message) { - if ($branch) { - $err = phutil_passthru( - '(cd %s && HGPLAIN=1 hg merge --rev %s && hg commit -m %s)', - $this->getPath(), - $branch, - $message); - } else { - $err = phutil_passthru( - '(cd %s && HGPLAIN=1 hg merge && hg commit -m %s)', - $this->getPath(), - $message); - } - - if ($err) { - throw new ArcanistUsageException(pht('Merge failed!')); - } - } - public function getFinalizedRevisionMessage() { return pht( "You may now push this commit upstream, as appropriate (e.g. with ". @@ -800,19 +797,6 @@ final class ArcanistMercurialAPI extends ArcanistRepositoryAPI { return trim($summary); } - public function backoutCommit($commit_hash) { - $this->execxLocal('backout -r %s', $commit_hash); - $this->reloadWorkingCopy(); - if (!$this->getUncommittedStatus()) { - throw new ArcanistUsageException( - pht('%s has already been reverted.', $commit_hash)); - } - } - - public function getBackoutMessage($commit_hash) { - return pht('Backed out changeset %s,', $commit_hash); - } - public function resolveBaseCommitRule($rule, $source) { list($type, $name) = explode(':', $rule, 2); @@ -1106,4 +1090,22 @@ final class ArcanistMercurialAPI extends ArcanistRepositoryAPI { return null; } + private function getMercurialEnvironmentVariables() { + $env = array(); + + // Mercurial has a "defaults" feature which basically breaks automation by + // allowing the user to add random flags to any command. This feature is + // "deprecated" and "a bad idea" that you should "forget ... existed" + // according to project lead Matt Mackall: + // + // http://markmail.org/message/hl3d6eprubmkkqh5 + // + // There is an HGPLAIN environmental variable which enables "plain mode" + // and hopefully disables this stuff. + + $env['HGPLAIN'] = 1; + + return $env; + } + } diff --git a/src/repository/api/ArcanistRepositoryAPI.php b/src/repository/api/ArcanistRepositoryAPI.php index f95742c1..5d2c748f 100644 --- a/src/repository/api/ArcanistRepositoryAPI.php +++ b/src/repository/api/ArcanistRepositoryAPI.php @@ -39,6 +39,10 @@ abstract class ArcanistRepositoryAPI extends Phobject { private $symbolicBaseCommit; private $resolvedBaseCommit; + private $runtime; + private $currentWorkingCopyStateRef = false; + private $currentCommitRef = false; + abstract public function getSourceControlSystemName(); public function getDiffLinesOfContext() { @@ -343,11 +347,6 @@ abstract class ArcanistRepositoryAPI extends Phobject { array $query); abstract public function getRemoteURI(); - - public function getUnderlyingWorkingCopyRevision() { - return $this->getWorkingCopyRevision(); - } - public function getChangedFiles($since_commit) { throw new ArcanistCapabilityNotSupportedException($this); } @@ -375,6 +374,14 @@ abstract class ArcanistRepositoryAPI extends Phobject { return array(); } + public function getAllBranchRefs() { + throw new ArcanistCapabilityNotSupportedException($this); + } + + public function getBaseCommitRef() { + throw new ArcanistCapabilityNotSupportedException($this); + } + public function hasLocalCommit($commit) { throw new ArcanistCapabilityNotSupportedException($this); } @@ -391,12 +398,6 @@ abstract class ArcanistRepositoryAPI extends Phobject { throw new ArcanistCapabilityNotSupportedException($this); } - abstract public function supportsLocalBranchMerge(); - - public function performLocalBranchMerge($branch, $message) { - throw new ArcanistCapabilityNotSupportedException($this); - } - public function getFinalizedRevisionMessage() { throw new ArcanistCapabilityNotSupportedException($this); } @@ -668,4 +669,69 @@ abstract class ArcanistRepositoryAPI extends Phobject { return null; } + final public function newFuture($pattern /* , ... */) { + $args = func_get_args(); + return $this->buildLocalFuture($args) + ->setResolveOnError(false); + } + + final public function setRuntime(ArcanistRuntime $runtime) { + $this->runtime = $runtime; + return $this; + } + + final public function getRuntime() { + return $this->runtime; + } + + final protected function getSymbolEngine() { + return $this->getRuntime()->getSymbolEngine(); + } + + final public function getCurrentWorkingCopyStateRef() { + if ($this->currentWorkingCopyStateRef === false) { + $ref = $this->newCurrentWorkingCopyStateRef(); + $this->currentWorkingCopyStateRef = $ref; + } + + return $this->currentWorkingCopyStateRef; + } + + protected function newCurrentWorkingCopyStateRef() { + $commit_ref = $this->getCurrentCommitRef(); + + if (!$commit_ref) { + return null; + } + + return id(new ArcanistWorkingCopyStateRef()) + ->setCommitRef($commit_ref); + } + + final public function getCurrentCommitRef() { + if ($this->currentCommitRef === false) { + $this->currentCommitRef = $this->newCurrentCommitRef(); + } + return $this->currentCommitRef; + } + + protected function newCurrentCommitRef() { + $symbols = $this->getSymbolEngine(); + + $commit_symbol = $this->newCurrentCommitSymbol(); + + return $symbols->loadCommitForSymbol($commit_symbol); + } + + protected function newCurrentCommitSymbol() { + throw new ArcanistCapabilityNotSupportedException($this); + } + + final public function newCommitRef() { + return new ArcanistCommitRef(); + } + + final public function newBranchRef() { + return new ArcanistBranchRef(); + } } diff --git a/src/repository/api/ArcanistSubversionAPI.php b/src/repository/api/ArcanistSubversionAPI.php index d8066e96..cfd4ab30 100644 --- a/src/repository/api/ArcanistSubversionAPI.php +++ b/src/repository/api/ArcanistSubversionAPI.php @@ -634,10 +634,6 @@ EODIFF; return $this->getSourceControlBaseRevision(); } - public function supportsLocalBranchMerge() { - return false; - } - public function getFinalizedRevisionMessage() { // In other VCSes we give push instructions here, but it never makes sense // in SVN. diff --git a/src/runtime/ArcanistRuntime.php b/src/runtime/ArcanistRuntime.php new file mode 100644 index 00000000..bed9e5cc --- /dev/null +++ b/src/runtime/ArcanistRuntime.php @@ -0,0 +1,872 @@ +checkEnvironment(); + } catch (Exception $ex) { + echo "CONFIGURATION ERROR\n\n"; + echo $ex->getMessage(); + echo "\n\n"; + return 1; + } + + PhutilTranslator::getInstance() + ->setLocale(PhutilLocale::loadLocale('en_US')) + ->setTranslations(PhutilTranslation::getTranslationMapForLocale('en_US')); + + $log = new ArcanistLogEngine(); + $this->logEngine = $log; + + try { + return $this->executeCore($argv); + } catch (ArcanistConduitException $ex) { + $log->writeError(pht('CONDUIT'), $ex->getMessage()); + } catch (PhutilArgumentUsageException $ex) { + $log->writeError(pht('USAGE EXCEPTION'), $ex->getMessage()); + } catch (ArcanistUserAbortException $ex) { + $log->writeError(pht('---'), $ex->getMessage()); + } + + return 1; + } + + private function executeCore(array $argv) { + $log = $this->getLogEngine(); + + $config_args = array( + array( + 'name' => 'library', + 'param' => 'path', + 'help' => pht('Load a library.'), + 'repeat' => true, + ), + array( + 'name' => 'config', + 'param' => 'key=value', + 'repeat' => true, + 'help' => pht('Specify a runtime configuration value.'), + ), + array( + 'name' => 'config-file', + 'param' => 'path', + 'repeat' => true, + 'help' => pht( + 'Load one or more configuration files. If this flag is provided, '. + 'the system and user configuration files are ignored.'), + ), + ); + + $args = id(new PhutilArgumentParser($argv)) + ->parseStandardArguments(); + + // If we can test whether STDIN is a TTY, and it isn't, require that "--" + // appear in the argument list. This is intended to make it very hard to + // write unsafe scripts on top of Arcanist. + + if (phutil_is_noninteractive()) { + $args->setRequireArgumentTerminator(true); + } + + $is_trace = $args->getArg('trace'); + $log->setShowTraceMessages($is_trace); + + $log->writeTrace(pht('ARGV'), csprintf('%Ls', $argv)); + + // We're installing the signal handler after parsing "--trace" so that it + // can emit debugging messages. This means there's a very small window at + // startup where signals have no special handling, but we couldn't really + // route them or do anything interesting with them anyway. + $this->installSignalHandler(); + + $args->parsePartial($config_args, true); + + $config_engine = $this->loadConfiguration($args); + $config = $config_engine->newConfigurationSourceList(); + + $this->loadLibraries($config_engine, $config, $args); + + // Now that we've loaded libraries, we can validate configuration. + // Do this before continuing since configuration can impact other + // behaviors immediately and we want to catch any issues right away. + $config->setConfigOptions($config_engine->newConfigOptionsMap()); + $config->validateConfiguration($this); + + $toolset = $this->newToolset($argv); + $this->setToolset($toolset); + + $args->parsePartial($toolset->getToolsetArguments()); + + $workflows = $this->newWorkflows($toolset); + $this->workflows = $workflows; + + $conduit_engine = $this->newConduitEngine($config, $args); + $this->conduitEngine = $conduit_engine; + + $phutil_workflows = array(); + foreach ($workflows as $key => $workflow) { + $workflow + ->setRuntime($this) + ->setConfigurationEngine($config_engine) + ->setConfigurationSourceList($config) + ->setConduitEngine($conduit_engine); + + $phutil_workflows[$key] = $workflow->newPhutilWorkflow(); + } + + + $unconsumed_argv = $args->getUnconsumedArgumentVector(); + + if (!$unconsumed_argv) { + // TOOLSETS: This means the user just ran "arc" or some other top-level + // toolset without any workflow argument. We should give them a summary + // of the toolset, a list of workflows, and a pointer to "arc help" for + // more details. + + // A possible exception is "arc --help", which should perhaps pass + // through and act like "arc help". + throw new PhutilArgumentUsageException(pht('Choose a workflow!')); + } + + $alias_effects = id(new ArcanistAliasEngine()) + ->setRuntime($this) + ->setToolset($toolset) + ->setWorkflows($workflows) + ->setConfigurationSourceList($config) + ->resolveAliases($unconsumed_argv); + + foreach ($alias_effects as $alias_effect) { + if ($alias_effect->getType() === ArcanistAliasEffect::EFFECT_SHELL) { + return $this->executeShellAlias($alias_effect); + } + } + + $result_argv = $this->applyAliasEffects($alias_effects, $unconsumed_argv); + + $args->setUnconsumedArgumentVector($result_argv); + + // TOOLSETS: Some day, stop falling through to the old "arc" runtime. + + try { + return $args->parseWorkflowsFull($phutil_workflows); + } catch (ArcanistMissingArgumentTerminatorException $terminator_exception) { + $log->writeHint( + pht('USAGE'), + pht( + '"%s" is being run noninteractively, but the argument list is '. + 'missing "--" to indicate end of flags.', + $toolset->getToolsetKey())); + + $log->writeHint( + pht('USAGE'), + pht( + 'When running noninteractively, you MUST provide "--" to all '. + 'commands (even if they take no arguments).')); + + $log->writeHint( + pht('USAGE'), + tsprintf( + '%s <__%s__>', + pht('Learn More:'), + 'https://phurl.io/u/noninteractive')); + + throw new PhutilArgumentUsageException( + pht('Missing required "--" in argument list.')); + } catch (PhutilArgumentUsageException $usage_exception) { + + // TODO: This is very, very hacky; we're trying to let errors like + // "you passed the wrong arguments" through but fall back to classic + // mode if the workflow itself doesn't exist. + if (!preg_match('/invalid command/i', $usage_exception->getMessage())) { + throw $usage_exception; + } + + } + + $arcanist_root = phutil_get_library_root('arcanist'); + $arcanist_root = dirname($arcanist_root); + $bin = $arcanist_root.'/scripts/arcanist.php'; + + $err = phutil_passthru( + 'php -f %R -- %Ls', + $bin, + array_slice($argv, 1)); + + return $err; + } + + + /** + * Perform some sanity checks against the possible diversity of PHP builds in + * the wild, like very old versions and builds that were compiled with flags + * that exclude core functionality. + */ + private function checkEnvironment() { + // NOTE: We don't have phutil_is_windows() yet here. + $is_windows = (DIRECTORY_SEPARATOR != '/'); + + // NOTE: There's a hard PHP version check earlier, in "init-script.php". + + if ($is_windows) { + $need_functions = array( + 'curl_init' => array('builtin-dll', 'php_curl.dll'), + ); + } else { + $need_functions = array( + 'curl_init' => array( + 'text', + "You need to install the cURL PHP extension, maybe with ". + "'apt-get install php5-curl' or 'yum install php53-curl' or ". + "something similar.", + ), + 'json_decode' => array('flag', '--without-json'), + ); + } + + $problems = array(); + + $config = null; + $show_config = false; + foreach ($need_functions as $fname => $resolution) { + if (function_exists($fname)) { + continue; + } + + static $info; + if ($info === null) { + ob_start(); + phpinfo(INFO_GENERAL); + $info = ob_get_clean(); + $matches = null; + if (preg_match('/^Configure Command =>\s*(.*?)$/m', $info, $matches)) { + $config = $matches[1]; + } + } + + list($what, $which) = $resolution; + + if ($what == 'flag' && strpos($config, $which) !== false) { + $show_config = true; + $problems[] = sprintf( + 'The build of PHP you are running was compiled with the configure '. + 'flag "%s", which means it does not support the function "%s()". '. + 'This function is required for Arcanist to run. Install a standard '. + 'build of PHP or rebuild it without this flag. You may also be '. + 'able to build or install the relevant extension separately.', + $which, + $fname); + continue; + } + + if ($what == 'builtin-dll') { + $problems[] = sprintf( + 'The build of PHP you are running does not have the "%s" extension '. + 'enabled. Edit your php.ini file and uncomment the line which '. + 'reads "extension=%s".', + $which, + $which); + continue; + } + + if ($what == 'text') { + $problems[] = $which; + continue; + } + + $problems[] = sprintf( + 'The build of PHP you are running is missing the required function '. + '"%s()". Rebuild PHP or install the extension which provides "%s()".', + $fname, + $fname); + } + + if ($problems) { + if ($show_config) { + $problems[] = "PHP was built with this configure command:\n\n{$config}"; + } + $problems = implode("\n\n", $problems); + + throw new Exception($problems); + } + } + + private function loadConfiguration(PhutilArgumentParser $args) { + $engine = id(new ArcanistConfigurationEngine()) + ->setArguments($args); + + $working_copy = ArcanistWorkingCopy::newFromWorkingDirectory(getcwd()); + + $engine->setWorkingCopy($working_copy); + + $this->workingCopy = $working_copy; + + $working_copy + ->getRepositoryAPI() + ->setRuntime($this); + + return $engine; + } + + private function loadLibraries( + ArcanistConfigurationEngine $engine, + ArcanistConfigurationSourceList $config, + PhutilArgumentParser $args) { + + $sources = array(); + + $cli_libraries = $args->getArg('library'); + if ($cli_libraries) { + $sources = array(); + foreach ($cli_libraries as $cli_library) { + $sources[] = array( + 'type' => 'flag', + 'library-source' => $cli_library, + ); + } + } else { + $items = $config->getStorageValueList('load'); + foreach ($items as $item) { + foreach ($item->getValue() as $library_path) { + $sources[] = array( + 'type' => 'config', + 'config-source' => $item->getConfigurationSource(), + 'library-source' => $library_path, + ); + } + } + } + + foreach ($sources as $spec) { + $library_source = $spec['library-source']; + + switch ($spec['type']) { + case 'flag': + $description = pht('runtime --library flag'); + break; + case 'config': + $config_source = $spec['config-source']; + $description = pht( + 'Configuration (%s)', + $config_source->getSourceDisplayName()); + break; + } + + $this->loadLibrary($engine, $library_source, $description); + } + } + + private function loadLibrary( + ArcanistConfigurationEngine $engine, + $location, + $description) { + + // TODO: This is a legacy system that should be replaced with package + // management. + + $log = $this->getLogEngine(); + $working_copy = $engine->getWorkingCopy(); + if ($working_copy) { + $working_copy_root = $working_copy->getPath(); + $working_directory = $working_copy->getWorkingDirectory(); + } else { + $working_copy_root = null; + $working_directory = getcwd(); + } + + // Try to resolve the library location. We look in several places, in + // order: + // + // 1. Inside the working copy. This is for phutil libraries within the + // project. For instance "library/src" will resolve to + // "./library/src" if it exists. + // 2. In the same directory as the working copy. This allows you to + // check out a library alongside a working copy and reference it. + // If we haven't resolved yet, "library/src" will try to resolve to + // "../library/src" if it exists. + // 3. Using normal libphutil resolution rules. Generally, this means + // that it checks for libraries next to libphutil, then libraries + // in the PHP include_path. + // + // Note that absolute paths will just resolve absolutely through rule (1). + + $resolved = false; + + // Check inside the working copy. This also checks absolute paths, since + // they'll resolve absolute and just ignore the project root. + if ($working_copy_root !== null) { + $resolved_location = Filesystem::resolvePath( + $location, + $working_copy_root); + if (Filesystem::pathExists($resolved_location)) { + $location = $resolved_location; + $resolved = true; + } + + // If we didn't find anything, check alongside the working copy. + if (!$resolved) { + $resolved_location = Filesystem::resolvePath( + $location, + dirname($working_copy_root)); + if (Filesystem::pathExists($resolved_location)) { + $location = $resolved_location; + $resolved = true; + } + } + } + + // Look beside "arcanist/". This is rule (3) above. + + if (!$resolved) { + $arcanist_root = phutil_get_library_root('arcanist'); + $arcanist_root = dirname(dirname($arcanist_root)); + $resolved_location = Filesystem::resolvePath( + $location, + $arcanist_root); + if (Filesystem::pathExists($resolved_location)) { + $location = $resolved_location; + $resolved = true; + } + } + + $log->writeTrace( + pht('LOAD'), + pht('Loading library from "%s"...', $location)); + + $error = null; + try { + phutil_load_library($location); + } catch (PhutilLibraryConflictException $ex) { + if ($ex->getLibrary() != 'arcanist') { + throw $ex; + } + + // NOTE: If you are running `arc` against itself, we ignore the library + // conflict created by loading the local `arc` library (in the current + // working directory) and continue without loading it. + + // This means we only execute code in the `arcanist/` directory which is + // associated with the binary you are running, whereas we would normally + // execute local code. + + // This can make `arc` development slightly confusing if your setup is + // especially bizarre, but it allows `arc` to be used in automation + // workflows more easily. For some context, see PHI13. + + $executing_directory = dirname(dirname(__FILE__)); + + $log->writeWarn( + pht('VERY META'), + pht( + 'You are running one copy of Arcanist (at path "%s") against '. + 'another copy of Arcanist (at path "%s"). Code in the current '. + 'working directory will not be loaded or executed.', + $executing_directory, + $working_directory)); + } catch (PhutilBootloaderException $ex) { + $log->writeError( + pht('LIBRARY ERROR'), + pht( + 'Failed to load library at location "%s". This library '. + 'is specified by "%s". Check that the library is up to date.', + $location, + $description)); + + $prompt = pht('Continue without loading library?'); + if (!phutil_console_confirm($prompt)) { + throw $ex; + } + } catch (Exception $ex) { + $log->writeError( + pht('LOAD ERROR'), + pht( + 'Failed to load library at location "%s". This library is '. + 'specified by "%s". Check that the setting is correct and the '. + 'library is located in the right place.', + $location, + $description)); + + $prompt = pht('Continue without loading library?'); + if (!phutil_console_confirm($prompt)) { + throw $ex; + } + } + } + + private function newToolset(array $argv) { + $binary = basename($argv[0]); + + $toolsets = ArcanistToolset::newToolsetMap(); + if (!isset($toolsets[$binary])) { + throw new PhutilArgumentUsageException( + pht( + 'Arcanist toolset "%s" is unknown. The Arcanist binary should '. + 'be executed so that "argv[0]" identifies a supported toolset. '. + 'Rename the binary or install the library that provides the '. + 'desired toolset. Current available toolsets: %s.', + $binary, + implode(', ', array_keys($toolsets)))); + } + + return $toolsets[$binary]; + } + + private function newWorkflows(ArcanistToolset $toolset) { + $workflows = id(new PhutilClassMapQuery()) + ->setAncestorClass('ArcanistWorkflow') + ->setContinueOnFailure(true) + ->execute(); + + foreach ($workflows as $key => $workflow) { + if (!$workflow->supportsToolset($toolset)) { + unset($workflows[$key]); + } + } + + $map = array(); + foreach ($workflows as $workflow) { + $key = $workflow->getWorkflowName(); + if (isset($map[$key])) { + throw new Exception( + pht( + 'Two workflows ("%s" and "%s") both have the same name ("%s") '. + 'and both support the current toolset ("%s", "%s"). Each '. + 'workflow in a given toolset must have a unique name.', + get_class($workflow), + get_class($map[$key]), + get_class($toolset), + $toolset->getToolsetKey())); + } + $map[$key] = id(clone $workflow) + ->setToolset($toolset); + } + + return $map; + } + + public function getWorkflows() { + return $this->workflows; + } + + public function getLogEngine() { + return $this->logEngine; + } + + private function applyAliasEffects(array $effects, array $argv) { + assert_instances_of($effects, 'ArcanistAliasEffect'); + + $log = $this->getLogEngine(); + + $command = null; + $arguments = null; + foreach ($effects as $effect) { + $message = $effect->getMessage(); + + if ($message !== null) { + $log->writeHint(pht('ALIAS'), $message); + } + + if ($effect->getCommand()) { + $command = $effect->getCommand(); + $arguments = $effect->getArguments(); + } + } + + if ($command !== null) { + $argv = array_merge(array($command), $arguments); + } + + return $argv; + } + + private function installSignalHandler() { + $log = $this->getLogEngine(); + + if (!function_exists('pcntl_signal')) { + $log->writeTrace( + pht('PCNTL'), + pht( + 'Unable to install signal handler, pcntl_signal() unavailable. '. + 'Continuing without signal handling.')); + return; + } + + // NOTE: SIGHUP, SIGTERM and SIGWINCH are handled by "PhutilSignalRouter". + // This logic is largely similar to the logic there, but more specific to + // Arcanist workflows. + + pcntl_signal(SIGINT, array($this, 'routeSignal')); + } + + public function routeSignal($signo) { + switch ($signo) { + case SIGINT: + $this->routeInterruptSignal($signo); + break; + } + } + + private function routeInterruptSignal($signo) { + $log = $this->getLogEngine(); + + $last_interrupt = $this->lastInterruptTime; + $now = microtime(true); + $this->lastInterruptTime = $now; + + $should_exit = false; + + // If we received another SIGINT recently, always exit. This implements + // "press ^C twice in quick succession to exit" regardless of what the + // workflow may decide to do. + $interval = 2; + if ($last_interrupt !== null) { + if ($now - $last_interrupt < $interval) { + $should_exit = true; + } + } + + $handler = null; + if (!$should_exit) { + + // Look for an interrupt handler in the current workflow stack. + + $stack = $this->getWorkflowStack(); + foreach ($stack as $workflow) { + if ($workflow->canHandleSignal($signo)) { + $handler = $workflow; + break; + } + } + + // If no workflow in the current execution stack can handle an interrupt + // signal, just exit on the first interrupt. + + if (!$handler) { + $should_exit = true; + } + } + + // It's common for users to ^C on prompts. Write a newline before writing + // a response to the interrupt so the behavior is a little cleaner. This + // also avoids lines that read "^C [ INTERRUPT ] ...". + $log->writeNewline(); + + if ($should_exit) { + $log->writeHint( + pht('INTERRUPT'), + pht('Interrupted by SIGINT (^C).')); + exit(128 + $signo); + } + + $log->writeHint( + pht('INTERRUPT'), + pht('Press ^C again to exit.')); + + $handler->handleSignal($signo); + } + + public function pushWorkflow(ArcanistWorkflow $workflow) { + $this->stack[] = $workflow; + return $this; + } + + public function popWorkflow() { + if (!$this->stack) { + throw new Exception(pht('Trying to pop an empty workflow stack!')); + } + + return array_pop($this->stack); + } + + public function getWorkflowStack() { + return $this->stack; + } + + public function getCurrentWorkflow() { + return last($this->stack); + } + + private function newConduitEngine( + ArcanistConfigurationSourceList $config, + PhutilArgumentParser $args) { + + try { + $force_uri = $args->getArg('conduit-uri'); + } catch (PhutilArgumentSpecificationException $ex) { + $force_uri = null; + } + + try { + $force_token = $args->getArg('conduit-token'); + } catch (PhutilArgumentSpecificationException $ex) { + $force_token = null; + } + + if ($force_uri !== null) { + $conduit_uri = $force_uri; + } else { + $conduit_uri = $config->getConfig('phabricator.uri'); + if ($conduit_uri === null) { + // For now, read this older config from raw storage. There is currently + // no definition of this option in the "toolsets" config list, and it + // would be nice to get rid of it. + $default_list = $config->getStorageValueList('default'); + if ($default_list) { + $conduit_uri = last($default_list)->getValue(); + } + } + } + + if ($conduit_uri) { + // Set the URI path to '/api/'. TODO: Originally, I contemplated letting + // you deploy Phabricator somewhere other than the domain root, but ended + // up never pursuing that. We should get rid of all "/api/" silliness + // in things users are expected to configure. This is already happening + // to some degree, e.g. "arc install-certificate" does it for you. + $conduit_uri = new PhutilURI($conduit_uri); + $conduit_uri->setPath('/api/'); + $conduit_uri = phutil_string_cast($conduit_uri); + } + + $engine = new ArcanistConduitEngine(); + + if ($conduit_uri !== null) { + $engine->setConduitURI($conduit_uri); + } + + // TODO: This isn't using "getConfig()" because we aren't defining a + // real config entry for the moment. + + if ($force_token !== null) { + $conduit_token = $force_token; + } else { + $hosts = array(); + + $hosts_list = $config->getStorageValueList('hosts'); + foreach ($hosts_list as $hosts_config) { + $hosts += $hosts_config->getValue(); + } + + $host_config = idx($hosts, $conduit_uri, array()); + $conduit_token = idx($host_config, 'token'); + } + + if ($conduit_token !== null) { + $engine->setConduitToken($conduit_token); + } + + return $engine; + } + + private function executeShellAlias(ArcanistAliasEffect $effect) { + $log = $this->getLogEngine(); + + $message = $effect->getMessage(); + if ($message !== null) { + $log->writeHint(pht('SHELL ALIAS'), $message); + } + + return phutil_passthru('%Ls', $effect->getArguments()); + } + + public function getSymbolEngine() { + if ($this->symbolEngine === null) { + $this->symbolEngine = $this->newSymbolEngine(); + } + return $this->symbolEngine; + } + + private function newSymbolEngine() { + return id(new ArcanistSymbolEngine()) + ->setWorkflow($this); + } + + public function getHardpointEngine() { + if ($this->hardpointEngine === null) { + $this->hardpointEngine = $this->newHardpointEngine(); + } + return $this->hardpointEngine; + } + + private function newHardpointEngine() { + $engine = new ArcanistHardpointEngine(); + + $queries = ArcanistRuntimeHardpointQuery::getAllQueries(); + + foreach ($queries as $key => $query) { + $queries[$key] = id(clone $query) + ->setRuntime($this); + } + + $engine->setQueries($queries); + + return $engine; + } + + public function getViewer() { + if (!$this->viewer) { + $viewer = $this->getSymbolEngine() + ->loadUserForSymbol('viewer()'); + + // TODO: Deal with anonymous stuff. + if (!$viewer) { + throw new Exception(pht('No viewer!')); + } + + $this->viewer = $viewer; + } + + return $this->viewer; + } + + public function loadHardpoints($objects, $requests) { + if (!is_array($objects)) { + $objects = array($objects); + } + + if (!is_array($requests)) { + $requests = array($requests); + } + + $engine = $this->getHardpointEngine(); + + $requests = $engine->requestHardpoints( + $objects, + $requests); + + // TODO: Wait for only the required requests. + $engine->waitForRequests(array()); + } + + public function getWorkingCopy() { + return $this->workingCopy; + } + + public function getConduitEngine() { + return $this->conduitEngine; + } + + public function setToolset($toolset) { + $this->toolset = $toolset; + return $this; + } + + public function getToolset() { + return $this->toolset; + } + +} diff --git a/src/serviceprofiler/PhutilServiceProfiler.php b/src/serviceprofiler/PhutilServiceProfiler.php new file mode 100644 index 00000000..7ab8a12e --- /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/symbols/PhutilClassMapQuery.php b/src/symbols/PhutilClassMapQuery.php new file mode 100644 index 00000000..4b947a61 --- /dev/null +++ b/src/symbols/PhutilClassMapQuery.php @@ -0,0 +1,338 @@ +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; + } + + public function setContinueOnFailure($continue) { + $this->continueOnFailure = $continue; + 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) + ->setContinueOnFailure($this->continueOnFailure) + ->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)) { + if ($map) { + // The "sort" method may return scalars (which we want to sort with + // "msort()"), or may return PhutilSortVector objects (which we want + // to sort with "msortv()"). + $item = call_user_func(array(head($map), $sort)); + + // Since we may be early in the stack, use a string to avoid triggering + // autoload in old versions of PHP. + $vector_class = 'PhutilSortVector'; + if ($item instanceof $vector_class) { + $map = msortv($map, $sort); + } else { + $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 index 00000000..32c7a042 --- /dev/null +++ b/src/symbols/PhutilSymbolLoader.php @@ -0,0 +1,455 @@ +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; + private $continueOnFailure; + + + /** + * 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; + } + + public function setContinueOnFailure($continue) { + $this->continueOnFailure = $continue; + 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) { + // Loading a class may trigger the autoloader to load more classes + // (usually, the parent class), so we need to keep track of whether we + // are currently loading in "continue on failure" mode. Otherwise, we'll + // fail anyway if we fail to load a parent class. + + // The driving use case for the "continue on failure" mode is to let + // "arc liberate" run so it can rebuild the library map, even if you have + // made changes to Workflow or Config classes which it must load before + // it can operate. If we don't let it continue on failure, it is very + // difficult to remove or move Workflows. + + static $continue_depth = 0; + if ($this->continueOnFailure) { + $continue_depth++; + } + + $caught = null; + foreach ($symbols as $key => $symbol) { + try { + $this->loadSymbol($symbol); + } catch (Exception $ex) { + // If we failed to load this symbol, remove it from the results. + // Otherwise, we may fatal below when trying to reflect it. + unset($symbols[$key]); + + $caught = $ex; + } + } + + $should_continue = ($continue_depth > 0); + + if ($this->continueOnFailure) { + $continue_depth--; + } + + 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. + if ($should_continue) { + // We may not have `pht()` yet. + fprintf( + STDERR, + "%s: %s\n", + 'IGNORING CLASS LOAD FAILURE', + $caught->getMessage()); + } else { + 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/toolset/ArcanistAlias.php b/src/toolset/ArcanistAlias.php new file mode 100644 index 00000000..afcb02ab --- /dev/null +++ b/src/toolset/ArcanistAlias.php @@ -0,0 +1,144 @@ +trigger = $key; + $alias->toolset = 'arc'; + $alias->command = $value; + } else if ($is_dict) { + try { + PhutilTypeSpec::checkMap( + $value, + array( + 'trigger' => 'string', + 'toolset' => 'string', + 'command' => 'list', + )); + + $alias->trigger = idx($value, 'trigger'); + $alias->toolset = idx($value, 'toolset'); + $alias->command = idx($value, 'command'); + } catch (PhutilTypeCheckException $ex) { + $alias->exception = new PhutilProxyException( + pht( + 'Found invalid alias definition (with key "%s").', + $key), + $ex); + } + } else { + $alias->exception = new Exception( + pht( + 'Expected alias definition (with key "%s") to be a dictionary.', + $key)); + } + + return $alias; + } + + public function setToolset($toolset) { + $this->toolset = $toolset; + return $this; + } + + public function getToolset() { + return $this->toolset; + } + + public function setTrigger($trigger) { + $this->trigger = $trigger; + return $this; + } + + public function getTrigger() { + return $this->trigger; + } + + public function setCommand(array $command) { + $this->command = $command; + return $this; + } + + public function getCommand() { + return $this->command; + } + + public function setException(Exception $exception) { + $this->exception = $exception; + return $this; + } + + public function getException() { + return $this->exception; + } + + public function isShellCommandAlias() { + $command = $this->getCommand(); + if (!$command) { + return false; + } + + $head = head($command); + return preg_match('/^!/', $head); + } + + public function getStorageDictionary() { + return array( + 'trigger' => $this->getTrigger(), + 'toolset' => $this->getToolset(), + 'command' => $this->getCommand(), + ); + } + + public function setConfigurationSource( + ArcanistConfigurationSource $configuration_source) { + $this->configurationSource = $configuration_source; + return $this; + } + + public function getConfigurationSource() { + return $this->configurationSource; + } + +} diff --git a/src/toolset/ArcanistAliasEffect.php b/src/toolset/ArcanistAliasEffect.php new file mode 100644 index 00000000..e3a4d386 --- /dev/null +++ b/src/toolset/ArcanistAliasEffect.php @@ -0,0 +1,58 @@ +type = $type; + return $this; + } + + public function getType() { + return $this->type; + } + + public function setCommand($command) { + $this->command = $command; + return $this; + } + + public function getCommand() { + return $this->command; + } + + public function setArguments(array $arguments) { + $this->arguments = $arguments; + return $this; + } + + public function getArguments() { + return $this->arguments; + } + + public function setMessage($message) { + $this->message = $message; + return $this; + } + + public function getMessage() { + return $this->message; + } + +} diff --git a/src/toolset/ArcanistAliasEngine.php b/src/toolset/ArcanistAliasEngine.php new file mode 100644 index 00000000..cba6d723 --- /dev/null +++ b/src/toolset/ArcanistAliasEngine.php @@ -0,0 +1,282 @@ +runtime = $runtime; + return $this; + } + + public function getRuntime() { + return $this->runtime; + } + + public function setToolset(ArcanistToolset $toolset) { + $this->toolset = $toolset; + return $this; + } + + public function getToolset() { + return $this->toolset; + } + + public function setWorkflows(array $workflows) { + assert_instances_of($workflows, 'ArcanistWorkflow'); + $this->workflows = $workflows; + return $this; + } + + public function getWorkflows() { + return $this->workflows; + } + + public function setConfigurationSourceList( + ArcanistConfigurationSourceList $config) { + $this->configurationSourceList = $config; + return $this; + } + + public function getConfigurationSourceList() { + return $this->configurationSourceList; + } + + public function resolveAliases(array $argv) { + $aliases_key = ArcanistArcConfigurationEngineExtension::KEY_ALIASES; + $source_list = $this->getConfigurationSourceList(); + $aliases = $source_list->getConfig($aliases_key); + + $results = array(); + + // Identify aliases which had some kind of format or specification issue + // when loading config. We could possibly do this earlier, but it's nice + // to handle all the alias stuff in one place. + + foreach ($aliases as $key => $alias) { + $exception = $alias->getException(); + + if (!$exception) { + continue; + } + + // This alias is not defined properly, so we're going to ignore it. + unset($aliases[$key]); + + $results[] = $this->newEffect(ArcanistAliasEffect::EFFECT_CONFIGURATION) + ->setMessage( + pht( + 'Configuration source ("%s") defines an invalid alias, which '. + 'will be ignored: %s', + $alias->getConfigurationSource()->getSourceDisplayName()), + $exception->getMessage()); + } + + $command = array_shift($argv); + + $stack = array(); + return $this->resolveAliasesForCommand( + $aliases, + $command, + $argv, + $results, + $stack); + } + + private function resolveAliasesForCommand( + array $aliases, + $command, + array $argv, + array $results, + array $stack) { + + $toolset = $this->getToolset(); + $toolset_key = $toolset->getToolsetKey(); + + // If we have a command which resolves to a real workflow, match it and + // finish resolution. You can not overwrite a real workflow with an alias. + + $workflows = $this->getWorkflows(); + if (isset($workflows[$command])) { + $results[] = $this->newEffect(ArcanistAliasEffect::EFFECT_RESOLUTION) + ->setCommand($command) + ->setArguments($argv); + return $results; + } + + // Find all the aliases which match whatever the user typed, like "draft". + // We look for aliases in other toolsets, too, so we can provide the user + // a hint when they type "phage draft" and mean "arc draft". + + $matches = array(); + $toolset_matches = array(); + foreach ($aliases as $alias) { + if ($alias->getTrigger() === $command) { + $matches[] = $alias; + if ($alias->getToolset() == $toolset_key) { + $toolset_matches[] = $alias; + } + } + } + + if (!$toolset_matches) { + + // If the user typed "phage draft" and meant "arc draft", give them a + // hint that the alias exists somewhere else and they may have specified + // the wrong toolset. + + foreach ($matches as $match) { + $results[] = $this->newEffect(ArcanistAliasEffect::EFFECT_SUGGEST) + ->setMessage( + pht( + 'No "%s %s" alias is defined, did you mean "%s %s"?', + $toolset_key, + $command, + $match->getToolset(), + $command)); + } + + // If the user misspells a command (like "arc hlep") and it doesn't match + // anything (no alias or workflow), we want to pass it through unmodified + // and let the parser try to correct the spelling into a real workflow + // later on. + + // However, if the user correctly types a command (like "arc draft") that + // resolves at least once (so it hits a valid alias) but does not + // ultimately resolve into a valid workflow, we want to treat this as a + // hard failure. + + // This could happen if you manually defined a bad alias, or a workflow + // you'd previously aliased to was removed, or you stacked aliases and + // then deleted one. + + if ($stack) { + $results[] = $this->newEffect(ArcanistAliasEffect::EFFECT_NOTFOUND) + ->setMessage( + pht( + 'Alias resolved to "%s", but this is not a valid workflow or '. + 'alias name. This alias or workflow might have previously '. + 'existed and been removed.', + $command)); + } else { + $results[] = $this->newEffect(ArcanistAliasEffect::EFFECT_RESOLUTION) + ->setCommand($command) + ->setArguments($argv); + } + + return $results; + } + + $alias = array_pop($toolset_matches); + + if ($toolset_matches) { + $source = $alias->getConfigurationSource(); + + $results[] = $this->newEffect(ArcanistAliasEffect::EFFECT_IGNORED) + ->setMessage( + pht( + 'Multiple configuration sources define an alias for "%s %s". '. + 'The last definition in the most specific source ("%s") will '. + 'be used.', + $toolset_key, + $command, + $source->getSourceDisplayName())); + + foreach ($toolset_matches as $ignored_match) { + $source = $ignored_match->getConfigurationSource(); + + $results[] = $this->newEffect(ArcanistAliasEffect::EFFECT_IGNORED) + ->setMessage( + pht( + 'A definition of "%s %s" in "%s" will be ignored.', + $toolset_key, + $command, + $source->getSourceDisplayName())); + } + } + + $alias_argv = $alias->getCommand(); + $alias_command = array_shift($alias_argv); + + if ($alias->isShellCommandAlias()) { + $shell_command = substr($alias_command, 1); + + $shell_argv = array_merge( + array($shell_command), + $alias_argv, + $argv); + + $shell_display = csprintf('%Ls', $shell_argv); + + $results[] = $this->newEffect(ArcanistAliasEffect::EFFECT_SHELL) + ->setMessage( + pht( + '%s %s -> $ %s', + $toolset_key, + $command, + $shell_display)) + ->setArguments($shell_argv); + + return $results; + } + + if (isset($stack[$alias_command])) { + + $cycle = array_keys($stack); + $cycle[] = $alias_command; + $cycle = implode(' -> ', $cycle); + + $results[] = $this->newEffect(ArcanistAliasEffect::EFFECT_CYCLE) + ->setMessage( + pht( + 'Alias definitions form a cycle which can not be resolved: %s.', + $cycle)); + + return $results; + } + + $stack[$alias_command] = true; + + $stack_limit = 16; + if (count($stack) >= $stack_limit) { + $results[] = $this->newEffect(ArcanistAliasEffect::EFFECT_STACK) + ->setMessage( + pht( + 'Alias definitions form an unreasonably deep stack. A chain of '. + 'aliases may not resolve more than %s times.', + new PhutilNumber($stack_limit))); + return $results; + } + + $display_argv = (string)csprintf('%LR', $alias_argv); + + $results[] = $this->newEffect(ArcanistAliasEffect::EFFECT_ALIAS) + ->setMessage( + pht( + '%s %s -> %s %s %s', + $toolset_key, + $command, + $toolset_key, + $alias_command, + $display_argv)); + + $argv = array_merge($alias_argv, $argv); + + return $this->resolveAliasesForCommand( + $aliases, + $alias_command, + $argv, + $results, + $stack); + } + + protected function newEffect($effect_type) { + return id(new ArcanistAliasEffect()) + ->setType($effect_type); + } + +} diff --git a/src/toolset/ArcanistArcToolset.php b/src/toolset/ArcanistArcToolset.php new file mode 100644 index 00000000..fb3ceff4 --- /dev/null +++ b/src/toolset/ArcanistArcToolset.php @@ -0,0 +1,26 @@ + 'conduit-uri', + 'param' => 'uri', + 'help' => pht('Connect to Phabricator install specified by __uri__.'), + ), + array( + 'name' => 'conduit-token', + 'param' => 'token', + 'help' => pht('Use a specific authentication token.'), + ), + array( + 'name' => 'anonymous', + 'help' => pht('Run workflow as a public user, without authenticating.'), + ), + ); + } + +} diff --git a/src/toolset/ArcanistPhutilWorkflow.php b/src/toolset/ArcanistPhutilWorkflow.php new file mode 100644 index 00000000..79fab5b9 --- /dev/null +++ b/src/toolset/ArcanistPhutilWorkflow.php @@ -0,0 +1,24 @@ +workflow = $workflow; + return $this; + } + + public function getWorkflow() { + return $this->workflow; + } + + public function isExecutable() { + return true; + } + + public function execute(PhutilArgumentParser $args) { + return $this->getWorkflow()->executeWorkflow($args); + } + +} diff --git a/src/toolset/ArcanistPrompt.php b/src/toolset/ArcanistPrompt.php new file mode 100644 index 00000000..8cd4a912 --- /dev/null +++ b/src/toolset/ArcanistPrompt.php @@ -0,0 +1,151 @@ +key = $key; + return $this; + } + + public function getKey() { + return $this->key; + } + + public function setWorkflow(ArcanistWorkflow $workflow) { + $this->workflow = $workflow; + return $this; + } + + public function getWorkflow() { + return $this->workflow; + } + + public function setDescription($description) { + $this->description = $description; + return $this; + } + + public function getDescription() { + return $this->description; + } + + public function setQuery($query) { + $this->query = $query; + return $this; + } + + public function getQuery() { + return $this->query; + } + + public function execute() { + $workflow = $this->getWorkflow(); + if ($workflow) { + $workflow_ok = $workflow->hasPrompt($this->getKey()); + } else { + $workflow_ok = false; + } + + if (!$workflow_ok) { + throw new Exception( + pht( + 'Prompt ("%s") is executing, but it is not properly bound to the '. + 'invoking workflow. You may have called "newPrompt()" to execute a '. + 'prompt instead of "getPrompt()". Use "newPrompt()" when defining '. + 'prompts and "getPrompt()" when executing them.', + $this->getKey())); + } + + $query = $this->getQuery(); + if (!strlen($query)) { + throw new Exception( + pht( + 'Prompt ("%s") has no query text!', + $this->getKey())); + } + + $options = '[y/N]'; + $default = 'N'; + + try { + phutil_console_require_tty(); + } catch (PhutilConsoleStdinNotInteractiveException $ex) { + // TOOLSETS: Clean this up to provide more details to the user about how + // they can configure prompts to be answered. + + // Throw after echoing the prompt so the user has some idea what happened. + echo $query."\n"; + throw $ex; + } + + // NOTE: We're making stdin nonblocking so that we can respond to signals + // immediately. If we don't, and you ^C during a prompt, the program does + // not handle the signal until fgets() returns. + + $stdin = fopen('php://stdin', 'r'); + if (!$stdin) { + throw new Exception(pht('Failed to open stdin for reading.')); + } + + $ok = stream_set_blocking($stdin, false); + if (!$ok) { + throw new Exception(pht('Unable to set stdin nonblocking.')); + } + + echo "\n"; + + $result = null; + while (true) { + echo tsprintf( + '** %s ** %s %s ', + '>>>', + $query, + $options); + + while (true) { + $read = array($stdin); + $write = array(); + $except = array(); + + $ok = stream_select($read, $write, $except, 1); + if ($ok === false) { + throw new Exception(pht('stream_select() failed!')); + } + + $response = fgets($stdin); + if (!strlen($response)) { + continue; + } + + break; + } + + $response = trim($response); + if (!strlen($response)) { + $response = $default; + } + + if (phutil_utf8_strtolower($response) == 'y') { + $result = true; + break; + } + + if (phutil_utf8_strtolower($response) == 'n') { + $result = false; + break; + } + } + + if (!$result) { + throw new ArcanistUserAbortException(); + } + + } + +} diff --git a/src/toolset/ArcanistToolset.php b/src/toolset/ArcanistToolset.php new file mode 100644 index 00000000..0042762b --- /dev/null +++ b/src/toolset/ArcanistToolset.php @@ -0,0 +1,22 @@ +getPhobjectClassConstant('TOOLSETKEY'); + } + + final public static function newToolsetMap() { + $toolsets = id(new PhutilClassMapQuery()) + ->setAncestorClass(__CLASS__) + ->setUniqueMethod('getToolsetKey') + ->execute(); + + return $toolsets; + } + + public function getToolsetArguments() { + return array(); + } + +} diff --git a/src/toolset/ArcanistWorkflowArgument.php b/src/toolset/ArcanistWorkflowArgument.php new file mode 100644 index 00000000..0c1ab602 --- /dev/null +++ b/src/toolset/ArcanistWorkflowArgument.php @@ -0,0 +1,74 @@ +key = $key; + return $this; + } + + public function getKey() { + return $this->key; + } + + public function setWildcard($wildcard) { + $this->wildcard = $wildcard; + return $this; + } + + public function getWildcard() { + return $this->wildcard; + } + + public function getPhutilSpecification() { + $spec = array( + 'name' => $this->getKey(), + ); + + if ($this->getWildcard()) { + $spec['wildcard'] = true; + } + + $parameter = $this->getParameter(); + if ($parameter !== null) { + $spec['param'] = $parameter; + } + + return $spec; + } + + public function setHelp($help) { + $this->help = $help; + return $this; + } + + public function getHelp() { + return $this->help; + } + + public function setParameter($parameter) { + $this->parameter = $parameter; + return $this; + } + + public function getParameter() { + return $this->parameter; + } + + public function setIsPathArgument($is_path_argument) { + $this->isPathArgument = $is_path_argument; + return $this; + } + + public function getIsPathArgument() { + return $this->isPathArgument; + } + +} diff --git a/src/toolset/ArcanistWorkflowInformation.php b/src/toolset/ArcanistWorkflowInformation.php new file mode 100644 index 00000000..55d31ade --- /dev/null +++ b/src/toolset/ArcanistWorkflowInformation.php @@ -0,0 +1,37 @@ +help = $help; + return $this; + } + + public function getHelp() { + return $this->help; + } + + public function addExample($example) { + $this->examples[] = $example; + return $this; + } + + public function getExamples() { + return $this->examples; + } + + public function setSynopsis($synopsis) { + $this->synopsis = $synopsis; + return $this; + } + + public function getSynopsis() { + return $this->synopsis; + } + +} diff --git a/src/toolset/command/ArcanistCommand.php b/src/toolset/command/ArcanistCommand.php new file mode 100644 index 00000000..0eff69f9 --- /dev/null +++ b/src/toolset/command/ArcanistCommand.php @@ -0,0 +1,59 @@ +executableFuture = $future; + return $this; + } + + public function getExecutableFuture() { + return $this->executableFuture; + } + + public function setLogEngine(ArcanistLogEngine $log_engine) { + $this->logEngine = $log_engine; + return $this; + } + + public function getLogEngine() { + return $this->logEngine; + } + + public function execute() { + $log = $this->getLogEngine(); + $future = $this->getExecutableFuture(); + $command = $future->getCommand(); + + $log->writeNewline(); + + $log->writeStatus( + ' $ ', + tsprintf('**%s**', phutil_string_cast($command))); + + $log->writeNewline(); + + $err = $future->resolve(); + + $log->writeNewline(); + + if ($err) { + $log->writeError( + pht('ERROR'), + pht( + 'Command exited with error code %d.', + $err)); + + throw new CommandException( + pht('Command exited with nonzero error code.'), + $command, + $err, + '', + ''); + } + } +} diff --git a/src/toolset/query/ArcanistRuntimeHardpointQuery.php b/src/toolset/query/ArcanistRuntimeHardpointQuery.php new file mode 100644 index 00000000..aec1cd32 --- /dev/null +++ b/src/toolset/query/ArcanistRuntimeHardpointQuery.php @@ -0,0 +1,118 @@ +runtime = $runtime; + return $this; + } + + final public function getRuntime() { + return $this->runtime; + } + + final public function getWorkingCopy() { + return $this->getRuntime()->getWorkingCopy(); + } + + final public function getRepositoryAPI() { + return $this->getWorkingCopy()->getRepositoryAPI(); + } + + public static function getAllQueries() { + return id(new PhutilClassMapQuery()) + ->setAncestorClass(__CLASS__) + ->execute(); + } + + final public function canLoadObject(ArcanistHardpointObject $object) { + if ($this->canLoadHardpoint === null) { + $this->canLoadHardpoint = $this->canLoadHardpoint(); + } + + if (!$this->canLoadHardpoint) { + return false; + } + + if (!$object instanceof ArcanistRef) { + return false; + } + + return $this->canLoadRef($object); + } + + protected function canLoadHardpoint() { + return true; + } + + abstract protected function canLoadRef(ArcanistRef $ref); + + final public function newConduitSearch( + $method, + $constraints, + $attachments = array()) { + + $conduit_engine = $this->getRuntime() + ->getConduitEngine(); + + $conduit_future = id(new ConduitSearchFuture()) + ->setConduitEngine($conduit_engine) + ->setMethod($method) + ->setConstraints($constraints) + ->setAttachments($attachments); + + return $conduit_future; + } + + final public function yieldConduitSearch($method, $constraints) { + $conduit_future = $this->newConduitSearch($method, $constraints); + return $this->yieldFuture($conduit_future); + } + + final public function newConduit($method, $parameters) { + $conduit_engine = $this->getRuntime() + ->getConduitEngine(); + + $call_object = $conduit_engine->newCall($method, $parameters); + $call_future = $conduit_engine->newFuture($call_object); + + return $call_future; + } + + final public function yieldConduit($method, array $parameters) { + $call_future = $this->newConduit($method, $parameters); + return $this->yieldFuture($call_future); + } + + final public function yieldRepositoryRef() { + // TODO: This should probably move to Runtime. + + $runtime = $this->getRuntime(); + $workflow = $runtime->getCurrentWorkflow(); + + // TODO: This is currently a blocking request, but should yield to the + // hardpoint engine in the future. + + $repository_ref = $workflow->getRepositoryRef(); + $ref_future = new ImmediateFuture($repository_ref); + + return $this->yieldFuture($ref_future); + } + + final public function yieldValue(array $refs, $value) { + assert_instances_of($refs, 'ArcanistRef'); + + $keys = array_keys($refs); + $map = array_fill_keys($keys, $value); + return $this->yieldMap($map); + } + + final public function yieldMap(array $map) { + return new ArcanistHardpointTaskResult($map); + } + +} diff --git a/src/toolset/workflow/ArcanistAliasWorkflow.php b/src/toolset/workflow/ArcanistAliasWorkflow.php new file mode 100644 index 00000000..60a9a1e0 --- /dev/null +++ b/src/toolset/workflow/ArcanistAliasWorkflow.php @@ -0,0 +1,203 @@ + NOTE: Make sure you use "--" before specifying any flags you +want to pass to the command! Otherwise, the flags will be interpreted as flags +to "arc alias". + +**Listing Aliases** + +Without any arguments, "arc alias" will list aliases. + +**Removing Aliases** + +To remove an alias, run: + + $ arc alias + +You will be prompted to remove the alias. + +**Shell Commands** + +If you begin an alias with "!", the remainder of the alias will be invoked as +a shell command. For example, if you want to implement "arc ls", you can do so +like this: + + $ arc alias ls '!ls' + +When run, "arc ls" will now behave like "ls". + +**Multiple Toolsets** + +This workflow supports any toolset, even though the examples in this help text +use "arc". If you are working with another toolset, use the binary for that +toolset define aliases for it: + + $ phage alias ... + +Aliases are bound to the toolset which was used to define them. If you define +an "arc draft" alias, that does not also define a "phage draft" alias. + +**Builtins** + +You can not overwrite the behavior of builtin workflows, including "alias" +itself, and if you install a new workflow it will take precedence over any +existing aliases with the same name. +EOTEXT +); + + return $this->newWorkflowInformation() + ->setSynopsis( + pht('Create and modify command aliases.')) + ->addExample(pht('**alias**')) + ->addExample(pht('**alias** __command__ __target__ -- [__arguments__]')) + ->setHelp($help); + } + + public function getWorkflowArguments() { + return array( + $this->newWorkflowArgument('json') + ->setHelp(pht('Output aliases in JSON format.')), + $this->newWorkflowArgument('argv') + ->setWildcard(true), + ); + } + + public function runWorkflow() { + $argv = $this->getArgument('argv'); + + $is_list = false; + $is_delete = false; + + if (!$argv) { + $is_list = true; + } else if (count($argv) === 1) { + $is_delete = true; + } + + $is_json = $this->getArgument('json'); + if ($is_json && !$is_list) { + throw new PhutilArgumentUsageException( + pht( + 'The "--json" argument may only be used when listing aliases.')); + } + + if ($is_list) { + return $this->runListAliases(); + } + + if ($is_delete) { + return $this->runDeleteAlias($argv[0]); + } + + return $this->runCreateAlias($argv); + } + + private function runListAliases() { + // TOOLSETS: Actually list aliases. + return 1; + } + + private function runDeleteAlias($alias) { + // TOOLSETS: Actually delete aliases. + return 1; + } + + private function runCreateAlias(array $argv) { + $trigger = array_shift($argv); + $this->validateAliasTrigger($trigger); + + $alias = id(new ArcanistAlias()) + ->setToolset($this->getToolsetKey()) + ->setTrigger($trigger) + ->setCommand($argv); + + $aliases = $this->readAliasesForWrite(); + + // TOOLSETS: Check if the user already has an alias for this trigger, and + // prompt them to overwrite it. Needs prompting to work. + + // TOOLSETS: Don't let users set aliases which don't resolve to anything. + + $aliases[] = $alias; + + $this->writeAliases($aliases); + + // TOOLSETS: Print out a confirmation that we added the alias. + + return 0; + } + + private function validateAliasTrigger($trigger) { + $workflows = $this->getRuntime()->getWorkflows(); + + if (isset($workflows[$trigger])) { + throw new PhutilArgumentUsageException( + pht( + 'You can not define an alias for "%s" because it is a builtin '. + 'workflow for the current toolset ("%s"). The "alias" workflow '. + 'can only define new commands as aliases; it can not redefine '. + 'existing commands to mean something else.', + $trigger, + $this->getToolsetKey())); + } + } + + private function getEditScope() { + return ArcanistConfigurationSource::SCOPE_USER; + } + + private function getAliasesConfigKey() { + return ArcanistArcConfigurationEngineExtension::KEY_ALIASES; + } + + private function readAliasesForWrite() { + $key = $this->getAliasesConfigKey(); + $scope = $this->getEditScope(); + $source_list = $this->getConfigurationSourceList(); + + return $source_list->getConfigFromScopes($key, array($scope)); + } + + private function writeAliases(array $aliases) { + assert_instances_of($aliases, 'ArcanistAlias'); + + $key = $this->getAliasesConfigKey(); + $scope = $this->getEditScope(); + + $source_list = $this->getConfigurationSourceList(); + $source = $source_list->getWritableSourceFromScope($scope); + $option = $source_list->getConfigOption($key); + + $option->writeValue($source, $aliases); + } + +} diff --git a/src/toolset/workflow/ArcanistArcWorkflow.php b/src/toolset/workflow/ArcanistArcWorkflow.php new file mode 100644 index 00000000..00ac3e4e --- /dev/null +++ b/src/toolset/workflow/ArcanistArcWorkflow.php @@ -0,0 +1,11 @@ +getToolsetKey(); + return ($key === ArcanistArcToolset::TOOLSETKEY); + } + +} diff --git a/src/toolset/workflow/ArcanistHelpWorkflow.php b/src/toolset/workflow/ArcanistHelpWorkflow.php new file mode 100644 index 00000000..8cda9ab2 --- /dev/null +++ b/src/toolset/workflow/ArcanistHelpWorkflow.php @@ -0,0 +1,19 @@ +setRuntime($this->getRuntime()); + } + + public function supportsToolset(ArcanistToolset $toolset) { + return true; + } + +} diff --git a/src/toolset/workflow/ArcanistPromptsWorkflow.php b/src/toolset/workflow/ArcanistPromptsWorkflow.php new file mode 100644 index 00000000..104bbf8a --- /dev/null +++ b/src/toolset/workflow/ArcanistPromptsWorkflow.php @@ -0,0 +1,80 @@ + +EOTEXT +); + + return $this->newWorkflowInformation() + ->addExample(pht('**prompts** __workflow__')) + ->setHelp($help); + } + + public function getWorkflowArguments() { + return array( + $this->newWorkflowArgument('argv') + ->setWildcard(true), + ); + } + + public function runWorkflow() { + $argv = $this->getArgument('argv'); + + if (!$argv) { + throw new PhutilArgumentUsageException( + pht('Provide a workflow to list prompts for.')); + } + + $runtime = $this->getRuntime(); + $workflows = $runtime->getWorkflows(); + + $workflow_key = array_shift($argv); + $workflow = idx($workflows, $workflow_key); + + if (!$workflow) { + throw new PhutilArgumentUsageException( + pht( + 'Workflow "%s" is unknown. Supported workflows are: %s.', + $workflow_key, + implode(', ', array_keys($workflows)))); + } + + $prompts = $workflow->getPromptMap(); + if (!$prompts) { + echo tsprintf( + "%s\n", + pht('This workflow does not have any prompts.')); + return 0; + } + + foreach ($prompts as $prompt) { + echo tsprintf( + "**%s**\n", + $prompt->getKey()); + echo tsprintf( + "%s\n", + $prompt->getDescription()); + } + + return 0; + } + +} diff --git a/src/toolset/workflow/ArcanistShellCompleteWorkflow.php b/src/toolset/workflow/ArcanistShellCompleteWorkflow.php new file mode 100644 index 00000000..4fc1fb0a --- /dev/null +++ b/src/toolset/workflow/ArcanistShellCompleteWorkflow.php @@ -0,0 +1,660 @@ + + +...your shell should automatically expand the flag to: + + $ arc diff --draft + +**Updating Completion** + +To update shell completion, run the same command: + + $ arc shell-complete + +You can update shell completion without reinstalling it by running: + + $ arc shell-complete --generate + +You may need to update shell completion if: + + - you install new Arcanist toolsets; or + - you move the Arcanist directory; or + - you upgrade Arcanist and the new version fixes shell completion bugs. +EOTEXT +); + + return $this->newWorkflowInformation() + ->setSynopsis(pht('Install shell completion.')) + ->setHelp($help); + } + + public function getWorkflowArguments() { + return array( + $this->newWorkflowArgument('current') + ->setParameter('cursor-position') + ->setHelp( + pht( + 'Internal. Current term in the argument list being completed.')), + $this->newWorkflowArgument('generate') + ->setHelp( + pht( + 'Regenerate shell completion rules, without installing any '. + 'configuration.')), + $this->newWorkflowArgument('shell') + ->setParameter('shell-name') + ->setHelp( + pht( + 'Install completion support for a particular shell.')), + $this->newWorkflowArgument('argv') + ->setWildcard(true), + ); + } + + public function runWorkflow() { + $log = $this->getLogEngine(); + + $argv = $this->getArgument('argv'); + + $is_generate = $this->getArgument('generate'); + $is_shell = (bool)strlen($this->getArgument('shell')); + $is_current = $this->getArgument('current'); + + if ($argv) { + $should_install = false; + $should_generate = false; + + if ($is_generate) { + throw new PhutilArgumentUsageException( + pht( + 'You can not use "--generate" when completing arguments.')); + } + + if ($is_shell) { + throw new PhutilArgumentUsageException( + pht( + 'You can not use "--shell" when completing arguments.')); + } + + } else if ($is_generate) { + $should_install = false; + $should_generate = true; + + if ($is_current) { + throw new PhutilArgumentUsageException( + pht( + 'You can not use "--current" when generating rules.')); + } + + if ($is_shell) { + throw new PhutilArgumentUsageException( + pht( + 'The flags "--generate" and "--shell" are mutually exclusive. '. + 'The "--shell" flag selects which shell to install support for, '. + 'but the "--generate" suppresses installation.')); + } + + } else { + $should_install = true; + $should_generate = true; + + if ($is_current) { + throw new PhutilArgumentUsageException( + pht( + 'You can not use "--current" when installing support.')); + } + } + + if ($should_install) { + $this->runInstall(); + } + + if ($should_generate) { + $this->runGenerate(); + } + + if ($should_install || $should_generate) { + $log->writeHint( + pht('NOTE'), + pht( + 'You may need to open a new terminal window or launch a new shell '. + 'before the changes take effect.')); + return 0; + } + + $this->runAutocomplete(); + } + + protected function newPrompts() { + return array( + $this->newPrompt('arc.shell-complete.install') + ->setDescription( + pht( + 'Confirms writing to to "~/.profile" (or another similar file) '. + 'to install shell completion.')), + ); + } + + private function runInstall() { + $log = $this->getLogEngine(); + + $shells = array( + array( + 'key' => 'bash', + 'path' => '/bin/bash', + 'file' => '.profile', + 'source' => 'hooks/bash-completion.sh', + ), + ); + $shells = ipull($shells, null, 'key'); + + $shell = $this->getArgument('shell'); + if (!$shell) { + $shell = $this->detectShell($shells); + } else { + $shell = $this->selectShell($shells, $shell); + } + + $spec = $shells[$shell]; + $file = $spec['file']; + $home = getenv('HOME'); + + if (!strlen($home)) { + throw new PhutilArgumentUsageException( + pht( + 'The "HOME" environment variable is not defined, so this workflow '. + 'can not identify where to install shell completion.')); + } + + $file_path = getenv('HOME').'/'.$file; + $file_display = '~/'.$file; + + if (Filesystem::pathExists($file_path)) { + $file_path = Filesystem::resolvePath($file_path); + $data = Filesystem::readFile($file_path); + $is_new = false; + } else { + $data = ''; + $is_new = true; + } + + $line = csprintf( + 'source %R # arcanist-shell-complete', + $this->getShellPath($spec['source'])); + + $matches = null; + $replace = preg_match( + '/(\s*\n)?[^\n]+# arcanist-shell-complete\s*(\n\s*)?/', + $data, + $matches, + PREG_OFFSET_CAPTURE); + + $log->writeSuccess( + pht('INSTALL'), + pht( + 'Installing shell completion support for "%s" into "%s".', + $shell, + $file_display)); + + if ($replace) { + $replace_pos = $matches[0][1]; + $replace_line = $matches[0][0]; + $replace_len = strlen($replace_line); + $replace_display = trim($replace_line); + + if ($replace_pos === 0) { + $new_line = $line."\n"; + } else { + $new_line = "\n\n".$line."\n"; + } + + $new_data = substr_replace($data, $new_line, $replace_pos, $replace_len); + + if ($new_data === $data) { + // If we aren't changing anything in the file, just skip the write + // completely. + $needs_write = false; + + $log->writeStatus( + pht('SKIP'), + pht('Shell completion for "%s" is already installed.', $shell)); + + return; + } + + echo tsprintf( + "%s\n\n %s\n\n%s\n\n %s\n", + pht( + 'To update shell completion support for "%s", your existing '. + '"%s" file will be modified. This line will be removed:', + $shell, + $file_display), + $replace_display, + pht('This line will be added:'), + $line); + + $prompt = pht('Rewrite this file?'); + } else { + if ($is_new) { + $new_data = $line."\n"; + + echo tsprintf( + "%s\n\n %s\n", + pht( + 'To install shell completion support for "%s", a new "%s" file '. + 'will be created with this content:', + $shell, + $file_display), + $line); + + $prompt = pht('Create this file?'); + } else { + $new_data = rtrim($data)."\n\n".$line."\n"; + + echo tsprintf( + "%s\n\n %s\n", + pht( + 'To install shell completion support for "%s", this line will be '. + 'added to your existing "%s" file:', + $shell, + $file_display), + $line); + + $prompt = pht('Append to this file?'); + } + } + + $this->getPrompt('arc.shell-complete.install') + ->setQuery($prompt) + ->execute(); + + Filesystem::writeFile($file_path, $new_data); + + $log->writeSuccess( + pht('INSTALLED'), + pht( + 'Installed shell completion support for "%s" to "%s".', + $shell, + $file_display)); + } + + private function selectShell(array $shells, $shell_arg) { + foreach ($shells as $shell) { + if ($shell['key'] === $shell_arg) { + return $shell_arg; + } + } + + throw new PhutilArgumentUsageException( + pht( + 'The shell "%s" is not supported. Supported shells are: %s.', + $shell_arg, + implode(', ', ipull($shells, 'key')))); + } + + private function detectShell(array $shells) { + // NOTE: The "BASH_VERSION" and "ZSH_VERSION" shell variables are not + // passed to subprocesses, so we can't inspect them to figure out which + // shell launched us. If we could figure this out in some other way, it + // would be nice to do so. + + // Instead, just look at "SHELL" (the user's startup shell). + + $log = $this->getLogEngine(); + + $detected = array(); + $log->writeStatus( + pht('DETECT'), + pht('Detecting current shell...')); + + $shell_env = getenv('SHELL'); + if (!strlen($shell_env)) { + $log->writeWarning( + pht('SHELL'), + pht( + 'The "SHELL" environment variable is not defined, so it can '. + 'not be used to detect the shell to install rules for.')); + } else { + $found = false; + foreach ($shells as $shell) { + if ($shell['path'] !== $shell_env) { + continue; + } + + $found = true; + $detected[] = $shell['key']; + + $log->writeSuccess( + pht('SHELL'), + pht( + 'The "SHELL" environment variable has value "%s", so the '. + 'target shell was detected as "%s".', + $shell_env, + $shell['key'])); + } + + if (!$found) { + $log->writeStatus( + pht('SHELL'), + pht( + 'The "SHELL" environment variable does not match any recognized '. + 'shell.')); + } + } + + if (!$detected) { + throw new PhutilArgumentUsageException( + pht( + 'Unable to detect any supported shell, so autocompletion rules '. + 'can not be installed. Use "--shell" to select a shell.')); + } else if (count($detected) > 1) { + throw new PhutilArgumentUsageException( + pht( + 'Multiple supported shells were detected. Unable to determine '. + 'which shell to install autocompletion rules for. Use "--shell" '. + 'to select a shell.')); + } + + return head($detected); + } + + private function runGenerate() { + $log = $this->getLogEngine(); + + $toolsets = ArcanistToolset::newToolsetMap(); + + $log->writeStatus( + pht('GENERATE'), + pht('Generating shell completion rules...')); + + $shells = array('bash'); + foreach ($shells as $shell) { + + $rules = array(); + foreach ($toolsets as $toolset) { + $rules[] = $this->newCompletionRules($toolset, $shell); + } + $rules = implode("\n", $rules); + + $rules_path = $this->getShellPath('rules/'.$shell.'-rules.sh'); + + // If a write wouldn't change anything, skip the write. This allows + // "arc shell-complete" to work if "arcanist/" is on a read-only NFS + // filesystem or something unusual like that. + + $skip_write = false; + if (Filesystem::pathExists($rules_path)) { + $current = Filesystem::readFile($rules_path); + if ($current === $rules) { + $skip_write = true; + } + } + + if ($skip_write) { + $log->writeStatus( + pht('SKIP'), + pht( + 'Rules are already up to date for "%s" in: %s', + $shell, + Filesystem::readablePath($rules_path))); + } else { + Filesystem::writeFile($rules_path, $rules); + $log->writeStatus( + pht('RULES'), + pht( + 'Wrote updated completion rules for "%s" to: %s.', + $shell, + Filesystem::readablePath($rules_path))); + } + } + } + + private function newCompletionRules(ArcanistToolset $toolset, $shell) { + $template_path = $this->getShellPath('templates/'.$shell.'-template.sh'); + $template = Filesystem::readFile($template_path); + + $variables = array( + 'BIN' => $toolset->getToolsetKey(), + ); + + foreach ($variables as $key => $value) { + $template = str_replace('{{{'.$key.'}}}', $value, $template); + } + + return $template; + } + + private function getShellPath($to_file = null) { + $arc_root = dirname(phutil_get_library_root('arcanist')); + return $arc_root.'/support/shell/'.$to_file; + } + + private function runAutocomplete() { + $argv = $this->getArgument('argv'); + $argc = count($argv); + + $pos = $this->getArgument('current'); + if (!$pos) { + $pos = $argc - 1; + } + + if ($pos >= $argc) { + throw new ArcanistUsageException( + pht( + 'Argument position specified with "--current" ("%s") is greater '. + 'than the number of arguments provided ("%s").', + new PhutilNumber($pos), + new PhutilNumber($argc))); + } + + $workflows = $this->getRuntime()->getWorkflows(); + + // NOTE: This isn't quite right. For example, "arc --con" will + // try to autocomplete workflows named "--con", but it should actually + // autocomplete global flags and suggest "--config". + + $is_workflow = ($pos <= 1); + + if ($is_workflow) { + // NOTE: There was previously some logic to try to filter impossible + // workflows out of the completion list based on the VCS in the current + // working directory: for example, if you're in an SVN working directory, + // "arc a" is unlikely to complete to "arc amend" because "amend" does + // not support SVN. It's not clear this logic is valuable, but we could + // consider restoring it if good use cases arise. + + // TOOLSETS: Restore the ability for workflows to opt out of shell + // completion. It is exceptionally unlikely that users want to shell + // complete obscure or internal workflows, like "arc shell-complete" + // itself. Perhaps a good behavior would be to offer these as + // completions if they are the ONLY available completion, since a user + // who has typed "arc shell-comp" likely does want "shell-complete". + + $complete = array(); + foreach ($workflows as $workflow) { + $complete[] = $workflow->getWorkflowName(); + } + + foreach ($this->getConfig('aliases') as $alias) { + if ($alias->getException()) { + continue; + } + + if ($alias->getToolset() !== $this->getToolsetKey()) { + continue; + } + + $complete[] = $alias->getTrigger(); + } + + $partial = $argv[$pos]; + $complete = $this->getMatches($complete, $partial); + + if ($complete) { + return $this->suggestStrings($complete); + } else { + return $this->suggestNothing(); + } + + } else { + // TOOLSETS: We should resolve aliases before picking a workflow, so + // that if you alias "arc draft" to "arc diff --draft", we can suggest + // other "diff" flags when you type "arc draft --q". + + // TOOLSETS: It's possible the workflow isn't in position 1. The user + // may be running "arc --trace diff --dra", for example. + + $workflow = idx($workflows, $argv[1]); + if (!$workflow) { + return $this->suggestNothing(); + } + + $arguments = $workflow->getWorkflowArguments(); + $arguments = mpull($arguments, null, 'getKey'); + $current = idx($argv, $pos, ''); + + $argument = null; + $prev = idx($argv, $pos - 1, null); + if (!strncmp($prev, '--', 2)) { + $prev = substr($prev, 2); + $argument = idx($arguments, $prev); + } + + // If the last argument was a "--thing" argument, test if "--thing" is + // a parameterized argument. If it is, the next argument should be a + // parameter. + + if ($argument && strlen($argument->getParameter())) { + if ($argument->getIsPathArgument()) { + return $this->suggestPaths($current); + } else { + return $this->suggestNothing(); + } + + // TOOLSETS: We can allow workflows and arguments to provide a specific + // list of completeable values, like the "--shell" argument for this + // workflow. + } + + $flags = array(); + $wildcard = null; + foreach ($arguments as $argument) { + if ($argument->getWildcard()) { + $wildcard = $argument; + continue; + } + + $flags[] = '--'.$argument->getKey(); + } + + $matches = $this->getMatches($flags, $current); + + // If whatever the user is completing does not match the prefix of any + // flag, try to autcomplete a wildcard argument if it has some kind of + // meaningful completion. For example, "arc lint READ" should + // autocomplete a file. + + if (!$matches && $wildcard) { + + // TOOLSETS: There was previously some very questionable support for + // autocompleting branches here. This could be moved into Arguments + // and Workflows. + + if ($wildcard->getIsPathArgument()) { + return $this->suggestPaths($current); + } + } + + // TODO: If a command has only one flag, like "--json", don't suggest + // it if the user hasn't typed anything or has only typed "--". + + // TODO: Don't suggest "--flag" arguments which aren't repeatable if + // they are already present in the argument list. + + return $this->suggestStrings($matches); + } + } + + private function suggestPaths($prefix) { + // NOTE: We are returning a directive to the bash script to run "compgen" + // for us rather than running it ourselves. If we run: + // + // compgen -A file -- %s + // + // ...from this context, it fails (exits with error code 1 and no output) + // if the prefix is "foo\ ", on my machine. See T9116 for some dicussion. + echo ''; + return 0; + } + + private function suggestNothing() { + return $this->suggestStrings(array()); + } + + private function suggestStrings(array $strings) { + sort($strings); + echo implode("\n", $strings); + return 0; + } + + private function getMatches(array $candidates, $prefix) { + $matches = array(); + + if (strlen($prefix)) { + foreach ($candidates as $possible) { + if (!strncmp($possible, $prefix, strlen($prefix))) { + $matches[] = $possible; + } + } + + // If we matched nothing, try a case-insensitive match. + if (!$matches) { + foreach ($candidates as $possible) { + if (!strncasecmp($possible, $prefix, strlen($prefix))) { + $matches[] = $possible; + } + } + } + } else { + $matches = $candidates; + } + + return $matches; + } + +} diff --git a/src/toolset/workflow/ArcanistVersionWorkflow.php b/src/toolset/workflow/ArcanistVersionWorkflow.php new file mode 100644 index 00000000..6bc673f5 --- /dev/null +++ b/src/toolset/workflow/ArcanistVersionWorkflow.php @@ -0,0 +1,80 @@ +newWorkflowInformation() + ->setSynopsis(pht('Show toolset version information.')) + ->addExample(pht('**version**')) + ->setHelp($help); + } + + public function getWorkflowArguments() { + return array(); + } + + public function runWorkflow() { + // TOOLSETS: Show the toolset version, not just the "arc" version. + + $console = PhutilConsole::getConsole(); + + if (!Filesystem::binaryExists('git')) { + throw new ArcanistUsageException( + pht( + 'Cannot display current version without "%s" installed.', + 'git')); + } + + $roots = array( + 'arcanist' => dirname(phutil_get_library_root('arcanist')), + ); + + foreach ($roots as $lib => $root) { + $working_copy = ArcanistWorkingCopy::newFromWorkingDirectory($root); + + $repository_api = $working_copy->getRepositoryAPI(); + $is_git = ($repository_api instanceof ArcanistGitAPI); + + if (!$is_git) { + throw new PhutilArgumentUsageException( + pht( + 'Library "%s" (at "%s") is not a Git working copy, so no version '. + 'information can be provided.', + $lib, + Filesystem::readablePath($root))); + } + + list($commit) = $repository_api->execxLocal( + 'log -1 --format=%s', + '%ct%x01%H'); + $commit = trim($commit); + + list($timestamp, $commit) = explode("\1", $commit); + + $console->writeOut( + "%s %s (%s)\n", + $lib, + $commit, + date('j M Y', (int)$timestamp)); + } + } + +} diff --git a/src/unit/engine/phutil/PhutilTestCase.php b/src/unit/engine/phutil/PhutilTestCase.php index f16d9f2b..fddb0681 100644 --- a/src/unit/engine/phutil/PhutilTestCase.php +++ b/src/unit/engine/phutil/PhutilTestCase.php @@ -20,6 +20,7 @@ abstract class PhutilTestCase extends Phobject { private $paths; private $renderer; + private static $executables = array(); /* -( Making Test Assertions )--------------------------------------------- */ @@ -748,4 +749,37 @@ abstract class PhutilTestCase extends Phobject { throw new PhutilTestTerminatedException($output); } + final protected function assertExecutable($binary) { + if (!isset(self::$executables[$binary])) { + switch ($binary) { + case 'xhpast': + $ok = true; + if (!PhutilXHPASTBinary::isAvailable()) { + try { + PhutilXHPASTBinary::build(); + } catch (Exception $ex) { + $ok = false; + } + } + break; + default: + $ok = Filesystem::binaryExists($binary); + break; + } + + self::$executables[$binary] = $ok; + } + + if (!self::$executables[$binary]) { + $this->assertSkipped( + pht('Required executable "%s" is not available.', $binary)); + } + } + + final protected function getSupportExecutable($executable) { + $root = dirname(phutil_get_library_root('arcanist')); + return $root.'/support/unit/'.$executable.'.php'; + } + + } diff --git a/src/upload/ArcanistFileUploader.php b/src/upload/ArcanistFileUploader.php index daf4136d..5e1841f4 100644 --- a/src/upload/ArcanistFileUploader.php +++ b/src/upload/ArcanistFileUploader.php @@ -5,7 +5,7 @@ * * // Create a new uploader. * $uploader = id(new ArcanistFileUploader()) - * ->setConduitClient($conduit); + * ->setConduitEngine($conduit); * * // Queue one or more files to be uploaded. * $file = id(new ArcanistFileDataRef()) @@ -25,22 +25,14 @@ */ final class ArcanistFileUploader extends Phobject { - private $conduit; + private $conduitEngine; private $files = array(); /* -( Configuring the Uploader )------------------------------------------- */ - - /** - * Provide a Conduit client to choose which server to upload files to. - * - * @param ConduitClient Configured client. - * @return this - * @task config - */ - public function setConduitClient(ConduitClient $conduit) { - $this->conduit = $conduit; + public function setConduitEngine(ArcanistConduitEngine $engine) { + $this->conduitEngine = $engine; return $this; } @@ -85,7 +77,7 @@ final class ArcanistFileUploader extends Phobject { * Upload files to the server. * * This transfers all files which have been queued with @{method:addFiles} - * over the Conduit link configured with @{method:setConduitClient}. + * over the Conduit link configured with @{method:setConduitEngine}. * * This method returns a map of all file data references. If references were * added with an explicit key when @{method:addFile} was called, the key is @@ -99,8 +91,8 @@ final class ArcanistFileUploader extends Phobject { * @task upload */ public function uploadFiles() { - if (!$this->conduit) { - throw new PhutilInvalidStateException('setConduitClient'); + if (!$this->conduitEngine) { + throw new PhutilInvalidStateException('setConduitEngine'); } $files = $this->files; @@ -113,7 +105,7 @@ final class ArcanistFileUploader extends Phobject { } } - $conduit = $this->conduit; + $conduit = $this->conduitEngine; $futures = array(); foreach ($files as $key => $file) { $params = $this->getUploadParameters($file) + array( @@ -126,7 +118,11 @@ final class ArcanistFileUploader extends Phobject { $params['deleteAfterEpoch'] = $delete_after; } - $futures[$key] = $conduit->callMethod('file.allocate', $params); + // TOOLSETS: This should be a real future, but ConduitEngine and + // ConduitCall are currently built oddly and return pretend futures. + + $futures[$key] = new ImmediateFuture( + $conduit->resolveCall('file.allocate', $params)); } $iterator = id(new FutureIterator($futures))->limit(4); @@ -219,9 +215,9 @@ final class ArcanistFileUploader extends Phobject { * @task internal */ private function uploadChunks(ArcanistFileDataRef $file, $file_phid) { - $conduit = $this->conduit; + $conduit = $this->conduitEngine; - $chunks = $conduit->callMethodSynchronous( + $chunks = $conduit->resolveCall( 'file.querychunks', array( 'filePHID' => $file_phid, @@ -262,7 +258,7 @@ final class ArcanistFileUploader extends Phobject { foreach ($remaining as $chunk) { $data = $file->readBytes($chunk['byteStart'], $chunk['byteEnd']); - $conduit->callMethodSynchronous( + $conduit->resolveCall( 'file.uploadchunk', array( 'filePHID' => $file_phid, @@ -282,11 +278,11 @@ final class ArcanistFileUploader extends Phobject { * @task internal */ private function uploadData(ArcanistFileDataRef $file) { - $conduit = $this->conduit; + $conduit = $this->conduitEngine; $data = $file->readBytes(0, $file->getByteSize()); - return $conduit->callMethodSynchronous( + return $conduit->resolveCall( 'file.upload', $this->getUploadParameters($file) + array( 'data_base64' => base64_encode($data), diff --git a/src/utils/AbstractDirectedGraph.php b/src/utils/AbstractDirectedGraph.php new file mode 100644 index 00000000..509f0f5f --- /dev/null +++ b/src/utils/AbstractDirectedGraph.php @@ -0,0 +1,337 @@ +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; + } + + /** + * Get the nodes in topological order. + * + * This method requires the graph be acyclic. For graphs which may contain + * cycles, see @{method:getNodesInRoughTopologicalOrder}. + */ + final public function getNodesInTopologicalOrder() { + $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; + } + + /** + * Get the nodes in topological order, or some roughly similar order if + * the graph contains cycles. + * + * This method will return an ordering for cyclic graphs. The method will + * attempt to make it look like a topological ordering, but since cyclic + * graphs have no complete toplogical ordering, you might get anything. + * + * If you know the graph is acyclic and want an actual topological order, + * use @{method:getNodesInTopologicalOrder}. + */ + final public function getNodesInRoughTopologicalOrder() { + $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 index 00000000..5f8cae53 --- /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 index 00000000..8656bab3 --- /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 index 00000000..3ae4928a --- /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 index 00000000..3f40b65d --- /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 index 00000000..2eab78df --- /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 index 00000000..a002c5fe --- /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 index 00000000..ccbeccf4 --- /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 index 00000000..36cef1b1 --- /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 index 00000000..b684eec1 --- /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 index 00000000..f9e2b1ba --- /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 index 00000000..8b55e3b5 --- /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/PhutilProxyIterator.php b/src/utils/PhutilProxyIterator.php new file mode 100644 index 00000000..f75a9f96 --- /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 index 00000000..31d7aa27 --- /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 index 00000000..00146070 --- /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 index 00000000..067b98f9 --- /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 index 00000000..6c6d5dcd --- /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 index 00000000..888a7ee8 --- /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 index 00000000..19128d6f --- /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 testTopologicalOrder() { + $graph = array( + 'A' => array('B', 'C'), + 'B' => array('D', 'E'), + 'C' => array(), + 'D' => array(), + 'E' => array(), + ); + + $sorted = $this->getTopologicalOrder($graph); + + $this->assertEqual( + array('A', 'C', 'B', 'E', 'D'), + $sorted, + pht('Topologically sorted tree.')); + + $graph = array( + 'A' => array('B', 'C'), + 'B' => array('C'), + 'C' => array('D', 'E'), + 'D' => array('E'), + 'E' => array(), + ); + + $sorted = $this->getTopologicalOrder($graph); + + $this->assertEqual( + array('A', 'B', 'C', 'D', 'E'), + $sorted, + pht('Topologically sorted tree with nesting.')); + } + + public function testRoughTopologicalOrder() { + $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->getRoughTopologicalOrder($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 getTopologicalOrder(array $graph, $seed = 'A') { + $detector = new TestAbstractDirectedGraph(); + $detector->setTestData($graph); + $detector->addNodes(array_select_keys($graph, array($seed))); + $detector->loadGraph(); + return $detector->getNodesInTopologicalOrder(); + } + + private function getRoughTopologicalOrder(array $graph) { + $detector = new TestAbstractDirectedGraph(); + $detector->setTestData($graph); + $detector->addNodes(array_keys($graph)); + return $detector->getNodesInRoughTopologicalOrder(); + } + +} diff --git a/src/utils/__tests__/CaseInsensitiveArrayTestCase.php b/src/utils/__tests__/CaseInsensitiveArrayTestCase.php new file mode 100644 index 00000000..cddf17bd --- /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 index 00000000..4a6ae20d --- /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 index 00000000..e8140463 --- /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 index 00000000..7db6b4e6 --- /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 index 00000000..2f9a55bb --- /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 index 00000000..eaed7fa0 --- /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 index 00000000..1328fe84 --- /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 index 00000000..121bf0d8 --- /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 index 00000000..ce004f51 --- /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__/PhutilRopeTestCase.php b/src/utils/__tests__/PhutilRopeTestCase.php new file mode 100644 index 00000000..a397f8d9 --- /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 index 00000000..447a79d7 --- /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 index 00000000..7e85f89c --- /dev/null +++ b/src/utils/__tests__/PhutilUTF8TestCase.php @@ -0,0 +1,827 @@ +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) { + if ($input !== $expect) { + $this->assertEqual( + false, + phutil_is_utf8_slowly($input), + pht('Slowly reject overlong form of: %s', $input)); + } + + $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) { + if ($input !== $expect) { + $this->assertEqual( + false, + phutil_is_utf8_slowly($input), + pht('Slowly reject surrogate: %s', $input)); + } + + $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 index 00000000..e1bade52 --- /dev/null +++ b/src/utils/__tests__/PhutilUtilsTestCase.php @@ -0,0 +1,969 @@ +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 testAssertSameKeys() { + $cases = array( + array(true, array(), array()), + array(true, array(0), array(1)), + + array(false, array(0), array()), + array(false, array(), array(0)), + + array(false, array('a' => 1), array('b' => 1)), + + // Make sure "null" values survive "isset()" tests. + array(true, array('a' => 1), array('a' => null)), + + // Key order should not matter. + array(true, array('a' => 1, 'b' => 1), array('b' => 1, 'a' => 1)), + ); + + foreach ($cases as $case) { + list($same_keys, $expect, $input) = $case; + + $caught = null; + try { + assert_same_keys($expect, $input); + } catch (InvalidArgumentException $ex) { + $caught = $ex; + } + + $this->assertEqual($same_keys, ($caught === null)); + } + } + + 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, + '1 minute in milliseconds' => 60000, + '2 minutes in microseconds' => 120000000, + ); + + foreach ($cases as $input => $expect) { + $this->assertEqual( + $expect, + phutil_units($input), + 'phutil_units("'.$input.'")'); + } + + $bad_cases = array( + 'quack', + '3 years in seconds', + '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()))))); + + // NOTE: Object behavior differs across PHP versions. Older versions of + // PHP export objects as "stdClass::__set_state(array())". Newer versions + // of PHP (7.3+) export objects as "(object) array()". + } + + 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); + } + + public function testQueryStringEncoding() { + $expect = array(); + + // As a starting point, we expect every character to encode as an "%XX" + // escaped version. + foreach (range(0, 255) as $byte) { + $c = chr($byte); + $expect[$c] = sprintf('%%%02X', $byte); + } + + // We expect these characters to not be escaped. + $ranges = array( + range('a', 'z'), + range('A', 'Z'), + range('0', '9'), + array('-', '.', '_', '~'), + ); + + foreach ($ranges as $range) { + foreach ($range as $preserve_char) { + $expect[$preserve_char] = $preserve_char; + } + } + + foreach (range(0, 255) as $byte) { + $c = chr($byte); + + $expect_c = $expect[$c]; + $expect_str = "{$expect_c}={$expect_c}"; + + $actual_str = phutil_build_http_querystring(array($c => $c)); + + $this->assertEqual( + $expect_str, + $actual_str, + pht('HTTP querystring for byte "%s".', sprintf('0x%02x', $byte))); + } + } + + public function testNaturalList() { + $cases = array( + array(true, array()), + array(true, array(0 => true, 1 => true, 2 => true)), + array(true, array('a', 'b', 'c')), + array(false, array(0 => true, 2 => true, 1 => true)), + array(false, array(1 => true)), + array(false, array('sound' => 'quack')), + ); + + foreach ($cases as $case) { + list($expect, $value) = $case; + $this->assertEqual($expect, phutil_is_natural_list($value)); + } + } + +} diff --git a/src/utils/__tests__/TestAbstractDirectedGraph.php b/src/utils/__tests__/TestAbstractDirectedGraph.php new file mode 100644 index 00000000..b095da60 --- /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 index 00000000..79261452 --- /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 index 00000000..01b573fe --- /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 index 00000000..79261452 --- /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 index 00000000..d9582d2b --- /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 index 00000000..675d3534 --- /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 index 00000000..775e8114 --- /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 index 00000000..b0a6f3f3 --- /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 index 00000000..7aff7f76 --- /dev/null +++ b/src/utils/utf8.php @@ -0,0 +1,978 @@ += 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 == 0xED) { + // See T11525. Some sequences in this block are surrogate codepoints + // that are reserved for use in UTF16. We should reject them. + $codepoint = ($chr & 0x0F) << 12; + ++$ii; + if ($ii >= $len) { + return false; + } + $chr = ord($string[$ii]); + $codepoint += ($chr & 0x3F) << 6; + if ($chr >= 0x80 && $chr <= 0xBF) { + ++$ii; + if ($ii >= $len) { + return false; + } + $chr = ord($string[$ii]); + $codepoint += ($chr & 0x3F); + + if ($codepoint >= 0xD800 && $codepoint <= 0xDFFF) { + // Reject these surrogate codepoints. + return false; + } + + 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 index 00000000..0bb1b4f8 --- /dev/null +++ b/src/utils/utils.php @@ -0,0 +1,1968 @@ +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); + + // See T13303. A "PhutilSortVector" is technically a sortable object, so + // a method which returns a "PhutilSortVector" is suitable for use with + // "msort()". However, it's almost certain that the caller intended to use + // "msortv()", not "msort()", and forgot to add a "v". Treat this as an error. + + if ($surrogate) { + $item = head($surrogate); + if ($item instanceof PhutilSortVector) { + throw new Exception( + pht( + 'msort() was passed a method ("%s") which returns '. + '"PhutilSortVector" objects. Use "msortv()", not "msort()", to '. + 'sort a list which produces vectors.', + $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 two arrays have the exact same keys, in any order. + * + * @param map Array with expected keys. + * @param map Array with actual keys. + * @return void + */ +function assert_same_keys(array $expect, array $actual) { + foreach ($expect as $key => $value) { + if (isset($actual[$key]) || array_key_exists($key, $actual)) { + continue; + } + + throw new InvalidArgumentException( + pht( + 'Expected to find key "%s", but it is not present.', + $key)); + + } + + foreach ($actual as $key => $value) { + if (isset($expect[$key]) || array_key_exists($key, $expect)) { + continue; + } + + throw new InvalidArgumentException( + pht( + 'Found unexpected surplus key "%s" where no such key was expected.', + $key)); + } +} + +/** + * 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. + * + * @phutil-external-symbol class PhutilSafeHTML + * @phutil-external-symbol function phutil_safe_html + */ +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) { + foreach ($lines as $key => $line) { + $lines[$key] = phutil_safe_html($line); + } + return $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. + + // (Signals received during the "fwrite()" do not appear to affect anything, + // see D20083.) + + $read = array(); + $write = array($stream); + $except = array(); + + $result = @stream_select($read, $write, $except, 0); + if ($result === false) { + // See T13243. If the select is interrupted by a signal, it may return + // "false" indicating an underlying EINTR condition. In this case, the + // results (notably, "$write") are not usable because "stream_select()" + // didn't update them. + + // In this case, treat this stream as blocked and tell the caller to + // retry, since EINTR is the only condition we're currently aware of that + // can cause "fwrite()" to return "0" and "stream_select()" to return + // "false" on the same stream. + return 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; + + case 'milliseconds': + switch ($src_unit) { + case 'second': + case 'seconds': + $factor = 1000; + break; + case 'minute': + case 'minutes': + $factor = 1000 * 60; + break; + case 'hour': + case 'hours': + $factor = 1000 * 60 * 60; + break; + case 'day': + case 'days': + $factor = 1000 * 60 * 60 * 24; + break; + default: + throw new InvalidArgumentException( + pht( + 'This function can not convert from the unit "%s".', + $src_unit)); + } + break; + + case 'microseconds': + switch ($src_unit) { + case 'second': + case 'seconds': + $factor = 1000000; + break; + case 'minute': + case 'minutes': + $factor = 1000000 * 60; + break; + case 'hour': + case 'hours': + $factor = 1000000 * 60 * 60; + break; + case 'day': + case 'days': + $factor = 1000000 * 60 * 60 * 24; + 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; + } +} + + +/** + * Compute the number of microseconds that have elapsed since an earlier + * timestamp (from `microtime(true)`). + * + * @param double Microsecond-precision timestamp, from `microtime(true)`. + * @return int Elapsed microseconds. + */ +function phutil_microseconds_since($timestamp) { + if (!is_float($timestamp)) { + throw new Exception( + pht( + 'Argument to "phutil_microseconds_since(...)" should be a value '. + 'returned from "microtime(true)".')); + } + + $delta = (microtime(true) - $timestamp); + $delta = 1000000 * $delta; + $delta = (int)$delta; + + return $delta; +} + + +/** + * 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 { + $have_call = false; + if (function_exists('parse_ini_string')) { + if (defined('INI_SCANNER_RAW')) { + $results = @parse_ini_string($string, true, INI_SCANNER_RAW); + $have_call = true; + } + } + + if (!$have_call) { + 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())); + } + + 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 = !phutil_is_natural_list($var); + + $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('@(?:(? Dictionary of parameters. + * @return string HTTP query string. + */ +function phutil_build_http_querystring(array $parameters) { + $pairs = array(); + foreach ($parameters as $key => $value) { + $pairs[] = array($key, $value); + } + + return phutil_build_http_querystring_from_pairs($pairs); +} + +/** + * Build a query string from a list of parameter pairs. + * + * @param list> List of pairs. + * @return string HTTP query string. + */ +function phutil_build_http_querystring_from_pairs(array $pairs) { + // We want to encode in RFC3986 mode, but "http_build_query()" did not get + // a flag for that mode until PHP 5.4.0. This is equivalent to calling + // "http_build_query()" with the "PHP_QUERY_RFC3986" flag. + + $query = array(); + foreach ($pairs as $pair_key => $pair) { + if (!is_array($pair) || (count($pair) !== 2)) { + throw new Exception( + pht( + 'HTTP parameter pair (with key "%s") is not valid: each pair must '. + 'be an array with exactly two elements.', + $pair_key)); + } + + list($key, $value) = $pair; + list($key, $value) = phutil_http_parameter_pair($key, $value); + $query[] = rawurlencode($key).'='.rawurlencode($value); + } + $query = implode('&', $query); + + return $query; +} + +/** + * Typecheck and cast an HTTP key-value parameter pair. + * + * Scalar values are converted to strings. Nonscalar values raise exceptions. + * + * @param scalar HTTP parameter key. + * @param scalar HTTP parameter value. + * @return pair Key and value as strings. + */ +function phutil_http_parameter_pair($key, $value) { + try { + assert_stringlike($key); + } catch (InvalidArgumentException $ex) { + throw new PhutilProxyException( + pht('HTTP query parameter key must be a scalar.'), + $ex); + } + + $key = phutil_string_cast($key); + + try { + assert_stringlike($value); + } catch (InvalidArgumentException $ex) { + throw new PhutilProxyException( + pht( + 'HTTP query parameter value (for key "%s") must be a scalar.', + $key), + $ex); + } + + $value = phutil_string_cast($value); + + return array($key, $value); +} + +function phutil_decode_mime_header($header) { + if (function_exists('iconv_mime_decode')) { + return iconv_mime_decode($header, 0, 'UTF-8'); + } + + if (function_exists('mb_decode_mimeheader')) { + return mb_decode_mimeheader($header); + } + + throw new Exception( + pht( + 'Unable to decode MIME header: install "iconv" or "mbstring" '. + 'extension.')); +} + +/** + * Perform a "(string)" cast without disabling standard exception behavior. + * + * When PHP invokes "__toString()" automatically, it fatals if the method + * raises an exception. In older versions of PHP (until PHP 7.1), this fatal is + * fairly opaque and does not give you any information about the exception + * itself, although newer versions of PHP at least include the exception + * message. + * + * This is documented on the "__toString()" manual page: + * + * Warning + * You cannot throw an exception from within a __toString() method. Doing + * so will result in a fatal error. + * + * However, this only applies to implicit invocation by the language runtime. + * Application code can safely call `__toString()` directly without any effect + * on exception handling behavior. Very cool. + * + * We also reject arrays. PHP casts them to the string "Array". This behavior + * is, charitably, evil. + * + * @param wild Any value which aspires to be represented as a string. + * @return string String representation of the provided value. + */ +function phutil_string_cast($value) { + if (is_array($value)) { + throw new Exception( + pht( + 'Value passed to "phutil_string_cast()" is an array; arrays can '. + 'not be sensibly cast to strings.')); + } + + if (is_object($value)) { + $string = $value->__toString(); + + if (!is_string($string)) { + throw new Exception( + pht( + 'Object (of class "%s") did not return a string from "__toString()".', + get_class($value))); + } + + return $string; + } + + return (string)$value; +} + + +/** + * Return a short, human-readable description of an object's type. + * + * This is mostly useful for raising errors like "expected x() to return a Y, + * but it returned a Z". + * + * This is similar to "get_type()", but describes objects and arrays in more + * detail. + * + * @param wild Anything. + * @return string Human-readable description of the value's type. + */ +function phutil_describe_type($value) { + return PhutilTypeSpec::getTypeOf($value); +} + + +/** + * Test if a list has the natural numbers (1, 2, 3, and so on) as keys, in + * order. + * + * @return bool True if the list is a natural list. + */ +function phutil_is_natural_list(array $list) { + $expect = 0; + + foreach ($list as $key => $item) { + if ($key !== $expect) { + return false; + } + $expect++; + } + + return true; +} + + +/** + * 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); +} + +function phutil_is_noninteractive() { + if (function_exists('posix_isatty') && !posix_isatty(STDIN)) { + return true; + } + + return false; +} + +function phutil_is_interactive() { + if (function_exists('posix_isatty') && posix_isatty(STDIN)) { + return true; + } + + return false; +} + +function phutil_encode_log($message) { + return addcslashes($message, "\0..\37\\\177..\377"); +} + +/** + * Insert a value in between each pair of elements in a list. + * + * Keys in the input list are preserved. + */ +function phutil_glue(array $list, $glue) { + if (!$list) { + return $list; + } + + $last_key = last_key($list); + + $keys = array(); + $values = array(); + + $tmp = $list; + + foreach ($list as $key => $ignored) { + $keys[] = $key; + if ($key !== $last_key) { + $tmp[] = $glue; + $keys[] = last_key($tmp); + } + } + + return array_select_keys($tmp, $keys); +} diff --git a/src/utils/viewutils.php b/src/utils/viewutils.php new file mode 100644 index 00000000..ea7f74ed --- /dev/null +++ b/src/utils/viewutils.php @@ -0,0 +1,170 @@ + $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/workflow/ArcanistAliasWorkflow.php b/src/workflow/ArcanistAliasWorkflow.php deleted file mode 100644 index b27b3ebf..00000000 --- a/src/workflow/ArcanistAliasWorkflow.php +++ /dev/null @@ -1,240 +0,0 @@ - 'argv', - ); - } - - public static function getAliases( - ArcanistConfigurationManager $configuration_manager) { - $sources = $configuration_manager->getConfigFromAllSources('aliases'); - - $aliases = array(); - foreach ($sources as $source) { - $aliases += $source; - } - - return $aliases; - } - - private function writeAliases(array $aliases) { - $config = $this->getConfigurationManager()->readUserConfigurationFile(); - $config['aliases'] = $aliases; - $this->getConfigurationManager()->writeUserConfigurationFile($config); - } - - public function run() { - $aliases = self::getAliases($this->getConfigurationManager()); - - $argv = $this->getArgument('argv'); - if (count($argv) == 0) { - $this->printAliases($aliases); - } else if (count($argv) == 1) { - $this->removeAlias($aliases, $argv[0]); - } else { - $arc_config = $this->getArcanistConfiguration(); - $alias = $argv[0]; - - if ($arc_config->buildWorkflow($alias)) { - throw new ArcanistUsageException( - pht( - 'You can not create an alias for "%s" because it is a '. - 'builtin command. "%s" can only create new commands.', - "arc {$alias}", - 'arc alias')); - } - - $new_alias = array_slice($argv, 1); - - $command = implode(' ', $new_alias); - if (self::isShellCommandAlias($command)) { - echo tsprintf( - "%s\n", - pht( - 'Aliased "%s" to shell command "%s".', - "arc {$alias}", - substr($command, 1))); - } else { - echo tsprintf( - "%s\n", - pht( - 'Aliased "%s" to "%s".', - "arc {$alias}", - "arc {$command}")); - } - - $aliases[$alias] = $new_alias; - $this->writeAliases($aliases); - } - - return 0; - } - - public static function isShellCommandAlias($command) { - return preg_match('/^!/', $command); - } - - public static function resolveAliases( - $command, - ArcanistConfiguration $config, - array $argv, - ArcanistConfigurationManager $configuration_manager) { - - $aliases = self::getAliases($configuration_manager); - if (!isset($aliases[$command])) { - return array(null, $argv); - } - - $new_command = head($aliases[$command]); - - if (self::isShellCommandAlias($new_command)) { - return array($new_command, $argv); - } - - $workflow = $config->buildWorkflow($new_command); - if (!$workflow) { - return array(null, $argv); - } - - $alias_argv = array_slice($aliases[$command], 1); - foreach (array_reverse($alias_argv) as $alias_arg) { - if (!in_array($alias_arg, $argv)) { - array_unshift($argv, $alias_arg); - } - } - - return array($new_command, $argv); - } - - private function printAliases(array $aliases) { - if (!$aliases) { - echo tsprintf( - "%s\n", - pht('You have not defined any aliases yet.')); - return; - } - - $table = id(new PhutilConsoleTable()) - ->addColumn('input', array('title' => pht('Alias'))) - ->addColumn('command', array('title' => pht('Command'))) - ->addColumn('type', array('title' => pht('Type'))); - - ksort($aliases); - - foreach ($aliases as $alias => $binding) { - $command = implode(' ', $binding); - if (self::isShellCommandAlias($command)) { - $command = substr($command, 1); - $type = pht('Shell Command'); - } else { - $command = "arc {$command}"; - $type = pht('Arcanist Command'); - } - - $row = array( - 'input' => "arc {$alias}", - 'type' => $type, - 'command' => $command, - ); - - $table->addRow($row); - } - - $table->draw(); - } - - private function removeAlias(array $aliases, $alias) { - if (empty($aliases[$alias])) { - echo tsprintf( - "%s\n", - pht('No alias "%s" to remove.', $alias)); - return; - } - - $command = implode(' ', $aliases[$alias]); - - if (self::isShellCommandAlias($command)) { - echo tsprintf( - "%s\n", - pht( - '"%s" is currently aliased to shell command "%s".', - "arc {$alias}", - substr($command, 1))); - } else { - echo tsprintf( - "%s\n", - pht( - '"%s" is currently aliased to "%s".', - "arc {$alias}", - "arc {$command}")); - } - - - $ok = phutil_console_confirm(pht('Delete this alias?')); - if (!$ok) { - throw new ArcanistUserAbortException(); - } - - unset($aliases[$alias]); - $this->writeAliases($aliases); - - echo tsprintf( - "%s\n", - pht( - 'Removed alias "%s".', - "arc {$alias}")); - } - -} diff --git a/src/workflow/ArcanistAmendWorkflow.php b/src/workflow/ArcanistAmendWorkflow.php index e660d890..be1cf25f 100644 --- a/src/workflow/ArcanistAmendWorkflow.php +++ b/src/workflow/ArcanistAmendWorkflow.php @@ -1,210 +1,278 @@ newWorkflowInformation() + ->setSynopsis( + pht('Amend the working copy, synchronizing the local commit message.')) + ->addExample('**amend** [options] -- ') + ->setHelp($help); } - public function getCommandHelp() { - return phutil_console_format(<< array( - 'help' => pht( - 'Show the amended commit message, without modifying the '. - 'working copy.'), - ), - 'revision' => array( - 'param' => 'revision_id', - 'help' => pht( - 'Use the message from a specific revision. If you do not specify '. - 'a revision, arc will guess which revision is in the working '. - 'copy.'), - ), + $this->newWorkflowArgument('show') + ->setHelp( + pht( + 'Show the amended commit message, without modifying the '. + 'working copy.')), + $this->newWorkflowArgument('revision') + ->setParameter('id') + ->setHelp( + pht( + 'Use the message from a specific revision. If you do not specify '. + 'a revision, arc will guess which revision is in the working '. + 'copy.')), ); } - public function run() { + protected function newPrompts() { + return array( + $this->newPrompt('arc.amend.unrelated') + ->setDescription( + pht( + 'Confirms use of a revision that does not appear to be '. + 'present in the working copy.')), + $this->newPrompt('arc.amend.author') + ->setDescription( + pht( + 'Confirms use of a revision that you are not the author '. + 'of.')), + $this->newPrompt('arc.amend.immutable') + ->setDescription( + pht( + 'Confirms history mutation in a working copy marked as '. + 'immutable.')), + ); + } + + public function runWorkflow() { + $symbols = $this->getSymbolEngine(); + $is_show = $this->getArgument('show'); $repository_api = $this->getRepositoryAPI(); if (!$is_show) { - if (!$repository_api->supportsAmend()) { - throw new ArcanistUsageException( + $this->requireAmendSupport($repository_api); + } + + $revision_symbol = $this->getArgument('revision'); + + // We only care about the local working copy state if we need it to + // figure out which revision we're operating on, or we're planning to + // mutate it. If the caller is running "arc amend --show --revision X", + // the local state does not matter. + + $need_state = + ($revision_symbol === null) || + (!$is_show); + + if ($need_state) { + $state_ref = $repository_api->getCurrentWorkingCopyStateRef(); + + $this->loadHardpoints( + $state_ref, + ArcanistWorkingCopyStateRef::HARDPOINT_REVISIONREFS); + + $revision_refs = $state_ref->getRevisionRefs(); + } + + if ($revision_symbol === null) { + $revision_ref = $this->selectRevisionRef($revision_refs); + } else { + $revision_ref = $symbols->loadRevisionForSymbol($revision_symbol); + if (!$revision_ref) { + throw new PhutilArgumentUsageException( pht( - "You may only run '%s' in a git or hg ". - "(version 2.2 or newer) working copy.", - 'arc amend')); - } - - if ($this->isHistoryImmutable()) { - throw new ArcanistUsageException( - pht( - 'This project is marked as adhering to a conservative history '. - 'mutability doctrine (having an immutable local history), which '. - 'precludes amending commit messages.')); - } - - if ($repository_api->getUncommittedChanges()) { - throw new ArcanistUsageException( - pht( - 'You have uncommitted changes in this branch. Stage and commit '. - '(or revert) them before proceeding.')); + 'Revision "%s" does not exist, or you do not have permission '. + 'to see it.', + $revision_symbol)); } } - $revision_id = null; - if ($this->getArgument('revision')) { - $revision_id = $this->normalizeRevisionID($this->getArgument('revision')); - } - - $repository_api->setBaseCommitArgumentRules('arc:this'); - $in_working_copy = $repository_api->loadWorkingCopyDifferentialRevisions( - $this->getConduit(), - array( - 'status' => 'status-any', - )); - $in_working_copy = ipull($in_working_copy, null, 'id'); - - if (!$revision_id) { - if (count($in_working_copy) == 0) { - throw new ArcanistUsageException( - pht( - "No revision specified with '%s', and no revisions found ". - "in the working copy. Use '%s' to specify which revision ". - "you want to amend.", - '--revision', - '--revision ')); - } else if (count($in_working_copy) > 1) { - $message = pht( - "More than one revision was found in the working copy:\n%s\n". - "Use '%s' to specify which revision you want to amend.", - $this->renderRevisionList($in_working_copy), - '--revision '); - throw new ArcanistUsageException($message); - } else { - $revision_id = key($in_working_copy); - $revision = $in_working_copy[$revision_id]; - if ($revision['authorPHID'] != $this->getUserPHID()) { - $other_author = $this->getConduit()->callMethodSynchronous( - 'user.query', - array( - 'phids' => array($revision['authorPHID']), - )); - $other_author = ipull($other_author, 'userName', 'phid'); - $other_author = $other_author[$revision['authorPHID']]; - $rev_title = $revision['title']; - $ok = phutil_console_confirm( - pht( - "You are amending the revision '%s' but you are not ". - "the author. Amend this revision by %s?", - "D{$revision_id}: {$rev_title}", - $other_author)); - if (!$ok) { - throw new ArcanistUserAbortException(); - } - } - } - } - - $conduit = $this->getConduit(); - try { - $message = $conduit->callMethodSynchronous( - 'differential.getcommitmessage', - array( - 'revision_id' => $revision_id, - 'edit' => false, - )); - } catch (ConduitClientException $ex) { - if (strpos($ex->getMessage(), 'ERR_NOT_FOUND') === false) { - throw $ex; - } else { - throw new ArcanistUsageException( - pht("Revision '%s' does not exist.", "D{$revision_id}") - ); - } - } - - $revision = $conduit->callMethodSynchronous( - 'differential.query', - array( - 'ids' => array($revision_id), - )); - if (empty($revision)) { - throw new Exception( - pht("Failed to lookup information for '%s'!", "D{$revision_id}")); - } - $revision = head($revision); - $revision_title = $revision['title']; - if (!$is_show) { - if ($revision_id && empty($in_working_copy[$revision_id])) { - $ok = phutil_console_confirm( - pht( - "The revision '%s' does not appear to be in the working copy. Are ". - "you sure you want to amend HEAD with the commit message for '%s'?", - "D{$revision_id}", - "D{$revision_id}: {$revision_title}")); - if (!$ok) { - throw new ArcanistUserAbortException(); - } - } + echo tsprintf( + "%s\n\n%s\n", + pht('Amending commit message to reflect revision:'), + $revision_ref->newDisplayRef()); + + $this->confirmAmendAuthor($revision_ref); + $this->confirmAmendNotFound($revision_ref, $state_ref); } - if ($is_show) { - echo $message."\n"; - } else { - echo pht( - "Amending commit message to reflect revision %s.\n", - phutil_console_format( - '**D%d: %s**', - $revision_id, - $revision_title)); + $this->loadHardpoints( + $revision_ref, + ArcanistRevisionRef::HARDPOINT_COMMITMESSAGE); + $message = $revision_ref->getCommitMessage(); + + if ($is_show) { + echo tsprintf( + "%B\n", + $message); + } else { $repository_api->amendCommit($message); } return 0; } - public function getSupportedRevisionControlSystems() { - return array('git', 'hg'); + private function requireAmendSupport(ArcanistRepositoryAPI $api) { + if (!$api->supportsAmend()) { + if ($api instanceof ArcanistMercurialAPI) { + throw new PhutilArgumentUsageException( + pht( + '"arc amend" is only supported under Mercurial 2.2 or newer. '. + 'Older versions of Mercurial do not support the "--amend" flag '. + 'to "hg commit ...", which this workflow requires.')); + } + + throw new PhutilArgumentUsageException( + pht( + '"arc amend" must be run from inside a working copy of a '. + 'repository using a version control system that supports '. + 'amending commits, like Git or Mercurial.')); + } + + if ($this->isHistoryImmutable()) { + echo tsprintf( + "%!\n\n%W\n", + pht('IMMUTABLE WORKING COPY'), + pht( + 'This working copy is configured to have an immutable local '. + 'history, using the "history.immutable" configuration option. '. + 'Amending the working copy will mutate local history.')); + + $prompt = pht('Are you sure you want to mutate history?'); + + $this->getPrompt('arc.amend.immutable') + ->setQuery($prompt) + ->execute(); + } + + return; + + if ($api->getUncommittedChanges()) { + // TODO: Make this class of error show the uncommitted changes. + + // TODO: This only needs to check for staged-but-uncommitted changes. + // We can safely amend with untracked and unstaged changes. + + throw new PhutilArgumentUsageException( + pht( + 'You have uncommitted changes in this working copy. Commit or '. + 'revert them before proceeding.')); + } + } + + private function selectRevisionRef(array $revisions) { + if (!$revisions) { + throw new PhutilArgumentUsageException( + pht( + 'No revision specified with "--revision", and no revisions found '. + 'that match the current working copy state. Use "--revision " '. + 'to specify which revision you want to amend.')); + } + + if (count($revisions) > 1) { + echo tsprintf( + "%!\n%W\n\n%B\n", + pht('MULTIPLE REVISIONS IN WORKING COPY'), + pht('More than one revision was found in the working copy:'), + mpull($revisions, 'newDisplayRef')); + + throw new PhutilArgumentUsageException( + pht( + 'Use "--revision " to specify which revision you want '. + 'to amend.')); + } + + return head($revisions); + } + + private function confirmAmendAuthor(ArcanistRevisionRef $revision_ref) { + $viewer = $this->getViewer(); + $viewer_phid = $viewer->getPHID(); + + $author_phid = $revision_ref->getAuthorPHID(); + + if ($viewer_phid === $author_phid) { + return; + } + + $symbols = $this->getSymbolEngine(); + $author_ref = $symbols->loadUserForSymbol($author_phid); + if (!$author_ref) { + // If we don't have any luck loading the author, skip this warning. + return; + } + + echo tsprintf( + "%!\n\n%W\n\n%s", + pht('NOT REVISION AUTHOR'), + array( + pht( + 'You are amending the working copy using information from '. + 'a revision you are not the author of.'), + "\n\n", + pht( + 'The author of this revision (%s) is:', + $revision_ref->getMonogram()), + ), + $author_ref->newDisplayRef()); + + $prompt = pht( + 'Amend working copy using revision owned by %s?', + $author_ref->getMonogram()); + + $this->getPrompt('arc.amend.author') + ->setQuery($prompt) + ->execute(); + } + + private function confirmAmendNotFound( + ArcanistRevisionRef $revision_ref, + ArcanistWorkingCopyStateRef $state_ref) { + + $local_refs = $state_ref->getRevisionRefs(); + $local_refs = mpull($local_refs, null, 'getPHID'); + + $revision_phid = $revision_ref->getPHID(); + $is_local = isset($local_refs[$revision_phid]); + + if ($is_local) { + return; + } + + echo tsprintf( + "%!\n\n%W\n", + pht('UNRELATED REVISION'), + pht( + 'You are amending the working copy using information from '. + 'a revision that does not appear to be associated with the '. + 'current state of the working copy.')); + + $prompt = pht( + 'Amend working copy using unrelated revision %s?', + $revision_ref->getMonogram()); + + $this->getPrompt('arc.amend.unrelated') + ->setQuery($prompt) + ->execute(); } } diff --git a/src/workflow/ArcanistAnoidWorkflow.php b/src/workflow/ArcanistAnoidWorkflow.php index 9dbad9d1..73dd11c2 100644 --- a/src/workflow/ArcanistAnoidWorkflow.php +++ b/src/workflow/ArcanistAnoidWorkflow.php @@ -1,29 +1,43 @@ newWorkflowInformation() + ->setSynopsis(pht('Pilot a probe from the vessel "Arcanoid".')) + ->addExample(pht('**anoid**')) + ->setHelp($help); } - public function getCommandHelp() { - return phutil_console_format(<< | - Entering a differential revision will only work if there is only one commit - associated with the revision. This requires your working copy is up to date - and that the commit exists in the working copy. -EOTEXT - ); - } - - public function getArguments() { - return array( - '*' => 'input', - ); - } - - public function requiresWorkingCopy() { - return true; - } - - public function requiresRepositoryAPI() { - return true; - } - - public function requiresAuthentication() { - return true; - } - - /** - * Given a differential revision ID, fetches the commit ID. - */ - private function getCommitIDFromRevisionID($revision_id) { - $conduit = $this->getConduit(); - $revisions = $conduit->callMethodSynchronous( - 'differential.query', - array( - 'ids' => array($revision_id), - )); - if (!$revisions) { - throw new ArcanistUsageException( - pht('The revision you provided does not exist!')); - } - $revision = $revisions[0]; - $commits = $revision['commits']; - if (!$commits) { - throw new ArcanistUsageException( - pht('This revision has not been committed yet!')); - } else if (count($commits) > 1) { - throw new ArcanistUsageException( - pht('The revision you provided has multiple commits!')); - } - $commit_phid = $commits[0]; - $commit = $conduit->callMethodSynchronous( - 'phid.query', - array( - 'phids' => array($commit_phid), - )); - $commit_id = $commit[$commit_phid]['name']; - return $commit_id; - } - - /** - * Fetches an array of commit info provided a Commit_id in the form of - * rE123456 (not local commit hash). - */ - private function getDiffusionCommit($commit_id) { - $result = $this->getConduit()->callMethodSynchronous( - 'diffusion.querycommits', - array( - 'names' => array($commit_id), - )); - $phid = idx($result['identifierMap'], $commit_id); - // This commit was not found in Diffusion - if (!$phid) { - return null; - } - $commit = $result['data'][$phid]; - return $commit; - } - - /** - * Retrieves default template from differential and pre-fills info. - */ - private function buildCommitMessage($commit_hash) { - $conduit = $this->getConduit(); - $repository_api = $this->getRepositoryAPI(); - - $summary = $repository_api->getBackoutMessage($commit_hash); - $fields = array( - 'summary' => $summary, - 'testPlan' => 'revert-hammer', - ); - $template = $conduit->callMethodSynchronous( - 'differential.getcommitmessage', - array( - 'revision_id' => null, - 'edit' => 'create', - 'fields' => $fields, - )); - $template = $this->newInteractiveEditor($template) - ->setName('new-commit') - ->editInteractively(); - - $template = ArcanistCommentRemover::removeComments($template); - - return $template; - } - - public function getSupportedRevisionControlSystems() { - return array('git', 'hg'); - } - - /** - * Performs the backout/revert of a revision and creates a commit. - */ - public function run() { - $console = PhutilConsole::getConsole(); - $conduit = $this->getConduit(); - $repository_api = $this->getRepositoryAPI(); - - $is_git_svn = $repository_api instanceof ArcanistGitAPI && - $repository_api->isGitSubversionRepo(); - $is_hg_svn = $repository_api instanceof ArcanistMercurialAPI && - $repository_api->isHgSubversionRepo(); - $revision_id = null; - - $console->writeOut(pht('Starting backout.')."\n"); - $input = $this->getArgument('input'); - if (!$input || count($input) != 1) { - throw new ArcanistUsageException( - pht('You must specify one commit to backout!')); - } - - // Input looks like a Differential revision, so - // we try to find the commit attached to it - $matches = array(); - if (preg_match('/^D(\d+)$/i', $input[0], $matches)) { - $revision_id = $matches[1]; - $commit_id = $this->getCommitIDFromRevisionID($revision_id); - $commit = $this->getDiffusionCommit($commit_id); - $commit_hash = $commit['identifier']; - // Convert commit hash from SVN to Git/HG (for FB case) - if ($is_git_svn || $is_hg_svn) { - $commit_hash = $repository_api - ->getHashFromFromSVNRevisionNumber($commit_hash); - } - } else { - // Assume input is a commit hash - $commit_hash = $input[0]; - } - if (!$repository_api->hasLocalCommit($commit_hash)) { - throw new ArcanistUsageException( - pht('Invalid commit provided or does not exist in the working copy!')); - } - - // Run 'backout'. - $subject = $repository_api->getCommitSummary($commit_hash); - $console->writeOut( - pht('Backing out commit %s %s', $commit_hash, $subject)."\n"); - - $repository_api->backoutCommit($commit_hash); - - // Create commit message and execute the commit - $message = $this->buildCommitMessage($commit_hash); - $repository_api->doCommit($message); - $console->writeOut("%s\n", - pht('Double-check the commit and push when ready.')); - } - -} diff --git a/src/workflow/ArcanistBookmarkWorkflow.php b/src/workflow/ArcanistBookmarkWorkflow.php index 3fadb343..49f56de6 100644 --- a/src/workflow/ArcanistBookmarkWorkflow.php +++ b/src/workflow/ArcanistBookmarkWorkflow.php @@ -1,32 +1,10 @@ array( - 'param' => 'branch_name', - 'help' => pht( - 'Default branch name to view on server. Defaults to "%s".', - 'master'), - ), - 'force' => array( - 'help' => pht( - 'Open arguments as paths, even if they do not exist in the '. - 'working copy.'), - ), - '*' => 'paths', - ); - } - - public function desiresWorkingCopy() { - return true; - } - - public function requiresConduit() { - return true; - } - - public function requiresAuthentication() { - return true; - } - - public function desiresRepositoryAPI() { - return true; - } - - public function run() { - $console = PhutilConsole::getConsole(); - - $is_force = $this->getArgument('force'); - - $things = $this->getArgument('paths'); - if (!$things) { - throw new ArcanistUsageException( - pht( - 'Specify one or more paths or objects to browse. Use the command '. - '"%s" if you want to browse this directory.', - 'arc browse .')); - } - $things = array_fuse($things); - - $objects = $this->getConduit()->callMethodSynchronous( - 'phid.lookup', - array( - 'names' => array_keys($things), - )); - - $uris = array(); - foreach ($objects as $name => $object) { - $uris[] = $object['uri']; - - $console->writeOut( - pht( - 'Opening **%s** as an object.', - $name)."\n"); - - unset($things[$name]); - } - - if ($this->hasRepositoryAPI()) { - $repository_api = $this->getRepositoryAPI(); - $project_root = $this->getWorkingCopy()->getProjectRoot(); - - // First, try to resolve arguments as symbolic commits. - - $commits = array(); - foreach ($things as $key => $thing) { - if ($thing == '.') { - // Git resolves '.' like HEAD, but it should be interpreted to mean - // "the current directory". Just skip resolution and fall through. - continue; - } - - try { - $commit = $repository_api->getCanonicalRevisionName($thing); - if ($commit) { - $commits[$commit] = $key; - } - } catch (Exception $ex) { - // Ignore. - } - } - - if ($commits) { - $commit_info = $this->getConduit()->callMethodSynchronous( - 'diffusion.querycommits', - array( - 'repositoryPHID' => $this->getRepositoryPHID(), - 'names' => array_keys($commits), - )); - - foreach ($commit_info['identifierMap'] as $ckey => $cphid) { - $thing = $commits[$ckey]; - unset($things[$thing]); - - $uris[] = $commit_info['data'][$cphid]['uri']; - - $console->writeOut( - pht( - 'Opening **%s** as a commit.', - $thing)."\n"); - } - } - - // If we fail, try to resolve them as paths. - - foreach ($things as $key => $path) { - $lines = null; - $parts = explode(':', $path); - if (count($parts) > 1) { - $lines = array_pop($parts); - } - $path = implode(':', $parts); - - $full_path = Filesystem::resolvePath($path); - - if (!$is_force && !Filesystem::pathExists($full_path)) { - continue; - } - - $console->writeOut( - pht( - 'Opening **%s** as a repository path.', - $key)."\n"); - - unset($things[$key]); - - if ($full_path == $project_root) { - $path = ''; - } else { - $path = Filesystem::readablePath($full_path, $project_root); - } - - $base_uri = $this->getBaseURI(); - $uri = $base_uri.$path; - - if ($lines) { - $uri = $uri.'$'.$lines; - } - - $uris[] = $uri; - } - } else { - if ($things) { - $console->writeOut( - "%s\n", - pht( - "The current working directory is not a repository working ". - "copy, so remaining arguments can not be resolved as paths or ". - "commits. To browse paths or symbolic commits in Diffusion, run ". - "'%s' from inside a working copy.", - 'arc browse')); - } - } - - foreach ($things as $thing) { - $console->writeOut( - "%s\n", - pht( - 'Unable to find an object named **%s**, no such commit exists in '. - 'the remote, and no such path exists in the working copy. Use '. - '__%s__ to treat this as a path anyway.', - $thing, - '--force')); - } - - if ($uris) { - $this->openURIsInBrowser($uris); - } - - return 0; - } - - private function getBaseURI() { - $repo_uri = $this->getRepositoryURI(); - if ($repo_uri === null) { - throw new ArcanistUsageException( - pht( - 'arc is unable to determine which repository in Diffusion '. - 'this working copy belongs to. Use "%s" to understand how '. - '%s looks for a repository.', - 'arc which', - 'arc')); - } - - $branch = $this->getArgument('branch', 'master'); - $branch = phutil_escape_uri_path_component($branch); - - return $repo_uri.'browse/'.$branch.'/'; - } - -} diff --git a/src/workflow/ArcanistCallConduitWorkflow.php b/src/workflow/ArcanistCallConduitWorkflow.php index c6d3a464..f5b302ae 100644 --- a/src/workflow/ArcanistCallConduitWorkflow.php +++ b/src/workflow/ArcanistCallConduitWorkflow.php @@ -1,72 +1,50 @@ newWorkflowInformation() + ->setSynopsis(pht('Call Conduit API methods.')) + ->addExample('**call-conduit** -- __method__') + ->setHelp($help); } - public function getCommandHelp() { - return phutil_console_format(<< 'method', + $this->newWorkflowArgument('method') + ->setWildcard(true), ); } - protected function shouldShellComplete() { - return false; - } - - public function requiresConduit() { - return true; - } - - public function requiresAuthentication() { - return true; - } - - public function run() { - $method = $this->getArgument('method', array()); + public function runWorkflow() { + $method = $this->getArgument('method'); if (count($method) !== 1) { - throw new ArcanistUsageException( - pht('Provide exactly one Conduit method name.')); + throw new PhutilArgumentUsageException( + pht('Provide exactly one Conduit method name to call.')); } - $method = reset($method); + $method = head($method); - $console = PhutilConsole::getConsole(); - if (!function_exists('posix_isatty') || posix_isatty(STDIN)) { - $console->writeErr( - "%s\n", - pht('Waiting for JSON parameters on stdin...')); - } - $params = @file_get_contents('php://stdin'); + $params = $this->readStdin(); try { $params = phutil_json_decode($params); } catch (PhutilJSONParserException $ex) { @@ -74,23 +52,26 @@ EOTEXT pht('Provide method parameters on stdin as a JSON blob.')); } + $engine = $this->getConduitEngine(); + $conduit_call = $engine->newCall($method, $params); + $conduit_future = $engine->newFuture($conduit_call); + $error = null; $error_message = null; try { - $result = $this->getConduit()->callMethodSynchronous( - $method, - $params); + $result = $conduit_future->resolve(); } catch (ConduitClientException $ex) { $error = $ex->getErrorCode(); $error_message = $ex->getMessage(); $result = null; } - echo json_encode(array( - 'error' => $error, - 'errorMessage' => $error_message, - 'response' => $result, - ))."\n"; + echo id(new PhutilJSON())->encodeFormatted( + array( + 'error' => $error, + 'errorMessage' => $error_message, + 'response' => $result, + )); return 0; } diff --git a/src/workflow/ArcanistCloseWorkflow.php b/src/workflow/ArcanistCloseWorkflow.php deleted file mode 100644 index 5076d603..00000000 --- a/src/workflow/ArcanistCloseWorkflow.php +++ /dev/null @@ -1,159 +0,0 @@ -statusData = $this->getConduit()->callMethodSynchronous( - 'maniphest.querystatuses', - array()); - return $this; - } - - private function getStatusOptions() { - if ($this->statusData === null) { - throw new PhutilInvalidStateException('loadStatusData'); - } - return idx($this->statusData, 'statusMap'); - } - private function getDefaultClosedStatus() { - if ($this->statusData === null) { - throw new PhutilInvalidStateException('loadStatusData'); - } - return idx($this->statusData, 'defaultClosedStatus'); - } - - public function getWorkflowName() { - return 'close'; - } - - public function getCommandSynopses() { - return phutil_console_format(<< 'task_id', - 'message' => array( - 'short' => 'm', - 'param' => 'comment', - 'help' => pht('Provide a comment with your status change.'), - ), - 'status' => array( - 'param' => 'status', - 'short' => 's', - 'help' => pht( - 'Specify a new status. Valid status options can be '. - 'seen with the `%s` argument.', - 'list-statuses'), - ), - 'list-statuses' => array( - 'help' => pht('Show available status options and exit.'), - ), - ); - } - - public function run() { - $this->loadStatusData(); - $list_statuses = $this->getArgument('list-statuses'); - if ($list_statuses) { - echo phutil_console_format( - "%s\n", - pht( - "Valid status options are:\n\t%s", - implode($this->getStatusOptions(), ', '))); - return 0; - } - $ids = $this->getArgument('task_id'); - $message = $this->getArgument('message'); - $status = strtolower($this->getArgument('status')); - - $status_options = $this->getStatusOptions(); - if (!isset($status) || $status == '') { - $status = $this->getDefaultClosedStatus(); - } - - if (!isset($status_options[$status])) { - $options = array_keys($status_options); - $last = array_pop($options); - echo pht( - "Invalid status %s, valid options are %s, or %s.\n", - $status, - implode(', ', $options), - $last); - - return; - } - - foreach ($ids as $id) { - if (!preg_match('/^T?\d+$/', $id)) { - echo pht('Invalid Task ID: %s.', $id)."\n"; - return 1; - } - $id = ltrim($id, 'T'); - $result = $this->closeTask($id, $status, $message); - $current_status = $status_options[$status]; - if ($result) { - echo pht( - "%s's status is now set to %s.\n", - "T{$id}", - $current_status); - } else { - echo pht( - "%s is already set to %s.\n", - "T{$id}", - $current_status); - } - } - return 0; - } - - private function closeTask($task_id, $status, $comment = '') { - $conduit = $this->getConduit(); - $info = $conduit->callMethodSynchronous( - 'maniphest.info', - array( - 'task_id' => $task_id, - )); - if ($info['status'] == $status) { - return false; - } - return $conduit->callMethodSynchronous( - 'maniphest.update', - array( - 'id' => $task_id, - 'status' => $status, - 'comments' => $comment, - )); - } - -} diff --git a/src/workflow/ArcanistDiffWorkflow.php b/src/workflow/ArcanistDiffWorkflow.php index 4fa37fce..bd7310ac 100644 --- a/src/workflow/ArcanistDiffWorkflow.php +++ b/src/workflow/ArcanistDiffWorkflow.php @@ -21,6 +21,8 @@ final class ArcanistDiffWorkflow extends ArcanistWorkflow { private $diffPropertyFutures = array(); private $commitMessageFromRevision; private $hitAutotargets; + private $revisionTransactions; + private $revisionIsDraft; const STAGING_PUSHED = 'pushed'; const STAGING_USER_SKIP = 'user.skip'; @@ -113,8 +115,7 @@ EOTEXT 'param' => 'commit', 'help' => pht('Read revision information from a specific commit.'), 'conflicts' => array( - 'only' => null, - 'preview' => null, + 'only' => null, 'update' => null, ), ), @@ -176,14 +177,10 @@ EOTEXT '%s can not be used with %s.', '--create', '--edit'), - 'only' => pht( + 'only' => pht( '%s can not be used with %s.', '--create', '--only'), - 'preview' => pht( - '%s can not be used with %s.', - '--create', - '--preview'), 'update' => pht( '%s can not be used with %s.', '--create', @@ -194,6 +191,18 @@ EOTEXT 'param' => 'revision_id', 'help' => pht('Always update a specific revision.'), ), + 'draft' => array( + 'help' => pht( + 'Create a draft revision so you can look over your changes before '. + 'involving anyone else. Other users will not be notified about the '. + 'revision until you later use "Request Review" to publish it. You '. + 'can still share the draft by giving someone the link.'), + 'conflicts' => array( + 'edit' => null, + 'only' => null, + 'update' => null, + ), + ), 'nounit' => array( 'help' => pht('Do not run unit tests.'), ), @@ -207,38 +216,12 @@ EOTEXT ), ), 'only' => array( - 'help' => pht( - 'Only generate a diff, without running lint, unit tests, or other '. - 'auxiliary steps. See also %s.', - '--preview'), - 'conflicts' => array( - 'preview' => null, - 'message' => pht('%s does not affect revisions.', '--only'), - 'edit' => pht('%s does not affect revisions.', '--only'), - 'lintall' => pht('%s suppresses lint.', '--only'), - 'advice' => pht('%s suppresses lint.', '--only'), - 'apply-patches' => pht('%s suppresses lint.', '--only'), - 'never-apply-patches' => pht('%s suppresses lint.', '--only'), - ), - ), - 'preview' => array( 'help' => pht( 'Instead of creating or updating a revision, only create a diff, '. - 'which you may later attach to a revision. This still runs lint '. - 'unit tests. See also %s.', - '--only'), + 'which you may later attach to a revision.'), 'conflicts' => array( - 'only' => null, - 'edit' => pht('%s does affect revisions.', '--preview'), - 'message' => pht('%s does not update any revision.', '--preview'), - ), - ), - 'plan-changes' => array( - 'help' => pht( - 'Create or update a revision without requesting a code review.'), - 'conflicts' => array( - 'only' => pht('%s does not affect revisions.', '--only'), - 'preview' => pht('%s does not affect revisions.', '--preview'), + 'edit' => pht('%s does affect revisions.', '--only'), + 'message' => pht('%s does not update any revision.', '--only'), ), ), 'encoding' => array( @@ -351,8 +334,7 @@ EOTEXT 'conflicts' => array( 'use-commit-message' => true, 'update' => true, - 'only' => true, - 'preview' => true, + 'only' => true, 'raw' => true, 'raw-command' => true, 'message-file' => true, @@ -362,8 +344,7 @@ EOTEXT 'param' => 'usernames', 'help' => pht('When creating a revision, add reviewers.'), 'conflicts' => array( - 'only' => true, - 'preview' => true, + 'only' => true, 'update' => true, ), ), @@ -371,8 +352,7 @@ EOTEXT 'param' => 'usernames', 'help' => pht('When creating a revision, add CCs.'), 'conflicts' => array( - 'only' => true, - 'preview' => true, + 'only' => true, 'update' => true, ), ), @@ -393,20 +373,6 @@ EOTEXT ), 'supports' => array('git', 'hg'), ), - 'no-diff' => array( - 'help' => pht( - 'Only run lint and unit tests. Intended for internal use.'), - ), - 'cache' => array( - 'param' => 'bool', - 'help' => pht( - '%d to disable lint cache, %d to enable (default).', - 0, - 1), - 'passthru' => array( - 'lint' => true, - ), - ), 'coverage' => array( 'help' => pht('Always enable coverage information.'), 'conflicts' => array( @@ -456,14 +422,6 @@ EOTEXT $this->console = PhutilConsole::getConsole(); $this->runRepositoryAPISetup(); - - if ($this->getArgument('no-diff')) { - $this->removeScratchFile('diff-result.json'); - $data = $this->runLintUnit(); - $this->writeScratchJSONFile('diff-result.json', $data); - return 0; - } - $this->runDiffSetupBasics(); $commit_message = $this->buildCommitMessage(); @@ -566,9 +524,34 @@ EOTEXT $this->openURIsInBrowser(array($diff_info['uri'])); } } else { + $is_draft = $this->getArgument('draft'); $revision['diffid'] = $this->getDiffID(); if ($commit_message->getRevisionID()) { + if ($is_draft) { + // TODO: In at least some cases, we could raise this earlier in the + // workflow to save users some time before the workflow aborts. + if ($this->revisionIsDraft) { + $this->writeWarn( + pht('ALREADY A DRAFT'), + pht( + 'You are updating a revision ("%s") with the "--draft" flag, '. + 'but this revision is already a draft. You only need to '. + 'provide the "--draft" flag when creating a revision. Draft '. + 'revisions are not published until you explicitly request '. + 'review from the web UI.', + $commit_message->getRevisionMonogram())); + } else { + throw new ArcanistUsageException( + pht( + 'You are updating a revision ("%s") with the "--draft" flag, '. + 'but this revision has already been published for review. '. + 'You can not turn a revision back into a draft once it has '. + 'been published.', + $commit_message->getRevisionMonogram())); + } + } + $result = $conduit->callMethodSynchronous( 'differential.updaterevision', $revision); @@ -579,18 +562,70 @@ EOTEXT $this->writeScratchJSONFile($file, $messages); } + $result_uri = $result['uri']; + $result_id = $result['revisionid']; + echo pht('Updated an existing Differential revision:')."\n"; } else { - $revision = $this->dispatchWillCreateRevisionEvent($revision); + // NOTE: We're either using "differential.revision.edit" (preferred) + // if we can, or falling back to "differential.createrevision" + // (the older way) if not. - $result = $conduit->callMethodSynchronous( - 'differential.createrevision', - $revision); + $xactions = $this->revisionTransactions; + if ($xactions) { + $xactions[] = array( + 'type' => 'update', + 'value' => $diff_info['phid'], + ); + + if ($is_draft) { + $xactions[] = array( + 'type' => 'draft', + 'value' => true, + ); + } + + $result = $conduit->callMethodSynchronous( + 'differential.revision.edit', + array( + 'transactions' => $xactions, + )); + + $result_id = idxv($result, array('object', 'id')); + if (!$result_id) { + throw new Exception( + pht( + 'Expected a revision ID to be returned by '. + '"differential.revision.edit".')); + } + + // TODO: This is hacky, but we don't currently receive a URI back + // from "differential.revision.edit". + $result_uri = id(new PhutilURI($this->getConduitURI())) + ->setPath('/D'.$result_id); + } else { + if ($is_draft) { + throw new ArcanistUsageException( + pht( + 'You have specified "--draft", but the version of Phabricator '. + 'on the server is too old to support draft revisions. Omit '. + 'the flag or upgrade the server software.')); + } + + $revision = $this->dispatchWillCreateRevisionEvent($revision); + + $result = $conduit->callMethodSynchronous( + 'differential.createrevision', + $revision); + + $result_uri = $result['uri']; + $result_id = $result['revisionid']; + } $revised_message = $conduit->callMethodSynchronous( 'differential.getcommitmessage', array( - 'revision_id' => $result['revisionid'], + 'revision_id' => $result_id, )); if ($this->shouldAmend()) { @@ -608,22 +643,12 @@ EOTEXT echo pht('Created a new Differential revision:')."\n"; } - $uri = $result['uri']; + $uri = $result_uri; echo phutil_console_format( " **%s** __%s__\n\n", pht('Revision URI:'), $uri); - if ($this->getArgument('plan-changes')) { - $conduit->callMethodSynchronous( - 'differential.createcomment', - array( - 'revision_id' => $result['revisionid'], - 'action' => 'rethink', - )); - echo pht('Planned changes to the revision.')."\n"; - } - if ($this->shouldOpenCreatedObjectsInBrowser()) { $this->openURIsInBrowser(array($uri)); } @@ -706,6 +731,7 @@ EOTEXT $revision = array( 'fields' => $message->getFields(), ); + $xactions = $message->getTransactions(); if ($revision_id) { @@ -760,6 +786,7 @@ EOTEXT } $revision['fields'] = $new_message->getFields(); + $xactions = $new_message->getTransactions(); $revision['id'] = $revision_id; $this->revisionID = $revision_id; @@ -782,6 +809,8 @@ EOTEXT } } + $this->revisionTransactions = $xactions; + return $revision; } @@ -802,8 +831,7 @@ EOTEXT return true; } - return $this->getArgument('preview') || - $this->getArgument('only'); + return $this->getArgument('only'); } private function generateAffectedPaths() { @@ -1224,7 +1252,6 @@ EOTEXT */ private function runLint() { if ($this->getArgument('nolint') || - $this->getArgument('only') || $this->isRawDiffSource() || $this->getArgument('head')) { return ArcanistLintWorkflow::RESULT_SKIP; @@ -1305,7 +1332,6 @@ EOTEXT */ private function runUnit() { if ($this->getArgument('nounit') || - $this->getArgument('only') || $this->isRawDiffSource() || $this->getArgument('head')) { return ArcanistUnitWorkflow::RESULT_SKIP; @@ -1449,7 +1475,7 @@ EOTEXT * @task message */ private function buildCommitMessage() { - if ($this->getArgument('preview') || $this->getArgument('only')) { + if ($this->getArgument('only')) { return null; } @@ -1767,6 +1793,12 @@ EOTEXT $this->checkRevisionOwnership($revision); + // TODO: Save this status to improve a prompt later. See PHI458. This is + // extra awful until we move to "differential.revision.search" because + // the "differential.query" method doesn't return a real draft status for + // compatibility. + $this->revisionIsDraft = (idx($revision, 'statusName') === 'Draft'); + $message = $this->getConduit()->callMethodSynchronous( 'differential.getcommitmessage', array( @@ -1985,6 +2017,15 @@ EOTEXT $faux_message[] = pht('CC: %s', $this->getArgument('cc')); } + // NOTE: For now, this isn't a real field, so it just ends up as the first + // part of the summary. + $depends_ref = $this->getDependsOnRevisionRef(); + if ($depends_ref) { + $faux_message[] = pht( + 'Depends on %s. ', + $depends_ref->getMonogram()); + } + // See T12069. After T10312, the first line of a message is always parsed // as a title. Add a placeholder so "Reviewers" and "CC" are never the // first line. @@ -2701,7 +2742,7 @@ EOTEXT } $uploader = id(new ArcanistFileUploader()) - ->setConduitClient($this->getConduit()); + ->setConduitEngine($this->getConduitEngine()); foreach ($need_upload as $key => $spec) { $ref = id(new ArcanistFileDataRef()) @@ -2859,6 +2900,9 @@ EOTEXT 'uri' => $staging_uri, ); + list($stdout) = $api->execxLocal('ls-files -z -- %s', ':(attr:filter=lfs)'); + $is_lfs = strpos($stdout, "\0") !== false; + // If the base commit is a real commit, we're going to push it. We don't // use this, but pushing it to a ref reduces the amount of redundant work // that Git does on later pushes by helping it figure out that the remote @@ -2882,7 +2926,7 @@ EOTEXT $refs[] = array( 'ref' => $diff_tag, 'type' => 'diff', - 'commit' => $commit, + 'commit' => $is_lfs ? $base_commit : $commit, 'remote' => $remote, ); @@ -2908,6 +2952,14 @@ EOTEXT 'use --skip-staging to skip this step.')); } + if ($is_lfs) { + $ref = '+'.$commit.':'.$diff_tag; + $err = phutil_passthru( + 'git push -- %s %s', + $staging_uri, + $ref); + } + return $refs; } @@ -2998,4 +3050,47 @@ EOTEXT } } + private function getDependsOnRevisionRef() { + // TODO: Restore this behavior after updating for toolsets. Loading the + // required hardpoints currently depends on a "WorkingCopy" existing. + return null; + + $api = $this->getRepositoryAPI(); + $base_ref = $api->getBaseCommitRef(); + + $state_ref = id(new ArcanistWorkingCopyStateRef()) + ->setCommitRef($base_ref); + + $this->loadHardpoints( + $state_ref, + ArcanistWorkingCopyStateRef::HARDPOINT_REVISIONREFS); + + $revision_refs = $state_ref->getRevisionRefs(); + $viewer_phid = $this->getUserPHID(); + + foreach ($revision_refs as $key => $revision_ref) { + // Don't automatically depend on closed revisions. + if ($revision_ref->isClosed()) { + unset($revision_refs[$key]); + continue; + } + + // Don't automatically depend on revisions authored by other users. + if ($revision_ref->getAuthorPHID() != $viewer_phid) { + unset($revision_refs[$key]); + continue; + } + } + + if (!$revision_refs) { + return null; + } + + if (count($revision_refs) > 1) { + return null; + } + + return head($revision_refs); + } + } diff --git a/src/workflow/ArcanistDownloadWorkflow.php b/src/workflow/ArcanistDownloadWorkflow.php index 543b715e..3b1264b2 100644 --- a/src/workflow/ArcanistDownloadWorkflow.php +++ b/src/workflow/ArcanistDownloadWorkflow.php @@ -1,53 +1,31 @@ newWorkflowInformation() + ->setSynopsis(pht('Download a file to local disk.')) + ->addExample(pht('**download** [__options__] -- __file__')) + ->setHelp($help); } - public function getCommandHelp() { - return phutil_console_format(<< array( - 'conflicts' => array( - 'as' => pht( - 'Use %s to direct the file to stdout, or %s to direct '. - 'it to a named location.', - '--show', - '--as'), - ), - 'help' => pht('Write file to stdout instead of to disk.'), - ), - 'as' => array( - 'param' => 'name', - 'help' => pht( - 'Save the file with a specific name rather than the default.'), - ), - '*' => 'argv', + $this->newWorkflowArgument('as') + ->setParameter('path') + ->setHelp(pht('Save the file to a specific location.')), + $this->newWorkflowArgument('argv') + ->setWildcard(true), ); } @@ -72,207 +50,143 @@ EOTEXT $this->show = $this->getArgument('show'); } - public function requiresAuthentication() { - return true; - } - public function run() { - $conduit = $this->getConduit(); + public function runWorkflow() { + $file_symbols = $this->getArgument('argv'); - $id = $this->id; - $display_name = 'F'.$id; - $is_show = $this->show; - $save_as = $this->saveAs; + if (!$file_symbols) { + throw new PhutilArgumentUsageException( + pht( + 'Specify a file to download, like "F123".')); + } + + if (count($file_symbols) > 1) { + throw new PhutilArgumentUsageException( + pht( + 'Specify exactly one file to download.')); + } + + $file_symbol = head($file_symbols); + + $symbols = $this->getSymbolEngine(); + $file_ref = $symbols->loadFileForSymbol($file_symbol); + if (!$file_ref) { + throw new PhutilArgumentUsageException( + pht( + 'File "%s" does not exist, or you do not have permission to '. + 'view it.', + $file_symbol)); + } + + $is_stdout = false; $path = null; - try { - $file = $conduit->callMethodSynchronous( - 'file.search', - array( - 'constraints' => array( - 'ids' => array($id), - ), - )); + $save_as = $this->getArgument('as'); + if ($save_as === '-') { + $is_stdout = true; + } else if ($save_as === null) { + $path = $file_ref->getName(); + $path = basename($path); + $path = Filesystem::resolvePath($path); - $data = $file['data']; - if (!$data) { - throw new ArcanistUsageException( - pht( - 'File "%s" is not a valid file, or not visible.', - $display_name)); - } + $try_unique = true; + } else { + $path = Filesystem::resolvePath($save_as); - $file = head($data); - $data_uri = idxv($file, array('fields', 'dataURI')); + $try_unique = false; + } - if ($data_uri === null) { - throw new ArcanistUsageException( - pht( - 'File "%s" can not be downloaded.', - $display_name)); - } - - if ($is_show) { - // Skip all the file path stuff if we're just going to echo the - // file contents. + $file_handle = null; + if (!$is_stdout) { + if ($try_unique) { + $path = Filesystem::writeUniqueFile($path, ''); + Filesystem::remove($path); } else { - if ($save_as !== null) { - $path = Filesystem::resolvePath($save_as); - - $try_unique = false; - } else { - $path = idxv($file, array('fields', 'name'), $display_name); - $path = basename($path); - $path = Filesystem::resolvePath($path); - - $try_unique = true; - } - - if ($try_unique) { - $path = Filesystem::writeUniqueFile($path, ''); - } else { - if (Filesystem::pathExists($path)) { - throw new ArcanistUsageException( - pht( - 'File "%s" already exists.', - $save_as)); - } - - Filesystem::writeFile($path, ''); - } - - $display_path = Filesystem::readablePath($path); - } - - $size = idxv($file, array('fields', 'size'), 0); - - if ($is_show) { - $file_handle = null; - } else { - $file_handle = fopen($path, 'ab+'); - if ($file_handle === false) { - throw new Exception( + if (Filesystem::pathExists($path)) { + throw new PhutilArgumentUsageException( pht( - 'Failed to open file "%s" for writing.', + 'File "%s" already exists.', $path)); } - - $this->writeInfo( - pht('DATA'), - pht( - 'Downloading "%s" (%s byte(s))...', - $display_name, - new PhutilNumber($size))); } + } - $future = new HTTPSFuture($data_uri); + $display_path = Filesystem::readablePath($path); + $display_name = $file_ref->getName(); + if (!strlen($display_name)) { + $display_name = $file_ref->getMonogram(); + } + + $expected_bytes = $file_ref->getSize(); + $log = $this->getLogEngine(); + + if (!$is_stdout) { + $log->writeStatus( + pht('DATA'), + pht( + 'Downloading "%s" (%s byte(s)) to "%s"...', + $display_name, + new PhutilNumber($expected_bytes), + $display_path)); + } + + $data_uri = $file_ref->getDataURI(); + $future = new HTTPSFuture($data_uri); + + if (!$is_stdout) { // For small files, don't bother drawing a progress bar. $minimum_bar_bytes = (1024 * 1024 * 4); + if ($expected_bytes > $minimum_bar_bytes) { + $progress = id(new PhutilConsoleProgressSink()) + ->setTotalWork($expected_bytes); - if ($is_show || ($size < $minimum_bar_bytes)) { - $bar = null; - } else { - $bar = id(new PhutilConsoleProgressBar()) - ->setTotal($size); + $future->setProgressSink($progress); } - // TODO: We should stream responses to disk, but cURL gives us the raw - // HTTP response data and BaseHTTPFuture can not currently parse it in - // a stream-oriented way. Until this is resolved, buffer the file data - // in memory and write it to disk in one shot. + // Compute a timeout based on the expected filesize. + $transfer_rate = 32 * 1024; + $timeout = (int)(120 + ($expected_bytes / $transfer_rate)); - list($status, $data) = $future->resolve(); - if ($status->getStatusCode() !== 200) { - throw new Exception( - pht( - 'Got HTTP %d status response, expected HTTP 200.', - $status->getStatusCode())); - } + $future + ->setTimeout($timeout) + ->setDownloadPath($path); + } - if (strlen($data)) { - if ($is_show) { - echo $data; - } else { - $ok = fwrite($file_handle, $data); - if ($ok === false) { - throw new Exception( - pht( - 'Failed to write file data to "%s".', - $path)); - } - } - } - - if ($bar) { - $bar->update(strlen($data)); - } - - if ($bar) { - $bar->done(); - } - - if ($file_handle) { - $ok = fclose($file_handle); - if ($ok === false) { - throw new Exception( - pht( - 'Failed to close file handle for "%s".', - $path)); - } - } - - if (!$is_show) { - $this->writeOkay( - pht('DONE'), - pht( - 'Saved "%s" as "%s".', - $display_name, - $display_path)); - } - - return 0; + try { + list($data) = $future->resolvex(); } catch (Exception $ex) { - - // If we created an empty file, clean it up. - if (!$is_show) { - if ($path !== null) { - Filesystem::remove($path); - } - } - - // If we fail for any reason, fall back to the older mechanism using - // "file.info" and "file.download". + Filesystem::removePath($path); + throw $ex; } - $this->writeStatusMessage(pht('Getting file information...')."\n"); - $info = $conduit->callMethodSynchronous( - 'file.info', - array( - 'id' => $this->id, - )); - - $desc = pht('(%s bytes)', new PhutilNumber($info['byteSize'])); - if ($info['name']) { - $desc = "'".$info['name']."' ".$desc; + if ($is_stdout) { + $file_bytes = strlen($data); + } else { + // TODO: This has various potential problems with clearstatcache() and + // 32-bit systems, but just ignore them for now. + $file_bytes = filesize($path); } - $this->writeStatusMessage(pht('Downloading file %s...', $desc)."\n"); - $data = $conduit->callMethodSynchronous( - 'file.download', - array( - 'phid' => $info['phid'], - )); + if ($file_bytes !== $expected_bytes) { + throw new Exception( + pht( + 'Downloaded file size (%s bytes) does not match expected '. + 'file size (%s bytes). This download may be incomplete or '. + 'corrupt.', + new PhutilNumber($file_bytes), + new PhutilNumber($expected_bytes))); + } - $data = base64_decode($data); - - if ($this->show) { + if ($is_stdout) { echo $data; } else { - $path = Filesystem::writeUniqueFile( - nonempty($this->saveAs, $info['name'], 'file'), - $data); - $this->writeStatusMessage(pht("Saved file as '%s'.", $path)."\n"); + $log->writeStatus( + pht('DONE'), + pht( + 'Saved "%s" as "%s".', + $display_name, + $display_path)); } return 0; diff --git a/src/workflow/ArcanistFeatureBaseWorkflow.php b/src/workflow/ArcanistFeatureBaseWorkflow.php new file mode 100644 index 00000000..94756c2a --- /dev/null +++ b/src/workflow/ArcanistFeatureBaseWorkflow.php @@ -0,0 +1,265 @@ +newWorkflowArgument('view-all') + ->setHelp(pht('Include closed and abandoned revisions.')), + $this->newWorkflowArgument('by-status') + ->setParameter('status') + ->setHelp(pht('Sort branches by status instead of time.')), + $this->newWorkflowArgument('output') + ->setParameter('format') + ->setHelp( + pht( + 'With "json", show features in machine-readable JSON format.')), + $this->newWorkflowArgument('branch') + ->setWildcard(true), + ); + } + + public function getWorkflowInformation() { + return $this->newWorkflowInformation() + ->setSynopsis(pht('Wrapper on "git branch" or "hg bookmark".')) + ->addExample(pht('**%s** [__options__]', $this->getWorkflowName())) + ->addExample(pht('**%s** __name__ [__start__]', $this->getWorkflowName())) + ->setHelp( + pht(<<getRepositoryAPI(); + if (!$repository_api) { + throw new PhutilArgumentUsageException( + pht( + 'This command must be run in a Git or Mercurial working copy.')); + } + + $names = $this->getArgument('branch'); + if ($names) { + if (count($names) > 2) { + throw new ArcanistUsageException(pht('Specify only one branch.')); + } + return $this->checkoutBranch($names); + } + + // TODO: Everything in this whole workflow that says "branch" means + // "bookmark" in Mercurial. + + $branches = $repository_api->getAllBranchRefs(); + if (!$branches) { + throw new ArcanistUsageException( + pht('No branches in this working copy.')); + } + + $states = array(); + foreach ($branches as $branch_key => $branch) { + $state_ref = id(new ArcanistWorkingCopyStateRef()) + ->setCommitRef($branch->getCommitRef()); + + $states[] = array( + 'branch' => $branch, + 'state' => $state_ref, + ); + } + + $this->loadHardpoints( + ipull($states, 'state'), + ArcanistWorkingCopyStateRef::HARDPOINT_REVISIONREFS); + + $this->printBranches($states); + + return 0; + } + + private function checkoutBranch(array $names) { + $api = $this->getRepositoryAPI(); + + if ($api instanceof ArcanistMercurialAPI) { + $command = 'update %s'; + } else { + $command = 'checkout %s'; + } + + $err = 1; + + $name = $names[0]; + if (isset($names[1])) { + $start = $names[1]; + } else { + $start = $this->getConfigFromAnySource('arc.feature.start.default'); + } + + $branches = $api->getAllBranches(); + if (in_array($name, ipull($branches, 'name'))) { + list($err, $stdout, $stderr) = $api->execManualLocal($command, $name); + } + + if ($err) { + $match = null; + if (preg_match('/^D(\d+)$/', $name, $match)) { + $diff = $this->getConduitEngine()->resolveCall( + 'differential.querydiffs', + array( + 'revisionIDs' => array($match[1]), + )); + $diff = head($diff); + + if ($diff['branch'] != '') { + $name = $diff['branch']; + list($err, $stdout, $stderr) = $api->execManualLocal( + $command, + $name); + } + } + } + + if ($err) { + if ($api instanceof ArcanistMercurialAPI) { + $rev = ''; + if ($start) { + $rev = csprintf('-r %s', $start); + } + + $exec = $api->execManualLocal('bookmark %C %s', $rev, $name); + + if (!$exec[0] && $start) { + $api->execxLocal('update %s', $name); + } + } else { + $startarg = $start ? csprintf('%s', $start) : ''; + $exec = $api->execManualLocal( + 'checkout --track -b %s %C', + $name, + $startarg); + } + + list($err, $stdout, $stderr) = $exec; + } + + echo $stdout; + fprintf(STDERR, '%s', $stderr); + return $err; + } + + private function printBranches(array $states) { + static $color_map = array( + 'Closed' => 'cyan', + 'Needs Review' => 'magenta', + 'Needs Revision' => 'red', + 'Accepted' => 'green', + 'No Revision' => 'blue', + 'Abandoned' => 'default', + ); + + static $ssort_map = array( + 'Closed' => 1, + 'No Revision' => 2, + 'Needs Review' => 3, + 'Needs Revision' => 4, + 'Accepted' => 5, + ); + + $out = array(); + foreach ($states as $objects) { + $state = $objects['state']; + $branch = $objects['branch']; + + $revision = null; + if ($state->hasAmbiguousRevisionRefs()) { + $status = pht('Ambiguous Revision'); + } else { + $revision = $state->getRevisionRef(); + if ($revision) { + $status = $revision->getStatusDisplayName(); + } else { + $status = pht('No Revision'); + } + } + + if (!$this->getArgument('view-all') && !$branch->getIsCurrentBranch()) { + if ($status == 'Closed' || $status == 'Abandoned') { + continue; + } + } + + $commit = $branch->getCommitRef(); + $epoch = $commit->getCommitEpoch(); + + $color = idx($color_map, $status, 'default'); + $ssort = sprintf('%d%012d', idx($ssort_map, $status, 0), $epoch); + + if ($revision) { + $desc = $revision->getFullName(); + } else { + $desc = $commit->getSummary(); + } + + $out[] = array( + 'name' => $branch->getBranchName(), + 'current' => $branch->getIsCurrentBranch(), + 'status' => $status, + 'desc' => $desc, + 'revision' => $revision ? $revision->getID() : null, + 'color' => $color, + 'esort' => $epoch, + 'epoch' => $epoch, + 'ssort' => $ssort, + ); + } + + if (!$out) { + // All of the revisions are closed or abandoned. + return; + } + + $len_name = max(array_map('strlen', ipull($out, 'name'))) + 2; + $len_status = max(array_map('strlen', ipull($out, 'status'))) + 2; + + if ($this->getArgument('by-status')) { + $out = isort($out, 'ssort'); + } else { + $out = isort($out, 'esort'); + } + if ($this->getArgument('output') == 'json') { + foreach ($out as &$feature) { + unset($feature['color'], $feature['ssort'], $feature['esort']); + } + echo json_encode(ipull($out, null, 'name'))."\n"; + } else { + $table = id(new PhutilConsoleTable()) + ->setShowHeader(false) + ->addColumn('current', array('title' => '')) + ->addColumn('name', array('title' => pht('Name'))) + ->addColumn('status', array('title' => pht('Status'))) + ->addColumn('descr', array('title' => pht('Description'))); + + foreach ($out as $line) { + $table->addRow(array( + 'current' => $line['current'] ? '*' : '', + 'name' => tsprintf('**%s**', $line['name']), + 'status' => tsprintf( + "%s", $line['status']), + 'descr' => $line['desc'], + )); + } + + $table->draw(); + } + } + +} diff --git a/src/workflow/ArcanistFeatureWorkflow.php b/src/workflow/ArcanistFeatureWorkflow.php index a1cbe108..760d3dc6 100644 --- a/src/workflow/ArcanistFeatureWorkflow.php +++ b/src/workflow/ArcanistFeatureWorkflow.php @@ -1,374 +1,10 @@ getArgument('branch'); - } - - public function getArguments() { - return array( - 'view-all' => array( - 'help' => pht('Include closed and abandoned revisions.'), - ), - 'by-status' => array( - 'help' => pht('Sort branches by status instead of time.'), - ), - 'output' => array( - 'param' => 'format', - 'support' => array( - 'json', - ), - 'help' => pht( - "With '%s', show features in machine-readable JSON format.", - 'json'), - ), - '*' => 'branch', - ); - } - - public function getSupportedRevisionControlSystems() { - return array('git', 'hg'); - } - - public function run() { - $repository_api = $this->getRepositoryAPI(); - - $names = $this->getArgument('branch'); - if ($names) { - if (count($names) > 2) { - throw new ArcanistUsageException(pht('Specify only one branch.')); - } - return $this->checkoutBranch($names); - } - - $branches = $repository_api->getAllBranches(); - if (!$branches) { - throw new ArcanistUsageException( - pht('No branches in this working copy.')); - } - - $branches = $this->loadCommitInfo($branches); - $revisions = $this->loadRevisions($branches); - $this->printBranches($branches, $revisions); - - return 0; - } - - private function checkoutBranch(array $names) { - $api = $this->getRepositoryAPI(); - - if ($api instanceof ArcanistMercurialAPI) { - $command = 'update %s'; - } else { - $command = 'checkout %s'; - } - - $err = 1; - - $name = $names[0]; - if (isset($names[1])) { - $start = $names[1]; - } else { - $start = $this->getConfigFromAnySource('arc.feature.start.default'); - } - - $branches = $api->getAllBranches(); - if (in_array($name, ipull($branches, 'name'))) { - list($err, $stdout, $stderr) = $api->execManualLocal($command, $name); - } - - if ($err) { - $match = null; - if (preg_match('/^D(\d+)$/', $name, $match)) { - try { - $diff = $this->getConduit()->callMethodSynchronous( - 'differential.querydiffs', - array( - 'revisionIDs' => array($match[1]), - )); - $diff = head($diff); - - if ($diff['branch'] != '') { - $name = $diff['branch']; - list($err, $stdout, $stderr) = $api->execManualLocal( - $command, - $name); - } - } catch (ConduitClientException $ex) {} - } - } - - if ($err) { - if ($api instanceof ArcanistMercurialAPI) { - $rev = ''; - if ($start) { - $rev = csprintf('-r %s', $start); - } - - $exec = $api->execManualLocal('bookmark %C %s', $rev, $name); - - if (!$exec[0] && $start) { - $api->execxLocal('update %s', $name); - } - } else { - $startarg = $start ? csprintf('%s', $start) : ''; - $exec = $api->execManualLocal( - 'checkout --track -b %s %C', - $name, - $startarg); - } - - list($err, $stdout, $stderr) = $exec; - } - - echo $stdout; - fprintf(STDERR, '%s', $stderr); - return $err; - } - - private function loadCommitInfo(array $branches) { - $repository_api = $this->getRepositoryAPI(); - - $branches = ipull($branches, null, 'name'); - - if ($repository_api instanceof ArcanistMercurialAPI) { - $futures = array(); - foreach ($branches as $branch) { - $futures[$branch['name']] = $repository_api->execFutureLocal( - 'log -l 1 --template %s -r %s', - "{node}\1{date|hgdate}\1{p1node}\1{desc|firstline}\1{desc}", - hgsprintf('%s', $branch['name'])); - } - - $futures = id(new FutureIterator($futures)) - ->limit(16); - foreach ($futures as $name => $future) { - list($info) = $future->resolvex(); - - $fields = explode("\1", trim($info), 5); - list($hash, $epoch, $tree, $desc, $text) = $fields; - - $branches[$name] += array( - 'hash' => $hash, - 'desc' => $desc, - 'tree' => $tree, - 'epoch' => (int)$epoch, - 'text' => $text, - ); - } - } - - foreach ($branches as $name => $branch) { - $text = $branch['text']; - - try { - $message = ArcanistDifferentialCommitMessage::newFromRawCorpus($text); - $id = $message->getRevisionID(); - - $branch['revisionID'] = $id; - } catch (ArcanistUsageException $ex) { - // In case of invalid commit message which fails the parsing, - // do nothing. - $branch['revisionID'] = null; - } - - $branches[$name] = $branch; - } - - return $branches; - } - - private function loadRevisions(array $branches) { - $ids = array(); - $hashes = array(); - - foreach ($branches as $branch) { - if ($branch['revisionID']) { - $ids[] = $branch['revisionID']; - } - $hashes[] = array('gtcm', $branch['hash']); - $hashes[] = array('gttr', $branch['tree']); - } - - $calls = array(); - - if ($ids) { - $calls[] = $this->getConduit()->callMethod( - 'differential.query', - array( - 'ids' => $ids, - )); - } - - if ($hashes) { - $calls[] = $this->getConduit()->callMethod( - 'differential.query', - array( - 'commitHashes' => $hashes, - )); - } - - $results = array(); - foreach (new FutureIterator($calls) as $call) { - $results[] = $call->resolve(); - } - - return array_mergev($results); - } - - private function printBranches(array $branches, array $revisions) { - $revisions = ipull($revisions, null, 'id'); - - static $color_map = array( - 'Closed' => 'cyan', - 'Needs Review' => 'magenta', - 'Needs Revision' => 'red', - 'Accepted' => 'green', - 'No Revision' => 'blue', - 'Abandoned' => 'default', - ); - - static $ssort_map = array( - 'Closed' => 1, - 'No Revision' => 2, - 'Needs Review' => 3, - 'Needs Revision' => 4, - 'Accepted' => 5, - ); - - $out = array(); - foreach ($branches as $branch) { - $revision = idx($revisions, idx($branch, 'revisionID')); - - // If we haven't identified a revision by ID, try to identify it by hash. - if (!$revision) { - foreach ($revisions as $rev) { - $hashes = idx($rev, 'hashes', array()); - foreach ($hashes as $hash) { - if (($hash[0] == 'gtcm' && $hash[1] == $branch['hash']) || - ($hash[0] == 'gttr' && $hash[1] == $branch['tree'])) { - $revision = $rev; - break; - } - } - } - } - - if ($revision) { - $desc = 'D'.$revision['id'].': '.$revision['title']; - $status = $revision['statusName']; - } else { - $desc = $branch['desc']; - $status = pht('No Revision'); - } - - if (!$this->getArgument('view-all') && !$branch['current']) { - if ($status == 'Closed' || $status == 'Abandoned') { - continue; - } - } - - $epoch = $branch['epoch']; - - $color = idx($color_map, $status, 'default'); - $ssort = sprintf('%d%012d', idx($ssort_map, $status, 0), $epoch); - - $out[] = array( - 'name' => $branch['name'], - 'current' => $branch['current'], - 'status' => $status, - 'desc' => $desc, - 'revision' => $revision ? $revision['id'] : null, - 'color' => $color, - 'esort' => $epoch, - 'epoch' => $epoch, - 'ssort' => $ssort, - ); - } - - if (!$out) { - // All of the revisions are closed or abandoned. - return; - } - - $len_name = max(array_map('strlen', ipull($out, 'name'))) + 2; - $len_status = max(array_map('strlen', ipull($out, 'status'))) + 2; - - if ($this->getArgument('by-status')) { - $out = isort($out, 'ssort'); - } else { - $out = isort($out, 'esort'); - } - if ($this->getArgument('output') == 'json') { - foreach ($out as &$feature) { - unset($feature['color'], $feature['ssort'], $feature['esort']); - } - echo json_encode(ipull($out, null, 'name'))."\n"; - } else { - $table = id(new PhutilConsoleTable()) - ->setShowHeader(false) - ->addColumn('current', array('title' => '')) - ->addColumn('name', array('title' => pht('Name'))) - ->addColumn('status', array('title' => pht('Status'))) - ->addColumn('descr', array('title' => pht('Description'))); - - foreach ($out as $line) { - $table->addRow(array( - 'current' => $line['current'] ? '*' : '', - 'name' => tsprintf('**%s**', $line['name']), - 'status' => tsprintf( - "%s", $line['status']), - 'descr' => $line['desc'], - )); - } - - $table->draw(); - } - } - } diff --git a/src/workflow/ArcanistFlagWorkflow.php b/src/workflow/ArcanistFlagWorkflow.php deleted file mode 100644 index 9f1367b9..00000000 --- a/src/workflow/ArcanistFlagWorkflow.php +++ /dev/null @@ -1,243 +0,0 @@ - 'red', // Red - 1 => 'yellow', // Orange - 2 => 'yellow', // Yellow - 3 => 'green', // Green - 4 => 'blue', // Blue - 5 => 'magenta', // Pink - 6 => 'magenta', // Purple - 7 => 'default', // Checkered - ); - - private static $colorSpec = array( - 'red' => 0, - 'r' => 0, - 0 => 0, - 'orange' => 1, - 'o' => 1, - 1 => 1, - 'yellow' => 2, - 'y' => 2, - 2 => 2, - 'green' => 3, - 'g' => 3, - 3 => 3, - 'blue' => 4, - 'b' => 4, - 4 => 4, - 'pink' => 5, - 'p' => 5, - 5 => 5, - 'purple' => 6, - 'v' => 6, - 6 => 6, - 'checkered' => 7, - 'c' => 7, - 7 => 7, - ); - - public function getWorkflowName() { - return 'flag'; - } - - public function getCommandSynopses() { - return phutil_console_format(<< 'objects', - 'clear' => array( - 'help' => pht('Delete the flag on an object.'), - ), - 'edit' => array( - 'help' => pht('Edit the flag on an object.'), - ), - 'color' => array( - 'param' => 'color', - 'help' => pht('Set the color of a flag.'), - ), - 'note' => array( - 'param' => 'note', - 'help' => pht('Set the note on a flag.'), - ), - ); - } - - public function requiresConduit() { - return true; - } - - public function requiresAuthentication() { - return true; - } - - private static function flagWasEdited($flag, $verb) { - $color = idx(self::$colorMap, $flag['color'], 'cyan'); - $note = $flag['note']; - if ($note) { - // Make sure notes that are long or have line breaks in them or - // whatever don't mess up the formatting. - $note = implode(' ', preg_split('/\s+/', $note)); - $note = ' ('. - id(new PhutilUTF8StringTruncator()) - ->setMaximumGlyphs(40) - ->setTerminator('...') - ->truncateString($note). - ')'; - } - echo phutil_console_format( - "%s flag%s $verb!\n", - $flag['colorName'], - $note); - } - - public function run() { - $conduit = $this->getConduit(); - $objects = $this->getArgument('objects', array()); - $phids = array(); - - $clear = $this->getArgument('clear'); - $edit = $this->getArgument('edit'); - // I don't trust PHP to distinguish 0 (red) from null. - $color = $this->getArgument('color', -1); - $note = $this->getArgument('note'); - $editing = $edit || ($color != -1) || $note; - - if ($editing && $clear) { - throw new ArcanistUsageException( - pht("You can't both edit and clear a flag.")); - } - if (($editing || $clear) && count($objects) != 1) { - throw new ArcanistUsageException(pht('Specify exactly one object.')); - } - - if (!empty($objects)) { - // First off, convert the passed objects to PHIDs. - $handles = $conduit->callMethodSynchronous( - 'phid.lookup', - array( - 'names' => $objects, - )); - foreach ($objects as $object) { - if (isset($handles[$object])) { - $phids[$object] = $handles[$object]['phid']; - } else { - echo pht( - "%s doesn't exist.\n", - phutil_console_format('**%s**', $object)); - } - } - if (empty($phids)) { - // flag.query treats an empty objectPHIDs parameter as "don't use this - // constraint". However, if the user gives a list of objects but none - // of them exist and have flags, we shouldn't dump the full list on - // them after telling them that. Conveniently, we already told them, - // so we can go quit now. - return 0; - } - } - - if ($clear) { - // All right, we're going to clear a flag. First clear it. Then tell the - // user we cleared it. Step four: profit! - $flag = $conduit->callMethodSynchronous( - 'flag.delete', - array( - 'objectPHID' => head($phids), - )); - if (!$flag) { - echo pht( - "%s has no flag to clear.\n", - phutil_console_format('**%s**', $object)); - } else { - self::flagWasEdited($flag, 'deleted'); - } - } else if ($editing) { - // Let's set some flags. Just like Minesweeper, but less distracting. - $flag_params = array( - 'objectPHID' => head($phids), - ); - if (isset(self::$colorSpec[$color])) { - $flag_params['color'] = self::$colorSpec[strtolower($color)]; - } - if ($note) { - $flag_params['note'] = $note; - } - $flag = $conduit->callMethodSynchronous( - 'flag.edit', - $flag_params); - self::flagWasEdited($flag, $flag['new'] ? 'created' : 'edited'); - } else { - // Okay, list mode. Let's find the flags, which we didn't need to do - // otherwise because Conduit does it for us. - $flags = ipull( - $this->getConduit()->callMethodSynchronous( - 'flag.query', - array( - 'ownerPHIDs' => array($this->getUserPHID()), - 'objectPHIDs' => array_values($phids), - )), - null, - 'objectPHID'); - foreach ($phids as $object => $phid) { - if (!isset($flags[$phid])) { - echo pht( - "%s has no flag.\n", - phutil_console_format('**%s**', $object)); - } - } - - if (empty($flags)) { - // If the user passed no object names, then we should print the full - // list, but it's empty, so tell the user they have no flags. - // If the user passed object names, we already told them all their - // objects are nonexistent or unflagged. - if (empty($objects)) { - echo pht('You have no flagged objects.')."\n"; - } - } else { - // Print ALL the flags. With fancy formatting. Because fancy formatting - // is _cool_. - $name_len = 1 + max(array_map('strlen', ipull($flags, 'colorName'))); - foreach ($flags as $flag) { - $color = idx(self::$colorMap, $flag['color'], 'cyan'); - echo phutil_console_format( - "[%s] %s\n", - str_pad($flag['colorName'], $name_len), - $flag['handle']['fullname']); - if ($flag['note']) { - $note = phutil_console_wrap($flag['note'], $name_len + 3); - echo rtrim($note)."\n"; - } - } - } - } - } - -} diff --git a/src/workflow/ArcanistGetConfigWorkflow.php b/src/workflow/ArcanistGetConfigWorkflow.php index 565856bd..0f2c34ca 100644 --- a/src/workflow/ArcanistGetConfigWorkflow.php +++ b/src/workflow/ArcanistGetConfigWorkflow.php @@ -52,7 +52,7 @@ EOTEXT ArcanistConfigurationManager::CONFIG_SOURCE_LOCAL => $configuration_manager->readLocalArcConfig(), ArcanistConfigurationManager::CONFIG_SOURCE_PROJECT => - $this->getWorkingCopy()->readProjectConfig(), + $this->getWorkingCopyIdentity()->readProjectConfig(), ArcanistConfigurationManager::CONFIG_SOURCE_USER => $configuration_manager->readUserArcConfig(), ArcanistConfigurationManager::CONFIG_SOURCE_SYSTEM => diff --git a/src/workflow/ArcanistHelpWorkflow.php b/src/workflow/ArcanistHelpWorkflow.php deleted file mode 100644 index 82233616..00000000 --- a/src/workflow/ArcanistHelpWorkflow.php +++ /dev/null @@ -1,221 +0,0 @@ - array( - 'help' => pht('Print detailed information about each command.'), - ), - '*' => 'command', - ); - } - - public function run() { - - $arc_config = $this->getArcanistConfiguration(); - $workflows = $arc_config->buildAllWorkflows(); - ksort($workflows); - - $target = null; - if ($this->getArgument('command')) { - $target = head($this->getArgument('command')); - if (empty($workflows[$target])) { - throw new ArcanistUsageException( - pht( - "Unrecognized command '%s'. Try '%s'.", - $target, - 'arc help')); - } - } - - $cmdref = array(); - foreach ($workflows as $command => $workflow) { - if ($target && $target != $command) { - continue; - } - if (!$target && !$this->getArgument('full')) { - $cmdref[] = $workflow->getCommandSynopses(); - continue; - } - $optref = array(); - $arguments = $workflow->getArguments(); - - $config_arguments = $arc_config->getCustomArgumentsForCommand($command); - - // This juggling is to put the extension arguments after the normal - // arguments, and make sure the normal arguments aren't overwritten. - ksort($arguments); - ksort($config_arguments); - foreach ($config_arguments as $argument => $spec) { - if (empty($arguments[$argument])) { - $arguments[$argument] = $spec; - } - } - - foreach ($arguments as $argument => $spec) { - if ($argument == '*') { - continue; - } - if (!empty($spec['hide'])) { - continue; - } - if (isset($spec['param'])) { - if (isset($spec['short'])) { - $optref[] = phutil_console_format( - ' __--%s__ __%s__, __-%s__ __%s__', - $argument, - $spec['param'], - $spec['short'], - $spec['param']); - } else { - $optref[] = phutil_console_format( - ' __--%s__ __%s__', - $argument, - $spec['param']); - } - } else { - if (isset($spec['short'])) { - $optref[] = phutil_console_format( - ' __--%s__, __-%s__', - $argument, - $spec['short']); - } else { - $optref[] = phutil_console_format( - ' __--%s__', - $argument); - } - } - - if (isset($config_arguments[$argument])) { - $optref[] = ' '. - pht('(This is a custom option for this project.)'); - } - - if (isset($spec['supports'])) { - $optref[] = ' '. - pht('Supports: %s', implode(', ', $spec['supports'])); - } - - if (isset($spec['help'])) { - $docs = $spec['help']; - } else { - $docs = pht('This option is not documented.'); - } - $docs = phutil_console_wrap($docs, 14); - $optref[] = "{$docs}\n"; - } - if ($optref) { - $optref = implode("\n", $optref); - $optref = "\n\n".$optref; - } else { - $optref = "\n"; - } - - $cmdref[] = - $workflow->getCommandSynopses()."\n". - $workflow->getCommandHelp(). - $optref; - } - $cmdref = implode("\n\n", $cmdref); - - if ($target) { - echo "\n".$cmdref."\n"; - return; - } - - $self = 'arc'; - echo phutil_console_format(<<getArgument('full')) { - echo pht( - "Run '%s' to get commands and options descriptions.\n", - 'arc help --full'); - return; - } - - echo phutil_console_format(<<newWorkflowInformation() + ->setSynopsis(pht('Show internal object information.')) + ->addExample(pht('**inspect** [__options__] -- __object__')) + ->setHelp($help); + } + + public function getWorkflowArguments() { + return array( + $this->newWorkflowArgument('explore') + ->setHelp(pht('Load all object hardpoints.')), + $this->newWorkflowArgument('objects') + ->setWildcard(true), + ); + } + + public function runWorkflow() { + $is_explore = $this->getArgument('explore'); + $objects = $this->getArgument('objects'); + + $inspectors = ArcanistRefInspector::getAllInspectors(); + + if (!$objects) { + echo tsprintf( + "%s\n\n", + pht('Choose an object to inspect:')); + + foreach ($inspectors as $inspector) { + echo tsprintf( + " - %s\n", + $inspector->getInspectFunctionName()); + } + + echo tsprintf("\n"); + + return 0; + } + + $all_refs = array(); + foreach ($objects as $description) { + $matches = null; + $pattern = '/^([\w-]+)(?:\((.*)\))?\z/'; + if (!preg_match($pattern, $description, $matches)) { + throw new PhutilArgumentUsageException( + pht( + 'Object specification "%s" is unknown, expected a specification '. + 'like "commit(HEAD)".', + $description)); + } + + $function = $matches[1]; + + if (!isset($inspectors[$function])) { + ksort($inspectors); + throw new PhutilArgumentUsageException( + pht( + 'Unknown object type "%s", supported types are: %s.', + $function, + implode(', ', array_keys($inspectors)))); + } + + $inspector = $inspectors[$function]; + + if (isset($matches[2])) { + $arguments = array($matches[2]); + } else { + $arguments = array(); + } + + $ref = $inspector->newInspectRef($arguments); + + $all_refs[] = $ref; + } + + if ($is_explore) { + $this->exploreRefs($all_refs); + } + + $list = array(); + foreach ($all_refs as $ref) { + $out = $this->describeRef($ref, 0); + $list[] = $out; + } + $list = phutil_glue($list, "\n"); + + echo tsprintf('%B', $list); + + return 0; + } + + private function describeRef(ArcanistRef $ref, $depth) { + $indent = str_repeat(' ', $depth); + + $out = array(); + + $out[] = tsprintf( + "%s+ [%s] %s\n", + $indent, + get_class($ref), + $ref->getRefDisplayName()); + + $hardpoint_list = $ref->getHardpointList(); + foreach ($hardpoint_list->getHardpoints() as $hardpoint) { + $lines = $this->describeHardpoint($ref, $hardpoint, $depth + 1); + foreach ($lines as $line) { + $out[] = $line; + } + } + + return $out; + } + + private function describeHardpoint( + ArcanistRef $ref, + ArcanistHardpoint $hardpoint, + $depth) { + $indent = str_repeat(' ', $depth); + + $children = array(); + $values = array(); + + $hardpoint_key = $hardpoint->getHardpointKey(); + if ($ref->hasAttachedHardpoint($hardpoint_key)) { + $mode = '*'; + $value = $ref->getHardpoint($hardpoint_key); + + if ($value instanceof ArcanistRef) { + $children[] = $value; + } else if (is_array($value)) { + foreach ($value as $key => $child) { + if ($child instanceof ArcanistRef) { + $children[] = $child; + } else { + $values[] = $value; + } + } + } else { + $values[] = $value; + } + + } else { + $mode = 'o'; + } + + $out = array(); + $out[] = tsprintf( + "%s%s [%s] %s\n", + $indent, + $mode, + get_class($hardpoint), + $hardpoint->getHardpointKey()); + + foreach ($children as $child) { + $lines = $this->describeRef($child, $depth + 1); + foreach ($lines as $line) { + $out[] = $line; + } + } + + foreach ($values as $value) { + $lines = $this->describeValue($value, $depth + 1); + foreach ($lines as $line) { + $out[] = $line; + } + } + + return $out; + } + + private function describeValue($value, $depth) { + $indent = str_repeat(' ', $depth); + + if (is_string($value)) { + $display_value = '"'.addcslashes(substr($value, 0, 64), "\n\r\t\\\"").'"'; + } else if (is_scalar($value)) { + $display_value = phutil_string_cast($value); + } else if ($value === null) { + $display_value = 'null'; + } else { + $display_value = phutil_describe_type($value); + } + + $out = array(); + $out[] = tsprintf( + "%s> %s\n", + $indent, + $display_value); + return $out; + } + + private function exploreRefs(array $refs) { + $seen = array(); + $look = $refs; + + while ($look) { + $ref_map = $this->getRefsByClass($look); + $look = array(); + + $children = $this->inspectHardpoints($ref_map); + + foreach ($children as $child) { + $hash = spl_object_hash($child); + + if (isset($seen[$hash])) { + continue; + } + + $seen[$hash] = true; + $look[] = $child; + } + } + } + + private function getRefsByClass(array $refs) { + $ref_lists = array(); + foreach ($refs as $ref) { + $ref_lists[get_class($ref)][] = $ref; + } + + foreach ($ref_lists as $ref_class => $refs) { + $typical_ref = head($refs); + + $hardpoint_list = $typical_ref->getHardpointList(); + $hardpoints = $hardpoint_list->getHardpoints(); + + if (!$hardpoints) { + unset($ref_lists[$ref_class]); + continue; + } + + $hardpoint_keys = mpull($hardpoints, 'getHardpointKey'); + + $ref_lists[$ref_class] = array( + 'keys' => $hardpoint_keys, + 'refs' => $refs, + ); + } + + return $ref_lists; + } + + private function inspectHardpoints(array $ref_lists) { + foreach ($ref_lists as $ref_class => $spec) { + $refs = $spec['refs']; + $keys = $spec['keys']; + + $this->loadHardpoints($refs, $keys); + } + + $child_refs = array(); + + foreach ($ref_lists as $ref_class => $spec) { + $refs = $spec['refs']; + $keys = $spec['keys']; + foreach ($refs as $ref) { + foreach ($keys as $key) { + $value = $ref->getHardpoint($key); + + if (!is_array($value)) { + $value = array($value); + } + + foreach ($value as $child) { + if ($child instanceof ArcanistRef) { + $child_refs[] = $child; + } + } + } + } + } + + return $child_refs; + } + +} diff --git a/src/workflow/ArcanistLiberateWorkflow.php b/src/workflow/ArcanistLiberateWorkflow.php index efca1bf5..c8aa224f 100644 --- a/src/workflow/ArcanistLiberateWorkflow.php +++ b/src/workflow/ArcanistLiberateWorkflow.php @@ -1,146 +1,125 @@ newWorkflowInformation() + ->setSynopsis( + pht('Create or update an Arcanist library.')) + ->addExample(pht('**liberate**')) + ->addExample(pht('**liberate** [__path__]')) + ->setHelp($help); } - public function getCommandHelp() { - return phutil_console_format(<< array( - 'help' => pht( - 'Drop the module cache before liberating. This will completely '. - 'reanalyze the entire library. Thorough, but slow!'), - ), - 'force-update' => array( - 'help' => pht( - 'Force the library map to be updated, even in the presence of '. - 'lint errors.'), - ), - 'library-name' => array( - 'param' => 'name', - 'help' => - pht('Use a flag for library name rather than awaiting user input.'), - ), - 'remap' => array( - 'hide' => true, - 'help' => pht( - 'Internal. Run the remap step of liberation. You do not need to '. - 'run this unless you are debugging the workflow.'), - ), - 'verify' => array( - 'hide' => true, - 'help' => pht( - 'Internal. Run the verify step of liberation. You do not need to '. - 'run this unless you are debugging the workflow.'), - ), - 'upgrade' => array( - 'hide' => true, - 'help' => pht('Experimental. Upgrade library to v2.'), - ), - '*' => 'argv', + $this->newWorkflowArgument('clean') + ->setHelp( + pht('Perform a clean rebuild, ignoring caches. Thorough, but slow.')), + $this->newWorkflowArgument('argv') + ->setWildcard(true), ); } - public function run() { + protected function newPrompts() { + return array( + $this->newPrompt('arc.liberate.create') + ->setDescription( + pht( + 'Confirms creation of a new library.')), + ); + } + + + public function runWorkflow() { + $log = $this->getLogEngine(); + $argv = $this->getArgument('argv'); if (count($argv) > 1) { throw new ArcanistUsageException( pht( - "Provide only one path to '%s'. The path should be a directory ". - "where you want to create or update a libphutil library.", - 'arc liberate')); - } else if (count($argv) == 0) { - $path = getcwd(); - } else { - $path = reset($argv); - } + 'Provide only one path to "arc liberate". The path should identify '. + 'a directory where you want to create or update a library.')); + } else if (!$argv) { + $log->writeStatus( + pht('SCAN'), + pht('Searching for libraries in the current working directory...')); - $is_remap = $this->getArgument('remap'); - $is_verify = $this->getArgument('verify'); - - $path = Filesystem::resolvePath($path); - - if (Filesystem::pathExists($path) && is_dir($path)) { - $init = id(new FileFinder($path)) + $init_files = id(new FileFinder(getcwd())) ->withPath('*/__phutil_library_init__.php') ->find(); - } else { - $init = null; - } - if ($init) { - if (count($init) > 1) { + if (!$init_files) { throw new ArcanistUsageException( pht( - 'Specified directory contains more than one libphutil library. '. - 'Use a more specific path.')); + 'Unable to find any libraries under the current working '. + 'directory. To create a library, provide a path.')); + } + + $paths = array(); + foreach ($init_files as $init) { + $paths[] = Filesystem::resolvePath(dirname($init)); } - $path = Filesystem::resolvePath(dirname(reset($init)), $path); } else { - $found = false; - foreach (Filesystem::walkToRoot($path) as $dir) { - if (Filesystem::pathExists($dir.'/__phutil_library_init__.php')) { - $path = $dir; - $found = true; - break; - } - } - if (!$found) { - echo pht("No library currently exists at that path...\n"); - $this->liberateCreateDirectory($path); - $this->liberateCreateLibrary($path); - return; - } + $paths = array( + Filesystem::resolvePath(head($argv)), + ); + } + + foreach ($paths as $path) { + $log->writeStatus( + pht('WORK'), + pht( + 'Updating library: %s', + Filesystem::readablePath($path).DIRECTORY_SEPARATOR)); + $this->liberatePath($path); + } + + $log->writeSuccess( + pht('DONE'), + pht('Updated %s librarie(s).', phutil_count($paths))); + + return 0; + } + + private function liberatePath($path) { + if (!Filesystem::pathExists($path.'/__phutil_library_init__.php')) { + echo tsprintf( + "%s\n", + pht( + 'No library currently exists at the path "%s"...', + $path)); + $this->liberateCreateDirectory($path); + $this->liberateCreateLibrary($path); + return; } $version = $this->getLibraryFormatVersion($path); switch ($version) { case 1: - if ($this->getArgument('upgrade')) { - return $this->upgradeLibrary($path); - } throw new ArcanistUsageException( pht( - "This library is using libphutil v1, which is no ". - "longer supported. Run '%s' to upgrade to v2.", - 'arc liberate --upgrade')); + 'This very old library is no longer supported.')); case 2: - if ($this->getArgument('upgrade')) { - throw new ArcanistUsageException( - pht("Can't upgrade a v2 library!")); - } return $this->liberateVersion2($path); default: throw new ArcanistUsageException( pht("Unknown library version '%s'!", $version)); } + + echo tsprintf("%s\n", pht('Done.')); } private function getLibraryFormatVersion($path) { @@ -161,28 +140,18 @@ EOTEXT } private function liberateVersion2($path) { - $bin = $this->getScriptPath('scripts/phutil_rebuild_map.php'); + $bin = $this->getScriptPath('support/lib/rebuild-map.php'); - return phutil_passthru( - 'php %s %C %s', - $bin, - $this->getArgument('all') ? '--drop-cache' : '', - $path); - } - - private function upgradeLibrary($path) { - $inits = id(new FileFinder($path)) - ->withPath('*/__init__.php') - ->withType('f') - ->find(); - - echo pht('Removing %s files...', '__init__.php')."\n"; - foreach ($inits as $init) { - Filesystem::remove($path.'/'.$init); + $argv = array(); + if ($this->getArgument('clean')) { + $argv[] = '--drop-cache'; } - echo pht('Upgrading library to v2...')."\n"; - $this->liberateVersion2($path); + return phutil_passthru( + 'php -f %R -- %Ls %R', + $bin, + $argv, + $path); } private function liberateCreateDirectory($path) { @@ -195,12 +164,20 @@ EOTEXT return; } - echo pht("The directory '%s' does not exist.", $path); - if (!phutil_console_confirm(pht('Do you want to create it?'))) { - throw new ArcanistUsageException(pht('Canceled.')); - } + echo tsprintf( + "%!\n%W\n", + pht('NEW LIBRARY'), + pht( + 'The directory "%s" does not exist. Do you want to create it?', + $path)); - execx('mkdir -p %s', $path); + $query = pht('Create new library?'); + + $this->getPrompt('arc.liberate.create') + ->setQuery($query) + ->execute(); + + execx('mkdir -p %R', $path); } private function liberateCreateLibrary($path) { @@ -212,14 +189,10 @@ EOTEXT echo pht("Creating new libphutil library in '%s'.", $path)."\n"; do { - $name = $this->getArgument('library-name'); - if ($name === null) { - echo pht('Choose a name for the new library.')."\n"; - $name = phutil_console_prompt( - pht('What do you want to name this library?')); - } else { - echo pht('Using library name %s.', $name)."\n"; - } + echo pht('Choose a name for the new library.')."\n"; + $name = phutil_console_prompt( + pht('What do you want to name this library?')); + if (preg_match('/^[a-z-]+$/', $name)) { break; } else { @@ -244,7 +217,7 @@ EOTEXT private function getScriptPath($script) { - $root = dirname(phutil_get_library_root('phutil')); + $root = dirname(phutil_get_library_root('arcanist')); return $root.'/'.$script; } diff --git a/src/workflow/ArcanistLintWorkflow.php b/src/workflow/ArcanistLintWorkflow.php index d61091a8..190b2d14 100644 --- a/src/workflow/ArcanistLintWorkflow.php +++ b/src/workflow/ArcanistLintWorkflow.php @@ -13,7 +13,6 @@ final class ArcanistLintWorkflow extends ArcanistWorkflow { const DEFAULT_SEVERITY = ArcanistLintSeverity::SEVERITY_ADVICE; private $unresolvedMessages; - private $shouldLintAll; private $shouldAmendChanges = false; private $shouldAmendWithoutPrompt = false; private $shouldAmendAutofixesWithoutPrompt = false; @@ -61,19 +60,6 @@ EOTEXT 'help' => pht( 'Show all lint warnings, not just those on changed lines. When '. 'paths are specified, this is the default behavior.'), - 'conflicts' => array( - 'only-changed' => true, - ), - ), - 'only-changed' => array( - 'help' => pht( - 'Show lint warnings just on changed lines. When no paths are '. - 'specified, this is the default. This differs from only-new '. - 'in cases where line modifications introduce lint on other '. - 'unmodified lines.'), - 'conflicts' => array( - 'lintall' => true, - ), ), 'rev' => array( 'param' => 'revision', @@ -88,24 +74,13 @@ EOTEXT ), 'output' => array( 'param' => 'format', - 'help' => pht( - "With 'summary', show lint warnings in a more compact format. ". - "With 'json', show lint warnings in machine-readable JSON format. ". - "With 'none', show no lint warnings. ". - "With 'compiler', show lint warnings in suitable for your editor. ". - "With 'xml', show lint warnings in the Checkstyle XML format."), + 'help' => pht('Select an output format.'), ), 'outfile' => array( 'param' => 'path', 'help' => pht( 'Output the linter results to a file. Defaults to stdout.'), ), - 'only-new' => array( - 'param' => 'bool', - 'supports' => array('git', 'hg'), // TODO: svn - 'help' => pht( - 'Display only messages not present in the original code.'), - ), 'engine' => array( 'param' => 'classname', 'help' => pht('Override configured lint engine for this project.'), @@ -139,7 +114,6 @@ EOTEXT 'Lint all tracked files in the working copy. Ignored files and '. 'untracked files will not be linted.'), 'conflicts' => array( - 'cache' => pht('%s lints all files', '--everything'), 'rev' => pht('%s lints all files', '--everything'), ), ), @@ -154,22 +128,12 @@ EOTEXT array_keys(ArcanistLintSeverity::getLintSeverities()))), self::DEFAULT_SEVERITY), ), - 'cache' => array( - 'param' => 'bool', - 'help' => pht( - "%d to disable cache, %d to enable. The default value is determined ". - "by '%s' in configuration, which defaults to off. See notes in '%s'.", - 0, - 1, - 'arc.lint.cache', - 'arc.lint.cache'), - ), '*' => 'paths', ); } public function requiresAuthentication() { - return (bool)$this->getArgument('only-new'); + return false; } public function requiresWorkingCopy() { @@ -180,24 +144,15 @@ EOTEXT return true; } - private function getCacheKey() { - return implode("\n", array( - get_class($this->engine), - $this->getArgument('severity', self::DEFAULT_SEVERITY), - $this->shouldLintAll, - )); - } - public function run() { $console = PhutilConsole::getConsole(); - $working_copy = $this->getWorkingCopy(); + $working_copy = $this->getWorkingCopyIdentity(); $configuration_manager = $this->getConfigurationManager(); $engine = $this->newLintEngine($this->getArgument('engine')); $rev = $this->getArgument('rev'); $paths = $this->getArgument('paths'); - $use_cache = $this->getArgument('cache', null); $everything = $this->getArgument('everything'); if ($everything && $paths) { throw new ArcanistUsageException( @@ -207,31 +162,35 @@ EOTEXT '--everything', '--everything')); } - if ($use_cache === null) { - $use_cache = (bool)$configuration_manager->getConfigFromAnySource( - 'arc.lint.cache', - false); + + if ($rev !== null) { + $this->parseBaseCommitArgument(array($rev)); } - if ($rev && $paths) { - throw new ArcanistUsageException( - pht('Specify either %s or paths.', '--rev')); - } + // Sometimes, we hide low-severity messages which occur on lines which + // were not changed. This is the default behavior when you run "arc lint" + // with no arguments: if you touched a file, but there was already some + // minor warning about whitespace or spelling elsewhere in the file, you + // don't need to correct it. + // In other modes, notably "arc lint ", this is not the defualt + // behavior. If you ask us to lint a specific file, we show you all the + // lint messages in the file. - // NOTE: When the user specifies paths, we imply --lintall and show all - // warnings for the paths in question. This is easier to deal with for - // us and less confusing for users. - $this->shouldLintAll = $paths ? true : false; + // You can change this behavior with various flags, including "--lintall", + // "--rev", and "--everything". if ($this->getArgument('lintall')) { - $this->shouldLintAll = true; - } else if ($this->getArgument('only-changed')) { - $this->shouldLintAll = false; + $lint_all = true; + } else if ($rev !== null) { + $lint_all = false; + } else if ($paths || $everything) { + $lint_all = true; + } else { + $lint_all = false; } if ($everything) { $paths = iterator_to_array($this->getRepositoryAPI()->getAllFiles()); - $this->shouldLintAll = true; } else { $paths = $this->selectPathsForWorkflow($paths, $rev); } @@ -241,45 +200,11 @@ EOTEXT $engine->setMinimumSeverity( $this->getArgument('severity', self::DEFAULT_SEVERITY)); - $file_hashes = array(); - if ($use_cache) { - $engine->setRepositoryVersion($this->getRepositoryVersion()); - $cache = $this->readScratchJSONFile('lint-cache.json'); - $cache = idx($cache, $this->getCacheKey(), array()); - $cached = array(); - - foreach ($paths as $path) { - $abs_path = $engine->getFilePathOnDisk($path); - if (!Filesystem::pathExists($abs_path)) { - continue; - } - $file_hashes[$abs_path] = md5_file($abs_path); - - if (!isset($cache[$path])) { - continue; - } - $messages = idx($cache[$path], $file_hashes[$abs_path]); - if ($messages !== null) { - $cached[$path] = $messages; - } - } - - if ($cached) { - $console->writeErr( - "%s\n", - pht( - "Using lint cache, use '%s' to disable it.", - '--cache 0')); - } - - $engine->setCachedResults($cached); - } - // Propagate information about which lines changed to the lint engine. // This is used so that the lint engine can drop warning messages // concerning lines that weren't in the change. $engine->setPaths($paths); - if (!$this->shouldLintAll) { + if (!$lint_all) { foreach ($paths as $path) { // Note that getChangedLines() returns null to indicate that a file // is binary or a directory (i.e., changed lines are not relevant). @@ -289,49 +214,6 @@ EOTEXT } } - // Enable possible async linting only for 'arc diff' not 'arc lint' - if ($this->getParentWorkflow()) { - $engine->setEnableAsyncLint(true); - } else { - $engine->setEnableAsyncLint(false); - } - - if ($this->getArgument('only-new')) { - $conduit = $this->getConduit(); - $api = $this->getRepositoryAPI(); - if ($rev) { - $api->setBaseCommit($rev); - } - $svn_root = id(new PhutilURI($api->getSourceControlPath()))->getPath(); - - $all_paths = array(); - foreach ($paths as $path) { - $path = str_replace(DIRECTORY_SEPARATOR, '/', $path); - $full_paths = array($path); - - $change = $this->getChange($path); - $type = $change->getType(); - if (ArcanistDiffChangeType::isOldLocationChangeType($type)) { - $full_paths = $change->getAwayPaths(); - } else if (ArcanistDiffChangeType::isNewLocationChangeType($type)) { - continue; - } else if (ArcanistDiffChangeType::isDeleteChangeType($type)) { - continue; - } - - foreach ($full_paths as $full_path) { - $all_paths[$svn_root.'/'.$full_path] = $path; - } - } - - $lint_future = $conduit->callMethod('diffusion.getlintmessages', array( - 'repositoryPHID' => idx($this->loadProjectRepository(), 'phid'), - 'branch' => '', // TODO: Tracking branch. - 'commit' => $api->getBaseCommit(), - 'files' => array_keys($all_paths), - )); - } - $failed = null; try { $engine->run(); @@ -341,65 +223,6 @@ EOTEXT $results = $engine->getResults(); - if ($this->getArgument('only-new')) { - $total = 0; - foreach ($results as $result) { - $total += count($result->getMessages()); - } - - // Don't wait for response with default value of --only-new. - $timeout = null; - if ($this->getArgument('only-new') === null || !$total) { - $timeout = 0; - } - - $raw_messages = $this->resolveCall($lint_future, $timeout); - if ($raw_messages && $total) { - $old_messages = array(); - $line_maps = array(); - foreach ($raw_messages as $message) { - $path = $all_paths[$message['path']]; - $line = $message['line']; - $code = $message['code']; - - if (!isset($line_maps[$path])) { - $line_maps[$path] = $this->getChange($path)->buildLineMap(); - } - - $new_lines = idx($line_maps[$path], $line); - if (!$new_lines) { // Unmodified lines after last hunk. - $last_old = ($line_maps[$path] ? last_key($line_maps[$path]) : 0); - $news = array_filter($line_maps[$path]); - $last_new = ($news ? last(end($news)) : 0); - $new_lines = array($line + $last_new - $last_old); - } - - $error = array($code => array(true)); - foreach ($new_lines as $new) { - if (isset($old_messages[$path][$new])) { - $old_messages[$path][$new][$code][] = true; - break; - } - $old_messages[$path][$new] = &$error; - } - unset($error); - } - - foreach ($results as $result) { - foreach ($result->getMessages() as $message) { - $path = str_replace(DIRECTORY_SEPARATOR, '/', $message->getPath()); - $line = $message->getLine(); - $code = $message->getCode(); - if (!empty($old_messages[$path][$line][$code])) { - $message->setObsolete(true); - array_pop($old_messages[$path][$line][$code]); - } - } - $result->sortAndFilterMessages(); - } - } - } - if ($this->getArgument('never-apply-patches')) { $apply_patches = false; } else { @@ -418,11 +241,8 @@ EOTEXT } if ($this->getArgument('amend-autofixes')) { - $prompt_autofix_patches = false; $this->shouldAmendChanges = true; $this->shouldAmendAutofixesWithoutPrompt = true; - } else { - $prompt_autofix_patches = true; } $repository_api = $this->getRepositoryAPI(); @@ -433,111 +253,76 @@ EOTEXT $wrote_to_disk = false; - switch ($this->getArgument('output')) { - case 'json': - $renderer = new ArcanistJSONLintRenderer(); - $prompt_patches = false; - $apply_patches = $this->getArgument('apply-patches'); - break; - case 'summary': - $renderer = new ArcanistSummaryLintRenderer(); - break; - case 'none': - $prompt_patches = false; - $apply_patches = $this->getArgument('apply-patches'); - $renderer = new ArcanistNoneLintRenderer(); - break; - case 'compiler': - $renderer = new ArcanistCompilerLintRenderer(); - $prompt_patches = false; - $apply_patches = $this->getArgument('apply-patches'); - break; - case 'xml': - $renderer = new ArcanistCheckstyleXMLLintRenderer(); - $prompt_patches = false; - $apply_patches = $this->getArgument('apply-patches'); - break; - default: - $renderer = new ArcanistConsoleLintRenderer(); - $renderer->setShowAutofixPatches($prompt_autofix_patches); - break; + $default_renderer = ArcanistConsoleLintRenderer::RENDERERKEY; + $renderer_key = $this->getArgument('output', $default_renderer); + + $renderers = ArcanistLintRenderer::getAllRenderers(); + if (!isset($renderers[$renderer_key])) { + throw new Exception( + pht( + 'Lint renderer "%s" is unknown. Supported renderers are: %s.', + $renderer_key, + implode(', ', array_keys($renderers)))); } + $renderer = $renderers[$renderer_key]; $all_autofix = true; - $tmp = null; - if ($this->getArgument('outfile') !== null) { - $tmp = id(new TempFile()) - ->setPreserveFile(true); - } - - $preamble = $renderer->renderPreamble(); - if ($tmp) { - Filesystem::appendFile($tmp, $preamble); + $out_path = $this->getArgument('outfile'); + if ($out_path !== null) { + $tmp = new TempFile(); + $renderer->setOutputPath((string)$tmp); } else { - $console->writeOut('%s', $preamble); + $tmp = null; } - foreach ($results as $result) { - $result_all_autofix = $result->isAllAutofix(); + if ($failed) { + $renderer->handleException($failed); + } - if (!$result->getMessages() && !$result_all_autofix) { + $renderer->willRenderResults(); + + $should_patch = ($apply_patches && $renderer->supportsPatching()); + foreach ($results as $result) { + if (!$result->getMessages()) { continue; } + $result_all_autofix = $result->isAllAutofix(); if (!$result_all_autofix) { $all_autofix = false; } - $lint_result = $renderer->renderLintResult($result); - if ($lint_result) { - if ($tmp) { - Filesystem::appendFile($tmp, $lint_result); - } else { - $console->writeOut('%s', $lint_result); - } - } + $renderer->renderLintResult($result); - if ($apply_patches && $result->isPatchable()) { + if ($should_patch && $result->isPatchable()) { $patcher = ArcanistLintPatcher::newFromArcanistLintResult($result); - $old_file = $result->getFilePathOnDisk(); - if ($prompt_patches && - !($result_all_autofix && !$prompt_autofix_patches)) { + $apply = true; + if ($prompt_patches && !$result_all_autofix) { + $old_file = $result->getFilePathOnDisk(); if (!Filesystem::pathExists($old_file)) { - $old_file = '/dev/null'; + $old_file = null; } + $new_file = new TempFile(); $new = $patcher->getModifiedFileContent(); Filesystem::writeFile($new_file, $new); - // TODO: Improve the behavior here, make it more like - // difference_render(). - list(, $stdout, $stderr) = - exec_manual('diff -u %s %s', $old_file, $new_file); - $console->writeOut('%s', $stdout); - $console->writeErr('%s', $stderr); - - $prompt = pht( - 'Apply this patch to %s?', - phutil_console_format('__%s__', $result->getPath())); - if (!phutil_console_confirm($prompt, $default_no = false)) { - continue; - } + $apply = $renderer->promptForPatch($result, $old_file, $new_file); } - $patcher->writePatchToDisk(); - $wrote_to_disk = true; - $file_hashes[$old_file] = md5_file($old_file); + if ($apply) { + $patcher->writePatchToDisk(); + $wrote_to_disk = true; + } } } - $postamble = $renderer->renderPostamble(); + $renderer->didRenderResults(); + if ($tmp) { - Filesystem::appendFile($tmp, $postamble); - Filesystem::rename($tmp, $this->getArgument('outfile')); - } else { - $console->writeOut('%s', $postamble); + Filesystem::rename($tmp, $out_path); } if ($wrote_to_disk && $this->shouldAmendChanges) { @@ -568,20 +353,6 @@ EOTEXT } } - if ($this->getArgument('output') == 'json') { - // NOTE: Required by save_lint.php in Phabricator. - return 0; - } - - if ($failed) { - if ($failed instanceof ArcanistNoEffectException) { - if ($renderer instanceof ArcanistNoneLintRenderer) { - return 0; - } - } - throw $failed; - } - $unresolved = array(); $has_warnings = false; $has_errors = false; @@ -600,46 +371,6 @@ EOTEXT } $this->unresolvedMessages = $unresolved; - $cache = $this->readScratchJSONFile('lint-cache.json'); - $cached = idx($cache, $this->getCacheKey(), array()); - if ($cached || $use_cache) { - $stopped = $engine->getStoppedPaths(); - foreach ($results as $result) { - $path = $result->getPath(); - if (!$use_cache) { - unset($cached[$path]); - continue; - } - $abs_path = $engine->getFilePathOnDisk($path); - if (!Filesystem::pathExists($abs_path)) { - continue; - } - $version = $result->getCacheVersion(); - $cached_path = array(); - if (isset($stopped[$path])) { - $cached_path['stopped'] = $stopped[$path]; - } - $cached_path['repository_version'] = $this->getRepositoryVersion(); - foreach ($result->getMessages() as $message) { - $granularity = $message->getGranularity(); - if ($granularity == ArcanistLinter::GRANULARITY_GLOBAL) { - continue; - } - if (!$message->isPatchApplied()) { - $cached_path[] = $message->toDictionary(); - } - } - $hash = idx($file_hashes, $abs_path); - if (!$hash) { - $hash = md5_file($abs_path); - } - $cached[$path] = array($hash => array($version => $cached_path)); - } - $cache[$this->getCacheKey()] = $cached; - // TODO: Garbage collection. - $this->writeScratchJSONFile('lint-cache.json', $cache); - } - // Take the most severe lint message severity and use that // as the result code. if ($has_errors) { @@ -650,11 +381,7 @@ EOTEXT $result_code = self::RESULT_OKAY; } - if (!$this->getParentWorkflow()) { - if ($result_code == self::RESULT_OKAY) { - $console->writeOut('%s', $renderer->renderOkayResult()); - } - } + $renderer->renderResultCode($result_code); return $result_code; } diff --git a/src/workflow/ArcanistPasteWorkflow.php b/src/workflow/ArcanistPasteWorkflow.php index f7f1bbff..42df05b2 100644 --- a/src/workflow/ArcanistPasteWorkflow.php +++ b/src/workflow/ArcanistPasteWorkflow.php @@ -1,145 +1,137 @@ newWorkflowInformation() + ->addExample('**paste** [__options__] --') + ->addExample('**paste** [__options__] -- __object__') + ->setHelp($help); } - public function getCommandHelp() { - return phutil_console_format(<< array( - 'param' => 'title', - 'help' => pht('Title for the paste.'), - ), - 'lang' => array( - 'param' => 'language', - 'help' => pht('Language for syntax highlighting.'), - ), - 'json' => array( - 'help' => pht('Output in JSON format.'), - ), - '*' => 'argv', + $this->newWorkflowArgument('title') + ->setParameter('title') + ->setHelp(pht('Title for the paste.')), + $this->newWorkflowArgument('lang') + ->setParameter('language') + ->setHelp(pht('Language for the paste.')), + $this->newWorkflowArgument('json') + ->setHelp(pht('Output in JSON format.')), + $this->newWorkflowArgument('argv') + ->setWildcard(true), ); } - public function requiresAuthentication() { - return true; - } - - protected function didParseArguments() { - $this->json = $this->getArgument('json'); - $this->language = $this->getArgument('lang'); - $this->title = $this->getArgument('title'); + public function runWorkflow() { + $set_language = $this->getArgument('lang'); + $set_title = $this->getArgument('title'); $argv = $this->getArgument('argv'); if (count($argv) > 1) { - throw new ArcanistUsageException( - pht('Specify only one paste to retrieve.')); - } else if (count($argv) == 1) { - $id = $argv[0]; - if (!preg_match('/^P?\d+/', $id)) { - throw new ArcanistUsageException( + throw new PhutilArgumentUsageException( + pht( + 'Specify only one paste to retrieve.')); + } + + $symbols = $this->getSymbolEngine(); + + if (count($argv) === 1) { + if ($set_language !== null) { + throw new PhutilArgumentUsageException( pht( - 'Specify a paste ID, like %s.', - 'P123')); + 'Flag "--lang" is not supported when reading pastes.')); } - $this->id = (int)ltrim($id, 'P'); - if ($this->language || $this->title) { - throw new ArcanistUsageException( + if ($set_title !== null) { + throw new PhutilArgumentUsageException( pht( - 'Use options %s and %s only when creating pastes.', - '--lang', - '--title')); + 'Flag "--title" is not supported when reading pastes.')); } - } - } - public function run() { - if ($this->id) { - return $this->getPaste(); - } else { - return $this->createPaste(); - } - } + $paste_symbol = $argv[0]; - private function getPaste() { - $conduit = $this->getConduit(); - - $info = $conduit->callMethodSynchronous( - 'paste.query', - array( - 'ids' => array($this->id), - )); - $info = head($info); - - if ($this->json) { - echo json_encode($info)."\n"; - } else { - echo $info['content']; - if (!preg_match('/\\n$/', $info['content'])) { - // If there's no newline, add one, since it looks stupid otherwise. If - // you want byte-for-byte equivalence you can use `--json`. - echo "\n"; + $paste_ref = $symbols->loadPasteForSymbol($paste_symbol); + if (!$paste_ref) { + throw new PhutilArgumentUsageException( + pht( + 'Paste "%s" does not exist, or you do not have access '. + 'to see it.')); } + + echo $paste_ref->getContent(); + + return 0; } - return 0; - } + $content = $this->readStdin(); - private function createPaste() { - $conduit = $this->getConduit(); + $xactions = array(); - if (!function_exists('posix_isatty') || posix_isatty(STDIN)) { - $this->writeStatusMessage(pht('Reading paste from stdin...')."\n"); + if ($set_title === null) { + $set_title = pht('Command-Line Input'); } - $info = $conduit->callMethodSynchronous( - 'paste.create', - array( - 'content' => file_get_contents('php://stdin'), - 'title' => $this->title, - 'language' => $this->language, - )); + $xactions[] = array( + 'type' => 'title', + 'value' => $set_title, + ); - if ($this->getArgument('json')) { - echo json_encode($info)."\n"; - } else { - echo $info['objectName'].': '.$info['uri']."\n"; + if ($set_language !== null) { + $xactions[] = array( + 'type' => 'language', + 'value' => $set_language, + ); } + $xactions[] = array( + 'type' => 'text', + 'value' => $content, + ); + + $method = 'paste.edit'; + + $parameters = array( + 'transactions' => $xactions, + ); + + $conduit_engine = $this->getConduitEngine(); + $conduit_call = $conduit_engine->newCall($method, $parameters); + $conduit_future = $conduit_engine->newFuture($conduit_call); + $result = $conduit_future->resolve(); + + $paste_phid = idxv($result, array('object', 'phid')); + $paste_ref = $symbols->loadPasteForSymbol($paste_phid); + + $log = $this->getLogEngine(); + + $log->writeSuccess( + pht('DONE'), + pht('Created a new paste.')); + + echo tsprintf( + '%s', + $paste_ref->newDisplayRef() + ->setURI($paste_ref->getURI())); + return 0; } diff --git a/src/workflow/ArcanistPhrequentWorkflow.php b/src/workflow/ArcanistPhrequentWorkflow.php deleted file mode 100644 index 3157c8ee..00000000 --- a/src/workflow/ArcanistPhrequentWorkflow.php +++ /dev/null @@ -1,70 +0,0 @@ -getConduit(); - - $results = $conduit->callMethodSynchronous( - 'phrequent.tracking', - array()); - $results = $results['data']; - - if (count($results) === 0) { - echo phutil_console_format( - "%s\n", - pht('Not currently tracking time against any object.')); - return 0; - } - - $phids_to_lookup = array(); - foreach ($results as $result) { - $phids_to_lookup[] = $result['phid']; - } - - $phid_query = $conduit->callMethodSynchronous( - 'phid.query', - array( - 'phids' => $phids_to_lookup, - )); - - $phid_map = array(); - foreach ($phids_to_lookup as $lookup) { - if (array_key_exists($lookup, $phid_query)) { - $phid_map[$lookup] = $phid_query[$lookup]['fullName']; - } else { - $phid_map[$lookup] = pht('Unknown Object'); - } - } - - $table = id(new PhutilConsoleTable()) - ->addColumn('type', array('title' => pht('Status'))) - ->addColumn('time', array('title' => pht('Tracked'), 'align' => 'right')) - ->addColumn('name', array('title' => pht('Name'))) - ->setBorders(false); - - $i = 0; - foreach ($results as $result) { - if ($i === 0) { - $column_type = pht('In Progress'); - } else { - $column_type = pht('Suspended'); - } - - $table->addRow(array( - 'type' => '('.$column_type.')', - 'time' => tsprintf($result['time']), - 'name' => $phid_map[$result['phid']], - )); - - $i++; - } - - $table->draw(); - return 0; - } - -} diff --git a/src/workflow/ArcanistRevertWorkflow.php b/src/workflow/ArcanistRevertWorkflow.php deleted file mode 100644 index efcc25bc..00000000 --- a/src/workflow/ArcanistRevertWorkflow.php +++ /dev/null @@ -1,43 +0,0 @@ - 'input', - ); - } - - public function getSupportedRevisionControlSystems() { - return array('git', 'hg'); - } - - public function run() { - echo pht( - 'Please use `%s` instead.', - 'arc backout')."\n"; - return 1; - } - -} diff --git a/src/workflow/ArcanistShellCompleteWorkflow.php b/src/workflow/ArcanistShellCompleteWorkflow.php deleted file mode 100644 index 6e6c8319..00000000 --- a/src/workflow/ArcanistShellCompleteWorkflow.php +++ /dev/null @@ -1,201 +0,0 @@ - array( - 'param' => 'cursor_position', - 'paramtype' => 'int', - 'help' => pht('Current term in the argument list being completed.'), - ), - '*' => 'argv', - ); - } - - protected function shouldShellComplete() { - return false; - } - - public function run() { - $pos = $this->getArgument('current'); - $argv = $this->getArgument('argv', array()); - $argc = count($argv); - if ($pos === null) { - $pos = $argc - 1; - } - - if ($pos > $argc) { - throw new ArcanistUsageException( - pht( - 'Specified position is greater than the number of '. - 'arguments provided.')); - } - - // Determine which revision control system the working copy uses, so we - // can filter out commands and flags which aren't supported. If we can't - // figure it out, just return all flags/commands. - $vcs = null; - - // We have to build our own because if we requiresWorkingCopy() we'll throw - // if we aren't in a .arcconfig directory. We probably still can't do much, - // but commands can raise more detailed errors. - $configuration_manager = $this->getConfigurationManager(); - $working_copy = ArcanistWorkingCopyIdentity::newFromPath(getcwd()); - if ($working_copy->getVCSType()) { - $configuration_manager->setWorkingCopyIdentity($working_copy); - $repository_api = ArcanistRepositoryAPI::newAPIFromConfigurationManager( - $configuration_manager); - - $vcs = $repository_api->getSourceControlSystemName(); - } - - $arc_config = $this->getArcanistConfiguration(); - - if ($pos <= 1) { - $workflows = $arc_config->buildAllWorkflows(); - - $complete = array(); - foreach ($workflows as $name => $workflow) { - if (!$workflow->shouldShellComplete()) { - continue; - } - - $workflow->setArcanistConfiguration($this->getArcanistConfiguration()); - $workflow->setConfigurationManager($this->getConfigurationManager()); - - if ($vcs || $workflow->requiresWorkingCopy()) { - $supported_vcs = $workflow->getSupportedRevisionControlSystems(); - if (!in_array($vcs, $supported_vcs)) { - continue; - } - } - - $complete[] = $name; - } - - // Also permit autocompletion of "arc alias" commands. - $aliases = ArcanistAliasWorkflow::getAliases($configuration_manager); - foreach ($aliases as $key => $value) { - $complete[] = $key; - } - - echo implode(' ', $complete)."\n"; - return 0; - } else { - $workflow = $arc_config->buildWorkflow($argv[1]); - if (!$workflow) { - list($new_command, $new_args) = ArcanistAliasWorkflow::resolveAliases( - $argv[1], - $arc_config, - array_slice($argv, 2), - $configuration_manager); - if ($new_command) { - $workflow = $arc_config->buildWorkflow($new_command); - } - if (!$workflow) { - return 1; - } else { - $argv = array_merge( - array($argv[0]), - array($new_command), - $new_args); - } - } - - $arguments = $workflow->getArguments(); - - $prev = idx($argv, $pos - 1, null); - if (!strncmp($prev, '--', 2)) { - $prev = substr($prev, 2); - } else { - $prev = null; - } - - if ($prev !== null && - isset($arguments[$prev]) && - isset($arguments[$prev]['param'])) { - - $type = idx($arguments[$prev], 'paramtype'); - switch ($type) { - case 'file': - echo "FILE\n"; - break; - case 'complete': - echo implode(' ', $workflow->getShellCompletions($argv))."\n"; - break; - default: - echo "ARGUMENT\n"; - break; - } - return 0; - } else { - $output = array(); - foreach ($arguments as $argument => $spec) { - if ($argument == '*') { - continue; - } - if ($vcs && - isset($spec['supports']) && - !in_array($vcs, $spec['supports'])) { - continue; - } - $output[] = '--'.$argument; - } - - $cur = idx($argv, $pos, ''); - $any_match = false; - - if (strlen($cur)) { - foreach ($output as $possible) { - if (!strncmp($possible, $cur, strlen($cur))) { - $any_match = true; - } - } - } - - if (!$any_match && isset($arguments['*'])) { - // TODO: This is mega hacktown but something else probably breaks - // if we use a rich argument specification; fix it when we move to - // PhutilArgumentParser since everything will need to be tested then - // anyway. - if ($arguments['*'] == 'branch' && isset($repository_api)) { - $branches = $repository_api->getAllBranches(); - $branches = ipull($branches, 'name'); - $output = $branches; - } else { - $output = array('FILE'); - } - } - - echo implode(' ', $output)."\n"; - - return 0; - } - } - } - -} diff --git a/src/workflow/ArcanistStartWorkflow.php b/src/workflow/ArcanistStartWorkflow.php deleted file mode 100644 index b39cea5a..00000000 --- a/src/workflow/ArcanistStartWorkflow.php +++ /dev/null @@ -1,82 +0,0 @@ - 'name', - ); - } - - public function run() { - $conduit = $this->getConduit(); - - $started_phids = array(); - $short_name = $this->getArgument('name'); - - foreach ($short_name as $object_name) { - $object_lookup = $conduit->callMethodSynchronous( - 'phid.lookup', - array( - 'names' => array($object_name), - )); - - if (!array_key_exists($object_name, $object_lookup)) { - echo phutil_console_format( - "%s\n", - pht("No such object '%s' found.", $object_name)); - return 1; - } - - $object_phid = $object_lookup[$object_name]['phid']; - - $started_phids[] = $conduit->callMethodSynchronous( - 'phrequent.push', - array( - 'objectPHID' => $object_phid, - )); - } - - $phid_query = $conduit->callMethodSynchronous( - 'phid.query', - array( - 'phids' => $started_phids, - )); - - echo phutil_console_format( - "%s: %s\n\n", - pht('Started'), - implode(', ', ipull($phid_query, 'fullName'))); - $this->printCurrentTracking(); - } - -} diff --git a/src/workflow/ArcanistStopWorkflow.php b/src/workflow/ArcanistStopWorkflow.php deleted file mode 100644 index 2af72edb..00000000 --- a/src/workflow/ArcanistStopWorkflow.php +++ /dev/null @@ -1,111 +0,0 @@ - array( - 'param' => 'note', - 'help' => pht('A note to attach to the tracked time.'), - ), - '*' => 'name', - ); - } - - public function run() { - $conduit = $this->getConduit(); - $names = $this->getArgument('name'); - - $object_lookup = $conduit->callMethodSynchronous( - 'phid.lookup', - array( - 'names' => $names, - )); - - foreach ($names as $object_name) { - if (!array_key_exists($object_name, $object_lookup)) { - throw new ArcanistUsageException( - pht("No such object '%s' found.", $object_name)); - return 1; - } - } - - if (count($names) === 0) { - // Implicit stop; add an entry so the loop will call - // `phrequent.pop` with a null `objectPHID`. - $object_lookup[] = array('phid' => null); - } - - $stopped_phids = array(); - foreach ($object_lookup as $ref) { - $object_phid = $ref['phid']; - - $stopped_phid = $conduit->callMethodSynchronous( - 'phrequent.pop', - array( - 'objectPHID' => $object_phid, - 'note' => $this->getArgument('note'), - )); - if ($stopped_phid !== null) { - $stopped_phids[] = $stopped_phid; - } - } - - if (count($stopped_phids) === 0) { - if (count($names) === 0) { - echo phutil_console_format( - "%s\n", - pht('Not currently tracking time against any object.')); - } else { - echo phutil_console_format( - "%s\n", - pht( - 'Not currently tracking time against %s.', - implode(', ', ipull($object_lookup, 'fullName')))); - } - return 1; - } - - $phid_query = $conduit->callMethodSynchronous( - 'phid.query', - array( - 'phids' => $stopped_phids, - )); - - echo phutil_console_format( - "%s %s\n\n", - pht('Stopped:'), - implode(', ', ipull($phid_query, 'fullName'))); - $this->printCurrentTracking(); - } - -} diff --git a/src/workflow/ArcanistTimeWorkflow.php b/src/workflow/ArcanistTimeWorkflow.php deleted file mode 100644 index 0080582a..00000000 --- a/src/workflow/ArcanistTimeWorkflow.php +++ /dev/null @@ -1,38 +0,0 @@ -printCurrentTracking(); - } - -} diff --git a/src/workflow/ArcanistUnitWorkflow.php b/src/workflow/ArcanistUnitWorkflow.php index c0a2fabc..db01d000 100644 --- a/src/workflow/ArcanistUnitWorkflow.php +++ b/src/workflow/ArcanistUnitWorkflow.php @@ -128,7 +128,7 @@ EOTEXT } public function run() { - $working_copy = $this->getWorkingCopy(); + $working_copy = $this->getWorkingCopyIdentity(); $paths = $this->getArgument('paths'); $rev = $this->getArgument('rev'); diff --git a/src/workflow/ArcanistUpgradeWorkflow.php b/src/workflow/ArcanistUpgradeWorkflow.php index 50449ef7..7759c10a 100644 --- a/src/workflow/ArcanistUpgradeWorkflow.php +++ b/src/workflow/ArcanistUpgradeWorkflow.php @@ -1,66 +1,73 @@ newWorkflowInformation() + ->setSynopsis(pht('Upgrade Arcanist to the latest version.')) + ->addExample(pht('**upgrade**')) + ->setHelp($help); } - public function getCommandHelp() { - return phutil_console_format(<<getLogEngine(); + $roots = array( - 'libphutil' => dirname(phutil_get_library_root('phutil')), 'arcanist' => dirname(phutil_get_library_root('arcanist')), ); - foreach ($roots as $lib => $root) { - echo phutil_console_format( - "%s\n", - pht('Upgrading %s...', $lib)); + $supported_branches = array( + 'master', + 'stable', + ); + $supported_branches = array_fuse($supported_branches); - $working_copy = ArcanistWorkingCopyIdentity::newFromPath($root); - $configuration_manager = clone $this->getConfigurationManager(); - $configuration_manager->setWorkingCopyIdentity($working_copy); - $repository = ArcanistRepositoryAPI::newAPIFromConfigurationManager( - $configuration_manager); + foreach ($roots as $library => $root) { + $log->writeStatus( + pht('PREPARING'), + pht( + 'Preparing to upgrade "%s"...', + $library)); - if (!Filesystem::pathExists($repository->getMetadataPath())) { - throw new ArcanistUsageException( + $working_copy = ArcanistWorkingCopy::newFromWorkingDirectory($root); + + $repository_api = $working_copy->getRepositoryAPI(); + $is_git = ($repository_api instanceof ArcanistGitAPI); + + if (!$is_git) { + throw new PhutilArgumentUsageException( pht( - "%s must be in its git working copy to be automatically upgraded. ". - "This copy of %s (in '%s') is not in a git working copy.", - $lib, - $lib, + 'The "arc upgrade" workflow uses "git pull" to upgrade '. + 'Arcanist, but the "arcanist/" directory (in "%s") is not a Git '. + 'working copy. You must leave "arcanist/" as a Git '. + 'working copy to use "arc upgrade".', $root)); } - $this->setRepositoryAPI($repository); - // NOTE: Don't use requireCleanWorkingCopy() here because it tries to // amend changes and generally move the workflow forward. We just want to // abort if there are local changes and make the user sort things out. - $uncommitted = $repository->getUncommittedStatus(); + $uncommitted = $repository_api->getUncommittedStatus(); if ($uncommitted) { $message = pht( - 'You have uncommitted changes in the working copy for this '. - 'library:'); + 'You have uncommitted changes in the working copy ("%s") for this '. + 'library ("%s"):', + $root, + $library); $list = id(new PhutilConsoleList()) ->setWrap(false) @@ -69,31 +76,45 @@ EOTEXT id(new PhutilConsoleBlock()) ->addParagraph($message) ->addList($list) + ->addParagraph( + pht( + 'Discard these changes before running "arc upgrade".')) ->draw(); - throw new ArcanistUsageException( - pht('`arc upgrade` can only upgrade clean working copies.')); + throw new PhutilArgumentUsageException( + pht('"arc upgrade" can only upgrade clean working copies.')); } - $branch_name = $repository->getBranchName(); - if ($branch_name != 'master' && $branch_name != 'stable') { - throw new ArcanistUsageException( + $branch_name = $repository_api->getBranchName(); + if (!isset($supported_branches[$branch_name])) { + throw new PhutilArgumentUsageException( pht( - "%s must be on either branch '%s' or '%s' to be automatically ". - "upgraded. ". - "This copy of %s (in '%s') is on branch '%s'.", - $lib, - 'master', - 'stable', - $lib, + 'Library "%s" (in "%s") is on branch "%s", but this branch is '. + 'not supported for automatic upgrades. Supported branches are: '. + '%s.', + $library, $root, - $branch_name)); + $branch_name, + implode(', ', array_keys($supported_branches)))); } - chdir($root); + $log->writeStatus( + pht('UPGRADING'), + pht( + 'Upgrading "%s" (on branch "%s").', + $library, + $branch_name)); + + $command = csprintf( + 'git pull --rebase origin -- %R', + $branch_name); + + $future = (new PhutilExecPassthru($command)) + ->setCWD($root); try { - execx('git pull --rebase'); + $this->newCommand($future) + ->execute(); } catch (Exception $ex) { // If we failed, try to go back to the old state, then throw the // original exception. @@ -102,10 +123,10 @@ EOTEXT } } - echo phutil_console_format( - "**%s** %s\n", - pht('Updated!'), - pht('Your copy of arc is now up to date.')); + $log->writeSuccess( + pht('UPGRADED'), + pht('Your copy of Arcanist is now up to date.')); + return 0; } diff --git a/src/workflow/ArcanistUploadWorkflow.php b/src/workflow/ArcanistUploadWorkflow.php index a0582a69..e3506cb6 100644 --- a/src/workflow/ArcanistUploadWorkflow.php +++ b/src/workflow/ArcanistUploadWorkflow.php @@ -1,70 +1,56 @@ newWorkflowInformation() + ->setSynopsis(pht('Upload files.')) + ->addExample(pht('**upload** [__options__] -- __file__ [__file__ ...]')) + ->setHelp($help); } - public function getCommandHelp() { - return phutil_console_format(<< array( - 'help' => pht('Output upload information in JSON format.'), - ), - 'temporary' => array( - 'help' => pht( - 'Mark the file as temporary. Temporary files will be deleted '. - 'automatically after 24 hours.'), - ), - '*' => 'paths', + $this->newWorkflowArgument('json') + ->setHelp(pht('Output upload information in JSON format.')), + $this->newWorkflowArgument('temporary') + ->setHelp( + pht( + 'Mark the file as temporary. Temporary files will be '. + 'deleted after 24 hours.')), + $this->newWorkflowArgument('paths') + ->setWildcard(true) + ->setIsPathArgument(true), ); } - protected function didParseArguments() { + public function runWorkflow() { if (!$this->getArgument('paths')) { - throw new ArcanistUsageException( - pht('Specify one or more files to upload.')); + throw new PhutilArgumentUsageException( + pht('Specify one or more paths to files you want to upload.')); } - $this->paths = $this->getArgument('paths'); - $this->json = $this->getArgument('json'); - } - - public function requiresAuthentication() { - return true; - } - - public function run() { $is_temporary = $this->getArgument('temporary'); + $is_json = $this->getArgument('json'); + $paths = $this->getArgument('paths'); - $conduit = $this->getConduit(); + $conduit = $this->getConduitEngine(); $results = array(); $uploader = id(new ArcanistFileUploader()) - ->setConduitClient($conduit); + ->setConduitEngine($conduit); - foreach ($this->paths as $key => $path) { + foreach ($paths as $key => $path) { $file = id(new ArcanistFileDataRef()) ->setName(basename($path)) ->setPath($path); @@ -89,7 +75,7 @@ EOTEXT $phid = $file->getPHID(); $name = $file->getName(); - $info = $conduit->callMethodSynchronous( + $info = $conduit->resolveCall( 'file.info', array( 'phid' => $phid, @@ -97,14 +83,15 @@ EOTEXT $results[$path] = $info; - if (!$this->json) { + if (!$is_json) { $id = $info['id']; echo " F{$id} {$name}: ".$info['uri']."\n\n"; } } - if ($this->json) { - echo json_encode($results)."\n"; + if ($is_json) { + $output = id(new PhutilJSON())->encodeFormatted($results); + echo $output; } else { $this->writeStatus(pht('Done.')); } @@ -125,7 +112,7 @@ EOTEXT } $this->writeStatus(pht('Beginning chunked upload of large file...')); - $chunks = $conduit->callMethodSynchronous( + $chunks = $conduit->resolveCall( 'file.querychunks', array( 'filePHID' => $file_phid, @@ -182,7 +169,7 @@ EOTEXT 'fread()')); } - $conduit->callMethodSynchronous( + $conduit->resolveCall( 'file.uploadchunk', array( 'filePHID' => $file_phid, diff --git a/src/workflow/ArcanistVersionWorkflow.php b/src/workflow/ArcanistVersionWorkflow.php deleted file mode 100644 index 9c470fc6..00000000 --- a/src/workflow/ArcanistVersionWorkflow.php +++ /dev/null @@ -1,71 +0,0 @@ - dirname(phutil_get_library_root('arcanist')), - 'libphutil' => dirname(phutil_get_library_root('phutil')), - ); - - foreach ($roots as $lib => $root) { - $working_copy = ArcanistWorkingCopyIdentity::newFromPath($root); - $configuration_manager = clone $this->getConfigurationManager(); - $configuration_manager->setWorkingCopyIdentity($working_copy); - $repository = ArcanistRepositoryAPI::newAPIFromConfigurationManager( - $configuration_manager); - - if (!Filesystem::pathExists($repository->getMetadataPath())) { - throw new ArcanistUsageException( - pht('%s is not a git working copy.', $lib)); - } - - // NOTE: Carefully execute these commands in a way that works on Windows - // until T8298 is properly fixed. See PHI52. - - list($commit) = $repository->execxLocal('log -1 --format=%%H'); - $commit = trim($commit); - - list($timestamp) = $repository->execxLocal('log -1 --format=%%ct'); - $timestamp = trim($timestamp); - - $console->writeOut( - "%s %s (%s)\n", - $lib, - $commit, - date('j M Y', (int)$timestamp)); - } - } - -} diff --git a/src/workflow/ArcanistWeldWorkflow.php b/src/workflow/ArcanistWeldWorkflow.php index 7034db54..1826cd62 100644 --- a/src/workflow/ArcanistWeldWorkflow.php +++ b/src/workflow/ArcanistWeldWorkflow.php @@ -1,36 +1,37 @@ newWorkflowInformation() + ->setSynopsis(pht('Robustly fuse files together.')) + ->addExample('**weld** [options] -- __file__ __file__ ...') + ->setHelp($help); } - public function getCommandHelp() { - return phutil_console_format(<< 'files', + $this->newWorkflowArgument('files') + ->setWildcard(true), ); } - public function run() { + public function runWorkflow() { $files = $this->getArgument('files'); + if (count($files) < 2) { - throw new ArcanistUsageException( + throw new PhutilArgumentUsageException( pht('Specify two or more files to weld together.')); } @@ -86,8 +87,20 @@ EOTEXT $u = rtrim($u, "\r\n"); $v = rtrim($v, "\r\n"); - $u = phutil_utf8v_combined($u); - $v = phutil_utf8v_combined($v); + // If the inputs are UTF8, split glyphs (so two valid UTF8 inputs always + // produce a sensible, valid UTF8 output). If they aren't, split bytes. + + if (phutil_is_utf8($u)) { + $u = phutil_utf8v_combined($u); + } else { + $u = str_split($u); + } + + if (phutil_is_utf8($v)) { + $v = phutil_utf8v_combined($v); + } else { + $v = str_split($v); + } $len = max(count($u), count($v)); diff --git a/src/workflow/ArcanistWorkflow.php b/src/workflow/ArcanistWorkflow.php index ad78b243..93e3e1ff 100644 --- a/src/workflow/ArcanistWorkflow.php +++ b/src/workflow/ArcanistWorkflow.php @@ -45,7 +45,6 @@ abstract class ArcanistWorkflow extends Phobject { private $conduitURI; private $conduitCredentials; private $conduitAuthenticated; - private $forcedConduitVersion; private $conduitTimeout; private $userPHID; @@ -53,7 +52,6 @@ abstract class ArcanistWorkflow extends Phobject { private $repositoryAPI; private $configurationManager; private $arguments = array(); - private $passedArguments = array(); private $command; private $stashed; @@ -62,6 +60,7 @@ abstract class ArcanistWorkflow extends Phobject { private $projectInfo; private $repositoryInfo; private $repositoryReasons; + private $repositoryRef; private $arcanistConfiguration; private $parentWorkflow; @@ -69,12 +68,196 @@ abstract class ArcanistWorkflow extends Phobject { private $repositoryVersion; private $changeCache = array(); + private $conduitEngine; + private $toolset; + private $runtime; + private $configurationEngine; + private $configurationSourceList; + + private $promptMap; + + final public function setToolset(ArcanistToolset $toolset) { + $this->toolset = $toolset; + return $this; + } + + final public function getToolset() { + return $this->toolset; + } + + final public function setRuntime(ArcanistRuntime $runtime) { + $this->runtime = $runtime; + return $this; + } + + final public function getRuntime() { + return $this->runtime; + } + + final public function setConfigurationEngine( + ArcanistConfigurationEngine $engine) { + $this->configurationEngine = $engine; + return $this; + } + + final public function getConfigurationEngine() { + return $this->configurationEngine; + } + + final public function setConfigurationSourceList( + ArcanistConfigurationSourceList $list) { + $this->configurationSourceList = $list; + return $this; + } + + final public function getConfigurationSourceList() { + return $this->configurationSourceList; + } + + public function newPhutilWorkflow() { + $arguments = $this->getWorkflowArguments(); + assert_instances_of($arguments, 'ArcanistWorkflowArgument'); + + $specs = mpull($arguments, 'getPhutilSpecification'); + + $phutil_workflow = id(new ArcanistPhutilWorkflow()) + ->setName($this->getWorkflowName()) + ->setWorkflow($this) + ->setArguments($specs); + + $information = $this->getWorkflowInformation(); + + if ($information !== null) { + if (!($information instanceof ArcanistWorkflowInformation)) { + throw new Exception( + pht( + 'Expected workflow ("%s", of class "%s") to return an '. + '"ArcanistWorkflowInformation" object from call to '. + '"getWorkflowInformation()", got %s.', + $this->getWorkflowName(), + get_class($this), + phutil_describe_type($information))); + } + } + + if ($information) { + $synopsis = $information->getSynopsis(); + if (strlen($synopsis)) { + $phutil_workflow->setSynopsis($synopsis); + } + + $examples = $information->getExamples(); + if ($examples) { + $examples = implode("\n", $examples); + $phutil_workflow->setExamples($examples); + } + + $help = $information->getHelp(); + if (strlen($help)) { + // Unwrap linebreaks in the help text so we don't get weird formatting. + $help = preg_replace("/(?<=\S)\n(?=\S)/", ' ', $help); + + $phutil_workflow->setHelp($help); + } + } + + return $phutil_workflow; + } + + final public function newLegacyPhutilWorkflow() { + $phutil_workflow = id(new ArcanistPhutilWorkflow()) + ->setName($this->getWorkflowName()); + + $arguments = $this->getArguments(); + + $specs = array(); + foreach ($arguments as $key => $argument) { + if ($key == '*') { + $key = $argument; + $argument = array( + 'wildcard' => true, + ); + } + + unset($argument['paramtype']); + unset($argument['supports']); + unset($argument['nosupport']); + unset($argument['passthru']); + unset($argument['conflict']); + + $spec = array( + 'name' => $key, + ) + $argument; + + $specs[] = $spec; + } + + $phutil_workflow->setArguments($specs); + + $synopses = $this->getCommandSynopses(); + $phutil_workflow->setSynopsis($synopses); + + $help = $this->getCommandHelp(); + if (strlen($help)) { + $phutil_workflow->setHelp($help); + } + + return $phutil_workflow; + } + + final protected function newWorkflowArgument($key) { + return id(new ArcanistWorkflowArgument()) + ->setKey($key); + } + + final protected function newWorkflowInformation() { + return new ArcanistWorkflowInformation(); + } + + final public function executeWorkflow(PhutilArgumentParser $args) { + $runtime = $this->getRuntime(); + + $this->arguments = $args; + $caught = null; + + $runtime->pushWorkflow($this); + + try { + $err = $this->runWorkflow($args); + } catch (Exception $ex) { + $caught = $ex; + } + + try { + $this->runWorkflowCleanup(); + } catch (Exception $ex) { + phlog($ex); + } + + $runtime->popWorkflow(); + + if ($caught) { + throw $caught; + } + + return $err; + } + + final protected function getLogEngine() { + return $this->getRuntime()->getLogEngine(); + } + + protected function runWorkflowCleanup() { + // TOOLSETS: Do we need this? + return; + } public function __construct() {} - - abstract public function run(); + public function run() { + throw new PhutilMethodNotImplementedException(); + } /** * Finalizes any cleanup operations that need to occur regardless of @@ -97,14 +280,22 @@ abstract class ArcanistWorkflow extends Phobject { * * @return string 6-space indented list of available command synopses. */ - abstract public function getCommandSynopses(); + public function getCommandSynopses() { + return array(); + } /** * Return console formatted string with command help printed in `arc help`. * * @return string 10-space indented help to use the command. */ - abstract public function getCommandHelp(); + public function getCommandHelp() { + return null; + } + + public function supportsToolset(ArcanistToolset $toolset) { + return false; + } /* -( Conduit )------------------------------------------------------------ */ @@ -183,16 +374,20 @@ abstract class ArcanistWorkflow extends Phobject { $this->conduit->setTimeout($this->conduitTimeout); } - $user = $this->getConfigFromAnySource('http.basicauth.user'); - $pass = $this->getConfigFromAnySource('http.basicauth.pass'); - if ($user !== null && $pass !== null) { - $this->conduit->setBasicAuthCredentials($user, $pass); - } - return $this; } final public function getConfigFromAnySource($key) { + $source_list = $this->getConfigurationSourceList(); + if ($source_list) { + $value_list = $source_list->getStorageValueList($key); + if ($value_list) { + return last($value_list)->getValue(); + } + + return null; + } + return $this->configurationManager->getConfigFromAnySource($key); } @@ -227,24 +422,6 @@ abstract class ArcanistWorkflow extends Phobject { } - /** - * Force arc to identify with a specific Conduit version during the - * protocol handshake. This is primarily useful for development (especially - * for sending diffs which bump the client Conduit version), since the client - * still actually speaks the builtin version of the protocol. - * - * Controlled by the --conduit-version flag. - * - * @param int Version the client should pretend to be. - * @return this - * @task conduit - */ - final public function forceConduitVersion($version) { - $this->forcedConduitVersion = $version; - return $this; - } - - /** * Get the protocol version the client should identify with. * @@ -252,25 +429,7 @@ abstract class ArcanistWorkflow extends Phobject { * @task conduit */ final public function getConduitVersion() { - return nonempty($this->forcedConduitVersion, 6); - } - - - /** - * Override the default timeout for Conduit. - * - * Controlled by the --conduit-timeout flag. - * - * @param float Timeout, in seconds. - * @return this - * @task conduit - */ - final public function setConduitTimeout($timeout) { - $this->conduitTimeout = $timeout; - if ($this->conduit) { - $this->conduit->setConduitTimeout($timeout); - } - return $this; + return 6; } @@ -582,6 +741,7 @@ abstract class ArcanistWorkflow extends Phobject { $arc_config = $this->getArcanistConfiguration(); $workflow = $arc_config->buildWorkflow($command); $workflow->setParentWorkflow($this); + $workflow->setConduitEngine($this->getConduitEngine()); $workflow->setCommand($command); $workflow->setConfigurationManager($this->getConfigurationManager()); @@ -608,11 +768,12 @@ abstract class ArcanistWorkflow extends Phobject { } final public function getArgument($key, $default = null) { - return idx($this->arguments, $key, $default); - } + // TOOLSETS: Remove this legacy code. + if (is_array($this->arguments)) { + return idx($this->arguments, $key, $default); + } - final public function getPassedArguments() { - return $this->passedArguments; + return $this->arguments->getArg($key); } final public function getCompleteArgumentSpecification() { @@ -625,8 +786,6 @@ abstract class ArcanistWorkflow extends Phobject { } final public function parseArguments(array $args) { - $this->passedArguments = $args; - $spec = $this->getCompleteArgumentSpecification(); $dict = array(); @@ -771,6 +930,31 @@ abstract class ArcanistWorkflow extends Phobject { } final public function getWorkingCopy() { + $configuration_engine = $this->getConfigurationEngine(); + + // TOOLSETS: Remove this once all workflows are toolset workflows. + if (!$configuration_engine) { + throw new Exception( + pht( + 'This workflow has not yet been updated to Toolsets and can '. + 'not retrieve a modern WorkingCopy object. Use '. + '"getWorkingCopyIdentity()" to retrieve a previous-generation '. + 'object.')); + } + + return $configuration_engine->getWorkingCopy(); + } + + + final public function getWorkingCopyIdentity() { + $configuration_engine = $this->getConfigurationEngine(); + if ($configuration_engine) { + $working_copy = $configuration_engine->getWorkingCopy(); + $working_path = $working_copy->getWorkingDirectory(); + + return ArcanistWorkingCopyIdentity::newFromPath($working_path); + } + $working_copy = $this->getConfigurationManager()->getWorkingCopyIdentity(); if (!$working_copy) { $workflow = get_class($this); @@ -798,6 +982,12 @@ abstract class ArcanistWorkflow extends Phobject { } final public function getRepositoryAPI() { + $configuration_engine = $this->getConfigurationEngine(); + if ($configuration_engine) { + $working_copy = $configuration_engine->getWorkingCopy(); + return $working_copy->getRepositoryAPI(); + } + if (!$this->repositoryAPI) { $workflow = get_class($this); throw new Exception( @@ -1436,7 +1626,7 @@ abstract class ArcanistWorkflow extends Phobject { } if ($paths) { - $working_copy = $this->getWorkingCopy(); + $working_copy = $this->getWorkingCopyIdentity(); foreach ($paths as $key => $path) { $full_path = Filesystem::resolvePath($path); if (!Filesystem::pathExists($full_path)) { @@ -1618,9 +1808,9 @@ abstract class ArcanistWorkflow extends Phobject { return $parser; } - final protected function resolveCall(ConduitFuture $method, $timeout = null) { + final protected function resolveCall(ConduitFuture $method) { try { - return $method->resolve($timeout); + return $method->resolve(); } catch (ConduitClientException $ex) { if ($ex->getErrorCode() == 'ERR-CONDUIT-CALL') { echo phutil_console_wrap( @@ -1773,9 +1963,9 @@ abstract class ArcanistWorkflow extends Phobject { } try { - $results = $this->getConduit()->callMethodSynchronous( - 'repository.query', - $query); + $method = 'repository.query'; + $results = $this->getConduitEngine()->newCall($method, $query) + ->resolve(); } catch (ConduitClientException $ex) { if ($ex->getErrorCode() == 'ERR-CONDUIT-CALL') { $reasons[] = pht( @@ -1875,7 +2065,7 @@ abstract class ArcanistWorkflow extends Phobject { * @return ArcanistLintEngine Constructed engine. */ protected function newLintEngine($engine_class = null) { - $working_copy = $this->getWorkingCopy(); + $working_copy = $this->getWorkingCopyIdentity(); $config = $this->getConfigurationManager(); if (!$engine_class) { @@ -1926,7 +2116,7 @@ abstract class ArcanistWorkflow extends Phobject { * @return ArcanistUnitTestEngine Constructed engine. */ protected function newUnitTestEngine($engine_class = null) { - $working_copy = $this->getWorkingCopy(); + $working_copy = $this->getWorkingCopyIdentity(); $config = $this->getConfigurationManager(); if (!$engine_class) { @@ -1970,15 +2160,21 @@ abstract class ArcanistWorkflow extends Phobject { protected function openURIsInBrowser(array $uris) { $browser = $this->getBrowserCommand(); + + // The "browser" may actually be a list of arguments. + if (!is_array($browser)) { + $browser = array($browser); + } + foreach ($uris as $uri) { - $err = phutil_passthru('%s %s', $browser, $uri); + $err = phutil_passthru('%LR %R', $browser, $uri); if ($err) { throw new ArcanistUsageException( pht( - "Failed to open '%s' in browser ('%s'). ". - "Check your 'browser' config option.", + 'Failed to open URI "%s" in browser ("%s"). '. + 'Check your "browser" config option.', $uri, - $browser)); + implode(' ', $browser))); } } } @@ -1990,19 +2186,29 @@ abstract class ArcanistWorkflow extends Phobject { } if (phutil_is_windows()) { - return 'start'; + // See T13504. We now use "bypass_shell", so "start" alone is no longer + // a valid binary to invoke directly. + return array( + 'cmd', + '/c', + 'start', + ); } - $candidates = array('sensible-browser', 'xdg-open', 'open'); + $candidates = array( + 'sensible-browser' => array('sensible-browser'), + 'xdg-open' => array('xdg-open'), + 'open' => array('open', '--'), + ); // NOTE: The "open" command works well on OS X, but on many Linuxes "open" // exists and is not a browser. For now, we're just looking for other // commands first, but we might want to be smarter about selecting "open" // only on OS X. - foreach ($candidates as $cmd) { + foreach ($candidates as $cmd => $argv) { if (Filesystem::binaryExists($cmd)) { - return $cmd; + return $argv; } } @@ -2068,5 +2274,151 @@ abstract class ArcanistWorkflow extends Phobject { return $map; } + final public function setConduitEngine( + ArcanistConduitEngine $conduit_engine) { + $this->conduitEngine = $conduit_engine; + return $this; + } + + final public function getConduitEngine() { + return $this->conduitEngine; + } + + final public function getRepositoryRef() { + $configuration_engine = $this->getConfigurationEngine(); + if ($configuration_engine) { + // This is a toolset workflow and can always build a repository ref. + } else { + if (!$this->getConfigurationManager()->getWorkingCopyIdentity()) { + return null; + } + + if (!$this->repositoryAPI) { + return null; + } + } + + if (!$this->repositoryRef) { + $ref = id(new ArcanistRepositoryRef()) + ->setPHID($this->getRepositoryPHID()) + ->setBrowseURI($this->getRepositoryURI()); + + $this->repositoryRef = $ref; + } + + return $this->repositoryRef; + } + + final public function getToolsetKey() { + return $this->getToolset()->getToolsetKey(); + } + + final public function getConfig($key) { + return $this->getConfigurationSourceList()->getConfig($key); + } + + public function canHandleSignal($signo) { + return false; + } + + public function handleSignal($signo) { + return; + } + + final public function newCommand(PhutilExecutableFuture $future) { + return id(new ArcanistCommand()) + ->setLogEngine($this->getLogEngine()) + ->setExecutableFuture($future); + } + + final public function loadHardpoints( + $objects, + $requests) { + return $this->getRuntime()->loadHardpoints($objects, $requests); + } + + protected function newPrompts() { + return array(); + } + + protected function newPrompt($key) { + return id(new ArcanistPrompt()) + ->setWorkflow($this) + ->setKey($key); + } + + public function hasPrompt($key) { + $map = $this->getPromptMap(); + return isset($map[$key]); + } + + public function getPromptMap() { + if ($this->promptMap === null) { + $prompts = $this->newPrompts(); + assert_instances_of($prompts, 'ArcanistPrompt'); + + $map = array(); + foreach ($prompts as $prompt) { + $key = $prompt->getKey(); + + if (isset($map[$key])) { + throw new Exception( + pht( + 'Workflow ("%s") generates two prompts with the same '. + 'key ("%s"). Each prompt a workflow generates must have a '. + 'unique key.', + get_class($this), + $key)); + } + + $map[$key] = $prompt; + } + + $this->promptMap = $map; + } + + return $this->promptMap; + } + + protected function getPrompt($key) { + $map = $this->getPromptMap(); + + $prompt = idx($map, $key); + if (!$prompt) { + throw new Exception( + pht( + 'Workflow ("%s") is requesting a prompt ("%s") but it did not '. + 'generate any prompt with that name in "newPrompts()".', + get_class($this), + $key)); + } + + return clone $prompt; + } + + final protected function getSymbolEngine() { + return $this->getRuntime()->getSymbolEngine(); + } + + final protected function getViewer() { + return $this->getRuntime()->getViewer(); + } + + final protected function readStdin() { + $log = $this->getLogEngine(); + $log->writeWaitingForInput(); + + // NOTE: We can't just "file_get_contents()" here because signals don't + // interrupt it. If the user types "^C", we want to interrupt the read. + + $raw_handle = fopen('php://stdin', 'rb'); + $stdin = new PhutilSocketChannel($raw_handle); + + while ($stdin->update()) { + PhutilChannel::waitForAny(array($stdin)); + } + + return $stdin->read(); + } } diff --git a/src/workingcopy/ArcanistFilesystemWorkingCopy.php b/src/workingcopy/ArcanistFilesystemWorkingCopy.php new file mode 100644 index 00000000..9aff0376 --- /dev/null +++ b/src/workingcopy/ArcanistFilesystemWorkingCopy.php @@ -0,0 +1,27 @@ +getPath()); + } + + public function getProjectConfigurationFilePath() { + // We don't support project-level configuration for "filesytem" working + // copies because scattering random ".arcconfig" files around the + // filesystem and having them affect program behavior is silly. + return null; + } + +} diff --git a/src/workingcopy/ArcanistGitWorkingCopy.php b/src/workingcopy/ArcanistGitWorkingCopy.php new file mode 100644 index 00000000..b9ba667b --- /dev/null +++ b/src/workingcopy/ArcanistGitWorkingCopy.php @@ -0,0 +1,25 @@ +getPath('.git'); + } + + protected function newWorkingCopyFromDirectories( + $working_directory, + $ancestor_directory) { + + if (!Filesystem::pathExists($ancestor_directory.'/.git')) { + return null; + } + + return new self(); + } + + protected function newRepositoryAPI() { + return new ArcanistGitAPI($this->getPath()); + } + +} diff --git a/src/workingcopy/ArcanistMercurialWorkingCopy.php b/src/workingcopy/ArcanistMercurialWorkingCopy.php new file mode 100644 index 00000000..5c9bcde6 --- /dev/null +++ b/src/workingcopy/ArcanistMercurialWorkingCopy.php @@ -0,0 +1,25 @@ +getPath('.hg'); + } + + protected function newWorkingCopyFromDirectories( + $working_directory, + $ancestor_directory) { + + if (!Filesystem::pathExists($ancestor_directory.'/.hg')) { + return null; + } + + return new self(); + } + + protected function newRepositoryAPI() { + return new ArcanistMercurialAPI($this->getPath()); + } + +} diff --git a/src/workingcopy/ArcanistSubversionWorkingCopy.php b/src/workingcopy/ArcanistSubversionWorkingCopy.php new file mode 100644 index 00000000..e786c729 --- /dev/null +++ b/src/workingcopy/ArcanistSubversionWorkingCopy.php @@ -0,0 +1,77 @@ +getWorkingDirectory()); + $root = $this->getPath(); + foreach ($paths as $path) { + if (!Filesystem::isDescendant($path, $root)) { + break; + } + + $candidate = $path.'/.arcconfig'; + if (Filesystem::pathExists($candidate)) { + return $candidate; + } + } + + return parent::getProjectConfigurationFilePath(); + } + + public function getMetadataDirectory() { + return $this->getPath('.svn'); + } + + protected function newWorkingCopyFromDirectories( + $working_directory, + $ancestor_directory) { + + if (!Filesystem::pathExists($ancestor_directory.'/.svn')) { + return null; + } + + return new self(); + } + + protected function selectFromNestedWorkingCopies(array $candidates) { + // To select the best working copy in Subversion, we first walk up the + // tree looking for a working copy with an ".arcconfig" file. If we find + // one, this anchors us. + + foreach (array_reverse($candidates) as $candidate) { + $arcconfig = $candidate->getPath('.arcconfig'); + if (Filesystem::pathExists($arcconfig)) { + return $candidate; + } + } + + // If we didn't find one, we select the outermost working copy. This is + // because older versions of Subversion (prior to 1.7) put a ".svn" file + // in every directory, and all versions of Subversion allow you to check + // out any subdirectory of the project as a working copy. + + // We could possibly refine this by testing if the working copy was made + // with a recent version of Subversion and picking the deepest working copy + // if it was, similar to Git and Mercurial. + + return head($candidates); + } + + protected function newRepositoryAPI() { + return new ArcanistSubversionAPI($this->getPath()); + } + +} diff --git a/src/workingcopy/ArcanistWorkingCopy.php b/src/workingcopy/ArcanistWorkingCopy.php new file mode 100644 index 00000000..9473d8e6 --- /dev/null +++ b/src/workingcopy/ArcanistWorkingCopy.php @@ -0,0 +1,141 @@ +setAncestorClass(__CLASS__) + ->execute(); + + $paths = Filesystem::walkToRoot($path); + $paths = array_reverse($paths); + + $candidates = array(); + foreach ($paths as $path_key => $ancestor_path) { + foreach ($working_types as $working_type) { + + $working_copy = $working_type->newWorkingCopyFromDirectories( + $path, + $ancestor_path); + if (!$working_copy) { + continue; + } + + self::configureWorkingCopy($working_copy, $ancestor_path, $path); + + $candidates[] = $working_copy; + } + } + + // If we've found multiple candidate working copies, we need to pick one. + // We let the innermost working copy pick the best candidate from among + // candidates of the same type. The rules for Git and Mercurial differ + // slightly from the rules for Subversion. + + if ($candidates) { + $deepest = last($candidates); + + foreach ($candidates as $key => $candidate) { + if (get_class($candidate) != get_class($deepest)) { + unset($candidates[$key]); + } + } + $candidates = array_values($candidates); + + return $deepest->selectFromNestedWorkingCopies($candidates); + } + + // If we haven't found a legitimate working copy that belongs to a + // supported version control system, return a "filesystem" working copy. + // This allows some commands to work as expected even if run outside + // of a real working copy. + + $working_copy = new ArcanistFilesystemWorkingCopy(); + + self::configureWorkingCopy($working_copy, $path, $path); + + return $working_copy; + } + + abstract protected function newWorkingCopyFromDirectories( + $working_directory, + $ancestor_directory); + + final public function getPath($to_file = null) { + return Filesystem::concatenatePaths( + array( + $this->path, + $to_file, + )); + } + + final public function getWorkingDirectory() { + return $this->workingDirectory; + } + + public function getProjectConfigurationFilePath() { + return $this->getPath('.arcconfig'); + } + + public function getLocalConfigurationFilePath() { + if ($this->hasMetadataDirectory()) { + return $this->getMetadataPath('arc/config'); + } + + return null; + } + + public function getMetadataDirectory() { + return null; + } + + final public function hasMetadataDirectory() { + return ($this->getMetadataDirectory() !== null); + } + + final public function getMetadataPath($to_file = null) { + if (!$this->hasMetadataDirectory()) { + throw new Exception( + pht( + 'This working copy has no metadata directory, so you can not '. + 'resolve metadata paths within it.')); + } + + return Filesystem::concatenatePaths( + array( + $this->getMetadataDirectory(), + $to_file, + )); + } + + protected function selectFromNestedWorkingCopies(array $candidates) { + // Normally, the best working copy in a stack is the deepest working copy. + // Subversion uses slightly different rules. + return last($candidates); + } + + final public function getRepositoryAPI() { + if (!$this->repositoryAPI) { + $this->repositoryAPI = $this->newRepositoryAPI(); + } + + return $this->repositoryAPI; + } + + abstract protected function newRepositoryAPI(); + + private static function configureWorkingCopy( + ArcanistWorkingCopy $working_copy, + $ancestor_path, + $path) { + + $working_copy->path = $ancestor_path; + $working_copy->workingDirectory = $path; + } + +} diff --git a/src/workingcopy/ArcanistWorkingCopyPath.php b/src/workingcopy/ArcanistWorkingCopyPath.php new file mode 100644 index 00000000..5fcd1498 --- /dev/null +++ b/src/workingcopy/ArcanistWorkingCopyPath.php @@ -0,0 +1,129 @@ +path = $path; + return $this; + } + + public function getPath() { + return $this->path; + } + + public function setData($data) { + $this->data = $data; + return $this; + } + + public function getData() { + if ($this->data === null) { + throw new Exception( + pht( + 'No data provided for path "%s".', + $this->getDescription())); + } + + return $this->data; + } + + public function getDataAsLines() { + if ($this->dataAsLines === null) { + $lines = phutil_split_lines($this->getData()); + $this->dataAsLines = $lines; + } + + return $this->dataAsLines; + } + + public function setMode($mode) { + $this->mode = $mode; + return $this; + } + + public function getMode() { + if ($this->mode === null) { + throw new Exception( + pht( + 'No mode provided for path "%s".', + $this->getDescription())); + } + + return $this->mode; + } + + public function isExecutable() { + $mode = $this->getMode(); + return (bool)($mode & 0111); + } + + public function isBinary() { + if ($this->binary === null) { + $data = $this->getData(); + $is_binary = ArcanistDiffUtils::isHeuristicBinaryFile($data); + $this->binary = $is_binary; + } + + return $this->binary; + } + + public function getMimeType() { + if ($this->mimeType === null) { + // TOOLSETS: This is not terribly efficient on real repositories since + // it re-writes files which are often already on disk, but is good for + // unit tests. + + $tmp = new TempFile(); + Filesystem::writeFile($tmp, $this->getData()); + $mime = Filesystem::getMimeType($tmp); + + $this->mimeType = $mime; + } + + return $this->mimeType; + } + + + public function getBasename() { + return basename($this->getPath()); + } + + public function getLineAndCharFromOffset($offset) { + if ($this->charMap === null) { + $char_map = array(); + $line_map = array(); + + $lines = $this->getDataAsLines(); + + $line_number = 0; + $line_start = 0; + foreach ($lines as $line) { + $len = strlen($line); + $line_map[] = $line_start; + $line_start += $len; + for ($ii = 0; $ii < $len; $ii++) { + $char_map[] = $line_number; + } + $line_number++; + } + + $this->charMap = $char_map; + $this->lineMap = $line_map; + } + + $line = $this->charMap[$offset]; + $char = $offset - $this->lineMap[$line]; + + return array($line, $char); + } + +} diff --git a/src/xsprintf/ArcanistTerminalStringInterface.php b/src/xsprintf/ArcanistTerminalStringInterface.php new file mode 100644 index 00000000..37878ae9 --- /dev/null +++ b/src/xsprintf/ArcanistTerminalStringInterface.php @@ -0,0 +1,7 @@ +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) { + if ($mode === self::MODE_DEFAULT) { + if (phutil_is_windows()) { + $mode = self::MODE_WINDOWS; + } else { + $mode = self::MODE_LINUX; + } + } + + switch ($mode) { + case self::MODE_LINUX: + return self::escapeLinux($value); + case self::MODE_WINDOWS: + return self::escapeWindows($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.'"'; + } + + private static function escapeLinux($value) { + if (strpos($value, "\0") !== false) { + throw new Exception( + pht( + 'Command string argument includes a NULL byte. This byte can not '. + 'be safely escaped in command line arguments in Linux '. + 'environments.')); + } + + // If the argument is nonempty and contains only common printable + // characters, we do not need to escape it. This makes debugging + // workflows a little more user-friendly by making command output + // more readable. + if (preg_match('(^[a-zA-Z0-9:/@._+-]+\z)', $value)) { + return $value; + } + + return escapeshellarg($value); + } + + private static function escapeWindows($value) { + if (strpos($value, "\0") !== false) { + throw new Exception( + pht( + 'Command string argument includes a NULL byte. This byte can not '. + 'be safely escaped in command line arguments in Windows '. + 'environments.')); + } + + if (!phutil_is_utf8($value)) { + throw new Exception( + pht( + 'Command string argument includes text which is not valid UTF-8. '. + 'This library can not safely escape this sequence in command '. + 'line arguments in Windows environments.')); + } + + $has_backslash = (strpos($value, '\\') !== false); + $has_space = (strpos($value, ' ') !== false); + $has_quote = (strpos($value, '"') !== false); + $is_empty = (strlen($value) === 0); + + // If a backslash appears before another backslash, a double quote, or + // the end of the argument, we must escape it. Otherwise, we must leave + // it unescaped. + + if ($has_backslash) { + $value_v = preg_split('//', $value, -1, PREG_SPLIT_NO_EMPTY); + $len = count($value_v); + for ($ii = 0; $ii < $len; $ii++) { + if ($value_v[$ii] === '\\') { + if ($ii + 1 < $len) { + $next = $value_v[$ii + 1]; + } else { + $next = null; + } + + if ($next === '"' || $next === '\\' || $next === null) { + $value_v[$ii] = '\\\\'; + } + } + } + $value = implode('', $value_v); + } + + // Then, escape double quotes by prefixing them with backslashes. + if ($has_quote || $has_space || $has_backslash || $is_empty) { + $value = addcslashes($value, '"'); + $value = '"'.$value.'"'; + } + + return $value; + } + +} diff --git a/src/xsprintf/PhutilTerminalString.php b/src/xsprintf/PhutilTerminalString.php new file mode 100644 index 00000000..dddd5008 --- /dev/null +++ b/src/xsprintf/PhutilTerminalString.php @@ -0,0 +1,106 @@ +string = $string; + } + + public function __toString() { + return $this->string; + } + + public function applyWrap() { + $string = phutil_string_cast($this); + $string = phutil_console_wrap($string); + return new self($string); + } + + public function applyIndent($depth, $with_prefix = true) { + $string = phutil_string_cast($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 phutil_string_cast($value); + } + + if ($value instanceof ArcanistTerminalStringInterface) { + $value = $value->newTerminalString(); + return self::escapeStringValue($value, $allow_whitespace); + } + + if ($value === null) { + return ''; + } + + if (is_array($value)) { + if (!$value) { + return ''; + } + + $parts = array(); + + foreach ($value as $part) { + $part = self::escapeStringValue($part, $allow_whitespace); + $parts[] = $part; + } + + return implode('', $parts); + } + + $value = phutil_string_cast($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); + } + + // See T13209. If we print certain invalid unicode byte sequences to the + // terminal under "cmd.exe", the entire string is silently dropped. Avoid + // printing invalid sequences. + if (phutil_is_windows()) { + $value = phutil_utf8ize($value); + } + + return $value; + } +} diff --git a/src/xsprintf/__tests__/PhutilCsprintfTestCase.php b/src/xsprintf/__tests__/PhutilCsprintfTestCase.php new file mode 100644 index 00000000..b7cbc18b --- /dev/null +++ b/src/xsprintf/__tests__/PhutilCsprintfTestCase.php @@ -0,0 +1,107 @@ + 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()) { + // TOOLSETS: Restructure this. We must skip because tests fail if they + // do not make any assertions. + $this->assertSkipped( + pht( + 'This test can not currently run under Windows.')); + } + + $cmd = csprintf('%s', '#'); + $cmd->setEscapingMode(PhutilCommandString::MODE_DEFAULT); + + $this->assertEqual( + '\'#\'', + (string)$cmd); + } + + public function testPasswords() { + $bin = $this->getSupportExecutable('echo'); + + // Normal "%s" doesn't do anything special. + $command = csprintf('php -f %R -- %s', $bin, 'hunter2trustno1'); + $this->assertTrue(strpos($command, 'hunter2trustno1') !== false); + + // "%P" takes a PhutilOpaqueEnvelope. + $caught = null; + try { + csprintf('php -f %R -- %P', $bin, 'hunter2trustno1'); + } catch (Exception $ex) { + $caught = $ex; + } + $this->assertTrue($caught instanceof InvalidArgumentException); + + + // "%P" masks the provided value. + $command = csprintf( + 'php -f %R -- %P', + $bin, + 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 index 00000000..7babefba --- /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 index 00000000..34535d19 --- /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 index 00000000..96d6a772 --- /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 index 00000000..c12c51db --- /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 index 00000000..ead744a8 --- /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 index 00000000..c4c401d9 --- /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 index 00000000..58eb6c87 --- /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 index 00000000..05ac86f4 --- /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/tsprintf.php b/src/xsprintf/tsprintf.php new file mode 100644 index 00000000..aea1e7f4 --- /dev/null +++ b/src/xsprintf/tsprintf.php @@ -0,0 +1,64 @@ +** %s **', $value); + $value = PhutilTerminalString::escapeStringValue($value, false); + $type = 's'; + break; + case 'd': + $type = 'd'; + break; + default: + throw new Exception( + pht( + 'Unsupported escape sequence "%s" found in pattern: %s', + $type, + $pattern)); + break; + } + + $pattern[$pos] = $type; +} diff --git a/src/xsprintf/urisprintf.php b/src/xsprintf/urisprintf.php new file mode 100644 index 00000000..4a8d6f74 --- /dev/null +++ b/src/xsprintf/urisprintf.php @@ -0,0 +1,50 @@ += $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/scripts/breakout.py b/support/arcanoid/arcanoid.py similarity index 86% rename from scripts/breakout.py rename to support/arcanoid/arcanoid.py index c8c8b188..55d191a7 100755 --- a/scripts/breakout.py +++ b/support/arcanoid/arcanoid.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 import sys import time import select @@ -17,10 +17,10 @@ class Block: total = 0 def __init__(self, x, y, w, h, c): - self.x = x - self.y = y - self.w = w - self.h = h + self.x = int(round(x)) + self.y = int(round(y)) + self.w = int(round(w)) + self.h = int(round(h)) self.fmt = curses.A_BOLD | curses.color_pair(c) self.alive = True for i in range(self.x, self.x + self.w): @@ -48,8 +48,8 @@ class Ball: killed = 0 def __init__(self, x, y, vx, vy): - self.x = x - self.y = y + self.x = int(round(x)) + self.y = int(round(y)) self.vx = vx self.vy = vy Ball.alive = True @@ -58,6 +58,8 @@ class Ball: return True def encounter(self, dx, dy): + dx = int(round(dx)) + dy = int(round(dy)) ent = grid[self.y + dy + 1][self.x + dx + 1] if ent and not ent.collide(self): self.vx -= 2 * dx @@ -84,8 +86,8 @@ class Ball: class Ship: def __init__(self, x, y): - self.x = x - self.y = y + self.x = int(round(x)) + self.y = int(round(y)) self.hw = 10 self.v = 4 self.last = 1 @@ -141,11 +143,11 @@ def main(stdscr): height, width = stdscr.getmaxyx() - if height < 15 or width < 30: + if height < 15 or width < 32: raise PowerOverwhelmingException( - "Your computer is not powerful enough to run 'arc anoid'. " - "It must support at least 30 columns and 15 rows of next-gen " - "full-color 3D graphics.") + 'Your computer is not powerful enough to run "arc anoid". ' + 'It must support at least 32 columns and 15 rows of next-gen ' + 'full-color 3D graphics.') status = curses.newwin(1, width, 0, 0) height -= 1 @@ -164,7 +166,7 @@ def main(stdscr): colors = [ 1, 3, 2, 6, 4, 5 ] h = height / 10 - for x in range(1, width / 7 - 1): + for x in range(1, int(width / 7) - 1): for y in range(1, 7): entities.append(Block(x * 7, y * h + x / 2 % 2, @@ -194,7 +196,15 @@ def main(stdscr): status.addstr('%s/%s ' % (Block.killed, Block.total), curses.A_BOLD) status.addch(curses.ACS_VLINE) status.addstr(' DEATHS: ', curses.A_BOLD | curses.color_pair(4)) - status.addstr('%s ' % Ball.killed, curses.A_BOLD) + + # See T8693. At the minimum display size, we only have room to render + # two characters for the death count, so just display "99" if the + # player has more than 99 deaths. + display_deaths = Ball.killed + if (display_deaths > 99): + display_deaths = 99 + + status.addstr('%s ' % display_deaths, curses.A_BOLD) status.addch(curses.ACS_LTEE) if Block.killed == Block.total: diff --git a/support/init/init-arcanist.php b/support/init/init-arcanist.php new file mode 100644 index 00000000..c0a04568 --- /dev/null +++ b/support/init/init-arcanist.php @@ -0,0 +1,8 @@ +execute($argv); + +exit($err); diff --git a/support/init/init-script.php b/support/init/init-script.php new file mode 100644 index 00000000..a8c800f7 --- /dev/null +++ b/support/init/init-script.php @@ -0,0 +1,115 @@ + 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, + + // See T13296. On macOS under PHP 7.3.x, PCRE currently segfaults after + // "fork()" if "pcre.jit" is enabled. + 'pcre.jit' => 0, + ); + + foreach ($config_map as $config_key => $config_value) { + ini_set($config_key, $config_value); + } + + $php_version = phpversion(); + $min_version = '5.5.0'; + if (version_compare($php_version, $min_version, '<')) { + echo sprintf( + 'UPGRADE PHP: '. + 'The installed version of PHP ("%s") is too old to run Arcanist. '. + 'Update PHP to at least the minimum required version ("%s").', + $php_version, + $min_version); + echo "\n"; + + exit(1); + } + + 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); + } + + $root = dirname(dirname(dirname(__FILE__))); + require_once $root.'/src/init/init-library.php'; + + PhutilErrorHandler::initialize(); + + 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__(); diff --git a/support/lib/extract-symbols.php b/support/lib/extract-symbols.php new file mode 100755 index 00000000..7b9378b1 --- /dev/null +++ b/support/lib/extract-symbols.php @@ -0,0 +1,587 @@ +#!/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/symbol-information.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/support/lib/rebuild-map.php b/support/lib/rebuild-map.php new file mode 100755 index 00000000..66c1c8be --- /dev/null +++ b/support/lib/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 "--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/support/shell/hooks/bash-completion.sh b/support/shell/hooks/bash-completion.sh new file mode 100644 index 00000000..4d4888ea --- /dev/null +++ b/support/shell/hooks/bash-completion.sh @@ -0,0 +1,10 @@ +SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )" +GENERATED_RULES_FILE="${SCRIPTDIR}/../rules/bash-rules.sh" + +# Try to generate the shell completion rules if they do not yet exist. +if [ ! -f "${GENERATED_RULES_FILE}" ]; then + arc shell-complete --generate >/dev/null 2>/dev/null +fi; + +# Source the shell completion rules. +source "${GENERATED_RULES_FILE}" diff --git a/support/shell/rules/.keep b/support/shell/rules/.keep new file mode 100644 index 00000000..e69de29b diff --git a/support/shell/templates/bash-template.sh b/support/shell/templates/bash-template.sh new file mode 100644 index 00000000..e2e8047e --- /dev/null +++ b/support/shell/templates/bash-template.sh @@ -0,0 +1,22 @@ +_arcanist_complete_{{{BIN}}} () +{ + COMPREPLY=() + + RESULT=$(echo | {{{BIN}}} shell-complete \ + --current ${COMP_CWORD} \ + -- \ + "${COMP_WORDS[@]}" \ + 2>/dev/null) + + if [ $? -ne 0 ]; then + return $? + fi + + if [ "$RESULT" == "" ]; then + RESULT=$( compgen -A file -- ${COMP_WORDS[COMP_CWORD]} ) + fi + + local IFS=$'\n' + COMPREPLY=( $RESULT ) +} +complete -F _arcanist_complete_{{{BIN}}} -o filenames {{{BIN}}} diff --git a/support/unit/cat.php b/support/unit/cat.php new file mode 100755 index 00000000..4b5ef5c1 --- /dev/null +++ b/support/unit/cat.php @@ -0,0 +1,4 @@ +#!/usr/bin/env php + $arg) { + $args[$key] = addcslashes($arg, "\\\n"); +} +$args = implode("\n", $args); +echo $args; diff --git a/support/unit/exit.php b/support/unit/exit.php new file mode 100755 index 00000000..9983bd17 --- /dev/null +++ b/support/unit/exit.php @@ -0,0 +1,4 @@ +#!/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/support/unit/sleep.php b/support/unit/sleep.php new file mode 100755 index 00000000..fbdf4144 --- /dev/null +++ b/support/unit/sleep.php @@ -0,0 +1,20 @@ +\n"; + exit(1); +} + +// NOTE: Sleep for the requested duration even if our actual sleep() call is +// interrupted by a signal. + +$then = microtime(true) + (double)$argv[1]; +while (true) { + $now = microtime(true); + if ($now >= $then) { + break; + } + + $sleep = max(1, ($then - $now)); + usleep((int)($sleep * 1000000)); +} diff --git a/support/xhpast/Makefile b/support/xhpast/Makefile new file mode 100644 index 00000000..3686de3e --- /dev/null +++ b/support/xhpast/Makefile @@ -0,0 +1,78 @@ +BISONFLAGS = --verbose --name-prefix xhpast +CPPFLAGS = -fPIC -Wall +FLEXFLAGS = -CFr +XHPAST_VERSION := $(shell ./bin/xhpast-generate-version.php) + +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: bin/xhpast-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) -D XHPAST_VERSION='"$(XHPAST_VERSION)"' -o $@ $^ diff --git a/support/xhpast/README b/support/xhpast/README new file mode 100644 index 00000000..b2ec57e2 --- /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 index 00000000..f6920052 --- /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 index 00000000..e44a23ea --- /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/bin/xhpast-generate-nodes.php b/support/xhpast/bin/xhpast-generate-nodes.php new file mode 100755 index 00000000..baf43687 --- /dev/null +++ b/support/xhpast/bin/xhpast-generate-nodes.php @@ -0,0 +1,171 @@ +#!/usr/bin/env php + $value) { + $hpp .= "#define {$node} {$value}\n"; +} + + +Filesystem::writeFile($hpp_outpath, $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 +%pure-parser +%parse-param { void* yyscanner } +%parse-param { xhpast::Node** root } +%lex-param { void* yyscanner } +%error-verbose + +%left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE +%left ',' +%left T_LOGICAL_OR +%left T_LOGICAL_XOR +%left T_LOGICAL_AND +%right T_PRINT +%left '=' 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 '*' '/' '%' +%right '!' +%nonassoc T_INSTANCEOF +%right '~' 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 + '@' +%right '[' +%nonassoc T_NEW T_CLONE +%token T_EXIT +%token T_IF +%left T_ELSEIF +%left T_ELSE +%left 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 +%right T_STATIC T_ABSTRACT T_FINAL T_PRIVATE T_PROTECTED 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); + $$ = $1->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 { + NTYPE($1, n_UNPACK); + $$ = $1->appendChild($2); + } +| '&' 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($1); + } +; + + +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($1); + } +| non_empty_member_modifiers member_modifier { + $$ = $1->appendChild($2); + } +; + +member_modifier: + basic_member_modifier { + $$ = NTYPE($1, n_STRING); + } +; + +basic_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; + } +| T_NEW T_CLASS ctor_arguments extends_from implements_list + '{' class_statement_list '}' { + $$ = NNEW(n_CLASS_DECLARATION); + $$->appendChild(NNEW(n_EMPTY)); + $$->appendChild(NNEW(n_EMPTY)); + $$->appendChild($4); + $$->appendChild($5); + $$->appendChild(NEXPAND($6, $7, $8)); + NMORE($$, $8); + + NTYPE($1, n_NEW); + $1->appendChild($$); + $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.cpp b/support/xhpast/parser.yacc.cpp new file mode 100644 index 00000000..2540d6a8 --- /dev/null +++ b/support/xhpast/parser.yacc.cpp @@ -0,0 +1,7687 @@ +/* A Bison parser, made by GNU Bison 2.3. */ + +/* Skeleton implementation for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + 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 2, 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* 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 "2.3" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 1 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + +/* Substitute the variable and function names. */ +#define yyparse xhpastparse +#define yylex xhpastlex +#define yyerror xhpasterror +#define yylval xhpastlval +#define yychar xhpastchar +#define yydebug xhpastdebug +#define yynerrs xhpastnerrs + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + T_REQUIRE_ONCE = 258, + T_REQUIRE = 259, + T_EVAL = 260, + T_INCLUDE_ONCE = 261, + T_INCLUDE = 262, + T_LOGICAL_OR = 263, + T_LOGICAL_XOR = 264, + T_LOGICAL_AND = 265, + T_PRINT = 266, + T_SR_EQUAL = 267, + T_SL_EQUAL = 268, + T_XOR_EQUAL = 269, + T_OR_EQUAL = 270, + T_AND_EQUAL = 271, + T_MOD_EQUAL = 272, + T_CONCAT_EQUAL = 273, + T_DIV_EQUAL = 274, + T_MUL_EQUAL = 275, + T_MINUS_EQUAL = 276, + T_PLUS_EQUAL = 277, + T_COALESCE = 278, + T_BOOLEAN_OR = 279, + T_BOOLEAN_AND = 280, + T_SPACESHIP = 281, + T_IS_NOT_IDENTICAL = 282, + T_IS_IDENTICAL = 283, + T_IS_NOT_EQUAL = 284, + T_IS_EQUAL = 285, + T_IS_GREATER_OR_EQUAL = 286, + T_IS_SMALLER_OR_EQUAL = 287, + T_SR = 288, + T_SL = 289, + T_INSTANCEOF = 290, + T_UNSET_CAST = 291, + T_BOOL_CAST = 292, + T_OBJECT_CAST = 293, + T_ARRAY_CAST = 294, + T_BINARY_CAST = 295, + T_UNICODE_CAST = 296, + T_STRING_CAST = 297, + T_DOUBLE_CAST = 298, + T_INT_CAST = 299, + T_DEC = 300, + T_INC = 301, + T_CLONE = 302, + T_NEW = 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_PUBLIC = 347, + T_PROTECTED = 348, + T_PRIVATE = 349, + T_FINAL = 350, + T_ABSTRACT = 351, + T_STATIC = 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 +/* Tokens. */ +#define T_REQUIRE_ONCE 258 +#define T_REQUIRE 259 +#define T_EVAL 260 +#define T_INCLUDE_ONCE 261 +#define T_INCLUDE 262 +#define T_LOGICAL_OR 263 +#define T_LOGICAL_XOR 264 +#define T_LOGICAL_AND 265 +#define T_PRINT 266 +#define T_SR_EQUAL 267 +#define T_SL_EQUAL 268 +#define T_XOR_EQUAL 269 +#define T_OR_EQUAL 270 +#define T_AND_EQUAL 271 +#define T_MOD_EQUAL 272 +#define T_CONCAT_EQUAL 273 +#define T_DIV_EQUAL 274 +#define T_MUL_EQUAL 275 +#define T_MINUS_EQUAL 276 +#define T_PLUS_EQUAL 277 +#define T_COALESCE 278 +#define T_BOOLEAN_OR 279 +#define T_BOOLEAN_AND 280 +#define T_SPACESHIP 281 +#define T_IS_NOT_IDENTICAL 282 +#define T_IS_IDENTICAL 283 +#define T_IS_NOT_EQUAL 284 +#define T_IS_EQUAL 285 +#define T_IS_GREATER_OR_EQUAL 286 +#define T_IS_SMALLER_OR_EQUAL 287 +#define T_SR 288 +#define T_SL 289 +#define T_INSTANCEOF 290 +#define T_UNSET_CAST 291 +#define T_BOOL_CAST 292 +#define T_OBJECT_CAST 293 +#define T_ARRAY_CAST 294 +#define T_BINARY_CAST 295 +#define T_UNICODE_CAST 296 +#define T_STRING_CAST 297 +#define T_DOUBLE_CAST 298 +#define T_INT_CAST 299 +#define T_DEC 300 +#define T_INC 301 +#define T_CLONE 302 +#define T_NEW 303 +#define T_EXIT 304 +#define T_IF 305 +#define T_ELSEIF 306 +#define T_ELSE 307 +#define T_ENDIF 308 +#define T_LNUMBER 309 +#define T_DNUMBER 310 +#define T_STRING 311 +#define T_STRING_VARNAME 312 +#define T_VARIABLE 313 +#define T_NUM_STRING 314 +#define T_INLINE_HTML 315 +#define T_CHARACTER 316 +#define T_BAD_CHARACTER 317 +#define T_ENCAPSED_AND_WHITESPACE 318 +#define T_CONSTANT_ENCAPSED_STRING 319 +#define T_BACKTICKS_EXPR 320 +#define T_ECHO 321 +#define T_DO 322 +#define T_WHILE 323 +#define T_ENDWHILE 324 +#define T_FOR 325 +#define T_ENDFOR 326 +#define T_FOREACH 327 +#define T_ENDFOREACH 328 +#define T_DECLARE 329 +#define T_ENDDECLARE 330 +#define T_AS 331 +#define T_SWITCH 332 +#define T_ENDSWITCH 333 +#define T_CASE 334 +#define T_DEFAULT 335 +#define T_BREAK 336 +#define T_CONTINUE 337 +#define T_GOTO 338 +#define T_FUNCTION 339 +#define T_CONST 340 +#define T_RETURN 341 +#define T_TRY 342 +#define T_CATCH 343 +#define T_THROW 344 +#define T_USE 345 +#define T_GLOBAL 346 +#define T_PUBLIC 347 +#define T_PROTECTED 348 +#define T_PRIVATE 349 +#define T_FINAL 350 +#define T_ABSTRACT 351 +#define T_STATIC 352 +#define T_VAR 353 +#define T_UNSET 354 +#define T_ISSET 355 +#define T_EMPTY 356 +#define T_HALT_COMPILER 357 +#define T_CLASS 358 +#define T_INTERFACE 359 +#define T_EXTENDS 360 +#define T_IMPLEMENTS 361 +#define T_OBJECT_OPERATOR 362 +#define T_DOUBLE_ARROW 363 +#define T_LIST 364 +#define T_ARRAY 365 +#define T_CLASS_C 366 +#define T_METHOD_C 367 +#define T_FUNC_C 368 +#define T_LINE 369 +#define T_FILE 370 +#define T_COMMENT 371 +#define T_DOC_COMMENT 372 +#define T_OPEN_TAG 373 +#define T_OPEN_TAG_WITH_ECHO 374 +#define T_OPEN_TAG_FAKE 375 +#define T_CLOSE_TAG 376 +#define T_WHITESPACE 377 +#define T_START_HEREDOC 378 +#define T_END_HEREDOC 379 +#define T_HEREDOC 380 +#define T_DOLLAR_OPEN_CURLY_BRACES 381 +#define T_CURLY_OPEN 382 +#define T_PAAMAYIM_NEKUDOTAYIM 383 +#define T_BINARY_DOUBLE 384 +#define T_BINARY_HEREDOC 385 +#define T_NAMESPACE 386 +#define T_NS_C 387 +#define T_DIR 388 +#define T_NS_SEPARATOR 389 +#define T_INSTEADOF 390 +#define T_CALLABLE 391 +#define T_TRAIT 392 +#define T_TRAIT_C 393 +#define T_YIELD 394 +#define T_FINALLY 395 +#define T_ELLIPSIS 396 + + + + +/* Copy the first part of user declarations. */ +#line 1 "parser.y" + +/* + * 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" + +#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; +} + + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 1 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef int YYSTYPE; +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 216 of yacc.c. */ +#line 451 "parser.yacc.cpp" + +#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; +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +typedef signed char yytype_int8; +#else +typedef short int 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 && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# 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 + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(e) ((void) (e)) +#else +# define YYUSE(e) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(n) (n) +#else +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int i) +#else +static int +YYID (i) + int i; +#endif +{ + return i; +} +#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 _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (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 _STDLIB_H \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +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; + YYSTYPE yyvs; + }; + +/* 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) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif + +/* 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) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 3 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 7580 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 168 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 136 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 444 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 916 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 396 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +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, 39, 25, 53, 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, 40, 41, 42, 43, + 51, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 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 +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint16 yyprhs[] = +{ + 0, 0, 3, 5, 8, 9, 11, 15, 17, 19, + 21, 26, 30, 36, 41, 45, 48, 52, 54, 56, + 60, 63, 68, 74, 79, 82, 83, 85, 87, 89, + 94, 96, 99, 101, 103, 105, 109, 117, 128, 134, + 142, 152, 158, 161, 165, 168, 172, 175, 179, 183, + 187, 191, 195, 197, 200, 203, 209, 218, 227, 233, + 235, 242, 248, 252, 256, 259, 261, 270, 271, 273, + 278, 280, 284, 286, 288, 290, 291, 293, 304, 312, + 319, 321, 324, 327, 329, 330, 333, 335, 336, 339, + 340, 343, 345, 349, 350, 353, 355, 358, 360, 365, + 367, 372, 374, 379, 383, 389, 393, 398, 403, 409, + 410, 416, 421, 423, 425, 427, 432, 433, 440, 441, + 449, 450, 453, 454, 458, 460, 461, 464, 468, 474, + 479, 484, 490, 498, 505, 508, 510, 511, 513, 516, + 518, 520, 522, 523, 526, 528, 529, 531, 535, 537, + 540, 543, 547, 549, 551, 554, 559, 563, 569, 571, + 575, 578, 579, 583, 586, 588, 589, 600, 604, 606, + 610, 612, 616, 617, 619, 621, 624, 627, 630, 634, + 636, 640, 642, 644, 648, 653, 657, 658, 660, 662, + 666, 668, 670, 671, 673, 675, 678, 680, 682, 684, + 686, 688, 690, 692, 696, 702, 704, 708, 714, 719, + 723, 725, 726, 728, 732, 734, 741, 745, 750, 757, + 760, 764, 768, 772, 776, 780, 784, 788, 792, 796, + 800, 804, 807, 810, 813, 816, 820, 824, 828, 832, + 836, 840, 844, 848, 852, 856, 860, 864, 868, 872, + 876, 880, 883, 886, 889, 892, 896, 900, 904, 908, + 912, 916, 920, 924, 928, 932, 934, 936, 942, 947, + 951, 953, 956, 959, 962, 965, 968, 971, 974, 977, + 980, 982, 984, 986, 988, 991, 993, 1004, 1016, 1019, + 1022, 1027, 1032, 1034, 1035, 1040, 1044, 1049, 1051, 1054, + 1059, 1066, 1072, 1079, 1086, 1093, 1100, 1105, 1107, 1109, + 1113, 1116, 1118, 1122, 1125, 1127, 1129, 1134, 1136, 1139, + 1140, 1143, 1144, 1147, 1151, 1152, 1156, 1158, 1160, 1162, + 1164, 1166, 1168, 1170, 1172, 1174, 1176, 1178, 1180, 1182, + 1184, 1188, 1191, 1194, 1197, 1202, 1206, 1208, 1212, 1214, + 1216, 1218, 1222, 1225, 1227, 1228, 1231, 1232, 1234, 1240, + 1244, 1248, 1250, 1252, 1254, 1256, 1258, 1260, 1266, 1268, + 1271, 1272, 1276, 1281, 1286, 1290, 1292, 1294, 1295, 1297, + 1300, 1304, 1308, 1310, 1315, 1320, 1322, 1324, 1326, 1328, + 1332, 1335, 1337, 1342, 1347, 1349, 1351, 1356, 1357, 1359, + 1361, 1363, 1368, 1373, 1375, 1377, 1381, 1383, 1386, 1390, + 1392, 1394, 1399, 1400, 1401, 1404, 1410, 1414, 1418, 1420, + 1427, 1432, 1437, 1440, 1445, 1450, 1453, 1456, 1461, 1464, + 1467, 1469, 1473, 1477, 1481, 1486, 1491, 1496, 1501, 1506, + 1511, 1515, 1519, 1528, 1532 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int16 yyrhs[] = +{ + 169, 0, -1, 170, -1, 170, 172, -1, -1, 75, + -1, 171, 153, 75, -1, 178, -1, 186, -1, 187, + -1, 121, 161, 162, 163, -1, 150, 171, 163, -1, + 150, 171, 164, 170, 165, -1, 150, 164, 170, 165, + -1, 109, 173, 163, -1, 175, 163, -1, 173, 8, + 174, -1, 174, -1, 171, -1, 171, 95, 75, -1, + 153, 171, -1, 153, 171, 95, 75, -1, 175, 8, + 75, 13, 264, -1, 104, 75, 13, 264, -1, 176, + 177, -1, -1, 178, -1, 186, -1, 187, -1, 121, + 161, 162, 163, -1, 179, -1, 75, 26, -1, 137, + -1, 138, -1, 140, -1, 164, 176, 165, -1, 69, + 161, 270, 162, 178, 207, 209, -1, 69, 161, 270, + 162, 26, 176, 208, 210, 72, 163, -1, 87, 161, + 270, 162, 206, -1, 86, 178, 87, 161, 270, 162, + 163, -1, 89, 161, 247, 163, 247, 163, 247, 162, + 199, -1, 96, 161, 270, 162, 203, -1, 100, 163, + -1, 100, 270, 163, -1, 101, 163, -1, 101, 270, + 163, -1, 105, 163, -1, 105, 249, 163, -1, 105, + 274, 163, -1, 110, 220, 163, -1, 116, 222, 163, + -1, 85, 246, 163, -1, 79, -1, 270, 163, -1, + 250, 163, -1, 118, 161, 184, 162, 163, -1, 91, + 161, 274, 95, 198, 197, 162, 200, -1, 91, 161, + 249, 95, 274, 197, 162, 200, -1, 93, 161, 202, + 162, 201, -1, 163, -1, 106, 164, 176, 165, 180, + 182, -1, 106, 164, 176, 165, 183, -1, 108, 270, + 163, -1, 102, 75, 163, -1, 180, 181, -1, 181, + -1, 107, 161, 256, 77, 162, 164, 176, 165, -1, + -1, 183, -1, 159, 164, 176, 165, -1, 185, -1, + 184, 8, 185, -1, 274, -1, 189, -1, 190, -1, + -1, 32, -1, 251, 188, 75, 161, 211, 162, 216, + 164, 176, 165, -1, 191, 75, 192, 195, 164, 223, + 165, -1, 193, 75, 194, 164, 223, 165, -1, 122, + -1, 115, 122, -1, 114, 122, -1, 156, -1, -1, + 124, 256, -1, 123, -1, -1, 124, 196, -1, -1, + 125, 196, -1, 256, -1, 196, 8, 256, -1, -1, + 127, 198, -1, 274, -1, 32, 274, -1, 178, -1, + 26, 176, 90, 163, -1, 178, -1, 26, 176, 92, + 163, -1, 178, -1, 26, 176, 94, 163, -1, 75, + 13, 264, -1, 202, 8, 75, 13, 264, -1, 164, + 204, 165, -1, 164, 163, 204, 165, -1, 26, 204, + 97, 163, -1, 26, 163, 204, 97, 163, -1, -1, + 204, 98, 270, 205, 176, -1, 204, 99, 205, 176, + -1, 26, -1, 163, -1, 178, -1, 26, 176, 88, + 163, -1, -1, 207, 70, 161, 270, 162, 178, -1, + -1, 208, 70, 161, 270, 162, 26, 176, -1, -1, + 71, 178, -1, -1, 71, 26, 176, -1, 212, -1, + -1, 214, 213, -1, 214, 32, 213, -1, 214, 32, + 213, 13, 264, -1, 214, 213, 13, 264, -1, 212, + 8, 214, 213, -1, 212, 8, 214, 32, 213, -1, + 212, 8, 214, 32, 213, 13, 264, -1, 212, 8, + 214, 213, 13, 264, -1, 160, 77, -1, 77, -1, + -1, 215, -1, 25, 215, -1, 256, -1, 129, -1, + 155, -1, -1, 26, 214, -1, 218, -1, -1, 219, + -1, 218, 8, 219, -1, 270, -1, 160, 270, -1, + 32, 272, -1, 220, 8, 221, -1, 221, -1, 77, + -1, 166, 271, -1, 166, 164, 270, 165, -1, 222, + 8, 77, -1, 222, 8, 77, 13, 264, -1, 77, + -1, 77, 13, 264, -1, 223, 224, -1, -1, 239, + 244, 163, -1, 245, 163, -1, 226, -1, -1, 240, + 251, 225, 188, 75, 161, 211, 162, 216, 238, -1, + 109, 227, 228, -1, 256, -1, 227, 8, 256, -1, + 163, -1, 164, 229, 165, -1, -1, 230, -1, 231, + -1, 230, 231, -1, 232, 163, -1, 236, 163, -1, + 235, 154, 233, -1, 256, -1, 233, 8, 256, -1, + 75, -1, 235, -1, 256, 147, 75, -1, 234, 95, + 237, 75, -1, 234, 95, 242, -1, -1, 242, -1, + 163, -1, 164, 176, 165, -1, 241, -1, 117, -1, + -1, 241, -1, 242, -1, 241, 242, -1, 243, -1, + 111, -1, 112, -1, 113, -1, 116, -1, 115, -1, + 114, -1, 244, 8, 77, -1, 244, 8, 77, 13, + 264, -1, 77, -1, 77, 13, 264, -1, 245, 8, + 75, 13, 264, -1, 104, 75, 13, 264, -1, 246, + 8, 270, -1, 270, -1, -1, 248, -1, 248, 8, + 270, -1, 270, -1, 128, 161, 293, 162, 13, 270, + -1, 274, 13, 270, -1, 274, 13, 32, 274, -1, + 274, 13, 32, 67, 257, 262, -1, 66, 270, -1, + 274, 24, 270, -1, 274, 23, 270, -1, 274, 22, + 270, -1, 274, 21, 270, -1, 274, 20, 270, -1, + 274, 19, 270, -1, 274, 18, 270, -1, 274, 17, + 270, -1, 274, 16, 270, -1, 274, 15, 270, -1, + 274, 14, 270, -1, 273, 64, -1, 64, 273, -1, + 273, 63, -1, 63, 273, -1, 270, 28, 270, -1, + 270, 29, 270, -1, 270, 9, 270, -1, 270, 11, + 270, -1, 270, 10, 270, -1, 270, 30, 270, -1, + 270, 32, 270, -1, 270, 31, 270, -1, 270, 46, + 270, -1, 270, 44, 270, -1, 270, 45, 270, -1, + 270, 47, 270, -1, 270, 48, 270, -1, 270, 49, + 270, -1, 270, 43, 270, -1, 270, 42, 270, -1, + 44, 270, -1, 45, 270, -1, 50, 270, -1, 52, + 270, -1, 270, 35, 270, -1, 270, 34, 270, -1, + 270, 37, 270, -1, 270, 36, 270, -1, 270, 38, + 270, -1, 270, 41, 270, -1, 270, 39, 270, -1, + 270, 40, 270, -1, 270, 33, 270, -1, 270, 51, + 257, -1, 299, -1, 302, -1, 270, 25, 270, 26, + 270, -1, 270, 25, 26, 270, -1, 270, 27, 270, + -1, 297, -1, 62, 270, -1, 61, 270, -1, 60, + 270, -1, 57, 270, -1, 56, 270, -1, 55, 270, + -1, 54, 270, -1, 68, 261, -1, 53, 270, -1, + 84, -1, 266, -1, 300, -1, 301, -1, 12, 270, + -1, 158, -1, 251, 188, 161, 211, 162, 252, 216, + 164, 176, 165, -1, 116, 251, 188, 161, 211, 162, + 252, 216, 164, 176, 165, -1, 158, 249, -1, 158, + 274, -1, 158, 270, 127, 249, -1, 158, 270, 127, + 274, -1, 103, -1, -1, 109, 161, 253, 162, -1, + 253, 8, 77, -1, 253, 8, 32, 77, -1, 77, + -1, 32, 77, -1, 171, 161, 217, 162, -1, 150, + 153, 171, 161, 217, 162, -1, 153, 171, 161, 217, + 162, -1, 255, 147, 75, 161, 217, 162, -1, 282, + 147, 75, 161, 217, 162, -1, 282, 147, 280, 161, + 217, 162, -1, 255, 147, 280, 161, 217, 162, -1, + 280, 161, 217, 162, -1, 116, -1, 171, -1, 150, + 153, 171, -1, 153, 171, -1, 171, -1, 150, 153, + 171, -1, 153, 171, -1, 255, -1, 258, -1, 285, + 126, 289, 259, -1, 285, -1, 259, 260, -1, -1, + 126, 289, -1, -1, 161, 162, -1, 161, 270, 162, + -1, -1, 161, 217, 162, -1, 73, -1, 74, -1, + 83, -1, 133, -1, 134, -1, 152, -1, 130, -1, + 131, -1, 157, -1, 132, -1, 151, -1, 144, -1, + 263, -1, 171, -1, 150, 153, 171, -1, 153, 171, + -1, 44, 264, -1, 45, 264, -1, 129, 161, 267, + 162, -1, 65, 267, 167, -1, 265, -1, 255, 147, + 75, -1, 76, -1, 303, -1, 171, -1, 150, 153, + 171, -1, 153, 171, -1, 263, -1, -1, 269, 268, + -1, -1, 8, -1, 269, 8, 264, 127, 264, -1, + 269, 8, 264, -1, 264, 127, 264, -1, 264, -1, + 271, -1, 249, -1, 274, -1, 274, -1, 274, -1, + 284, 126, 289, 279, 275, -1, 284, -1, 275, 276, + -1, -1, 126, 289, 279, -1, 277, 65, 288, 167, + -1, 278, 65, 288, 167, -1, 161, 217, 162, -1, + 278, -1, 277, -1, -1, 286, -1, 292, 286, -1, + 255, 147, 280, -1, 282, 147, 280, -1, 286, -1, + 283, 65, 288, 167, -1, 254, 65, 288, 167, -1, + 285, -1, 283, -1, 254, -1, 286, -1, 161, 302, + 162, -1, 292, 286, -1, 281, -1, 286, 65, 288, + 167, -1, 286, 164, 270, 165, -1, 287, -1, 77, + -1, 166, 164, 270, 165, -1, -1, 270, -1, 290, + -1, 280, -1, 290, 65, 288, 167, -1, 290, 164, + 270, 165, -1, 291, -1, 75, -1, 164, 270, 165, + -1, 166, -1, 292, 166, -1, 293, 8, 294, -1, + 294, -1, 274, -1, 128, 161, 293, 162, -1, -1, + -1, 296, 268, -1, 296, 8, 270, 127, 270, -1, + 296, 8, 270, -1, 270, 127, 270, -1, 270, -1, + 296, 8, 270, 127, 32, 272, -1, 296, 8, 32, + 272, -1, 270, 127, 32, 272, -1, 32, 272, -1, + 119, 161, 298, 162, -1, 120, 161, 274, 162, -1, + 7, 270, -1, 6, 270, -1, 5, 161, 270, 162, + -1, 4, 270, -1, 3, 270, -1, 274, -1, 298, + 8, 274, -1, 161, 270, 162, -1, 161, 250, 162, + -1, 301, 65, 288, 167, -1, 300, 65, 288, 167, + -1, 83, 65, 288, 167, -1, 303, 65, 288, 167, + -1, 75, 65, 288, 167, -1, 129, 161, 295, 162, + -1, 65, 295, 167, -1, 67, 257, 262, -1, 67, + 122, 262, 192, 195, 164, 223, 165, -1, 255, 147, + 75, -1, 282, 147, 75, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint16 yyrline[] = +{ + 0, 207, 207, 213, 216, 222, 225, 231, 232, 233, + 234, 239, 246, 252, 260, 265, 272, 275, 282, 287, + 293, 299, 309, 316, 326, 329, 335, 336, 337, 338, + 346, 347, 353, 356, 359, 365, 368, 398, 417, 424, + 432, 445, 452, 459, 466, 473, 480, 487, 494, 501, + 506, 511, 516, 520, 524, 528, 534, 552, 569, 575, + 579, 588, 597, 605, 616, 620, 626, 638, 641, 645, + 654, 658, 665, 669, 673, 677, 680, 686, 702, 714, + 729, 733, 740, 747, 754, 757, 763, 767, 770, 778, + 781, 789, 792, 798, 801, 807, 808, 816, 817, 825, + 826, 834, 835, 843, 849, 860, 863, 873, 878, 890, + 893, 901, 911, 912, 916, 917, 925, 928, 938, 941, + 951, 954, 962, 965, 973, 974, 980, 988, 997, 1006, + 1014, 1022, 1031, 1041, 1053, 1057, 1063, 1066, 1067, 1074, + 1077, 1080, 1086, 1089, 1096, 1097, 1103, 1106, 1112, 1113, + 1117, 1124, 1128, 1135, 1138, 1142, 1149, 1157, 1165, 1173, + 1184, 1187, 1193, 1201, 1205, 1208, 1208, 1226, 1234, 1237, + 1243, 1246, 1252, 1255, 1261, 1265, 1272, 1275, 1281, 1289, + 1293, 1300, 1304, 1310, 1318, 1324, 1333, 1336, 1344, 1347, + 1353, 1354, 1361, 1364, 1371, 1375, 1381, 1387, 1388, 1389, + 1390, 1391, 1392, 1396, 1403, 1410, 1417, 1427, 1436, 1448, + 1451, 1458, 1461, 1466, 1469, 1476, 1484, 1490, 1500, 1514, + 1519, 1525, 1531, 1537, 1543, 1549, 1555, 1561, 1567, 1573, + 1579, 1585, 1590, 1595, 1600, 1605, 1611, 1617, 1623, 1629, + 1635, 1641, 1647, 1653, 1679, 1685, 1691, 1697, 1703, 1709, + 1715, 1721, 1726, 1731, 1736, 1741, 1747, 1753, 1759, 1765, + 1771, 1777, 1783, 1789, 1795, 1801, 1802, 1803, 1811, 1819, + 1825, 1826, 1831, 1836, 1841, 1846, 1851, 1856, 1861, 1866, + 1871, 1875, 1876, 1877, 1878, 1883, 1889, 1904, 1928, 1934, + 1940, 1946, 1955, 1959, 1962, 1970, 1973, 1978, 1982, 1991, + 1996, 2003, 2009, 2018, 2027, 2036, 2045, 2053, 2056, 2059, + 2063, 2070, 2073, 2077, 2084, 2085, 2089, 2104, 2108, 2111, + 2117, 2123, 2126, 2130, 2138, 2141, 2147, 2150, 2153, 2156, + 2159, 2162, 2165, 2168, 2171, 2174, 2177, 2180, 2186, 2187, + 2188, 2192, 2196, 2201, 2206, 2211, 2216, 2220, 2228, 2229, + 2230, 2231, 2234, 2237, 2241, 2244, 2250, 2253, 2257, 2268, + 2275, 2282, 2292, 2293, 2297, 2301, 2305, 2309, 2335, 2339, + 2342, 2348, 2358, 2364, 2373, 2379, 2380, 2381, 2387, 2388, + 2403, 2408, 2416, 2420, 2426, 2435, 2436, 2437, 2441, 2442, + 2445, 2457, 2461, 2467, 2473, 2477, 2480, 2488, 2491, 2497, + 2498, 2502, 2508, 2514, 2518, 2522, 2528, 2531, 2546, 2549, + 2556, 2557, 2561, 2567, 2570, 2576, 2583, 2590, 2597, 2604, + 2611, 2618, 2625, 2635, 2645, 2655, 2658, 2661, 2671, 2674, + 2680, 2684, 2690, 2695, 2701, 2707, 2713, 2719, 2725, 2734, + 2739, 2747, 2753, 2771, 2776 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* 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_REQUIRE_ONCE", "T_REQUIRE", "T_EVAL", + "T_INCLUDE_ONCE", "T_INCLUDE", "','", "T_LOGICAL_OR", "T_LOGICAL_XOR", + "T_LOGICAL_AND", "T_PRINT", "'='", "T_SR_EQUAL", "T_SL_EQUAL", + "T_XOR_EQUAL", "T_OR_EQUAL", "T_AND_EQUAL", "T_MOD_EQUAL", + "T_CONCAT_EQUAL", "T_DIV_EQUAL", "T_MUL_EQUAL", "T_MINUS_EQUAL", + "T_PLUS_EQUAL", "'?'", "':'", "T_COALESCE", "T_BOOLEAN_OR", + "T_BOOLEAN_AND", "'|'", "'^'", "'&'", "T_SPACESHIP", + "T_IS_NOT_IDENTICAL", "T_IS_IDENTICAL", "T_IS_NOT_EQUAL", "T_IS_EQUAL", + "'<'", "'>'", "T_IS_GREATER_OR_EQUAL", "T_IS_SMALLER_OR_EQUAL", "T_SR", + "T_SL", "'+'", "'-'", "'.'", "'*'", "'/'", "'%'", "'!'", "T_INSTANCEOF", + "'~'", "'@'", "T_UNSET_CAST", "T_BOOL_CAST", "T_OBJECT_CAST", + "T_ARRAY_CAST", "T_BINARY_CAST", "T_UNICODE_CAST", "T_STRING_CAST", + "T_DOUBLE_CAST", "T_INT_CAST", "T_DEC", "T_INC", "'['", "T_CLONE", + "T_NEW", "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_PUBLIC", "T_PROTECTED", + "T_PRIVATE", "T_FINAL", "T_ABSTRACT", "T_STATIC", "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", + "basic_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", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +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, 62, + 286, 287, 288, 289, 43, 45, 46, 42, 47, 37, + 33, 290, 126, 64, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 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 + +/* 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, 243, 243, 243, + 243, 243, 243, 244, 244, 244, 244, 245, 245, 246, + 246, 247, 247, 248, 248, 249, 249, 249, 249, 249, + 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + 249, 249, 249, 249, 249, 249, 249, 249, 250, 250, + 250, 250, 251, 252, 252, 253, 253, 253, 253, 254, + 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, + 255, 256, 256, 256, 257, 257, 258, 258, 259, 259, + 260, 261, 261, 261, 262, 262, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 264, 264, + 264, 264, 264, 264, 264, 264, 264, 265, 266, 266, + 266, 266, 266, 266, 267, 267, 268, 268, 269, 269, + 269, 269, 270, 270, 271, 272, 273, 274, 274, 275, + 275, 276, 277, 277, 278, 279, 279, 279, 280, 280, + 281, 281, 282, 283, 283, 284, 284, 284, 285, 285, + 285, 285, 286, 286, 286, 287, 287, 288, 288, 289, + 289, 290, 290, 290, 291, 291, 292, 292, 293, 293, + 294, 294, 294, 295, 295, 296, 296, 296, 296, 296, + 296, 296, 296, 297, 297, 297, 297, 297, 297, 297, + 298, 298, 299, 299, 300, 300, 300, 300, 300, 301, + 301, 302, 302, 303, 303 +}; + +/* YYR2[YYN] -- Number of symbols composing 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, 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, 8, 3, 3 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't 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, 413, 0, 0, 321, 0, 326, + 327, 5, 348, 395, 52, 328, 280, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 292, 0, 0, + 0, 0, 0, 0, 0, 0, 307, 0, 0, 0, + 0, 80, 86, 0, 0, 332, 333, 335, 329, 330, + 32, 33, 34, 337, 0, 336, 331, 0, 83, 334, + 285, 0, 59, 25, 406, 350, 3, 0, 7, 30, + 8, 9, 73, 74, 0, 0, 363, 0, 75, 387, + 0, 353, 281, 0, 362, 0, 364, 0, 391, 0, + 386, 368, 385, 388, 394, 0, 270, 265, 282, 283, + 266, 349, 5, 307, 0, 285, 75, 429, 428, 0, + 426, 425, 284, 251, 252, 253, 254, 279, 277, 276, + 275, 274, 273, 272, 271, 5, 307, 0, 0, 0, + 308, 0, 234, 366, 0, 232, 0, 418, 0, 356, + 219, 324, 0, 0, 308, 314, 324, 315, 0, 317, + 388, 0, 0, 278, 0, 31, 397, 397, 0, 210, + 0, 0, 211, 0, 0, 0, 42, 0, 44, 0, + 0, 0, 46, 363, 0, 364, 25, 0, 0, 18, + 0, 17, 153, 0, 0, 152, 82, 81, 158, 0, + 75, 0, 0, 0, 0, 412, 413, 0, 4, 0, + 352, 363, 0, 364, 0, 0, 266, 0, 0, 0, + 145, 0, 15, 84, 87, 54, 76, 0, 397, 0, + 0, 0, 0, 0, 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, 233, + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 145, 0, 397, 0, 397, 0, 407, + 390, 397, 397, 397, 0, 0, 0, 310, 0, 0, + 0, 422, 365, 0, 440, 357, 414, 145, 84, 0, + 310, 0, 441, 0, 0, 390, 322, 0, 0, 398, + 0, 0, 0, 51, 0, 0, 0, 212, 214, 363, + 364, 0, 0, 0, 43, 45, 63, 0, 47, 48, + 0, 62, 20, 0, 0, 14, 0, 154, 364, 0, + 49, 0, 0, 50, 0, 0, 70, 72, 430, 0, + 0, 0, 0, 410, 0, 409, 0, 351, 0, 11, + 4, 145, 0, 433, 432, 389, 0, 35, 24, 26, + 27, 28, 0, 6, 0, 0, 0, 144, 146, 148, + 0, 0, 89, 0, 0, 0, 136, 0, 443, 380, + 378, 0, 237, 239, 238, 0, 0, 269, 235, 236, + 240, 242, 241, 263, 256, 255, 258, 257, 259, 261, + 262, 260, 250, 249, 244, 245, 243, 246, 247, 248, + 264, 0, 216, 230, 229, 228, 227, 226, 225, 224, + 223, 222, 221, 220, 0, 444, 381, 0, 404, 0, + 400, 377, 399, 403, 0, 0, 0, 0, 0, 427, + 309, 0, 0, 0, 417, 0, 416, 0, 89, 309, + 380, 381, 319, 323, 0, 438, 436, 209, 0, 0, + 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 354, 328, 0, 0, 0, 339, 0, 338, 23, 346, + 0, 0, 19, 16, 0, 151, 159, 156, 136, 0, + 0, 0, 423, 424, 10, 412, 412, 0, 439, 145, + 13, 0, 0, 363, 364, 0, 396, 150, 149, 299, + 0, 0, 0, 0, 311, 85, 0, 0, 88, 91, + 161, 136, 0, 140, 141, 0, 124, 0, 137, 139, + 384, 145, 145, 379, 268, 0, 0, 217, 306, 145, + 145, 383, 0, 145, 376, 375, 370, 397, 0, 392, + 393, 435, 434, 437, 421, 420, 0, 325, 0, 316, + 25, 116, 0, 25, 114, 38, 0, 213, 93, 0, + 93, 95, 103, 0, 25, 101, 58, 109, 109, 41, + 342, 343, 361, 0, 356, 354, 0, 341, 0, 0, + 0, 67, 65, 61, 21, 155, 0, 0, 71, 55, + 431, 0, 408, 0, 0, 12, 301, 0, 147, 22, + 0, 313, 90, 161, 0, 192, 0, 138, 293, 136, + 0, 135, 0, 126, 0, 0, 267, 324, 0, 0, + 405, 0, 397, 397, 367, 0, 0, 0, 415, 161, + 0, 318, 118, 120, 0, 0, 211, 0, 0, 96, + 0, 0, 0, 109, 0, 109, 0, 0, 345, 357, + 355, 0, 340, 347, 0, 25, 64, 60, 68, 157, + 293, 411, 215, 300, 29, 312, 192, 92, 0, 0, + 197, 198, 199, 202, 201, 200, 191, 79, 160, 164, + 0, 0, 190, 194, 196, 0, 142, 0, 142, 0, + 127, 134, 0, 302, 305, 218, 303, 304, 374, 0, + 0, 0, 369, 401, 402, 419, 192, 320, 122, 0, + 0, 36, 39, 0, 0, 94, 0, 0, 104, 0, + 0, 0, 0, 0, 0, 105, 360, 359, 344, 0, + 0, 142, 78, 0, 0, 168, 205, 0, 165, 195, + 0, 163, 136, 0, 0, 0, 0, 130, 0, 129, + 372, 373, 377, 442, 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, + 297, 0, 25, 131, 0, 128, 371, 0, 25, 0, + 0, 25, 97, 40, 0, 108, 25, 111, 358, 0, + 25, 208, 169, 5, 0, 173, 174, 0, 0, 182, + 0, 0, 206, 203, 0, 0, 0, 298, 0, 294, + 0, 0, 133, 0, 123, 37, 0, 0, 0, 110, + 25, 0, 171, 175, 176, 186, 0, 177, 0, 0, + 0, 207, 77, 0, 295, 286, 132, 0, 117, 0, + 100, 0, 287, 0, 185, 178, 179, 183, 204, 136, + 296, 25, 98, 66, 184, 0, 0, 119, 180, 142, + 0, 188, 25, 166, 0, 189 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + -1, 1, 2, 85, 86, 200, 201, 87, 227, 378, + 379, 89, 611, 612, 687, 613, 355, 356, 380, 381, + 237, 92, 93, 94, 392, 95, 394, 537, 538, 668, + 590, 833, 793, 596, 332, 599, 674, 801, 585, 663, + 738, 741, 786, 545, 546, 643, 547, 548, 773, 386, + 387, 388, 204, 205, 209, 635, 708, 815, 709, 764, + 811, 844, 845, 846, 847, 895, 848, 849, 850, 893, + 913, 710, 711, 712, 713, 714, 767, 715, 178, 326, + 327, 96, 97, 126, 718, 821, 99, 100, 549, 166, + 167, 579, 661, 173, 308, 101, 602, 499, 102, 603, + 306, 604, 103, 104, 301, 105, 106, 654, 732, 564, + 565, 566, 107, 108, 109, 110, 111, 112, 113, 114, + 320, 451, 452, 453, 115, 364, 365, 158, 159, 116, + 359, 117, 118, 119, 120, 121 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -705 +static const yytype_int16 yypact[] = +{ + -705, 103, 1748, -705, 6051, 6051, -101, 6051, 6051, 6051, + 6051, 6051, 6051, 6051, 6051, 6051, 6051, 6051, 6051, 6051, + 6051, 6051, 521, 521, 4721, 6051, 467, -67, -55, -705, + -705, 57, -705, -705, -705, 72, -705, 6051, 4446, -21, + -4, 84, 109, 123, 4854, 4987, 146, -705, 215, 5120, + 129, 6051, 81, -19, 180, 197, 20, 171, 189, 191, + 194, -705, -705, 196, 201, -705, -705, -705, -705, -705, + -705, -705, -705, -705, -14, -705, -705, 240, -705, -705, + 6051, 6184, -705, -705, 166, -42, -705, 16, -705, -705, + -705, -705, -705, -705, 262, 293, -705, 31, 345, 314, + 235, -705, -705, 6556, -705, 193, 1380, 231, -705, 254, + 344, 288, -705, 67, -705, 7, -705, -705, 352, 354, + -705, 355, 356, 321, 272, -705, 345, 7357, 7357, 6051, + 7357, 7357, 1592, -705, -705, 379, -705, -705, -705, -705, + -705, -705, -705, -705, -705, -705, -705, 279, 240, 366, + -57, 289, -705, -705, 290, -705, 521, 7152, 268, 430, + -705, 280, 291, 240, 298, 296, 280, -705, 306, 330, + -40, 7, 5253, -705, 6051, -705, 6051, 6051, 21, 7357, + 353, 6051, 6051, 6051, 388, 6051, -705, 6607, -705, 6650, + 302, 453, -705, 307, 7357, 543, -705, 6693, 240, -7, + 23, -705, -705, 281, 26, -705, -705, -705, 458, 27, + 345, 521, 521, 521, 310, 668, 4721, 240, -705, 115, + 94, 162, 7195, 53, 315, 6744, 318, 1890, 6051, 401, + 4588, 406, -705, 358, 361, -705, -705, -31, 6051, 38, + 6051, 6051, 6051, 5386, 6051, 6051, 6051, 6051, 6051, 6051, + 6051, 6051, 6051, 6051, 6051, 6051, 6051, 6051, 6051, 6051, + 6051, 6051, 6051, 6051, 6051, 6051, 6051, 573, -705, -705, + -705, 5519, 6051, 6051, 6051, 6051, 6051, 6051, 6051, 6051, + 6051, 6051, 6051, 4588, 147, 6051, 167, 6051, 6051, 166, + -12, 6051, 6051, 6051, 325, 6787, 240, -52, 318, 174, + 183, -705, -705, 5652, -705, 5785, -705, 4588, 358, 240, + 298, 10, -705, 10, 167, -35, -705, 6830, 6880, 7357, + 324, 332, 6051, -705, 327, 6923, 339, 484, 7357, 410, + 1287, 496, 25, 6966, -705, -705, -705, 1026, -705, -705, + 2032, -705, 0, 436, 81, -705, 6051, -705, -705, -19, + -705, 1026, 438, -705, 359, 33, -705, -705, -705, 37, + 360, 365, 368, -705, 41, -705, 369, 119, 1442, -705, + -705, 4588, 6051, -705, -705, -705, 373, -705, -705, -705, + -705, -705, 1222, -705, 521, 6051, 375, 509, -705, 7357, + 517, 70, 413, 70, 387, 393, 192, 408, 415, 416, + -35, 7, 7399, 7438, 1592, 6051, 7299, 7463, 7486, 7508, + 7529, 4641, 1740, 1882, 1882, 1882, 1882, 1882, 928, 928, + 928, 928, 501, 501, 316, 316, 316, 379, 379, 379, + -705, 173, 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592, + 1592, 1592, 1592, 1592, 417, 420, 423, 418, -705, 6051, + -705, 425, -33, -705, 421, 6329, 426, 427, 428, -705, + 77, 415, 420, 521, 7357, 521, 7256, 435, 413, 298, + -705, -705, -705, -705, 3736, -705, -705, 7357, 6051, 3878, + 6051, 6051, 521, 237, 1026, 525, 4020, 13, 1026, 1026, + 1026, -705, 431, 449, 240, 66, 456, -705, -705, -705, + -8, 530, -705, -705, 6372, -705, -705, 595, 192, 521, + 446, 521, -705, -705, -705, 668, 668, 597, -705, 4588, + -705, 1606, 450, 232, 148, 459, -705, -705, 7357, -705, + 4588, 1026, 465, 240, 298, -705, 70, 447, 615, -705, + -705, 192, 273, -705, -705, 460, 617, 48, -705, -705, + -705, 4588, 4588, -35, 7463, 6051, 573, -705, -705, 4588, + 4588, -705, 6415, 4588, 561, 562, -705, 6051, 6051, -705, + -705, -705, -705, -705, -705, -705, 5918, -705, 468, 508, + -705, -705, 7016, -705, -705, -705, 475, 7357, 512, 521, + 512, -705, -705, 630, -705, -705, -705, 482, 483, -705, + -705, -705, 524, 488, 649, 1026, 240, 130, 583, 498, + 497, -8, -705, -705, -705, -705, 1026, 503, -705, -705, + -705, 44, -705, 6051, 504, -705, -705, 505, -705, -705, + 240, 298, 615, -705, 70, 815, 510, -705, 558, 260, + 14, -705, 596, 662, 514, 515, 7463, 280, 516, 518, + -705, 523, 6051, 6051, 553, 519, 6468, 521, 7357, -705, + 167, -705, 3594, 329, 529, 2174, 6051, 237, 526, -705, + 531, 1026, 2316, -705, 198, -705, 163, 1026, -705, 1026, + -705, 532, 135, -705, 70, -705, -705, -705, -705, -705, + 558, -705, 1592, -705, -705, 298, 947, -705, 621, 70, + -705, -705, -705, -705, -705, -705, -705, -705, -705, -705, + 620, 321, 346, -705, -705, 28, 672, 538, 672, 50, + 687, -705, 1026, -705, -705, -705, -705, -705, -705, 535, + 537, 167, -705, -705, -705, -705, 1015, -705, 334, 544, + 4446, -705, -705, 545, 548, -705, 4162, 4162, -705, 550, + 287, 554, 6051, 55, 176, -705, -705, 589, -705, 642, + 2458, 672, -705, 708, 18, -705, 709, 30, -705, -705, + 652, -705, 260, 560, 82, 564, 14, 716, 1026, -705, + -705, -705, 425, -705, 569, 705, 663, 6051, -705, -705, + 4304, -705, -705, -705, -705, -705, 574, -705, 6513, -705, + -705, -705, -705, 1026, 576, -705, 572, 1026, 70, -705, + 154, -705, 1026, 664, -705, 345, 727, -705, -705, 665, + -705, 47, -705, 734, 1026, -705, -705, 6051, -705, 585, + 7059, -705, -705, -705, 2600, -705, -705, 3594, -705, 588, + -705, -705, -705, 654, 590, 154, -705, 591, 658, 602, + 598, 613, -705, 749, 690, 1026, 2742, -705, 169, -705, + 2884, 1026, -705, 7102, 3594, -705, 4446, 3026, 601, 3594, + -705, 3168, -705, -705, -705, 457, 70, -705, 693, 1026, + 624, -705, -705, 712, -705, -705, -705, 772, -705, 637, + -705, 3310, -705, 726, 728, 796, -705, -705, -705, 192, + -705, -705, -705, -705, -705, 70, 643, 3594, -705, 672, + 69, -705, -705, -705, 3452, -705 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int16 yypgoto[] = +{ + -705, -705, -195, -15, -705, -705, 464, -705, -187, -705, + 4, -705, -705, 199, -705, 203, -705, 303, 2, 15, + -125, -705, -705, -705, 507, -705, -705, 348, 283, 227, + 153, -705, 75, -705, -705, -705, -555, 35, -705, -705, + -705, -705, -705, -493, -705, -584, -612, 282, -704, -243, + -705, 295, -705, 474, -705, -525, -705, -705, -705, -705, + -705, -705, -705, -17, -705, -705, -705, -705, -705, -705, + -705, -705, -705, -705, -690, -705, -705, -705, -705, -459, + -705, -29, 745, -2, 149, -705, -705, 24, -381, -251, + -705, -705, -705, -705, -163, -225, 614, -705, -705, 233, + 243, -705, 762, 634, -365, 389, 710, -705, -705, -705, + -705, 59, -221, -705, 689, -705, -705, -24, -13, -705, + -149, -309, -705, -705, 60, 335, 328, 633, -705, -705, + -705, -705, -705, -705, 29, -705 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -383 +static const yytype_int16 yytable[] = +{ + 98, 294, 169, 312, 90, 472, 88, 150, 150, 340, + 535, 164, 539, 170, 775, 617, 430, 91, 399, 527, + 193, 586, 769, 368, 231, 287, 808, 719, 321, 322, + 287, 344, 567, 485, 349, 352, 770, 199, 813, 597, + 444, 509, 180, 676, 395, 511, 151, 151, 636, 516, + 165, 221, 516, 287, 210, 858, 720, 806, 202, 219, + 129, 145, 220, 446, 467, 450, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 399, 446, + 640, 799, 776, 175, 33, 354, 171, 33, 343, 397, + 470, 641, 471, 450, 172, 501, 229, 208, 574, 609, + 575, 229, 290, 3, 230, -308, 174, -382, 696, 371, + 226, 229, 497, 398, 819, 33, -366, -366, 750, 230, + 754, 210, 176, 47, 288, 641, 497, 641, 522, 288, + 396, 568, 287, 297, 736, 777, 447, 177, 454, 217, + 181, 150, 456, 457, 458, 145, 229, 203, 310, -379, + 218, 610, 288, 229, 329, 539, 145, 182, 315, 820, + 817, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 289, 642, 521, 84, 598, 298, 232, + 151, 809, 810, 342, 323, 894, 345, 486, 150, 350, + 353, 771, 823, 814, 235, 510, 150, 150, 150, 512, + 150, 883, 367, 517, 84, 910, 691, 744, 642, 859, + 642, -366, -366, -308, -382, -289, -289, 542, 800, 229, + 532, 190, 445, 533, 33, 98, 400, 151, -378, 843, + 229, 288, 911, 912, 198, 151, 151, 151, 519, 151, + 556, -310, 448, 169, 33, 183, 884, 229, 145, 461, + 33, 33, 164, 697, 170, 371, 269, 270, 462, 497, + 33, 752, 753, 497, 497, 497, -309, 145, 229, 589, + 184, 400, 229, 400, 752, 753, 624, -310, 369, 370, + 519, 460, -309, 229, 185, 542, 400, 400, 229, 146, + 191, 165, 735, 196, 469, 751, 752, 753, 400, 401, + 400, 400, 206, 759, 532, 647, 497, 533, 644, 645, + -291, -291, 145, 84, 33, 145, 648, 649, 765, 207, + 651, 543, 495, 147, -288, -288, 148, 171, 755, 199, + 228, 449, 211, 84, 149, 145, 495, 233, 98, 84, + 84, 802, 532, 523, 401, 533, 401, 544, 145, 84, + 212, 737, 213, 146, -125, 214, 145, 215, 33, 401, + 401, 496, 216, 264, 265, 266, 98, 267, 234, 150, + 90, 401, 88, 401, 401, 496, 534, 236, 534, 238, + 497, 534, 239, 91, 796, 752, 753, 147, 553, 543, + 148, 497, 283, 662, -290, -290, 665, 146, 149, 739, + 740, 284, 543, 84, 784, 785, 906, 672, 151, 285, + 532, 152, 155, 533, 286, 544, 150, 291, 655, 292, + 293, 176, 782, 532, 47, 217, 533, 842, 544, 851, + 267, 147, 296, 26, 148, 304, 299, 300, 305, 450, + 324, 307, 149, 311, 309, 346, 497, 84, 150, -193, + 150, 229, 497, 313, 497, 151, 314, 700, 701, 702, + 703, 704, 705, 331, 851, 336, 337, 150, 150, 495, + 338, 351, 361, 495, 495, 495, 383, 373, 581, 607, + 375, 390, 391, 584, 725, 393, 396, 151, 478, 151, + 595, 475, 481, 534, 150, 896, 150, 497, 760, 476, + 150, 150, 480, 729, 730, 482, 151, 151, 496, 484, + 450, 502, 496, 496, 496, 507, 495, 530, 631, 98, + 508, 534, 513, 90, 908, 88, 534, 534, 514, 515, + 531, 518, 169, 151, 525, 151, 91, 529, 536, 151, + 151, 164, 145, 170, 33, 261, 262, 263, 264, 265, + 266, 540, 267, 497, 541, 496, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 700, 701, + 702, 703, 704, 705, 150, 550, 551, 552, 497, 558, + 165, 559, 497, 146, 560, 561, 563, 497, 569, 161, + 495, 682, 605, 571, 572, 573, 145, 577, 33, 497, + 593, 495, 606, 608, 834, 614, -366, -366, 616, 619, + 623, 633, 626, 151, 837, 695, 171, 162, 630, 534, + 163, 627, 638, 634, 534, 639, 652, 653, 149, 496, + 497, 856, 659, 84, 660, 860, 497, 146, 666, 667, + 496, 864, 150, 671, 867, 673, 675, 400, 145, 869, + 33, 677, 150, 871, 497, 678, 495, 679, 683, 684, + 98, 685, 495, 98, 495, 690, 693, 717, 694, 534, + 98, 147, 716, 721, 148, 722, 723, 724, 726, 731, + 727, 151, 149, 891, 534, 728, 733, 84, 746, 146, + 854, 151, 742, 747, 758, 496, 763, 766, 772, 774, + 778, 496, 780, 496, 781, 787, 339, 495, 789, 768, + 790, 154, 154, 795, 907, 168, 803, 797, 400, 804, + 401, 807, 812, 162, 818, 914, 163, 816, 822, 824, + 827, 828, 153, 153, 149, 829, 840, 835, 839, 84, + 855, 853, 857, 145, 788, 33, 496, 861, 865, -181, + 792, 792, 870, 875, 874, 872, 876, 534, 98, 195, + 878, 877, 879, 495, 890, 880, 127, 128, 897, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 146, 899, 157, 160, 495, 900, + 223, 401, 495, 534, 832, 534, 362, 495, 901, 179, + 902, 904, 496, -187, 905, 909, 187, 189, 503, 495, + 686, 194, 618, 197, 688, 468, 578, 670, 147, 632, + 745, 148, 794, 505, 637, 628, 224, 496, 873, 149, + 534, 496, 98, 836, 84, 98, 496, 347, 681, 761, + 495, 826, 222, 225, 622, 154, 495, 680, 496, 366, + 621, 0, 0, 0, 98, 0, 0, 0, 98, 0, + 0, 534, 98, 0, 495, 98, 302, 98, 0, 98, + 888, 0, 0, 0, 0, 0, 0, 0, 0, 496, + 0, 0, 0, 0, 534, 496, 0, 0, 0, 98, + 534, 295, 154, 330, 0, 0, 0, 0, 0, 0, + 154, 154, 154, 496, 154, 98, 0, 0, 0, 0, + 0, 0, 98, 348, 0, 0, 0, 0, 0, 698, + 0, 357, 358, 360, 699, 363, 700, 701, 702, 703, + 704, 705, 706, 0, 317, 0, 318, 0, 319, 319, + 0, 0, 0, 325, 328, 194, 0, 333, 0, 0, + 0, 498, 0, 0, 0, 0, 168, 0, 0, 0, + 0, 0, 0, 0, 0, 506, -383, -383, -383, -383, + 259, 260, 261, 262, 263, 264, 265, 266, 157, 267, + 707, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 382, 0, 389, 0, 0, 0, 0, 0, 0, 0, + 319, 0, 402, 403, 404, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 0, + 0, 0, 0, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 389, 0, 319, 0, 319, + 455, 698, 0, 319, 319, 319, 699, 0, 700, 701, + 702, 703, 704, 705, 706, 464, 0, 466, 0, 389, + 488, 489, 0, 154, 0, 0, 0, 0, 0, 0, + 0, 0, 524, 0, 477, 0, 0, 0, 0, 0, + 0, 490, 0, 0, 302, 0, 0, 0, 592, 29, + 30, 145, 600, 601, 0, 0, 0, 0, 504, 491, + 0, 0, 762, 0, 0, 0, 0, 0, 0, 698, + 154, 0, 0, 0, 699, 0, 700, 701, 702, 703, + 704, 705, 706, 389, 194, 0, 0, 0, 0, 0, + 0, 557, 146, 0, 0, 629, 0, 528, 0, 0, + 0, 0, 154, 0, 154, 492, 65, 66, 67, 68, + 69, 0, 0, 0, 0, 0, 0, 554, 0, 0, + 73, 154, 154, 302, 0, 302, 493, 75, 76, 494, + 783, 0, 0, 79, 0, 0, 0, 0, 0, 0, + 0, 0, 588, 591, 0, 0, 0, 0, 154, 0, + 154, 0, 0, 0, 154, 154, 0, 0, 0, 0, + 0, 562, 0, 0, 0, 0, 0, 0, 0, 357, + 0, 620, 0, 0, 0, 363, 363, 0, 0, 0, + 689, 240, 241, 242, 0, 0, 0, 0, 0, 0, + 582, 0, 328, 587, 0, 168, 0, 243, 0, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 0, 267, 0, 0, 0, 0, 154, 0, + 0, 389, 0, 0, 0, 748, 0, 0, 0, 0, + 0, 756, 389, 757, 0, 0, 0, 0, 0, 669, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 0, 389, 389, 0, 0, 646, 0, 0, + 0, 389, 389, 0, 0, 389, 0, 0, 0, 319, + 656, 0, 0, 0, 0, 0, 779, 0, 658, 0, + 0, 0, 0, 0, 0, 0, 154, 0, 0, 0, + -366, -366, 0, 0, 0, 0, 154, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 302, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, + 0, 0, 483, 0, 0, 692, 0, 526, 0, 0, + 0, 0, 825, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 319, 319, 0, 838, 0, 0, + 0, 841, 0, 0, 0, 0, 852, 0, 328, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 862, 0, + 0, 0, 0, -366, -366, 4, 5, 6, 7, 8, + 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 881, + 0, 0, 0, 0, 0, 886, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 11, 0, 0, + 0, 0, 12, 898, 13, 14, 15, 16, 17, 18, + 0, 0, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 0, 0, 798, 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, 830, + 51, 52, 53, 0, 0, 0, 54, 55, 56, 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, 863, + 0, 0, 74, 75, 76, 77, 0, 0, 78, 79, + 80, 0, 0, 81, 0, 82, 83, 520, 84, 4, + 5, 6, 7, 8, 0, 0, 0, 243, 9, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 0, 267, 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, + 48, 49, 50, 0, 51, 52, 53, 0, 0, 0, + 54, 55, 56, 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, 625, 84, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 0, 267, 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, 0, + 0, 0, 54, 55, 56, 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, -383, -383, -383, -383, -383, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 0, 267, 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, 0, 0, 0, 54, 55, 56, 0, 57, 58, + 59, 376, 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, 377, 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, 0, 0, 0, 54, 55, 56, 0, + 57, 58, 59, 376, 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, 500, 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, 743, 40, 0, 41, 0, 42, 0, 0, + 43, 0, 0, 0, 44, 45, 46, 47, 0, 49, + 50, 0, 51, 0, 53, 0, 0, 0, 54, 55, + 56, 0, 57, 58, 59, 376, 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, + 749, 0, 43, 0, 0, 0, 44, 45, 46, 47, + 0, 49, 50, 0, 51, 0, 53, 0, 0, 0, + 54, 55, 56, 0, 57, 58, 59, 376, 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, 0, + 0, 0, 54, 55, 56, 0, 57, 58, 59, 376, + 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, 805, 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, 868, 42, 0, 0, 43, 0, 0, 0, + 44, 45, 46, 47, 0, 49, 50, 0, 51, 0, + 53, 0, 0, 0, 54, 55, 56, 0, 57, 58, + 59, 376, 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, 0, 0, 0, 54, 55, 56, 0, + 57, 58, 59, 376, 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, 882, 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, 0, 0, 0, 54, 55, + 56, 0, 57, 58, 59, 376, 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, 885, + 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, 889, 41, 0, 42, + 0, 0, 43, 0, 0, 0, 44, 45, 46, 47, + 0, 49, 50, 0, 51, 0, 53, 0, 0, 0, + 54, 55, 56, 0, 57, 58, 59, 376, 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, 0, + 0, 0, 54, 55, 56, 0, 57, 58, 59, 376, + 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, 892, 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, 0, 0, 0, 54, 55, 56, 0, 57, 58, + 59, 376, 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, 903, 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, 0, 0, 0, 54, 55, 56, 0, + 57, 58, 59, 376, 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, 915, 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, 0, 0, 0, 54, 55, + 56, 0, 57, 58, 59, 376, 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, 580, 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, 0, 0, 0, + 0, 0, 56, 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, 583, 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, 0, + 0, 0, 0, 0, 56, 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, 594, 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, 0, 0, 0, 0, 0, 56, 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, 791, 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, 0, 0, 0, 0, 0, 56, 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, + 831, 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, 0, 0, 0, 0, 0, + 56, 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, 0, 0, 0, + 0, 0, 56, 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, + 384, 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, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 47, 267, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 123, 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, 385, 81, + 0, 0, 0, 156, 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, 0, 0, 0, 0, 0, 123, 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, 0, 0, 0, 0, 0, + 123, 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, 186, 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, 0, 0, + 0, 0, 0, 123, 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, + 188, 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, 0, 0, 0, 0, 0, 123, 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, 192, 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, 0, 0, 0, 0, 0, 123, + 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, 405, 0, 81, 316, 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, 0, 0, 0, + 0, 0, 123, 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, 431, 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, + 0, 0, 0, 0, 0, 123, 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, 0, 0, 0, 0, 0, 123, 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, 465, 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, 0, 0, 0, 0, + 0, 123, 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, + 657, 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, 0, + 0, 0, 0, 0, 123, 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, 0, 0, 0, 0, 0, 123, 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, 0, 0, 0, 0, 0, + 123, 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, 240, 241, + 242, 79, 80, 0, 0, 81, 0, 0, 0, 0, + 84, 0, 0, 0, 243, 0, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 0, + 267, 240, 241, 242, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 243, 0, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 0, 267, 240, 241, 242, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 243, 0, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 0, 267, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 241, 242, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 243, 570, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 0, 267, + 0, 0, 240, 241, 242, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 615, 243, 799, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 0, 267, 240, 241, 242, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 650, 243, 0, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 0, 267, 0, 0, + 0, 0, 0, 0, 0, 0, 240, 241, 242, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 243, 734, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 0, 267, 240, + 241, 242, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 243, 800, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 0, 267, 240, 241, 242, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 243, 268, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 0, 267, 0, 0, 0, 0, 0, + 0, 0, 0, 240, 241, 242, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, + 334, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 0, 267, 240, 241, 242, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 243, 335, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 0, 267, 240, + 241, 242, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 243, 341, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 0, 267, 0, 0, 0, 0, 0, 0, 0, 240, + 241, 242, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 243, 374, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 0, 267, 240, 241, 242, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 243, 459, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 0, 267, 240, 241, 242, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 243, 473, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 0, 267, 0, 0, + 0, 0, 0, 0, 0, 240, 241, 242, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 243, 474, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 0, 267, 240, 241, + 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 243, 479, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 0, + 267, 240, 241, 242, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 243, 487, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 0, 267, 0, 0, 0, 0, 0, 0, + 0, 240, 241, 242, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 243, 664, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 0, 267, 240, 241, 242, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 243, 866, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 0, 267, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 887, 240, 241, 242, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 303, + 0, 243, 0, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 0, 267, 240, 241, + 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 372, 0, 243, 555, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 0, + 267, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 240, 241, 242, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 243, 576, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 0, 267, 241, + 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 243, 0, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 242, + 267, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 243, 0, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 0, 267, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 0, 267, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 0, 267, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 0, 267, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 0, + 267 +}; + +static const yytype_int16 yycheck[] = +{ + 2, 126, 26, 166, 2, 314, 2, 22, 23, 196, + 391, 26, 393, 26, 718, 508, 267, 2, 239, 384, + 49, 480, 712, 218, 8, 65, 8, 639, 177, 8, + 65, 8, 65, 8, 8, 8, 8, 52, 8, 26, + 283, 8, 38, 598, 75, 8, 22, 23, 541, 8, + 26, 80, 8, 65, 56, 8, 640, 761, 77, 74, + 161, 75, 77, 284, 307, 286, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 299, 300, + 32, 26, 32, 26, 77, 210, 26, 77, 95, 238, + 311, 77, 313, 314, 161, 95, 153, 77, 463, 107, + 465, 153, 115, 0, 161, 147, 161, 147, 633, 161, + 81, 153, 337, 75, 32, 77, 63, 64, 673, 161, + 675, 123, 65, 103, 164, 77, 351, 77, 371, 164, + 161, 164, 65, 148, 659, 719, 285, 65, 287, 153, + 161, 156, 291, 292, 293, 75, 153, 166, 163, 161, + 164, 159, 164, 153, 183, 536, 75, 161, 171, 77, + 772, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 166, 160, 370, 166, 164, 149, 163, + 156, 163, 164, 198, 163, 875, 163, 162, 203, 163, + 163, 163, 776, 163, 163, 162, 211, 212, 213, 162, + 215, 32, 217, 162, 166, 909, 162, 666, 160, 162, + 160, 63, 64, 147, 147, 162, 163, 25, 163, 153, + 150, 75, 75, 153, 77, 227, 239, 203, 161, 75, + 153, 164, 163, 164, 153, 211, 212, 213, 161, 215, + 67, 147, 75, 267, 77, 161, 77, 153, 75, 75, + 77, 77, 267, 634, 267, 161, 63, 64, 75, 484, + 77, 98, 99, 488, 489, 490, 147, 75, 153, 32, + 161, 284, 153, 286, 98, 99, 519, 147, 163, 164, + 161, 296, 147, 153, 161, 25, 299, 300, 153, 116, + 75, 267, 657, 164, 309, 97, 98, 99, 311, 239, + 313, 314, 122, 684, 150, 556, 531, 153, 551, 552, + 162, 163, 75, 166, 77, 75, 559, 560, 699, 122, + 563, 129, 337, 150, 162, 163, 153, 267, 165, 344, + 164, 164, 161, 166, 161, 75, 351, 75, 340, 166, + 166, 165, 150, 372, 284, 153, 286, 155, 75, 166, + 161, 660, 161, 116, 162, 161, 75, 161, 77, 299, + 300, 337, 161, 47, 48, 49, 368, 51, 75, 384, + 368, 311, 368, 313, 314, 351, 391, 32, 393, 65, + 605, 396, 147, 368, 97, 98, 99, 150, 401, 129, + 153, 616, 161, 580, 162, 163, 583, 116, 161, 70, + 71, 147, 129, 166, 70, 71, 899, 594, 384, 65, + 150, 22, 23, 153, 126, 155, 431, 65, 567, 65, + 65, 65, 731, 150, 103, 153, 153, 808, 155, 810, + 51, 150, 153, 67, 153, 167, 147, 147, 8, 660, + 87, 161, 161, 147, 153, 164, 671, 166, 463, 103, + 465, 153, 677, 147, 679, 431, 126, 111, 112, 113, + 114, 115, 116, 75, 845, 163, 13, 482, 483, 484, + 163, 13, 162, 488, 489, 490, 75, 162, 474, 494, + 162, 75, 124, 479, 647, 124, 161, 463, 161, 465, + 486, 167, 8, 508, 509, 876, 511, 722, 685, 167, + 515, 516, 163, 652, 653, 95, 482, 483, 484, 13, + 731, 75, 488, 489, 490, 77, 531, 8, 533, 521, + 161, 536, 162, 521, 905, 521, 541, 542, 163, 161, + 13, 162, 556, 509, 161, 511, 521, 162, 125, 515, + 516, 556, 75, 556, 77, 44, 45, 46, 47, 48, + 49, 164, 51, 778, 161, 531, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 111, 112, + 113, 114, 115, 116, 589, 167, 161, 161, 803, 162, + 556, 161, 807, 116, 161, 167, 161, 812, 167, 122, + 605, 606, 161, 167, 167, 167, 75, 162, 77, 824, + 75, 616, 153, 147, 791, 75, 63, 64, 13, 163, + 13, 164, 162, 589, 801, 630, 556, 150, 153, 634, + 153, 162, 162, 8, 639, 8, 65, 65, 161, 605, + 855, 818, 164, 166, 126, 822, 861, 116, 163, 127, + 616, 828, 657, 13, 831, 163, 163, 660, 75, 836, + 77, 127, 667, 840, 879, 167, 671, 8, 75, 161, + 662, 164, 677, 665, 679, 162, 162, 109, 163, 684, + 672, 150, 162, 77, 153, 13, 162, 162, 162, 126, + 162, 657, 161, 870, 699, 162, 167, 166, 162, 116, + 815, 667, 163, 162, 162, 671, 75, 77, 26, 161, + 13, 677, 167, 679, 167, 161, 163, 722, 163, 711, + 162, 22, 23, 163, 901, 26, 127, 163, 731, 77, + 660, 13, 13, 150, 164, 912, 153, 75, 164, 13, + 161, 26, 22, 23, 161, 72, 164, 163, 162, 166, + 13, 77, 77, 75, 740, 77, 722, 13, 163, 95, + 746, 747, 164, 95, 163, 165, 154, 772, 760, 49, + 147, 163, 13, 778, 163, 75, 4, 5, 75, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 116, 161, 24, 25, 803, 77, + 80, 731, 807, 808, 790, 810, 128, 812, 26, 37, + 163, 75, 778, 75, 8, 162, 44, 45, 344, 824, + 611, 49, 509, 51, 611, 308, 468, 590, 150, 536, + 667, 153, 747, 349, 542, 530, 81, 803, 845, 161, + 845, 807, 834, 798, 166, 837, 812, 203, 605, 690, + 855, 782, 80, 81, 516, 156, 861, 604, 824, 216, + 515, -1, -1, -1, 856, -1, -1, -1, 860, -1, + -1, 876, 864, -1, 879, 867, 156, 869, -1, 871, + 866, -1, -1, -1, -1, -1, -1, -1, -1, 855, + -1, -1, -1, -1, 899, 861, -1, -1, -1, 891, + 905, 129, 203, 183, -1, -1, -1, -1, -1, -1, + 211, 212, 213, 879, 215, 907, -1, -1, -1, -1, + -1, -1, 914, 203, -1, -1, -1, -1, -1, 104, + -1, 211, 212, 213, 109, 215, 111, 112, 113, 114, + 115, 116, 117, -1, 172, -1, 174, -1, 176, 177, + -1, -1, -1, 181, 182, 183, -1, 185, -1, -1, + -1, 337, -1, -1, -1, -1, 267, -1, -1, -1, + -1, -1, -1, -1, -1, 351, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 216, 51, + 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 228, -1, 230, -1, -1, -1, -1, -1, -1, -1, + 238, -1, 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, 266, -1, + -1, -1, -1, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, -1, 285, -1, 287, + 288, 104, -1, 291, 292, 293, 109, -1, 111, 112, + 113, 114, 115, 116, 117, 303, -1, 305, -1, 307, + 44, 45, -1, 384, -1, -1, -1, -1, -1, -1, + -1, -1, 372, -1, 322, -1, -1, -1, -1, -1, + -1, 65, -1, -1, 384, -1, -1, -1, 484, 73, + 74, 75, 488, 489, -1, -1, -1, -1, 346, 83, + -1, -1, 165, -1, -1, -1, -1, -1, -1, 104, + 431, -1, -1, -1, 109, -1, 111, 112, 113, 114, + 115, 116, 117, 371, 372, -1, -1, -1, -1, -1, + -1, 431, 116, -1, -1, 531, -1, 385, -1, -1, + -1, -1, 463, -1, 465, 129, 130, 131, 132, 133, + 134, -1, -1, -1, -1, -1, -1, 405, -1, -1, + 144, 482, 483, 463, -1, 465, 150, 151, 152, 153, + 165, -1, -1, 157, -1, -1, -1, -1, -1, -1, + -1, -1, 482, 483, -1, -1, -1, -1, 509, -1, + 511, -1, -1, -1, 515, 516, -1, -1, -1, -1, + -1, 449, -1, -1, -1, -1, -1, -1, -1, 509, + -1, 511, -1, -1, -1, 515, 516, -1, -1, -1, + 616, 9, 10, 11, -1, -1, -1, -1, -1, -1, + 478, -1, 480, 481, -1, 556, -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, 589, -1, + -1, 519, -1, -1, -1, 671, -1, -1, -1, -1, + -1, 677, 530, 679, -1, -1, -1, -1, -1, 589, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, -1, 551, 552, -1, -1, 555, -1, -1, + -1, 559, 560, -1, -1, 563, -1, -1, -1, 567, + 568, -1, -1, -1, -1, -1, 722, -1, 576, -1, + -1, -1, -1, -1, -1, -1, 657, -1, -1, -1, + 63, 64, -1, -1, -1, -1, 667, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 657, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 667, -1, -1, + -1, -1, 95, -1, -1, 623, -1, 165, -1, -1, + -1, -1, 778, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 652, 653, -1, 803, -1, -1, + -1, 807, -1, -1, -1, -1, 812, -1, 666, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 824, -1, + -1, -1, -1, 63, 64, 3, 4, 5, 6, 7, + -1, -1, -1, -1, 12, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 855, + -1, -1, -1, -1, -1, 861, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, + -1, -1, 50, 879, 52, 53, 54, 55, 56, 57, + -1, -1, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, -1, -1, 752, 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, 787, + 108, 109, 110, -1, -1, -1, 114, 115, 116, -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, 827, + -1, -1, 150, 151, 152, 153, -1, -1, 156, 157, + 158, -1, -1, 161, -1, 163, 164, 165, 166, 3, + 4, 5, 6, 7, -1, -1, -1, 25, 12, 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, + 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, -1, -1, -1, + 114, 115, 116, -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, -1, + -1, -1, 114, 115, 116, -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, 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, -1, 105, 106, -1, 108, -1, + 110, -1, -1, -1, 114, 115, 116, -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, -1, -1, -1, 114, 115, 116, -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, -1, -1, -1, 114, 115, + 116, -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, -1, -1, -1, + 114, 115, 116, -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, -1, + -1, -1, 114, 115, 116, -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, -1, -1, -1, 114, 115, 116, -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, -1, -1, -1, 114, 115, 116, -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, -1, -1, -1, 114, 115, + 116, -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, -1, -1, -1, + 114, 115, 116, -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, -1, + -1, -1, 114, 115, 116, -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, -1, -1, -1, 114, 115, 116, -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, -1, -1, -1, 114, 115, 116, -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, -1, -1, -1, 114, 115, + 116, -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, -1, -1, -1, + -1, -1, 116, -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, -1, + -1, -1, -1, -1, 116, -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, -1, -1, -1, -1, -1, 116, -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, -1, -1, -1, -1, -1, 116, -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, -1, -1, -1, -1, -1, + 116, -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, -1, -1, -1, + -1, -1, 116, -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, -1, + -1, -1, -1, -1, 116, -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, 160, 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, -1, -1, -1, -1, -1, 116, -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, -1, -1, -1, -1, -1, + 116, -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, -1, -1, + -1, -1, -1, 116, -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, -1, -1, -1, -1, -1, 116, -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, -1, -1, -1, -1, -1, 116, + -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, -1, -1, -1, + -1, -1, 116, -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, + -1, -1, -1, -1, -1, 116, -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, -1, -1, -1, -1, -1, 116, -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, -1, -1, -1, -1, + -1, 116, -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, -1, + -1, -1, -1, -1, 116, -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, -1, -1, -1, -1, -1, 116, -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, -1, -1, -1, -1, -1, + 116, -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, + -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, 9, 10, 11, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 165, 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, 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, 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, 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, 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, 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, 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, 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, -1, -1, 162, 9, 10, 11, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 127, + -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, 127, -1, 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, -1, + -1, -1, -1, -1, -1, -1, 9, 10, 11, -1, + -1, -1, -1, -1, -1, -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, 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, 11, + 51, -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, + 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, 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, 114, 115, 116, 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, 249, 250, 251, 254, + 255, 263, 266, 270, 271, 273, 274, 280, 281, 282, + 283, 284, 285, 286, 287, 292, 297, 299, 300, 301, + 302, 303, 75, 116, 150, 158, 251, 270, 270, 161, + 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 75, 116, 150, 153, 161, + 171, 255, 273, 274, 282, 273, 32, 270, 295, 296, + 270, 122, 150, 153, 171, 255, 257, 258, 282, 285, + 286, 292, 161, 261, 161, 26, 65, 65, 246, 270, + 178, 161, 161, 161, 161, 161, 163, 270, 163, 270, + 75, 75, 163, 249, 270, 274, 164, 270, 153, 171, + 173, 174, 77, 166, 220, 221, 122, 122, 77, 222, + 251, 161, 161, 161, 161, 161, 161, 153, 164, 171, + 171, 249, 270, 274, 250, 270, 302, 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, 63, + 64, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 161, 147, 65, 126, 65, 164, 166, + 286, 65, 65, 65, 188, 270, 153, 171, 302, 147, + 147, 272, 274, 127, 167, 8, 268, 161, 262, 153, + 171, 147, 262, 147, 126, 286, 162, 270, 270, 270, + 288, 288, 8, 163, 87, 270, 247, 248, 270, 249, + 274, 75, 202, 270, 163, 163, 163, 13, 163, 163, + 176, 163, 171, 95, 8, 163, 164, 271, 274, 8, + 163, 13, 8, 163, 188, 184, 185, 274, 274, 298, + 274, 162, 128, 274, 293, 294, 295, 171, 170, 163, + 164, 161, 127, 162, 162, 162, 121, 165, 177, 178, + 186, 187, 270, 75, 32, 160, 217, 218, 219, 270, + 75, 124, 192, 124, 194, 75, 161, 288, 75, 280, + 286, 292, 270, 270, 270, 26, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, + 257, 32, 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 217, 75, 280, 288, 75, 164, + 280, 289, 290, 291, 288, 270, 288, 288, 288, 162, + 171, 75, 75, 32, 270, 32, 270, 217, 192, 171, + 280, 280, 289, 162, 162, 167, 167, 270, 161, 162, + 163, 8, 95, 95, 13, 8, 162, 162, 44, 45, + 65, 83, 129, 150, 153, 171, 255, 263, 264, 265, + 165, 95, 75, 174, 270, 221, 264, 77, 161, 8, + 162, 8, 162, 162, 163, 161, 8, 162, 162, 161, + 165, 170, 217, 249, 274, 161, 165, 272, 270, 162, + 8, 13, 150, 153, 171, 256, 125, 195, 196, 256, + 164, 161, 25, 129, 155, 211, 212, 214, 215, 256, + 167, 161, 161, 286, 270, 26, 67, 274, 162, 161, + 161, 167, 270, 161, 277, 278, 279, 65, 164, 167, + 165, 167, 167, 167, 272, 272, 127, 162, 195, 259, + 26, 178, 270, 26, 178, 206, 247, 270, 274, 32, + 198, 274, 264, 75, 26, 178, 201, 26, 164, 203, + 264, 264, 264, 267, 269, 161, 153, 171, 147, 107, + 159, 180, 181, 183, 75, 165, 13, 211, 185, 163, + 274, 293, 294, 13, 217, 165, 162, 162, 219, 264, + 153, 171, 196, 164, 8, 223, 211, 215, 162, 8, + 32, 77, 160, 213, 217, 217, 270, 257, 217, 217, + 165, 217, 65, 65, 275, 288, 270, 32, 270, 164, + 126, 260, 176, 207, 162, 176, 163, 127, 197, 274, + 197, 13, 176, 163, 204, 163, 204, 127, 167, 8, + 268, 267, 171, 75, 161, 164, 181, 182, 183, 264, + 162, 162, 270, 162, 163, 171, 223, 256, 104, 109, + 111, 112, 113, 114, 115, 116, 117, 165, 224, 226, + 239, 240, 241, 242, 243, 245, 162, 109, 252, 214, + 213, 77, 13, 162, 162, 262, 162, 162, 162, 288, + 288, 126, 276, 167, 165, 272, 223, 289, 208, 70, + 71, 209, 163, 88, 247, 198, 162, 162, 264, 94, + 204, 97, 98, 99, 204, 165, 264, 264, 162, 256, + 176, 252, 165, 75, 227, 256, 77, 244, 251, 242, + 8, 163, 26, 216, 161, 216, 32, 213, 13, 264, + 167, 167, 289, 165, 70, 71, 210, 161, 178, 163, + 162, 26, 178, 200, 200, 163, 97, 163, 270, 26, + 163, 205, 165, 127, 77, 165, 216, 13, 8, 163, + 164, 228, 13, 8, 163, 225, 75, 214, 164, 32, + 77, 253, 164, 213, 13, 264, 279, 161, 26, 72, + 270, 26, 178, 199, 176, 163, 205, 176, 264, 162, + 164, 264, 256, 75, 229, 230, 231, 232, 234, 235, + 236, 256, 264, 77, 188, 13, 176, 77, 8, 162, + 176, 13, 264, 270, 176, 163, 162, 176, 92, 176, + 164, 176, 165, 231, 163, 95, 154, 163, 147, 13, + 75, 264, 165, 32, 77, 165, 264, 162, 178, 90, + 163, 176, 165, 237, 242, 233, 256, 75, 264, 161, + 77, 26, 163, 165, 75, 8, 211, 176, 256, 162, + 216, 163, 164, 238, 176, 165 +}; + +#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 + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK (1); \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (yyscanner, root, YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (&yylval, YYLEX_PARAM) +#else +# define YYLEX yylex (&yylval, yyscanner) +#endif + +/* 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 (YYID (0)) + +# 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 (YYID (0)) + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, void* yyscanner, xhpast::Node** root) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep, yyscanner, root) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; + void* yyscanner; + xhpast::Node** root; +#endif +{ + if (!yyvaluep) + return; + YYUSE (yyscanner); + YYUSE (root); +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); +# endif + switch (yytype) + { + default: + break; + } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, void* yyscanner, xhpast::Node** root) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep, yyscanner, root) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; + void* yyscanner; + xhpast::Node** root; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", 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). | +`------------------------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) +#else +static void +yy_stack_print (bottom, top) + yytype_int16 *bottom; + yytype_int16 *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, int yyrule, void* yyscanner, xhpast::Node** root) +#else +static void +yy_reduce_print (yyvsp, yyrule, yyscanner, root) + YYSTYPE *yyvsp; + int yyrule; + void* yyscanner; + xhpast::Node** root; +#endif +{ + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + fprintf (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + , yyscanner, root); + fprintf (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule, yyscanner, root); \ +} while (YYID (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. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static YYSIZE_T +yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif +{ + 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. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static char * +yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif +{ + 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 YYRESULT an error message about the unexpected token + YYCHAR while in state YYSTATE. Return the number of bytes copied, + including the terminating null byte. If YYRESULT is null, do not + copy anything; just return the number of bytes that would be + copied. As a special case, return 0 if an ordinary "syntax error" + message will do. Return YYSIZE_MAXIMUM if overflow occurs during + size calculation. */ +static YYSIZE_T +yysyntax_error (char *yyresult, int yystate, int yychar) +{ + int yyn = yypact[yystate]; + + if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) + return 0; + else + { + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; + +# if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +# endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + 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 yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + + if (yysize_overflow) + return YYSIZE_MAXIMUM; + + if (yyresult) + { + /* 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 = yyresult; + int yyi = 0; + while ((*yyp = *yyf) != '\0') + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + } + return yysize; + } +} +#endif /* YYERROR_VERBOSE */ + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, void* yyscanner, xhpast::Node** root) +#else +static void +yydestruct (yymsg, yytype, yyvaluep, yyscanner, root) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; + void* yyscanner; + xhpast::Node** root; +#endif +{ + YYUSE (yyvaluep); + YYUSE (yyscanner); + YYUSE (root); + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (void* yyscanner, xhpast::Node** root); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void* yyscanner, xhpast::Node** root) +#else +int +yyparse (yyscanner, root) + void* yyscanner; + xhpast::Node** root; +#endif +#endif +{ + /* The look-ahead symbol. */ +int yychar; + +/* The semantic value of the look-ahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + int yystate; + int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Look-ahead token as an internal (translated) token number. */ + int yytoken = 0; +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss = yyssa; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp; + + + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + 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); + YYSTACK_RELOCATE (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)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + look-ahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to look-ahead token. */ + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a look-ahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + 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 (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the look-ahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + yystate = yyn; + *++yyvsp = yylval; + + 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 207 "parser.y" + { + *root = NNEW(n_PROGRAM)->appendChild((yyvsp[(1) - (1)])); + ;} + break; + + case 3: +#line 213 "parser.y" + { + (yyval) = (yyvsp[(1) - (2)])->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 4: +#line 216 "parser.y" + { + (yyval) = NNEW(n_STATEMENT_LIST); + ;} + break; + + case 5: +#line 222 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_SYMBOL_NAME); + ;} + break; + + case 6: +#line 225 "parser.y" + { + (yyval) = NMORE((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)])); + ;} + break; + + case 10: +#line 234 "parser.y" + { + (yyvsp[(1) - (4)]) = NSPAN((yyvsp[(1) - (4)]), n_HALT_COMPILER, (yyvsp[(3) - (4)])); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (4)])); + NMORE((yyval), (yyvsp[(4) - (4)])); + ;} + break; + + case 11: +#line 239 "parser.y" + { + NSPAN((yyvsp[(1) - (3)]), n_NAMESPACE, (yyvsp[(2) - (3)])); + (yyvsp[(1) - (3)])->appendChild((yyvsp[(2) - (3)])); + (yyvsp[(1) - (3)])->appendChild(NNEW(n_EMPTY)); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (3)])); + NMORE((yyval), (yyvsp[(3) - (3)])); + ;} + break; + + case 12: +#line 246 "parser.y" + { + NSPAN((yyvsp[(1) - (5)]), n_NAMESPACE, (yyvsp[(5) - (5)])); + (yyvsp[(1) - (5)])->appendChild((yyvsp[(2) - (5)])); + (yyvsp[(1) - (5)])->appendChild(NEXPAND((yyvsp[(3) - (5)]), (yyvsp[(4) - (5)]), (yyvsp[(5) - (5)]))); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (5)])); + ;} + break; + + case 13: +#line 252 "parser.y" + { + NSPAN((yyvsp[(1) - (4)]), n_NAMESPACE, (yyvsp[(4) - (4)])); + (yyvsp[(1) - (4)])->appendChild(NNEW(n_EMPTY)); + NMORE((yyvsp[(3) - (4)]), (yyvsp[(4) - (4)])); + NMORE((yyvsp[(3) - (4)]), (yyvsp[(2) - (4)])); + (yyvsp[(1) - (4)])->appendChild((yyvsp[(3) - (4)])); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (4)])); + ;} + break; + + case 14: +#line 260 "parser.y" + { + NMORE((yyvsp[(2) - (3)]), (yyvsp[(1) - (3)])); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(2) - (3)])); + NMORE((yyval), (yyvsp[(3) - (3)])); + ;} + break; + + case 15: +#line 265 "parser.y" + { + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (2)])); + NMORE((yyval), (yyvsp[(2) - (2)])); + ;} + break; + + case 16: +#line 272 "parser.y" + { + (yyval) = (yyvsp[(1) - (3)])->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 17: +#line 275 "parser.y" + { + (yyval) = NNEW(n_USE_LIST); + (yyval)->appendChild((yyvsp[(1) - (1)])); + ;} + break; + + case 18: +#line 282 "parser.y" + { + (yyval) = NNEW(n_USE); + (yyval)->appendChild((yyvsp[(1) - (1)])); + (yyval)->appendChild(NNEW(n_EMPTY)); + ;} + break; + + case 19: +#line 287 "parser.y" + { + (yyval) = NNEW(n_USE); + (yyval)->appendChild((yyvsp[(1) - (3)])); + NTYPE((yyvsp[(3) - (3)]), n_STRING); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 20: +#line 293 "parser.y" + { + (yyval) = NNEW(n_USE); + NMORE((yyvsp[(2) - (2)]), (yyvsp[(1) - (2)])); + (yyval)->appendChild((yyvsp[(2) - (2)])); + (yyval)->appendChild(NNEW(n_EMPTY)); + ;} + break; + + case 21: +#line 299 "parser.y" + { + (yyval) = NNEW(n_USE); + NMORE((yyvsp[(2) - (4)]), (yyvsp[(1) - (4)])); + (yyval)->appendChild((yyvsp[(2) - (4)])); + NTYPE((yyvsp[(4) - (4)]), n_STRING); + (yyval)->appendChild((yyvsp[(4) - (4)])); + ;} + break; + + case 22: +#line 309 "parser.y" + { + NMORE((yyval), (yyvsp[(5) - (5)])); + (yyval)->appendChild( + NNEW(n_CONSTANT_DECLARATION) + ->appendChild(NTYPE((yyvsp[(3) - (5)]), n_STRING)) + ->appendChild((yyvsp[(5) - (5)]))); + ;} + break; + + case 23: +#line 316 "parser.y" + { + NSPAN((yyval), n_CONSTANT_DECLARATION_LIST, (yyvsp[(4) - (4)])); + (yyval)->appendChild( + NNEW(n_CONSTANT_DECLARATION) + ->appendChild(NTYPE((yyvsp[(2) - (4)]), n_STRING)) + ->appendChild((yyvsp[(4) - (4)]))); + ;} + break; + + case 24: +#line 326 "parser.y" + { + (yyval) = (yyvsp[(1) - (2)])->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 25: +#line 329 "parser.y" + { + (yyval) = NNEW(n_STATEMENT_LIST); + ;} + break; + + case 29: +#line 338 "parser.y" + { + (yyvsp[(1) - (4)]) = NSPAN((yyvsp[(1) - (4)]), n_HALT_COMPILER, (yyvsp[(3) - (4)])); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (4)])); + NMORE((yyval), (yyvsp[(4) - (4)])); + ;} + break; + + case 31: +#line 347 "parser.y" + { + NTYPE((yyvsp[(1) - (2)]), n_STRING); + (yyval) = NNEW(n_LABEL); + (yyval)->appendChild((yyvsp[(1) - (2)])); + NMORE((yyval), (yyvsp[(2) - (2)])); + ;} + break; + + case 32: +#line 353 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_OPEN_TAG); + ;} + break; + + case 33: +#line 356 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_OPEN_TAG); + ;} + break; + + case 34: +#line 359 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_CLOSE_TAG); + ;} + break; + + case 35: +#line 365 "parser.y" + { + (yyval) = NEXPAND((yyvsp[(1) - (3)]), (yyvsp[(2) - (3)]), (yyvsp[(3) - (3)])); + ;} + break; + + case 36: +#line 368 "parser.y" + { + (yyval) = NNEW(n_CONDITION_LIST); + + (yyvsp[(1) - (7)]) = NTYPE((yyvsp[(1) - (7)]), n_IF); + (yyvsp[(1) - (7)])->appendChild(NSPAN((yyvsp[(2) - (7)]), n_CONTROL_CONDITION, (yyvsp[(4) - (7)]))->appendChild((yyvsp[(3) - (7)]))); + (yyvsp[(1) - (7)])->appendChild((yyvsp[(5) - (7)])); + + (yyval)->appendChild((yyvsp[(1) - (7)])); + (yyval)->appendChildren((yyvsp[(6) - (7)])); + + // Hacks: merge a list of if (x) { } else if (y) { } into a single condition + // list instead of a condition tree. + + if ((yyvsp[(7) - (7)])->type == n_EMPTY) { + // Ignore. + } else if ((yyvsp[(7) - (7)])->type == n_ELSE) { + xhpast::Node *stype = (yyvsp[(7) - (7)])->firstChild()->firstChild(); + if (stype && stype->type == n_CONDITION_LIST) { + NTYPE(stype->firstChild(), n_ELSEIF); + stype->firstChild()->l_tok = (yyvsp[(7) - (7)])->l_tok; + (yyval)->appendChildren(stype); + } else { + (yyval)->appendChild((yyvsp[(7) - (7)])); + } + } else { + (yyval)->appendChild((yyvsp[(7) - (7)])); + } + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyval)); + ;} + break; + + case 37: +#line 402 "parser.y" + { + + (yyval) = NNEW(n_CONDITION_LIST); + NTYPE((yyvsp[(1) - (10)]), n_IF); + (yyvsp[(1) - (10)])->appendChild(NSPAN((yyvsp[(2) - (10)]), n_CONTROL_CONDITION, (yyvsp[(4) - (10)]))->appendChild((yyvsp[(3) - (10)]))); + (yyvsp[(1) - (10)])->appendChild((yyvsp[(6) - (10)])); + + (yyval)->appendChild((yyvsp[(1) - (10)])); + (yyval)->appendChildren((yyvsp[(7) - (10)])); + (yyval)->appendChild((yyvsp[(8) - (10)])); + NMORE((yyval), (yyvsp[(9) - (10)])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyval)); + NMORE((yyval), (yyvsp[(10) - (10)])); + ;} + break; + + case 38: +#line 417 "parser.y" + { + NTYPE((yyvsp[(1) - (5)]), n_WHILE); + (yyvsp[(1) - (5)])->appendChild(NSPAN((yyvsp[(2) - (5)]), n_CONTROL_CONDITION, (yyvsp[(4) - (5)]))->appendChild((yyvsp[(3) - (5)]))); + (yyvsp[(1) - (5)])->appendChild((yyvsp[(5) - (5)])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (5)])); + ;} + break; + + case 39: +#line 424 "parser.y" + { + NTYPE((yyvsp[(1) - (7)]), n_DO_WHILE); + (yyvsp[(1) - (7)])->appendChild((yyvsp[(2) - (7)])); + (yyvsp[(1) - (7)])->appendChild(NSPAN((yyvsp[(4) - (7)]), n_CONTROL_CONDITION, (yyvsp[(6) - (7)]))->appendChild((yyvsp[(5) - (7)]))); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (7)])); + NMORE((yyval), (yyvsp[(7) - (7)])); + ;} + break; + + case 40: +#line 432 "parser.y" + { + NTYPE((yyvsp[(1) - (9)]), n_FOR); + + NSPAN((yyvsp[(2) - (9)]), n_FOR_EXPRESSION, (yyvsp[(8) - (9)])) + ->appendChild((yyvsp[(3) - (9)])) + ->appendChild((yyvsp[(5) - (9)])) + ->appendChild((yyvsp[(7) - (9)])); + + (yyvsp[(1) - (9)])->appendChild((yyvsp[(2) - (9)])); + (yyvsp[(1) - (9)])->appendChild((yyvsp[(9) - (9)])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (9)])); + ;} + break; + + case 41: +#line 445 "parser.y" + { + NTYPE((yyvsp[(1) - (5)]), n_SWITCH); + (yyvsp[(1) - (5)])->appendChild(NSPAN((yyvsp[(2) - (5)]), n_CONTROL_CONDITION, (yyvsp[(4) - (5)]))->appendChild((yyvsp[(3) - (5)]))); + (yyvsp[(1) - (5)])->appendChild((yyvsp[(5) - (5)])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (5)])); + ;} + break; + + case 42: +#line 452 "parser.y" + { + NTYPE((yyvsp[(1) - (2)]), n_BREAK); + (yyvsp[(1) - (2)])->appendChild(NNEW(n_EMPTY)); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (2)])); + NMORE((yyval), (yyvsp[(2) - (2)])); + ;} + break; + + case 43: +#line 459 "parser.y" + { + NTYPE((yyvsp[(1) - (3)]), n_BREAK); + (yyvsp[(1) - (3)])->appendChild((yyvsp[(2) - (3)])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (3)])); + NMORE((yyval), (yyvsp[(3) - (3)])); + ;} + break; + + case 44: +#line 466 "parser.y" + { + NTYPE((yyvsp[(1) - (2)]), n_CONTINUE); + (yyvsp[(1) - (2)])->appendChild(NNEW(n_EMPTY)); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (2)])); + NMORE((yyval), (yyvsp[(2) - (2)])); + ;} + break; + + case 45: +#line 473 "parser.y" + { + NTYPE((yyvsp[(1) - (3)]), n_CONTINUE); + (yyvsp[(1) - (3)])->appendChild((yyvsp[(2) - (3)])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (3)])); + NMORE((yyval), (yyvsp[(3) - (3)])); + ;} + break; + + case 46: +#line 480 "parser.y" + { + NTYPE((yyvsp[(1) - (2)]), n_RETURN); + (yyvsp[(1) - (2)])->appendChild(NNEW(n_EMPTY)); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (2)])); + NMORE((yyval), (yyvsp[(2) - (2)])); + ;} + break; + + case 47: +#line 487 "parser.y" + { + NTYPE((yyvsp[(1) - (3)]), n_RETURN); + (yyvsp[(1) - (3)])->appendChild((yyvsp[(2) - (3)])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (3)])); + NMORE((yyval), (yyvsp[(3) - (3)])); + ;} + break; + + case 48: +#line 494 "parser.y" + { + NTYPE((yyvsp[(1) - (3)]), n_RETURN); + (yyvsp[(1) - (3)])->appendChild((yyvsp[(2) - (3)])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (3)])); + NMORE((yyval), (yyvsp[(3) - (3)])); + ;} + break; + + case 49: +#line 501 "parser.y" + { + NMORE((yyvsp[(2) - (3)]), (yyvsp[(1) - (3)])); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(2) - (3)])); + NMORE((yyval), (yyvsp[(3) - (3)])); + ;} + break; + + case 50: +#line 506 "parser.y" + { + NMORE((yyvsp[(2) - (3)]), (yyvsp[(1) - (3)])); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(2) - (3)])); + NMORE((yyval), (yyvsp[(3) - (3)])); + ;} + break; + + case 51: +#line 511 "parser.y" + { + NMORE((yyvsp[(2) - (3)]), (yyvsp[(1) - (3)])); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(2) - (3)])); + NMORE((yyval), (yyvsp[(3) - (3)])); + ;} + break; + + case 52: +#line 516 "parser.y" + { + NTYPE((yyvsp[(1) - (1)]), n_INLINE_HTML); + (yyval) = (yyvsp[(1) - (1)]); + ;} + break; + + case 53: +#line 520 "parser.y" + { + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (2)])); + NMORE((yyval), (yyvsp[(2) - (2)])); + ;} + break; + + case 54: +#line 524 "parser.y" + { + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (2)])); + NMORE((yyval), (yyvsp[(2) - (2)])); + ;} + break; + + case 55: +#line 528 "parser.y" + { + NMORE((yyvsp[(3) - (5)]), (yyvsp[(4) - (5)])); + NMORE((yyvsp[(3) - (5)]), (yyvsp[(1) - (5)])); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(3) - (5)])); + NMORE((yyval), (yyvsp[(5) - (5)])); + ;} + break; + + case 56: +#line 535 "parser.y" + { + NTYPE((yyvsp[(1) - (8)]), n_FOREACH); + NSPAN((yyvsp[(2) - (8)]), n_FOREACH_EXPRESSION, (yyvsp[(7) - (8)])); + (yyvsp[(2) - (8)])->appendChild((yyvsp[(3) - (8)])); + if ((yyvsp[(6) - (8)])->type == n_EMPTY) { + (yyvsp[(2) - (8)])->appendChild((yyvsp[(6) - (8)])); + (yyvsp[(2) - (8)])->appendChild((yyvsp[(5) - (8)])); + } else { + (yyvsp[(2) - (8)])->appendChild((yyvsp[(5) - (8)])); + (yyvsp[(2) - (8)])->appendChild((yyvsp[(6) - (8)])); + } + (yyvsp[(1) - (8)])->appendChild((yyvsp[(2) - (8)])); + + (yyvsp[(1) - (8)])->appendChild((yyvsp[(8) - (8)])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (8)])); + ;} + break; + + case 57: +#line 553 "parser.y" + { + NTYPE((yyvsp[(1) - (8)]), n_FOREACH); + NSPAN((yyvsp[(2) - (8)]), n_FOREACH_EXPRESSION, (yyvsp[(7) - (8)])); + (yyvsp[(2) - (8)])->appendChild((yyvsp[(3) - (8)])); + if ((yyvsp[(6) - (8)])->type == n_EMPTY) { + (yyvsp[(2) - (8)])->appendChild((yyvsp[(6) - (8)])); + (yyvsp[(2) - (8)])->appendChild((yyvsp[(5) - (8)])); + } else { + (yyvsp[(2) - (8)])->appendChild((yyvsp[(5) - (8)])); + (yyvsp[(2) - (8)])->appendChild((yyvsp[(6) - (8)])); + } + (yyvsp[(1) - (8)])->appendChild((yyvsp[(2) - (8)])); + (yyvsp[(1) - (8)])->appendChild((yyvsp[(8) - (8)])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (8)])); + ;} + break; + + case 58: +#line 569 "parser.y" + { + NTYPE((yyvsp[(1) - (5)]), n_DECLARE); + (yyvsp[(1) - (5)])->appendChild((yyvsp[(3) - (5)])); + (yyvsp[(1) - (5)])->appendChild((yyvsp[(5) - (5)])); + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (5)])); + ;} + break; + + case 59: +#line 575 "parser.y" + { + (yyval) = NNEW(n_STATEMENT)->appendChild(NNEW(n_EMPTY)); + NMORE((yyval), (yyvsp[(1) - (1)])); + ;} + break; + + case 60: +#line 579 "parser.y" + { + NTYPE((yyvsp[(1) - (6)]), n_TRY); + (yyvsp[(1) - (6)])->appendChild(NEXPAND((yyvsp[(2) - (6)]), (yyvsp[(3) - (6)]), (yyvsp[(4) - (6)]))); + + (yyvsp[(1) - (6)])->appendChild((yyvsp[(5) - (6)])); + (yyvsp[(1) - (6)])->appendChild((yyvsp[(6) - (6)])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (6)])); + ;} + break; + + case 61: +#line 588 "parser.y" + { + NTYPE((yyvsp[(1) - (5)]), n_TRY); + (yyvsp[(1) - (5)])->appendChild(NEXPAND((yyvsp[(2) - (5)]), (yyvsp[(3) - (5)]), (yyvsp[(4) - (5)]))); + + (yyvsp[(1) - (5)])->appendChild(NNEW(n_CATCH_LIST)); + (yyvsp[(1) - (5)])->appendChild((yyvsp[(5) - (5)])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (5)])); + ;} + break; + + case 62: +#line 597 "parser.y" + { + NTYPE((yyvsp[(1) - (3)]), n_THROW); + (yyvsp[(1) - (3)])->appendChild((yyvsp[(2) - (3)])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (3)])); + NMORE((yyval), (yyvsp[(3) - (3)])); + + ;} + break; + + case 63: +#line 605 "parser.y" + { + NTYPE((yyvsp[(1) - (3)]), n_GOTO); + NTYPE((yyvsp[(2) - (3)]), n_STRING); + (yyvsp[(1) - (3)])->appendChild((yyvsp[(2) - (3)])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (3)])); + NMORE((yyval), (yyvsp[(3) - (3)])); + ;} + break; + + case 64: +#line 616 "parser.y" + { + (yyvsp[(1) - (2)])->appendChild((yyvsp[(2) - (2)])); + (yyval) = (yyvsp[(1) - (2)]); + ;} + break; + + case 65: +#line 620 "parser.y" + { + (yyval) = NNEW(n_CATCH_LIST); + (yyval)->appendChild((yyvsp[(1) - (1)])); +;} + break; + + case 66: +#line 627 "parser.y" + { + NTYPE((yyvsp[(1) - (8)]), n_CATCH); + (yyvsp[(1) - (8)])->appendChild((yyvsp[(3) - (8)])); + (yyvsp[(1) - (8)])->appendChild(NTYPE((yyvsp[(4) - (8)]), n_VARIABLE)); + (yyvsp[(1) - (8)])->appendChild(NEXPAND((yyvsp[(6) - (8)]), (yyvsp[(7) - (8)]), (yyvsp[(8) - (8)]))); + NMORE((yyvsp[(1) - (8)]), (yyvsp[(8) - (8)])); + (yyval) = (yyvsp[(1) - (8)]); + ;} + break; + + case 67: +#line 638 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 69: +#line 645 "parser.y" + { + NTYPE((yyvsp[(1) - (4)]), n_FINALLY); + (yyvsp[(1) - (4)])->appendChild((yyvsp[(3) - (4)])); + NMORE((yyvsp[(1) - (4)]), (yyvsp[(4) - (4)])); + (yyval) = (yyvsp[(1) - (4)]); + ;} + break; + + case 70: +#line 654 "parser.y" + { + (yyval) = NNEW(n_UNSET_LIST); + (yyval)->appendChild((yyvsp[(1) - (1)])); + ;} + break; + + case 71: +#line 658 "parser.y" + { + (yyvsp[(1) - (3)])->appendChild((yyvsp[(3) - (3)])); + (yyval) = (yyvsp[(1) - (3)]); + ;} + break; + + case 75: +#line 677 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 76: +#line 680 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_REFERENCE); + ;} + break; + + case 77: +#line 687 "parser.y" + { + NSPAN((yyvsp[(1) - (10)]), n_FUNCTION_DECLARATION, (yyvsp[(9) - (10)])); + (yyvsp[(1) - (10)])->appendChild(NNEW(n_EMPTY)); + (yyvsp[(1) - (10)])->appendChild((yyvsp[(2) - (10)])); + (yyvsp[(1) - (10)])->appendChild(NTYPE((yyvsp[(3) - (10)]), n_STRING)); + (yyvsp[(1) - (10)])->appendChild(NEXPAND((yyvsp[(4) - (10)]), (yyvsp[(5) - (10)]), (yyvsp[(6) - (10)]))); + (yyvsp[(1) - (10)])->appendChild(NNEW(n_EMPTY)); + (yyvsp[(1) - (10)])->appendChild((yyvsp[(7) - (10)])); + (yyvsp[(1) - (10)])->appendChild(NEXPAND((yyvsp[(8) - (10)]), (yyvsp[(9) - (10)]), (yyvsp[(10) - (10)]))); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (10)])); + ;} + break; + + case 78: +#line 703 "parser.y" + { + (yyval) = NNEW(n_CLASS_DECLARATION); + (yyval)->appendChild((yyvsp[(1) - (7)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (7)]), n_CLASS_NAME)); + (yyval)->appendChild((yyvsp[(3) - (7)])); + (yyval)->appendChild((yyvsp[(4) - (7)])); + (yyval)->appendChild(NEXPAND((yyvsp[(5) - (7)]), (yyvsp[(6) - (7)]), (yyvsp[(7) - (7)]))); + NMORE((yyval), (yyvsp[(7) - (7)])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyval)); + ;} + break; + + case 79: +#line 714 "parser.y" + { + (yyval) = NNEW(n_INTERFACE_DECLARATION); + (yyval)->appendChild(NNEW(n_CLASS_ATTRIBUTES)); + NMORE((yyval), (yyvsp[(1) - (6)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (6)]), n_CLASS_NAME)); + (yyval)->appendChild((yyvsp[(3) - (6)])); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild(NEXPAND((yyvsp[(4) - (6)]), (yyvsp[(5) - (6)]), (yyvsp[(6) - (6)]))); + NMORE((yyval), (yyvsp[(6) - (6)])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyval)); + ;} + break; + + case 80: +#line 729 "parser.y" + { + NTYPE((yyvsp[(1) - (1)]), n_CLASS_ATTRIBUTES); + (yyval) = (yyvsp[(1) - (1)]); + ;} + break; + + case 81: +#line 733 "parser.y" + { + NTYPE((yyvsp[(2) - (2)]), n_CLASS_ATTRIBUTES); + NMORE((yyvsp[(2) - (2)]), (yyvsp[(1) - (2)])); + (yyvsp[(2) - (2)])->appendChild(NTYPE((yyvsp[(1) - (2)]), n_STRING)); + + (yyval) = (yyvsp[(2) - (2)]); + ;} + break; + + case 82: +#line 740 "parser.y" + { + NTYPE((yyvsp[(2) - (2)]), n_CLASS_ATTRIBUTES); + NMORE((yyvsp[(2) - (2)]), (yyvsp[(1) - (2)])); + (yyvsp[(2) - (2)])->appendChild(NTYPE((yyvsp[(1) - (2)]), n_STRING)); + + (yyval) = (yyvsp[(2) - (2)]); + ;} + break; + + case 83: +#line 747 "parser.y" + { + (yyval) = NNEW(n_CLASS_ATTRIBUTES); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (1)]), n_STRING)); + ;} + break; + + case 84: +#line 754 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 85: +#line 757 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (2)]), n_EXTENDS_LIST)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 87: +#line 767 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 88: +#line 770 "parser.y" + { + NTYPE((yyvsp[(1) - (2)]), n_EXTENDS_LIST); + (yyvsp[(1) - (2)])->appendChildren((yyvsp[(2) - (2)])); + (yyval) = (yyvsp[(1) - (2)]); + ;} + break; + + case 89: +#line 778 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 90: +#line 781 "parser.y" + { + NTYPE((yyvsp[(1) - (2)]), n_IMPLEMENTS_LIST); + (yyvsp[(1) - (2)])->appendChildren((yyvsp[(2) - (2)])); + (yyval) = (yyvsp[(1) - (2)]); + ;} + break; + + case 91: +#line 789 "parser.y" + { + (yyval) = NNEW(n_IMPLEMENTS_LIST)->appendChild((yyvsp[(1) - (1)])); + ;} + break; + + case 92: +#line 792 "parser.y" + { + (yyval) = (yyvsp[(1) - (3)])->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 93: +#line 798 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 94: +#line 801 "parser.y" + { + (yyval) = (yyvsp[(2) - (2)]); + ;} + break; + + case 96: +#line 808 "parser.y" + { + NTYPE((yyvsp[(1) - (2)]), n_VARIABLE_REFERENCE); + (yyvsp[(1) - (2)])->appendChild((yyvsp[(2) - (2)])); + (yyval) = (yyvsp[(1) - (2)]); + ;} + break; + + case 98: +#line 817 "parser.y" + { + NMORE((yyvsp[(2) - (4)]), (yyvsp[(1) - (4)])); + NMORE((yyvsp[(2) - (4)]), (yyvsp[(4) - (4)])); + (yyval) = (yyvsp[(2) - (4)]); + ;} + break; + + case 100: +#line 826 "parser.y" + { + NMORE((yyvsp[(2) - (4)]), (yyvsp[(1) - (4)])); + NMORE((yyvsp[(2) - (4)]), (yyvsp[(4) - (4)])); + (yyval) = (yyvsp[(2) - (4)]); + ;} + break; + + case 102: +#line 835 "parser.y" + { + NMORE((yyvsp[(2) - (4)]), (yyvsp[(1) - (4)])); + NMORE((yyvsp[(2) - (4)]), (yyvsp[(4) - (4)])); + (yyval) = (yyvsp[(2) - (4)]); + ;} + break; + + case 103: +#line 843 "parser.y" + { + (yyval) = NNEW(n_DECLARE_DECLARATION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (3)]), n_STRING)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + (yyval) = NNEW(n_DECLARE_DECLARATION_LIST)->appendChild((yyval)); + ;} + break; + + case 104: +#line 849 "parser.y" + { + (yyval) = NNEW(n_DECLARE_DECLARATION); + (yyval)->appendChild(NTYPE((yyvsp[(3) - (5)]), n_STRING)); + (yyval)->appendChild((yyvsp[(5) - (5)])); + + (yyvsp[(1) - (5)])->appendChild((yyval)); + (yyval) = (yyvsp[(1) - (5)]); + ;} + break; + + case 105: +#line 860 "parser.y" + { + (yyval) = NEXPAND((yyvsp[(1) - (3)]), (yyvsp[(2) - (3)]), (yyvsp[(3) - (3)])); + ;} + break; + + case 106: +#line 863 "parser.y" + { + // ...why does this rule exist? + + NTYPE((yyvsp[(2) - (4)]), n_STATEMENT); + (yyvsp[(1) - (4)])->appendChild(NNEW(n_EMPTY)); + + (yyval) = NNEW(n_STATEMENT_LIST)->appendChild((yyvsp[(2) - (4)])); + (yyval)->appendChildren((yyvsp[(3) - (4)])); + NEXPAND((yyvsp[(1) - (4)]), (yyval), (yyvsp[(4) - (4)])); + ;} + break; + + case 107: +#line 873 "parser.y" + { + NMORE((yyvsp[(2) - (4)]), (yyvsp[(4) - (4)])); + NMORE((yyvsp[(2) - (4)]), (yyvsp[(1) - (4)])); + (yyval) = (yyvsp[(2) - (4)]); + ;} + break; + + case 108: +#line 878 "parser.y" + { + NTYPE((yyvsp[(2) - (5)]), n_STATEMENT); + (yyvsp[(1) - (5)])->appendChild(NNEW(n_EMPTY)); + + (yyval) = NNEW(n_STATEMENT_LIST)->appendChild((yyvsp[(2) - (5)])); + (yyval)->appendChildren((yyvsp[(3) - (5)])); + NMORE((yyval), (yyvsp[(5) - (5)])); + NMORE((yyval), (yyvsp[(1) - (5)])); + ;} + break; + + case 109: +#line 890 "parser.y" + { + (yyval) = NNEW(n_STATEMENT_LIST); + ;} + break; + + case 110: +#line 893 "parser.y" + { + NTYPE((yyvsp[(2) - (5)]), n_CASE); + (yyvsp[(2) - (5)])->appendChild((yyvsp[(3) - (5)])); + (yyvsp[(2) - (5)])->appendChild((yyvsp[(5) - (5)])); + + (yyvsp[(1) - (5)])->appendChild((yyvsp[(2) - (5)])); + (yyval) = (yyvsp[(1) - (5)]); + ;} + break; + + case 111: +#line 901 "parser.y" + { + NTYPE((yyvsp[(2) - (4)]), n_DEFAULT); + (yyvsp[(2) - (4)])->appendChild((yyvsp[(4) - (4)])); + + (yyvsp[(1) - (4)])->appendChild((yyvsp[(2) - (4)])); + (yyval) = (yyvsp[(1) - (4)]); + ;} + break; + + case 115: +#line 917 "parser.y" + { + NMORE((yyvsp[(2) - (4)]), (yyvsp[(4) - (4)])); + NMORE((yyvsp[(2) - (4)]), (yyvsp[(1) - (4)])); + (yyval) = (yyvsp[(2) - (4)]); + ;} + break; + + case 116: +#line 925 "parser.y" + { + (yyval) = NNEW(n_CONDITION_LIST); + ;} + break; + + case 117: +#line 928 "parser.y" + { + NTYPE((yyvsp[(2) - (6)]), n_ELSEIF); + (yyvsp[(2) - (6)])->appendChild(NSPAN((yyvsp[(3) - (6)]), n_CONTROL_CONDITION, (yyvsp[(5) - (6)]))->appendChild((yyvsp[(4) - (6)]))); + (yyvsp[(2) - (6)])->appendChild((yyvsp[(6) - (6)])); + + (yyval) = (yyvsp[(1) - (6)])->appendChild((yyvsp[(2) - (6)])); + ;} + break; + + case 118: +#line 938 "parser.y" + { + (yyval) = NNEW(n_CONDITION_LIST); + ;} + break; + + case 119: +#line 941 "parser.y" + { + NTYPE((yyvsp[(2) - (7)]), n_ELSEIF); + (yyvsp[(2) - (7)])->appendChild((yyvsp[(4) - (7)])); + (yyvsp[(2) - (7)])->appendChild((yyvsp[(7) - (7)])); + + (yyval) = (yyvsp[(1) - (7)])->appendChild((yyvsp[(2) - (7)])); + ;} + break; + + case 120: +#line 951 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 121: +#line 954 "parser.y" + { + NTYPE((yyvsp[(1) - (2)]), n_ELSE); + (yyvsp[(1) - (2)])->appendChild((yyvsp[(2) - (2)])); + (yyval) = (yyvsp[(1) - (2)]); + ;} + break; + + case 122: +#line 962 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 123: +#line 965 "parser.y" + { + NTYPE((yyvsp[(1) - (3)]), n_ELSE); + (yyvsp[(1) - (3)])->appendChild((yyvsp[(3) - (3)])); + (yyval) = (yyvsp[(1) - (3)]); + ;} + break; + + case 125: +#line 974 "parser.y" + { + (yyval) = NNEW(n_DECLARATION_PARAMETER_LIST); + ;} + break; + + case 126: +#line 980 "parser.y" + { + (yyval) = NNEW(n_DECLARATION_PARAMETER); + (yyval)->appendChild((yyvsp[(1) - (2)])); + (yyval)->appendChild((yyvsp[(2) - (2)])); + (yyval)->appendChild(NNEW(n_EMPTY)); + + (yyval) = NNEW(n_DECLARATION_PARAMETER_LIST)->appendChild((yyval)); + ;} + break; + + case 127: +#line 988 "parser.y" + { + (yyval) = NNEW(n_DECLARATION_PARAMETER); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_VARIABLE_REFERENCE)); + (yyvsp[(2) - (3)])->appendChild((yyvsp[(3) - (3)])); + (yyval)->appendChild(NNEW(n_EMPTY)); + + (yyval) = NNEW(n_DECLARATION_PARAMETER_LIST)->appendChild((yyval)); + ;} + break; + + case 128: +#line 997 "parser.y" + { + (yyval) = NNEW(n_DECLARATION_PARAMETER); + (yyval)->appendChild((yyvsp[(1) - (5)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (5)]), n_VARIABLE_REFERENCE)); + (yyvsp[(2) - (5)])->appendChild((yyvsp[(3) - (5)])); + (yyval)->appendChild((yyvsp[(5) - (5)])); + + (yyval) = NNEW(n_DECLARATION_PARAMETER_LIST)->appendChild((yyval)); + ;} + break; + + case 129: +#line 1006 "parser.y" + { + (yyval) = NNEW(n_DECLARATION_PARAMETER); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild((yyvsp[(2) - (4)])); + (yyval)->appendChild((yyvsp[(4) - (4)])); + + (yyval) = NNEW(n_DECLARATION_PARAMETER_LIST)->appendChild((yyval)); + ;} + break; + + case 130: +#line 1014 "parser.y" + { + (yyval) = NNEW(n_DECLARATION_PARAMETER); + (yyval)->appendChild((yyvsp[(3) - (4)])); + (yyval)->appendChild((yyvsp[(4) - (4)])); + (yyval)->appendChild(NNEW(n_EMPTY)); + + (yyval) = (yyvsp[(1) - (4)])->appendChild((yyval)); + ;} + break; + + case 131: +#line 1022 "parser.y" + { + (yyval) = NNEW(n_DECLARATION_PARAMETER); + (yyval)->appendChild((yyvsp[(3) - (5)])); + (yyval)->appendChild(NTYPE((yyvsp[(4) - (5)]), n_VARIABLE_REFERENCE)); + (yyvsp[(4) - (5)])->appendChild((yyvsp[(5) - (5)])); + (yyval)->appendChild(NNEW(n_EMPTY)); + + (yyval) = (yyvsp[(1) - (5)])->appendChild((yyval)); + ;} + break; + + case 132: +#line 1032 "parser.y" + { + (yyval) = NNEW(n_DECLARATION_PARAMETER); + (yyval)->appendChild((yyvsp[(3) - (7)])); + (yyval)->appendChild(NTYPE((yyvsp[(4) - (7)]), n_VARIABLE_REFERENCE)); + (yyvsp[(4) - (7)])->appendChild((yyvsp[(5) - (7)])); + (yyval)->appendChild((yyvsp[(7) - (7)])); + + (yyval) = (yyvsp[(1) - (7)])->appendChild((yyval)); + ;} + break; + + case 133: +#line 1042 "parser.y" + { + (yyval) = NNEW(n_DECLARATION_PARAMETER); + (yyval)->appendChild((yyvsp[(3) - (6)])); + (yyval)->appendChild((yyvsp[(4) - (6)])); + (yyval)->appendChild((yyvsp[(6) - (6)])); + + (yyval) = (yyvsp[(1) - (6)])->appendChild((yyval)); + ;} + break; + + case 134: +#line 1053 "parser.y" + { + NTYPE((yyvsp[(1) - (2)]), n_UNPACK); + (yyval) = (yyvsp[(1) - (2)])->appendChild(NTYPE((yyvsp[(2) - (2)]), n_VARIABLE)); + ;} + break; + + case 135: +#line 1057 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_VARIABLE); + ;} + break; + + case 136: +#line 1063 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 138: +#line 1067 "parser.y" + { + (yyval) = NNEW(n_NULLABLE_TYPE); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 139: +#line 1074 "parser.y" + { + (yyval) = (yyvsp[(1) - (1)]); + ;} + break; + + case 140: +#line 1077 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_TYPE_NAME); + ;} + break; + + case 141: +#line 1080 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_TYPE_NAME); + ;} + break; + + case 142: +#line 1086 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 143: +#line 1089 "parser.y" + { + (yyval) = NNEW(n_DECLARATION_RETURN); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 145: +#line 1097 "parser.y" + { + (yyval) = NNEW(n_CALL_PARAMETER_LIST); + ;} + break; + + case 146: +#line 1103 "parser.y" + { + (yyval) = NNEW(n_CALL_PARAMETER_LIST)->appendChild((yyvsp[(1) - (1)])); + ;} + break; + + case 147: +#line 1106 "parser.y" + { + (yyval) = (yyvsp[(1) - (3)])->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 149: +#line 1113 "parser.y" + { + NTYPE((yyvsp[(1) - (2)]), n_UNPACK); + (yyval) = (yyvsp[(1) - (2)])->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 150: +#line 1117 "parser.y" + { + NTYPE((yyvsp[(1) - (2)]), n_VARIABLE_REFERENCE); + (yyval) = (yyvsp[(1) - (2)])->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 151: +#line 1124 "parser.y" + { + (yyvsp[(1) - (3)])->appendChild((yyvsp[(3) - (3)])); + (yyval) = (yyvsp[(1) - (3)]); + ;} + break; + + case 152: +#line 1128 "parser.y" + { + (yyval) = NNEW(n_GLOBAL_DECLARATION_LIST); + (yyval)->appendChild((yyvsp[(1) - (1)])); + ;} + break; + + case 153: +#line 1135 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_VARIABLE); + ;} + break; + + case 154: +#line 1138 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (2)]), n_VARIABLE_VARIABLE); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 155: +#line 1142 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (4)]), n_VARIABLE_VARIABLE); + (yyval)->appendChild((yyvsp[(3) - (4)])); + ;} + break; + + case 156: +#line 1149 "parser.y" + { + NTYPE((yyvsp[(3) - (3)]), n_VARIABLE); + (yyval) = NNEW(n_STATIC_DECLARATION); + (yyval)->appendChild((yyvsp[(3) - (3)])); + (yyval)->appendChild(NNEW(n_EMPTY)); + + (yyval) = (yyvsp[(1) - (3)])->appendChild((yyval)); + ;} + break; + + case 157: +#line 1157 "parser.y" + { + NTYPE((yyvsp[(3) - (5)]), n_VARIABLE); + (yyval) = NNEW(n_STATIC_DECLARATION); + (yyval)->appendChild((yyvsp[(3) - (5)])); + (yyval)->appendChild((yyvsp[(5) - (5)])); + + (yyval) = (yyvsp[(1) - (5)])->appendChild((yyval)); + ;} + break; + + case 158: +#line 1165 "parser.y" + { + NTYPE((yyvsp[(1) - (1)]), n_VARIABLE); + (yyval) = NNEW(n_STATIC_DECLARATION); + (yyval)->appendChild((yyvsp[(1) - (1)])); + (yyval)->appendChild(NNEW(n_EMPTY)); + + (yyval) = NNEW(n_STATIC_DECLARATION_LIST)->appendChild((yyval)); + ;} + break; + + case 159: +#line 1173 "parser.y" + { + NTYPE((yyvsp[(1) - (3)]), n_VARIABLE); + (yyval) = NNEW(n_STATIC_DECLARATION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild((yyvsp[(3) - (3)])); + + (yyval) = NNEW(n_STATIC_DECLARATION_LIST)->appendChild((yyval)); + ;} + break; + + case 160: +#line 1184 "parser.y" + { + (yyval) = (yyvsp[(1) - (2)])->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 161: +#line 1187 "parser.y" + { + (yyval) = NNEW(n_STATEMENT_LIST); + ;} + break; + + case 162: +#line 1193 "parser.y" + { + (yyval) = NNEW(n_CLASS_MEMBER_DECLARATION_LIST); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChildren((yyvsp[(2) - (3)])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyval)); + NMORE((yyval), (yyvsp[(3) - (3)])); + ;} + break; + + case 163: +#line 1201 "parser.y" + { + (yyval) = NNEW(n_STATEMENT)->appendChild((yyvsp[(1) - (2)])); + NMORE((yyval), (yyvsp[(2) - (2)])); + ;} + break; + + case 164: +#line 1205 "parser.y" + { + (yyval) = (yyvsp[(1) - (1)]); + ;} + break; + + case 165: +#line 1208 "parser.y" + { + /* empty */ + ;} + break; + + case 166: +#line 1210 "parser.y" + { + (yyval) = NNEW(n_METHOD_DECLARATION); + NMORE((yyval), (yyvsp[(2) - (10)])); + (yyval)->appendChild((yyvsp[(1) - (10)])); + (yyval)->appendChild((yyvsp[(4) - (10)])); + (yyval)->appendChild(NTYPE((yyvsp[(5) - (10)]), n_STRING)); + (yyval)->appendChild(NEXPAND((yyvsp[(6) - (10)]), (yyvsp[(7) - (10)]), (yyvsp[(8) - (10)]))); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild((yyvsp[(9) - (10)])); + (yyval)->appendChild((yyvsp[(10) - (10)])); + + (yyval) = NNEW(n_STATEMENT)->appendChild((yyval)); + ;} + break; + + case 167: +#line 1226 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (3)]), n_TRAIT_USE); + (yyval)->appendChildren((yyvsp[(2) - (3)])); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 168: +#line 1234 "parser.y" + { + (yyval) = NNEW(n_TRAIT_USE_LIST)->appendChild((yyvsp[(1) - (1)])); + ;} + break; + + case 169: +#line 1237 "parser.y" + { + (yyval) = (yyvsp[(1) - (3)])->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 170: +#line 1243 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 171: +#line 1246 "parser.y" + { + (yyval) = NEXPAND((yyvsp[(1) - (3)]), (yyvsp[(2) - (3)]), (yyvsp[(3) - (3)])); + ;} + break; + + case 172: +#line 1252 "parser.y" + { + (yyval) = NNEW(n_TRAIT_ADAPTATION_LIST); + ;} + break; + + case 173: +#line 1255 "parser.y" + { + (yyval) = (yyvsp[(1) - (1)]); + ;} + break; + + case 174: +#line 1261 "parser.y" + { + (yyval) = NNEW(n_TRAIT_ADAPTATION_LIST); + (yyval)->appendChild((yyvsp[(1) - (1)])); + ;} + break; + + case 175: +#line 1265 "parser.y" + { + (yyvsp[(1) - (2)])->appendChild((yyvsp[(2) - (2)])); + (yyval) = (yyvsp[(1) - (2)]); + ;} + break; + + case 176: +#line 1272 "parser.y" + { + (yyval) = NMORE((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)])); + ;} + break; + + case 177: +#line 1275 "parser.y" + { + (yyval) = NMORE((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)])); + ;} + break; + + case 178: +#line 1281 "parser.y" + { + (yyval) = NNEW(n_TRAIT_INSTEADOF); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 179: +#line 1289 "parser.y" + { + (yyval) = NNEW(n_TRAIT_REFERENCE_LIST); + (yyval)->appendChild((yyvsp[(1) - (1)])); + ;} + break; + + case 180: +#line 1293 "parser.y" + { + (yyvsp[(1) - (3)])->appendChild((yyvsp[(3) - (3)])); + (yyval) = (yyvsp[(1) - (3)]); + ;} + break; + + case 181: +#line 1300 "parser.y" + { + (yyval) = NNEW(n_TRAIT_METHOD_REFERENCE); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (1)]), n_STRING)); + ;} + break; + + case 182: +#line 1304 "parser.y" + { + (yyval) = (yyvsp[(1) - (1)]); + ;} + break; + + case 183: +#line 1310 "parser.y" + { + NTYPE((yyvsp[(2) - (3)]), n_TRAIT_METHOD_REFERENCE); + NEXPAND((yyvsp[(1) - (3)]), (yyvsp[(2) - (3)]), NTYPE((yyvsp[(3) - (3)]), n_STRING)); + (yyval) = (yyvsp[(2) - (3)]); + ;} + break; + + case 184: +#line 1318 "parser.y" + { + (yyval) = NNEW(n_TRAIT_AS); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild((yyvsp[(3) - (4)])); + (yyval)->appendChild(NTYPE((yyvsp[(4) - (4)]), n_STRING)); + ;} + break; + + case 185: +#line 1324 "parser.y" + { + (yyval) = NNEW(n_TRAIT_AS); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild((yyvsp[(3) - (3)])); + (yyval)->appendChild(NNEW(n_EMPTY)); + ;} + break; + + case 186: +#line 1333 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 187: +#line 1336 "parser.y" + { + (yyval) = NNEW(n_METHOD_MODIFIER_LIST); + (yyval)->appendChild((yyvsp[(1) - (1)])); + ;} + break; + + case 188: +#line 1344 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 189: +#line 1347 "parser.y" + { + (yyval) = NEXPAND((yyvsp[(1) - (3)]), (yyvsp[(2) - (3)]), (yyvsp[(3) - (3)])); + ;} + break; + + case 191: +#line 1354 "parser.y" + { + (yyval) = NNEW(n_CLASS_MEMBER_MODIFIER_LIST); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (1)]), n_STRING)); + ;} + break; + + case 192: +#line 1361 "parser.y" + { + (yyval) = NNEW(n_METHOD_MODIFIER_LIST); + ;} + break; + + case 193: +#line 1364 "parser.y" + { + NTYPE((yyvsp[(1) - (1)]), n_METHOD_MODIFIER_LIST); + (yyval) = (yyvsp[(1) - (1)]); + ;} + break; + + case 194: +#line 1371 "parser.y" + { + (yyval) = NNEW(n_CLASS_MEMBER_MODIFIER_LIST); + (yyval)->appendChild((yyvsp[(1) - (1)])); + ;} + break; + + case 195: +#line 1375 "parser.y" + { + (yyval) = (yyvsp[(1) - (2)])->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 196: +#line 1381 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_STRING); + ;} + break; + + case 203: +#line 1396 "parser.y" + { + (yyval) = NNEW(n_CLASS_MEMBER_DECLARATION); + (yyval)->appendChild(NTYPE((yyvsp[(3) - (3)]), n_VARIABLE)); + (yyval)->appendChild(NNEW(n_EMPTY)); + + (yyval) = (yyvsp[(1) - (3)])->appendChild((yyval)); + ;} + break; + + case 204: +#line 1403 "parser.y" + { + (yyval) = NNEW(n_CLASS_MEMBER_DECLARATION); + (yyval)->appendChild(NTYPE((yyvsp[(3) - (5)]), n_VARIABLE)); + (yyval)->appendChild((yyvsp[(5) - (5)])); + + (yyval) = (yyvsp[(1) - (5)])->appendChild((yyval)); + ;} + break; + + case 205: +#line 1410 "parser.y" + { + (yyval) = NNEW(n_CLASS_MEMBER_DECLARATION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (1)]), n_VARIABLE)); + (yyval)->appendChild(NNEW(n_EMPTY)); + + (yyval) = NNEW(n_CLASS_MEMBER_DECLARATION_LIST)->appendChild((yyval)); + ;} + break; + + case 206: +#line 1417 "parser.y" + { + (yyval) = NNEW(n_CLASS_MEMBER_DECLARATION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (3)]), n_VARIABLE)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + + (yyval) = NNEW(n_CLASS_MEMBER_DECLARATION_LIST)->appendChild((yyval)); + ;} + break; + + case 207: +#line 1427 "parser.y" + { + (yyval) = NNEW(n_CLASS_CONSTANT_DECLARATION); + (yyval)->appendChild(NTYPE((yyvsp[(3) - (5)]), n_STRING)); + (yyval)->appendChild((yyvsp[(5) - (5)])); + + (yyvsp[(1) - (5)])->appendChild((yyval)); + + (yyval) = (yyvsp[(1) - (5)]); + ;} + break; + + case 208: +#line 1436 "parser.y" + { + NTYPE((yyvsp[(1) - (4)]), n_CLASS_CONSTANT_DECLARATION_LIST); + (yyval) = NNEW(n_CLASS_CONSTANT_DECLARATION); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (4)]), n_STRING)); + (yyval)->appendChild((yyvsp[(4) - (4)])); + (yyvsp[(1) - (4)])->appendChild((yyval)); + + (yyval) = (yyvsp[(1) - (4)]); + ;} + break; + + case 209: +#line 1448 "parser.y" + { + (yyvsp[(1) - (3)])->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 210: +#line 1451 "parser.y" + { + (yyval) = NNEW(n_ECHO_LIST); + (yyval)->appendChild((yyvsp[(1) - (1)])); + ;} + break; + + case 211: +#line 1458 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 213: +#line 1466 "parser.y" + { + (yyvsp[(1) - (3)])->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 214: +#line 1469 "parser.y" + { + (yyval) = NNEW(n_EXPRESSION_LIST); + (yyval)->appendChild((yyvsp[(1) - (1)])); + ;} + break; + + case 215: +#line 1476 "parser.y" + { + NTYPE((yyvsp[(1) - (6)]), n_LIST); + (yyvsp[(1) - (6)])->appendChild(NEXPAND((yyvsp[(2) - (6)]), (yyvsp[(3) - (6)]), (yyvsp[(4) - (6)]))); + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (6)])); + (yyval)->appendChild(NTYPE((yyvsp[(5) - (6)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(6) - (6)])); + ;} + break; + + case 216: +#line 1484 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 217: +#line 1490 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (4)]), n_OPERATOR)); + + NTYPE((yyvsp[(3) - (4)]), n_VARIABLE_REFERENCE); + (yyvsp[(3) - (4)])->appendChild((yyvsp[(4) - (4)])); + + (yyval)->appendChild((yyvsp[(3) - (4)])); + ;} + break; + + case 218: +#line 1500 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (6)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (6)]), n_OPERATOR)); + + NTYPE((yyvsp[(4) - (6)]), n_NEW); + (yyvsp[(4) - (6)])->appendChild((yyvsp[(5) - (6)])); + (yyvsp[(4) - (6)])->appendChild((yyvsp[(6) - (6)])); + + NTYPE((yyvsp[(3) - (6)]), n_VARIABLE_REFERENCE); + (yyvsp[(3) - (6)])->appendChild((yyvsp[(4) - (6)])); + + (yyval)->appendChild((yyvsp[(3) - (6)])); + ;} + break; + + case 219: +#line 1514 "parser.y" + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 220: +#line 1519 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 221: +#line 1525 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 222: +#line 1531 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 223: +#line 1537 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 224: +#line 1543 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 225: +#line 1549 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 226: +#line 1555 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 227: +#line 1561 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 228: +#line 1567 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 229: +#line 1573 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 230: +#line 1579 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 231: +#line 1585 "parser.y" + { + (yyval) = NNEW(n_UNARY_POSTFIX_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (2)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (2)]), n_OPERATOR)); + ;} + break; + + case 232: +#line 1590 "parser.y" + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 233: +#line 1595 "parser.y" + { + (yyval) = NNEW(n_UNARY_POSTFIX_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (2)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (2)]), n_OPERATOR)); + ;} + break; + + case 234: +#line 1600 "parser.y" + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 235: +#line 1605 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 236: +#line 1611 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 237: +#line 1617 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 238: +#line 1623 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 239: +#line 1629 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 240: +#line 1635 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 241: +#line 1641 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 242: +#line 1647 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 243: +#line 1653 "parser.y" + { + + /* 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[(1) - (3)])->type == n_CONCATENATION_LIST && (yyvsp[(3) - (3)])->type == n_CONCATENATION_LIST) { + (yyvsp[(1) - (3)])->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyvsp[(1) - (3)])->appendChildren((yyvsp[(3) - (3)])); + (yyval) = (yyvsp[(1) - (3)]); + } else if ((yyvsp[(1) - (3)])->type == n_CONCATENATION_LIST) { + (yyvsp[(1) - (3)])->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyvsp[(1) - (3)])->appendChild((yyvsp[(3) - (3)])); + (yyval) = (yyvsp[(1) - (3)]); + } else if ((yyvsp[(3) - (3)])->type == n_CONCATENATION_LIST) { + (yyval) = NNEW(n_CONCATENATION_LIST); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChildren((yyvsp[(3) - (3)])); + } else { + (yyval) = NNEW(n_CONCATENATION_LIST); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + } + ;} + break; + + case 244: +#line 1679 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 245: +#line 1685 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 246: +#line 1691 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 247: +#line 1697 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 248: +#line 1703 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 249: +#line 1709 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 250: +#line 1715 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 251: +#line 1721 "parser.y" + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 252: +#line 1726 "parser.y" + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 253: +#line 1731 "parser.y" + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 254: +#line 1736 "parser.y" + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 255: +#line 1741 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 256: +#line 1747 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 257: +#line 1753 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 258: +#line 1759 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 259: +#line 1765 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 260: +#line 1771 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 261: +#line 1777 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 262: +#line 1783 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 263: +#line 1789 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 264: +#line 1795 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 267: +#line 1803 "parser.y" + { + (yyval) = NNEW(n_TERNARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (5)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (5)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (5)])); + (yyval)->appendChild(NTYPE((yyvsp[(4) - (5)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(5) - (5)])); + ;} + break; + + case 268: +#line 1811 "parser.y" + { + (yyval) = NNEW(n_TERNARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (4)]), n_OPERATOR)); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild(NTYPE((yyvsp[(3) - (4)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(4) - (4)])); + ;} + break; + + case 269: +#line 1819 "parser.y" + { + (yyval) = NNEW(n_BINARY_EXPRESSION); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(2) - (3)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 271: +#line 1826 "parser.y" + { + (yyval) = NNEW(n_CAST_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_CAST)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 272: +#line 1831 "parser.y" + { + (yyval) = NNEW(n_CAST_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_CAST)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 273: +#line 1836 "parser.y" + { + (yyval) = NNEW(n_CAST_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_CAST)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 274: +#line 1841 "parser.y" + { + (yyval) = NNEW(n_CAST_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_CAST)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 275: +#line 1846 "parser.y" + { + (yyval) = NNEW(n_CAST_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_CAST)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 276: +#line 1851 "parser.y" + { + (yyval) = NNEW(n_CAST_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_CAST)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 277: +#line 1856 "parser.y" + { + (yyval) = NNEW(n_CAST_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_CAST)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 278: +#line 1861 "parser.y" + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 279: +#line 1866 "parser.y" + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 280: +#line 1871 "parser.y" + { + NTYPE((yyvsp[(1) - (1)]), n_BACKTICKS_EXPRESSION); + (yyval) = (yyvsp[(1) - (1)]); + ;} + break; + + case 284: +#line 1878 "parser.y" + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 285: +#line 1883 "parser.y" + { + NTYPE((yyvsp[(1) - (1)]), n_YIELD); + (yyvsp[(1) - (1)])->appendChild(NNEW(n_EMPTY)); + (yyvsp[(1) - (1)])->appendChild(NNEW(n_EMPTY)); + (yyval) = (yyvsp[(1) - (1)]); + ;} + break; + + case 286: +#line 1892 "parser.y" + { + NSPAN((yyvsp[(1) - (10)]), n_FUNCTION_DECLARATION, (yyvsp[(9) - (10)])); + (yyvsp[(1) - (10)])->appendChild(NNEW(n_EMPTY)); + (yyvsp[(1) - (10)])->appendChild((yyvsp[(2) - (10)])); + (yyvsp[(1) - (10)])->appendChild(NNEW(n_EMPTY)); + (yyvsp[(1) - (10)])->appendChild(NEXPAND((yyvsp[(3) - (10)]), (yyvsp[(4) - (10)]), (yyvsp[(5) - (10)]))); + (yyvsp[(1) - (10)])->appendChild((yyvsp[(6) - (10)])); + (yyvsp[(1) - (10)])->appendChild((yyvsp[(7) - (10)])); + (yyvsp[(1) - (10)])->appendChild(NEXPAND((yyvsp[(8) - (10)]), (yyvsp[(9) - (10)]), (yyvsp[(10) - (10)]))); + + (yyval) = (yyvsp[(1) - (10)]); + ;} + break; + + case 287: +#line 1907 "parser.y" + { + NSPAN((yyvsp[(2) - (11)]), n_FUNCTION_DECLARATION, (yyvsp[(10) - (11)])); + NMORE((yyvsp[(2) - (11)]), (yyvsp[(1) - (11)])); + + (yyval) = NNEW(n_FUNCTION_MODIFIER_LIST); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (11)]), n_STRING)); + (yyvsp[(2) - (11)])->appendChild((yyvsp[(1) - (11)])); + + (yyvsp[(2) - (11)])->appendChild(NNEW(n_EMPTY)); + (yyvsp[(2) - (11)])->appendChild((yyvsp[(3) - (11)])); + (yyvsp[(2) - (11)])->appendChild(NNEW(n_EMPTY)); + (yyvsp[(2) - (11)])->appendChild(NEXPAND((yyvsp[(4) - (11)]), (yyvsp[(5) - (11)]), (yyvsp[(6) - (11)]))); + (yyvsp[(2) - (11)])->appendChild((yyvsp[(7) - (11)])); + (yyvsp[(2) - (11)])->appendChild((yyvsp[(8) - (11)])); + (yyvsp[(2) - (11)])->appendChild(NEXPAND((yyvsp[(9) - (11)]), (yyvsp[(10) - (11)]), (yyvsp[(11) - (11)]))); + + (yyval) = (yyvsp[(2) - (11)]); + ;} + break; + + case 288: +#line 1928 "parser.y" + { + NTYPE((yyvsp[(1) - (2)]), n_YIELD); + (yyvsp[(2) - (2)])->appendChild(NNEW(n_EMPTY)); + (yyvsp[(1) - (2)])->appendChild((yyvsp[(2) - (2)])); + (yyval) = (yyvsp[(1) - (2)]); + ;} + break; + + case 289: +#line 1934 "parser.y" + { + NTYPE((yyvsp[(1) - (2)]), n_YIELD); + (yyvsp[(2) - (2)])->appendChild(NNEW(n_EMPTY)); + (yyvsp[(1) - (2)])->appendChild((yyvsp[(2) - (2)])); + (yyval) = (yyvsp[(1) - (2)]); + ;} + break; + + case 290: +#line 1940 "parser.y" + { + NTYPE((yyvsp[(1) - (4)]), n_YIELD); + (yyvsp[(1) - (4)])->appendChild((yyvsp[(2) - (4)])); + (yyvsp[(1) - (4)])->appendChild((yyvsp[(4) - (4)])); + (yyval) = (yyvsp[(1) - (4)]); + ;} + break; + + case 291: +#line 1946 "parser.y" + { + NTYPE((yyvsp[(1) - (4)]), n_YIELD); + (yyvsp[(1) - (4)])->appendChild((yyvsp[(2) - (4)])); + (yyvsp[(1) - (4)])->appendChild((yyvsp[(4) - (4)])); + (yyval) = (yyvsp[(1) - (4)]); + ;} + break; + + case 293: +#line 1959 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 294: +#line 1962 "parser.y" + { + NTYPE((yyvsp[(1) - (4)]), n_LEXICAL_VARIABLE_LIST); + (yyvsp[(1) - (4)])->appendChildren((yyvsp[(3) - (4)])); + (yyval) = (yyvsp[(1) - (4)]); + ;} + break; + + case 295: +#line 1970 "parser.y" + { + (yyval) = (yyvsp[(1) - (3)])->appendChild(NTYPE((yyvsp[(3) - (3)]), n_VARIABLE)); + ;} + break; + + case 296: +#line 1973 "parser.y" + { + NTYPE((yyvsp[(3) - (4)]), n_VARIABLE_REFERENCE); + (yyvsp[(3) - (4)])->appendChild(NTYPE((yyvsp[(4) - (4)]), n_VARIABLE)); + (yyval) = (yyvsp[(1) - (4)])->appendChild((yyvsp[(3) - (4)])); + ;} + break; + + case 297: +#line 1978 "parser.y" + { + (yyval) = NNEW(n_LEXICAL_VARIABLE_LIST); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (1)]), n_VARIABLE)); + ;} + break; + + case 298: +#line 1982 "parser.y" + { + NTYPE((yyvsp[(1) - (2)]), n_VARIABLE_REFERENCE); + (yyvsp[(1) - (2)])->appendChild(NTYPE((yyvsp[(2) - (2)]), n_VARIABLE)); + (yyval) = NNEW(n_LEXICAL_VARIABLE_LIST); + (yyval)->appendChild((yyvsp[(1) - (2)])); + ;} + break; + + case 299: +#line 1991 "parser.y" + { + (yyval) = NNEW(n_FUNCTION_CALL); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild(NEXPAND((yyvsp[(2) - (4)]), (yyvsp[(3) - (4)]), (yyvsp[(4) - (4)]))); + ;} + break; + + case 300: +#line 1997 "parser.y" + { + NMORE((yyvsp[(3) - (6)]), (yyvsp[(1) - (6)])); + (yyval) = NNEW(n_FUNCTION_CALL); + (yyval)->appendChild((yyvsp[(3) - (6)])); + (yyval)->appendChild(NEXPAND((yyvsp[(4) - (6)]), (yyvsp[(5) - (6)]), (yyvsp[(6) - (6)]))); + ;} + break; + + case 301: +#line 2003 "parser.y" + { + NMORE((yyvsp[(2) - (5)]), (yyvsp[(1) - (5)])); + (yyval) = NNEW(n_FUNCTION_CALL); + (yyval)->appendChild((yyvsp[(2) - (5)])); + (yyval)->appendChild(NEXPAND((yyvsp[(3) - (5)]), (yyvsp[(4) - (5)]), (yyvsp[(5) - (5)]))); + ;} + break; + + case 302: +#line 2010 "parser.y" + { + (yyval) = NNEW(n_CLASS_STATIC_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (6)])); + (yyval)->appendChild(NTYPE((yyvsp[(3) - (6)]), n_STRING)); + + (yyval) = NNEW(n_FUNCTION_CALL)->appendChild((yyval)); + (yyval)->appendChild(NEXPAND((yyvsp[(4) - (6)]), (yyvsp[(5) - (6)]), (yyvsp[(6) - (6)]))); + ;} + break; + + case 303: +#line 2019 "parser.y" + { + (yyval) = NNEW(n_CLASS_STATIC_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (6)])); + (yyval)->appendChild(NTYPE((yyvsp[(3) - (6)]), n_STRING)); + + (yyval) = NNEW(n_FUNCTION_CALL)->appendChild((yyval)); + (yyval)->appendChild(NEXPAND((yyvsp[(4) - (6)]), (yyvsp[(5) - (6)]), (yyvsp[(6) - (6)]))); + ;} + break; + + case 304: +#line 2028 "parser.y" + { + (yyval) = NNEW(n_CLASS_STATIC_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (6)])); + (yyval)->appendChild(NTYPE((yyvsp[(3) - (6)]), n_STRING)); + + (yyval) = NNEW(n_FUNCTION_CALL)->appendChild((yyval)); + (yyval)->appendChild(NEXPAND((yyvsp[(4) - (6)]), (yyvsp[(5) - (6)]), (yyvsp[(6) - (6)]))); + ;} + break; + + case 305: +#line 2037 "parser.y" + { + (yyval) = NNEW(n_CLASS_STATIC_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (6)])); + (yyval)->appendChild(NTYPE((yyvsp[(3) - (6)]), n_STRING)); + + (yyval) = NNEW(n_FUNCTION_CALL)->appendChild((yyval)); + (yyval)->appendChild(NEXPAND((yyvsp[(4) - (6)]), (yyvsp[(5) - (6)]), (yyvsp[(6) - (6)]))); + ;} + break; + + case 306: +#line 2045 "parser.y" + { + (yyval) = NNEW(n_FUNCTION_CALL); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild(NEXPAND((yyvsp[(2) - (4)]), (yyvsp[(3) - (4)]), (yyvsp[(4) - (4)]))); + ;} + break; + + case 307: +#line 2053 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_CLASS_NAME); + ;} + break; + + case 308: +#line 2056 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_CLASS_NAME); + ;} + break; + + case 309: +#line 2059 "parser.y" + { + NMORE((yyvsp[(3) - (3)]), (yyvsp[(1) - (3)])); + (yyval) = NTYPE((yyvsp[(3) - (3)]), n_CLASS_NAME); + ;} + break; + + case 310: +#line 2063 "parser.y" + { + NMORE((yyvsp[(2) - (2)]), (yyvsp[(1) - (2)])); + (yyval) = NTYPE((yyvsp[(2) - (2)]), n_CLASS_NAME); + ;} + break; + + case 311: +#line 2070 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_CLASS_NAME); + ;} + break; + + case 312: +#line 2073 "parser.y" + { + NMORE((yyvsp[(3) - (3)]), (yyvsp[(1) - (3)])); + (yyval) = NTYPE((yyvsp[(3) - (3)]), n_CLASS_NAME); + ;} + break; + + case 313: +#line 2077 "parser.y" + { + NMORE((yyvsp[(2) - (2)]), (yyvsp[(1) - (2)])); + (yyval) = NTYPE((yyvsp[(2) - (2)]), n_CLASS_NAME); + ;} + break; + + case 316: +#line 2092 "parser.y" + { + (yyval) = NNEW(n_OBJECT_PROPERTY_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild((yyvsp[(3) - (4)])); + for (xhpast::node_list_t::iterator ii = (yyvsp[(4) - (4)])->children.begin(); + ii != (yyvsp[(4) - (4)])->children.end(); + ++ii) { + + (yyval) = NNEW(n_OBJECT_PROPERTY_ACCESS)->appendChild((yyval)); + (yyval)->appendChild(*ii); + } + ;} + break; + + case 318: +#line 2108 "parser.y" + { + (yyval) = (yyvsp[(1) - (2)])->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 319: +#line 2111 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 320: +#line 2117 "parser.y" + { + (yyval) = (yyvsp[(2) - (2)]); + ;} + break; + + case 321: +#line 2123 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 322: +#line 2126 "parser.y" + { + NSPAN((yyvsp[(1) - (2)]), n_EMPTY, (yyvsp[(2) - (2)])); + (yyval) = (yyvsp[(1) - (2)]); + ;} + break; + + case 323: +#line 2130 "parser.y" + { + NSPAN((yyvsp[(1) - (3)]), n_PARENTHETICAL_EXPRESSION, (yyvsp[(3) - (3)])); + (yyvsp[(1) - (3)])->appendChild((yyvsp[(2) - (3)])); + (yyval) = (yyvsp[(1) - (3)]); + ;} + break; + + case 324: +#line 2138 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 325: +#line 2141 "parser.y" + { + (yyval) = NEXPAND((yyvsp[(1) - (3)]), (yyvsp[(2) - (3)]), (yyvsp[(3) - (3)])); + ;} + break; + + case 326: +#line 2147 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_NUMERIC_SCALAR); + ;} + break; + + case 327: +#line 2150 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_NUMERIC_SCALAR); + ;} + break; + + case 328: +#line 2153 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_STRING_SCALAR); + ;} + break; + + case 329: +#line 2156 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_MAGIC_SCALAR); + ;} + break; + + case 330: +#line 2159 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_MAGIC_SCALAR); + ;} + break; + + case 331: +#line 2162 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_MAGIC_SCALAR); + ;} + break; + + case 332: +#line 2165 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_MAGIC_SCALAR); + ;} + break; + + case 333: +#line 2168 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_MAGIC_SCALAR); + ;} + break; + + case 334: +#line 2171 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_MAGIC_SCALAR); + ;} + break; + + case 335: +#line 2174 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_MAGIC_SCALAR); + ;} + break; + + case 336: +#line 2177 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_MAGIC_SCALAR); + ;} + break; + + case 337: +#line 2180 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_HEREDOC); + ;} + break; + + case 340: +#line 2188 "parser.y" + { + NMORE((yyvsp[(3) - (3)]), (yyvsp[(1) - (3)])); + (yyval) = (yyvsp[(3) - (3)]); + ;} + break; + + case 341: +#line 2192 "parser.y" + { + NMORE((yyvsp[(2) - (2)]), (yyvsp[(1) - (2)])); + (yyval) = (yyvsp[(2) - (2)]); + ;} + break; + + case 342: +#line 2196 "parser.y" + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 343: +#line 2201 "parser.y" + { + (yyval) = NNEW(n_UNARY_PREFIX_EXPRESSION); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_OPERATOR)); + (yyval)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 344: +#line 2206 "parser.y" + { + NTYPE((yyvsp[(1) - (4)]), n_ARRAY_LITERAL); + (yyvsp[(1) - (4)])->appendChild(NEXPAND((yyvsp[(2) - (4)]), (yyvsp[(3) - (4)]), (yyvsp[(4) - (4)]))); + (yyval) = (yyvsp[(1) - (4)]); + ;} + break; + + case 345: +#line 2211 "parser.y" + { + NTYPE((yyvsp[(1) - (3)]), n_ARRAY_LITERAL); + (yyvsp[(1) - (3)])->appendChild(NEXPAND((yyvsp[(1) - (3)]), (yyvsp[(2) - (3)]), (yyvsp[(3) - (3)]))); + (yyval) = (yyvsp[(1) - (3)]); + ;} + break; + + case 347: +#line 2220 "parser.y" + { + (yyval) = NNEW(n_CLASS_STATIC_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(3) - (3)]), n_STRING)); + ;} + break; + + case 351: +#line 2231 "parser.y" + { + (yyval) = NMORE((yyvsp[(3) - (3)]), (yyvsp[(1) - (3)])); + ;} + break; + + case 352: +#line 2234 "parser.y" + { + (yyval) = NMORE((yyvsp[(2) - (2)]), (yyvsp[(1) - (2)])); + ;} + break; + + case 354: +#line 2241 "parser.y" + { + (yyval) = NNEW(n_ARRAY_VALUE_LIST); + ;} + break; + + case 355: +#line 2244 "parser.y" + { + (yyval) = NMORE((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)])); + ;} + break; + + case 356: +#line 2250 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 358: +#line 2261 "parser.y" + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild((yyvsp[(3) - (5)])); + (yyval)->appendChild((yyvsp[(5) - (5)])); + + (yyval) = (yyvsp[(1) - (5)])->appendChild((yyval)); + ;} + break; + + case 359: +#line 2268 "parser.y" + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + + (yyval) = (yyvsp[(1) - (3)])->appendChild((yyval)); + ;} + break; + + case 360: +#line 2275 "parser.y" + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild((yyvsp[(3) - (3)])); + + (yyval) = NNEW(n_ARRAY_VALUE_LIST)->appendChild((yyval)); + ;} + break; + + case 361: +#line 2282 "parser.y" + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild((yyvsp[(1) - (1)])); + + (yyval) = NNEW(n_ARRAY_VALUE_LIST)->appendChild((yyval)); + ;} + break; + + case 367: +#line 2312 "parser.y" + { + (yyval) = NNEW(n_OBJECT_PROPERTY_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (5)])); + (yyval)->appendChild((yyvsp[(3) - (5)])); + + if ((yyvsp[(4) - (5)])->type != n_EMPTY) { + (yyval) = NNEW(n_METHOD_CALL)->appendChild((yyval)); + (yyval)->appendChild((yyvsp[(4) - (5)])); + } + + for (xhpast::node_list_t::iterator ii = (yyvsp[(5) - (5)])->children.begin(); + ii != (yyvsp[(5) - (5)])->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)); + } + } + ;} + break; + + case 369: +#line 2339 "parser.y" + { + (yyval) = (yyvsp[(1) - (2)])->appendChildren((yyvsp[(2) - (2)])); + ;} + break; + + case 370: +#line 2342 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 371: +#line 2348 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + (yyval)->appendChild((yyvsp[(2) - (3)])); + if ((yyvsp[(3) - (3)])->type != n_EMPTY) { + (yyval)->appendChild((yyvsp[(3) - (3)])); + } + ;} + break; + + case 372: +#line 2358 "parser.y" + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild((yyvsp[(3) - (4)])); + NMORE((yyval), (yyvsp[(4) - (4)])); + ;} + break; + + case 373: +#line 2364 "parser.y" + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild((yyvsp[(3) - (4)])); + NMORE((yyval), (yyvsp[(4) - (4)])); + ;} + break; + + case 374: +#line 2373 "parser.y" + { + (yyval) = NEXPAND((yyvsp[(1) - (3)]), (yyvsp[(2) - (3)]), (yyvsp[(3) - (3)])); + ;} + break; + + case 377: +#line 2381 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 379: +#line 2388 "parser.y" + { + xhpast::Node *last = (yyvsp[(1) - (2)]); + NMORE((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)])); + while (last->firstChild() && + last->firstChild()->type == n_VARIABLE_VARIABLE) { + NMORE(last, (yyvsp[(2) - (2)])); + last = last->firstChild(); + } + last->appendChild((yyvsp[(2) - (2)])); + + (yyval) = (yyvsp[(1) - (2)]); + ;} + break; + + case 380: +#line 2403 "parser.y" + { + (yyval) = NNEW(n_CLASS_STATIC_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 381: +#line 2408 "parser.y" + { + (yyval) = NNEW(n_CLASS_STATIC_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 383: +#line 2420 "parser.y" + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild((yyvsp[(3) - (4)])); + NMORE((yyval), (yyvsp[(4) - (4)])); + ;} + break; + + case 384: +#line 2426 "parser.y" + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild((yyvsp[(3) - (4)])); + NMORE((yyval), (yyvsp[(4) - (4)])); + ;} + break; + + case 389: +#line 2442 "parser.y" + { + (yyval) = NEXPAND((yyvsp[(1) - (3)]), (yyvsp[(2) - (3)]), (yyvsp[(3) - (3)])); + ;} + break; + + case 390: +#line 2445 "parser.y" + { + xhpast::Node *last = (yyvsp[(1) - (2)]); + NMORE((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)])); + while (last->firstChild() && + last->firstChild()->type == n_VARIABLE_VARIABLE) { + NMORE(last, (yyvsp[(2) - (2)])); + last = last->firstChild(); + } + last->appendChild((yyvsp[(2) - (2)])); + + (yyval) = (yyvsp[(1) - (2)]); + ;} + break; + + case 392: +#line 2461 "parser.y" + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild((yyvsp[(3) - (4)])); + NMORE((yyval), (yyvsp[(4) - (4)])); + ;} + break; + + case 393: +#line 2467 "parser.y" + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild((yyvsp[(3) - (4)])); + NMORE((yyval), (yyvsp[(4) - (4)])); + ;} + break; + + case 395: +#line 2477 "parser.y" + { + NTYPE((yyvsp[(1) - (1)]), n_VARIABLE); + ;} + break; + + case 396: +#line 2480 "parser.y" + { + NSPAN((yyvsp[(1) - (4)]), n_VARIABLE_EXPRESSION, (yyvsp[(4) - (4)])); + (yyvsp[(1) - (4)])->appendChild((yyvsp[(3) - (4)])); + (yyval) = (yyvsp[(1) - (4)]); + ;} + break; + + case 397: +#line 2488 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 398: +#line 2491 "parser.y" + { + (yyval) = (yyvsp[(1) - (1)]); + ;} + break; + + case 401: +#line 2502 "parser.y" + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild((yyvsp[(3) - (4)])); + NMORE((yyval), (yyvsp[(4) - (4)])); + ;} + break; + + case 402: +#line 2508 "parser.y" + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild((yyvsp[(3) - (4)])); + NMORE((yyval), (yyvsp[(4) - (4)])); + ;} + break; + + case 404: +#line 2518 "parser.y" + { + NTYPE((yyvsp[(1) - (1)]), n_STRING); + (yyval) = (yyvsp[(1) - (1)]); + ;} + break; + + case 405: +#line 2522 "parser.y" + { + (yyval) = NEXPAND((yyvsp[(1) - (3)]), (yyvsp[(2) - (3)]), (yyvsp[(3) - (3)])); + ;} + break; + + case 406: +#line 2528 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (1)]), n_VARIABLE_VARIABLE); + ;} + break; + + case 407: +#line 2531 "parser.y" + { + (yyvsp[(2) - (2)]) = NTYPE((yyvsp[(2) - (2)]), n_VARIABLE_VARIABLE); + + xhpast::Node *last = (yyvsp[(1) - (2)]); + while (last->firstChild() && + last->firstChild()->type == n_VARIABLE_VARIABLE) { + last = last->firstChild(); + } + last->appendChild((yyvsp[(2) - (2)])); + + (yyval) = (yyvsp[(1) - (2)]); + ;} + break; + + case 408: +#line 2546 "parser.y" + { + (yyval) = (yyvsp[(1) - (3)])->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 409: +#line 2549 "parser.y" + { + (yyval) = NNEW(n_ASSIGNMENT_LIST); + (yyval)->appendChild((yyvsp[(1) - (1)])); + ;} + break; + + case 411: +#line 2557 "parser.y" + { + (yyval) = NNEW(n_LIST); + (yyval)->appendChild(NEXPAND((yyvsp[(2) - (4)]), (yyvsp[(3) - (4)]), (yyvsp[(4) - (4)]))); + ;} + break; + + case 412: +#line 2561 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + ;} + break; + + case 413: +#line 2567 "parser.y" + { + (yyval) = NNEW(n_ARRAY_VALUE_LIST); + ;} + break; + + case 414: +#line 2570 "parser.y" + { + (yyval) = NMORE((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)])); + ;} + break; + + case 415: +#line 2576 "parser.y" + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild((yyvsp[(3) - (5)])); + (yyval)->appendChild((yyvsp[(5) - (5)])); + + (yyval) = (yyvsp[(1) - (5)])->appendChild((yyval)); + ;} + break; + + case 416: +#line 2583 "parser.y" + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild((yyvsp[(3) - (3)])); + + (yyval) = (yyvsp[(1) - (3)])->appendChild((yyval)); + ;} + break; + + case 417: +#line 2590 "parser.y" + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild((yyvsp[(3) - (3)])); + + (yyval) = NNEW(n_ARRAY_VALUE_LIST)->appendChild((yyval)); + ;} + break; + + case 418: +#line 2597 "parser.y" + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild((yyvsp[(1) - (1)])); + + (yyval) = NNEW(n_ARRAY_VALUE_LIST)->appendChild((yyval)); + ;} + break; + + case 419: +#line 2604 "parser.y" + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild((yyvsp[(3) - (6)])); + (yyval)->appendChild(NTYPE((yyvsp[(5) - (6)]), n_VARIABLE_REFERENCE)->appendChild((yyvsp[(6) - (6)]))); + + (yyval) = (yyvsp[(1) - (6)])->appendChild((yyval)); + ;} + break; + + case 420: +#line 2611 "parser.y" + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild(NTYPE((yyvsp[(3) - (4)]), n_VARIABLE_REFERENCE)->appendChild((yyvsp[(4) - (4)]))); + + (yyval) = (yyvsp[(1) - (4)])->appendChild((yyval)); + ;} + break; + + case 421: +#line 2618 "parser.y" + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild(NTYPE((yyvsp[(3) - (4)]), n_VARIABLE_REFERENCE)->appendChild((yyvsp[(4) - (4)]))); + + (yyval) = NNEW(n_ARRAY_VALUE_LIST)->appendChild((yyval)); + ;} + break; + + case 422: +#line 2625 "parser.y" + { + (yyval) = NNEW(n_ARRAY_VALUE); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (2)]), n_VARIABLE_REFERENCE)->appendChild((yyvsp[(2) - (2)]))); + + (yyval) = NNEW(n_ARRAY_VALUE_LIST)->appendChild((yyval)); + ;} + break; + + case 423: +#line 2635 "parser.y" + { + NTYPE((yyvsp[(1) - (4)]), n_SYMBOL_NAME); + + NSPAN((yyvsp[(2) - (4)]), n_CALL_PARAMETER_LIST, (yyvsp[(4) - (4)])); + (yyvsp[(2) - (4)])->appendChildren((yyvsp[(3) - (4)])); + + (yyval) = NNEW(n_FUNCTION_CALL); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild((yyvsp[(2) - (4)])); + ;} + break; + + case 424: +#line 2645 "parser.y" + { + NTYPE((yyvsp[(1) - (4)]), n_SYMBOL_NAME); + + NSPAN((yyvsp[(2) - (4)]), n_CALL_PARAMETER_LIST, (yyvsp[(4) - (4)])); + (yyvsp[(2) - (4)])->appendChild((yyvsp[(3) - (4)])); + + (yyval) = NNEW(n_FUNCTION_CALL); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild((yyvsp[(2) - (4)])); + ;} + break; + + case 425: +#line 2655 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (2)]), n_INCLUDE_FILE)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 426: +#line 2658 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (2)]), n_INCLUDE_FILE)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 427: +#line 2661 "parser.y" + { + NTYPE((yyvsp[(1) - (4)]), n_SYMBOL_NAME); + + NSPAN((yyvsp[(2) - (4)]), n_CALL_PARAMETER_LIST, (yyvsp[(4) - (4)])); + (yyvsp[(2) - (4)])->appendChild((yyvsp[(3) - (4)])); + + (yyval) = NNEW(n_FUNCTION_CALL); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild((yyvsp[(2) - (4)])); + ;} + break; + + case 428: +#line 2671 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (2)]), n_INCLUDE_FILE)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 429: +#line 2674 "parser.y" + { + (yyval) = NTYPE((yyvsp[(1) - (2)]), n_INCLUDE_FILE)->appendChild((yyvsp[(2) - (2)])); + ;} + break; + + case 430: +#line 2680 "parser.y" + { + (yyval) = NNEW(n_EMPTY); + (yyval)->appendChild((yyvsp[(1) - (1)])); + ;} + break; + + case 431: +#line 2684 "parser.y" + { + (yyval) = (yyvsp[(1) - (3)])->appendChild((yyvsp[(3) - (3)])); + ;} + break; + + case 432: +#line 2690 "parser.y" + { + NSPAN((yyvsp[(1) - (3)]), n_PARENTHETICAL_EXPRESSION, (yyvsp[(3) - (3)])); + (yyvsp[(1) - (3)])->appendChild((yyvsp[(2) - (3)])); + (yyval) = (yyvsp[(1) - (3)]); + ;} + break; + + case 433: +#line 2695 "parser.y" + { + (yyval) = NEXPAND((yyvsp[(1) - (3)]), (yyvsp[(2) - (3)]), (yyvsp[(3) - (3)])); + ;} + break; + + case 434: +#line 2701 "parser.y" + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild((yyvsp[(3) - (4)])); + NMORE((yyval), (yyvsp[(4) - (4)])); + ;} + break; + + case 435: +#line 2707 "parser.y" + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild((yyvsp[(3) - (4)])); + NMORE((yyval), (yyvsp[(4) - (4)])); + ;} + break; + + case 436: +#line 2713 "parser.y" + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (4)]), n_STRING_SCALAR)); + (yyval)->appendChild((yyvsp[(3) - (4)])); + NMORE((yyval), (yyvsp[(4) - (4)])); + ;} + break; + + case 437: +#line 2719 "parser.y" + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (4)])); + (yyval)->appendChild((yyvsp[(3) - (4)])); + NMORE((yyval), (yyvsp[(4) - (4)])); + ;} + break; + + case 438: +#line 2725 "parser.y" + { + (yyval) = NNEW(n_INDEX_ACCESS); + (yyval)->appendChild(NTYPE((yyvsp[(1) - (4)]), n_STRING)); + (yyval)->appendChild((yyvsp[(3) - (4)])); + NMORE((yyval), (yyvsp[(4) - (4)])); + ;} + break; + + case 439: +#line 2734 "parser.y" + { + NTYPE((yyvsp[(1) - (4)]), n_ARRAY_LITERAL); + (yyvsp[(1) - (4)])->appendChild(NEXPAND((yyvsp[(2) - (4)]), (yyvsp[(3) - (4)]), (yyvsp[(4) - (4)]))); + (yyval) = (yyvsp[(1) - (4)]); + ;} + break; + + case 440: +#line 2739 "parser.y" + { + NTYPE((yyvsp[(1) - (3)]), n_ARRAY_LITERAL); + (yyvsp[(1) - (3)])->appendChild(NEXPAND((yyvsp[(1) - (3)]), (yyvsp[(2) - (3)]), (yyvsp[(3) - (3)]))); + (yyval) = (yyvsp[(1) - (3)]); + ;} + break; + + case 441: +#line 2747 "parser.y" + { + NTYPE((yyvsp[(1) - (3)]), n_NEW); + (yyvsp[(1) - (3)])->appendChild((yyvsp[(2) - (3)])); + (yyvsp[(1) - (3)])->appendChild((yyvsp[(3) - (3)])); + (yyval) = (yyvsp[(1) - (3)]); + ;} + break; + + case 442: +#line 2754 "parser.y" + { + (yyval) = NNEW(n_CLASS_DECLARATION); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild(NNEW(n_EMPTY)); + (yyval)->appendChild((yyvsp[(4) - (8)])); + (yyval)->appendChild((yyvsp[(5) - (8)])); + (yyval)->appendChild(NEXPAND((yyvsp[(6) - (8)]), (yyvsp[(7) - (8)]), (yyvsp[(8) - (8)]))); + NMORE((yyval), (yyvsp[(8) - (8)])); + + NTYPE((yyvsp[(1) - (8)]), n_NEW); + (yyvsp[(1) - (8)])->appendChild((yyval)); + (yyvsp[(1) - (8)])->appendChild((yyvsp[(3) - (8)])); + (yyval) = (yyvsp[(1) - (8)]); + ;} + break; + + case 443: +#line 2771 "parser.y" + { + (yyval) = NNEW(n_CLASS_STATIC_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(3) - (3)]), n_STRING)); + ;} + break; + + case 444: +#line 2776 "parser.y" + { + (yyval) = NNEW(n_CLASS_STATIC_ACCESS); + (yyval)->appendChild((yyvsp[(1) - (3)])); + (yyval)->appendChild(NTYPE((yyvsp[(3) - (3)]), n_STRING)); + ;} + break; + + +/* Line 1267 of yacc.c. */ +#line 7464 "parser.yacc.cpp" + default: break; + } + 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: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (yyscanner, root, YY_("syntax error")); +#else + { + YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); + if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) + { + YYSIZE_T yyalloc = 2 * yysize; + if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) + yyalloc = YYSTACK_ALLOC_MAXIMUM; + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yyalloc); + if (yymsg) + yymsg_alloc = yyalloc; + else + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + } + } + + if (0 < yysize && yysize <= yymsg_alloc) + { + (void) yysyntax_error (yymsg, yystate, yychar); + yyerror (yyscanner, root, yymsg); + } + else + { + yyerror (yyscanner, root, YY_("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } + } +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse look-ahead 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 look-ahead 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 which 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 (yyn != YYPACT_NINF) + { + 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); + } + + if (yyn == YYFINAL) + YYACCEPT; + + *++yyvsp = yylval; + + + /* 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; + +#ifndef yyoverflow +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (yyscanner, root, YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEOF && yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, yyscanner, root); + /* Do not reclaim the symbols of the rule which 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 + /* Make sure YYID is used. */ + return YYID (yyresult); +} + + +#line 2783 "parser.y" + + +const char* yytokname(int tok) { + if (tok < 255) { + return NULL; + } + return yytname[YYTRANSLATE(tok)]; +} + +/* @generated */ diff --git a/support/xhpast/parser.yacc.hpp b/support/xhpast/parser.yacc.hpp new file mode 100644 index 00000000..de437b39 --- /dev/null +++ b/support/xhpast/parser.yacc.hpp @@ -0,0 +1,336 @@ +/* A Bison parser, made by GNU Bison 2.3. */ + +/* Skeleton interface for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + 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 2, 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* 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. */ + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + T_REQUIRE_ONCE = 258, + T_REQUIRE = 259, + T_EVAL = 260, + T_INCLUDE_ONCE = 261, + T_INCLUDE = 262, + T_LOGICAL_OR = 263, + T_LOGICAL_XOR = 264, + T_LOGICAL_AND = 265, + T_PRINT = 266, + T_SR_EQUAL = 267, + T_SL_EQUAL = 268, + T_XOR_EQUAL = 269, + T_OR_EQUAL = 270, + T_AND_EQUAL = 271, + T_MOD_EQUAL = 272, + T_CONCAT_EQUAL = 273, + T_DIV_EQUAL = 274, + T_MUL_EQUAL = 275, + T_MINUS_EQUAL = 276, + T_PLUS_EQUAL = 277, + T_COALESCE = 278, + T_BOOLEAN_OR = 279, + T_BOOLEAN_AND = 280, + T_SPACESHIP = 281, + T_IS_NOT_IDENTICAL = 282, + T_IS_IDENTICAL = 283, + T_IS_NOT_EQUAL = 284, + T_IS_EQUAL = 285, + T_IS_GREATER_OR_EQUAL = 286, + T_IS_SMALLER_OR_EQUAL = 287, + T_SR = 288, + T_SL = 289, + T_INSTANCEOF = 290, + T_UNSET_CAST = 291, + T_BOOL_CAST = 292, + T_OBJECT_CAST = 293, + T_ARRAY_CAST = 294, + T_BINARY_CAST = 295, + T_UNICODE_CAST = 296, + T_STRING_CAST = 297, + T_DOUBLE_CAST = 298, + T_INT_CAST = 299, + T_DEC = 300, + T_INC = 301, + T_CLONE = 302, + T_NEW = 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_PUBLIC = 347, + T_PROTECTED = 348, + T_PRIVATE = 349, + T_FINAL = 350, + T_ABSTRACT = 351, + T_STATIC = 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 +/* Tokens. */ +#define T_REQUIRE_ONCE 258 +#define T_REQUIRE 259 +#define T_EVAL 260 +#define T_INCLUDE_ONCE 261 +#define T_INCLUDE 262 +#define T_LOGICAL_OR 263 +#define T_LOGICAL_XOR 264 +#define T_LOGICAL_AND 265 +#define T_PRINT 266 +#define T_SR_EQUAL 267 +#define T_SL_EQUAL 268 +#define T_XOR_EQUAL 269 +#define T_OR_EQUAL 270 +#define T_AND_EQUAL 271 +#define T_MOD_EQUAL 272 +#define T_CONCAT_EQUAL 273 +#define T_DIV_EQUAL 274 +#define T_MUL_EQUAL 275 +#define T_MINUS_EQUAL 276 +#define T_PLUS_EQUAL 277 +#define T_COALESCE 278 +#define T_BOOLEAN_OR 279 +#define T_BOOLEAN_AND 280 +#define T_SPACESHIP 281 +#define T_IS_NOT_IDENTICAL 282 +#define T_IS_IDENTICAL 283 +#define T_IS_NOT_EQUAL 284 +#define T_IS_EQUAL 285 +#define T_IS_GREATER_OR_EQUAL 286 +#define T_IS_SMALLER_OR_EQUAL 287 +#define T_SR 288 +#define T_SL 289 +#define T_INSTANCEOF 290 +#define T_UNSET_CAST 291 +#define T_BOOL_CAST 292 +#define T_OBJECT_CAST 293 +#define T_ARRAY_CAST 294 +#define T_BINARY_CAST 295 +#define T_UNICODE_CAST 296 +#define T_STRING_CAST 297 +#define T_DOUBLE_CAST 298 +#define T_INT_CAST 299 +#define T_DEC 300 +#define T_INC 301 +#define T_CLONE 302 +#define T_NEW 303 +#define T_EXIT 304 +#define T_IF 305 +#define T_ELSEIF 306 +#define T_ELSE 307 +#define T_ENDIF 308 +#define T_LNUMBER 309 +#define T_DNUMBER 310 +#define T_STRING 311 +#define T_STRING_VARNAME 312 +#define T_VARIABLE 313 +#define T_NUM_STRING 314 +#define T_INLINE_HTML 315 +#define T_CHARACTER 316 +#define T_BAD_CHARACTER 317 +#define T_ENCAPSED_AND_WHITESPACE 318 +#define T_CONSTANT_ENCAPSED_STRING 319 +#define T_BACKTICKS_EXPR 320 +#define T_ECHO 321 +#define T_DO 322 +#define T_WHILE 323 +#define T_ENDWHILE 324 +#define T_FOR 325 +#define T_ENDFOR 326 +#define T_FOREACH 327 +#define T_ENDFOREACH 328 +#define T_DECLARE 329 +#define T_ENDDECLARE 330 +#define T_AS 331 +#define T_SWITCH 332 +#define T_ENDSWITCH 333 +#define T_CASE 334 +#define T_DEFAULT 335 +#define T_BREAK 336 +#define T_CONTINUE 337 +#define T_GOTO 338 +#define T_FUNCTION 339 +#define T_CONST 340 +#define T_RETURN 341 +#define T_TRY 342 +#define T_CATCH 343 +#define T_THROW 344 +#define T_USE 345 +#define T_GLOBAL 346 +#define T_PUBLIC 347 +#define T_PROTECTED 348 +#define T_PRIVATE 349 +#define T_FINAL 350 +#define T_ABSTRACT 351 +#define T_STATIC 352 +#define T_VAR 353 +#define T_UNSET 354 +#define T_ISSET 355 +#define T_EMPTY 356 +#define T_HALT_COMPILER 357 +#define T_CLASS 358 +#define T_INTERFACE 359 +#define T_EXTENDS 360 +#define T_IMPLEMENTS 361 +#define T_OBJECT_OPERATOR 362 +#define T_DOUBLE_ARROW 363 +#define T_LIST 364 +#define T_ARRAY 365 +#define T_CLASS_C 366 +#define T_METHOD_C 367 +#define T_FUNC_C 368 +#define T_LINE 369 +#define T_FILE 370 +#define T_COMMENT 371 +#define T_DOC_COMMENT 372 +#define T_OPEN_TAG 373 +#define T_OPEN_TAG_WITH_ECHO 374 +#define T_OPEN_TAG_FAKE 375 +#define T_CLOSE_TAG 376 +#define T_WHITESPACE 377 +#define T_START_HEREDOC 378 +#define T_END_HEREDOC 379 +#define T_HEREDOC 380 +#define T_DOLLAR_OPEN_CURLY_BRACES 381 +#define T_CURLY_OPEN 382 +#define T_PAAMAYIM_NEKUDOTAYIM 383 +#define T_BINARY_DOUBLE 384 +#define T_BINARY_HEREDOC 385 +#define T_NAMESPACE 386 +#define T_NS_C 387 +#define T_DIR 388 +#define T_NS_SEPARATOR 389 +#define T_INSTEADOF 390 +#define T_CALLABLE 391 +#define T_TRAIT 392 +#define T_TRAIT_C 393 +#define T_YIELD 394 +#define T_FINALLY 395 +#define T_ELLIPSIS 396 + + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef int YYSTYPE; +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* @generated */ diff --git a/support/xhpast/parser_nodes.php b/support/xhpast/parser_nodes.php new file mode 100644 index 00000000..b2b1b834 --- /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 index 00000000..1da3a7af --- /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.cpp b/support/xhpast/scanner.lex.cpp new file mode 100644 index 00000000..5372c16f --- /dev/null +++ b/support/xhpast/scanner.lex.cpp @@ -0,0 +1,26971 @@ +#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; +typedef uint64_t flex_uint64_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; +#endif /* ! C99 */ + +/* 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 /* ! 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 +#define YY_BUF_SIZE 16384 +#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 + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#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_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. + */ + yy_size_t 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,yy_size_t 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 = (yy_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 24431 "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; + yy_size_t yy_n_chars; + yy_size_t 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 ); + +yy_size_t 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 +#define YY_READ_BUF_SIZE 8192 +#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 fwrite( yytext, yyleng, 1, yyout ) +#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 24668 "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 25640 "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 + { + yy_size_t 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 ) + { + yy_size_t 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, 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 yy_size_t 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 */ + yy_size_t 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 0; + + 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) +{ + yy_size_t 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 bytes the byte buffer to scan + * @param 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, yy_size_t _yybytes_len , yyscan_t yyscanner) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n, 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. + */ +yy_size_t 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/scanner.lex.hpp b/support/xhpast/scanner.lex.hpp new file mode 100644 index 00000000..9220bcf0 --- /dev/null +++ b/support/xhpast/scanner.lex.hpp @@ -0,0 +1,353 @@ +#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; +typedef uint64_t flex_uint64_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; +#endif /* ! C99 */ + +/* 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 /* ! 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 +#define YY_BUF_SIZE 16384 +#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. + */ + yy_size_t 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,yy_size_t 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 ); + +yy_size_t 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 +#define YY_READ_BUF_SIZE 8192 +#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 351 "scanner.lex.hpp" +#undef xhpastIN_HEADER +#endif /* xhpastHEADER_H */ +/* @generated */ diff --git a/support/xhpast/xhpast.cpp b/support/xhpast/xhpast.cpp new file mode 100644 index 00000000..34efcf1a --- /dev/null +++ b/support/xhpast/xhpast.cpp @@ -0,0 +1,124 @@ +#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); + +#ifndef XHPAST_VERSION +#error Define XHPAST_VERSION when building XHPAST. +#endif + +int main(int argc, char* argv[]) { + if (argc != 1) { + cout << XHPAST_VERSION << "\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("]"); + } +}