GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Pull Request — master (#1805)
by
unknown
18:31
created
libs/FirePHPCore/FirePHP.class.php 4 patches
Doc Comments   +13 added lines, -14 removed lines patch added patch discarded remove patch
@@ -226,7 +226,7 @@  discard block
 block discarded – undo
226 226
   /**
227 227
    * When the object gets serialized only include specific object members.
228 228
    * 
229
-   * @return array
229
+   * @return string[]
230 230
    */  
231 231
   public function __sleep() {
232 232
     return array('options','objectFilters','enabled');
@@ -316,7 +316,7 @@  discard block
 block discarded – undo
316 316
    * 
317 317
    * Will throw exceptions for each php error.
318 318
    * 
319
-   * @return mixed Returns a string containing the previously defined error handler (if any)
319
+   * @return null|callable Returns a string containing the previously defined error handler (if any)
320 320
    */
321 321
   public function registerErrorHandler($throwErrorExceptions=true)
322 322
   {
@@ -362,7 +362,7 @@  discard block
 block discarded – undo
362 362
   /**
363 363
    * Register FirePHP as your exception handler
364 364
    * 
365
-   * @return mixed Returns the name of the previously defined exception handler,
365
+   * @return callable Returns the name of the previously defined exception handler,
366 366
    *               or NULL on error.
367 367
    *               If no previous handler was defined, NULL is also returned.
368 368
    */
@@ -467,7 +467,7 @@  discard block
 block discarded – undo
467 467
    *
468 468
    * @param string $Name
469 469
    * @param array $Options OPTIONAL Instructions on how to log the group
470
-   * @return true
470
+   * @return boolean
471 471
    * @throws Exception
472 472
    */
473 473
   public function group($Name, $Options=null) {
@@ -491,7 +491,7 @@  discard block
 block discarded – undo
491 491
   /**
492 492
    * Ends a group you have started before
493 493
    *
494
-   * @return true
494
+   * @return boolean
495 495
    * @throws Exception
496 496
    */
497 497
   public function groupEnd() {
@@ -504,7 +504,7 @@  discard block
 block discarded – undo
504 504
    * @see FirePHP::LOG
505 505
    * @param mixes $Object
506 506
    * @param string $Label
507
-   * @return true
507
+   * @return boolean
508 508
    * @throws Exception
509 509
    */
510 510
   public function log($Object, $Label=null) {
@@ -517,7 +517,7 @@  discard block
 block discarded – undo
517 517
    * @see FirePHP::INFO
518 518
    * @param mixes $Object
519 519
    * @param string $Label
520
-   * @return true
520
+   * @return boolean
521 521
    * @throws Exception
522 522
    */
523 523
   public function info($Object, $Label=null) {
@@ -530,7 +530,7 @@  discard block
 block discarded – undo
530 530
    * @see FirePHP::WARN
531 531
    * @param mixes $Object
532 532
    * @param string $Label
533
-   * @return true
533
+   * @return boolean
534 534
    * @throws Exception
535 535
    */
536 536
   public function warn($Object, $Label=null) {
@@ -543,7 +543,7 @@  discard block
 block discarded – undo
543 543
    * @see FirePHP::ERROR
544 544
    * @param mixes $Object
545 545
    * @param string $Label
546
-   * @return true
546
+   * @return boolean
547 547
    * @throws Exception
548 548
    */
549 549
   public function error($Object, $Label=null) {
@@ -556,7 +556,7 @@  discard block
 block discarded – undo
556 556
    * @see FirePHP::DUMP
557 557
    * @param string $Key
558 558
    * @param mixed $Variable
559
-   * @return true
559
+   * @return boolean
560 560
    * @throws Exception
561 561
    */
562 562
   public function dump($Key, $Variable) {
@@ -568,7 +568,7 @@  discard block
 block discarded – undo
568 568
    *
569 569
    * @see FirePHP::TRACE
570 570
    * @param string $Label
571
-   * @return true
571
+   * @return boolean
572 572
    * @throws Exception
573 573
    */
574 574
   public function trace($Label) {
@@ -581,7 +581,7 @@  discard block
 block discarded – undo
581 581
    * @see FirePHP::TABLE
582 582
    * @param string $Label
583 583
    * @param string $Table
584
-   * @return true
584
+   * @return boolean
585 585
    * @throws Exception
586 586
    */
587 587
   public function table($Label, $Table) {
@@ -607,7 +607,7 @@  discard block
 block discarded – undo
607 607
    * 
608 608
    * @see http://www.firephp.org/Wiki/Reference/Fb
609 609
    * @param mixed $Object The variable to be logged
610
-   * @return true Return TRUE if message was added to headers, FALSE otherwise
610
+   * @return boolean Return TRUE if message was added to headers, FALSE otherwise
611 611
    * @throws Exception
612 612
    */
613 613
   public function fb($Object) {
@@ -1005,7 +1005,6 @@  discard block
 block discarded – undo
1005 1005
    * protected and private visibility
1006 1006
    * 
1007 1007
    * @param Object $Object The object to be encoded
1008
-   * @param int $Depth The current traversal depth
1009 1008
    * @return array All members of the object
1010 1009
    */
1011 1010
   protected function encodeObject($Object, $ObjectDepth = 1, $ArrayDepth = 1)
Please login to merge, or discard this patch.
Indentation   +677 added lines, -677 removed lines patch added patch discarded remove patch
@@ -192,9 +192,9 @@  discard block
 block discarded – undo
192 192
    * @var array
193 193
    */
194 194
   protected $options = array('maxObjectDepth' => 10,
195
-                             'maxArrayDepth' => 20,
196
-                             'useNativeJsonEncode' => true,
197
-                             'includeLineNumbers' => true);
195
+							 'maxArrayDepth' => 20,
196
+							 'useNativeJsonEncode' => true,
197
+							 'includeLineNumbers' => true);
198 198
 
199 199
   /**
200 200
    * Filters used to exclude object members when encoding
@@ -229,7 +229,7 @@  discard block
 block discarded – undo
229 229
    * @return array
230 230
    */  
231 231
   public function __sleep() {
232
-    return array('options','objectFilters','enabled');
232
+	return array('options','objectFilters','enabled');
233 233
   }
234 234
     
235 235
   /**
@@ -239,10 +239,10 @@  discard block
 block discarded – undo
239 239
    * @return FirePHP
240 240
    */
241 241
   public static function getInstance($AutoCreate=false) {
242
-    if($AutoCreate===true && !self::$instance) {
243
-      self::init();
244
-    }
245
-    return self::$instance;
242
+	if($AutoCreate===true && !self::$instance) {
243
+	  self::init();
244
+	}
245
+	return self::$instance;
246 246
   }
247 247
    
248 248
   /**
@@ -251,7 +251,7 @@  discard block
 block discarded – undo
251 251
    * @return FirePHP
252 252
    */
253 253
   public static function init() {
254
-    return self::$instance = new self();
254
+	return self::$instance = new self();
255 255
   }
256 256
   
257 257
   /**
@@ -261,7 +261,7 @@  discard block
 block discarded – undo
261 261
    * @return void
262 262
    */
263 263
   public function setEnabled($Enabled) {
264
-    $this->enabled = $Enabled;
264
+	$this->enabled = $Enabled;
265 265
   }
266 266
   
267 267
   /**
@@ -270,7 +270,7 @@  discard block
 block discarded – undo
270 270
    * @return boolean TRUE if enabled
271 271
    */
272 272
   public function getEnabled() {
273
-    return $this->enabled;
273
+	return $this->enabled;
274 274
   }
275 275
   
276 276
   /**
@@ -283,7 +283,7 @@  discard block
 block discarded – undo
283 283
    * @return void
284 284
    */
285 285
   public function setObjectFilter($Class, $Filter) {
286
-    $this->objectFilters[strtolower($Class)] = $Filter;
286
+	$this->objectFilters[strtolower($Class)] = $Filter;
287 287
   }
288 288
   
289 289
   /**
@@ -299,7 +299,7 @@  discard block
 block discarded – undo
299 299
    * @return void
300 300
    */
301 301
   public function setOptions($Options) {
302
-    $this->options = array_merge($this->options,$Options);
302
+	$this->options = array_merge($this->options,$Options);
303 303
   }
304 304
   
305 305
   /**
@@ -308,7 +308,7 @@  discard block
 block discarded – undo
308 308
    * @return array The currently set options
309 309
    */
310 310
   public function getOptions() {
311
-    return $this->options;
311
+	return $this->options;
312 312
   }
313 313
   
314 314
   /**
@@ -320,14 +320,14 @@  discard block
 block discarded – undo
320 320
    */
321 321
   public function registerErrorHandler($throwErrorExceptions=true)
322 322
   {
323
-    //NOTE: The following errors will not be caught by this error handler:
324
-    //      E_ERROR, E_PARSE, E_CORE_ERROR,
325
-    //      E_CORE_WARNING, E_COMPILE_ERROR,
326
-    //      E_COMPILE_WARNING, E_STRICT
323
+	//NOTE: The following errors will not be caught by this error handler:
324
+	//      E_ERROR, E_PARSE, E_CORE_ERROR,
325
+	//      E_CORE_WARNING, E_COMPILE_ERROR,
326
+	//      E_COMPILE_WARNING, E_STRICT
327 327
     
328
-    $this->throwErrorExceptions = $throwErrorExceptions;
328
+	$this->throwErrorExceptions = $throwErrorExceptions;
329 329
     
330
-    return set_error_handler(array($this,'errorHandler'));     
330
+	return set_error_handler(array($this,'errorHandler'));     
331 331
   }
332 332
 
333 333
   /**
@@ -343,20 +343,20 @@  discard block
 block discarded – undo
343 343
    */
344 344
   public function errorHandler($errno, $errstr, $errfile, $errline, $errcontext)
345 345
   {
346
-    // Don't throw exception if error reporting is switched off
347
-    if (error_reporting() == 0) {
348
-      return;
349
-    }
350
-    // Only throw exceptions for errors we are asking for
351
-    if (error_reporting() & $errno) {
352
-
353
-      $exception = new ErrorException($errstr, 0, $errno, $errfile, $errline);
354
-      if($this->throwErrorExceptions) {
355
-        throw $exception;
356
-      } else {
357
-        $this->fb($exception);
358
-      }
359
-    }
346
+	// Don't throw exception if error reporting is switched off
347
+	if (error_reporting() == 0) {
348
+	  return;
349
+	}
350
+	// Only throw exceptions for errors we are asking for
351
+	if (error_reporting() & $errno) {
352
+
353
+	  $exception = new ErrorException($errstr, 0, $errno, $errfile, $errline);
354
+	  if($this->throwErrorExceptions) {
355
+		throw $exception;
356
+	  } else {
357
+		$this->fb($exception);
358
+	  }
359
+	}
360 360
   }
361 361
   
362 362
   /**
@@ -368,7 +368,7 @@  discard block
 block discarded – undo
368 368
    */
369 369
   public function registerExceptionHandler()
370 370
   {
371
-    return set_exception_handler(array($this,'exceptionHandler'));     
371
+	return set_exception_handler(array($this,'exceptionHandler'));     
372 372
   }
373 373
   
374 374
   /**
@@ -381,13 +381,13 @@  discard block
 block discarded – undo
381 381
    */
382 382
   function exceptionHandler($Exception) {
383 383
     
384
-    $this->inExceptionHandler = true;
384
+	$this->inExceptionHandler = true;
385 385
 
386
-    header('HTTP/1.1 500 Internal Server Error');
386
+	header('HTTP/1.1 500 Internal Server Error');
387 387
 
388
-    $this->fb($Exception);
388
+	$this->fb($Exception);
389 389
     
390
-    $this->inExceptionHandler = false;
390
+	$this->inExceptionHandler = false;
391 391
   }
392 392
   
393 393
   /**
@@ -399,14 +399,14 @@  discard block
 block discarded – undo
399 399
    */
400 400
   public function registerAssertionHandler($convertAssertionErrorsToExceptions=true, $throwAssertionExceptions=false)
401 401
   {
402
-    $this->convertAssertionErrorsToExceptions = $convertAssertionErrorsToExceptions;
403
-    $this->throwAssertionExceptions = $throwAssertionExceptions;
402
+	$this->convertAssertionErrorsToExceptions = $convertAssertionErrorsToExceptions;
403
+	$this->throwAssertionExceptions = $throwAssertionExceptions;
404 404
     
405
-    if($throwAssertionExceptions && !$convertAssertionErrorsToExceptions) {
406
-      throw $this->newException('Cannot throw assertion exceptions as assertion errors are not being converted to exceptions!');
407
-    }
405
+	if($throwAssertionExceptions && !$convertAssertionErrorsToExceptions) {
406
+	  throw $this->newException('Cannot throw assertion exceptions as assertion errors are not being converted to exceptions!');
407
+	}
408 408
     
409
-    return assert_options(ASSERT_CALLBACK, array($this, 'assertionHandler'));
409
+	return assert_options(ASSERT_CALLBACK, array($this, 'assertionHandler'));
410 410
   }
411 411
   
412 412
   /**
@@ -421,21 +421,21 @@  discard block
 block discarded – undo
421 421
   public function assertionHandler($file, $line, $code)
422 422
   {
423 423
 
424
-    if($this->convertAssertionErrorsToExceptions) {
424
+	if($this->convertAssertionErrorsToExceptions) {
425 425
       
426
-      $exception = new ErrorException('Assertion Failed - Code[ '.$code.' ]', 0, null, $file, $line);
426
+	  $exception = new ErrorException('Assertion Failed - Code[ '.$code.' ]', 0, null, $file, $line);
427 427
 
428
-      if($this->throwAssertionExceptions) {
429
-        throw $exception;
430
-      } else {
431
-        $this->fb($exception);
432
-      }
428
+	  if($this->throwAssertionExceptions) {
429
+		throw $exception;
430
+	  } else {
431
+		$this->fb($exception);
432
+	  }
433 433
     
434
-    } else {
434
+	} else {
435 435
     
436
-      $this->fb($code, 'Assertion Failed', FirePHP::ERROR, array('File'=>$file,'Line'=>$line));
436
+	  $this->fb($code, 'Assertion Failed', FirePHP::ERROR, array('File'=>$file,'Line'=>$line));
437 437
     
438
-    }
438
+	}
439 439
   }  
440 440
   
441 441
   /**
@@ -445,7 +445,7 @@  discard block
 block discarded – undo
445 445
    */    
446 446
   public function setProcessorUrl($URL)
447 447
   {
448
-    $this->setHeader('X-FirePHP-ProcessorURL', $URL);
448
+	$this->setHeader('X-FirePHP-ProcessorURL', $URL);
449 449
   }
450 450
 
451 451
   /**
@@ -455,7 +455,7 @@  discard block
 block discarded – undo
455 455
    */
456 456
   public function setRendererUrl($URL)
457 457
   {
458
-    $this->setHeader('X-FirePHP-RendererURL', $URL);
458
+	$this->setHeader('X-FirePHP-RendererURL', $URL);
459 459
   }
460 460
   
461 461
   /**
@@ -472,20 +472,20 @@  discard block
 block discarded – undo
472 472
    */
473 473
   public function group($Name, $Options=null) {
474 474
     
475
-    if(!$Name) {
476
-      throw $this->newException('You must specify a label for the group!');
477
-    }
475
+	if(!$Name) {
476
+	  throw $this->newException('You must specify a label for the group!');
477
+	}
478 478
     
479
-    if($Options) {
480
-      if(!is_array($Options)) {
481
-        throw $this->newException('Options must be defined as an array!');
482
-      }
483
-      if(array_key_exists('Collapsed', $Options)) {
484
-        $Options['Collapsed'] = ($Options['Collapsed'])?'true':'false';
485
-      }
486
-    }
479
+	if($Options) {
480
+	  if(!is_array($Options)) {
481
+		throw $this->newException('Options must be defined as an array!');
482
+	  }
483
+	  if(array_key_exists('Collapsed', $Options)) {
484
+		$Options['Collapsed'] = ($Options['Collapsed'])?'true':'false';
485
+	  }
486
+	}
487 487
     
488
-    return $this->fb(null, $Name, FirePHP::GROUP_START, $Options);
488
+	return $this->fb(null, $Name, FirePHP::GROUP_START, $Options);
489 489
   }
490 490
   
491 491
   /**
@@ -495,7 +495,7 @@  discard block
 block discarded – undo
495 495
    * @throws Exception
496 496
    */
497 497
   public function groupEnd() {
498
-    return $this->fb(null, null, FirePHP::GROUP_END);
498
+	return $this->fb(null, null, FirePHP::GROUP_END);
499 499
   }
500 500
 
501 501
   /**
@@ -508,7 +508,7 @@  discard block
 block discarded – undo
508 508
    * @throws Exception
509 509
    */
510 510
   public function log($Object, $Label=null) {
511
-    return $this->fb($Object, $Label, FirePHP::LOG);
511
+	return $this->fb($Object, $Label, FirePHP::LOG);
512 512
   } 
513 513
 
514 514
   /**
@@ -521,7 +521,7 @@  discard block
 block discarded – undo
521 521
    * @throws Exception
522 522
    */
523 523
   public function info($Object, $Label=null) {
524
-    return $this->fb($Object, $Label, FirePHP::INFO);
524
+	return $this->fb($Object, $Label, FirePHP::INFO);
525 525
   } 
526 526
 
527 527
   /**
@@ -534,7 +534,7 @@  discard block
 block discarded – undo
534 534
    * @throws Exception
535 535
    */
536 536
   public function warn($Object, $Label=null) {
537
-    return $this->fb($Object, $Label, FirePHP::WARN);
537
+	return $this->fb($Object, $Label, FirePHP::WARN);
538 538
   } 
539 539
 
540 540
   /**
@@ -547,7 +547,7 @@  discard block
 block discarded – undo
547 547
    * @throws Exception
548 548
    */
549 549
   public function error($Object, $Label=null) {
550
-    return $this->fb($Object, $Label, FirePHP::ERROR);
550
+	return $this->fb($Object, $Label, FirePHP::ERROR);
551 551
   } 
552 552
 
553 553
   /**
@@ -560,7 +560,7 @@  discard block
 block discarded – undo
560 560
    * @throws Exception
561 561
    */
562 562
   public function dump($Key, $Variable) {
563
-    return $this->fb($Variable, $Key, FirePHP::DUMP);
563
+	return $this->fb($Variable, $Key, FirePHP::DUMP);
564 564
   }
565 565
   
566 566
   /**
@@ -572,7 +572,7 @@  discard block
 block discarded – undo
572 572
    * @throws Exception
573 573
    */
574 574
   public function trace($Label) {
575
-    return $this->fb($Label, FirePHP::TRACE);
575
+	return $this->fb($Label, FirePHP::TRACE);
576 576
   } 
577 577
 
578 578
   /**
@@ -585,7 +585,7 @@  discard block
 block discarded – undo
585 585
    * @throws Exception
586 586
    */
587 587
   public function table($Label, $Table) {
588
-    return $this->fb($Table, $Label, FirePHP::TABLE);
588
+	return $this->fb($Table, $Label, FirePHP::TABLE);
589 589
   }
590 590
   
591 591
   /**
@@ -594,12 +594,12 @@  discard block
 block discarded – undo
594 594
    * @return boolean
595 595
    */
596 596
   public function detectClientExtension() {
597
-    /* Check if FirePHP is installed on client */
598
-    if(!@preg_match_all('/\sFirePHP\/([\.|\d]*)\s?/si',$this->getUserAgent(),$m) ||
599
-       !version_compare($m[1][0],'0.0.6','>=')) {
600
-      return false;
601
-    }
602
-    return true;    
597
+	/* Check if FirePHP is installed on client */
598
+	if(!@preg_match_all('/\sFirePHP\/([\.|\d]*)\s?/si',$this->getUserAgent(),$m) ||
599
+	   !version_compare($m[1][0],'0.0.6','>=')) {
600
+	  return false;
601
+	}
602
+	return true;    
603 603
   }
604 604
  
605 605
   /**
@@ -612,265 +612,265 @@  discard block
 block discarded – undo
612 612
    */
613 613
   public function fb($Object) {
614 614
   
615
-    if(!$this->enabled) {
616
-      return false;
617
-    }
615
+	if(!$this->enabled) {
616
+	  return false;
617
+	}
618 618
   
619
-    if (headers_sent($filename, $linenum)) {
620
-      // If we are logging from within the exception handler we cannot throw another exception
621
-      if($this->inExceptionHandler) {
622
-        // Simply echo the error out to the page
623
-        echo '<div style="border: 2px solid red; font-family: Arial; font-size: 12px; background-color: lightgray; padding: 5px;"><span style="color: red; font-weight: bold;">FirePHP ERROR:</span> Headers already sent in <b>'.$filename.'</b> on line <b>'.$linenum.'</b>. Cannot send log data to FirePHP. You must have Output Buffering enabled via ob_start() or output_buffering ini directive.</div>';
624
-      } else {
625
-        throw $this->newException('Headers already sent in '.$filename.' on line '.$linenum.'. Cannot send log data to FirePHP. You must have Output Buffering enabled via ob_start() or output_buffering ini directive.');
626
-      }
627
-    }
619
+	if (headers_sent($filename, $linenum)) {
620
+	  // If we are logging from within the exception handler we cannot throw another exception
621
+	  if($this->inExceptionHandler) {
622
+		// Simply echo the error out to the page
623
+		echo '<div style="border: 2px solid red; font-family: Arial; font-size: 12px; background-color: lightgray; padding: 5px;"><span style="color: red; font-weight: bold;">FirePHP ERROR:</span> Headers already sent in <b>'.$filename.'</b> on line <b>'.$linenum.'</b>. Cannot send log data to FirePHP. You must have Output Buffering enabled via ob_start() or output_buffering ini directive.</div>';
624
+	  } else {
625
+		throw $this->newException('Headers already sent in '.$filename.' on line '.$linenum.'. Cannot send log data to FirePHP. You must have Output Buffering enabled via ob_start() or output_buffering ini directive.');
626
+	  }
627
+	}
628 628
   
629
-    $Type = null;
630
-    $Label = null;
631
-    $Options = array();
629
+	$Type = null;
630
+	$Label = null;
631
+	$Options = array();
632 632
   
633
-    if(func_num_args()==1) {
634
-    } else
635
-    if(func_num_args()==2) {
636
-      switch(func_get_arg(1)) {
637
-        case self::LOG:
638
-        case self::INFO:
639
-        case self::WARN:
640
-        case self::ERROR:
641
-        case self::DUMP:
642
-        case self::TRACE:
643
-        case self::EXCEPTION:
644
-        case self::TABLE:
645
-        case self::GROUP_START:
646
-        case self::GROUP_END:
647
-          $Type = func_get_arg(1);
648
-          break;
649
-        default:
650
-          $Label = func_get_arg(1);
651
-          break;
652
-      }
653
-    } else
654
-    if(func_num_args()==3) {
655
-      $Type = func_get_arg(2);
656
-      $Label = func_get_arg(1);
657
-    } else
658
-    if(func_num_args()==4) {
659
-      $Type = func_get_arg(2);
660
-      $Label = func_get_arg(1);
661
-      $Options = func_get_arg(3);
662
-    } else {
663
-      throw $this->newException('Wrong number of arguments to fb() function!');
664
-    }
633
+	if(func_num_args()==1) {
634
+	} else
635
+	if(func_num_args()==2) {
636
+	  switch(func_get_arg(1)) {
637
+		case self::LOG:
638
+		case self::INFO:
639
+		case self::WARN:
640
+		case self::ERROR:
641
+		case self::DUMP:
642
+		case self::TRACE:
643
+		case self::EXCEPTION:
644
+		case self::TABLE:
645
+		case self::GROUP_START:
646
+		case self::GROUP_END:
647
+		  $Type = func_get_arg(1);
648
+		  break;
649
+		default:
650
+		  $Label = func_get_arg(1);
651
+		  break;
652
+	  }
653
+	} else
654
+	if(func_num_args()==3) {
655
+	  $Type = func_get_arg(2);
656
+	  $Label = func_get_arg(1);
657
+	} else
658
+	if(func_num_args()==4) {
659
+	  $Type = func_get_arg(2);
660
+	  $Label = func_get_arg(1);
661
+	  $Options = func_get_arg(3);
662
+	} else {
663
+	  throw $this->newException('Wrong number of arguments to fb() function!');
664
+	}
665 665
   
666 666
   
667
-    if(!$this->detectClientExtension()) {
668
-      return false;
669
-    }
667
+	if(!$this->detectClientExtension()) {
668
+	  return false;
669
+	}
670 670
   
671
-    $meta = array();
672
-    $skipFinalObjectEncode = false;
671
+	$meta = array();
672
+	$skipFinalObjectEncode = false;
673 673
   
674
-    if($Object instanceof Exception) {
674
+	if($Object instanceof Exception) {
675 675
 
676
-      $meta['file'] = $this->_escapeTraceFile($Object->getFile());
677
-      $meta['line'] = $Object->getLine();
676
+	  $meta['file'] = $this->_escapeTraceFile($Object->getFile());
677
+	  $meta['line'] = $Object->getLine();
678 678
       
679
-      $trace = $Object->getTrace();
680
-      if($Object instanceof ErrorException
681
-         && isset($trace[0]['function'])
682
-         && $trace[0]['function']=='errorHandler'
683
-         && isset($trace[0]['class'])
684
-         && $trace[0]['class']=='FirePHP') {
679
+	  $trace = $Object->getTrace();
680
+	  if($Object instanceof ErrorException
681
+		 && isset($trace[0]['function'])
682
+		 && $trace[0]['function']=='errorHandler'
683
+		 && isset($trace[0]['class'])
684
+		 && $trace[0]['class']=='FirePHP') {
685 685
            
686
-        $severity = false;
687
-        switch($Object->getSeverity()) {
688
-          case E_WARNING: $severity = 'E_WARNING'; break;
689
-          case E_NOTICE: $severity = 'E_NOTICE'; break;
690
-          case E_USER_ERROR: $severity = 'E_USER_ERROR'; break;
691
-          case E_USER_WARNING: $severity = 'E_USER_WARNING'; break;
692
-          case E_USER_NOTICE: $severity = 'E_USER_NOTICE'; break;
693
-          case E_STRICT: $severity = 'E_STRICT'; break;
694
-          case E_RECOVERABLE_ERROR: $severity = 'E_RECOVERABLE_ERROR'; break;
695
-          case E_DEPRECATED: $severity = 'E_DEPRECATED'; break;
696
-          case E_USER_DEPRECATED: $severity = 'E_USER_DEPRECATED'; break;
697
-        }
686
+		$severity = false;
687
+		switch($Object->getSeverity()) {
688
+		  case E_WARNING: $severity = 'E_WARNING'; break;
689
+		  case E_NOTICE: $severity = 'E_NOTICE'; break;
690
+		  case E_USER_ERROR: $severity = 'E_USER_ERROR'; break;
691
+		  case E_USER_WARNING: $severity = 'E_USER_WARNING'; break;
692
+		  case E_USER_NOTICE: $severity = 'E_USER_NOTICE'; break;
693
+		  case E_STRICT: $severity = 'E_STRICT'; break;
694
+		  case E_RECOVERABLE_ERROR: $severity = 'E_RECOVERABLE_ERROR'; break;
695
+		  case E_DEPRECATED: $severity = 'E_DEPRECATED'; break;
696
+		  case E_USER_DEPRECATED: $severity = 'E_USER_DEPRECATED'; break;
697
+		}
698 698
            
699
-        $Object = array('Class'=>get_class($Object),
700
-                        'Message'=>$severity.': '.$Object->getMessage(),
701
-                        'File'=>$this->_escapeTraceFile($Object->getFile()),
702
-                        'Line'=>$Object->getLine(),
703
-                        'Type'=>'trigger',
704
-                        'Trace'=>$this->_escapeTrace(array_splice($trace,2)));
705
-        $skipFinalObjectEncode = true;
706
-      } else {
707
-        $Object = array('Class'=>get_class($Object),
708
-                        'Message'=>$Object->getMessage(),
709
-                        'File'=>$this->_escapeTraceFile($Object->getFile()),
710
-                        'Line'=>$Object->getLine(),
711
-                        'Type'=>'throw',
712
-                        'Trace'=>$this->_escapeTrace($trace));
713
-        $skipFinalObjectEncode = true;
714
-      }
715
-      $Type = self::EXCEPTION;
699
+		$Object = array('Class'=>get_class($Object),
700
+						'Message'=>$severity.': '.$Object->getMessage(),
701
+						'File'=>$this->_escapeTraceFile($Object->getFile()),
702
+						'Line'=>$Object->getLine(),
703
+						'Type'=>'trigger',
704
+						'Trace'=>$this->_escapeTrace(array_splice($trace,2)));
705
+		$skipFinalObjectEncode = true;
706
+	  } else {
707
+		$Object = array('Class'=>get_class($Object),
708
+						'Message'=>$Object->getMessage(),
709
+						'File'=>$this->_escapeTraceFile($Object->getFile()),
710
+						'Line'=>$Object->getLine(),
711
+						'Type'=>'throw',
712
+						'Trace'=>$this->_escapeTrace($trace));
713
+		$skipFinalObjectEncode = true;
714
+	  }
715
+	  $Type = self::EXCEPTION;
716 716
       
717
-    } else
718
-    if($Type==self::TRACE) {
717
+	} else
718
+	if($Type==self::TRACE) {
719 719
       
720
-      $trace = debug_backtrace();
721
-      if(!$trace) return false;
722
-      for( $i=0 ; $i<sizeof($trace) ; $i++ ) {
723
-
724
-        if(isset($trace[$i]['class'])
725
-           && isset($trace[$i]['file'])
726
-           && ($trace[$i]['class']=='FirePHP'
727
-               || $trace[$i]['class']=='FB')
728
-           && (substr($this->_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php'
729
-               || substr($this->_standardizePath($trace[$i]['file']),-29,29)=='FirePHPCore/FirePHP.class.php')) {
730
-          /* Skip - FB::trace(), FB::send(), $firephp->trace(), $firephp->fb() */
731
-        } else
732
-        if(isset($trace[$i]['class'])
733
-           && isset($trace[$i+1]['file'])
734
-           && $trace[$i]['class']=='FirePHP'
735
-           && substr($this->_standardizePath($trace[$i+1]['file']),-18,18)=='FirePHPCore/fb.php') {
736
-          /* Skip fb() */
737
-        } else
738
-        if($trace[$i]['function']=='fb'
739
-           || $trace[$i]['function']=='trace'
740
-           || $trace[$i]['function']=='send') {
741
-          $Object = array('Class'=>isset($trace[$i]['class'])?$trace[$i]['class']:'',
742
-                          'Type'=>isset($trace[$i]['type'])?$trace[$i]['type']:'',
743
-                          'Function'=>isset($trace[$i]['function'])?$trace[$i]['function']:'',
744
-                          'Message'=>$trace[$i]['args'][0],
745
-                          'File'=>isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'',
746
-                          'Line'=>isset($trace[$i]['line'])?$trace[$i]['line']:'',
747
-                          'Args'=>isset($trace[$i]['args'])?$this->encodeObject($trace[$i]['args']):'',
748
-                          'Trace'=>$this->_escapeTrace(array_splice($trace,$i+1)));
749
-
750
-          $skipFinalObjectEncode = true;
751
-          $meta['file'] = isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'';
752
-          $meta['line'] = isset($trace[$i]['line'])?$trace[$i]['line']:'';
753
-          break;
754
-        }
755
-      }
756
-
757
-    } else
758
-    if($Type==self::TABLE) {
720
+	  $trace = debug_backtrace();
721
+	  if(!$trace) return false;
722
+	  for( $i=0 ; $i<sizeof($trace) ; $i++ ) {
723
+
724
+		if(isset($trace[$i]['class'])
725
+		   && isset($trace[$i]['file'])
726
+		   && ($trace[$i]['class']=='FirePHP'
727
+			   || $trace[$i]['class']=='FB')
728
+		   && (substr($this->_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php'
729
+			   || substr($this->_standardizePath($trace[$i]['file']),-29,29)=='FirePHPCore/FirePHP.class.php')) {
730
+		  /* Skip - FB::trace(), FB::send(), $firephp->trace(), $firephp->fb() */
731
+		} else
732
+		if(isset($trace[$i]['class'])
733
+		   && isset($trace[$i+1]['file'])
734
+		   && $trace[$i]['class']=='FirePHP'
735
+		   && substr($this->_standardizePath($trace[$i+1]['file']),-18,18)=='FirePHPCore/fb.php') {
736
+		  /* Skip fb() */
737
+		} else
738
+		if($trace[$i]['function']=='fb'
739
+		   || $trace[$i]['function']=='trace'
740
+		   || $trace[$i]['function']=='send') {
741
+		  $Object = array('Class'=>isset($trace[$i]['class'])?$trace[$i]['class']:'',
742
+						  'Type'=>isset($trace[$i]['type'])?$trace[$i]['type']:'',
743
+						  'Function'=>isset($trace[$i]['function'])?$trace[$i]['function']:'',
744
+						  'Message'=>$trace[$i]['args'][0],
745
+						  'File'=>isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'',
746
+						  'Line'=>isset($trace[$i]['line'])?$trace[$i]['line']:'',
747
+						  'Args'=>isset($trace[$i]['args'])?$this->encodeObject($trace[$i]['args']):'',
748
+						  'Trace'=>$this->_escapeTrace(array_splice($trace,$i+1)));
749
+
750
+		  $skipFinalObjectEncode = true;
751
+		  $meta['file'] = isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'';
752
+		  $meta['line'] = isset($trace[$i]['line'])?$trace[$i]['line']:'';
753
+		  break;
754
+		}
755
+	  }
756
+
757
+	} else
758
+	if($Type==self::TABLE) {
759 759
       
760
-      if(isset($Object[0]) && is_string($Object[0])) {
761
-        $Object[1] = $this->encodeTable($Object[1]);
762
-      } else {
763
-        $Object = $this->encodeTable($Object);
764
-      }
760
+	  if(isset($Object[0]) && is_string($Object[0])) {
761
+		$Object[1] = $this->encodeTable($Object[1]);
762
+	  } else {
763
+		$Object = $this->encodeTable($Object);
764
+	  }
765 765
 
766
-      $skipFinalObjectEncode = true;
766
+	  $skipFinalObjectEncode = true;
767 767
       
768
-    } else
769
-    if($Type==self::GROUP_START) {
768
+	} else
769
+	if($Type==self::GROUP_START) {
770 770
       
771
-      if(!$Label) {
772
-        throw $this->newException('You must specify a label for the group!');
773
-      }
771
+	  if(!$Label) {
772
+		throw $this->newException('You must specify a label for the group!');
773
+	  }
774 774
       
775
-    } else {
776
-      if($Type===null) {
777
-        $Type = self::LOG;
778
-      }
779
-    }
775
+	} else {
776
+	  if($Type===null) {
777
+		$Type = self::LOG;
778
+	  }
779
+	}
780 780
     
781
-    if($this->options['includeLineNumbers']) {
782
-      if(!isset($meta['file']) || !isset($meta['line'])) {
781
+	if($this->options['includeLineNumbers']) {
782
+	  if(!isset($meta['file']) || !isset($meta['line'])) {
783 783
 
784
-        $trace = debug_backtrace();
785
-        for( $i=0 ; $trace && $i<sizeof($trace) ; $i++ ) {
784
+		$trace = debug_backtrace();
785
+		for( $i=0 ; $trace && $i<sizeof($trace) ; $i++ ) {
786 786
   
787
-          if(isset($trace[$i]['class'])
788
-             && isset($trace[$i]['file'])
789
-             && ($trace[$i]['class']=='FirePHP'
790
-                 || $trace[$i]['class']=='FB')
791
-             && (substr($this->_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php'
792
-                 || substr($this->_standardizePath($trace[$i]['file']),-29,29)=='FirePHPCore/FirePHP.class.php')) {
793
-            /* Skip - FB::trace(), FB::send(), $firephp->trace(), $firephp->fb() */
794
-          } else
795
-          if(isset($trace[$i]['class'])
796
-             && isset($trace[$i+1]['file'])
797
-             && $trace[$i]['class']=='FirePHP'
798
-             && substr($this->_standardizePath($trace[$i+1]['file']),-18,18)=='FirePHPCore/fb.php') {
799
-            /* Skip fb() */
800
-          } else
801
-          if(isset($trace[$i]['file'])
802
-             && substr($this->_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php') {
803
-            /* Skip FB::fb() */
804
-          } else {
805
-            $meta['file'] = isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'';
806
-            $meta['line'] = isset($trace[$i]['line'])?$trace[$i]['line']:'';
807
-            break;
808
-          }
809
-        }      
787
+		  if(isset($trace[$i]['class'])
788
+			 && isset($trace[$i]['file'])
789
+			 && ($trace[$i]['class']=='FirePHP'
790
+				 || $trace[$i]['class']=='FB')
791
+			 && (substr($this->_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php'
792
+				 || substr($this->_standardizePath($trace[$i]['file']),-29,29)=='FirePHPCore/FirePHP.class.php')) {
793
+			/* Skip - FB::trace(), FB::send(), $firephp->trace(), $firephp->fb() */
794
+		  } else
795
+		  if(isset($trace[$i]['class'])
796
+			 && isset($trace[$i+1]['file'])
797
+			 && $trace[$i]['class']=='FirePHP'
798
+			 && substr($this->_standardizePath($trace[$i+1]['file']),-18,18)=='FirePHPCore/fb.php') {
799
+			/* Skip fb() */
800
+		  } else
801
+		  if(isset($trace[$i]['file'])
802
+			 && substr($this->_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php') {
803
+			/* Skip FB::fb() */
804
+		  } else {
805
+			$meta['file'] = isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'';
806
+			$meta['line'] = isset($trace[$i]['line'])?$trace[$i]['line']:'';
807
+			break;
808
+		  }
809
+		}      
810 810
       
811
-      }
812
-    } else {
813
-      unset($meta['file']);
814
-      unset($meta['line']);
815
-    }
811
+	  }
812
+	} else {
813
+	  unset($meta['file']);
814
+	  unset($meta['line']);
815
+	}
816 816
 
817 817
   	$this->setHeader('X-Wf-Protocol-1','http://meta.wildfirehq.org/Protocol/JsonStream/0.2');
818 818
   	$this->setHeader('X-Wf-1-Plugin-1','http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/'.self::VERSION);
819 819
  
820
-    $structure_index = 1;
821
-    if($Type==self::DUMP) {
822
-      $structure_index = 2;
823
-    	$this->setHeader('X-Wf-1-Structure-2','http://meta.firephp.org/Wildfire/Structure/FirePHP/Dump/0.1');
824
-    } else {
825
-    	$this->setHeader('X-Wf-1-Structure-1','http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1');
826
-    }
820
+	$structure_index = 1;
821
+	if($Type==self::DUMP) {
822
+	  $structure_index = 2;
823
+		$this->setHeader('X-Wf-1-Structure-2','http://meta.firephp.org/Wildfire/Structure/FirePHP/Dump/0.1');
824
+	} else {
825
+		$this->setHeader('X-Wf-1-Structure-1','http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1');
826
+	}
827 827
   
828
-    if($Type==self::DUMP) {
829
-    	$msg = '{"'.$Label.'":'.$this->jsonEncode($Object, $skipFinalObjectEncode).'}';
830
-    } else {
831
-      $msg_meta = $Options;
832
-      $msg_meta['Type'] = $Type;
833
-      if($Label!==null) {
834
-        $msg_meta['Label'] = $Label;
835
-      }
836
-      if(isset($meta['file']) && !isset($msg_meta['File'])) {
837
-        $msg_meta['File'] = $meta['file'];
838
-      }
839
-      if(isset($meta['line']) && !isset($msg_meta['Line'])) {
840
-        $msg_meta['Line'] = $meta['line'];
841
-      }
842
-    	$msg = '['.$this->jsonEncode($msg_meta).','.$this->jsonEncode($Object, $skipFinalObjectEncode).']';
843
-    }
828
+	if($Type==self::DUMP) {
829
+		$msg = '{"'.$Label.'":'.$this->jsonEncode($Object, $skipFinalObjectEncode).'}';
830
+	} else {
831
+	  $msg_meta = $Options;
832
+	  $msg_meta['Type'] = $Type;
833
+	  if($Label!==null) {
834
+		$msg_meta['Label'] = $Label;
835
+	  }
836
+	  if(isset($meta['file']) && !isset($msg_meta['File'])) {
837
+		$msg_meta['File'] = $meta['file'];
838
+	  }
839
+	  if(isset($meta['line']) && !isset($msg_meta['Line'])) {
840
+		$msg_meta['Line'] = $meta['line'];
841
+	  }
842
+		$msg = '['.$this->jsonEncode($msg_meta).','.$this->jsonEncode($Object, $skipFinalObjectEncode).']';
843
+	}
844 844
     
845
-    $parts = explode("\n",chunk_split($msg, 5000, "\n"));
845
+	$parts = explode("\n",chunk_split($msg, 5000, "\n"));
846 846
 
847
-    for( $i=0 ; $i<count($parts) ; $i++) {
847
+	for( $i=0 ; $i<count($parts) ; $i++) {
848 848
         
849
-        $part = $parts[$i];
850
-        if ($part) {
849
+		$part = $parts[$i];
850
+		if ($part) {
851 851
             
852
-            if(count($parts)>2) {
853
-              // Message needs to be split into multiple parts
854
-              $this->setHeader('X-Wf-1-'.$structure_index.'-'.'1-'.$this->messageIndex,
855
-                               (($i==0)?strlen($msg):'')
856
-                               . '|' . $part . '|'
857
-                               . (($i<count($parts)-2)?'\\':''));
858
-            } else {
859
-              $this->setHeader('X-Wf-1-'.$structure_index.'-'.'1-'.$this->messageIndex,
860
-                               strlen($part) . '|' . $part . '|');
861
-            }
852
+			if(count($parts)>2) {
853
+			  // Message needs to be split into multiple parts
854
+			  $this->setHeader('X-Wf-1-'.$structure_index.'-'.'1-'.$this->messageIndex,
855
+							   (($i==0)?strlen($msg):'')
856
+							   . '|' . $part . '|'
857
+							   . (($i<count($parts)-2)?'\\':''));
858
+			} else {
859
+			  $this->setHeader('X-Wf-1-'.$structure_index.'-'.'1-'.$this->messageIndex,
860
+							   strlen($part) . '|' . $part . '|');
861
+			}
862 862
             
863
-            $this->messageIndex++;
863
+			$this->messageIndex++;
864 864
             
865
-            if ($this->messageIndex > 99999) {
866
-                throw $this->newException('Maximum number (99,999) of messages reached!');             
867
-            }
868
-        }
869
-    }
865
+			if ($this->messageIndex > 99999) {
866
+				throw $this->newException('Maximum number (99,999) of messages reached!');             
867
+			}
868
+		}
869
+	}
870 870
 
871 871
   	$this->setHeader('X-Wf-1-Index',$this->messageIndex-1);
872 872
 
873
-    return true;
873
+	return true;
874 874
   }
875 875
   
876 876
   /**
@@ -880,7 +880,7 @@  discard block
 block discarded – undo
880 880
    * @return string
881 881
    */
882 882
   protected function _standardizePath($Path) {
883
-    return preg_replace('/\\\\+/','/',$Path);    
883
+	return preg_replace('/\\\\+/','/',$Path);    
884 884
   }
885 885
   
886 886
   /**
@@ -890,16 +890,16 @@  discard block
 block discarded – undo
890 890
    * @return array
891 891
    */
892 892
   protected function _escapeTrace($Trace) {
893
-    if(!$Trace) return $Trace;
894
-    for( $i=0 ; $i<sizeof($Trace) ; $i++ ) {
895
-      if(isset($Trace[$i]['file'])) {
896
-        $Trace[$i]['file'] = $this->_escapeTraceFile($Trace[$i]['file']);
897
-      }
898
-      if(isset($Trace[$i]['args'])) {
899
-        $Trace[$i]['args'] = $this->encodeObject($Trace[$i]['args']);
900
-      }
901
-    }
902
-    return $Trace;    
893
+	if(!$Trace) return $Trace;
894
+	for( $i=0 ; $i<sizeof($Trace) ; $i++ ) {
895
+	  if(isset($Trace[$i]['file'])) {
896
+		$Trace[$i]['file'] = $this->_escapeTraceFile($Trace[$i]['file']);
897
+	  }
898
+	  if(isset($Trace[$i]['args'])) {
899
+		$Trace[$i]['args'] = $this->encodeObject($Trace[$i]['args']);
900
+	  }
901
+	}
902
+	return $Trace;    
903 903
   }
904 904
   
905 905
   /**
@@ -909,15 +909,15 @@  discard block
 block discarded – undo
909 909
    * @return string
910 910
    */
911 911
   protected function _escapeTraceFile($File) {
912
-    /* Check if we have a windows filepath */
913
-    if(strpos($File,'\\')) {
914
-      /* First strip down to single \ */
912
+	/* Check if we have a windows filepath */
913
+	if(strpos($File,'\\')) {
914
+	  /* First strip down to single \ */
915 915
       
916
-      $file = preg_replace('/\\\\+/','\\',$File);
916
+	  $file = preg_replace('/\\\\+/','\\',$File);
917 917
       
918
-      return $file;
919
-    }
920
-    return $File;
918
+	  return $file;
919
+	}
920
+	return $File;
921 921
   }
922 922
 
923 923
   /**
@@ -927,7 +927,7 @@  discard block
 block discarded – undo
927 927
    * @param string_type $Value
928 928
    */
929 929
   protected function setHeader($Name, $Value) {
930
-    return header($Name.': '.$Value);
930
+	return header($Name.': '.$Value);
931 931
   }
932 932
 
933 933
   /**
@@ -936,8 +936,8 @@  discard block
 block discarded – undo
936 936
    * @return string|false
937 937
    */
938 938
   protected function getUserAgent() {
939
-    if(!isset($_SERVER['HTTP_USER_AGENT'])) return false;
940
-    return $_SERVER['HTTP_USER_AGENT'];
939
+	if(!isset($_SERVER['HTTP_USER_AGENT'])) return false;
940
+	return $_SERVER['HTTP_USER_AGENT'];
941 941
   }
942 942
 
943 943
   /**
@@ -947,7 +947,7 @@  discard block
 block discarded – undo
947 947
    * @return Exception
948 948
    */
949 949
   protected function newException($Message) {
950
-    return new Exception($Message);
950
+	return new Exception($Message);
951 951
   }
952 952
   
953 953
   /**
@@ -960,17 +960,17 @@  discard block
 block discarded – undo
960 960
    */
961 961
   public function jsonEncode($Object, $skipObjectEncode=false)
962 962
   {
963
-    if(!$skipObjectEncode) {
964
-      $Object = $this->encodeObject($Object);
965
-    }
963
+	if(!$skipObjectEncode) {
964
+	  $Object = $this->encodeObject($Object);
965
+	}
966 966
     
967
-    if(function_exists('json_encode')
968
-       && $this->options['useNativeJsonEncode']!=false) {
967
+	if(function_exists('json_encode')
968
+	   && $this->options['useNativeJsonEncode']!=false) {
969 969
 
970
-      return json_encode($Object);
971
-    } else {
972
-      return $this->json_encode($Object);
973
-    }
970
+	  return json_encode($Object);
971
+	} else {
972
+	  return $this->json_encode($Object);
973
+	}
974 974
   }
975 975
 
976 976
   /**
@@ -981,23 +981,23 @@  discard block
 block discarded – undo
981 981
    */  
982 982
   protected function encodeTable($Table) {
983 983
     
984
-    if(!$Table) return $Table;
984
+	if(!$Table) return $Table;
985 985
     
986
-    $new_table = array();
987
-    foreach($Table as $row) {
986
+	$new_table = array();
987
+	foreach($Table as $row) {
988 988
   
989
-      if(is_array($row)) {
990
-        $new_row = array();
989
+	  if(is_array($row)) {
990
+		$new_row = array();
991 991
         
992
-        foreach($row as $item) {
993
-          $new_row[] = $this->encodeObject($item);
994
-        }
992
+		foreach($row as $item) {
993
+		  $new_row[] = $this->encodeObject($item);
994
+		}
995 995
         
996
-        $new_table[] = $new_row;
997
-      }
998
-    }
996
+		$new_table[] = $new_row;
997
+	  }
998
+	}
999 999
     
1000
-    return $new_table;
1000
+	return $new_table;
1001 1001
   }
1002 1002
 
1003 1003
   /**
@@ -1010,135 +1010,135 @@  discard block
 block discarded – undo
1010 1010
    */
1011 1011
   protected function encodeObject($Object, $ObjectDepth = 1, $ArrayDepth = 1)
1012 1012
   {
1013
-    $return = array();
1013
+	$return = array();
1014 1014
 
1015
-    if (is_resource($Object)) {
1015
+	if (is_resource($Object)) {
1016 1016
 
1017
-      return '** '.(string)$Object.' **';
1017
+	  return '** '.(string)$Object.' **';
1018 1018
 
1019
-    } else    
1020
-    if (is_object($Object)) {
1019
+	} else    
1020
+	if (is_object($Object)) {
1021 1021
 
1022
-        if ($ObjectDepth > $this->options['maxObjectDepth']) {
1023
-          return '** Max Object Depth ('.$this->options['maxObjectDepth'].') **';
1024
-        }
1022
+		if ($ObjectDepth > $this->options['maxObjectDepth']) {
1023
+		  return '** Max Object Depth ('.$this->options['maxObjectDepth'].') **';
1024
+		}
1025 1025
         
1026
-        foreach ($this->objectStack as $refVal) {
1027
-            if ($refVal === $Object) {
1028
-                return '** Recursion ('.get_class($Object).') **';
1029
-            }
1030
-        }
1031
-        array_push($this->objectStack, $Object);
1026
+		foreach ($this->objectStack as $refVal) {
1027
+			if ($refVal === $Object) {
1028
+				return '** Recursion ('.get_class($Object).') **';
1029
+			}
1030
+		}
1031
+		array_push($this->objectStack, $Object);
1032 1032
                 
1033
-        $return['__className'] = $class = get_class($Object);
1034
-        $class_lower = strtolower($class);
1035
-
1036
-        $reflectionClass = new ReflectionClass($class);  
1037
-        $properties = array();
1038
-        foreach( $reflectionClass->getProperties() as $property) {
1039
-          $properties[$property->getName()] = $property;
1040
-        }
1033
+		$return['__className'] = $class = get_class($Object);
1034
+		$class_lower = strtolower($class);
1035
+
1036
+		$reflectionClass = new ReflectionClass($class);  
1037
+		$properties = array();
1038
+		foreach( $reflectionClass->getProperties() as $property) {
1039
+		  $properties[$property->getName()] = $property;
1040
+		}
1041 1041
             
1042
-        $members = (array)$Object;
1042
+		$members = (array)$Object;
1043 1043
             
1044
-        foreach( $properties as $raw_name => $property ) {
1044
+		foreach( $properties as $raw_name => $property ) {
1045 1045
           
1046
-          $name = $raw_name;
1047
-          if($property->isStatic()) {
1048
-            $name = 'static:'.$name;
1049
-          }
1050
-          if($property->isPublic()) {
1051
-            $name = 'public:'.$name;
1052
-          } else
1053
-          if($property->isPrivate()) {
1054
-            $name = 'private:'.$name;
1055
-            $raw_name = "\0".$class."\0".$raw_name;
1056
-          } else
1057
-          if($property->isProtected()) {
1058
-            $name = 'protected:'.$name;
1059
-            $raw_name = "\0".'*'."\0".$raw_name;
1060
-          }
1046
+		  $name = $raw_name;
1047
+		  if($property->isStatic()) {
1048
+			$name = 'static:'.$name;
1049
+		  }
1050
+		  if($property->isPublic()) {
1051
+			$name = 'public:'.$name;
1052
+		  } else
1053
+		  if($property->isPrivate()) {
1054
+			$name = 'private:'.$name;
1055
+			$raw_name = "\0".$class."\0".$raw_name;
1056
+		  } else
1057
+		  if($property->isProtected()) {
1058
+			$name = 'protected:'.$name;
1059
+			$raw_name = "\0".'*'."\0".$raw_name;
1060
+		  }
1061 1061
           
1062
-          if(!(isset($this->objectFilters[$class_lower])
1063
-               && is_array($this->objectFilters[$class_lower])
1064
-               && in_array($raw_name,$this->objectFilters[$class_lower]))) {
1062
+		  if(!(isset($this->objectFilters[$class_lower])
1063
+			   && is_array($this->objectFilters[$class_lower])
1064
+			   && in_array($raw_name,$this->objectFilters[$class_lower]))) {
1065 1065
 
1066
-            if(array_key_exists($raw_name,$members)
1067
-               && !$property->isStatic()) {
1066
+			if(array_key_exists($raw_name,$members)
1067
+			   && !$property->isStatic()) {
1068 1068
               
1069
-              $return[$name] = $this->encodeObject($members[$raw_name], $ObjectDepth + 1, 1);      
1069
+			  $return[$name] = $this->encodeObject($members[$raw_name], $ObjectDepth + 1, 1);      
1070 1070
             
1071
-            } else {
1072
-              if(method_exists($property,'setAccessible')) {
1073
-                $property->setAccessible(true);
1074
-                $return[$name] = $this->encodeObject($property->getValue($Object), $ObjectDepth + 1, 1);
1075
-              } else
1076
-              if($property->isPublic()) {
1077
-                $return[$name] = $this->encodeObject($property->getValue($Object), $ObjectDepth + 1, 1);
1078
-              } else {
1079
-                $return[$name] = '** Need PHP 5.3 to get value **';
1080
-              }
1081
-            }
1082
-          } else {
1083
-            $return[$name] = '** Excluded by Filter **';
1084
-          }
1085
-        }
1071
+			} else {
1072
+			  if(method_exists($property,'setAccessible')) {
1073
+				$property->setAccessible(true);
1074
+				$return[$name] = $this->encodeObject($property->getValue($Object), $ObjectDepth + 1, 1);
1075
+			  } else
1076
+			  if($property->isPublic()) {
1077
+				$return[$name] = $this->encodeObject($property->getValue($Object), $ObjectDepth + 1, 1);
1078
+			  } else {
1079
+				$return[$name] = '** Need PHP 5.3 to get value **';
1080
+			  }
1081
+			}
1082
+		  } else {
1083
+			$return[$name] = '** Excluded by Filter **';
1084
+		  }
1085
+		}
1086 1086
         
1087
-        // Include all members that are not defined in the class
1088
-        // but exist in the object
1089
-        foreach( $members as $raw_name => $value ) {
1087
+		// Include all members that are not defined in the class
1088
+		// but exist in the object
1089
+		foreach( $members as $raw_name => $value ) {
1090 1090
           
1091
-          $name = $raw_name;
1091
+		  $name = $raw_name;
1092 1092
           
1093
-          if ($name{0} == "\0") {
1094
-            $parts = explode("\0", $name);
1095
-            $name = $parts[2];
1096
-          }
1093
+		  if ($name{0} == "\0") {
1094
+			$parts = explode("\0", $name);
1095
+			$name = $parts[2];
1096
+		  }
1097 1097
           
1098
-          if(!isset($properties[$name])) {
1099
-            $name = 'undeclared:'.$name;
1098
+		  if(!isset($properties[$name])) {
1099
+			$name = 'undeclared:'.$name;
1100 1100
               
1101
-            if(!(isset($this->objectFilters[$class_lower])
1102
-                 && is_array($this->objectFilters[$class_lower])
1103
-                 && in_array($raw_name,$this->objectFilters[$class_lower]))) {
1101
+			if(!(isset($this->objectFilters[$class_lower])
1102
+				 && is_array($this->objectFilters[$class_lower])
1103
+				 && in_array($raw_name,$this->objectFilters[$class_lower]))) {
1104 1104
               
1105
-              $return[$name] = $this->encodeObject($value, $ObjectDepth + 1, 1);
1106
-            } else {
1107
-              $return[$name] = '** Excluded by Filter **';
1108
-            }
1109
-          }
1110
-        }
1105
+			  $return[$name] = $this->encodeObject($value, $ObjectDepth + 1, 1);
1106
+			} else {
1107
+			  $return[$name] = '** Excluded by Filter **';
1108
+			}
1109
+		  }
1110
+		}
1111 1111
         
1112
-        array_pop($this->objectStack);
1112
+		array_pop($this->objectStack);
1113 1113
         
1114
-    } elseif (is_array($Object)) {
1114
+	} elseif (is_array($Object)) {
1115 1115
 
1116
-        if ($ArrayDepth > $this->options['maxArrayDepth']) {
1117
-          return '** Max Array Depth ('.$this->options['maxArrayDepth'].') **';
1118
-        }
1116
+		if ($ArrayDepth > $this->options['maxArrayDepth']) {
1117
+		  return '** Max Array Depth ('.$this->options['maxArrayDepth'].') **';
1118
+		}
1119 1119
       
1120
-        foreach ($Object as $key => $val) {
1120
+		foreach ($Object as $key => $val) {
1121 1121
           
1122
-          // Encoding the $GLOBALS PHP array causes an infinite loop
1123
-          // if the recursion is not reset here as it contains
1124
-          // a reference to itself. This is the only way I have come up
1125
-          // with to stop infinite recursion in this case.
1126
-          if($key=='GLOBALS'
1127
-             && is_array($val)
1128
-             && array_key_exists('GLOBALS',$val)) {
1129
-            $val['GLOBALS'] = '** Recursion (GLOBALS) **';
1130
-          }
1122
+		  // Encoding the $GLOBALS PHP array causes an infinite loop
1123
+		  // if the recursion is not reset here as it contains
1124
+		  // a reference to itself. This is the only way I have come up
1125
+		  // with to stop infinite recursion in this case.
1126
+		  if($key=='GLOBALS'
1127
+			 && is_array($val)
1128
+			 && array_key_exists('GLOBALS',$val)) {
1129
+			$val['GLOBALS'] = '** Recursion (GLOBALS) **';
1130
+		  }
1131 1131
           
1132
-          $return[$key] = $this->encodeObject($val, 1, $ArrayDepth + 1);
1133
-        }
1134
-    } else {
1135
-      if(self::is_utf8($Object)) {
1136
-        return $Object;
1137
-      } else {
1138
-        return utf8_encode($Object);
1139
-      }
1140
-    }
1141
-    return $return;
1132
+		  $return[$key] = $this->encodeObject($val, 1, $ArrayDepth + 1);
1133
+		}
1134
+	} else {
1135
+	  if(self::is_utf8($Object)) {
1136
+		return $Object;
1137
+	  } else {
1138
+		return utf8_encode($Object);
1139
+	  }
1140
+	}
1141
+	return $return;
1142 1142
   }
1143 1143
 
1144 1144
   /**
@@ -1148,29 +1148,29 @@  discard block
 block discarded – undo
1148 1148
    * @return boolean
1149 1149
    */
1150 1150
   protected static function is_utf8($str) {
1151
-    $c=0; $b=0;
1152
-    $bits=0;
1153
-    $len=strlen($str);
1154
-    for($i=0; $i<$len; $i++){
1155
-        $c=ord($str[$i]);
1156
-        if($c > 128){
1157
-            if(($c >= 254)) return false;
1158
-            elseif($c >= 252) $bits=6;
1159
-            elseif($c >= 248) $bits=5;
1160
-            elseif($c >= 240) $bits=4;
1161
-            elseif($c >= 224) $bits=3;
1162
-            elseif($c >= 192) $bits=2;
1163
-            else return false;
1164
-            if(($i+$bits) > $len) return false;
1165
-            while($bits > 1){
1166
-                $i++;
1167
-                $b=ord($str[$i]);
1168
-                if($b < 128 || $b > 191) return false;
1169
-                $bits--;
1170
-            }
1171
-        }
1172
-    }
1173
-    return true;
1151
+	$c=0; $b=0;
1152
+	$bits=0;
1153
+	$len=strlen($str);
1154
+	for($i=0; $i<$len; $i++){
1155
+		$c=ord($str[$i]);
1156
+		if($c > 128){
1157
+			if(($c >= 254)) return false;
1158
+			elseif($c >= 252) $bits=6;
1159
+			elseif($c >= 248) $bits=5;
1160
+			elseif($c >= 240) $bits=4;
1161
+			elseif($c >= 224) $bits=3;
1162
+			elseif($c >= 192) $bits=2;
1163
+			else return false;
1164
+			if(($i+$bits) > $len) return false;
1165
+			while($bits > 1){
1166
+				$i++;
1167
+				$b=ord($str[$i]);
1168
+				if($b < 128 || $b > 191) return false;
1169
+				$bits--;
1170
+			}
1171
+		}
1172
+	}
1173
+	return true;
1174 1174
   } 
1175 1175
 
1176 1176
   /**
@@ -1249,35 +1249,35 @@  discard block
 block discarded – undo
1249 1249
   */
1250 1250
   private function json_utf82utf16($utf8)
1251 1251
   {
1252
-      // oh please oh please oh please oh please oh please
1253
-      if(function_exists('mb_convert_encoding')) {
1254
-          return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
1255
-      }
1256
-
1257
-      switch(strlen($utf8)) {
1258
-          case 1:
1259
-              // this case should never be reached, because we are in ASCII range
1260
-              // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
1261
-              return $utf8;
1262
-
1263
-          case 2:
1264
-              // return a UTF-16 character from a 2-byte UTF-8 char
1265
-              // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
1266
-              return chr(0x07 & (ord($utf8{0}) >> 2))
1267
-                   . chr((0xC0 & (ord($utf8{0}) << 6))
1268
-                       | (0x3F & ord($utf8{1})));
1269
-
1270
-          case 3:
1271
-              // return a UTF-16 character from a 3-byte UTF-8 char
1272
-              // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
1273
-              return chr((0xF0 & (ord($utf8{0}) << 4))
1274
-                       | (0x0F & (ord($utf8{1}) >> 2)))
1275
-                   . chr((0xC0 & (ord($utf8{1}) << 6))
1276
-                       | (0x7F & ord($utf8{2})));
1277
-      }
1278
-
1279
-      // ignoring UTF-32 for now, sorry
1280
-      return '';
1252
+	  // oh please oh please oh please oh please oh please
1253
+	  if(function_exists('mb_convert_encoding')) {
1254
+		  return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
1255
+	  }
1256
+
1257
+	  switch(strlen($utf8)) {
1258
+		  case 1:
1259
+			  // this case should never be reached, because we are in ASCII range
1260
+			  // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
1261
+			  return $utf8;
1262
+
1263
+		  case 2:
1264
+			  // return a UTF-16 character from a 2-byte UTF-8 char
1265
+			  // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
1266
+			  return chr(0x07 & (ord($utf8{0}) >> 2))
1267
+				   . chr((0xC0 & (ord($utf8{0}) << 6))
1268
+					   | (0x3F & ord($utf8{1})));
1269
+
1270
+		  case 3:
1271
+			  // return a UTF-16 character from a 3-byte UTF-8 char
1272
+			  // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
1273
+			  return chr((0xF0 & (ord($utf8{0}) << 4))
1274
+					   | (0x0F & (ord($utf8{1}) >> 2)))
1275
+				   . chr((0xC0 & (ord($utf8{1}) << 6))
1276
+					   | (0x7F & ord($utf8{2})));
1277
+	  }
1278
+
1279
+	  // ignoring UTF-32 for now, sorry
1280
+	  return '';
1281 1281
   }
1282 1282
 
1283 1283
  /**
@@ -1294,133 +1294,133 @@  discard block
 block discarded – undo
1294 1294
   private function json_encode($var)
1295 1295
   {
1296 1296
     
1297
-    if(is_object($var)) {
1298
-      if(in_array($var,$this->json_objectStack)) {
1299
-        return '"** Recursion **"';
1300
-      }
1301
-    }
1297
+	if(is_object($var)) {
1298
+	  if(in_array($var,$this->json_objectStack)) {
1299
+		return '"** Recursion **"';
1300
+	  }
1301
+	}
1302 1302
           
1303
-      switch (gettype($var)) {
1304
-          case 'boolean':
1305
-              return $var ? 'true' : 'false';
1303
+	  switch (gettype($var)) {
1304
+		  case 'boolean':
1305
+			  return $var ? 'true' : 'false';
1306 1306
 
1307
-          case 'NULL':
1308
-              return 'null';
1307
+		  case 'NULL':
1308
+			  return 'null';
1309 1309
 
1310
-          case 'integer':
1311
-              return (int) $var;
1310
+		  case 'integer':
1311
+			  return (int) $var;
1312 1312
 
1313
-          case 'double':
1314
-          case 'float':
1315
-              return (float) $var;
1313
+		  case 'double':
1314
+		  case 'float':
1315
+			  return (float) $var;
1316 1316
 
1317
-          case 'string':
1318
-              // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
1319
-              $ascii = '';
1320
-              $strlen_var = strlen($var);
1317
+		  case 'string':
1318
+			  // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
1319
+			  $ascii = '';
1320
+			  $strlen_var = strlen($var);
1321 1321
 
1322
-             /*
1322
+			 /*
1323 1323
               * Iterate over every character in the string,
1324 1324
               * escaping with a slash or encoding to UTF-8 where necessary
1325 1325
               */
1326
-              for ($c = 0; $c < $strlen_var; ++$c) {
1327
-
1328
-                  $ord_var_c = ord($var{$c});
1329
-
1330
-                  switch (true) {
1331
-                      case $ord_var_c == 0x08:
1332
-                          $ascii .= '\b';
1333
-                          break;
1334
-                      case $ord_var_c == 0x09:
1335
-                          $ascii .= '\t';
1336
-                          break;
1337
-                      case $ord_var_c == 0x0A:
1338
-                          $ascii .= '\n';
1339
-                          break;
1340
-                      case $ord_var_c == 0x0C:
1341
-                          $ascii .= '\f';
1342
-                          break;
1343
-                      case $ord_var_c == 0x0D:
1344
-                          $ascii .= '\r';
1345
-                          break;
1346
-
1347
-                      case $ord_var_c == 0x22:
1348
-                      case $ord_var_c == 0x2F:
1349
-                      case $ord_var_c == 0x5C:
1350
-                          // double quote, slash, slosh
1351
-                          $ascii .= '\\'.$var{$c};
1352
-                          break;
1353
-
1354
-                      case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
1355
-                          // characters U-00000000 - U-0000007F (same as ASCII)
1356
-                          $ascii .= $var{$c};
1357
-                          break;
1358
-
1359
-                      case (($ord_var_c & 0xE0) == 0xC0):
1360
-                          // characters U-00000080 - U-000007FF, mask 110XXXXX
1361
-                          // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
1362
-                          $char = pack('C*', $ord_var_c, ord($var{$c + 1}));
1363
-                          $c += 1;
1364
-                          $utf16 = $this->json_utf82utf16($char);
1365
-                          $ascii .= sprintf('\u%04s', bin2hex($utf16));
1366
-                          break;
1367
-
1368
-                      case (($ord_var_c & 0xF0) == 0xE0):
1369
-                          // characters U-00000800 - U-0000FFFF, mask 1110XXXX
1370
-                          // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
1371
-                          $char = pack('C*', $ord_var_c,
1372
-                                       ord($var{$c + 1}),
1373
-                                       ord($var{$c + 2}));
1374
-                          $c += 2;
1375
-                          $utf16 = $this->json_utf82utf16($char);
1376
-                          $ascii .= sprintf('\u%04s', bin2hex($utf16));
1377
-                          break;
1378
-
1379
-                      case (($ord_var_c & 0xF8) == 0xF0):
1380
-                          // characters U-00010000 - U-001FFFFF, mask 11110XXX
1381
-                          // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
1382
-                          $char = pack('C*', $ord_var_c,
1383
-                                       ord($var{$c + 1}),
1384
-                                       ord($var{$c + 2}),
1385
-                                       ord($var{$c + 3}));
1386
-                          $c += 3;
1387
-                          $utf16 = $this->json_utf82utf16($char);
1388
-                          $ascii .= sprintf('\u%04s', bin2hex($utf16));
1389
-                          break;
1390
-
1391
-                      case (($ord_var_c & 0xFC) == 0xF8):
1392
-                          // characters U-00200000 - U-03FFFFFF, mask 111110XX
1393
-                          // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
1394
-                          $char = pack('C*', $ord_var_c,
1395
-                                       ord($var{$c + 1}),
1396
-                                       ord($var{$c + 2}),
1397
-                                       ord($var{$c + 3}),
1398
-                                       ord($var{$c + 4}));
1399
-                          $c += 4;
1400
-                          $utf16 = $this->json_utf82utf16($char);
1401
-                          $ascii .= sprintf('\u%04s', bin2hex($utf16));
1402
-                          break;
1403
-
1404
-                      case (($ord_var_c & 0xFE) == 0xFC):
1405
-                          // characters U-04000000 - U-7FFFFFFF, mask 1111110X
1406
-                          // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
1407
-                          $char = pack('C*', $ord_var_c,
1408
-                                       ord($var{$c + 1}),
1409
-                                       ord($var{$c + 2}),
1410
-                                       ord($var{$c + 3}),
1411
-                                       ord($var{$c + 4}),
1412
-                                       ord($var{$c + 5}));
1413
-                          $c += 5;
1414
-                          $utf16 = $this->json_utf82utf16($char);
1415
-                          $ascii .= sprintf('\u%04s', bin2hex($utf16));
1416
-                          break;
1417
-                  }
1418
-              }
1419
-
1420
-              return '"'.$ascii.'"';
1421
-
1422
-          case 'array':
1423
-             /*
1326
+			  for ($c = 0; $c < $strlen_var; ++$c) {
1327
+
1328
+				  $ord_var_c = ord($var{$c});
1329
+
1330
+				  switch (true) {
1331
+					  case $ord_var_c == 0x08:
1332
+						  $ascii .= '\b';
1333
+						  break;
1334
+					  case $ord_var_c == 0x09:
1335
+						  $ascii .= '\t';
1336
+						  break;
1337
+					  case $ord_var_c == 0x0A:
1338
+						  $ascii .= '\n';
1339
+						  break;
1340
+					  case $ord_var_c == 0x0C:
1341
+						  $ascii .= '\f';
1342
+						  break;
1343
+					  case $ord_var_c == 0x0D:
1344
+						  $ascii .= '\r';
1345
+						  break;
1346
+
1347
+					  case $ord_var_c == 0x22:
1348
+					  case $ord_var_c == 0x2F:
1349
+					  case $ord_var_c == 0x5C:
1350
+						  // double quote, slash, slosh
1351
+						  $ascii .= '\\'.$var{$c};
1352
+						  break;
1353
+
1354
+					  case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
1355
+						  // characters U-00000000 - U-0000007F (same as ASCII)
1356
+						  $ascii .= $var{$c};
1357
+						  break;
1358
+
1359
+					  case (($ord_var_c & 0xE0) == 0xC0):
1360
+						  // characters U-00000080 - U-000007FF, mask 110XXXXX
1361
+						  // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
1362
+						  $char = pack('C*', $ord_var_c, ord($var{$c + 1}));
1363
+						  $c += 1;
1364
+						  $utf16 = $this->json_utf82utf16($char);
1365
+						  $ascii .= sprintf('\u%04s', bin2hex($utf16));
1366
+						  break;
1367
+
1368
+					  case (($ord_var_c & 0xF0) == 0xE0):
1369
+						  // characters U-00000800 - U-0000FFFF, mask 1110XXXX
1370
+						  // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
1371
+						  $char = pack('C*', $ord_var_c,
1372
+									   ord($var{$c + 1}),
1373
+									   ord($var{$c + 2}));
1374
+						  $c += 2;
1375
+						  $utf16 = $this->json_utf82utf16($char);
1376
+						  $ascii .= sprintf('\u%04s', bin2hex($utf16));
1377
+						  break;
1378
+
1379
+					  case (($ord_var_c & 0xF8) == 0xF0):
1380
+						  // characters U-00010000 - U-001FFFFF, mask 11110XXX
1381
+						  // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
1382
+						  $char = pack('C*', $ord_var_c,
1383
+									   ord($var{$c + 1}),
1384
+									   ord($var{$c + 2}),
1385
+									   ord($var{$c + 3}));
1386
+						  $c += 3;
1387
+						  $utf16 = $this->json_utf82utf16($char);
1388
+						  $ascii .= sprintf('\u%04s', bin2hex($utf16));
1389
+						  break;
1390
+
1391
+					  case (($ord_var_c & 0xFC) == 0xF8):
1392
+						  // characters U-00200000 - U-03FFFFFF, mask 111110XX
1393
+						  // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
1394
+						  $char = pack('C*', $ord_var_c,
1395
+									   ord($var{$c + 1}),
1396
+									   ord($var{$c + 2}),
1397
+									   ord($var{$c + 3}),
1398
+									   ord($var{$c + 4}));
1399
+						  $c += 4;
1400
+						  $utf16 = $this->json_utf82utf16($char);
1401
+						  $ascii .= sprintf('\u%04s', bin2hex($utf16));
1402
+						  break;
1403
+
1404
+					  case (($ord_var_c & 0xFE) == 0xFC):
1405
+						  // characters U-04000000 - U-7FFFFFFF, mask 1111110X
1406
+						  // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
1407
+						  $char = pack('C*', $ord_var_c,
1408
+									   ord($var{$c + 1}),
1409
+									   ord($var{$c + 2}),
1410
+									   ord($var{$c + 3}),
1411
+									   ord($var{$c + 4}),
1412
+									   ord($var{$c + 5}));
1413
+						  $c += 5;
1414
+						  $utf16 = $this->json_utf82utf16($char);
1415
+						  $ascii .= sprintf('\u%04s', bin2hex($utf16));
1416
+						  break;
1417
+				  }
1418
+			  }
1419
+
1420
+			  return '"'.$ascii.'"';
1421
+
1422
+		  case 'array':
1423
+			 /*
1424 1424
               * As per JSON spec if any array key is not an integer
1425 1425
               * we must treat the the whole array as an object. We
1426 1426
               * also try to catch a sparsely populated associative
@@ -1438,63 +1438,63 @@  discard block
 block discarded – undo
1438 1438
               * bracket notation.
1439 1439
               */
1440 1440
 
1441
-              // treat as a JSON object
1442
-              if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
1441
+			  // treat as a JSON object
1442
+			  if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
1443 1443
                   
1444
-                  $this->json_objectStack[] = $var;
1444
+				  $this->json_objectStack[] = $var;
1445 1445
 
1446
-                  $properties = array_map(array($this, 'json_name_value'),
1447
-                                          array_keys($var),
1448
-                                          array_values($var));
1446
+				  $properties = array_map(array($this, 'json_name_value'),
1447
+										  array_keys($var),
1448
+										  array_values($var));
1449 1449
 
1450
-                  array_pop($this->json_objectStack);
1450
+				  array_pop($this->json_objectStack);
1451 1451
 
1452
-                  foreach($properties as $property) {
1453
-                      if($property instanceof Exception) {
1454
-                          return $property;
1455
-                      }
1456
-                  }
1452
+				  foreach($properties as $property) {
1453
+					  if($property instanceof Exception) {
1454
+						  return $property;
1455
+					  }
1456
+				  }
1457 1457
 
1458
-                  return '{' . join(',', $properties) . '}';
1459
-              }
1458
+				  return '{' . join(',', $properties) . '}';
1459
+			  }
1460 1460
 
1461
-              $this->json_objectStack[] = $var;
1461
+			  $this->json_objectStack[] = $var;
1462 1462
 
1463
-              // treat it like a regular array
1464
-              $elements = array_map(array($this, 'json_encode'), $var);
1463
+			  // treat it like a regular array
1464
+			  $elements = array_map(array($this, 'json_encode'), $var);
1465 1465
 
1466
-              array_pop($this->json_objectStack);
1466
+			  array_pop($this->json_objectStack);
1467 1467
 
1468
-              foreach($elements as $element) {
1469
-                  if($element instanceof Exception) {
1470
-                      return $element;
1471
-                  }
1472
-              }
1468
+			  foreach($elements as $element) {
1469
+				  if($element instanceof Exception) {
1470
+					  return $element;
1471
+				  }
1472
+			  }
1473 1473
 
1474
-              return '[' . join(',', $elements) . ']';
1474
+			  return '[' . join(',', $elements) . ']';
1475 1475
 
1476
-          case 'object':
1477
-              $vars = self::encodeObject($var);
1476
+		  case 'object':
1477
+			  $vars = self::encodeObject($var);
1478 1478
 
1479
-              $this->json_objectStack[] = $var;
1479
+			  $this->json_objectStack[] = $var;
1480 1480
 
1481
-              $properties = array_map(array($this, 'json_name_value'),
1482
-                                      array_keys($vars),
1483
-                                      array_values($vars));
1481
+			  $properties = array_map(array($this, 'json_name_value'),
1482
+									  array_keys($vars),
1483
+									  array_values($vars));
1484 1484
 
1485
-              array_pop($this->json_objectStack);
1485
+			  array_pop($this->json_objectStack);
1486 1486
               
1487
-              foreach($properties as $property) {
1488
-                  if($property instanceof Exception) {
1489
-                      return $property;
1490
-                  }
1491
-              }
1487
+			  foreach($properties as $property) {
1488
+				  if($property instanceof Exception) {
1489
+					  return $property;
1490
+				  }
1491
+			  }
1492 1492
                      
1493
-              return '{' . join(',', $properties) . '}';
1493
+			  return '{' . join(',', $properties) . '}';
1494 1494
 
1495
-          default:
1496
-              return null;
1497
-      }
1495
+		  default:
1496
+			  return null;
1497
+	  }
1498 1498
   }
1499 1499
 
1500 1500
  /**
@@ -1508,22 +1508,22 @@  discard block
 block discarded – undo
1508 1508
   */
1509 1509
   private function json_name_value($name, $value)
1510 1510
   {
1511
-      // Encoding the $GLOBALS PHP array causes an infinite loop
1512
-      // if the recursion is not reset here as it contains
1513
-      // a reference to itself. This is the only way I have come up
1514
-      // with to stop infinite recursion in this case.
1515
-      if($name=='GLOBALS'
1516
-         && is_array($value)
1517
-         && array_key_exists('GLOBALS',$value)) {
1518
-        $value['GLOBALS'] = '** Recursion **';
1519
-      }
1511
+	  // Encoding the $GLOBALS PHP array causes an infinite loop
1512
+	  // if the recursion is not reset here as it contains
1513
+	  // a reference to itself. This is the only way I have come up
1514
+	  // with to stop infinite recursion in this case.
1515
+	  if($name=='GLOBALS'
1516
+		 && is_array($value)
1517
+		 && array_key_exists('GLOBALS',$value)) {
1518
+		$value['GLOBALS'] = '** Recursion **';
1519
+	  }
1520 1520
     
1521
-      $encoded_value = $this->json_encode($value);
1521
+	  $encoded_value = $this->json_encode($value);
1522 1522
 
1523
-      if($encoded_value instanceof Exception) {
1524
-          return $encoded_value;
1525
-      }
1523
+	  if($encoded_value instanceof Exception) {
1524
+		  return $encoded_value;
1525
+	  }
1526 1526
 
1527
-      return $this->json_encode(strval($name)) . ':' . $encoded_value;
1527
+	  return $this->json_encode(strval($name)) . ':' . $encoded_value;
1528 1528
   }
1529 1529
 }
Please login to merge, or discard this patch.
Spacing   +185 added lines, -185 removed lines patch added patch discarded remove patch
@@ -229,7 +229,7 @@  discard block
 block discarded – undo
229 229
    * @return array
230 230
    */  
231 231
   public function __sleep() {
232
-    return array('options','objectFilters','enabled');
232
+    return array('options', 'objectFilters', 'enabled');
233 233
   }
234 234
     
235 235
   /**
@@ -238,8 +238,8 @@  discard block
 block discarded – undo
238 238
    * @param boolean $AutoCreate
239 239
    * @return FirePHP
240 240
    */
241
-  public static function getInstance($AutoCreate=false) {
242
-    if($AutoCreate===true && !self::$instance) {
241
+  public static function getInstance($AutoCreate = false) {
242
+    if ($AutoCreate === true && !self::$instance) {
243 243
       self::init();
244 244
     }
245 245
     return self::$instance;
@@ -299,7 +299,7 @@  discard block
 block discarded – undo
299 299
    * @return void
300 300
    */
301 301
   public function setOptions($Options) {
302
-    $this->options = array_merge($this->options,$Options);
302
+    $this->options = array_merge($this->options, $Options);
303 303
   }
304 304
   
305 305
   /**
@@ -318,7 +318,7 @@  discard block
 block discarded – undo
318 318
    * 
319 319
    * @return mixed Returns a string containing the previously defined error handler (if any)
320 320
    */
321
-  public function registerErrorHandler($throwErrorExceptions=true)
321
+  public function registerErrorHandler($throwErrorExceptions = true)
322 322
   {
323 323
     //NOTE: The following errors will not be caught by this error handler:
324 324
     //      E_ERROR, E_PARSE, E_CORE_ERROR,
@@ -327,7 +327,7 @@  discard block
 block discarded – undo
327 327
     
328 328
     $this->throwErrorExceptions = $throwErrorExceptions;
329 329
     
330
-    return set_error_handler(array($this,'errorHandler'));     
330
+    return set_error_handler(array($this, 'errorHandler'));     
331 331
   }
332 332
 
333 333
   /**
@@ -351,7 +351,7 @@  discard block
 block discarded – undo
351 351
     if (error_reporting() & $errno) {
352 352
 
353 353
       $exception = new ErrorException($errstr, 0, $errno, $errfile, $errline);
354
-      if($this->throwErrorExceptions) {
354
+      if ($this->throwErrorExceptions) {
355 355
         throw $exception;
356 356
       } else {
357 357
         $this->fb($exception);
@@ -368,7 +368,7 @@  discard block
 block discarded – undo
368 368
    */
369 369
   public function registerExceptionHandler()
370 370
   {
371
-    return set_exception_handler(array($this,'exceptionHandler'));     
371
+    return set_exception_handler(array($this, 'exceptionHandler'));     
372 372
   }
373 373
   
374 374
   /**
@@ -397,12 +397,12 @@  discard block
 block discarded – undo
397 397
    * @param boolean $throwAssertionExceptions
398 398
    * @return mixed Returns the original setting or FALSE on errors
399 399
    */
400
-  public function registerAssertionHandler($convertAssertionErrorsToExceptions=true, $throwAssertionExceptions=false)
400
+  public function registerAssertionHandler($convertAssertionErrorsToExceptions = true, $throwAssertionExceptions = false)
401 401
   {
402 402
     $this->convertAssertionErrorsToExceptions = $convertAssertionErrorsToExceptions;
403 403
     $this->throwAssertionExceptions = $throwAssertionExceptions;
404 404
     
405
-    if($throwAssertionExceptions && !$convertAssertionErrorsToExceptions) {
405
+    if ($throwAssertionExceptions && !$convertAssertionErrorsToExceptions) {
406 406
       throw $this->newException('Cannot throw assertion exceptions as assertion errors are not being converted to exceptions!');
407 407
     }
408 408
     
@@ -421,11 +421,11 @@  discard block
 block discarded – undo
421 421
   public function assertionHandler($file, $line, $code)
422 422
   {
423 423
 
424
-    if($this->convertAssertionErrorsToExceptions) {
424
+    if ($this->convertAssertionErrorsToExceptions) {
425 425
       
426
-      $exception = new ErrorException('Assertion Failed - Code[ '.$code.' ]', 0, null, $file, $line);
426
+      $exception = new ErrorException('Assertion Failed - Code[ ' . $code . ' ]', 0, null, $file, $line);
427 427
 
428
-      if($this->throwAssertionExceptions) {
428
+      if ($this->throwAssertionExceptions) {
429 429
         throw $exception;
430 430
       } else {
431 431
         $this->fb($exception);
@@ -433,7 +433,7 @@  discard block
 block discarded – undo
433 433
     
434 434
     } else {
435 435
     
436
-      $this->fb($code, 'Assertion Failed', FirePHP::ERROR, array('File'=>$file,'Line'=>$line));
436
+      $this->fb($code, 'Assertion Failed', FirePHP::ERROR, array('File'=>$file, 'Line'=>$line));
437 437
     
438 438
     }
439 439
   }  
@@ -470,18 +470,18 @@  discard block
 block discarded – undo
470 470
    * @return true
471 471
    * @throws Exception
472 472
    */
473
-  public function group($Name, $Options=null) {
473
+  public function group($Name, $Options = null) {
474 474
     
475
-    if(!$Name) {
475
+    if (!$Name) {
476 476
       throw $this->newException('You must specify a label for the group!');
477 477
     }
478 478
     
479
-    if($Options) {
480
-      if(!is_array($Options)) {
479
+    if ($Options) {
480
+      if (!is_array($Options)) {
481 481
         throw $this->newException('Options must be defined as an array!');
482 482
       }
483
-      if(array_key_exists('Collapsed', $Options)) {
484
-        $Options['Collapsed'] = ($Options['Collapsed'])?'true':'false';
483
+      if (array_key_exists('Collapsed', $Options)) {
484
+        $Options['Collapsed'] = ($Options['Collapsed']) ? 'true' : 'false';
485 485
       }
486 486
     }
487 487
     
@@ -507,7 +507,7 @@  discard block
 block discarded – undo
507 507
    * @return true
508 508
    * @throws Exception
509 509
    */
510
-  public function log($Object, $Label=null) {
510
+  public function log($Object, $Label = null) {
511 511
     return $this->fb($Object, $Label, FirePHP::LOG);
512 512
   } 
513 513
 
@@ -520,7 +520,7 @@  discard block
 block discarded – undo
520 520
    * @return true
521 521
    * @throws Exception
522 522
    */
523
-  public function info($Object, $Label=null) {
523
+  public function info($Object, $Label = null) {
524 524
     return $this->fb($Object, $Label, FirePHP::INFO);
525 525
   } 
526 526
 
@@ -533,7 +533,7 @@  discard block
 block discarded – undo
533 533
    * @return true
534 534
    * @throws Exception
535 535
    */
536
-  public function warn($Object, $Label=null) {
536
+  public function warn($Object, $Label = null) {
537 537
     return $this->fb($Object, $Label, FirePHP::WARN);
538 538
   } 
539 539
 
@@ -546,7 +546,7 @@  discard block
 block discarded – undo
546 546
    * @return true
547 547
    * @throws Exception
548 548
    */
549
-  public function error($Object, $Label=null) {
549
+  public function error($Object, $Label = null) {
550 550
     return $this->fb($Object, $Label, FirePHP::ERROR);
551 551
   } 
552 552
 
@@ -595,8 +595,8 @@  discard block
 block discarded – undo
595 595
    */
596 596
   public function detectClientExtension() {
597 597
     /* Check if FirePHP is installed on client */
598
-    if(!@preg_match_all('/\sFirePHP\/([\.|\d]*)\s?/si',$this->getUserAgent(),$m) ||
599
-       !version_compare($m[1][0],'0.0.6','>=')) {
598
+    if (!@preg_match_all('/\sFirePHP\/([\.|\d]*)\s?/si', $this->getUserAgent(), $m) ||
599
+       !version_compare($m[1][0], '0.0.6', '>=')) {
600 600
       return false;
601 601
     }
602 602
     return true;    
@@ -612,17 +612,17 @@  discard block
 block discarded – undo
612 612
    */
613 613
   public function fb($Object) {
614 614
   
615
-    if(!$this->enabled) {
615
+    if (!$this->enabled) {
616 616
       return false;
617 617
     }
618 618
   
619 619
     if (headers_sent($filename, $linenum)) {
620 620
       // If we are logging from within the exception handler we cannot throw another exception
621
-      if($this->inExceptionHandler) {
621
+      if ($this->inExceptionHandler) {
622 622
         // Simply echo the error out to the page
623
-        echo '<div style="border: 2px solid red; font-family: Arial; font-size: 12px; background-color: lightgray; padding: 5px;"><span style="color: red; font-weight: bold;">FirePHP ERROR:</span> Headers already sent in <b>'.$filename.'</b> on line <b>'.$linenum.'</b>. Cannot send log data to FirePHP. You must have Output Buffering enabled via ob_start() or output_buffering ini directive.</div>';
623
+        echo '<div style="border: 2px solid red; font-family: Arial; font-size: 12px; background-color: lightgray; padding: 5px;"><span style="color: red; font-weight: bold;">FirePHP ERROR:</span> Headers already sent in <b>' . $filename . '</b> on line <b>' . $linenum . '</b>. Cannot send log data to FirePHP. You must have Output Buffering enabled via ob_start() or output_buffering ini directive.</div>';
624 624
       } else {
625
-        throw $this->newException('Headers already sent in '.$filename.' on line '.$linenum.'. Cannot send log data to FirePHP. You must have Output Buffering enabled via ob_start() or output_buffering ini directive.');
625
+        throw $this->newException('Headers already sent in ' . $filename . ' on line ' . $linenum . '. Cannot send log data to FirePHP. You must have Output Buffering enabled via ob_start() or output_buffering ini directive.');
626 626
       }
627 627
     }
628 628
   
@@ -630,10 +630,10 @@  discard block
 block discarded – undo
630 630
     $Label = null;
631 631
     $Options = array();
632 632
   
633
-    if(func_num_args()==1) {
633
+    if (func_num_args() == 1) {
634 634
     } else
635
-    if(func_num_args()==2) {
636
-      switch(func_get_arg(1)) {
635
+    if (func_num_args() == 2) {
636
+      switch (func_get_arg(1)) {
637 637
         case self::LOG:
638 638
         case self::INFO:
639 639
         case self::WARN:
@@ -651,11 +651,11 @@  discard block
 block discarded – undo
651 651
           break;
652 652
       }
653 653
     } else
654
-    if(func_num_args()==3) {
654
+    if (func_num_args() == 3) {
655 655
       $Type = func_get_arg(2);
656 656
       $Label = func_get_arg(1);
657 657
     } else
658
-    if(func_num_args()==4) {
658
+    if (func_num_args() == 4) {
659 659
       $Type = func_get_arg(2);
660 660
       $Label = func_get_arg(1);
661 661
       $Options = func_get_arg(3);
@@ -664,27 +664,27 @@  discard block
 block discarded – undo
664 664
     }
665 665
   
666 666
   
667
-    if(!$this->detectClientExtension()) {
667
+    if (!$this->detectClientExtension()) {
668 668
       return false;
669 669
     }
670 670
   
671 671
     $meta = array();
672 672
     $skipFinalObjectEncode = false;
673 673
   
674
-    if($Object instanceof Exception) {
674
+    if ($Object instanceof Exception) {
675 675
 
676 676
       $meta['file'] = $this->_escapeTraceFile($Object->getFile());
677 677
       $meta['line'] = $Object->getLine();
678 678
       
679 679
       $trace = $Object->getTrace();
680
-      if($Object instanceof ErrorException
680
+      if ($Object instanceof ErrorException
681 681
          && isset($trace[0]['function'])
682
-         && $trace[0]['function']=='errorHandler'
682
+         && $trace[0]['function'] == 'errorHandler'
683 683
          && isset($trace[0]['class'])
684
-         && $trace[0]['class']=='FirePHP') {
684
+         && $trace[0]['class'] == 'FirePHP') {
685 685
            
686 686
         $severity = false;
687
-        switch($Object->getSeverity()) {
687
+        switch ($Object->getSeverity()) {
688 688
           case E_WARNING: $severity = 'E_WARNING'; break;
689 689
           case E_NOTICE: $severity = 'E_NOTICE'; break;
690 690
           case E_USER_ERROR: $severity = 'E_USER_ERROR'; break;
@@ -697,11 +697,11 @@  discard block
 block discarded – undo
697 697
         }
698 698
            
699 699
         $Object = array('Class'=>get_class($Object),
700
-                        'Message'=>$severity.': '.$Object->getMessage(),
700
+                        'Message'=>$severity . ': ' . $Object->getMessage(),
701 701
                         'File'=>$this->_escapeTraceFile($Object->getFile()),
702 702
                         'Line'=>$Object->getLine(),
703 703
                         'Type'=>'trigger',
704
-                        'Trace'=>$this->_escapeTrace(array_splice($trace,2)));
704
+                        'Trace'=>$this->_escapeTrace(array_splice($trace, 2)));
705 705
         $skipFinalObjectEncode = true;
706 706
       } else {
707 707
         $Object = array('Class'=>get_class($Object),
@@ -715,49 +715,49 @@  discard block
 block discarded – undo
715 715
       $Type = self::EXCEPTION;
716 716
       
717 717
     } else
718
-    if($Type==self::TRACE) {
718
+    if ($Type == self::TRACE) {
719 719
       
720 720
       $trace = debug_backtrace();
721
-      if(!$trace) return false;
722
-      for( $i=0 ; $i<sizeof($trace) ; $i++ ) {
721
+      if (!$trace) return false;
722
+      for ($i = 0; $i < sizeof($trace); $i++) {
723 723
 
724
-        if(isset($trace[$i]['class'])
724
+        if (isset($trace[$i]['class'])
725 725
            && isset($trace[$i]['file'])
726
-           && ($trace[$i]['class']=='FirePHP'
727
-               || $trace[$i]['class']=='FB')
728
-           && (substr($this->_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php'
729
-               || substr($this->_standardizePath($trace[$i]['file']),-29,29)=='FirePHPCore/FirePHP.class.php')) {
726
+           && ($trace[$i]['class'] == 'FirePHP'
727
+               || $trace[$i]['class'] == 'FB')
728
+           && (substr($this->_standardizePath($trace[$i]['file']), -18, 18) == 'FirePHPCore/fb.php'
729
+               || substr($this->_standardizePath($trace[$i]['file']), -29, 29) == 'FirePHPCore/FirePHP.class.php')) {
730 730
           /* Skip - FB::trace(), FB::send(), $firephp->trace(), $firephp->fb() */
731 731
         } else
732
-        if(isset($trace[$i]['class'])
733
-           && isset($trace[$i+1]['file'])
734
-           && $trace[$i]['class']=='FirePHP'
735
-           && substr($this->_standardizePath($trace[$i+1]['file']),-18,18)=='FirePHPCore/fb.php') {
732
+        if (isset($trace[$i]['class'])
733
+           && isset($trace[$i + 1]['file'])
734
+           && $trace[$i]['class'] == 'FirePHP'
735
+           && substr($this->_standardizePath($trace[$i + 1]['file']), -18, 18) == 'FirePHPCore/fb.php') {
736 736
           /* Skip fb() */
737 737
         } else
738
-        if($trace[$i]['function']=='fb'
739
-           || $trace[$i]['function']=='trace'
740
-           || $trace[$i]['function']=='send') {
741
-          $Object = array('Class'=>isset($trace[$i]['class'])?$trace[$i]['class']:'',
742
-                          'Type'=>isset($trace[$i]['type'])?$trace[$i]['type']:'',
743
-                          'Function'=>isset($trace[$i]['function'])?$trace[$i]['function']:'',
738
+        if ($trace[$i]['function'] == 'fb'
739
+           || $trace[$i]['function'] == 'trace'
740
+           || $trace[$i]['function'] == 'send') {
741
+          $Object = array('Class'=>isset($trace[$i]['class']) ? $trace[$i]['class'] : '',
742
+                          'Type'=>isset($trace[$i]['type']) ? $trace[$i]['type'] : '',
743
+                          'Function'=>isset($trace[$i]['function']) ? $trace[$i]['function'] : '',
744 744
                           'Message'=>$trace[$i]['args'][0],
745
-                          'File'=>isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'',
746
-                          'Line'=>isset($trace[$i]['line'])?$trace[$i]['line']:'',
747
-                          'Args'=>isset($trace[$i]['args'])?$this->encodeObject($trace[$i]['args']):'',
748
-                          'Trace'=>$this->_escapeTrace(array_splice($trace,$i+1)));
745
+                          'File'=>isset($trace[$i]['file']) ? $this->_escapeTraceFile($trace[$i]['file']) : '',
746
+                          'Line'=>isset($trace[$i]['line']) ? $trace[$i]['line'] : '',
747
+                          'Args'=>isset($trace[$i]['args']) ? $this->encodeObject($trace[$i]['args']) : '',
748
+                          'Trace'=>$this->_escapeTrace(array_splice($trace, $i + 1)));
749 749
 
750 750
           $skipFinalObjectEncode = true;
751
-          $meta['file'] = isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'';
752
-          $meta['line'] = isset($trace[$i]['line'])?$trace[$i]['line']:'';
751
+          $meta['file'] = isset($trace[$i]['file']) ? $this->_escapeTraceFile($trace[$i]['file']) : '';
752
+          $meta['line'] = isset($trace[$i]['line']) ? $trace[$i]['line'] : '';
753 753
           break;
754 754
         }
755 755
       }
756 756
 
757 757
     } else
758
-    if($Type==self::TABLE) {
758
+    if ($Type == self::TABLE) {
759 759
       
760
-      if(isset($Object[0]) && is_string($Object[0])) {
760
+      if (isset($Object[0]) && is_string($Object[0])) {
761 761
         $Object[1] = $this->encodeTable($Object[1]);
762 762
       } else {
763 763
         $Object = $this->encodeTable($Object);
@@ -766,44 +766,44 @@  discard block
 block discarded – undo
766 766
       $skipFinalObjectEncode = true;
767 767
       
768 768
     } else
769
-    if($Type==self::GROUP_START) {
769
+    if ($Type == self::GROUP_START) {
770 770
       
771
-      if(!$Label) {
771
+      if (!$Label) {
772 772
         throw $this->newException('You must specify a label for the group!');
773 773
       }
774 774
       
775 775
     } else {
776
-      if($Type===null) {
776
+      if ($Type === null) {
777 777
         $Type = self::LOG;
778 778
       }
779 779
     }
780 780
     
781
-    if($this->options['includeLineNumbers']) {
782
-      if(!isset($meta['file']) || !isset($meta['line'])) {
781
+    if ($this->options['includeLineNumbers']) {
782
+      if (!isset($meta['file']) || !isset($meta['line'])) {
783 783
 
784 784
         $trace = debug_backtrace();
785
-        for( $i=0 ; $trace && $i<sizeof($trace) ; $i++ ) {
785
+        for ($i = 0; $trace && $i < sizeof($trace); $i++) {
786 786
   
787
-          if(isset($trace[$i]['class'])
787
+          if (isset($trace[$i]['class'])
788 788
              && isset($trace[$i]['file'])
789
-             && ($trace[$i]['class']=='FirePHP'
790
-                 || $trace[$i]['class']=='FB')
791
-             && (substr($this->_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php'
792
-                 || substr($this->_standardizePath($trace[$i]['file']),-29,29)=='FirePHPCore/FirePHP.class.php')) {
789
+             && ($trace[$i]['class'] == 'FirePHP'
790
+                 || $trace[$i]['class'] == 'FB')
791
+             && (substr($this->_standardizePath($trace[$i]['file']), -18, 18) == 'FirePHPCore/fb.php'
792
+                 || substr($this->_standardizePath($trace[$i]['file']), -29, 29) == 'FirePHPCore/FirePHP.class.php')) {
793 793
             /* Skip - FB::trace(), FB::send(), $firephp->trace(), $firephp->fb() */
794 794
           } else
795
-          if(isset($trace[$i]['class'])
796
-             && isset($trace[$i+1]['file'])
797
-             && $trace[$i]['class']=='FirePHP'
798
-             && substr($this->_standardizePath($trace[$i+1]['file']),-18,18)=='FirePHPCore/fb.php') {
795
+          if (isset($trace[$i]['class'])
796
+             && isset($trace[$i + 1]['file'])
797
+             && $trace[$i]['class'] == 'FirePHP'
798
+             && substr($this->_standardizePath($trace[$i + 1]['file']), -18, 18) == 'FirePHPCore/fb.php') {
799 799
             /* Skip fb() */
800 800
           } else
801
-          if(isset($trace[$i]['file'])
802
-             && substr($this->_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php') {
801
+          if (isset($trace[$i]['file'])
802
+             && substr($this->_standardizePath($trace[$i]['file']), -18, 18) == 'FirePHPCore/fb.php') {
803 803
             /* Skip FB::fb() */
804 804
           } else {
805
-            $meta['file'] = isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'';
806
-            $meta['line'] = isset($trace[$i]['line'])?$trace[$i]['line']:'';
805
+            $meta['file'] = isset($trace[$i]['file']) ? $this->_escapeTraceFile($trace[$i]['file']) : '';
806
+            $meta['line'] = isset($trace[$i]['line']) ? $trace[$i]['line'] : '';
807 807
             break;
808 808
           }
809 809
         }      
@@ -814,49 +814,49 @@  discard block
 block discarded – undo
814 814
       unset($meta['line']);
815 815
     }
816 816
 
817
-  	$this->setHeader('X-Wf-Protocol-1','http://meta.wildfirehq.org/Protocol/JsonStream/0.2');
818
-  	$this->setHeader('X-Wf-1-Plugin-1','http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/'.self::VERSION);
817
+  	$this->setHeader('X-Wf-Protocol-1', 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2');
818
+  	$this->setHeader('X-Wf-1-Plugin-1', 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/' . self::VERSION);
819 819
  
820 820
     $structure_index = 1;
821
-    if($Type==self::DUMP) {
821
+    if ($Type == self::DUMP) {
822 822
       $structure_index = 2;
823
-    	$this->setHeader('X-Wf-1-Structure-2','http://meta.firephp.org/Wildfire/Structure/FirePHP/Dump/0.1');
823
+    	$this->setHeader('X-Wf-1-Structure-2', 'http://meta.firephp.org/Wildfire/Structure/FirePHP/Dump/0.1');
824 824
     } else {
825
-    	$this->setHeader('X-Wf-1-Structure-1','http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1');
825
+    	$this->setHeader('X-Wf-1-Structure-1', 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1');
826 826
     }
827 827
   
828
-    if($Type==self::DUMP) {
829
-    	$msg = '{"'.$Label.'":'.$this->jsonEncode($Object, $skipFinalObjectEncode).'}';
828
+    if ($Type == self::DUMP) {
829
+    	$msg = '{"' . $Label . '":' . $this->jsonEncode($Object, $skipFinalObjectEncode) . '}';
830 830
     } else {
831 831
       $msg_meta = $Options;
832 832
       $msg_meta['Type'] = $Type;
833
-      if($Label!==null) {
833
+      if ($Label !== null) {
834 834
         $msg_meta['Label'] = $Label;
835 835
       }
836
-      if(isset($meta['file']) && !isset($msg_meta['File'])) {
836
+      if (isset($meta['file']) && !isset($msg_meta['File'])) {
837 837
         $msg_meta['File'] = $meta['file'];
838 838
       }
839
-      if(isset($meta['line']) && !isset($msg_meta['Line'])) {
839
+      if (isset($meta['line']) && !isset($msg_meta['Line'])) {
840 840
         $msg_meta['Line'] = $meta['line'];
841 841
       }
842
-    	$msg = '['.$this->jsonEncode($msg_meta).','.$this->jsonEncode($Object, $skipFinalObjectEncode).']';
842
+    	$msg = '[' . $this->jsonEncode($msg_meta) . ',' . $this->jsonEncode($Object, $skipFinalObjectEncode) . ']';
843 843
     }
844 844
     
845
-    $parts = explode("\n",chunk_split($msg, 5000, "\n"));
845
+    $parts = explode("\n", chunk_split($msg, 5000, "\n"));
846 846
 
847
-    for( $i=0 ; $i<count($parts) ; $i++) {
847
+    for ($i = 0; $i < count($parts); $i++) {
848 848
         
849 849
         $part = $parts[$i];
850 850
         if ($part) {
851 851
             
852
-            if(count($parts)>2) {
852
+            if (count($parts) > 2) {
853 853
               // Message needs to be split into multiple parts
854
-              $this->setHeader('X-Wf-1-'.$structure_index.'-'.'1-'.$this->messageIndex,
855
-                               (($i==0)?strlen($msg):'')
854
+              $this->setHeader('X-Wf-1-' . $structure_index . '-' . '1-' . $this->messageIndex,
855
+                               (($i == 0) ? strlen($msg) : '')
856 856
                                . '|' . $part . '|'
857
-                               . (($i<count($parts)-2)?'\\':''));
857
+                               . (($i < count($parts) - 2) ? '\\' : ''));
858 858
             } else {
859
-              $this->setHeader('X-Wf-1-'.$structure_index.'-'.'1-'.$this->messageIndex,
859
+              $this->setHeader('X-Wf-1-' . $structure_index . '-' . '1-' . $this->messageIndex,
860 860
                                strlen($part) . '|' . $part . '|');
861 861
             }
862 862
             
@@ -868,7 +868,7 @@  discard block
 block discarded – undo
868 868
         }
869 869
     }
870 870
 
871
-  	$this->setHeader('X-Wf-1-Index',$this->messageIndex-1);
871
+  	$this->setHeader('X-Wf-1-Index', $this->messageIndex - 1);
872 872
 
873 873
     return true;
874 874
   }
@@ -880,7 +880,7 @@  discard block
 block discarded – undo
880 880
    * @return string
881 881
    */
882 882
   protected function _standardizePath($Path) {
883
-    return preg_replace('/\\\\+/','/',$Path);    
883
+    return preg_replace('/\\\\+/', '/', $Path);    
884 884
   }
885 885
   
886 886
   /**
@@ -890,12 +890,12 @@  discard block
 block discarded – undo
890 890
    * @return array
891 891
    */
892 892
   protected function _escapeTrace($Trace) {
893
-    if(!$Trace) return $Trace;
894
-    for( $i=0 ; $i<sizeof($Trace) ; $i++ ) {
895
-      if(isset($Trace[$i]['file'])) {
893
+    if (!$Trace) return $Trace;
894
+    for ($i = 0; $i < sizeof($Trace); $i++) {
895
+      if (isset($Trace[$i]['file'])) {
896 896
         $Trace[$i]['file'] = $this->_escapeTraceFile($Trace[$i]['file']);
897 897
       }
898
-      if(isset($Trace[$i]['args'])) {
898
+      if (isset($Trace[$i]['args'])) {
899 899
         $Trace[$i]['args'] = $this->encodeObject($Trace[$i]['args']);
900 900
       }
901 901
     }
@@ -910,10 +910,10 @@  discard block
 block discarded – undo
910 910
    */
911 911
   protected function _escapeTraceFile($File) {
912 912
     /* Check if we have a windows filepath */
913
-    if(strpos($File,'\\')) {
913
+    if (strpos($File, '\\')) {
914 914
       /* First strip down to single \ */
915 915
       
916
-      $file = preg_replace('/\\\\+/','\\',$File);
916
+      $file = preg_replace('/\\\\+/', '\\', $File);
917 917
       
918 918
       return $file;
919 919
     }
@@ -927,7 +927,7 @@  discard block
 block discarded – undo
927 927
    * @param string_type $Value
928 928
    */
929 929
   protected function setHeader($Name, $Value) {
930
-    return header($Name.': '.$Value);
930
+    return header($Name . ': ' . $Value);
931 931
   }
932 932
 
933 933
   /**
@@ -936,7 +936,7 @@  discard block
 block discarded – undo
936 936
    * @return string|false
937 937
    */
938 938
   protected function getUserAgent() {
939
-    if(!isset($_SERVER['HTTP_USER_AGENT'])) return false;
939
+    if (!isset($_SERVER['HTTP_USER_AGENT'])) return false;
940 940
     return $_SERVER['HTTP_USER_AGENT'];
941 941
   }
942 942
 
@@ -958,14 +958,14 @@  discard block
 block discarded – undo
958 958
    * @param object $Object The object to be encoded
959 959
    * @return string The JSON string
960 960
    */
961
-  public function jsonEncode($Object, $skipObjectEncode=false)
961
+  public function jsonEncode($Object, $skipObjectEncode = false)
962 962
   {
963
-    if(!$skipObjectEncode) {
963
+    if (!$skipObjectEncode) {
964 964
       $Object = $this->encodeObject($Object);
965 965
     }
966 966
     
967
-    if(function_exists('json_encode')
968
-       && $this->options['useNativeJsonEncode']!=false) {
967
+    if (function_exists('json_encode')
968
+       && $this->options['useNativeJsonEncode'] != false) {
969 969
 
970 970
       return json_encode($Object);
971 971
     } else {
@@ -981,15 +981,15 @@  discard block
 block discarded – undo
981 981
    */  
982 982
   protected function encodeTable($Table) {
983 983
     
984
-    if(!$Table) return $Table;
984
+    if (!$Table) return $Table;
985 985
     
986 986
     $new_table = array();
987
-    foreach($Table as $row) {
987
+    foreach ($Table as $row) {
988 988
   
989
-      if(is_array($row)) {
989
+      if (is_array($row)) {
990 990
         $new_row = array();
991 991
         
992
-        foreach($row as $item) {
992
+        foreach ($row as $item) {
993 993
           $new_row[] = $this->encodeObject($item);
994 994
         }
995 995
         
@@ -1014,18 +1014,18 @@  discard block
 block discarded – undo
1014 1014
 
1015 1015
     if (is_resource($Object)) {
1016 1016
 
1017
-      return '** '.(string)$Object.' **';
1017
+      return '** ' . (string) $Object . ' **';
1018 1018
 
1019 1019
     } else    
1020 1020
     if (is_object($Object)) {
1021 1021
 
1022 1022
         if ($ObjectDepth > $this->options['maxObjectDepth']) {
1023
-          return '** Max Object Depth ('.$this->options['maxObjectDepth'].') **';
1023
+          return '** Max Object Depth (' . $this->options['maxObjectDepth'] . ') **';
1024 1024
         }
1025 1025
         
1026 1026
         foreach ($this->objectStack as $refVal) {
1027 1027
             if ($refVal === $Object) {
1028
-                return '** Recursion ('.get_class($Object).') **';
1028
+                return '** Recursion (' . get_class($Object) . ') **';
1029 1029
             }
1030 1030
         }
1031 1031
         array_push($this->objectStack, $Object);
@@ -1035,45 +1035,45 @@  discard block
 block discarded – undo
1035 1035
 
1036 1036
         $reflectionClass = new ReflectionClass($class);  
1037 1037
         $properties = array();
1038
-        foreach( $reflectionClass->getProperties() as $property) {
1038
+        foreach ($reflectionClass->getProperties() as $property) {
1039 1039
           $properties[$property->getName()] = $property;
1040 1040
         }
1041 1041
             
1042
-        $members = (array)$Object;
1042
+        $members = (array) $Object;
1043 1043
             
1044
-        foreach( $properties as $raw_name => $property ) {
1044
+        foreach ($properties as $raw_name => $property) {
1045 1045
           
1046 1046
           $name = $raw_name;
1047
-          if($property->isStatic()) {
1048
-            $name = 'static:'.$name;
1047
+          if ($property->isStatic()) {
1048
+            $name = 'static:' . $name;
1049 1049
           }
1050
-          if($property->isPublic()) {
1051
-            $name = 'public:'.$name;
1050
+          if ($property->isPublic()) {
1051
+            $name = 'public:' . $name;
1052 1052
           } else
1053
-          if($property->isPrivate()) {
1054
-            $name = 'private:'.$name;
1055
-            $raw_name = "\0".$class."\0".$raw_name;
1053
+          if ($property->isPrivate()) {
1054
+            $name = 'private:' . $name;
1055
+            $raw_name = "\0" . $class . "\0" . $raw_name;
1056 1056
           } else
1057
-          if($property->isProtected()) {
1058
-            $name = 'protected:'.$name;
1059
-            $raw_name = "\0".'*'."\0".$raw_name;
1057
+          if ($property->isProtected()) {
1058
+            $name = 'protected:' . $name;
1059
+            $raw_name = "\0" . '*' . "\0" . $raw_name;
1060 1060
           }
1061 1061
           
1062
-          if(!(isset($this->objectFilters[$class_lower])
1062
+          if (!(isset($this->objectFilters[$class_lower])
1063 1063
                && is_array($this->objectFilters[$class_lower])
1064
-               && in_array($raw_name,$this->objectFilters[$class_lower]))) {
1064
+               && in_array($raw_name, $this->objectFilters[$class_lower]))) {
1065 1065
 
1066
-            if(array_key_exists($raw_name,$members)
1066
+            if (array_key_exists($raw_name, $members)
1067 1067
                && !$property->isStatic()) {
1068 1068
               
1069 1069
               $return[$name] = $this->encodeObject($members[$raw_name], $ObjectDepth + 1, 1);      
1070 1070
             
1071 1071
             } else {
1072
-              if(method_exists($property,'setAccessible')) {
1072
+              if (method_exists($property, 'setAccessible')) {
1073 1073
                 $property->setAccessible(true);
1074 1074
                 $return[$name] = $this->encodeObject($property->getValue($Object), $ObjectDepth + 1, 1);
1075 1075
               } else
1076
-              if($property->isPublic()) {
1076
+              if ($property->isPublic()) {
1077 1077
                 $return[$name] = $this->encodeObject($property->getValue($Object), $ObjectDepth + 1, 1);
1078 1078
               } else {
1079 1079
                 $return[$name] = '** Need PHP 5.3 to get value **';
@@ -1086,7 +1086,7 @@  discard block
 block discarded – undo
1086 1086
         
1087 1087
         // Include all members that are not defined in the class
1088 1088
         // but exist in the object
1089
-        foreach( $members as $raw_name => $value ) {
1089
+        foreach ($members as $raw_name => $value) {
1090 1090
           
1091 1091
           $name = $raw_name;
1092 1092
           
@@ -1095,12 +1095,12 @@  discard block
 block discarded – undo
1095 1095
             $name = $parts[2];
1096 1096
           }
1097 1097
           
1098
-          if(!isset($properties[$name])) {
1099
-            $name = 'undeclared:'.$name;
1098
+          if (!isset($properties[$name])) {
1099
+            $name = 'undeclared:' . $name;
1100 1100
               
1101
-            if(!(isset($this->objectFilters[$class_lower])
1101
+            if (!(isset($this->objectFilters[$class_lower])
1102 1102
                  && is_array($this->objectFilters[$class_lower])
1103
-                 && in_array($raw_name,$this->objectFilters[$class_lower]))) {
1103
+                 && in_array($raw_name, $this->objectFilters[$class_lower]))) {
1104 1104
               
1105 1105
               $return[$name] = $this->encodeObject($value, $ObjectDepth + 1, 1);
1106 1106
             } else {
@@ -1114,7 +1114,7 @@  discard block
 block discarded – undo
1114 1114
     } elseif (is_array($Object)) {
1115 1115
 
1116 1116
         if ($ArrayDepth > $this->options['maxArrayDepth']) {
1117
-          return '** Max Array Depth ('.$this->options['maxArrayDepth'].') **';
1117
+          return '** Max Array Depth (' . $this->options['maxArrayDepth'] . ') **';
1118 1118
         }
1119 1119
       
1120 1120
         foreach ($Object as $key => $val) {
@@ -1123,16 +1123,16 @@  discard block
 block discarded – undo
1123 1123
           // if the recursion is not reset here as it contains
1124 1124
           // a reference to itself. This is the only way I have come up
1125 1125
           // with to stop infinite recursion in this case.
1126
-          if($key=='GLOBALS'
1126
+          if ($key == 'GLOBALS'
1127 1127
              && is_array($val)
1128
-             && array_key_exists('GLOBALS',$val)) {
1128
+             && array_key_exists('GLOBALS', $val)) {
1129 1129
             $val['GLOBALS'] = '** Recursion (GLOBALS) **';
1130 1130
           }
1131 1131
           
1132 1132
           $return[$key] = $this->encodeObject($val, 1, $ArrayDepth + 1);
1133 1133
         }
1134 1134
     } else {
1135
-      if(self::is_utf8($Object)) {
1135
+      if (self::is_utf8($Object)) {
1136 1136
         return $Object;
1137 1137
       } else {
1138 1138
         return utf8_encode($Object);
@@ -1148,24 +1148,24 @@  discard block
 block discarded – undo
1148 1148
    * @return boolean
1149 1149
    */
1150 1150
   protected static function is_utf8($str) {
1151
-    $c=0; $b=0;
1152
-    $bits=0;
1153
-    $len=strlen($str);
1154
-    for($i=0; $i<$len; $i++){
1155
-        $c=ord($str[$i]);
1156
-        if($c > 128){
1157
-            if(($c >= 254)) return false;
1158
-            elseif($c >= 252) $bits=6;
1159
-            elseif($c >= 248) $bits=5;
1160
-            elseif($c >= 240) $bits=4;
1161
-            elseif($c >= 224) $bits=3;
1162
-            elseif($c >= 192) $bits=2;
1151
+    $c = 0; $b = 0;
1152
+    $bits = 0;
1153
+    $len = strlen($str);
1154
+    for ($i = 0; $i < $len; $i++) {
1155
+        $c = ord($str[$i]);
1156
+        if ($c > 128) {
1157
+            if (($c >= 254)) return false;
1158
+            elseif ($c >= 252) $bits = 6;
1159
+            elseif ($c >= 248) $bits = 5;
1160
+            elseif ($c >= 240) $bits = 4;
1161
+            elseif ($c >= 224) $bits = 3;
1162
+            elseif ($c >= 192) $bits = 2;
1163 1163
             else return false;
1164
-            if(($i+$bits) > $len) return false;
1165
-            while($bits > 1){
1164
+            if (($i + $bits) > $len) return false;
1165
+            while ($bits > 1) {
1166 1166
                 $i++;
1167
-                $b=ord($str[$i]);
1168
-                if($b < 128 || $b > 191) return false;
1167
+                $b = ord($str[$i]);
1168
+                if ($b < 128 || $b > 191) return false;
1169 1169
                 $bits--;
1170 1170
             }
1171 1171
         }
@@ -1250,11 +1250,11 @@  discard block
 block discarded – undo
1250 1250
   private function json_utf82utf16($utf8)
1251 1251
   {
1252 1252
       // oh please oh please oh please oh please oh please
1253
-      if(function_exists('mb_convert_encoding')) {
1253
+      if (function_exists('mb_convert_encoding')) {
1254 1254
           return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
1255 1255
       }
1256 1256
 
1257
-      switch(strlen($utf8)) {
1257
+      switch (strlen($utf8)) {
1258 1258
           case 1:
1259 1259
               // this case should never be reached, because we are in ASCII range
1260 1260
               // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
@@ -1294,8 +1294,8 @@  discard block
 block discarded – undo
1294 1294
   private function json_encode($var)
1295 1295
   {
1296 1296
     
1297
-    if(is_object($var)) {
1298
-      if(in_array($var,$this->json_objectStack)) {
1297
+    if (is_object($var)) {
1298
+      if (in_array($var, $this->json_objectStack)) {
1299 1299
         return '"** Recursion **"';
1300 1300
       }
1301 1301
     }
@@ -1348,7 +1348,7 @@  discard block
 block discarded – undo
1348 1348
                       case $ord_var_c == 0x2F:
1349 1349
                       case $ord_var_c == 0x5C:
1350 1350
                           // double quote, slash, slosh
1351
-                          $ascii .= '\\'.$var{$c};
1351
+                          $ascii .= '\\' . $var{$c};
1352 1352
                           break;
1353 1353
 
1354 1354
                       case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
@@ -1417,7 +1417,7 @@  discard block
 block discarded – undo
1417 1417
                   }
1418 1418
               }
1419 1419
 
1420
-              return '"'.$ascii.'"';
1420
+              return '"' . $ascii . '"';
1421 1421
 
1422 1422
           case 'array':
1423 1423
              /*
@@ -1449,8 +1449,8 @@  discard block
 block discarded – undo
1449 1449
 
1450 1450
                   array_pop($this->json_objectStack);
1451 1451
 
1452
-                  foreach($properties as $property) {
1453
-                      if($property instanceof Exception) {
1452
+                  foreach ($properties as $property) {
1453
+                      if ($property instanceof Exception) {
1454 1454
                           return $property;
1455 1455
                       }
1456 1456
                   }
@@ -1465,8 +1465,8 @@  discard block
 block discarded – undo
1465 1465
 
1466 1466
               array_pop($this->json_objectStack);
1467 1467
 
1468
-              foreach($elements as $element) {
1469
-                  if($element instanceof Exception) {
1468
+              foreach ($elements as $element) {
1469
+                  if ($element instanceof Exception) {
1470 1470
                       return $element;
1471 1471
                   }
1472 1472
               }
@@ -1484,8 +1484,8 @@  discard block
 block discarded – undo
1484 1484
 
1485 1485
               array_pop($this->json_objectStack);
1486 1486
               
1487
-              foreach($properties as $property) {
1488
-                  if($property instanceof Exception) {
1487
+              foreach ($properties as $property) {
1488
+                  if ($property instanceof Exception) {
1489 1489
                       return $property;
1490 1490
                   }
1491 1491
               }
@@ -1512,15 +1512,15 @@  discard block
 block discarded – undo
1512 1512
       // if the recursion is not reset here as it contains
1513 1513
       // a reference to itself. This is the only way I have come up
1514 1514
       // with to stop infinite recursion in this case.
1515
-      if($name=='GLOBALS'
1515
+      if ($name == 'GLOBALS'
1516 1516
          && is_array($value)
1517
-         && array_key_exists('GLOBALS',$value)) {
1517
+         && array_key_exists('GLOBALS', $value)) {
1518 1518
         $value['GLOBALS'] = '** Recursion **';
1519 1519
       }
1520 1520
     
1521 1521
       $encoded_value = $this->json_encode($value);
1522 1522
 
1523
-      if($encoded_value instanceof Exception) {
1523
+      if ($encoded_value instanceof Exception) {
1524 1524
           return $encoded_value;
1525 1525
       }
1526 1526
 
Please login to merge, or discard this patch.
Braces   +33 added lines, -13 removed lines patch added patch discarded remove patch
@@ -718,7 +718,9 @@  discard block
 block discarded – undo
718 718
     if($Type==self::TRACE) {
719 719
       
720 720
       $trace = debug_backtrace();
721
-      if(!$trace) return false;
721
+      if(!$trace) {
722
+      	return false;
723
+      }
722 724
       for( $i=0 ; $i<sizeof($trace) ; $i++ ) {
723 725
 
724 726
         if(isset($trace[$i]['class'])
@@ -890,7 +892,9 @@  discard block
 block discarded – undo
890 892
    * @return array
891 893
    */
892 894
   protected function _escapeTrace($Trace) {
893
-    if(!$Trace) return $Trace;
895
+    if(!$Trace) {
896
+    	return $Trace;
897
+    }
894 898
     for( $i=0 ; $i<sizeof($Trace) ; $i++ ) {
895 899
       if(isset($Trace[$i]['file'])) {
896 900
         $Trace[$i]['file'] = $this->_escapeTraceFile($Trace[$i]['file']);
@@ -936,7 +940,9 @@  discard block
 block discarded – undo
936 940
    * @return string|false
937 941
    */
938 942
   protected function getUserAgent() {
939
-    if(!isset($_SERVER['HTTP_USER_AGENT'])) return false;
943
+    if(!isset($_SERVER['HTTP_USER_AGENT'])) {
944
+    	return false;
945
+    }
940 946
     return $_SERVER['HTTP_USER_AGENT'];
941 947
   }
942 948
 
@@ -981,7 +987,9 @@  discard block
 block discarded – undo
981 987
    */  
982 988
   protected function encodeTable($Table) {
983 989
     
984
-    if(!$Table) return $Table;
990
+    if(!$Table) {
991
+    	return $Table;
992
+    }
985 993
     
986 994
     $new_table = array();
987 995
     foreach($Table as $row) {
@@ -1154,18 +1162,30 @@  discard block
 block discarded – undo
1154 1162
     for($i=0; $i<$len; $i++){
1155 1163
         $c=ord($str[$i]);
1156 1164
         if($c > 128){
1157
-            if(($c >= 254)) return false;
1158
-            elseif($c >= 252) $bits=6;
1159
-            elseif($c >= 248) $bits=5;
1160
-            elseif($c >= 240) $bits=4;
1161
-            elseif($c >= 224) $bits=3;
1162
-            elseif($c >= 192) $bits=2;
1163
-            else return false;
1164
-            if(($i+$bits) > $len) return false;
1165
+            if(($c >= 254)) {
1166
+            	return false;
1167
+            } elseif($c >= 252) {
1168
+            	$bits=6;
1169
+            } elseif($c >= 248) {
1170
+            	$bits=5;
1171
+            } elseif($c >= 240) {
1172
+            	$bits=4;
1173
+            } elseif($c >= 224) {
1174
+            	$bits=3;
1175
+            } elseif($c >= 192) {
1176
+            	$bits=2;
1177
+            } else {
1178
+            	return false;
1179
+            }
1180
+            if(($i+$bits) > $len) {
1181
+            	return false;
1182
+            }
1165 1183
             while($bits > 1){
1166 1184
                 $i++;
1167 1185
                 $b=ord($str[$i]);
1168
-                if($b < 128 || $b > 191) return false;
1186
+                if($b < 128 || $b > 191) {
1187
+                	return false;
1188
+                }
1169 1189
                 $bits--;
1170 1190
             }
1171 1191
         }
Please login to merge, or discard this patch.
libs/ftp.class.php 4 patches
Doc Comments   +25 added lines patch added patch discarded remove patch
@@ -177,6 +177,9 @@  discard block
 block discarded – undo
177 177
             return $response;
178 178
         }
179 179
 
180
+        /**
181
+         * @param string $pathname
182
+         */
180 183
         function ftp_delete($pathname)
181 184
         {
182 185
             $this->ftp_putcmd("DELE", $pathname);
@@ -187,6 +190,9 @@  discard block
 block discarded – undo
187 190
             return $response;
188 191
         }
189 192
 
193
+        /**
194
+         * @param string $pathname
195
+         */
190 196
         function ftp_rmdir($pathname)
191 197
         {
192 198
             $this->ftp_putcmd("RMD", $pathname);
@@ -197,6 +203,9 @@  discard block
 block discarded – undo
197 203
             return $response;
198 204
         }
199 205
 
206
+        /**
207
+         * @param string $pathname
208
+         */
200 209
         function ftp_mkdir($pathname)
201 210
         {
202 211
             $this->ftp_putcmd("MKD", $pathname);
@@ -358,6 +367,10 @@  discard block
 block discarded – undo
358 367
             return $response;
359 368
         }
360 369
 
370
+        /**
371
+         * @param string $remotefile
372
+         * @param string $localfile
373
+         */
361 374
         function ftp_put($remotefile, $localfile, $mode = 1)
362 375
         {
363 376
             
@@ -408,6 +421,9 @@  discard block
 block discarded – undo
408 421
             return $response;
409 422
         }
410 423
 
424
+        /**
425
+         * @param string $command
426
+         */
411 427
         function ftp_site($command)
412 428
         {
413 429
             $this->ftp_putcmd("SITE", $command);
@@ -431,6 +447,9 @@  discard block
 block discarded – undo
431 447
 
432 448
         /* Private Functions */
433 449
 
450
+        /**
451
+         * @param integer $mode
452
+         */
434 453
         function ftp_type($mode)
435 454
         {
436 455
             if ($mode) {
@@ -468,6 +487,9 @@  discard block
 block discarded – undo
468 487
             return $ip_port;
469 488
         }
470 489
 
490
+        /**
491
+         * @param string $cmd
492
+         */
471 493
         function ftp_putcmd($cmd, $arg = "")
472 494
         {
473 495
             if ($arg != "") {
@@ -536,6 +558,9 @@  discard block
 block discarded – undo
536 558
             return fclose($sock);
537 559
         }
538 560
 
561
+        /**
562
+         * @param string $ip_port
563
+         */
539 564
         function ftp_open_data_connection($ip_port)
540 565
         {
541 566
             if (!preg_match("@[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+@", $ip_port)) {
Please login to merge, or discard this patch.
Indentation   +479 added lines, -479 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php
2
-    /*********************************************************************
2
+	/*********************************************************************
3 3
      *
4 4
      *    PHP FTP Client Class By TOMO ( [email protected] )
5 5
 	 *    Modified By NAVER ( [email protected] )
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
      *
19 19
      ********************************************************************/
20 20
 
21
-    /*********************************************************************
21
+	/*********************************************************************
22 22
      * List of available functions
23 23
      * ftp_connect($server, $port = 21)
24 24
      * ftp_login($user, $pass)
@@ -41,448 +41,448 @@  discard block
 block discarded – undo
41 41
      * ftp_quit()
42 42
      *********************************************************************/
43 43
 
44
-    class ftp
45
-    {
46
-        /* Public variables */
47
-        var $debug;
48
-        var $umask;
49
-        var $timeout;
50
-
51
-        /* Private variables */
52
-        var $ftp_sock;
53
-        var $ftp_resp;
54
-
55
-        /* Constractor */
56
-        function ftp()
57
-        {
58
-            $this->debug = false;
59
-            $this->umask = 0022;
60
-            $this->timeout = 30;
61
-
62
-            if (!defined("FTP_BINARY")) {
63
-                define("FTP_BINARY", 1);
64
-            }
65
-            if (!defined("FTP_ASCII")) {
66
-                define("FTP_ASCII", 0);
67
-            }
68
-
69
-            $this->ftp_resp = "";
70
-        }
71
-
72
-        /* Public functions */
73
-        function ftp_connect($server, $port = 21)
74
-        {
75
-            $this->ftp_debug("Trying to ".$server.":".$port." ...\n");
76
-            $this->ftp_sock = @fsockopen($server, $port, $errno, $errstr, $this->timeout);
77
-
78
-            if (!$this->ftp_sock || !$this->ftp_ok()) {
79
-                $this->ftp_debug("Error : Cannot connect to remote host \"".$server.":".$port."\"\n");
80
-                $this->ftp_debug("Error : fsockopen() ".$errstr." (".$errno.")\n");
81
-                return FALSE;
82
-            }
44
+	class ftp
45
+	{
46
+		/* Public variables */
47
+		var $debug;
48
+		var $umask;
49
+		var $timeout;
50
+
51
+		/* Private variables */
52
+		var $ftp_sock;
53
+		var $ftp_resp;
54
+
55
+		/* Constractor */
56
+		function ftp()
57
+		{
58
+			$this->debug = false;
59
+			$this->umask = 0022;
60
+			$this->timeout = 30;
61
+
62
+			if (!defined("FTP_BINARY")) {
63
+				define("FTP_BINARY", 1);
64
+			}
65
+			if (!defined("FTP_ASCII")) {
66
+				define("FTP_ASCII", 0);
67
+			}
68
+
69
+			$this->ftp_resp = "";
70
+		}
71
+
72
+		/* Public functions */
73
+		function ftp_connect($server, $port = 21)
74
+		{
75
+			$this->ftp_debug("Trying to ".$server.":".$port." ...\n");
76
+			$this->ftp_sock = @fsockopen($server, $port, $errno, $errstr, $this->timeout);
77
+
78
+			if (!$this->ftp_sock || !$this->ftp_ok()) {
79
+				$this->ftp_debug("Error : Cannot connect to remote host \"".$server.":".$port."\"\n");
80
+				$this->ftp_debug("Error : fsockopen() ".$errstr." (".$errno.")\n");
81
+				return FALSE;
82
+			}
83 83
 
84 84
 			if(substr($this->ftp_resp, 0, 3) !== '220')
85 85
 			{
86 86
 				return FALSE;
87 87
 			}
88 88
 
89
-            $this->ftp_debug("Connected to remote host \"".$server.":".$port."\"\n");
90
-
91
-            return TRUE;
92
-        }
93
-
94
-        function ftp_login($user, $pass)
95
-        {
96
-            $this->ftp_putcmd("USER", $user);
97
-            if (!$this->ftp_ok()) {
98
-                $this->ftp_debug("Error : USER command failed\n");
99
-                return FALSE;
100
-            }
101
-
102
-            $this->ftp_putcmd("PASS", $pass);
103
-            if (!$this->ftp_ok()) {
104
-                $this->ftp_debug("Error : PASS command failed\n");
105
-                return FALSE;
106
-            }
107
-            $this->ftp_debug("Authentication succeeded\n");
108
-
109
-            return TRUE;
110
-        }
111
-
112
-        function ftp_pwd()
113
-        {
114
-            $this->ftp_putcmd("PWD");
115
-            if (!$this->ftp_ok()) {
116
-                $this->ftp_debug("Error : PWD command failed\n");
117
-                return FALSE;
118
-            }
119
-
120
-            return preg_replace("@^[0-9]{3} \"(.+)\" .+\r\n@", "\\1", $this->ftp_resp);
121
-        }
122
-
123
-        function ftp_size($pathname)
124
-        {
125
-            $this->ftp_putcmd("SIZE", $pathname);
126
-            if (!$this->ftp_ok()) {
127
-                $this->ftp_debug("Error : SIZE command failed\n");
128
-                return -1;
129
-            }
130
-
131
-            return preg_replace("@^[0-9]{3} ([0-9]+)\r\n@", "\\1", $this->ftp_resp);
132
-        }
133
-
134
-        function ftp_mdtm($pathname)
135
-        {
136
-            $this->ftp_putcmd("MDTM", $pathname);
137
-            if (!$this->ftp_ok()) {
138
-                $this->ftp_debug("Error : MDTM command failed\n");
139
-                return -1;
140
-            }
141
-            $mdtm = preg_replace("@^[0-9]{3} ([0-9]+)\r\n@", "\\1", $this->ftp_resp);
142
-            $date = sscanf($mdtm, "%4d%2d%2d%2d%2d%2d");
143
-            $timestamp = mktime($date[3], $date[4], $date[5], $date[1], $date[2], $date[0]);
144
-
145
-            return $timestamp;
146
-        }
147
-
148
-        function ftp_systype()
149
-        {
150
-            $this->ftp_putcmd("SYST");
151
-            if (!$this->ftp_ok()) {
152
-                $this->ftp_debug("Error : SYST command failed\n");
153
-                return FALSE;
154
-            }
155
-            $DATA = explode(" ", $this->ftp_resp);
156
-
157
-            return $DATA[1];
158
-        }
159
-
160
-        function ftp_cdup()
161
-        {
162
-            $this->ftp_putcmd("CDUP");
163
-            $response = $this->ftp_ok();
164
-            if (!$response) {
165
-                $this->ftp_debug("Error : CDUP command failed\n");
166
-            }
167
-            return $response;
168
-        }
169
-
170
-        function ftp_chdir($pathname)
171
-        {
172
-            $this->ftp_putcmd("CWD", $pathname);
173
-            $response = $this->ftp_ok();
174
-            if (!$response) {
175
-                $this->ftp_debug("Error : CWD command failed\n");
176
-            }
177
-            return $response;
178
-        }
179
-
180
-        function ftp_delete($pathname)
181
-        {
182
-            $this->ftp_putcmd("DELE", $pathname);
183
-            $response = $this->ftp_ok();
184
-            if (!$response) {
185
-                $this->ftp_debug("Error : DELE command failed\n");
186
-            }
187
-            return $response;
188
-        }
189
-
190
-        function ftp_rmdir($pathname)
191
-        {
192
-            $this->ftp_putcmd("RMD", $pathname);
193
-            $response = $this->ftp_ok();
194
-            if (!$response) {
195
-                $this->ftp_debug("Error : RMD command failed\n");
196
-            }
197
-            return $response;
198
-        }
199
-
200
-        function ftp_mkdir($pathname)
201
-        {
202
-            $this->ftp_putcmd("MKD", $pathname);
203
-            $response = $this->ftp_ok();
204
-            if (!$response) {
205
-                $this->ftp_debug("Error : MKD command failed\n");
206
-            }
207
-            return $response;
208
-        }
209
-
210
-        function ftp_file_exists($pathname)
211
-        {
212
-            if (!($remote_list = $this->ftp_nlist("-a"))) {
213
-                $this->ftp_debug("Error : Cannot get remote file list\n");
214
-                return -1;
215
-            }
89
+			$this->ftp_debug("Connected to remote host \"".$server.":".$port."\"\n");
90
+
91
+			return TRUE;
92
+		}
93
+
94
+		function ftp_login($user, $pass)
95
+		{
96
+			$this->ftp_putcmd("USER", $user);
97
+			if (!$this->ftp_ok()) {
98
+				$this->ftp_debug("Error : USER command failed\n");
99
+				return FALSE;
100
+			}
101
+
102
+			$this->ftp_putcmd("PASS", $pass);
103
+			if (!$this->ftp_ok()) {
104
+				$this->ftp_debug("Error : PASS command failed\n");
105
+				return FALSE;
106
+			}
107
+			$this->ftp_debug("Authentication succeeded\n");
108
+
109
+			return TRUE;
110
+		}
111
+
112
+		function ftp_pwd()
113
+		{
114
+			$this->ftp_putcmd("PWD");
115
+			if (!$this->ftp_ok()) {
116
+				$this->ftp_debug("Error : PWD command failed\n");
117
+				return FALSE;
118
+			}
119
+
120
+			return preg_replace("@^[0-9]{3} \"(.+)\" .+\r\n@", "\\1", $this->ftp_resp);
121
+		}
122
+
123
+		function ftp_size($pathname)
124
+		{
125
+			$this->ftp_putcmd("SIZE", $pathname);
126
+			if (!$this->ftp_ok()) {
127
+				$this->ftp_debug("Error : SIZE command failed\n");
128
+				return -1;
129
+			}
130
+
131
+			return preg_replace("@^[0-9]{3} ([0-9]+)\r\n@", "\\1", $this->ftp_resp);
132
+		}
133
+
134
+		function ftp_mdtm($pathname)
135
+		{
136
+			$this->ftp_putcmd("MDTM", $pathname);
137
+			if (!$this->ftp_ok()) {
138
+				$this->ftp_debug("Error : MDTM command failed\n");
139
+				return -1;
140
+			}
141
+			$mdtm = preg_replace("@^[0-9]{3} ([0-9]+)\r\n@", "\\1", $this->ftp_resp);
142
+			$date = sscanf($mdtm, "%4d%2d%2d%2d%2d%2d");
143
+			$timestamp = mktime($date[3], $date[4], $date[5], $date[1], $date[2], $date[0]);
144
+
145
+			return $timestamp;
146
+		}
147
+
148
+		function ftp_systype()
149
+		{
150
+			$this->ftp_putcmd("SYST");
151
+			if (!$this->ftp_ok()) {
152
+				$this->ftp_debug("Error : SYST command failed\n");
153
+				return FALSE;
154
+			}
155
+			$DATA = explode(" ", $this->ftp_resp);
156
+
157
+			return $DATA[1];
158
+		}
159
+
160
+		function ftp_cdup()
161
+		{
162
+			$this->ftp_putcmd("CDUP");
163
+			$response = $this->ftp_ok();
164
+			if (!$response) {
165
+				$this->ftp_debug("Error : CDUP command failed\n");
166
+			}
167
+			return $response;
168
+		}
169
+
170
+		function ftp_chdir($pathname)
171
+		{
172
+			$this->ftp_putcmd("CWD", $pathname);
173
+			$response = $this->ftp_ok();
174
+			if (!$response) {
175
+				$this->ftp_debug("Error : CWD command failed\n");
176
+			}
177
+			return $response;
178
+		}
179
+
180
+		function ftp_delete($pathname)
181
+		{
182
+			$this->ftp_putcmd("DELE", $pathname);
183
+			$response = $this->ftp_ok();
184
+			if (!$response) {
185
+				$this->ftp_debug("Error : DELE command failed\n");
186
+			}
187
+			return $response;
188
+		}
189
+
190
+		function ftp_rmdir($pathname)
191
+		{
192
+			$this->ftp_putcmd("RMD", $pathname);
193
+			$response = $this->ftp_ok();
194
+			if (!$response) {
195
+				$this->ftp_debug("Error : RMD command failed\n");
196
+			}
197
+			return $response;
198
+		}
199
+
200
+		function ftp_mkdir($pathname)
201
+		{
202
+			$this->ftp_putcmd("MKD", $pathname);
203
+			$response = $this->ftp_ok();
204
+			if (!$response) {
205
+				$this->ftp_debug("Error : MKD command failed\n");
206
+			}
207
+			return $response;
208
+		}
209
+
210
+		function ftp_file_exists($pathname)
211
+		{
212
+			if (!($remote_list = $this->ftp_nlist("-a"))) {
213
+				$this->ftp_debug("Error : Cannot get remote file list\n");
214
+				return -1;
215
+			}
216 216
             
217
-            reset($remote_list);
218
-            while (list(,$value) = each($remote_list)) {
219
-                if ($value == $pathname) {
220
-                    $this->ftp_debug("Remote file ".$pathname." exists\n");
221
-                    return 1;
222
-                }
223
-            }
224
-            $this->ftp_debug("Remote file ".$pathname." does not exist\n");
225
-
226
-            return 0;
227
-        }
228
-
229
-        function ftp_rename($from, $to)
230
-        {
231
-            $this->ftp_putcmd("RNFR", $from);
232
-            if (!$this->ftp_ok()) {
233
-                $this->ftp_debug("Error : RNFR command failed\n");
234
-                return FALSE;
235
-            }
236
-            $this->ftp_putcmd("RNTO", $to);
237
-
238
-            $response = $this->ftp_ok();
239
-            if (!$response) {
240
-                $this->ftp_debug("Error : RNTO command failed\n");
241
-            }
242
-            return $response;
243
-        }
244
-
245
-        function ftp_nlist($arg = "", $pathname = "")
246
-        {
247
-            if (!($string = $this->ftp_pasv())) {
248
-                return FALSE;
249
-            }
250
-
251
-            if ($arg == "") {
252
-                $nlst = "NLST";
253
-            } else {
254
-                $nlst = "NLST ".$arg;
255
-            }
256
-            $this->ftp_putcmd($nlst, $pathname);
257
-
258
-            $sock_data = $this->ftp_open_data_connection($string);
259
-            if (!$sock_data || !$this->ftp_ok()) {
260
-                $this->ftp_debug("Error : Cannot connect to remote host\n");
261
-                $this->ftp_debug("Error : NLST command failed\n");
262
-                return FALSE;
263
-            }
264
-            $this->ftp_debug("Connected to remote host\n");
217
+			reset($remote_list);
218
+			while (list(,$value) = each($remote_list)) {
219
+				if ($value == $pathname) {
220
+					$this->ftp_debug("Remote file ".$pathname." exists\n");
221
+					return 1;
222
+				}
223
+			}
224
+			$this->ftp_debug("Remote file ".$pathname." does not exist\n");
225
+
226
+			return 0;
227
+		}
228
+
229
+		function ftp_rename($from, $to)
230
+		{
231
+			$this->ftp_putcmd("RNFR", $from);
232
+			if (!$this->ftp_ok()) {
233
+				$this->ftp_debug("Error : RNFR command failed\n");
234
+				return FALSE;
235
+			}
236
+			$this->ftp_putcmd("RNTO", $to);
237
+
238
+			$response = $this->ftp_ok();
239
+			if (!$response) {
240
+				$this->ftp_debug("Error : RNTO command failed\n");
241
+			}
242
+			return $response;
243
+		}
244
+
245
+		function ftp_nlist($arg = "", $pathname = "")
246
+		{
247
+			if (!($string = $this->ftp_pasv())) {
248
+				return FALSE;
249
+			}
250
+
251
+			if ($arg == "") {
252
+				$nlst = "NLST";
253
+			} else {
254
+				$nlst = "NLST ".$arg;
255
+			}
256
+			$this->ftp_putcmd($nlst, $pathname);
257
+
258
+			$sock_data = $this->ftp_open_data_connection($string);
259
+			if (!$sock_data || !$this->ftp_ok()) {
260
+				$this->ftp_debug("Error : Cannot connect to remote host\n");
261
+				$this->ftp_debug("Error : NLST command failed\n");
262
+				return FALSE;
263
+			}
264
+			$this->ftp_debug("Connected to remote host\n");
265 265
 
266 266
 			$list = array();
267
-            while (!feof($sock_data)) {
268
-                $list[] = preg_replace("@[\r\n]@", "", fgets($sock_data, 512));
269
-            }
270
-            $this->ftp_close_data_connection($sock_data);
271
-            $this->ftp_debug(implode("\n", $list));
272
-
273
-            if (!$this->ftp_ok()) {
274
-                $this->ftp_debug("Error : NLST command failed\n");
275
-                return FALSE;
276
-            }
277
-
278
-            return $list;
279
-        }
280
-
281
-        function ftp_rawlist($pathname = "")
282
-        {
283
-            if (!($string = $this->ftp_pasv())) {
284
-                return FALSE;
285
-            }
286
-
287
-            $this->ftp_putcmd("LIST", $pathname);
288
-
289
-            $sock_data = $this->ftp_open_data_connection($string);
290
-            if (!$sock_data || !$this->ftp_ok()) {
291
-                $this->ftp_debug("Error : Cannot connect to remote host\n");
292
-                $this->ftp_debug("Error : LIST command failed\n");
293
-                return FALSE;
294
-            }
295
-
296
-            $this->ftp_debug("Connected to remote host\n");
297
-
298
-            while (!feof($sock_data)) {
299
-                $list[] = preg_replace("@[\r\n]@", "", fgets($sock_data, 512));
300
-            }
301
-            $this->ftp_debug(implode("\n", $list));
302
-            $this->ftp_close_data_connection($sock_data);
303
-
304
-            if (!$this->ftp_ok()) {
305
-                $this->ftp_debug("Error : LIST command failed\n");
306
-                return FALSE;
307
-            }
308
-
309
-            return $list;
310
-        }
311
-
312
-        function ftp_get($localfile, $remotefile, $mode = 1)
313
-        {
314
-            umask($this->umask);
315
-
316
-            if (@file_exists($localfile)) {
317
-                $this->ftp_debug("Warning : local file will be overwritten\n");
318
-            }
319
-
320
-            $fp = @fopen($localfile, "w");
321
-            if (!$fp) {
322
-                $this->ftp_debug("Error : Cannot create \"".$localfile."\"");
323
-                $this->ftp_debug("Error : GET command failed\n");
324
-                return FALSE;
325
-            }
326
-
327
-            if (!$this->ftp_type($mode)) {
328
-                $this->ftp_debug("Error : GET command failed\n");
329
-                return FALSE;
330
-            }
331
-
332
-            if (!($string = $this->ftp_pasv())) {
333
-                $this->ftp_debug("Error : GET command failed\n");
334
-                return FALSE;
335
-            }
336
-
337
-            $this->ftp_putcmd("RETR", $remotefile);
338
-
339
-            $sock_data = $this->ftp_open_data_connection($string);
340
-            if (!$sock_data || !$this->ftp_ok()) {
341
-                $this->ftp_debug("Error : Cannot connect to remote host\n");
342
-                $this->ftp_debug("Error : GET command failed\n");
343
-                return FALSE;
344
-            }
345
-            $this->ftp_debug("Connected to remote host\n");
346
-            $this->ftp_debug("Retrieving remote file \"".$remotefile."\" to local file \"".$localfile."\"\n");
347
-            while (!feof($sock_data)) {
348
-                fputs($fp, fread($sock_data, 4096));
349
-            }
350
-            fclose($fp);
351
-
352
-            $this->ftp_close_data_connection($sock_data);
353
-
354
-            $response = $this->ftp_ok();
355
-            if (!$response) {
356
-                $this->ftp_debug("Error : GET command failed\n");
357
-            }
358
-            return $response;
359
-        }
360
-
361
-        function ftp_put($remotefile, $localfile, $mode = 1)
362
-        {
267
+			while (!feof($sock_data)) {
268
+				$list[] = preg_replace("@[\r\n]@", "", fgets($sock_data, 512));
269
+			}
270
+			$this->ftp_close_data_connection($sock_data);
271
+			$this->ftp_debug(implode("\n", $list));
272
+
273
+			if (!$this->ftp_ok()) {
274
+				$this->ftp_debug("Error : NLST command failed\n");
275
+				return FALSE;
276
+			}
277
+
278
+			return $list;
279
+		}
280
+
281
+		function ftp_rawlist($pathname = "")
282
+		{
283
+			if (!($string = $this->ftp_pasv())) {
284
+				return FALSE;
285
+			}
286
+
287
+			$this->ftp_putcmd("LIST", $pathname);
288
+
289
+			$sock_data = $this->ftp_open_data_connection($string);
290
+			if (!$sock_data || !$this->ftp_ok()) {
291
+				$this->ftp_debug("Error : Cannot connect to remote host\n");
292
+				$this->ftp_debug("Error : LIST command failed\n");
293
+				return FALSE;
294
+			}
295
+
296
+			$this->ftp_debug("Connected to remote host\n");
297
+
298
+			while (!feof($sock_data)) {
299
+				$list[] = preg_replace("@[\r\n]@", "", fgets($sock_data, 512));
300
+			}
301
+			$this->ftp_debug(implode("\n", $list));
302
+			$this->ftp_close_data_connection($sock_data);
303
+
304
+			if (!$this->ftp_ok()) {
305
+				$this->ftp_debug("Error : LIST command failed\n");
306
+				return FALSE;
307
+			}
308
+
309
+			return $list;
310
+		}
311
+
312
+		function ftp_get($localfile, $remotefile, $mode = 1)
313
+		{
314
+			umask($this->umask);
315
+
316
+			if (@file_exists($localfile)) {
317
+				$this->ftp_debug("Warning : local file will be overwritten\n");
318
+			}
319
+
320
+			$fp = @fopen($localfile, "w");
321
+			if (!$fp) {
322
+				$this->ftp_debug("Error : Cannot create \"".$localfile."\"");
323
+				$this->ftp_debug("Error : GET command failed\n");
324
+				return FALSE;
325
+			}
326
+
327
+			if (!$this->ftp_type($mode)) {
328
+				$this->ftp_debug("Error : GET command failed\n");
329
+				return FALSE;
330
+			}
331
+
332
+			if (!($string = $this->ftp_pasv())) {
333
+				$this->ftp_debug("Error : GET command failed\n");
334
+				return FALSE;
335
+			}
336
+
337
+			$this->ftp_putcmd("RETR", $remotefile);
338
+
339
+			$sock_data = $this->ftp_open_data_connection($string);
340
+			if (!$sock_data || !$this->ftp_ok()) {
341
+				$this->ftp_debug("Error : Cannot connect to remote host\n");
342
+				$this->ftp_debug("Error : GET command failed\n");
343
+				return FALSE;
344
+			}
345
+			$this->ftp_debug("Connected to remote host\n");
346
+			$this->ftp_debug("Retrieving remote file \"".$remotefile."\" to local file \"".$localfile."\"\n");
347
+			while (!feof($sock_data)) {
348
+				fputs($fp, fread($sock_data, 4096));
349
+			}
350
+			fclose($fp);
351
+
352
+			$this->ftp_close_data_connection($sock_data);
353
+
354
+			$response = $this->ftp_ok();
355
+			if (!$response) {
356
+				$this->ftp_debug("Error : GET command failed\n");
357
+			}
358
+			return $response;
359
+		}
360
+
361
+		function ftp_put($remotefile, $localfile, $mode = 1)
362
+		{
363 363
             
364
-            if (!@file_exists($localfile)) {
365
-                $this->ftp_debug("Error : No such file or directory \"".$localfile."\"\n");
366
-                $this->ftp_debug("Error : PUT command failed\n");
367
-                return FALSE;
368
-            }
369
-
370
-            $fp = @fopen($localfile, "r");
371
-            if (!$fp) {
372
-                $this->ftp_debug("Error : Cannot read file \"".$localfile."\"\n");
373
-                $this->ftp_debug("Error : PUT command failed\n");
374
-                return FALSE;
375
-            }
376
-
377
-            if (!$this->ftp_type($mode)) {
378
-                $this->ftp_debug("Error : PUT command failed\n");
379
-                return FALSE;
380
-            }
381
-
382
-            if (!($string = $this->ftp_pasv())) {
383
-                $this->ftp_debug("Error : PUT command failed\n");
384
-                return FALSE;
385
-            }
386
-
387
-            $this->ftp_putcmd("STOR", $remotefile);
388
-
389
-            $sock_data = $this->ftp_open_data_connection($string);
390
-            if (!$sock_data || !$this->ftp_ok()) {
391
-                $this->ftp_debug("Error : Cannot connect to remote host\n");
392
-                $this->ftp_debug("Error : PUT command failed\n");
393
-                return FALSE;
394
-            }
395
-            $this->ftp_debug("Connected to remote host\n");
396
-            $this->ftp_debug("Storing local file \"".$localfile."\" to remote file \"".$remotefile."\"\n");
397
-            while (!feof($fp)) {
398
-                fputs($sock_data, fread($fp, 4096));
399
-            }
400
-            fclose($fp);
401
-
402
-            $this->ftp_close_data_connection($sock_data);
403
-
404
-            $response = $this->ftp_ok();
405
-            if (!$response) {
406
-                $this->ftp_debug("Error : PUT command failed\n");
407
-            }
408
-            return $response;
409
-        }
410
-
411
-        function ftp_site($command)
412
-        {
413
-            $this->ftp_putcmd("SITE", $command);
414
-            $response = $this->ftp_ok();
415
-            if (!$response) {
416
-                $this->ftp_debug("Error : SITE command failed\n");
417
-            }
418
-            return $response;
419
-        }
420
-
421
-        function ftp_quit()
422
-        {
423
-            $this->ftp_putcmd("QUIT");
424
-            if (!$this->ftp_ok() || !fclose($this->ftp_sock)) {
425
-                $this->ftp_debug("Error : QUIT command failed\n");
426
-                return FALSE;
427
-            }
428
-            $this->ftp_debug("Disconnected from remote host\n");
429
-            return TRUE;
430
-        }
431
-
432
-        /* Private Functions */
433
-
434
-        function ftp_type($mode)
435
-        {
436
-            if ($mode) {
437
-                $type = "I"; //Binary mode
438
-            } else {
439
-                $type = "A"; //ASCII mode
440
-            }
441
-            $this->ftp_putcmd("TYPE", $type);
442
-            $response = $this->ftp_ok();
443
-            if (!$response) {
444
-                $this->ftp_debug("Error : TYPE command failed\n");
445
-            }
446
-            return $response;
447
-        }
448
-
449
-        function ftp_port($ip_port)
450
-        {
451
-            $this->ftp_putcmd("PORT", $ip_port);
452
-            $response = $this->ftp_ok();
453
-            if (!$response) {
454
-                $this->ftp_debug("Error : PORT command failed\n");
455
-            }
456
-            return $response;
457
-        }
458
-
459
-        function ftp_pasv()
460
-        {
461
-            $this->ftp_putcmd("PASV");
462
-            if (!$this->ftp_ok()) {
463
-                $this->ftp_debug("Error : PASV command failed\n");
464
-                return FALSE;
465
-            }
466
-
467
-            $ip_port = preg_replace("@^.+ \\(?([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+)\\)?.*\r\n$@", "\\1", $this->ftp_resp);
468
-            return $ip_port;
469
-        }
470
-
471
-        function ftp_putcmd($cmd, $arg = "")
472
-        {
473
-            if ($arg != "") {
474
-                $cmd = $cmd." ".$arg;
475
-            }
476
-
477
-            fputs($this->ftp_sock, $cmd."\r\n");
478
-            $this->ftp_debug("> ".$cmd."\n");
479
-
480
-            return TRUE;
481
-        }
482
-
483
-        function ftp_ok()
484
-        {
485
-            $this->ftp_resp = "";
364
+			if (!@file_exists($localfile)) {
365
+				$this->ftp_debug("Error : No such file or directory \"".$localfile."\"\n");
366
+				$this->ftp_debug("Error : PUT command failed\n");
367
+				return FALSE;
368
+			}
369
+
370
+			$fp = @fopen($localfile, "r");
371
+			if (!$fp) {
372
+				$this->ftp_debug("Error : Cannot read file \"".$localfile."\"\n");
373
+				$this->ftp_debug("Error : PUT command failed\n");
374
+				return FALSE;
375
+			}
376
+
377
+			if (!$this->ftp_type($mode)) {
378
+				$this->ftp_debug("Error : PUT command failed\n");
379
+				return FALSE;
380
+			}
381
+
382
+			if (!($string = $this->ftp_pasv())) {
383
+				$this->ftp_debug("Error : PUT command failed\n");
384
+				return FALSE;
385
+			}
386
+
387
+			$this->ftp_putcmd("STOR", $remotefile);
388
+
389
+			$sock_data = $this->ftp_open_data_connection($string);
390
+			if (!$sock_data || !$this->ftp_ok()) {
391
+				$this->ftp_debug("Error : Cannot connect to remote host\n");
392
+				$this->ftp_debug("Error : PUT command failed\n");
393
+				return FALSE;
394
+			}
395
+			$this->ftp_debug("Connected to remote host\n");
396
+			$this->ftp_debug("Storing local file \"".$localfile."\" to remote file \"".$remotefile."\"\n");
397
+			while (!feof($fp)) {
398
+				fputs($sock_data, fread($fp, 4096));
399
+			}
400
+			fclose($fp);
401
+
402
+			$this->ftp_close_data_connection($sock_data);
403
+
404
+			$response = $this->ftp_ok();
405
+			if (!$response) {
406
+				$this->ftp_debug("Error : PUT command failed\n");
407
+			}
408
+			return $response;
409
+		}
410
+
411
+		function ftp_site($command)
412
+		{
413
+			$this->ftp_putcmd("SITE", $command);
414
+			$response = $this->ftp_ok();
415
+			if (!$response) {
416
+				$this->ftp_debug("Error : SITE command failed\n");
417
+			}
418
+			return $response;
419
+		}
420
+
421
+		function ftp_quit()
422
+		{
423
+			$this->ftp_putcmd("QUIT");
424
+			if (!$this->ftp_ok() || !fclose($this->ftp_sock)) {
425
+				$this->ftp_debug("Error : QUIT command failed\n");
426
+				return FALSE;
427
+			}
428
+			$this->ftp_debug("Disconnected from remote host\n");
429
+			return TRUE;
430
+		}
431
+
432
+		/* Private Functions */
433
+
434
+		function ftp_type($mode)
435
+		{
436
+			if ($mode) {
437
+				$type = "I"; //Binary mode
438
+			} else {
439
+				$type = "A"; //ASCII mode
440
+			}
441
+			$this->ftp_putcmd("TYPE", $type);
442
+			$response = $this->ftp_ok();
443
+			if (!$response) {
444
+				$this->ftp_debug("Error : TYPE command failed\n");
445
+			}
446
+			return $response;
447
+		}
448
+
449
+		function ftp_port($ip_port)
450
+		{
451
+			$this->ftp_putcmd("PORT", $ip_port);
452
+			$response = $this->ftp_ok();
453
+			if (!$response) {
454
+				$this->ftp_debug("Error : PORT command failed\n");
455
+			}
456
+			return $response;
457
+		}
458
+
459
+		function ftp_pasv()
460
+		{
461
+			$this->ftp_putcmd("PASV");
462
+			if (!$this->ftp_ok()) {
463
+				$this->ftp_debug("Error : PASV command failed\n");
464
+				return FALSE;
465
+			}
466
+
467
+			$ip_port = preg_replace("@^.+ \\(?([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+)\\)?.*\r\n$@", "\\1", $this->ftp_resp);
468
+			return $ip_port;
469
+		}
470
+
471
+		function ftp_putcmd($cmd, $arg = "")
472
+		{
473
+			if ($arg != "") {
474
+				$cmd = $cmd." ".$arg;
475
+			}
476
+
477
+			fputs($this->ftp_sock, $cmd."\r\n");
478
+			$this->ftp_debug("> ".$cmd."\n");
479
+
480
+			return TRUE;
481
+		}
482
+
483
+		function ftp_ok()
484
+		{
485
+			$this->ftp_resp = "";
486 486
 
487 487
 			// 한줄을 읽는다.
488 488
 			$line = '';
@@ -521,49 +521,49 @@  discard block
 block discarded – undo
521 521
 				}while($line);
522 522
 			}
523 523
 
524
-            $this->ftp_debug(str_replace("\r\n", "\n", $this->ftp_resp));
525
-
526
-            if (!preg_match("@^[123]@", $this->ftp_resp)) {
527
-                return FALSE;
528
-            }
529
-
530
-            return TRUE;
531
-        }
532
-
533
-        function ftp_close_data_connection($sock)
534
-        {
535
-            $this->ftp_debug("Disconnected from remote host\n");
536
-            return fclose($sock);
537
-        }
538
-
539
-        function ftp_open_data_connection($ip_port)
540
-        {
541
-            if (!preg_match("@[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+@", $ip_port)) {
542
-                $this->ftp_debug("Error : Illegal ip-port format(".$ip_port.")\n");
543
-                return FALSE;
544
-            }
545
-
546
-            $DATA = explode(",", $ip_port);
547
-            $ipaddr = $DATA[0].".".$DATA[1].".".$DATA[2].".".$DATA[3];
548
-            $port   = $DATA[4]*256 + $DATA[5];
549
-            $this->ftp_debug("Trying to ".$ipaddr.":".$port." ...\n");
550
-            $data_connection = @fsockopen($ipaddr, $port, $errno, $errstr);
551
-            if (!$data_connection) {
552
-                $this->ftp_debug("Error : Cannot open data connection to ".$ipaddr.":".$port."\n");
553
-                $this->ftp_debug("Error : ".$errstr." (".$errno.")\n");
554
-                return FALSE;
555
-            }
556
-
557
-            return $data_connection;
558
-        }
559
-
560
-        function ftp_debug($message = "")
561
-        {
562
-            if ($this->debug) {
563
-                echo $message;
564
-            }
565
-
566
-            return TRUE;
567
-        }
568
-    }
524
+			$this->ftp_debug(str_replace("\r\n", "\n", $this->ftp_resp));
525
+
526
+			if (!preg_match("@^[123]@", $this->ftp_resp)) {
527
+				return FALSE;
528
+			}
529
+
530
+			return TRUE;
531
+		}
532
+
533
+		function ftp_close_data_connection($sock)
534
+		{
535
+			$this->ftp_debug("Disconnected from remote host\n");
536
+			return fclose($sock);
537
+		}
538
+
539
+		function ftp_open_data_connection($ip_port)
540
+		{
541
+			if (!preg_match("@[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+@", $ip_port)) {
542
+				$this->ftp_debug("Error : Illegal ip-port format(".$ip_port.")\n");
543
+				return FALSE;
544
+			}
545
+
546
+			$DATA = explode(",", $ip_port);
547
+			$ipaddr = $DATA[0].".".$DATA[1].".".$DATA[2].".".$DATA[3];
548
+			$port   = $DATA[4]*256 + $DATA[5];
549
+			$this->ftp_debug("Trying to ".$ipaddr.":".$port." ...\n");
550
+			$data_connection = @fsockopen($ipaddr, $port, $errno, $errstr);
551
+			if (!$data_connection) {
552
+				$this->ftp_debug("Error : Cannot open data connection to ".$ipaddr.":".$port."\n");
553
+				$this->ftp_debug("Error : ".$errstr." (".$errno.")\n");
554
+				return FALSE;
555
+			}
556
+
557
+			return $data_connection;
558
+		}
559
+
560
+		function ftp_debug($message = "")
561
+		{
562
+			if ($this->debug) {
563
+				echo $message;
564
+			}
565
+
566
+			return TRUE;
567
+		}
568
+	}
569 569
 ?>
Please login to merge, or discard this patch.
Spacing   +30 added lines, -30 removed lines patch added patch discarded remove patch
@@ -72,21 +72,21 @@  discard block
 block discarded – undo
72 72
         /* Public functions */
73 73
         function ftp_connect($server, $port = 21)
74 74
         {
75
-            $this->ftp_debug("Trying to ".$server.":".$port." ...\n");
75
+            $this->ftp_debug("Trying to " . $server . ":" . $port . " ...\n");
76 76
             $this->ftp_sock = @fsockopen($server, $port, $errno, $errstr, $this->timeout);
77 77
 
78 78
             if (!$this->ftp_sock || !$this->ftp_ok()) {
79
-                $this->ftp_debug("Error : Cannot connect to remote host \"".$server.":".$port."\"\n");
80
-                $this->ftp_debug("Error : fsockopen() ".$errstr." (".$errno.")\n");
79
+                $this->ftp_debug("Error : Cannot connect to remote host \"" . $server . ":" . $port . "\"\n");
80
+                $this->ftp_debug("Error : fsockopen() " . $errstr . " (" . $errno . ")\n");
81 81
                 return FALSE;
82 82
             }
83 83
 
84
-			if(substr($this->ftp_resp, 0, 3) !== '220')
84
+			if (substr($this->ftp_resp, 0, 3) !== '220')
85 85
 			{
86 86
 				return FALSE;
87 87
 			}
88 88
 
89
-            $this->ftp_debug("Connected to remote host \"".$server.":".$port."\"\n");
89
+            $this->ftp_debug("Connected to remote host \"" . $server . ":" . $port . "\"\n");
90 90
 
91 91
             return TRUE;
92 92
         }
@@ -217,11 +217,11 @@  discard block
 block discarded – undo
217 217
             reset($remote_list);
218 218
             while (list(,$value) = each($remote_list)) {
219 219
                 if ($value == $pathname) {
220
-                    $this->ftp_debug("Remote file ".$pathname." exists\n");
220
+                    $this->ftp_debug("Remote file " . $pathname . " exists\n");
221 221
                     return 1;
222 222
                 }
223 223
             }
224
-            $this->ftp_debug("Remote file ".$pathname." does not exist\n");
224
+            $this->ftp_debug("Remote file " . $pathname . " does not exist\n");
225 225
 
226 226
             return 0;
227 227
         }
@@ -251,7 +251,7 @@  discard block
 block discarded – undo
251 251
             if ($arg == "") {
252 252
                 $nlst = "NLST";
253 253
             } else {
254
-                $nlst = "NLST ".$arg;
254
+                $nlst = "NLST " . $arg;
255 255
             }
256 256
             $this->ftp_putcmd($nlst, $pathname);
257 257
 
@@ -319,7 +319,7 @@  discard block
 block discarded – undo
319 319
 
320 320
             $fp = @fopen($localfile, "w");
321 321
             if (!$fp) {
322
-                $this->ftp_debug("Error : Cannot create \"".$localfile."\"");
322
+                $this->ftp_debug("Error : Cannot create \"" . $localfile . "\"");
323 323
                 $this->ftp_debug("Error : GET command failed\n");
324 324
                 return FALSE;
325 325
             }
@@ -343,7 +343,7 @@  discard block
 block discarded – undo
343 343
                 return FALSE;
344 344
             }
345 345
             $this->ftp_debug("Connected to remote host\n");
346
-            $this->ftp_debug("Retrieving remote file \"".$remotefile."\" to local file \"".$localfile."\"\n");
346
+            $this->ftp_debug("Retrieving remote file \"" . $remotefile . "\" to local file \"" . $localfile . "\"\n");
347 347
             while (!feof($sock_data)) {
348 348
                 fputs($fp, fread($sock_data, 4096));
349 349
             }
@@ -362,14 +362,14 @@  discard block
 block discarded – undo
362 362
         {
363 363
             
364 364
             if (!@file_exists($localfile)) {
365
-                $this->ftp_debug("Error : No such file or directory \"".$localfile."\"\n");
365
+                $this->ftp_debug("Error : No such file or directory \"" . $localfile . "\"\n");
366 366
                 $this->ftp_debug("Error : PUT command failed\n");
367 367
                 return FALSE;
368 368
             }
369 369
 
370 370
             $fp = @fopen($localfile, "r");
371 371
             if (!$fp) {
372
-                $this->ftp_debug("Error : Cannot read file \"".$localfile."\"\n");
372
+                $this->ftp_debug("Error : Cannot read file \"" . $localfile . "\"\n");
373 373
                 $this->ftp_debug("Error : PUT command failed\n");
374 374
                 return FALSE;
375 375
             }
@@ -393,7 +393,7 @@  discard block
 block discarded – undo
393 393
                 return FALSE;
394 394
             }
395 395
             $this->ftp_debug("Connected to remote host\n");
396
-            $this->ftp_debug("Storing local file \"".$localfile."\" to remote file \"".$remotefile."\"\n");
396
+            $this->ftp_debug("Storing local file \"" . $localfile . "\" to remote file \"" . $remotefile . "\"\n");
397 397
             while (!feof($fp)) {
398 398
                 fputs($sock_data, fread($fp, 4096));
399 399
             }
@@ -471,11 +471,11 @@  discard block
 block discarded – undo
471 471
         function ftp_putcmd($cmd, $arg = "")
472 472
         {
473 473
             if ($arg != "") {
474
-                $cmd = $cmd." ".$arg;
474
+                $cmd = $cmd . " " . $arg;
475 475
             }
476 476
 
477
-            fputs($this->ftp_sock, $cmd."\r\n");
478
-            $this->ftp_debug("> ".$cmd."\n");
477
+            fputs($this->ftp_sock, $cmd . "\r\n");
478
+            $this->ftp_debug("> " . $cmd . "\n");
479 479
 
480 480
             return TRUE;
481 481
         }
@@ -486,14 +486,14 @@  discard block
 block discarded – undo
486 486
 
487 487
 			// 한줄을 읽는다.
488 488
 			$line = '';
489
-			while(($char = fgetc($this->ftp_sock)) !== FALSE)
489
+			while (($char = fgetc($this->ftp_sock)) !== FALSE)
490 490
 			{
491 491
 				$line .= $char;
492
-				if($char === "\n") break;
492
+				if ($char === "\n") break;
493 493
 			}
494 494
 				
495 495
 			// 세자리 응답 코드가 나와야 한다.
496
-			if(!preg_match('@^[0-9]{3}@', $line))
496
+			if (!preg_match('@^[0-9]{3}@', $line))
497 497
 			{
498 498
 				return FALSE;
499 499
 			}
@@ -501,7 +501,7 @@  discard block
 block discarded – undo
501 501
 			$this->ftp_resp = $line;
502 502
 
503 503
 			// 4번째 문자가 -이면 여러줄인 응답이다.
504
-			if($line[3] === '-')
504
+			if ($line[3] === '-')
505 505
 			{
506 506
 				$code = substr($line, 0, 3);
507 507
 
@@ -509,16 +509,16 @@  discard block
 block discarded – undo
509 509
 				do
510 510
 				{
511 511
 					$line = '';
512
-					while(($char = fgetc($this->ftp_sock)) !== FALSE)
512
+					while (($char = fgetc($this->ftp_sock)) !== FALSE)
513 513
 					{
514 514
 						$line .= $char;
515
-						if($char === "\n") break;
515
+						if ($char === "\n") break;
516 516
 					}
517 517
 					$this->ftp_resp .= $line;
518 518
 
519 519
 					// 응답 코드와 같은 코드가 나오고 공백이 있으면 끝
520
-					if($code . ' ' === substr($line, 0, 4)) break;
521
-				}while($line);
520
+					if ($code . ' ' === substr($line, 0, 4)) break;
521
+				} while ($line);
522 522
 			}
523 523
 
524 524
             $this->ftp_debug(str_replace("\r\n", "\n", $this->ftp_resp));
@@ -539,18 +539,18 @@  discard block
 block discarded – undo
539 539
         function ftp_open_data_connection($ip_port)
540 540
         {
541 541
             if (!preg_match("@[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+@", $ip_port)) {
542
-                $this->ftp_debug("Error : Illegal ip-port format(".$ip_port.")\n");
542
+                $this->ftp_debug("Error : Illegal ip-port format(" . $ip_port . ")\n");
543 543
                 return FALSE;
544 544
             }
545 545
 
546 546
             $DATA = explode(",", $ip_port);
547
-            $ipaddr = $DATA[0].".".$DATA[1].".".$DATA[2].".".$DATA[3];
548
-            $port   = $DATA[4]*256 + $DATA[5];
549
-            $this->ftp_debug("Trying to ".$ipaddr.":".$port." ...\n");
547
+            $ipaddr = $DATA[0] . "." . $DATA[1] . "." . $DATA[2] . "." . $DATA[3];
548
+            $port   = $DATA[4] * 256 + $DATA[5];
549
+            $this->ftp_debug("Trying to " . $ipaddr . ":" . $port . " ...\n");
550 550
             $data_connection = @fsockopen($ipaddr, $port, $errno, $errstr);
551 551
             if (!$data_connection) {
552
-                $this->ftp_debug("Error : Cannot open data connection to ".$ipaddr.":".$port."\n");
553
-                $this->ftp_debug("Error : ".$errstr." (".$errno.")\n");
552
+                $this->ftp_debug("Error : Cannot open data connection to " . $ipaddr . ":" . $port . "\n");
553
+                $this->ftp_debug("Error : " . $errstr . " (" . $errno . ")\n");
554 554
                 return FALSE;
555 555
             }
556 556
 
Please login to merge, or discard this patch.
Braces   +9 added lines, -3 removed lines patch added patch discarded remove patch
@@ -489,7 +489,9 @@  discard block
 block discarded – undo
489 489
 			while(($char = fgetc($this->ftp_sock)) !== FALSE)
490 490
 			{
491 491
 				$line .= $char;
492
-				if($char === "\n") break;
492
+				if($char === "\n") {
493
+					break;
494
+				}
493 495
 			}
494 496
 				
495 497
 			// 세자리 응답 코드가 나와야 한다.
@@ -512,12 +514,16 @@  discard block
 block discarded – undo
512 514
 					while(($char = fgetc($this->ftp_sock)) !== FALSE)
513 515
 					{
514 516
 						$line .= $char;
515
-						if($char === "\n") break;
517
+						if($char === "\n") {
518
+							break;
519
+						}
516 520
 					}
517 521
 					$this->ftp_resp .= $line;
518 522
 
519 523
 					// 응답 코드와 같은 코드가 나오고 공백이 있으면 끝
520
-					if($code . ' ' === substr($line, 0, 4)) break;
524
+					if($code . ' ' === substr($line, 0, 4)) {
525
+						break;
526
+					}
521 527
 				}while($line);
522 528
 			}
523 529
 
Please login to merge, or discard this patch.
libs/idna_convert/idna_convert.class.php 3 patches
Doc Comments   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -88,7 +88,7 @@  discard block
 block discarded – undo
88 88
      * the constructor
89 89
      *
90 90
      * @param array $options
91
-     * @return boolean
91
+     * @return boolean|null
92 92
      * @since 0.5.2
93 93
      */
94 94
     public function __construct($options = false)
@@ -393,7 +393,7 @@  discard block
 block discarded – undo
393 393
     /**
394 394
      * Use this method to get the last error ocurred
395 395
      * @param    void
396
-     * @return   string   The last error, that occured
396
+     * @return   boolean   The last error, that occured
397 397
      */
398 398
     public function get_last_error()
399 399
     {
@@ -403,7 +403,7 @@  discard block
 block discarded – undo
403 403
     /**
404 404
      * The actual decoding algorithm
405 405
      * @param string
406
-     * @return mixed
406
+     * @return false|string
407 407
      */
408 408
     protected function _decode($encoded)
409 409
     {
@@ -464,7 +464,7 @@  discard block
 block discarded – undo
464 464
     /**
465 465
      * The actual encoding algorithm
466 466
      * @param  string
467
-     * @return mixed
467
+     * @return false|string
468 468
      */
469 469
     protected function _encode($decoded)
470 470
     {
@@ -699,7 +699,7 @@  discard block
 block discarded – undo
699 699
      * Decomposes a Hangul syllable
700 700
      * (see http://www.unicode.org/unicode/reports/tr15/#Hangul
701 701
      * @param    integer  32bit UCS4 code point
702
-     * @return   array    Either Hangul Syllable decomposed or original 32bit value as one value array
702
+     * @return   integer[]    Either Hangul Syllable decomposed or original 32bit value as one value array
703 703
      */
704 704
     protected function _hangul_decompose($char)
705 705
     {
Please login to merge, or discard this patch.
Indentation   +3367 added lines, -3367 removed lines patch added patch discarded remove patch
@@ -51,3411 +51,3411 @@
 block discarded – undo
51 51
  */
52 52
 class idna_convert {
53 53
 
54
-    private $version = '0.9.0';
55
-    protected $sub_version = 'main';
54
+	private $version = '0.9.0';
55
+	protected $sub_version = 'main';
56 56
 
57
-    // NP See below
58
-    // Internal settings, do not mess with them
59
-    protected $_punycode_prefix = 'xn--';
60
-    protected $_invalid_ucs = 0x80000000;
61
-    protected $_max_ucs = 0x10FFFF;
62
-    protected $_base = 36;
63
-    protected $_tmin = 1;
64
-    protected $_tmax = 26;
65
-    protected $_skew = 38;
66
-    protected $_damp = 700;
67
-    protected $_initial_bias = 72;
68
-    protected $_initial_n = 0x80;
69
-    protected $_sbase = 0xAC00;
70
-    protected $_lbase = 0x1100;
71
-    protected $_vbase = 0x1161;
72
-    protected $_tbase = 0x11A7;
73
-    protected $_lcount = 19;
74
-    protected $_vcount = 21;
75
-    protected $_tcount = 28;
76
-    protected $_ncount = 588;   // _vcount * _tcount
77
-    protected $_scount = 11172; // _lcount * _tcount * _vcount
78
-    protected $_error = false;
79
-    protected static $_mb_string_overload = null;
80
-    // See {@link set_paramter()} for details of how to change the following
81
-    // settings from within your script / application
82
-    protected $_api_encoding = 'utf8';   // Default input charset is UTF-8
83
-    protected $_allow_overlong = false;  // Overlong UTF-8 encodings are forbidden
84
-    protected $_strict_mode = false;     // Behave strict or not
85
-    protected $_idn_version = 2003;      // Can be either 2003 (old, default) or 2008
57
+	// NP See below
58
+	// Internal settings, do not mess with them
59
+	protected $_punycode_prefix = 'xn--';
60
+	protected $_invalid_ucs = 0x80000000;
61
+	protected $_max_ucs = 0x10FFFF;
62
+	protected $_base = 36;
63
+	protected $_tmin = 1;
64
+	protected $_tmax = 26;
65
+	protected $_skew = 38;
66
+	protected $_damp = 700;
67
+	protected $_initial_bias = 72;
68
+	protected $_initial_n = 0x80;
69
+	protected $_sbase = 0xAC00;
70
+	protected $_lbase = 0x1100;
71
+	protected $_vbase = 0x1161;
72
+	protected $_tbase = 0x11A7;
73
+	protected $_lcount = 19;
74
+	protected $_vcount = 21;
75
+	protected $_tcount = 28;
76
+	protected $_ncount = 588;   // _vcount * _tcount
77
+	protected $_scount = 11172; // _lcount * _tcount * _vcount
78
+	protected $_error = false;
79
+	protected static $_mb_string_overload = null;
80
+	// See {@link set_paramter()} for details of how to change the following
81
+	// settings from within your script / application
82
+	protected $_api_encoding = 'utf8';   // Default input charset is UTF-8
83
+	protected $_allow_overlong = false;  // Overlong UTF-8 encodings are forbidden
84
+	protected $_strict_mode = false;     // Behave strict or not
85
+	protected $_idn_version = 2003;      // Can be either 2003 (old, default) or 2008
86 86
 
87
-    /**
88
-     * the constructor
89
-     *
90
-     * @param array $options
91
-     * @return boolean
92
-     * @since 0.5.2
93
-     */
94
-    public function __construct($options = false)
95
-    {
96
-        $this->slast = $this->_sbase + $this->_lcount * $this->_vcount * $this->_tcount;
97
-        // If parameters are given, pass these to the respective method
98
-        if (is_array($options)) {
99
-            $this->set_parameter($options);
100
-        }
87
+	/**
88
+	 * the constructor
89
+	 *
90
+	 * @param array $options
91
+	 * @return boolean
92
+	 * @since 0.5.2
93
+	 */
94
+	public function __construct($options = false)
95
+	{
96
+		$this->slast = $this->_sbase + $this->_lcount * $this->_vcount * $this->_tcount;
97
+		// If parameters are given, pass these to the respective method
98
+		if (is_array($options)) {
99
+			$this->set_parameter($options);
100
+		}
101 101
 
102
-        // populate mbstring overloading cache if not set
103
-        if (self::$_mb_string_overload === null) {
104
-            self::$_mb_string_overload = (extension_loaded('mbstring') && (ini_get('mbstring.func_overload') & 0x02) === 0x02);
105
-        }
106
-    }
102
+		// populate mbstring overloading cache if not set
103
+		if (self::$_mb_string_overload === null) {
104
+			self::$_mb_string_overload = (extension_loaded('mbstring') && (ini_get('mbstring.func_overload') & 0x02) === 0x02);
105
+		}
106
+	}
107 107
 
108
-    public function get_version()
109
-    {
110
-        return $this->version.'-'.$this->sub_version;
111
-    }
108
+	public function get_version()
109
+	{
110
+		return $this->version.'-'.$this->sub_version;
111
+	}
112 112
 
113
-    /**
114
-     * Sets a new option value. Available options and values:
115
-     * [encoding - Use either UTF-8, UCS4 as array or UCS4 as string as input ('utf8' for UTF-8,
116
-     *         'ucs4_string' and 'ucs4_array' respectively for UCS4); The output is always UTF-8]
117
-     * [overlong - Unicode does not allow unnecessarily long encodings of chars,
118
-     *             to allow this, set this parameter to true, else to false;
119
-     *             default is false.]
120
-     * [strict - true: strict mode, good for registration purposes - Causes errors
121
-     *           on failures; false: loose mode, ideal for "wildlife" applications
122
-     *           by silently ignoring errors and returning the original input instead
123
-     *
124
-     * @param    mixed     Parameter to set (string: single parameter; array of Parameter => Value pairs)
125
-     * @param    string    Value to use (if parameter 1 is a string)
126
-     * @return   boolean   true on success, false otherwise
127
-     */
128
-    public function set_parameter($option, $value = false)
129
-    {
130
-        if (!is_array($option)) {
131
-            $option = array($option => $value);
132
-        }
133
-        foreach ($option as $k => $v) {
134
-            switch ($k) {
135
-                case 'encoding':
136
-                    switch ($v) {
137
-                        case 'utf8':
138
-                        case 'ucs4_string':
139
-                        case 'ucs4_array':
140
-                            $this->_api_encoding = $v;
141
-                            break;
142
-                        default:
143
-                            $this->_error('Set Parameter: Unknown parameter ' . $v . ' for option ' . $k);
144
-                            return false;
145
-                    }
146
-                    break;
147
-                case 'overlong':
148
-                    $this->_allow_overlong = ($v) ? true : false;
149
-                    break;
150
-                case 'strict':
151
-                    $this->_strict_mode = ($v) ? true : false;
152
-                    break;
153
-                case 'idn_version':
154
-                    if (in_array($v, array('2003', '2008'))) {
155
-                        $this->_idn_version = $v;
156
-                    } else {
157
-                        $this->_error('Set Parameter: Unknown parameter ' . $v . ' for option ' . $k);
158
-                    }
159
-                    break;
160
-                case 'encode_german_sz': // Deprecated
161
-                    if (!$v) {
162
-                        self::$NP['replacemaps'][0xDF] = array(0x73, 0x73);
163
-                    } else {
164
-                        unset(self::$NP['replacemaps'][0xDF]);
165
-                    }
166
-                    break;
167
-                default:
168
-                    $this->_error('Set Parameter: Unknown option ' . $k);
169
-                    return false;
170
-            }
171
-        }
172
-        return true;
173
-    }
113
+	/**
114
+	 * Sets a new option value. Available options and values:
115
+	 * [encoding - Use either UTF-8, UCS4 as array or UCS4 as string as input ('utf8' for UTF-8,
116
+	 *         'ucs4_string' and 'ucs4_array' respectively for UCS4); The output is always UTF-8]
117
+	 * [overlong - Unicode does not allow unnecessarily long encodings of chars,
118
+	 *             to allow this, set this parameter to true, else to false;
119
+	 *             default is false.]
120
+	 * [strict - true: strict mode, good for registration purposes - Causes errors
121
+	 *           on failures; false: loose mode, ideal for "wildlife" applications
122
+	 *           by silently ignoring errors and returning the original input instead
123
+	 *
124
+	 * @param    mixed     Parameter to set (string: single parameter; array of Parameter => Value pairs)
125
+	 * @param    string    Value to use (if parameter 1 is a string)
126
+	 * @return   boolean   true on success, false otherwise
127
+	 */
128
+	public function set_parameter($option, $value = false)
129
+	{
130
+		if (!is_array($option)) {
131
+			$option = array($option => $value);
132
+		}
133
+		foreach ($option as $k => $v) {
134
+			switch ($k) {
135
+				case 'encoding':
136
+					switch ($v) {
137
+						case 'utf8':
138
+						case 'ucs4_string':
139
+						case 'ucs4_array':
140
+							$this->_api_encoding = $v;
141
+							break;
142
+						default:
143
+							$this->_error('Set Parameter: Unknown parameter ' . $v . ' for option ' . $k);
144
+							return false;
145
+					}
146
+					break;
147
+				case 'overlong':
148
+					$this->_allow_overlong = ($v) ? true : false;
149
+					break;
150
+				case 'strict':
151
+					$this->_strict_mode = ($v) ? true : false;
152
+					break;
153
+				case 'idn_version':
154
+					if (in_array($v, array('2003', '2008'))) {
155
+						$this->_idn_version = $v;
156
+					} else {
157
+						$this->_error('Set Parameter: Unknown parameter ' . $v . ' for option ' . $k);
158
+					}
159
+					break;
160
+				case 'encode_german_sz': // Deprecated
161
+					if (!$v) {
162
+						self::$NP['replacemaps'][0xDF] = array(0x73, 0x73);
163
+					} else {
164
+						unset(self::$NP['replacemaps'][0xDF]);
165
+					}
166
+					break;
167
+				default:
168
+					$this->_error('Set Parameter: Unknown option ' . $k);
169
+					return false;
170
+			}
171
+		}
172
+		return true;
173
+	}
174 174
 
175
-    /**
176
-     * Decode a given ACE domain name
177
-     * @param    string   Domain name (ACE string)
178
-     * [@param    string   Desired output encoding, see {@link set_parameter}]
179
-     * @return   string   Decoded Domain name (UTF-8 or UCS-4)
180
-     */
181
-    public function decode($input, $one_time_encoding = false)
182
-    {
183
-        // Optionally set
184
-        if ($one_time_encoding) {
185
-            switch ($one_time_encoding) {
186
-                case 'utf8':
187
-                case 'ucs4_string':
188
-                case 'ucs4_array':
189
-                    break;
190
-                default:
191
-                    $this->_error('Unknown encoding ' . $one_time_encoding);
192
-                    return false;
193
-            }
194
-        }
195
-        // Make sure to drop any newline characters around
196
-        $input = trim($input);
175
+	/**
176
+	 * Decode a given ACE domain name
177
+	 * @param    string   Domain name (ACE string)
178
+	 * [@param    string   Desired output encoding, see {@link set_parameter}]
179
+	 * @return   string   Decoded Domain name (UTF-8 or UCS-4)
180
+	 */
181
+	public function decode($input, $one_time_encoding = false)
182
+	{
183
+		// Optionally set
184
+		if ($one_time_encoding) {
185
+			switch ($one_time_encoding) {
186
+				case 'utf8':
187
+				case 'ucs4_string':
188
+				case 'ucs4_array':
189
+					break;
190
+				default:
191
+					$this->_error('Unknown encoding ' . $one_time_encoding);
192
+					return false;
193
+			}
194
+		}
195
+		// Make sure to drop any newline characters around
196
+		$input = trim($input);
197 197
 
198
-        // Negotiate input and try to determine, whether it is a plain string,
199
-        // an email address or something like a complete URL
200
-        if (strpos($input, '@')) { // Maybe it is an email address
201
-            // No no in strict mode
202
-            if ($this->_strict_mode) {
203
-                $this->_error('Only simple domain name parts can be handled in strict mode');
204
-                return false;
205
-            }
206
-            list ($email_pref, $input) = explode('@', $input, 2);
207
-            $arr = explode('.', $input);
208
-            foreach ($arr as $k => $v) {
209
-                if (preg_match('!^' . preg_quote($this->_punycode_prefix, '!') . '!', $v)) {
210
-                    $conv = $this->_decode($v);
211
-                    if ($conv) {
212
-                        $arr[$k] = $conv;
213
-                    }
214
-                }
215
-            }
216
-            $input = join('.', $arr);
217
-            $arr = explode('.', $email_pref);
218
-            foreach ($arr as $k => $v) {
219
-                if (preg_match('!^' . preg_quote($this->_punycode_prefix, '!') . '!', $v)) {
220
-                    $conv = $this->_decode($v);
221
-                    if ($conv) {
222
-                        $arr[$k] = $conv;
223
-                    }
224
-                }
225
-            }
226
-            $email_pref = join('.', $arr);
227
-            $return = $email_pref . '@' . $input;
228
-        } elseif (preg_match('![:\./]!', $input)) { // Or a complete domain name (with or without paths / parameters)
229
-            // No no in strict mode
230
-            if ($this->_strict_mode) {
231
-                $this->_error('Only simple domain name parts can be handled in strict mode');
232
-                return false;
233
-            }
234
-            $parsed = parse_url($input);
235
-            if (isset($parsed['host'])) {
236
-                $arr = explode('.', $parsed['host']);
237
-                foreach ($arr as $k => $v) {
238
-                    $conv = $this->_decode($v);
239
-                    if ($conv) {
240
-                        $arr[$k] = $conv;
241
-                    }
242
-                }
243
-                $parsed['host'] = join('.', $arr);
244
-                $return = (empty($parsed['scheme']) ? '' : $parsed['scheme'] . (strtolower($parsed['scheme']) == 'mailto' ? ':' : '://')).
245
-                        (empty($parsed['user']) ? '' : $parsed['user'] . (empty($parsed['pass']) ? '' : ':' . $parsed['pass']) . '@').
246
-                        $parsed['host'].
247
-                        (empty($parsed['port']) ? '' : ':' . $parsed['port']).
248
-                        (empty($parsed['path']) ? '' : $parsed['path']).
249
-                        (empty($parsed['query']) ? '' : '?' . $parsed['query']).
250
-                        (empty($parsed['fragment']) ? '' : '#' . $parsed['fragment']);
251
-            } else { // parse_url seems to have failed, try without it
252
-                $arr = explode('.', $input);
253
-                foreach ($arr as $k => $v) {
254
-                    $conv = $this->_decode($v);
255
-                    $arr[$k] = ($conv) ? $conv : $v;
256
-                }
257
-                $return = join('.', $arr);
258
-            }
259
-        } else { // Otherwise we consider it being a pure domain name string
260
-            $return = $this->_decode($input);
261
-            if (!$return) {
262
-                $return = $input;
263
-            }
264
-        }
265
-        // The output is UTF-8 by default, other output formats need conversion here
266
-        // If one time encoding is given, use this, else the objects property
267
-        switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) {
268
-            case 'utf8':        return $return; // break;
269
-            case 'ucs4_string': return $this->_ucs4_to_ucs4_string($this->_utf8_to_ucs4($return));  // break;
270
-            case 'ucs4_array':  return $this->_utf8_to_ucs4($return); // break;
271
-            default:            $this->_error('Unsupported output format'); return false;
272
-        }
273
-    }
198
+		// Negotiate input and try to determine, whether it is a plain string,
199
+		// an email address or something like a complete URL
200
+		if (strpos($input, '@')) { // Maybe it is an email address
201
+			// No no in strict mode
202
+			if ($this->_strict_mode) {
203
+				$this->_error('Only simple domain name parts can be handled in strict mode');
204
+				return false;
205
+			}
206
+			list ($email_pref, $input) = explode('@', $input, 2);
207
+			$arr = explode('.', $input);
208
+			foreach ($arr as $k => $v) {
209
+				if (preg_match('!^' . preg_quote($this->_punycode_prefix, '!') . '!', $v)) {
210
+					$conv = $this->_decode($v);
211
+					if ($conv) {
212
+						$arr[$k] = $conv;
213
+					}
214
+				}
215
+			}
216
+			$input = join('.', $arr);
217
+			$arr = explode('.', $email_pref);
218
+			foreach ($arr as $k => $v) {
219
+				if (preg_match('!^' . preg_quote($this->_punycode_prefix, '!') . '!', $v)) {
220
+					$conv = $this->_decode($v);
221
+					if ($conv) {
222
+						$arr[$k] = $conv;
223
+					}
224
+				}
225
+			}
226
+			$email_pref = join('.', $arr);
227
+			$return = $email_pref . '@' . $input;
228
+		} elseif (preg_match('![:\./]!', $input)) { // Or a complete domain name (with or without paths / parameters)
229
+			// No no in strict mode
230
+			if ($this->_strict_mode) {
231
+				$this->_error('Only simple domain name parts can be handled in strict mode');
232
+				return false;
233
+			}
234
+			$parsed = parse_url($input);
235
+			if (isset($parsed['host'])) {
236
+				$arr = explode('.', $parsed['host']);
237
+				foreach ($arr as $k => $v) {
238
+					$conv = $this->_decode($v);
239
+					if ($conv) {
240
+						$arr[$k] = $conv;
241
+					}
242
+				}
243
+				$parsed['host'] = join('.', $arr);
244
+				$return = (empty($parsed['scheme']) ? '' : $parsed['scheme'] . (strtolower($parsed['scheme']) == 'mailto' ? ':' : '://')).
245
+						(empty($parsed['user']) ? '' : $parsed['user'] . (empty($parsed['pass']) ? '' : ':' . $parsed['pass']) . '@').
246
+						$parsed['host'].
247
+						(empty($parsed['port']) ? '' : ':' . $parsed['port']).
248
+						(empty($parsed['path']) ? '' : $parsed['path']).
249
+						(empty($parsed['query']) ? '' : '?' . $parsed['query']).
250
+						(empty($parsed['fragment']) ? '' : '#' . $parsed['fragment']);
251
+			} else { // parse_url seems to have failed, try without it
252
+				$arr = explode('.', $input);
253
+				foreach ($arr as $k => $v) {
254
+					$conv = $this->_decode($v);
255
+					$arr[$k] = ($conv) ? $conv : $v;
256
+				}
257
+				$return = join('.', $arr);
258
+			}
259
+		} else { // Otherwise we consider it being a pure domain name string
260
+			$return = $this->_decode($input);
261
+			if (!$return) {
262
+				$return = $input;
263
+			}
264
+		}
265
+		// The output is UTF-8 by default, other output formats need conversion here
266
+		// If one time encoding is given, use this, else the objects property
267
+		switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) {
268
+			case 'utf8':        return $return; // break;
269
+			case 'ucs4_string': return $this->_ucs4_to_ucs4_string($this->_utf8_to_ucs4($return));  // break;
270
+			case 'ucs4_array':  return $this->_utf8_to_ucs4($return); // break;
271
+			default:            $this->_error('Unsupported output format'); return false;
272
+		}
273
+	}
274 274
 
275
-    /**
276
-     * Encode a given UTF-8 domain name
277
-     * @param    string   Domain name (UTF-8 or UCS-4)
278
-     * [@param    string   Desired input encoding, see {@link set_parameter}]
279
-     * @return   string   Encoded Domain name (ACE string)
280
-     */
281
-    public function encode($decoded, $one_time_encoding = false)
282
-    {
283
-        // Forcing conversion of input to UCS4 array
284
-        // If one time encoding is given, use this, else the objects property
285
-        switch ($one_time_encoding ? $one_time_encoding : $this->_api_encoding) {
286
-            case 'utf8':
287
-                $decoded = $this->_utf8_to_ucs4($decoded);
288
-                break;
289
-            case 'ucs4_string':
290
-                $decoded = $this->_ucs4_string_to_ucs4($decoded);
291
-            case 'ucs4_array':
292
-                break;
293
-            default:
294
-                $this->_error('Unsupported input format: ' . ($one_time_encoding ? $one_time_encoding : $this->_api_encoding));
295
-                return false;
296
-        }
275
+	/**
276
+	 * Encode a given UTF-8 domain name
277
+	 * @param    string   Domain name (UTF-8 or UCS-4)
278
+	 * [@param    string   Desired input encoding, see {@link set_parameter}]
279
+	 * @return   string   Encoded Domain name (ACE string)
280
+	 */
281
+	public function encode($decoded, $one_time_encoding = false)
282
+	{
283
+		// Forcing conversion of input to UCS4 array
284
+		// If one time encoding is given, use this, else the objects property
285
+		switch ($one_time_encoding ? $one_time_encoding : $this->_api_encoding) {
286
+			case 'utf8':
287
+				$decoded = $this->_utf8_to_ucs4($decoded);
288
+				break;
289
+			case 'ucs4_string':
290
+				$decoded = $this->_ucs4_string_to_ucs4($decoded);
291
+			case 'ucs4_array':
292
+				break;
293
+			default:
294
+				$this->_error('Unsupported input format: ' . ($one_time_encoding ? $one_time_encoding : $this->_api_encoding));
295
+				return false;
296
+		}
297 297
 
298
-        // No input, no output, what else did you expect?
299
-        if (empty($decoded)) {
300
-            return '';
301
-        }
298
+		// No input, no output, what else did you expect?
299
+		if (empty($decoded)) {
300
+			return '';
301
+		}
302 302
 
303
-        // Anchors for iteration
304
-        $last_begin = 0;
305
-        // Output string
306
-        $output = '';
307
-        foreach ($decoded as $k => $v) {
308
-            // Make sure to use just the plain dot
309
-            switch ($v) {
310
-                case 0x3002:
311
-                case 0xFF0E:
312
-                case 0xFF61:
313
-                    $decoded[$k] = 0x2E;
314
-                    // Right, no break here, the above are converted to dots anyway
315
-                // Stumbling across an anchoring character
316
-                case 0x2E:
317
-                case 0x2F:
318
-                case 0x3A:
319
-                case 0x3F:
320
-                case 0x40:
321
-                    // Neither email addresses nor URLs allowed in strict mode
322
-                    if ($this->_strict_mode) {
323
-                        $this->_error('Neither email addresses nor URLs are allowed in strict mode.');
324
-                        return false;
325
-                    } else {
326
-                        // Skip first char
327
-                        if ($k) {
328
-                            $encoded = '';
329
-                            $encoded = $this->_encode(array_slice($decoded, $last_begin, (($k) - $last_begin)));
330
-                            if ($encoded) {
331
-                                $output .= $encoded;
332
-                            } else {
333
-                                $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($k) - $last_begin)));
334
-                            }
335
-                            $output .= chr($decoded[$k]);
336
-                        }
337
-                        $last_begin = $k + 1;
338
-                    }
339
-            }
340
-        }
341
-        // Catch the rest of the string
342
-        if ($last_begin) {
343
-            $inp_len = sizeof($decoded);
344
-            $encoded = '';
345
-            $encoded = $this->_encode(array_slice($decoded, $last_begin, (($inp_len) - $last_begin)));
346
-            if ($encoded) {
347
-                $output .= $encoded;
348
-            } else {
349
-                $output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($inp_len) - $last_begin)));
350
-            }
351
-            return $output;
352
-        } else {
353
-            if (false !== ($output = $this->_encode($decoded))) {
354
-                return $output;
355
-            } else {
356
-                return $this->_ucs4_to_utf8($decoded);
357
-            }
358
-        }
359
-    }
303
+		// Anchors for iteration
304
+		$last_begin = 0;
305
+		// Output string
306
+		$output = '';
307
+		foreach ($decoded as $k => $v) {
308
+			// Make sure to use just the plain dot
309
+			switch ($v) {
310
+				case 0x3002:
311
+				case 0xFF0E:
312
+				case 0xFF61:
313
+					$decoded[$k] = 0x2E;
314
+					// Right, no break here, the above are converted to dots anyway
315
+				// Stumbling across an anchoring character
316
+				case 0x2E:
317
+				case 0x2F:
318
+				case 0x3A:
319
+				case 0x3F:
320
+				case 0x40:
321
+					// Neither email addresses nor URLs allowed in strict mode
322
+					if ($this->_strict_mode) {
323
+						$this->_error('Neither email addresses nor URLs are allowed in strict mode.');
324
+						return false;
325
+					} else {
326
+						// Skip first char
327
+						if ($k) {
328
+							$encoded = '';
329
+							$encoded = $this->_encode(array_slice($decoded, $last_begin, (($k) - $last_begin)));
330
+							if ($encoded) {
331
+								$output .= $encoded;
332
+							} else {
333
+								$output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($k) - $last_begin)));
334
+							}
335
+							$output .= chr($decoded[$k]);
336
+						}
337
+						$last_begin = $k + 1;
338
+					}
339
+			}
340
+		}
341
+		// Catch the rest of the string
342
+		if ($last_begin) {
343
+			$inp_len = sizeof($decoded);
344
+			$encoded = '';
345
+			$encoded = $this->_encode(array_slice($decoded, $last_begin, (($inp_len) - $last_begin)));
346
+			if ($encoded) {
347
+				$output .= $encoded;
348
+			} else {
349
+				$output .= $this->_ucs4_to_utf8(array_slice($decoded, $last_begin, (($inp_len) - $last_begin)));
350
+			}
351
+			return $output;
352
+		} else {
353
+			if (false !== ($output = $this->_encode($decoded))) {
354
+				return $output;
355
+			} else {
356
+				return $this->_ucs4_to_utf8($decoded);
357
+			}
358
+		}
359
+	}
360 360
 
361
-    /**
362
-     * Removes a weakness of encode(), which cannot properly handle URIs but instead encodes their
363
-     * path or query components, too.
364
-     * @param string  $uri  Expects the URI as a UTF-8 (or ASCII) string
365
-     * @return  string  The URI encoded to Punycode, everything but the host component is left alone
366
-     * @since 0.6.4
367
-     */
368
-    public function encode_uri($uri)
369
-    {
370
-        $parsed = parse_url($uri);
371
-        if (!isset($parsed['host'])) {
372
-            $this->_error('The given string does not look like a URI');
373
-            return false;
374
-        }
375
-        $arr = explode('.', $parsed['host']);
376
-        foreach ($arr as $k => $v) {
377
-            $conv = $this->encode($v, 'utf8');
378
-            if ($conv) {
379
-                $arr[$k] = $conv;
380
-            }
381
-        }
382
-        $parsed['host'] = join('.', $arr);
383
-        $return = (empty($parsed['scheme']) ? '' : $parsed['scheme'] . (strtolower($parsed['scheme']) == 'mailto' ? ':' : '://')).
384
-                (empty($parsed['user']) ? '' : $parsed['user'] . (empty($parsed['pass']) ? '' : ':' . $parsed['pass']) . '@').
385
-                $parsed['host'].
386
-                (empty($parsed['port']) ? '' : ':' . $parsed['port']).
387
-                (empty($parsed['path']) ? '' : $parsed['path']).
388
-                (empty($parsed['query']) ? '' : '?' . $parsed['query']).
389
-                (empty($parsed['fragment']) ? '' : '#' . $parsed['fragment']);
390
-        return $return;
391
-    }
361
+	/**
362
+	 * Removes a weakness of encode(), which cannot properly handle URIs but instead encodes their
363
+	 * path or query components, too.
364
+	 * @param string  $uri  Expects the URI as a UTF-8 (or ASCII) string
365
+	 * @return  string  The URI encoded to Punycode, everything but the host component is left alone
366
+	 * @since 0.6.4
367
+	 */
368
+	public function encode_uri($uri)
369
+	{
370
+		$parsed = parse_url($uri);
371
+		if (!isset($parsed['host'])) {
372
+			$this->_error('The given string does not look like a URI');
373
+			return false;
374
+		}
375
+		$arr = explode('.', $parsed['host']);
376
+		foreach ($arr as $k => $v) {
377
+			$conv = $this->encode($v, 'utf8');
378
+			if ($conv) {
379
+				$arr[$k] = $conv;
380
+			}
381
+		}
382
+		$parsed['host'] = join('.', $arr);
383
+		$return = (empty($parsed['scheme']) ? '' : $parsed['scheme'] . (strtolower($parsed['scheme']) == 'mailto' ? ':' : '://')).
384
+				(empty($parsed['user']) ? '' : $parsed['user'] . (empty($parsed['pass']) ? '' : ':' . $parsed['pass']) . '@').
385
+				$parsed['host'].
386
+				(empty($parsed['port']) ? '' : ':' . $parsed['port']).
387
+				(empty($parsed['path']) ? '' : $parsed['path']).
388
+				(empty($parsed['query']) ? '' : '?' . $parsed['query']).
389
+				(empty($parsed['fragment']) ? '' : '#' . $parsed['fragment']);
390
+		return $return;
391
+	}
392 392
 
393
-    /**
394
-     * Use this method to get the last error ocurred
395
-     * @param    void
396
-     * @return   string   The last error, that occured
397
-     */
398
-    public function get_last_error()
399
-    {
400
-        return $this->_error;
401
-    }
393
+	/**
394
+	 * Use this method to get the last error ocurred
395
+	 * @param    void
396
+	 * @return   string   The last error, that occured
397
+	 */
398
+	public function get_last_error()
399
+	{
400
+		return $this->_error;
401
+	}
402 402
 
403
-    /**
404
-     * The actual decoding algorithm
405
-     * @param string
406
-     * @return mixed
407
-     */
408
-    protected function _decode($encoded)
409
-    {
410
-        $decoded = array();
411
-        // find the Punycode prefix
412
-        if (!preg_match('!^' . preg_quote($this->_punycode_prefix, '!') . '!', $encoded)) {
413
-            $this->_error('This is not a punycode string');
414
-            return false;
415
-        }
416
-        $encode_test = preg_replace('!^' . preg_quote($this->_punycode_prefix, '!') . '!', '', $encoded);
417
-        // If nothing left after removing the prefix, it is hopeless
418
-        if (!$encode_test) {
419
-            $this->_error('The given encoded string was empty');
420
-            return false;
421
-        }
422
-        // Find last occurence of the delimiter
423
-        $delim_pos = strrpos($encoded, '-');
424
-        if ($delim_pos > self::byteLength($this->_punycode_prefix)) {
425
-            for ($k = self::byteLength($this->_punycode_prefix); $k < $delim_pos; ++$k) {
426
-                $decoded[] = ord($encoded{$k});
427
-            }
428
-        }
429
-        $deco_len = count($decoded);
430
-        $enco_len = self::byteLength($encoded);
403
+	/**
404
+	 * The actual decoding algorithm
405
+	 * @param string
406
+	 * @return mixed
407
+	 */
408
+	protected function _decode($encoded)
409
+	{
410
+		$decoded = array();
411
+		// find the Punycode prefix
412
+		if (!preg_match('!^' . preg_quote($this->_punycode_prefix, '!') . '!', $encoded)) {
413
+			$this->_error('This is not a punycode string');
414
+			return false;
415
+		}
416
+		$encode_test = preg_replace('!^' . preg_quote($this->_punycode_prefix, '!') . '!', '', $encoded);
417
+		// If nothing left after removing the prefix, it is hopeless
418
+		if (!$encode_test) {
419
+			$this->_error('The given encoded string was empty');
420
+			return false;
421
+		}
422
+		// Find last occurence of the delimiter
423
+		$delim_pos = strrpos($encoded, '-');
424
+		if ($delim_pos > self::byteLength($this->_punycode_prefix)) {
425
+			for ($k = self::byteLength($this->_punycode_prefix); $k < $delim_pos; ++$k) {
426
+				$decoded[] = ord($encoded{$k});
427
+			}
428
+		}
429
+		$deco_len = count($decoded);
430
+		$enco_len = self::byteLength($encoded);
431 431
 
432
-        // Wandering through the strings; init
433
-        $is_first = true;
434
-        $bias = $this->_initial_bias;
435
-        $idx = 0;
436
-        $char = $this->_initial_n;
432
+		// Wandering through the strings; init
433
+		$is_first = true;
434
+		$bias = $this->_initial_bias;
435
+		$idx = 0;
436
+		$char = $this->_initial_n;
437 437
 
438
-        for ($enco_idx = ($delim_pos) ? ($delim_pos + 1) : 0; $enco_idx < $enco_len; ++$deco_len) {
439
-            for ($old_idx = $idx, $w = 1, $k = $this->_base; 1; $k += $this->_base) {
440
-                $digit = $this->_decode_digit($encoded{$enco_idx++});
441
-                $idx += $digit * $w;
442
-                $t = ($k <= $bias) ? $this->_tmin :
443
-                        (($k >= $bias + $this->_tmax) ? $this->_tmax : ($k - $bias));
444
-                if ($digit < $t) {
445
-                    break;
446
-                }
447
-                $w = (int) ($w * ($this->_base - $t));
448
-            }
449
-            $bias = $this->_adapt($idx - $old_idx, $deco_len + 1, $is_first);
450
-            $is_first = false;
451
-            $char += (int) ($idx / ($deco_len + 1));
452
-            $idx %= ($deco_len + 1);
453
-            if ($deco_len > 0) {
454
-                // Make room for the decoded char
455
-                for ($i = $deco_len; $i > $idx; $i--) {
456
-                    $decoded[$i] = $decoded[($i - 1)];
457
-                }
458
-            }
459
-            $decoded[$idx++] = $char;
460
-        }
461
-        return $this->_ucs4_to_utf8($decoded);
462
-    }
438
+		for ($enco_idx = ($delim_pos) ? ($delim_pos + 1) : 0; $enco_idx < $enco_len; ++$deco_len) {
439
+			for ($old_idx = $idx, $w = 1, $k = $this->_base; 1; $k += $this->_base) {
440
+				$digit = $this->_decode_digit($encoded{$enco_idx++});
441
+				$idx += $digit * $w;
442
+				$t = ($k <= $bias) ? $this->_tmin :
443
+						(($k >= $bias + $this->_tmax) ? $this->_tmax : ($k - $bias));
444
+				if ($digit < $t) {
445
+					break;
446
+				}
447
+				$w = (int) ($w * ($this->_base - $t));
448
+			}
449
+			$bias = $this->_adapt($idx - $old_idx, $deco_len + 1, $is_first);
450
+			$is_first = false;
451
+			$char += (int) ($idx / ($deco_len + 1));
452
+			$idx %= ($deco_len + 1);
453
+			if ($deco_len > 0) {
454
+				// Make room for the decoded char
455
+				for ($i = $deco_len; $i > $idx; $i--) {
456
+					$decoded[$i] = $decoded[($i - 1)];
457
+				}
458
+			}
459
+			$decoded[$idx++] = $char;
460
+		}
461
+		return $this->_ucs4_to_utf8($decoded);
462
+	}
463 463
 
464
-    /**
465
-     * The actual encoding algorithm
466
-     * @param  string
467
-     * @return mixed
468
-     */
469
-    protected function _encode($decoded)
470
-    {
471
-        // We cannot encode a domain name containing the Punycode prefix
472
-        $extract = self::byteLength($this->_punycode_prefix);
473
-        $check_pref = $this->_utf8_to_ucs4($this->_punycode_prefix);
474
-        $check_deco = array_slice($decoded, 0, $extract);
464
+	/**
465
+	 * The actual encoding algorithm
466
+	 * @param  string
467
+	 * @return mixed
468
+	 */
469
+	protected function _encode($decoded)
470
+	{
471
+		// We cannot encode a domain name containing the Punycode prefix
472
+		$extract = self::byteLength($this->_punycode_prefix);
473
+		$check_pref = $this->_utf8_to_ucs4($this->_punycode_prefix);
474
+		$check_deco = array_slice($decoded, 0, $extract);
475 475
 
476
-        if ($check_pref == $check_deco) {
477
-            $this->_error('This is already a punycode string');
478
-            return false;
479
-        }
480
-        // We will not try to encode strings consisting of basic code points only
481
-        $encodable = false;
482
-        foreach ($decoded as $k => $v) {
483
-            if ($v > 0x7a) {
484
-                $encodable = true;
485
-                break;
486
-            }
487
-        }
488
-        if (!$encodable) {
489
-            $this->_error('The given string does not contain encodable chars');
490
-            return false;
491
-        }
492
-        // Do NAMEPREP
493
-        $decoded = $this->_nameprep($decoded);
494
-        if (!$decoded || !is_array($decoded)) {
495
-            return false; // NAMEPREP failed
496
-        }
497
-        $deco_len = count($decoded);
498
-        if (!$deco_len) {
499
-            return false; // Empty array
500
-        }
501
-        $codecount = 0; // How many chars have been consumed
502
-        $encoded = '';
503
-        // Copy all basic code points to output
504
-        for ($i = 0; $i < $deco_len; ++$i) {
505
-            $test = $decoded[$i];
506
-            // Will match [-0-9a-zA-Z]
507
-            if ((0x2F < $test && $test < 0x40) || (0x40 < $test && $test < 0x5B) || (0x60 < $test && $test <= 0x7B) || (0x2D == $test)) {
508
-                $encoded .= chr($decoded[$i]);
509
-                $codecount++;
510
-            }
511
-        }
512
-        if ($codecount == $deco_len) {
513
-            return $encoded; // All codepoints were basic ones
514
-        }
515
-        // Start with the prefix; copy it to output
516
-        $encoded = $this->_punycode_prefix . $encoded;
517
-        // If we have basic code points in output, add an hyphen to the end
518
-        if ($codecount) {
519
-            $encoded .= '-';
520
-        }
521
-        // Now find and encode all non-basic code points
522
-        $is_first = true;
523
-        $cur_code = $this->_initial_n;
524
-        $bias = $this->_initial_bias;
525
-        $delta = 0;
526
-        while ($codecount < $deco_len) {
527
-            // Find the smallest code point >= the current code point and
528
-            // remember the last ouccrence of it in the input
529
-            for ($i = 0, $next_code = $this->_max_ucs; $i < $deco_len; $i++) {
530
-                if ($decoded[$i] >= $cur_code && $decoded[$i] <= $next_code) {
531
-                    $next_code = $decoded[$i];
532
-                }
533
-            }
534
-            $delta += ($next_code - $cur_code) * ($codecount + 1);
535
-            $cur_code = $next_code;
476
+		if ($check_pref == $check_deco) {
477
+			$this->_error('This is already a punycode string');
478
+			return false;
479
+		}
480
+		// We will not try to encode strings consisting of basic code points only
481
+		$encodable = false;
482
+		foreach ($decoded as $k => $v) {
483
+			if ($v > 0x7a) {
484
+				$encodable = true;
485
+				break;
486
+			}
487
+		}
488
+		if (!$encodable) {
489
+			$this->_error('The given string does not contain encodable chars');
490
+			return false;
491
+		}
492
+		// Do NAMEPREP
493
+		$decoded = $this->_nameprep($decoded);
494
+		if (!$decoded || !is_array($decoded)) {
495
+			return false; // NAMEPREP failed
496
+		}
497
+		$deco_len = count($decoded);
498
+		if (!$deco_len) {
499
+			return false; // Empty array
500
+		}
501
+		$codecount = 0; // How many chars have been consumed
502
+		$encoded = '';
503
+		// Copy all basic code points to output
504
+		for ($i = 0; $i < $deco_len; ++$i) {
505
+			$test = $decoded[$i];
506
+			// Will match [-0-9a-zA-Z]
507
+			if ((0x2F < $test && $test < 0x40) || (0x40 < $test && $test < 0x5B) || (0x60 < $test && $test <= 0x7B) || (0x2D == $test)) {
508
+				$encoded .= chr($decoded[$i]);
509
+				$codecount++;
510
+			}
511
+		}
512
+		if ($codecount == $deco_len) {
513
+			return $encoded; // All codepoints were basic ones
514
+		}
515
+		// Start with the prefix; copy it to output
516
+		$encoded = $this->_punycode_prefix . $encoded;
517
+		// If we have basic code points in output, add an hyphen to the end
518
+		if ($codecount) {
519
+			$encoded .= '-';
520
+		}
521
+		// Now find and encode all non-basic code points
522
+		$is_first = true;
523
+		$cur_code = $this->_initial_n;
524
+		$bias = $this->_initial_bias;
525
+		$delta = 0;
526
+		while ($codecount < $deco_len) {
527
+			// Find the smallest code point >= the current code point and
528
+			// remember the last ouccrence of it in the input
529
+			for ($i = 0, $next_code = $this->_max_ucs; $i < $deco_len; $i++) {
530
+				if ($decoded[$i] >= $cur_code && $decoded[$i] <= $next_code) {
531
+					$next_code = $decoded[$i];
532
+				}
533
+			}
534
+			$delta += ($next_code - $cur_code) * ($codecount + 1);
535
+			$cur_code = $next_code;
536 536
 
537
-            // Scan input again and encode all characters whose code point is $cur_code
538
-            for ($i = 0; $i < $deco_len; $i++) {
539
-                if ($decoded[$i] < $cur_code) {
540
-                    $delta++;
541
-                } elseif ($decoded[$i] == $cur_code) {
542
-                    for ($q = $delta, $k = $this->_base; 1; $k += $this->_base) {
543
-                        $t = ($k <= $bias) ? $this->_tmin :
544
-                                (($k >= $bias + $this->_tmax) ? $this->_tmax : $k - $bias);
545
-                        if ($q < $t) {
546
-                            break;
547
-                        }
548
-                        $encoded .= $this->_encode_digit(intval($t + (($q - $t) % ($this->_base - $t)))); //v0.4.5 Changed from ceil() to intval()
549
-                        $q = (int) (($q - $t) / ($this->_base - $t));
550
-                    }
551
-                    $encoded .= $this->_encode_digit($q);
552
-                    $bias = $this->_adapt($delta, $codecount + 1, $is_first);
553
-                    $codecount++;
554
-                    $delta = 0;
555
-                    $is_first = false;
556
-                }
557
-            }
558
-            $delta++;
559
-            $cur_code++;
560
-        }
561
-        return $encoded;
562
-    }
537
+			// Scan input again and encode all characters whose code point is $cur_code
538
+			for ($i = 0; $i < $deco_len; $i++) {
539
+				if ($decoded[$i] < $cur_code) {
540
+					$delta++;
541
+				} elseif ($decoded[$i] == $cur_code) {
542
+					for ($q = $delta, $k = $this->_base; 1; $k += $this->_base) {
543
+						$t = ($k <= $bias) ? $this->_tmin :
544
+								(($k >= $bias + $this->_tmax) ? $this->_tmax : $k - $bias);
545
+						if ($q < $t) {
546
+							break;
547
+						}
548
+						$encoded .= $this->_encode_digit(intval($t + (($q - $t) % ($this->_base - $t)))); //v0.4.5 Changed from ceil() to intval()
549
+						$q = (int) (($q - $t) / ($this->_base - $t));
550
+					}
551
+					$encoded .= $this->_encode_digit($q);
552
+					$bias = $this->_adapt($delta, $codecount + 1, $is_first);
553
+					$codecount++;
554
+					$delta = 0;
555
+					$is_first = false;
556
+				}
557
+			}
558
+			$delta++;
559
+			$cur_code++;
560
+		}
561
+		return $encoded;
562
+	}
563 563
 
564
-    /**
565
-     * Adapt the bias according to the current code point and position
566
-     * @param int $delta
567
-     * @param int $npoints
568
-     * @param int $is_first
569
-     * @return int
570
-     */
571
-    protected function _adapt($delta, $npoints, $is_first)
572
-    {
573
-        $delta = intval($is_first ? ($delta / $this->_damp) : ($delta / 2));
574
-        $delta += intval($delta / $npoints);
575
-        for ($k = 0; $delta > (($this->_base - $this->_tmin) * $this->_tmax) / 2; $k += $this->_base) {
576
-            $delta = intval($delta / ($this->_base - $this->_tmin));
577
-        }
578
-        return intval($k + ($this->_base - $this->_tmin + 1) * $delta / ($delta + $this->_skew));
579
-    }
564
+	/**
565
+	 * Adapt the bias according to the current code point and position
566
+	 * @param int $delta
567
+	 * @param int $npoints
568
+	 * @param int $is_first
569
+	 * @return int
570
+	 */
571
+	protected function _adapt($delta, $npoints, $is_first)
572
+	{
573
+		$delta = intval($is_first ? ($delta / $this->_damp) : ($delta / 2));
574
+		$delta += intval($delta / $npoints);
575
+		for ($k = 0; $delta > (($this->_base - $this->_tmin) * $this->_tmax) / 2; $k += $this->_base) {
576
+			$delta = intval($delta / ($this->_base - $this->_tmin));
577
+		}
578
+		return intval($k + ($this->_base - $this->_tmin + 1) * $delta / ($delta + $this->_skew));
579
+	}
580 580
 
581
-    /**
582
-     * Encoding a certain digit
583
-     * @param    int $d
584
-     * @return string
585
-     */
586
-    protected function _encode_digit($d)
587
-    {
588
-        return chr($d + 22 + 75 * ($d < 26));
589
-    }
581
+	/**
582
+	 * Encoding a certain digit
583
+	 * @param    int $d
584
+	 * @return string
585
+	 */
586
+	protected function _encode_digit($d)
587
+	{
588
+		return chr($d + 22 + 75 * ($d < 26));
589
+	}
590 590
 
591
-    /**
592
-     * Decode a certain digit
593
-     * @param    int $cp
594
-     * @return int
595
-     */
596
-    protected function _decode_digit($cp)
597
-    {
598
-        $cp = ord($cp);
599
-        return ($cp - 48 < 10) ? $cp - 22 : (($cp - 65 < 26) ? $cp - 65 : (($cp - 97 < 26) ? $cp - 97 : $this->_base));
600
-    }
591
+	/**
592
+	 * Decode a certain digit
593
+	 * @param    int $cp
594
+	 * @return int
595
+	 */
596
+	protected function _decode_digit($cp)
597
+	{
598
+		$cp = ord($cp);
599
+		return ($cp - 48 < 10) ? $cp - 22 : (($cp - 65 < 26) ? $cp - 65 : (($cp - 97 < 26) ? $cp - 97 : $this->_base));
600
+	}
601 601
 
602
-    /**
603
-     * Internal error handling method
604
-     * @param  string $error
605
-     */
606
-    protected function _error($error = '')
607
-    {
608
-        $this->_error = $error;
609
-    }
602
+	/**
603
+	 * Internal error handling method
604
+	 * @param  string $error
605
+	 */
606
+	protected function _error($error = '')
607
+	{
608
+		$this->_error = $error;
609
+	}
610 610
 
611
-    /**
612
-     * Do Nameprep according to RFC3491 and RFC3454
613
-     * @param    array    Unicode Characters
614
-     * @return   string   Unicode Characters, Nameprep'd
615
-     */
616
-    protected function _nameprep($input)
617
-    {
618
-        $output = array();
619
-        //
620
-        // Mapping
621
-        // Walking through the input array, performing the required steps on each of
622
-        // the input chars and putting the result into the output array
623
-        // While mapping required chars we apply the cannonical ordering
624
-        foreach ($input as $v) {
625
-            // Map to nothing == skip that code point
626
-            if (in_array($v, self::$NP['map_nothing'])) {
627
-                continue;
628
-            }
629
-            // Try to find prohibited input
630
-            if (in_array($v, self::$NP['prohibit']) || in_array($v, self::$NP['general_prohibited'])) {
631
-                $this->_error('NAMEPREP: Prohibited input U+' . sprintf('%08X', $v));
632
-                return false;
633
-            }
634
-            foreach (self::$NP['prohibit_ranges'] as $range) {
635
-                if ($range[0] <= $v && $v <= $range[1]) {
636
-                    $this->_error('NAMEPREP: Prohibited input U+' . sprintf('%08X', $v));
637
-                    return false;
638
-                }
639
-            }
611
+	/**
612
+	 * Do Nameprep according to RFC3491 and RFC3454
613
+	 * @param    array    Unicode Characters
614
+	 * @return   string   Unicode Characters, Nameprep'd
615
+	 */
616
+	protected function _nameprep($input)
617
+	{
618
+		$output = array();
619
+		//
620
+		// Mapping
621
+		// Walking through the input array, performing the required steps on each of
622
+		// the input chars and putting the result into the output array
623
+		// While mapping required chars we apply the cannonical ordering
624
+		foreach ($input as $v) {
625
+			// Map to nothing == skip that code point
626
+			if (in_array($v, self::$NP['map_nothing'])) {
627
+				continue;
628
+			}
629
+			// Try to find prohibited input
630
+			if (in_array($v, self::$NP['prohibit']) || in_array($v, self::$NP['general_prohibited'])) {
631
+				$this->_error('NAMEPREP: Prohibited input U+' . sprintf('%08X', $v));
632
+				return false;
633
+			}
634
+			foreach (self::$NP['prohibit_ranges'] as $range) {
635
+				if ($range[0] <= $v && $v <= $range[1]) {
636
+					$this->_error('NAMEPREP: Prohibited input U+' . sprintf('%08X', $v));
637
+					return false;
638
+				}
639
+			}
640 640
 
641
-            if (0xAC00 <= $v && $v <= 0xD7AF) {
642
-                // Hangul syllable decomposition
643
-                foreach ($this->_hangul_decompose($v) as $out) {
644
-                    $output[] = (int) $out;
645
-                }
646
-            } elseif (($this->_idn_version == '2003') && isset(self::$NP['replacemaps_2003'][$v])) {
647
-                foreach ($this->_apply_cannonical_ordering(self::$NP['replacemaps_2003'][$v]) as $out) {
648
-                    $output[] = (int) $out;
649
-                }
650
-            } elseif (($this->_idn_version == '2008') && isset(self::$NP['replacemaps'][$v])) {
651
-                foreach ($this->_apply_cannonical_ordering(self::$NP['replacemaps'][$v]) as $out) {
652
-                    $output[] = (int) $out;
653
-                }
654
-            } else {
655
-                $output[] = (int) $v;
656
-            }
657
-        }
658
-        // Before applying any Combining, try to rearrange any Hangul syllables
659
-        $output = $this->_hangul_compose($output);
660
-        //
661
-        // Combine code points
662
-        //
663
-        $last_class = 0;
664
-        $last_starter = 0;
665
-        $out_len = count($output);
666
-        for ($i = 0; $i < $out_len; ++$i) {
667
-            $class = $this->_get_combining_class($output[$i]);
668
-            if ((!$last_class || $last_class > $class) && $class) {
669
-                // Try to match
670
-                $seq_len = $i - $last_starter;
671
-                $out = $this->_combine(array_slice($output, $last_starter, $seq_len));
672
-                // On match: Replace the last starter with the composed character and remove
673
-                // the now redundant non-starter(s)
674
-                if ($out) {
675
-                    $output[$last_starter] = $out;
676
-                    if (count($out) != $seq_len) {
677
-                        for ($j = $i + 1; $j < $out_len; ++$j) {
678
-                            $output[$j - 1] = $output[$j];
679
-                        }
680
-                        unset($output[$out_len]);
681
-                    }
682
-                    // Rewind the for loop by one, since there can be more possible compositions
683
-                    $i--;
684
-                    $out_len--;
685
-                    $last_class = ($i == $last_starter) ? 0 : $this->_get_combining_class($output[$i - 1]);
686
-                    continue;
687
-                }
688
-            }
689
-            // The current class is 0
690
-            if (!$class) {
691
-                $last_starter = $i;
692
-            }
693
-            $last_class = $class;
694
-        }
695
-        return $output;
696
-    }
641
+			if (0xAC00 <= $v && $v <= 0xD7AF) {
642
+				// Hangul syllable decomposition
643
+				foreach ($this->_hangul_decompose($v) as $out) {
644
+					$output[] = (int) $out;
645
+				}
646
+			} elseif (($this->_idn_version == '2003') && isset(self::$NP['replacemaps_2003'][$v])) {
647
+				foreach ($this->_apply_cannonical_ordering(self::$NP['replacemaps_2003'][$v]) as $out) {
648
+					$output[] = (int) $out;
649
+				}
650
+			} elseif (($this->_idn_version == '2008') && isset(self::$NP['replacemaps'][$v])) {
651
+				foreach ($this->_apply_cannonical_ordering(self::$NP['replacemaps'][$v]) as $out) {
652
+					$output[] = (int) $out;
653
+				}
654
+			} else {
655
+				$output[] = (int) $v;
656
+			}
657
+		}
658
+		// Before applying any Combining, try to rearrange any Hangul syllables
659
+		$output = $this->_hangul_compose($output);
660
+		//
661
+		// Combine code points
662
+		//
663
+		$last_class = 0;
664
+		$last_starter = 0;
665
+		$out_len = count($output);
666
+		for ($i = 0; $i < $out_len; ++$i) {
667
+			$class = $this->_get_combining_class($output[$i]);
668
+			if ((!$last_class || $last_class > $class) && $class) {
669
+				// Try to match
670
+				$seq_len = $i - $last_starter;
671
+				$out = $this->_combine(array_slice($output, $last_starter, $seq_len));
672
+				// On match: Replace the last starter with the composed character and remove
673
+				// the now redundant non-starter(s)
674
+				if ($out) {
675
+					$output[$last_starter] = $out;
676
+					if (count($out) != $seq_len) {
677
+						for ($j = $i + 1; $j < $out_len; ++$j) {
678
+							$output[$j - 1] = $output[$j];
679
+						}
680
+						unset($output[$out_len]);
681
+					}
682
+					// Rewind the for loop by one, since there can be more possible compositions
683
+					$i--;
684
+					$out_len--;
685
+					$last_class = ($i == $last_starter) ? 0 : $this->_get_combining_class($output[$i - 1]);
686
+					continue;
687
+				}
688
+			}
689
+			// The current class is 0
690
+			if (!$class) {
691
+				$last_starter = $i;
692
+			}
693
+			$last_class = $class;
694
+		}
695
+		return $output;
696
+	}
697 697
 
698
-    /**
699
-     * Decomposes a Hangul syllable
700
-     * (see http://www.unicode.org/unicode/reports/tr15/#Hangul
701
-     * @param    integer  32bit UCS4 code point
702
-     * @return   array    Either Hangul Syllable decomposed or original 32bit value as one value array
703
-     */
704
-    protected function _hangul_decompose($char)
705
-    {
706
-        $sindex = (int) $char - $this->_sbase;
707
-        if ($sindex < 0 || $sindex >= $this->_scount) {
708
-            return array($char);
709
-        }
710
-        $result = array();
711
-        $result[] = (int) $this->_lbase + $sindex / $this->_ncount;
712
-        $result[] = (int) $this->_vbase + ($sindex % $this->_ncount) / $this->_tcount;
713
-        $T = intval($this->_tbase + $sindex % $this->_tcount);
714
-        if ($T != $this->_tbase) {
715
-            $result[] = $T;
716
-        }
717
-        return $result;
718
-    }
698
+	/**
699
+	 * Decomposes a Hangul syllable
700
+	 * (see http://www.unicode.org/unicode/reports/tr15/#Hangul
701
+	 * @param    integer  32bit UCS4 code point
702
+	 * @return   array    Either Hangul Syllable decomposed or original 32bit value as one value array
703
+	 */
704
+	protected function _hangul_decompose($char)
705
+	{
706
+		$sindex = (int) $char - $this->_sbase;
707
+		if ($sindex < 0 || $sindex >= $this->_scount) {
708
+			return array($char);
709
+		}
710
+		$result = array();
711
+		$result[] = (int) $this->_lbase + $sindex / $this->_ncount;
712
+		$result[] = (int) $this->_vbase + ($sindex % $this->_ncount) / $this->_tcount;
713
+		$T = intval($this->_tbase + $sindex % $this->_tcount);
714
+		if ($T != $this->_tbase) {
715
+			$result[] = $T;
716
+		}
717
+		return $result;
718
+	}
719 719
 
720
-    /**
721
-     * Ccomposes a Hangul syllable
722
-     * (see http://www.unicode.org/unicode/reports/tr15/#Hangul
723
-     * @param    array    Decomposed UCS4 sequence
724
-     * @return   array    UCS4 sequence with syllables composed
725
-     */
726
-    protected function _hangul_compose($input)
727
-    {
728
-        $inp_len = count($input);
729
-        if (!$inp_len) {
730
-            return array();
731
-        }
732
-        $result = array();
733
-        $last = (int) $input[0];
734
-        $result[] = $last; // copy first char from input to output
720
+	/**
721
+	 * Ccomposes a Hangul syllable
722
+	 * (see http://www.unicode.org/unicode/reports/tr15/#Hangul
723
+	 * @param    array    Decomposed UCS4 sequence
724
+	 * @return   array    UCS4 sequence with syllables composed
725
+	 */
726
+	protected function _hangul_compose($input)
727
+	{
728
+		$inp_len = count($input);
729
+		if (!$inp_len) {
730
+			return array();
731
+		}
732
+		$result = array();
733
+		$last = (int) $input[0];
734
+		$result[] = $last; // copy first char from input to output
735 735
 
736
-        for ($i = 1; $i < $inp_len; ++$i) {
737
-            $char = (int) $input[$i];
738
-            $sindex = $last - $this->_sbase;
739
-            $lindex = $last - $this->_lbase;
740
-            $vindex = $char - $this->_vbase;
741
-            $tindex = $char - $this->_tbase;
742
-            // Find out, whether two current characters are LV and T
743
-            if (0 <= $sindex && $sindex < $this->_scount && ($sindex % $this->_tcount == 0) && 0 <= $tindex && $tindex <= $this->_tcount) {
744
-                // create syllable of form LVT
745
-                $last += $tindex;
746
-                $result[(count($result) - 1)] = $last; // reset last
747
-                continue; // discard char
748
-            }
749
-            // Find out, whether two current characters form L and V
750
-            if (0 <= $lindex && $lindex < $this->_lcount && 0 <= $vindex && $vindex < $this->_vcount) {
751
-                // create syllable of form LV
752
-                $last = (int) $this->_sbase + ($lindex * $this->_vcount + $vindex) * $this->_tcount;
753
-                $result[(count($result) - 1)] = $last; // reset last
754
-                continue; // discard char
755
-            }
756
-            // if neither case was true, just add the character
757
-            $last = $char;
758
-            $result[] = $char;
759
-        }
760
-        return $result;
761
-    }
736
+		for ($i = 1; $i < $inp_len; ++$i) {
737
+			$char = (int) $input[$i];
738
+			$sindex = $last - $this->_sbase;
739
+			$lindex = $last - $this->_lbase;
740
+			$vindex = $char - $this->_vbase;
741
+			$tindex = $char - $this->_tbase;
742
+			// Find out, whether two current characters are LV and T
743
+			if (0 <= $sindex && $sindex < $this->_scount && ($sindex % $this->_tcount == 0) && 0 <= $tindex && $tindex <= $this->_tcount) {
744
+				// create syllable of form LVT
745
+				$last += $tindex;
746
+				$result[(count($result) - 1)] = $last; // reset last
747
+				continue; // discard char
748
+			}
749
+			// Find out, whether two current characters form L and V
750
+			if (0 <= $lindex && $lindex < $this->_lcount && 0 <= $vindex && $vindex < $this->_vcount) {
751
+				// create syllable of form LV
752
+				$last = (int) $this->_sbase + ($lindex * $this->_vcount + $vindex) * $this->_tcount;
753
+				$result[(count($result) - 1)] = $last; // reset last
754
+				continue; // discard char
755
+			}
756
+			// if neither case was true, just add the character
757
+			$last = $char;
758
+			$result[] = $char;
759
+		}
760
+		return $result;
761
+	}
762 762
 
763
-    /**
764
-     * Returns the combining class of a certain wide char
765
-     * @param    integer    Wide char to check (32bit integer)
766
-     * @return   integer    Combining class if found, else 0
767
-     */
768
-    protected function _get_combining_class($char)
769
-    {
770
-        return isset(self::$NP['norm_combcls'][$char]) ? self::$NP['norm_combcls'][$char] : 0;
771
-    }
763
+	/**
764
+	 * Returns the combining class of a certain wide char
765
+	 * @param    integer    Wide char to check (32bit integer)
766
+	 * @return   integer    Combining class if found, else 0
767
+	 */
768
+	protected function _get_combining_class($char)
769
+	{
770
+		return isset(self::$NP['norm_combcls'][$char]) ? self::$NP['norm_combcls'][$char] : 0;
771
+	}
772 772
 
773
-    /**
774
-     * Applies the cannonical ordering of a decomposed UCS4 sequence
775
-     * @param    array      Decomposed UCS4 sequence
776
-     * @return   array      Ordered USC4 sequence
777
-     */
778
-    protected function _apply_cannonical_ordering($input)
779
-    {
780
-        $swap = true;
781
-        $size = count($input);
782
-        while ($swap) {
783
-            $swap = false;
784
-            $last = $this->_get_combining_class(intval($input[0]));
785
-            for ($i = 0; $i < $size - 1; ++$i) {
786
-                $next = $this->_get_combining_class(intval($input[$i + 1]));
787
-                if ($next != 0 && $last > $next) {
788
-                    // Move item leftward until it fits
789
-                    for ($j = $i + 1; $j > 0; --$j) {
790
-                        if ($this->_get_combining_class(intval($input[$j - 1])) <= $next) {
791
-                            break;
792
-                        }
793
-                        $t = intval($input[$j]);
794
-                        $input[$j] = intval($input[$j - 1]);
795
-                        $input[$j - 1] = $t;
796
-                        $swap = true;
797
-                    }
798
-                    // Reentering the loop looking at the old character again
799
-                    $next = $last;
800
-                }
801
-                $last = $next;
802
-            }
803
-        }
804
-        return $input;
805
-    }
773
+	/**
774
+	 * Applies the cannonical ordering of a decomposed UCS4 sequence
775
+	 * @param    array      Decomposed UCS4 sequence
776
+	 * @return   array      Ordered USC4 sequence
777
+	 */
778
+	protected function _apply_cannonical_ordering($input)
779
+	{
780
+		$swap = true;
781
+		$size = count($input);
782
+		while ($swap) {
783
+			$swap = false;
784
+			$last = $this->_get_combining_class(intval($input[0]));
785
+			for ($i = 0; $i < $size - 1; ++$i) {
786
+				$next = $this->_get_combining_class(intval($input[$i + 1]));
787
+				if ($next != 0 && $last > $next) {
788
+					// Move item leftward until it fits
789
+					for ($j = $i + 1; $j > 0; --$j) {
790
+						if ($this->_get_combining_class(intval($input[$j - 1])) <= $next) {
791
+							break;
792
+						}
793
+						$t = intval($input[$j]);
794
+						$input[$j] = intval($input[$j - 1]);
795
+						$input[$j - 1] = $t;
796
+						$swap = true;
797
+					}
798
+					// Reentering the loop looking at the old character again
799
+					$next = $last;
800
+				}
801
+				$last = $next;
802
+			}
803
+		}
804
+		return $input;
805
+	}
806 806
 
807
-    /**
808
-     * Do composition of a sequence of starter and non-starter
809
-     * @param    array      UCS4 Decomposed sequence
810
-     * @return   array      Ordered USC4 sequence
811
-     */
812
-    protected function _combine($input)
813
-    {
814
-        $inp_len = count($input);
815
-        if (0 == $inp_len) {
816
-            return false;
817
-        }
818
-        foreach (self::$NP['replacemaps'] as $np_src => $np_target) {
819
-            if ($np_target[0] != $input[0]) {
820
-                continue;
821
-            }
822
-            if (count($np_target) != $inp_len) {
823
-                continue;
824
-            }
825
-            $hit = false;
826
-            foreach ($input as $k2 => $v2) {
827
-                if ($v2 == $np_target[$k2]) {
828
-                    $hit = true;
829
-                } else {
830
-                    $hit = false;
831
-                    break;
832
-                }
833
-            }
834
-            if ($hit) {
835
-                return $np_src;
836
-            }
837
-        }
838
-        return false;
839
-    }
807
+	/**
808
+	 * Do composition of a sequence of starter and non-starter
809
+	 * @param    array      UCS4 Decomposed sequence
810
+	 * @return   array      Ordered USC4 sequence
811
+	 */
812
+	protected function _combine($input)
813
+	{
814
+		$inp_len = count($input);
815
+		if (0 == $inp_len) {
816
+			return false;
817
+		}
818
+		foreach (self::$NP['replacemaps'] as $np_src => $np_target) {
819
+			if ($np_target[0] != $input[0]) {
820
+				continue;
821
+			}
822
+			if (count($np_target) != $inp_len) {
823
+				continue;
824
+			}
825
+			$hit = false;
826
+			foreach ($input as $k2 => $v2) {
827
+				if ($v2 == $np_target[$k2]) {
828
+					$hit = true;
829
+				} else {
830
+					$hit = false;
831
+					break;
832
+				}
833
+			}
834
+			if ($hit) {
835
+				return $np_src;
836
+			}
837
+		}
838
+		return false;
839
+	}
840 840
 
841
-    /**
842
-     * This converts an UTF-8 encoded string to its UCS-4 representation
843
-     * By talking about UCS-4 "strings" we mean arrays of 32bit integers representing
844
-     * each of the "chars". This is due to PHP not being able to handle strings with
845
-     * bit depth different from 8. This apllies to the reverse method _ucs4_to_utf8(), too.
846
-     * The following UTF-8 encodings are supported:
847
-     * bytes bits  representation
848
-     * 1        7  0xxxxxxx
849
-     * 2       11  110xxxxx 10xxxxxx
850
-     * 3       16  1110xxxx 10xxxxxx 10xxxxxx
851
-     * 4       21  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
852
-     * 5       26  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
853
-     * 6       31  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
854
-     * Each x represents a bit that can be used to store character data.
855
-     * The five and six byte sequences are part of Annex D of ISO/IEC 10646-1:2000
856
-     * @param string $input
857
-     * @return string
858
-     */
859
-    protected function _utf8_to_ucs4($input)
860
-    {
861
-        $output = array();
862
-        $out_len = 0;
863
-        $inp_len = self::byteLength($input);
864
-        $mode = 'next';
865
-        $test = 'none';
866
-        for ($k = 0; $k < $inp_len; ++$k) {
867
-            $v = ord($input{$k}); // Extract byte from input string
868
-            if ($v < 128) { // We found an ASCII char - put into stirng as is
869
-                $output[$out_len] = $v;
870
-                ++$out_len;
871
-                if ('add' == $mode) {
872
-                    $this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte ' . $k);
873
-                    return false;
874
-                }
875
-                continue;
876
-            }
877
-            if ('next' == $mode) { // Try to find the next start byte; determine the width of the Unicode char
878
-                $start_byte = $v;
879
-                $mode = 'add';
880
-                $test = 'range';
881
-                if ($v >> 5 == 6) { // &110xxxxx 10xxxxx
882
-                    $next_byte = 0; // Tells, how many times subsequent bitmasks must rotate 6bits to the left
883
-                    $v = ($v - 192) << 6;
884
-                } elseif ($v >> 4 == 14) { // &1110xxxx 10xxxxxx 10xxxxxx
885
-                    $next_byte = 1;
886
-                    $v = ($v - 224) << 12;
887
-                } elseif ($v >> 3 == 30) { // &11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
888
-                    $next_byte = 2;
889
-                    $v = ($v - 240) << 18;
890
-                } elseif ($v >> 2 == 62) { // &111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
891
-                    $next_byte = 3;
892
-                    $v = ($v - 248) << 24;
893
-                } elseif ($v >> 1 == 126) { // &1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
894
-                    $next_byte = 4;
895
-                    $v = ($v - 252) << 30;
896
-                } else {
897
-                    $this->_error('This might be UTF-8, but I don\'t understand it at byte ' . $k);
898
-                    return false;
899
-                }
900
-                if ('add' == $mode) {
901
-                    $output[$out_len] = (int) $v;
902
-                    ++$out_len;
903
-                    continue;
904
-                }
905
-            }
906
-            if ('add' == $mode) {
907
-                if (!$this->_allow_overlong && $test == 'range') {
908
-                    $test = 'none';
909
-                    if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) {
910
-                        $this->_error('Bogus UTF-8 character detected (out of legal range) at byte ' . $k);
911
-                        return false;
912
-                    }
913
-                }
914
-                if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx
915
-                    $v = ($v - 128) << ($next_byte * 6);
916
-                    $output[($out_len - 1)] += $v;
917
-                    --$next_byte;
918
-                } else {
919
-                    $this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte ' . $k);
920
-                    return false;
921
-                }
922
-                if ($next_byte < 0) {
923
-                    $mode = 'next';
924
-                }
925
-            }
926
-        } // for
927
-        return $output;
928
-    }
841
+	/**
842
+	 * This converts an UTF-8 encoded string to its UCS-4 representation
843
+	 * By talking about UCS-4 "strings" we mean arrays of 32bit integers representing
844
+	 * each of the "chars". This is due to PHP not being able to handle strings with
845
+	 * bit depth different from 8. This apllies to the reverse method _ucs4_to_utf8(), too.
846
+	 * The following UTF-8 encodings are supported:
847
+	 * bytes bits  representation
848
+	 * 1        7  0xxxxxxx
849
+	 * 2       11  110xxxxx 10xxxxxx
850
+	 * 3       16  1110xxxx 10xxxxxx 10xxxxxx
851
+	 * 4       21  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
852
+	 * 5       26  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
853
+	 * 6       31  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
854
+	 * Each x represents a bit that can be used to store character data.
855
+	 * The five and six byte sequences are part of Annex D of ISO/IEC 10646-1:2000
856
+	 * @param string $input
857
+	 * @return string
858
+	 */
859
+	protected function _utf8_to_ucs4($input)
860
+	{
861
+		$output = array();
862
+		$out_len = 0;
863
+		$inp_len = self::byteLength($input);
864
+		$mode = 'next';
865
+		$test = 'none';
866
+		for ($k = 0; $k < $inp_len; ++$k) {
867
+			$v = ord($input{$k}); // Extract byte from input string
868
+			if ($v < 128) { // We found an ASCII char - put into stirng as is
869
+				$output[$out_len] = $v;
870
+				++$out_len;
871
+				if ('add' == $mode) {
872
+					$this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte ' . $k);
873
+					return false;
874
+				}
875
+				continue;
876
+			}
877
+			if ('next' == $mode) { // Try to find the next start byte; determine the width of the Unicode char
878
+				$start_byte = $v;
879
+				$mode = 'add';
880
+				$test = 'range';
881
+				if ($v >> 5 == 6) { // &110xxxxx 10xxxxx
882
+					$next_byte = 0; // Tells, how many times subsequent bitmasks must rotate 6bits to the left
883
+					$v = ($v - 192) << 6;
884
+				} elseif ($v >> 4 == 14) { // &1110xxxx 10xxxxxx 10xxxxxx
885
+					$next_byte = 1;
886
+					$v = ($v - 224) << 12;
887
+				} elseif ($v >> 3 == 30) { // &11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
888
+					$next_byte = 2;
889
+					$v = ($v - 240) << 18;
890
+				} elseif ($v >> 2 == 62) { // &111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
891
+					$next_byte = 3;
892
+					$v = ($v - 248) << 24;
893
+				} elseif ($v >> 1 == 126) { // &1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
894
+					$next_byte = 4;
895
+					$v = ($v - 252) << 30;
896
+				} else {
897
+					$this->_error('This might be UTF-8, but I don\'t understand it at byte ' . $k);
898
+					return false;
899
+				}
900
+				if ('add' == $mode) {
901
+					$output[$out_len] = (int) $v;
902
+					++$out_len;
903
+					continue;
904
+				}
905
+			}
906
+			if ('add' == $mode) {
907
+				if (!$this->_allow_overlong && $test == 'range') {
908
+					$test = 'none';
909
+					if (($v < 0xA0 && $start_byte == 0xE0) || ($v < 0x90 && $start_byte == 0xF0) || ($v > 0x8F && $start_byte == 0xF4)) {
910
+						$this->_error('Bogus UTF-8 character detected (out of legal range) at byte ' . $k);
911
+						return false;
912
+					}
913
+				}
914
+				if ($v >> 6 == 2) { // Bit mask must be 10xxxxxx
915
+					$v = ($v - 128) << ($next_byte * 6);
916
+					$output[($out_len - 1)] += $v;
917
+					--$next_byte;
918
+				} else {
919
+					$this->_error('Conversion from UTF-8 to UCS-4 failed: malformed input at byte ' . $k);
920
+					return false;
921
+				}
922
+				if ($next_byte < 0) {
923
+					$mode = 'next';
924
+				}
925
+			}
926
+		} // for
927
+		return $output;
928
+	}
929 929
 
930
-    /**
931
-     * Convert UCS-4 string into UTF-8 string
932
-     * See _utf8_to_ucs4() for details
933
-     * @param string  $input
934
-     * @return string
935
-     */
936
-    protected function _ucs4_to_utf8($input)
937
-    {
938
-        $output = '';
939
-        foreach ($input as $k => $v) {
940
-            if ($v < 128) { // 7bit are transferred literally
941
-                $output .= chr($v);
942
-            } elseif ($v < (1 << 11)) { // 2 bytes
943
-                $output .= chr(192 + ($v >> 6)) . chr(128 + ($v & 63));
944
-            } elseif ($v < (1 << 16)) { // 3 bytes
945
-                $output .= chr(224 + ($v >> 12)) . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63));
946
-            } elseif ($v < (1 << 21)) { // 4 bytes
947
-                $output .= chr(240 + ($v >> 18)) . chr(128 + (($v >> 12) & 63)) . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63));
948
-            } else {
949
-                $this->_error('Conversion from UCS-4 to UTF-8 failed: malformed input at byte ' . $k);
950
-                return false;
951
-            }
952
-        }
953
-        return $output;
954
-    }
930
+	/**
931
+	 * Convert UCS-4 string into UTF-8 string
932
+	 * See _utf8_to_ucs4() for details
933
+	 * @param string  $input
934
+	 * @return string
935
+	 */
936
+	protected function _ucs4_to_utf8($input)
937
+	{
938
+		$output = '';
939
+		foreach ($input as $k => $v) {
940
+			if ($v < 128) { // 7bit are transferred literally
941
+				$output .= chr($v);
942
+			} elseif ($v < (1 << 11)) { // 2 bytes
943
+				$output .= chr(192 + ($v >> 6)) . chr(128 + ($v & 63));
944
+			} elseif ($v < (1 << 16)) { // 3 bytes
945
+				$output .= chr(224 + ($v >> 12)) . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63));
946
+			} elseif ($v < (1 << 21)) { // 4 bytes
947
+				$output .= chr(240 + ($v >> 18)) . chr(128 + (($v >> 12) & 63)) . chr(128 + (($v >> 6) & 63)) . chr(128 + ($v & 63));
948
+			} else {
949
+				$this->_error('Conversion from UCS-4 to UTF-8 failed: malformed input at byte ' . $k);
950
+				return false;
951
+			}
952
+		}
953
+		return $output;
954
+	}
955 955
 
956
-    /**
957
-     * Convert UCS-4 array into UCS-4 string
958
-     *
959
-     * @param array $input
960
-     * @return string
961
-     */
962
-    protected function _ucs4_to_ucs4_string($input)
963
-    {
964
-        $output = '';
965
-        // Take array values and split output to 4 bytes per value
966
-        // The bit mask is 255, which reads &11111111
967
-        foreach ($input as $v) {
968
-            $output .= chr(($v >> 24) & 255) . chr(($v >> 16) & 255) . chr(($v >> 8) & 255) . chr($v & 255);
969
-        }
970
-        return $output;
971
-    }
956
+	/**
957
+	 * Convert UCS-4 array into UCS-4 string
958
+	 *
959
+	 * @param array $input
960
+	 * @return string
961
+	 */
962
+	protected function _ucs4_to_ucs4_string($input)
963
+	{
964
+		$output = '';
965
+		// Take array values and split output to 4 bytes per value
966
+		// The bit mask is 255, which reads &11111111
967
+		foreach ($input as $v) {
968
+			$output .= chr(($v >> 24) & 255) . chr(($v >> 16) & 255) . chr(($v >> 8) & 255) . chr($v & 255);
969
+		}
970
+		return $output;
971
+	}
972 972
 
973
-    /**
974
-     * Convert UCS-4 strin into UCS-4 garray
975
-     *
976
-     * @param  string $input
977
-     * @return array
978
-     */
979
-    protected function _ucs4_string_to_ucs4($input)
980
-    {
981
-        $output = array();
982
-        $inp_len = self::byteLength($input);
983
-        // Input length must be dividable by 4
984
-        if ($inp_len % 4) {
985
-            $this->_error('Input UCS4 string is broken');
986
-            return false;
987
-        }
988
-        // Empty input - return empty output
989
-        if (!$inp_len) {
990
-            return $output;
991
-        }
992
-        for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) {
993
-            // Increment output position every 4 input bytes
994
-            if (!($i % 4)) {
995
-                $out_len++;
996
-                $output[$out_len] = 0;
997
-            }
998
-            $output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4) ) );
999
-        }
1000
-        return $output;
1001
-    }
973
+	/**
974
+	 * Convert UCS-4 strin into UCS-4 garray
975
+	 *
976
+	 * @param  string $input
977
+	 * @return array
978
+	 */
979
+	protected function _ucs4_string_to_ucs4($input)
980
+	{
981
+		$output = array();
982
+		$inp_len = self::byteLength($input);
983
+		// Input length must be dividable by 4
984
+		if ($inp_len % 4) {
985
+			$this->_error('Input UCS4 string is broken');
986
+			return false;
987
+		}
988
+		// Empty input - return empty output
989
+		if (!$inp_len) {
990
+			return $output;
991
+		}
992
+		for ($i = 0, $out_len = -1; $i < $inp_len; ++$i) {
993
+			// Increment output position every 4 input bytes
994
+			if (!($i % 4)) {
995
+				$out_len++;
996
+				$output[$out_len] = 0;
997
+			}
998
+			$output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4) ) );
999
+		}
1000
+		return $output;
1001
+	}
1002 1002
 
1003
-    /**
1004
-     * Gets the length of a string in bytes even if mbstring function
1005
-     * overloading is turned on
1006
-     *
1007
-     * @param string $string the string for which to get the length.
1008
-     * @return integer the length of the string in bytes.
1009
-     */
1010
-    protected static function byteLength($string)
1011
-    {
1012
-        if (self::$_mb_string_overload) {
1013
-            return mb_strlen($string, '8bit');
1014
-        }
1015
-        return strlen((binary) $string);
1016
-    }
1003
+	/**
1004
+	 * Gets the length of a string in bytes even if mbstring function
1005
+	 * overloading is turned on
1006
+	 *
1007
+	 * @param string $string the string for which to get the length.
1008
+	 * @return integer the length of the string in bytes.
1009
+	 */
1010
+	protected static function byteLength($string)
1011
+	{
1012
+		if (self::$_mb_string_overload) {
1013
+			return mb_strlen($string, '8bit');
1014
+		}
1015
+		return strlen((binary) $string);
1016
+	}
1017 1017
 
1018
-    /**
1019
-     * Attempts to return a concrete IDNA instance.
1020
-     *
1021
-     * @param array $params Set of paramaters
1022
-     * @return idna_convert
1023
-     * @access public
1024
-     */
1025
-    public function getInstance($params = array())
1026
-    {
1027
-        return new idna_convert($params);
1028
-    }
1018
+	/**
1019
+	 * Attempts to return a concrete IDNA instance.
1020
+	 *
1021
+	 * @param array $params Set of paramaters
1022
+	 * @return idna_convert
1023
+	 * @access public
1024
+	 */
1025
+	public function getInstance($params = array())
1026
+	{
1027
+		return new idna_convert($params);
1028
+	}
1029 1029
 
1030
-    /**
1031
-     * Attempts to return a concrete IDNA instance for either php4 or php5,
1032
-     * only creating a new instance if no IDNA instance with the same
1033
-     * parameters currently exists.
1034
-     *
1035
-     * @param array $params Set of paramaters
1036
-     *
1037
-     * @return object idna_convert
1038
-     * @access public
1039
-     */
1040
-    public function singleton($params = array())
1041
-    {
1042
-        static $instances = array();
1030
+	/**
1031
+	 * Attempts to return a concrete IDNA instance for either php4 or php5,
1032
+	 * only creating a new instance if no IDNA instance with the same
1033
+	 * parameters currently exists.
1034
+	 *
1035
+	 * @param array $params Set of paramaters
1036
+	 *
1037
+	 * @return object idna_convert
1038
+	 * @access public
1039
+	 */
1040
+	public function singleton($params = array())
1041
+	{
1042
+		static $instances = array();
1043 1043
 
1044
-        $signature = serialize($params);
1045
-        if (!isset($instances[$signature])) {
1046
-            $instances[$signature] = idna_convert::getInstance($params);
1047
-        }
1048
-        return $instances[$signature];
1049
-    }
1044
+		$signature = serialize($params);
1045
+		if (!isset($instances[$signature])) {
1046
+			$instances[$signature] = idna_convert::getInstance($params);
1047
+		}
1048
+		return $instances[$signature];
1049
+	}
1050 1050
 
1051
-    /**
1052
-     * Holds all relevant mapping tables
1053
-     * See RFC3454 for details
1054
-     *
1055
-     * @private array
1056
-     * @since 0.5.2
1057
-     */
1058
-    protected static $NP = array(
1059
-            'map_nothing' => array(0xAD, 0x34F, 0x1806, 0x180B, 0x180C, 0x180D, 0x200B, 0x200C,
1060
-                    0x200D, 0x2060, 0xFE00, 0xFE01, 0xFE02, 0xFE03, 0xFE04, 0xFE05, 0xFE06, 0xFE07,
1061
-                    0xFE08, 0xFE09, 0xFE0A, 0xFE0B, 0xFE0C, 0xFE0D, 0xFE0E, 0xFE0F, 0xFEFF
1062
-            ),
1063
-            'general_prohibited' => array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
1064
-                    20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
1065
-                    43, 44, 47, 59, 60, 61, 62, 63, 64, 91, 92, 93, 94, 95, 96, 123, 124, 125, 126, 127, 0x3002
1066
-            ),
1067
-            'prohibit' => array(0xA0, 0x340, 0x341, 0x6DD, 0x70F, 0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003,
1068
-                    0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x200B, 0x200C, 0x200D, 0x200E, 0x200F,
1069
-                    0x2028, 0x2029, 0x202A, 0x202B, 0x202C, 0x202D, 0x202E, 0x202F, 0x205F, 0x206A, 0x206B, 0x206C,
1070
-                    0x206D, 0x206E, 0x206F, 0x3000, 0x33C2, 0xFEFF, 0xFFF9, 0xFFFA, 0xFFFB, 0xFFFC, 0xFFFD, 0xFFFE, 0xFFFF,
1071
-                    0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, 0x6FFFE,
1072
-                    0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, 0xBFFFF,
1073
-                    0xCFFFE, 0xCFFFF, 0xDFFFE, 0xDFFFF, 0xE0001, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, 0x10FFFE, 0x10FFFF
1074
-            ),
1075
-            'prohibit_ranges' => array(array(0x80, 0x9F), array(0x2060, 0x206F), array(0x1D173, 0x1D17A),
1076
-                    array(0xE000, 0xF8FF), array(0xF0000, 0xFFFFD), array(0x100000, 0x10FFFD),
1077
-                    array(0xFDD0, 0xFDEF), array(0xD800, 0xDFFF), array(0x2FF0, 0x2FFB), array(0xE0020, 0xE007F)
1078
-            ),
1079
-            'replacemaps_2003' => array(0x41 => array(0x61), 0x42 => array(0x62), 0x43 => array(0x63),
1080
-                    0x44 => array(0x64), 0x45 => array(0x65), 0x46 => array(0x66), 0x47 => array(0x67),
1081
-                    0x48 => array(0x68), 0x49 => array(0x69), 0x4A => array(0x6A), 0x4B => array(0x6B),
1082
-                    0x4C => array(0x6C), 0x4D => array(0x6D), 0x4E => array(0x6E), 0x4F => array(0x6F),
1083
-                    0x50 => array(0x70), 0x51 => array(0x71), 0x52 => array(0x72), 0x53 => array(0x73),
1084
-                    0x54 => array(0x74), 0x55 => array(0x75), 0x56 => array(0x76), 0x57 => array(0x77),
1085
-                    0x58 => array(0x78), 0x59 => array(0x79), 0x5A => array(0x7A), 0xB5 => array(0x3BC),
1086
-                    0xC0 => array(0xE0), 0xC1 => array(0xE1), 0xC2 => array(0xE2), 0xC3 => array(0xE3),
1087
-                    0xC4 => array(0xE4), 0xC5 => array(0xE5), 0xC6 => array(0xE6), 0xC7 => array(0xE7),
1088
-                    0xC8 => array(0xE8), 0xC9 => array(0xE9), 0xCA => array(0xEA), 0xCB => array(0xEB),
1089
-                    0xCC => array(0xEC), 0xCD => array(0xED), 0xCE => array(0xEE), 0xCF => array(0xEF),
1090
-                    0xD0 => array(0xF0), 0xD1 => array(0xF1), 0xD2 => array(0xF2), 0xD3 => array(0xF3),
1091
-                    0xD4 => array(0xF4), 0xD5 => array(0xF5), 0xD6 => array(0xF6), 0xD8 => array(0xF8),
1092
-                    0xD9 => array(0xF9), 0xDA => array(0xFA), 0xDB => array(0xFB), 0xDC => array(0xFC),
1093
-                    0xDD => array(0xFD), 0xDE => array(0xFE), 0xDF => array(0x73, 0x73),
1094
-                    0x100 => array(0x101), 0x102 => array(0x103), 0x104 => array(0x105),
1095
-                    0x106 => array(0x107), 0x108 => array(0x109), 0x10A => array(0x10B),
1096
-                    0x10C => array(0x10D), 0x10E => array(0x10F), 0x110 => array(0x111),
1097
-                    0x112 => array(0x113), 0x114 => array(0x115), 0x116 => array(0x117),
1098
-                    0x118 => array(0x119), 0x11A => array(0x11B), 0x11C => array(0x11D),
1099
-                    0x11E => array(0x11F), 0x120 => array(0x121), 0x122 => array(0x123),
1100
-                    0x124 => array(0x125), 0x126 => array(0x127), 0x128 => array(0x129),
1101
-                    0x12A => array(0x12B), 0x12C => array(0x12D), 0x12E => array(0x12F),
1102
-                    0x130 => array(0x69, 0x307), 0x132 => array(0x133), 0x134 => array(0x135),
1103
-                    0x136 => array(0x137), 0x139 => array(0x13A), 0x13B => array(0x13C),
1104
-                    0x13D => array(0x13E), 0x13F => array(0x140), 0x141 => array(0x142),
1105
-                    0x143 => array(0x144), 0x145 => array(0x146), 0x147 => array(0x148),
1106
-                    0x149 => array(0x2BC, 0x6E), 0x14A => array(0x14B), 0x14C => array(0x14D),
1107
-                    0x14E => array(0x14F), 0x150 => array(0x151), 0x152 => array(0x153),
1108
-                    0x154 => array(0x155), 0x156 => array(0x157), 0x158 => array(0x159),
1109
-                    0x15A => array(0x15B), 0x15C => array(0x15D), 0x15E => array(0x15F),
1110
-                    0x160 => array(0x161), 0x162 => array(0x163), 0x164 => array(0x165),
1111
-                    0x166 => array(0x167), 0x168 => array(0x169), 0x16A => array(0x16B),
1112
-                    0x16C => array(0x16D), 0x16E => array(0x16F), 0x170 => array(0x171),
1113
-                    0x172 => array(0x173), 0x174 => array(0x175), 0x176 => array(0x177),
1114
-                    0x178 => array(0xFF), 0x179 => array(0x17A), 0x17B => array(0x17C),
1115
-                    0x17D => array(0x17E), 0x17F => array(0x73), 0x181 => array(0x253),
1116
-                    0x182 => array(0x183), 0x184 => array(0x185), 0x186 => array(0x254),
1117
-                    0x187 => array(0x188), 0x189 => array(0x256), 0x18A => array(0x257),
1118
-                    0x18B => array(0x18C), 0x18E => array(0x1DD), 0x18F => array(0x259),
1119
-                    0x190 => array(0x25B), 0x191 => array(0x192), 0x193 => array(0x260),
1120
-                    0x194 => array(0x263), 0x196 => array(0x269), 0x197 => array(0x268),
1121
-                    0x198 => array(0x199), 0x19C => array(0x26F), 0x19D => array(0x272),
1122
-                    0x19F => array(0x275), 0x1A0 => array(0x1A1), 0x1A2 => array(0x1A3),
1123
-                    0x1A4 => array(0x1A5), 0x1A6 => array(0x280), 0x1A7 => array(0x1A8),
1124
-                    0x1A9 => array(0x283), 0x1AC => array(0x1AD), 0x1AE => array(0x288),
1125
-                    0x1AF => array(0x1B0), 0x1B1 => array(0x28A), 0x1B2 => array(0x28B),
1126
-                    0x1B3 => array(0x1B4), 0x1B5 => array(0x1B6), 0x1B7 => array(0x292),
1127
-                    0x1B8 => array(0x1B9), 0x1BC => array(0x1BD), 0x1C4 => array(0x1C6),
1128
-                    0x1C5 => array(0x1C6), 0x1C7 => array(0x1C9), 0x1C8 => array(0x1C9),
1129
-                    0x1CA => array(0x1CC), 0x1CB => array(0x1CC), 0x1CD => array(0x1CE),
1130
-                    0x1CF => array(0x1D0), 0x1D1 => array(0x1D2), 0x1D3 => array(0x1D4),
1131
-                    0x1D5 => array(0x1D6), 0x1D7 => array(0x1D8), 0x1D9 => array(0x1DA),
1132
-                    0x1DB => array(0x1DC), 0x1DE => array(0x1DF), 0x1E0 => array(0x1E1),
1133
-                    0x1E2 => array(0x1E3), 0x1E4 => array(0x1E5), 0x1E6 => array(0x1E7),
1134
-                    0x1E8 => array(0x1E9), 0x1EA => array(0x1EB), 0x1EC => array(0x1ED),
1135
-                    0x1EE => array(0x1EF), 0x1F0 => array(0x6A, 0x30C), 0x1F1 => array(0x1F3),
1136
-                    0x1F2 => array(0x1F3), 0x1F4 => array(0x1F5), 0x1F6 => array(0x195),
1137
-                    0x1F7 => array(0x1BF), 0x1F8 => array(0x1F9), 0x1FA => array(0x1FB),
1138
-                    0x1FC => array(0x1FD), 0x1FE => array(0x1FF), 0x200 => array(0x201),
1139
-                    0x202 => array(0x203), 0x204 => array(0x205), 0x206 => array(0x207),
1140
-                    0x208 => array(0x209), 0x20A => array(0x20B), 0x20C => array(0x20D),
1141
-                    0x20E => array(0x20F), 0x210 => array(0x211), 0x212 => array(0x213),
1142
-                    0x214 => array(0x215), 0x216 => array(0x217), 0x218 => array(0x219),
1143
-                    0x21A => array(0x21B), 0x21C => array(0x21D), 0x21E => array(0x21F),
1144
-                    0x220 => array(0x19E), 0x222 => array(0x223), 0x224 => array(0x225),
1145
-                    0x226 => array(0x227), 0x228 => array(0x229), 0x22A => array(0x22B),
1146
-                    0x22C => array(0x22D), 0x22E => array(0x22F), 0x230 => array(0x231),
1147
-                    0x232 => array(0x233), 0x345 => array(0x3B9), 0x37A => array(0x20, 0x3B9),
1148
-                    0x386 => array(0x3AC), 0x388 => array(0x3AD), 0x389 => array(0x3AE),
1149
-                    0x38A => array(0x3AF), 0x38C => array(0x3CC), 0x38E => array(0x3CD),
1150
-                    0x38F => array(0x3CE), 0x390 => array(0x3B9, 0x308, 0x301),
1151
-                    0x391 => array(0x3B1), 0x392 => array(0x3B2), 0x393 => array(0x3B3),
1152
-                    0x394 => array(0x3B4), 0x395 => array(0x3B5), 0x396 => array(0x3B6),
1153
-                    0x397 => array(0x3B7), 0x398 => array(0x3B8), 0x399 => array(0x3B9),
1154
-                    0x39A => array(0x3BA), 0x39B => array(0x3BB), 0x39C => array(0x3BC),
1155
-                    0x39D => array(0x3BD), 0x39E => array(0x3BE), 0x39F => array(0x3BF),
1156
-                    0x3A0 => array(0x3C0), 0x3A1 => array(0x3C1), 0x3A3 => array(0x3C3),
1157
-                    0x3A4 => array(0x3C4), 0x3A5 => array(0x3C5), 0x3A6 => array(0x3C6),
1158
-                    0x3A7 => array(0x3C7), 0x3A8 => array(0x3C8), 0x3A9 => array(0x3C9),
1159
-                    0x3AA => array(0x3CA), 0x3AB => array(0x3CB), 0x3B0 => array(0x3C5, 0x308, 0x301),
1160
-                    0x3C2 => array(0x3C3), 0x3D0 => array(0x3B2), 0x3D1 => array(0x3B8),
1161
-                    0x3D2 => array(0x3C5), 0x3D3 => array(0x3CD), 0x3D4 => array(0x3CB),
1162
-                    0x3D5 => array(0x3C6), 0x3D6 => array(0x3C0), 0x3D8 => array(0x3D9),
1163
-                    0x3DA => array(0x3DB), 0x3DC => array(0x3DD), 0x3DE => array(0x3DF),
1164
-                    0x3E0 => array(0x3E1), 0x3E2 => array(0x3E3), 0x3E4 => array(0x3E5),
1165
-                    0x3E6 => array(0x3E7), 0x3E8 => array(0x3E9), 0x3EA => array(0x3EB),
1166
-                    0x3EC => array(0x3ED), 0x3EE => array(0x3EF), 0x3F0 => array(0x3BA),
1167
-                    0x3F1 => array(0x3C1), 0x3F2 => array(0x3C3), 0x3F4 => array(0x3B8),
1168
-                    0x3F5 => array(0x3B5), 0x400 => array(0x450), 0x401 => array(0x451),
1169
-                    0x402 => array(0x452), 0x403 => array(0x453), 0x404 => array(0x454),
1170
-                    0x405 => array(0x455), 0x406 => array(0x456), 0x407 => array(0x457),
1171
-                    0x408 => array(0x458), 0x409 => array(0x459), 0x40A => array(0x45A),
1172
-                    0x40B => array(0x45B), 0x40C => array(0x45C), 0x40D => array(0x45D),
1173
-                    0x40E => array(0x45E), 0x40F => array(0x45F), 0x410 => array(0x430),
1174
-                    0x411 => array(0x431), 0x412 => array(0x432), 0x413 => array(0x433),
1175
-                    0x414 => array(0x434), 0x415 => array(0x435), 0x416 => array(0x436),
1176
-                    0x417 => array(0x437), 0x418 => array(0x438), 0x419 => array(0x439),
1177
-                    0x41A => array(0x43A), 0x41B => array(0x43B), 0x41C => array(0x43C),
1178
-                    0x41D => array(0x43D), 0x41E => array(0x43E), 0x41F => array(0x43F),
1179
-                    0x420 => array(0x440), 0x421 => array(0x441), 0x422 => array(0x442),
1180
-                    0x423 => array(0x443), 0x424 => array(0x444), 0x425 => array(0x445),
1181
-                    0x426 => array(0x446), 0x427 => array(0x447), 0x428 => array(0x448),
1182
-                    0x429 => array(0x449), 0x42A => array(0x44A), 0x42B => array(0x44B),
1183
-                    0x42C => array(0x44C), 0x42D => array(0x44D), 0x42E => array(0x44E),
1184
-                    0x42F => array(0x44F), 0x460 => array(0x461), 0x462 => array(0x463),
1185
-                    0x464 => array(0x465), 0x466 => array(0x467), 0x468 => array(0x469),
1186
-                    0x46A => array(0x46B), 0x46C => array(0x46D), 0x46E => array(0x46F),
1187
-                    0x470 => array(0x471), 0x472 => array(0x473), 0x474 => array(0x475),
1188
-                    0x476 => array(0x477), 0x478 => array(0x479), 0x47A => array(0x47B),
1189
-                    0x47C => array(0x47D), 0x47E => array(0x47F), 0x480 => array(0x481),
1190
-                    0x48A => array(0x48B), 0x48C => array(0x48D), 0x48E => array(0x48F),
1191
-                    0x490 => array(0x491), 0x492 => array(0x493), 0x494 => array(0x495),
1192
-                    0x496 => array(0x497), 0x498 => array(0x499), 0x49A => array(0x49B),
1193
-                    0x49C => array(0x49D), 0x49E => array(0x49F), 0x4A0 => array(0x4A1),
1194
-                    0x4A2 => array(0x4A3), 0x4A4 => array(0x4A5), 0x4A6 => array(0x4A7),
1195
-                    0x4A8 => array(0x4A9), 0x4AA => array(0x4AB), 0x4AC => array(0x4AD),
1196
-                    0x4AE => array(0x4AF), 0x4B0 => array(0x4B1), 0x4B2 => array(0x4B3),
1197
-                    0x4B4 => array(0x4B5), 0x4B6 => array(0x4B7), 0x4B8 => array(0x4B9),
1198
-                    0x4BA => array(0x4BB), 0x4BC => array(0x4BD), 0x4BE => array(0x4BF),
1199
-                    0x4C1 => array(0x4C2), 0x4C3 => array(0x4C4), 0x4C5 => array(0x4C6),
1200
-                    0x4C7 => array(0x4C8), 0x4C9 => array(0x4CA), 0x4CB => array(0x4CC),
1201
-                    0x4CD => array(0x4CE), 0x4D0 => array(0x4D1), 0x4D2 => array(0x4D3),
1202
-                    0x4D4 => array(0x4D5), 0x4D6 => array(0x4D7), 0x4D8 => array(0x4D9),
1203
-                    0x4DA => array(0x4DB), 0x4DC => array(0x4DD), 0x4DE => array(0x4DF),
1204
-                    0x4E0 => array(0x4E1), 0x4E2 => array(0x4E3), 0x4E4 => array(0x4E5),
1205
-                    0x4E6 => array(0x4E7), 0x4E8 => array(0x4E9), 0x4EA => array(0x4EB),
1206
-                    0x4EC => array(0x4ED), 0x4EE => array(0x4EF), 0x4F0 => array(0x4F1),
1207
-                    0x4F2 => array(0x4F3), 0x4F4 => array(0x4F5), 0x4F8 => array(0x4F9),
1208
-                    0x500 => array(0x501), 0x502 => array(0x503), 0x504 => array(0x505),
1209
-                    0x506 => array(0x507), 0x508 => array(0x509), 0x50A => array(0x50B),
1210
-                    0x50C => array(0x50D), 0x50E => array(0x50F), 0x531 => array(0x561),
1211
-                    0x532 => array(0x562), 0x533 => array(0x563), 0x534 => array(0x564),
1212
-                    0x535 => array(0x565), 0x536 => array(0x566), 0x537 => array(0x567),
1213
-                    0x538 => array(0x568), 0x539 => array(0x569), 0x53A => array(0x56A),
1214
-                    0x53B => array(0x56B), 0x53C => array(0x56C), 0x53D => array(0x56D),
1215
-                    0x53E => array(0x56E), 0x53F => array(0x56F), 0x540 => array(0x570),
1216
-                    0x541 => array(0x571), 0x542 => array(0x572), 0x543 => array(0x573),
1217
-                    0x544 => array(0x574), 0x545 => array(0x575), 0x546 => array(0x576),
1218
-                    0x547 => array(0x577), 0x548 => array(0x578), 0x549 => array(0x579),
1219
-                    0x54A => array(0x57A), 0x54B => array(0x57B), 0x54C => array(0x57C),
1220
-                    0x54D => array(0x57D), 0x54E => array(0x57E), 0x54F => array(0x57F),
1221
-                    0x550 => array(0x580), 0x551 => array(0x581), 0x552 => array(0x582),
1222
-                    0x553 => array(0x583), 0x554 => array(0x584), 0x555 => array(0x585),
1223
-                    0x556 => array(0x586), 0x587 => array(0x565, 0x582), 0xE33 => array(0xE4D, 0xE32),
1224
-                    0x1E00 => array(0x1E01), 0x1E02 => array(0x1E03), 0x1E04 => array(0x1E05),
1225
-                    0x1E06 => array(0x1E07), 0x1E08 => array(0x1E09), 0x1E0A => array(0x1E0B),
1226
-                    0x1E0C => array(0x1E0D), 0x1E0E => array(0x1E0F), 0x1E10 => array(0x1E11),
1227
-                    0x1E12 => array(0x1E13), 0x1E14 => array(0x1E15), 0x1E16 => array(0x1E17),
1228
-                    0x1E18 => array(0x1E19), 0x1E1A => array(0x1E1B), 0x1E1C => array(0x1E1D),
1229
-                    0x1E1E => array(0x1E1F), 0x1E20 => array(0x1E21), 0x1E22 => array(0x1E23),
1230
-                    0x1E24 => array(0x1E25), 0x1E26 => array(0x1E27), 0x1E28 => array(0x1E29),
1231
-                    0x1E2A => array(0x1E2B), 0x1E2C => array(0x1E2D), 0x1E2E => array(0x1E2F),
1232
-                    0x1E30 => array(0x1E31), 0x1E32 => array(0x1E33), 0x1E34 => array(0x1E35),
1233
-                    0x1E36 => array(0x1E37), 0x1E38 => array(0x1E39), 0x1E3A => array(0x1E3B),
1234
-                    0x1E3C => array(0x1E3D), 0x1E3E => array(0x1E3F), 0x1E40 => array(0x1E41),
1235
-                    0x1E42 => array(0x1E43), 0x1E44 => array(0x1E45), 0x1E46 => array(0x1E47),
1236
-                    0x1E48 => array(0x1E49), 0x1E4A => array(0x1E4B), 0x1E4C => array(0x1E4D),
1237
-                    0x1E4E => array(0x1E4F), 0x1E50 => array(0x1E51), 0x1E52 => array(0x1E53),
1238
-                    0x1E54 => array(0x1E55), 0x1E56 => array(0x1E57), 0x1E58 => array(0x1E59),
1239
-                    0x1E5A => array(0x1E5B), 0x1E5C => array(0x1E5D), 0x1E5E => array(0x1E5F),
1240
-                    0x1E60 => array(0x1E61), 0x1E62 => array(0x1E63), 0x1E64 => array(0x1E65),
1241
-                    0x1E66 => array(0x1E67), 0x1E68 => array(0x1E69), 0x1E6A => array(0x1E6B),
1242
-                    0x1E6C => array(0x1E6D), 0x1E6E => array(0x1E6F), 0x1E70 => array(0x1E71),
1243
-                    0x1E72 => array(0x1E73), 0x1E74 => array(0x1E75), 0x1E76 => array(0x1E77),
1244
-                    0x1E78 => array(0x1E79), 0x1E7A => array(0x1E7B), 0x1E7C => array(0x1E7D),
1245
-                    0x1E7E => array(0x1E7F), 0x1E80 => array(0x1E81), 0x1E82 => array(0x1E83),
1246
-                    0x1E84 => array(0x1E85), 0x1E86 => array(0x1E87), 0x1E88 => array(0x1E89),
1247
-                    0x1E8A => array(0x1E8B), 0x1E8C => array(0x1E8D), 0x1E8E => array(0x1E8F),
1248
-                    0x1E90 => array(0x1E91), 0x1E92 => array(0x1E93), 0x1E94 => array(0x1E95),
1249
-                    0x1E96 => array(0x68, 0x331), 0x1E97 => array(0x74, 0x308), 0x1E98 => array(0x77, 0x30A),
1250
-                    0x1E99 => array(0x79, 0x30A), 0x1E9A => array(0x61, 0x2BE), 0x1E9B => array(0x1E61),
1251
-                    0x1EA0 => array(0x1EA1), 0x1EA2 => array(0x1EA3), 0x1EA4 => array(0x1EA5),
1252
-                    0x1EA6 => array(0x1EA7), 0x1EA8 => array(0x1EA9), 0x1EAA => array(0x1EAB),
1253
-                    0x1EAC => array(0x1EAD), 0x1EAE => array(0x1EAF), 0x1EB0 => array(0x1EB1),
1254
-                    0x1EB2 => array(0x1EB3), 0x1EB4 => array(0x1EB5), 0x1EB6 => array(0x1EB7),
1255
-                    0x1EB8 => array(0x1EB9), 0x1EBA => array(0x1EBB), 0x1EBC => array(0x1EBD),
1256
-                    0x1EBE => array(0x1EBF), 0x1EC0 => array(0x1EC1), 0x1EC2 => array(0x1EC3),
1257
-                    0x1EC4 => array(0x1EC5), 0x1EC6 => array(0x1EC7), 0x1EC8 => array(0x1EC9),
1258
-                    0x1ECA => array(0x1ECB), 0x1ECC => array(0x1ECD), 0x1ECE => array(0x1ECF),
1259
-                    0x1ED0 => array(0x1ED1), 0x1ED2 => array(0x1ED3), 0x1ED4 => array(0x1ED5),
1260
-                    0x1ED6 => array(0x1ED7), 0x1ED8 => array(0x1ED9), 0x1EDA => array(0x1EDB),
1261
-                    0x1EDC => array(0x1EDD), 0x1EDE => array(0x1EDF), 0x1EE0 => array(0x1EE1),
1262
-                    0x1EE2 => array(0x1EE3), 0x1EE4 => array(0x1EE5), 0x1EE6 => array(0x1EE7),
1263
-                    0x1EE8 => array(0x1EE9), 0x1EEA => array(0x1EEB), 0x1EEC => array(0x1EED),
1264
-                    0x1EEE => array(0x1EEF), 0x1EF0 => array(0x1EF1), 0x1EF2 => array(0x1EF3),
1265
-                    0x1EF4 => array(0x1EF5), 0x1EF6 => array(0x1EF7), 0x1EF8 => array(0x1EF9),
1266
-                    0x1F08 => array(0x1F00), 0x1F09 => array(0x1F01), 0x1F0A => array(0x1F02),
1267
-                    0x1F0B => array(0x1F03), 0x1F0C => array(0x1F04), 0x1F0D => array(0x1F05),
1268
-                    0x1F0E => array(0x1F06), 0x1F0F => array(0x1F07), 0x1F18 => array(0x1F10),
1269
-                    0x1F19 => array(0x1F11), 0x1F1A => array(0x1F12), 0x1F1B => array(0x1F13),
1270
-                    0x1F1C => array(0x1F14), 0x1F1D => array(0x1F15), 0x1F28 => array(0x1F20),
1271
-                    0x1F29 => array(0x1F21), 0x1F2A => array(0x1F22), 0x1F2B => array(0x1F23),
1272
-                    0x1F2C => array(0x1F24), 0x1F2D => array(0x1F25), 0x1F2E => array(0x1F26),
1273
-                    0x1F2F => array(0x1F27), 0x1F38 => array(0x1F30), 0x1F39 => array(0x1F31),
1274
-                    0x1F3A => array(0x1F32), 0x1F3B => array(0x1F33), 0x1F3C => array(0x1F34),
1275
-                    0x1F3D => array(0x1F35), 0x1F3E => array(0x1F36), 0x1F3F => array(0x1F37),
1276
-                    0x1F48 => array(0x1F40), 0x1F49 => array(0x1F41), 0x1F4A => array(0x1F42),
1277
-                    0x1F4B => array(0x1F43), 0x1F4C => array(0x1F44), 0x1F4D => array(0x1F45),
1278
-                    0x1F50 => array(0x3C5, 0x313), 0x1F52 => array(0x3C5, 0x313, 0x300),
1279
-                    0x1F54 => array(0x3C5, 0x313, 0x301), 0x1F56 => array(0x3C5, 0x313, 0x342),
1280
-                    0x1F59 => array(0x1F51), 0x1F5B => array(0x1F53), 0x1F5D => array(0x1F55),
1281
-                    0x1F5F => array(0x1F57), 0x1F68 => array(0x1F60), 0x1F69 => array(0x1F61),
1282
-                    0x1F6A => array(0x1F62), 0x1F6B => array(0x1F63), 0x1F6C => array(0x1F64),
1283
-                    0x1F6D => array(0x1F65), 0x1F6E => array(0x1F66), 0x1F6F => array(0x1F67),
1284
-                    0x1F80 => array(0x1F00, 0x3B9), 0x1F81 => array(0x1F01, 0x3B9),
1285
-                    0x1F82 => array(0x1F02, 0x3B9), 0x1F83 => array(0x1F03, 0x3B9),
1286
-                    0x1F84 => array(0x1F04, 0x3B9), 0x1F85 => array(0x1F05, 0x3B9),
1287
-                    0x1F86 => array(0x1F06, 0x3B9), 0x1F87 => array(0x1F07, 0x3B9),
1288
-                    0x1F88 => array(0x1F00, 0x3B9), 0x1F89 => array(0x1F01, 0x3B9),
1289
-                    0x1F8A => array(0x1F02, 0x3B9), 0x1F8B => array(0x1F03, 0x3B9),
1290
-                    0x1F8C => array(0x1F04, 0x3B9), 0x1F8D => array(0x1F05, 0x3B9),
1291
-                    0x1F8E => array(0x1F06, 0x3B9), 0x1F8F => array(0x1F07, 0x3B9),
1292
-                    0x1F90 => array(0x1F20, 0x3B9), 0x1F91 => array(0x1F21, 0x3B9),
1293
-                    0x1F92 => array(0x1F22, 0x3B9), 0x1F93 => array(0x1F23, 0x3B9),
1294
-                    0x1F94 => array(0x1F24, 0x3B9), 0x1F95 => array(0x1F25, 0x3B9),
1295
-                    0x1F96 => array(0x1F26, 0x3B9), 0x1F97 => array(0x1F27, 0x3B9),
1296
-                    0x1F98 => array(0x1F20, 0x3B9), 0x1F99 => array(0x1F21, 0x3B9),
1297
-                    0x1F9A => array(0x1F22, 0x3B9), 0x1F9B => array(0x1F23, 0x3B9),
1298
-                    0x1F9C => array(0x1F24, 0x3B9), 0x1F9D => array(0x1F25, 0x3B9),
1299
-                    0x1F9E => array(0x1F26, 0x3B9), 0x1F9F => array(0x1F27, 0x3B9),
1300
-                    0x1FA0 => array(0x1F60, 0x3B9), 0x1FA1 => array(0x1F61, 0x3B9),
1301
-                    0x1FA2 => array(0x1F62, 0x3B9), 0x1FA3 => array(0x1F63, 0x3B9),
1302
-                    0x1FA4 => array(0x1F64, 0x3B9), 0x1FA5 => array(0x1F65, 0x3B9),
1303
-                    0x1FA6 => array(0x1F66, 0x3B9), 0x1FA7 => array(0x1F67, 0x3B9),
1304
-                    0x1FA8 => array(0x1F60, 0x3B9), 0x1FA9 => array(0x1F61, 0x3B9),
1305
-                    0x1FAA => array(0x1F62, 0x3B9), 0x1FAB => array(0x1F63, 0x3B9),
1306
-                    0x1FAC => array(0x1F64, 0x3B9), 0x1FAD => array(0x1F65, 0x3B9),
1307
-                    0x1FAE => array(0x1F66, 0x3B9), 0x1FAF => array(0x1F67, 0x3B9),
1308
-                    0x1FB2 => array(0x1F70, 0x3B9), 0x1FB3 => array(0x3B1, 0x3B9),
1309
-                    0x1FB4 => array(0x3AC, 0x3B9), 0x1FB6 => array(0x3B1, 0x342),
1310
-                    0x1FB7 => array(0x3B1, 0x342, 0x3B9), 0x1FB8 => array(0x1FB0),
1311
-                    0x1FB9 => array(0x1FB1), 0x1FBA => array(0x1F70), 0x1FBB => array(0x1F71),
1312
-                    0x1FBC => array(0x3B1, 0x3B9), 0x1FBE => array(0x3B9),
1313
-                    0x1FC2 => array(0x1F74, 0x3B9), 0x1FC3 => array(0x3B7, 0x3B9),
1314
-                    0x1FC4 => array(0x3AE, 0x3B9), 0x1FC6 => array(0x3B7, 0x342),
1315
-                    0x1FC7 => array(0x3B7, 0x342, 0x3B9), 0x1FC8 => array(0x1F72),
1316
-                    0x1FC9 => array(0x1F73), 0x1FCA => array(0x1F74), 0x1FCB => array(0x1F75),
1317
-                    0x1FCC => array(0x3B7, 0x3B9), 0x1FD2 => array(0x3B9, 0x308, 0x300),
1318
-                    0x1FD3 => array(0x3B9, 0x308, 0x301), 0x1FD6 => array(0x3B9, 0x342),
1319
-                    0x1FD7 => array(0x3B9, 0x308, 0x342), 0x1FD8 => array(0x1FD0),
1320
-                    0x1FD9 => array(0x1FD1), 0x1FDA => array(0x1F76),
1321
-                    0x1FDB => array(0x1F77), 0x1FE2 => array(0x3C5, 0x308, 0x300),
1322
-                    0x1FE3 => array(0x3C5, 0x308, 0x301), 0x1FE4 => array(0x3C1, 0x313),
1323
-                    0x1FE6 => array(0x3C5, 0x342), 0x1FE7 => array(0x3C5, 0x308, 0x342),
1324
-                    0x1FE8 => array(0x1FE0), 0x1FE9 => array(0x1FE1),
1325
-                    0x1FEA => array(0x1F7A), 0x1FEB => array(0x1F7B),
1326
-                    0x1FEC => array(0x1FE5), 0x1FF2 => array(0x1F7C, 0x3B9),
1327
-                    0x1FF3 => array(0x3C9, 0x3B9), 0x1FF4 => array(0x3CE, 0x3B9),
1328
-                    0x1FF6 => array(0x3C9, 0x342), 0x1FF7 => array(0x3C9, 0x342, 0x3B9),
1329
-                    0x1FF8 => array(0x1F78), 0x1FF9 => array(0x1F79), 0x1FFA => array(0x1F7C),
1330
-                    0x1FFB => array(0x1F7D), 0x1FFC => array(0x3C9, 0x3B9),
1331
-                    0x20A8 => array(0x72, 0x73), 0x2102 => array(0x63), 0x2103 => array(0xB0, 0x63),
1332
-                    0x2107 => array(0x25B), 0x2109 => array(0xB0, 0x66), 0x210B => array(0x68),
1333
-                    0x210C => array(0x68), 0x210D => array(0x68), 0x2110 => array(0x69),
1334
-                    0x2111 => array(0x69), 0x2112 => array(0x6C), 0x2115 => array(0x6E),
1335
-                    0x2116 => array(0x6E, 0x6F), 0x2119 => array(0x70), 0x211A => array(0x71),
1336
-                    0x211B => array(0x72), 0x211C => array(0x72), 0x211D => array(0x72),
1337
-                    0x2120 => array(0x73, 0x6D), 0x2121 => array(0x74, 0x65, 0x6C),
1338
-                    0x2122 => array(0x74, 0x6D), 0x2124 => array(0x7A), 0x2126 => array(0x3C9),
1339
-                    0x2128 => array(0x7A), 0x212A => array(0x6B), 0x212B => array(0xE5),
1340
-                    0x212C => array(0x62), 0x212D => array(0x63), 0x2130 => array(0x65),
1341
-                    0x2131 => array(0x66), 0x2133 => array(0x6D), 0x213E => array(0x3B3),
1342
-                    0x213F => array(0x3C0), 0x2145 => array(0x64), 0x2160 => array(0x2170),
1343
-                    0x2161 => array(0x2171), 0x2162 => array(0x2172), 0x2163 => array(0x2173),
1344
-                    0x2164 => array(0x2174), 0x2165 => array(0x2175), 0x2166 => array(0x2176),
1345
-                    0x2167 => array(0x2177), 0x2168 => array(0x2178), 0x2169 => array(0x2179),
1346
-                    0x216A => array(0x217A), 0x216B => array(0x217B), 0x216C => array(0x217C),
1347
-                    0x216D => array(0x217D), 0x216E => array(0x217E), 0x216F => array(0x217F),
1348
-                    0x24B6 => array(0x24D0), 0x24B7 => array(0x24D1), 0x24B8 => array(0x24D2),
1349
-                    0x24B9 => array(0x24D3), 0x24BA => array(0x24D4), 0x24BB => array(0x24D5),
1350
-                    0x24BC => array(0x24D6), 0x24BD => array(0x24D7), 0x24BE => array(0x24D8),
1351
-                    0x24BF => array(0x24D9), 0x24C0 => array(0x24DA), 0x24C1 => array(0x24DB),
1352
-                    0x24C2 => array(0x24DC), 0x24C3 => array(0x24DD), 0x24C4 => array(0x24DE),
1353
-                    0x24C5 => array(0x24DF), 0x24C6 => array(0x24E0), 0x24C7 => array(0x24E1),
1354
-                    0x24C8 => array(0x24E2), 0x24C9 => array(0x24E3), 0x24CA => array(0x24E4),
1355
-                    0x24CB => array(0x24E5), 0x24CC => array(0x24E6), 0x24CD => array(0x24E7),
1356
-                    0x24CE => array(0x24E8), 0x24CF => array(0x24E9), 0x3371 => array(0x68, 0x70, 0x61),
1357
-                    0x3373 => array(0x61, 0x75), 0x3375 => array(0x6F, 0x76),
1358
-                    0x3380 => array(0x70, 0x61), 0x3381 => array(0x6E, 0x61),
1359
-                    0x3382 => array(0x3BC, 0x61), 0x3383 => array(0x6D, 0x61),
1360
-                    0x3384 => array(0x6B, 0x61), 0x3385 => array(0x6B, 0x62),
1361
-                    0x3386 => array(0x6D, 0x62), 0x3387 => array(0x67, 0x62),
1362
-                    0x338A => array(0x70, 0x66), 0x338B => array(0x6E, 0x66),
1363
-                    0x338C => array(0x3BC, 0x66), 0x3390 => array(0x68, 0x7A),
1364
-                    0x3391 => array(0x6B, 0x68, 0x7A), 0x3392 => array(0x6D, 0x68, 0x7A),
1365
-                    0x3393 => array(0x67, 0x68, 0x7A), 0x3394 => array(0x74, 0x68, 0x7A),
1366
-                    0x33A9 => array(0x70, 0x61), 0x33AA => array(0x6B, 0x70, 0x61),
1367
-                    0x33AB => array(0x6D, 0x70, 0x61), 0x33AC => array(0x67, 0x70, 0x61),
1368
-                    0x33B4 => array(0x70, 0x76), 0x33B5 => array(0x6E, 0x76),
1369
-                    0x33B6 => array(0x3BC, 0x76), 0x33B7 => array(0x6D, 0x76),
1370
-                    0x33B8 => array(0x6B, 0x76), 0x33B9 => array(0x6D, 0x76),
1371
-                    0x33BA => array(0x70, 0x77), 0x33BB => array(0x6E, 0x77),
1372
-                    0x33BC => array(0x3BC, 0x77), 0x33BD => array(0x6D, 0x77),
1373
-                    0x33BE => array(0x6B, 0x77), 0x33BF => array(0x6D, 0x77),
1374
-                    0x33C0 => array(0x6B, 0x3C9), 0x33C1 => array(0x6D, 0x3C9), /*
1051
+	/**
1052
+	 * Holds all relevant mapping tables
1053
+	 * See RFC3454 for details
1054
+	 *
1055
+	 * @private array
1056
+	 * @since 0.5.2
1057
+	 */
1058
+	protected static $NP = array(
1059
+			'map_nothing' => array(0xAD, 0x34F, 0x1806, 0x180B, 0x180C, 0x180D, 0x200B, 0x200C,
1060
+					0x200D, 0x2060, 0xFE00, 0xFE01, 0xFE02, 0xFE03, 0xFE04, 0xFE05, 0xFE06, 0xFE07,
1061
+					0xFE08, 0xFE09, 0xFE0A, 0xFE0B, 0xFE0C, 0xFE0D, 0xFE0E, 0xFE0F, 0xFEFF
1062
+			),
1063
+			'general_prohibited' => array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
1064
+					20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42,
1065
+					43, 44, 47, 59, 60, 61, 62, 63, 64, 91, 92, 93, 94, 95, 96, 123, 124, 125, 126, 127, 0x3002
1066
+			),
1067
+			'prohibit' => array(0xA0, 0x340, 0x341, 0x6DD, 0x70F, 0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003,
1068
+					0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x200B, 0x200C, 0x200D, 0x200E, 0x200F,
1069
+					0x2028, 0x2029, 0x202A, 0x202B, 0x202C, 0x202D, 0x202E, 0x202F, 0x205F, 0x206A, 0x206B, 0x206C,
1070
+					0x206D, 0x206E, 0x206F, 0x3000, 0x33C2, 0xFEFF, 0xFFF9, 0xFFFA, 0xFFFB, 0xFFFC, 0xFFFD, 0xFFFE, 0xFFFF,
1071
+					0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, 0x6FFFE,
1072
+					0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, 0xBFFFF,
1073
+					0xCFFFE, 0xCFFFF, 0xDFFFE, 0xDFFFF, 0xE0001, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, 0x10FFFE, 0x10FFFF
1074
+			),
1075
+			'prohibit_ranges' => array(array(0x80, 0x9F), array(0x2060, 0x206F), array(0x1D173, 0x1D17A),
1076
+					array(0xE000, 0xF8FF), array(0xF0000, 0xFFFFD), array(0x100000, 0x10FFFD),
1077
+					array(0xFDD0, 0xFDEF), array(0xD800, 0xDFFF), array(0x2FF0, 0x2FFB), array(0xE0020, 0xE007F)
1078
+			),
1079
+			'replacemaps_2003' => array(0x41 => array(0x61), 0x42 => array(0x62), 0x43 => array(0x63),
1080
+					0x44 => array(0x64), 0x45 => array(0x65), 0x46 => array(0x66), 0x47 => array(0x67),
1081
+					0x48 => array(0x68), 0x49 => array(0x69), 0x4A => array(0x6A), 0x4B => array(0x6B),
1082
+					0x4C => array(0x6C), 0x4D => array(0x6D), 0x4E => array(0x6E), 0x4F => array(0x6F),
1083
+					0x50 => array(0x70), 0x51 => array(0x71), 0x52 => array(0x72), 0x53 => array(0x73),
1084
+					0x54 => array(0x74), 0x55 => array(0x75), 0x56 => array(0x76), 0x57 => array(0x77),
1085
+					0x58 => array(0x78), 0x59 => array(0x79), 0x5A => array(0x7A), 0xB5 => array(0x3BC),
1086
+					0xC0 => array(0xE0), 0xC1 => array(0xE1), 0xC2 => array(0xE2), 0xC3 => array(0xE3),
1087
+					0xC4 => array(0xE4), 0xC5 => array(0xE5), 0xC6 => array(0xE6), 0xC7 => array(0xE7),
1088
+					0xC8 => array(0xE8), 0xC9 => array(0xE9), 0xCA => array(0xEA), 0xCB => array(0xEB),
1089
+					0xCC => array(0xEC), 0xCD => array(0xED), 0xCE => array(0xEE), 0xCF => array(0xEF),
1090
+					0xD0 => array(0xF0), 0xD1 => array(0xF1), 0xD2 => array(0xF2), 0xD3 => array(0xF3),
1091
+					0xD4 => array(0xF4), 0xD5 => array(0xF5), 0xD6 => array(0xF6), 0xD8 => array(0xF8),
1092
+					0xD9 => array(0xF9), 0xDA => array(0xFA), 0xDB => array(0xFB), 0xDC => array(0xFC),
1093
+					0xDD => array(0xFD), 0xDE => array(0xFE), 0xDF => array(0x73, 0x73),
1094
+					0x100 => array(0x101), 0x102 => array(0x103), 0x104 => array(0x105),
1095
+					0x106 => array(0x107), 0x108 => array(0x109), 0x10A => array(0x10B),
1096
+					0x10C => array(0x10D), 0x10E => array(0x10F), 0x110 => array(0x111),
1097
+					0x112 => array(0x113), 0x114 => array(0x115), 0x116 => array(0x117),
1098
+					0x118 => array(0x119), 0x11A => array(0x11B), 0x11C => array(0x11D),
1099
+					0x11E => array(0x11F), 0x120 => array(0x121), 0x122 => array(0x123),
1100
+					0x124 => array(0x125), 0x126 => array(0x127), 0x128 => array(0x129),
1101
+					0x12A => array(0x12B), 0x12C => array(0x12D), 0x12E => array(0x12F),
1102
+					0x130 => array(0x69, 0x307), 0x132 => array(0x133), 0x134 => array(0x135),
1103
+					0x136 => array(0x137), 0x139 => array(0x13A), 0x13B => array(0x13C),
1104
+					0x13D => array(0x13E), 0x13F => array(0x140), 0x141 => array(0x142),
1105
+					0x143 => array(0x144), 0x145 => array(0x146), 0x147 => array(0x148),
1106
+					0x149 => array(0x2BC, 0x6E), 0x14A => array(0x14B), 0x14C => array(0x14D),
1107
+					0x14E => array(0x14F), 0x150 => array(0x151), 0x152 => array(0x153),
1108
+					0x154 => array(0x155), 0x156 => array(0x157), 0x158 => array(0x159),
1109
+					0x15A => array(0x15B), 0x15C => array(0x15D), 0x15E => array(0x15F),
1110
+					0x160 => array(0x161), 0x162 => array(0x163), 0x164 => array(0x165),
1111
+					0x166 => array(0x167), 0x168 => array(0x169), 0x16A => array(0x16B),
1112
+					0x16C => array(0x16D), 0x16E => array(0x16F), 0x170 => array(0x171),
1113
+					0x172 => array(0x173), 0x174 => array(0x175), 0x176 => array(0x177),
1114
+					0x178 => array(0xFF), 0x179 => array(0x17A), 0x17B => array(0x17C),
1115
+					0x17D => array(0x17E), 0x17F => array(0x73), 0x181 => array(0x253),
1116
+					0x182 => array(0x183), 0x184 => array(0x185), 0x186 => array(0x254),
1117
+					0x187 => array(0x188), 0x189 => array(0x256), 0x18A => array(0x257),
1118
+					0x18B => array(0x18C), 0x18E => array(0x1DD), 0x18F => array(0x259),
1119
+					0x190 => array(0x25B), 0x191 => array(0x192), 0x193 => array(0x260),
1120
+					0x194 => array(0x263), 0x196 => array(0x269), 0x197 => array(0x268),
1121
+					0x198 => array(0x199), 0x19C => array(0x26F), 0x19D => array(0x272),
1122
+					0x19F => array(0x275), 0x1A0 => array(0x1A1), 0x1A2 => array(0x1A3),
1123
+					0x1A4 => array(0x1A5), 0x1A6 => array(0x280), 0x1A7 => array(0x1A8),
1124
+					0x1A9 => array(0x283), 0x1AC => array(0x1AD), 0x1AE => array(0x288),
1125
+					0x1AF => array(0x1B0), 0x1B1 => array(0x28A), 0x1B2 => array(0x28B),
1126
+					0x1B3 => array(0x1B4), 0x1B5 => array(0x1B6), 0x1B7 => array(0x292),
1127
+					0x1B8 => array(0x1B9), 0x1BC => array(0x1BD), 0x1C4 => array(0x1C6),
1128
+					0x1C5 => array(0x1C6), 0x1C7 => array(0x1C9), 0x1C8 => array(0x1C9),
1129
+					0x1CA => array(0x1CC), 0x1CB => array(0x1CC), 0x1CD => array(0x1CE),
1130
+					0x1CF => array(0x1D0), 0x1D1 => array(0x1D2), 0x1D3 => array(0x1D4),
1131
+					0x1D5 => array(0x1D6), 0x1D7 => array(0x1D8), 0x1D9 => array(0x1DA),
1132
+					0x1DB => array(0x1DC), 0x1DE => array(0x1DF), 0x1E0 => array(0x1E1),
1133
+					0x1E2 => array(0x1E3), 0x1E4 => array(0x1E5), 0x1E6 => array(0x1E7),
1134
+					0x1E8 => array(0x1E9), 0x1EA => array(0x1EB), 0x1EC => array(0x1ED),
1135
+					0x1EE => array(0x1EF), 0x1F0 => array(0x6A, 0x30C), 0x1F1 => array(0x1F3),
1136
+					0x1F2 => array(0x1F3), 0x1F4 => array(0x1F5), 0x1F6 => array(0x195),
1137
+					0x1F7 => array(0x1BF), 0x1F8 => array(0x1F9), 0x1FA => array(0x1FB),
1138
+					0x1FC => array(0x1FD), 0x1FE => array(0x1FF), 0x200 => array(0x201),
1139
+					0x202 => array(0x203), 0x204 => array(0x205), 0x206 => array(0x207),
1140
+					0x208 => array(0x209), 0x20A => array(0x20B), 0x20C => array(0x20D),
1141
+					0x20E => array(0x20F), 0x210 => array(0x211), 0x212 => array(0x213),
1142
+					0x214 => array(0x215), 0x216 => array(0x217), 0x218 => array(0x219),
1143
+					0x21A => array(0x21B), 0x21C => array(0x21D), 0x21E => array(0x21F),
1144
+					0x220 => array(0x19E), 0x222 => array(0x223), 0x224 => array(0x225),
1145
+					0x226 => array(0x227), 0x228 => array(0x229), 0x22A => array(0x22B),
1146
+					0x22C => array(0x22D), 0x22E => array(0x22F), 0x230 => array(0x231),
1147
+					0x232 => array(0x233), 0x345 => array(0x3B9), 0x37A => array(0x20, 0x3B9),
1148
+					0x386 => array(0x3AC), 0x388 => array(0x3AD), 0x389 => array(0x3AE),
1149
+					0x38A => array(0x3AF), 0x38C => array(0x3CC), 0x38E => array(0x3CD),
1150
+					0x38F => array(0x3CE), 0x390 => array(0x3B9, 0x308, 0x301),
1151
+					0x391 => array(0x3B1), 0x392 => array(0x3B2), 0x393 => array(0x3B3),
1152
+					0x394 => array(0x3B4), 0x395 => array(0x3B5), 0x396 => array(0x3B6),
1153
+					0x397 => array(0x3B7), 0x398 => array(0x3B8), 0x399 => array(0x3B9),
1154
+					0x39A => array(0x3BA), 0x39B => array(0x3BB), 0x39C => array(0x3BC),
1155
+					0x39D => array(0x3BD), 0x39E => array(0x3BE), 0x39F => array(0x3BF),
1156
+					0x3A0 => array(0x3C0), 0x3A1 => array(0x3C1), 0x3A3 => array(0x3C3),
1157
+					0x3A4 => array(0x3C4), 0x3A5 => array(0x3C5), 0x3A6 => array(0x3C6),
1158
+					0x3A7 => array(0x3C7), 0x3A8 => array(0x3C8), 0x3A9 => array(0x3C9),
1159
+					0x3AA => array(0x3CA), 0x3AB => array(0x3CB), 0x3B0 => array(0x3C5, 0x308, 0x301),
1160
+					0x3C2 => array(0x3C3), 0x3D0 => array(0x3B2), 0x3D1 => array(0x3B8),
1161
+					0x3D2 => array(0x3C5), 0x3D3 => array(0x3CD), 0x3D4 => array(0x3CB),
1162
+					0x3D5 => array(0x3C6), 0x3D6 => array(0x3C0), 0x3D8 => array(0x3D9),
1163
+					0x3DA => array(0x3DB), 0x3DC => array(0x3DD), 0x3DE => array(0x3DF),
1164
+					0x3E0 => array(0x3E1), 0x3E2 => array(0x3E3), 0x3E4 => array(0x3E5),
1165
+					0x3E6 => array(0x3E7), 0x3E8 => array(0x3E9), 0x3EA => array(0x3EB),
1166
+					0x3EC => array(0x3ED), 0x3EE => array(0x3EF), 0x3F0 => array(0x3BA),
1167
+					0x3F1 => array(0x3C1), 0x3F2 => array(0x3C3), 0x3F4 => array(0x3B8),
1168
+					0x3F5 => array(0x3B5), 0x400 => array(0x450), 0x401 => array(0x451),
1169
+					0x402 => array(0x452), 0x403 => array(0x453), 0x404 => array(0x454),
1170
+					0x405 => array(0x455), 0x406 => array(0x456), 0x407 => array(0x457),
1171
+					0x408 => array(0x458), 0x409 => array(0x459), 0x40A => array(0x45A),
1172
+					0x40B => array(0x45B), 0x40C => array(0x45C), 0x40D => array(0x45D),
1173
+					0x40E => array(0x45E), 0x40F => array(0x45F), 0x410 => array(0x430),
1174
+					0x411 => array(0x431), 0x412 => array(0x432), 0x413 => array(0x433),
1175
+					0x414 => array(0x434), 0x415 => array(0x435), 0x416 => array(0x436),
1176
+					0x417 => array(0x437), 0x418 => array(0x438), 0x419 => array(0x439),
1177
+					0x41A => array(0x43A), 0x41B => array(0x43B), 0x41C => array(0x43C),
1178
+					0x41D => array(0x43D), 0x41E => array(0x43E), 0x41F => array(0x43F),
1179
+					0x420 => array(0x440), 0x421 => array(0x441), 0x422 => array(0x442),
1180
+					0x423 => array(0x443), 0x424 => array(0x444), 0x425 => array(0x445),
1181
+					0x426 => array(0x446), 0x427 => array(0x447), 0x428 => array(0x448),
1182
+					0x429 => array(0x449), 0x42A => array(0x44A), 0x42B => array(0x44B),
1183
+					0x42C => array(0x44C), 0x42D => array(0x44D), 0x42E => array(0x44E),
1184
+					0x42F => array(0x44F), 0x460 => array(0x461), 0x462 => array(0x463),
1185
+					0x464 => array(0x465), 0x466 => array(0x467), 0x468 => array(0x469),
1186
+					0x46A => array(0x46B), 0x46C => array(0x46D), 0x46E => array(0x46F),
1187
+					0x470 => array(0x471), 0x472 => array(0x473), 0x474 => array(0x475),
1188
+					0x476 => array(0x477), 0x478 => array(0x479), 0x47A => array(0x47B),
1189
+					0x47C => array(0x47D), 0x47E => array(0x47F), 0x480 => array(0x481),
1190
+					0x48A => array(0x48B), 0x48C => array(0x48D), 0x48E => array(0x48F),
1191
+					0x490 => array(0x491), 0x492 => array(0x493), 0x494 => array(0x495),
1192
+					0x496 => array(0x497), 0x498 => array(0x499), 0x49A => array(0x49B),
1193
+					0x49C => array(0x49D), 0x49E => array(0x49F), 0x4A0 => array(0x4A1),
1194
+					0x4A2 => array(0x4A3), 0x4A4 => array(0x4A5), 0x4A6 => array(0x4A7),
1195
+					0x4A8 => array(0x4A9), 0x4AA => array(0x4AB), 0x4AC => array(0x4AD),
1196
+					0x4AE => array(0x4AF), 0x4B0 => array(0x4B1), 0x4B2 => array(0x4B3),
1197
+					0x4B4 => array(0x4B5), 0x4B6 => array(0x4B7), 0x4B8 => array(0x4B9),
1198
+					0x4BA => array(0x4BB), 0x4BC => array(0x4BD), 0x4BE => array(0x4BF),
1199
+					0x4C1 => array(0x4C2), 0x4C3 => array(0x4C4), 0x4C5 => array(0x4C6),
1200
+					0x4C7 => array(0x4C8), 0x4C9 => array(0x4CA), 0x4CB => array(0x4CC),
1201
+					0x4CD => array(0x4CE), 0x4D0 => array(0x4D1), 0x4D2 => array(0x4D3),
1202
+					0x4D4 => array(0x4D5), 0x4D6 => array(0x4D7), 0x4D8 => array(0x4D9),
1203
+					0x4DA => array(0x4DB), 0x4DC => array(0x4DD), 0x4DE => array(0x4DF),
1204
+					0x4E0 => array(0x4E1), 0x4E2 => array(0x4E3), 0x4E4 => array(0x4E5),
1205
+					0x4E6 => array(0x4E7), 0x4E8 => array(0x4E9), 0x4EA => array(0x4EB),
1206
+					0x4EC => array(0x4ED), 0x4EE => array(0x4EF), 0x4F0 => array(0x4F1),
1207
+					0x4F2 => array(0x4F3), 0x4F4 => array(0x4F5), 0x4F8 => array(0x4F9),
1208
+					0x500 => array(0x501), 0x502 => array(0x503), 0x504 => array(0x505),
1209
+					0x506 => array(0x507), 0x508 => array(0x509), 0x50A => array(0x50B),
1210
+					0x50C => array(0x50D), 0x50E => array(0x50F), 0x531 => array(0x561),
1211
+					0x532 => array(0x562), 0x533 => array(0x563), 0x534 => array(0x564),
1212
+					0x535 => array(0x565), 0x536 => array(0x566), 0x537 => array(0x567),
1213
+					0x538 => array(0x568), 0x539 => array(0x569), 0x53A => array(0x56A),
1214
+					0x53B => array(0x56B), 0x53C => array(0x56C), 0x53D => array(0x56D),
1215
+					0x53E => array(0x56E), 0x53F => array(0x56F), 0x540 => array(0x570),
1216
+					0x541 => array(0x571), 0x542 => array(0x572), 0x543 => array(0x573),
1217
+					0x544 => array(0x574), 0x545 => array(0x575), 0x546 => array(0x576),
1218
+					0x547 => array(0x577), 0x548 => array(0x578), 0x549 => array(0x579),
1219
+					0x54A => array(0x57A), 0x54B => array(0x57B), 0x54C => array(0x57C),
1220
+					0x54D => array(0x57D), 0x54E => array(0x57E), 0x54F => array(0x57F),
1221
+					0x550 => array(0x580), 0x551 => array(0x581), 0x552 => array(0x582),
1222
+					0x553 => array(0x583), 0x554 => array(0x584), 0x555 => array(0x585),
1223
+					0x556 => array(0x586), 0x587 => array(0x565, 0x582), 0xE33 => array(0xE4D, 0xE32),
1224
+					0x1E00 => array(0x1E01), 0x1E02 => array(0x1E03), 0x1E04 => array(0x1E05),
1225
+					0x1E06 => array(0x1E07), 0x1E08 => array(0x1E09), 0x1E0A => array(0x1E0B),
1226
+					0x1E0C => array(0x1E0D), 0x1E0E => array(0x1E0F), 0x1E10 => array(0x1E11),
1227
+					0x1E12 => array(0x1E13), 0x1E14 => array(0x1E15), 0x1E16 => array(0x1E17),
1228
+					0x1E18 => array(0x1E19), 0x1E1A => array(0x1E1B), 0x1E1C => array(0x1E1D),
1229
+					0x1E1E => array(0x1E1F), 0x1E20 => array(0x1E21), 0x1E22 => array(0x1E23),
1230
+					0x1E24 => array(0x1E25), 0x1E26 => array(0x1E27), 0x1E28 => array(0x1E29),
1231
+					0x1E2A => array(0x1E2B), 0x1E2C => array(0x1E2D), 0x1E2E => array(0x1E2F),
1232
+					0x1E30 => array(0x1E31), 0x1E32 => array(0x1E33), 0x1E34 => array(0x1E35),
1233
+					0x1E36 => array(0x1E37), 0x1E38 => array(0x1E39), 0x1E3A => array(0x1E3B),
1234
+					0x1E3C => array(0x1E3D), 0x1E3E => array(0x1E3F), 0x1E40 => array(0x1E41),
1235
+					0x1E42 => array(0x1E43), 0x1E44 => array(0x1E45), 0x1E46 => array(0x1E47),
1236
+					0x1E48 => array(0x1E49), 0x1E4A => array(0x1E4B), 0x1E4C => array(0x1E4D),
1237
+					0x1E4E => array(0x1E4F), 0x1E50 => array(0x1E51), 0x1E52 => array(0x1E53),
1238
+					0x1E54 => array(0x1E55), 0x1E56 => array(0x1E57), 0x1E58 => array(0x1E59),
1239
+					0x1E5A => array(0x1E5B), 0x1E5C => array(0x1E5D), 0x1E5E => array(0x1E5F),
1240
+					0x1E60 => array(0x1E61), 0x1E62 => array(0x1E63), 0x1E64 => array(0x1E65),
1241
+					0x1E66 => array(0x1E67), 0x1E68 => array(0x1E69), 0x1E6A => array(0x1E6B),
1242
+					0x1E6C => array(0x1E6D), 0x1E6E => array(0x1E6F), 0x1E70 => array(0x1E71),
1243
+					0x1E72 => array(0x1E73), 0x1E74 => array(0x1E75), 0x1E76 => array(0x1E77),
1244
+					0x1E78 => array(0x1E79), 0x1E7A => array(0x1E7B), 0x1E7C => array(0x1E7D),
1245
+					0x1E7E => array(0x1E7F), 0x1E80 => array(0x1E81), 0x1E82 => array(0x1E83),
1246
+					0x1E84 => array(0x1E85), 0x1E86 => array(0x1E87), 0x1E88 => array(0x1E89),
1247
+					0x1E8A => array(0x1E8B), 0x1E8C => array(0x1E8D), 0x1E8E => array(0x1E8F),
1248
+					0x1E90 => array(0x1E91), 0x1E92 => array(0x1E93), 0x1E94 => array(0x1E95),
1249
+					0x1E96 => array(0x68, 0x331), 0x1E97 => array(0x74, 0x308), 0x1E98 => array(0x77, 0x30A),
1250
+					0x1E99 => array(0x79, 0x30A), 0x1E9A => array(0x61, 0x2BE), 0x1E9B => array(0x1E61),
1251
+					0x1EA0 => array(0x1EA1), 0x1EA2 => array(0x1EA3), 0x1EA4 => array(0x1EA5),
1252
+					0x1EA6 => array(0x1EA7), 0x1EA8 => array(0x1EA9), 0x1EAA => array(0x1EAB),
1253
+					0x1EAC => array(0x1EAD), 0x1EAE => array(0x1EAF), 0x1EB0 => array(0x1EB1),
1254
+					0x1EB2 => array(0x1EB3), 0x1EB4 => array(0x1EB5), 0x1EB6 => array(0x1EB7),
1255
+					0x1EB8 => array(0x1EB9), 0x1EBA => array(0x1EBB), 0x1EBC => array(0x1EBD),
1256
+					0x1EBE => array(0x1EBF), 0x1EC0 => array(0x1EC1), 0x1EC2 => array(0x1EC3),
1257
+					0x1EC4 => array(0x1EC5), 0x1EC6 => array(0x1EC7), 0x1EC8 => array(0x1EC9),
1258
+					0x1ECA => array(0x1ECB), 0x1ECC => array(0x1ECD), 0x1ECE => array(0x1ECF),
1259
+					0x1ED0 => array(0x1ED1), 0x1ED2 => array(0x1ED3), 0x1ED4 => array(0x1ED5),
1260
+					0x1ED6 => array(0x1ED7), 0x1ED8 => array(0x1ED9), 0x1EDA => array(0x1EDB),
1261
+					0x1EDC => array(0x1EDD), 0x1EDE => array(0x1EDF), 0x1EE0 => array(0x1EE1),
1262
+					0x1EE2 => array(0x1EE3), 0x1EE4 => array(0x1EE5), 0x1EE6 => array(0x1EE7),
1263
+					0x1EE8 => array(0x1EE9), 0x1EEA => array(0x1EEB), 0x1EEC => array(0x1EED),
1264
+					0x1EEE => array(0x1EEF), 0x1EF0 => array(0x1EF1), 0x1EF2 => array(0x1EF3),
1265
+					0x1EF4 => array(0x1EF5), 0x1EF6 => array(0x1EF7), 0x1EF8 => array(0x1EF9),
1266
+					0x1F08 => array(0x1F00), 0x1F09 => array(0x1F01), 0x1F0A => array(0x1F02),
1267
+					0x1F0B => array(0x1F03), 0x1F0C => array(0x1F04), 0x1F0D => array(0x1F05),
1268
+					0x1F0E => array(0x1F06), 0x1F0F => array(0x1F07), 0x1F18 => array(0x1F10),
1269
+					0x1F19 => array(0x1F11), 0x1F1A => array(0x1F12), 0x1F1B => array(0x1F13),
1270
+					0x1F1C => array(0x1F14), 0x1F1D => array(0x1F15), 0x1F28 => array(0x1F20),
1271
+					0x1F29 => array(0x1F21), 0x1F2A => array(0x1F22), 0x1F2B => array(0x1F23),
1272
+					0x1F2C => array(0x1F24), 0x1F2D => array(0x1F25), 0x1F2E => array(0x1F26),
1273
+					0x1F2F => array(0x1F27), 0x1F38 => array(0x1F30), 0x1F39 => array(0x1F31),
1274
+					0x1F3A => array(0x1F32), 0x1F3B => array(0x1F33), 0x1F3C => array(0x1F34),
1275
+					0x1F3D => array(0x1F35), 0x1F3E => array(0x1F36), 0x1F3F => array(0x1F37),
1276
+					0x1F48 => array(0x1F40), 0x1F49 => array(0x1F41), 0x1F4A => array(0x1F42),
1277
+					0x1F4B => array(0x1F43), 0x1F4C => array(0x1F44), 0x1F4D => array(0x1F45),
1278
+					0x1F50 => array(0x3C5, 0x313), 0x1F52 => array(0x3C5, 0x313, 0x300),
1279
+					0x1F54 => array(0x3C5, 0x313, 0x301), 0x1F56 => array(0x3C5, 0x313, 0x342),
1280
+					0x1F59 => array(0x1F51), 0x1F5B => array(0x1F53), 0x1F5D => array(0x1F55),
1281
+					0x1F5F => array(0x1F57), 0x1F68 => array(0x1F60), 0x1F69 => array(0x1F61),
1282
+					0x1F6A => array(0x1F62), 0x1F6B => array(0x1F63), 0x1F6C => array(0x1F64),
1283
+					0x1F6D => array(0x1F65), 0x1F6E => array(0x1F66), 0x1F6F => array(0x1F67),
1284
+					0x1F80 => array(0x1F00, 0x3B9), 0x1F81 => array(0x1F01, 0x3B9),
1285
+					0x1F82 => array(0x1F02, 0x3B9), 0x1F83 => array(0x1F03, 0x3B9),
1286
+					0x1F84 => array(0x1F04, 0x3B9), 0x1F85 => array(0x1F05, 0x3B9),
1287
+					0x1F86 => array(0x1F06, 0x3B9), 0x1F87 => array(0x1F07, 0x3B9),
1288
+					0x1F88 => array(0x1F00, 0x3B9), 0x1F89 => array(0x1F01, 0x3B9),
1289
+					0x1F8A => array(0x1F02, 0x3B9), 0x1F8B => array(0x1F03, 0x3B9),
1290
+					0x1F8C => array(0x1F04, 0x3B9), 0x1F8D => array(0x1F05, 0x3B9),
1291
+					0x1F8E => array(0x1F06, 0x3B9), 0x1F8F => array(0x1F07, 0x3B9),
1292
+					0x1F90 => array(0x1F20, 0x3B9), 0x1F91 => array(0x1F21, 0x3B9),
1293
+					0x1F92 => array(0x1F22, 0x3B9), 0x1F93 => array(0x1F23, 0x3B9),
1294
+					0x1F94 => array(0x1F24, 0x3B9), 0x1F95 => array(0x1F25, 0x3B9),
1295
+					0x1F96 => array(0x1F26, 0x3B9), 0x1F97 => array(0x1F27, 0x3B9),
1296
+					0x1F98 => array(0x1F20, 0x3B9), 0x1F99 => array(0x1F21, 0x3B9),
1297
+					0x1F9A => array(0x1F22, 0x3B9), 0x1F9B => array(0x1F23, 0x3B9),
1298
+					0x1F9C => array(0x1F24, 0x3B9), 0x1F9D => array(0x1F25, 0x3B9),
1299
+					0x1F9E => array(0x1F26, 0x3B9), 0x1F9F => array(0x1F27, 0x3B9),
1300
+					0x1FA0 => array(0x1F60, 0x3B9), 0x1FA1 => array(0x1F61, 0x3B9),
1301
+					0x1FA2 => array(0x1F62, 0x3B9), 0x1FA3 => array(0x1F63, 0x3B9),
1302
+					0x1FA4 => array(0x1F64, 0x3B9), 0x1FA5 => array(0x1F65, 0x3B9),
1303
+					0x1FA6 => array(0x1F66, 0x3B9), 0x1FA7 => array(0x1F67, 0x3B9),
1304
+					0x1FA8 => array(0x1F60, 0x3B9), 0x1FA9 => array(0x1F61, 0x3B9),
1305
+					0x1FAA => array(0x1F62, 0x3B9), 0x1FAB => array(0x1F63, 0x3B9),
1306
+					0x1FAC => array(0x1F64, 0x3B9), 0x1FAD => array(0x1F65, 0x3B9),
1307
+					0x1FAE => array(0x1F66, 0x3B9), 0x1FAF => array(0x1F67, 0x3B9),
1308
+					0x1FB2 => array(0x1F70, 0x3B9), 0x1FB3 => array(0x3B1, 0x3B9),
1309
+					0x1FB4 => array(0x3AC, 0x3B9), 0x1FB6 => array(0x3B1, 0x342),
1310
+					0x1FB7 => array(0x3B1, 0x342, 0x3B9), 0x1FB8 => array(0x1FB0),
1311
+					0x1FB9 => array(0x1FB1), 0x1FBA => array(0x1F70), 0x1FBB => array(0x1F71),
1312
+					0x1FBC => array(0x3B1, 0x3B9), 0x1FBE => array(0x3B9),
1313
+					0x1FC2 => array(0x1F74, 0x3B9), 0x1FC3 => array(0x3B7, 0x3B9),
1314
+					0x1FC4 => array(0x3AE, 0x3B9), 0x1FC6 => array(0x3B7, 0x342),
1315
+					0x1FC7 => array(0x3B7, 0x342, 0x3B9), 0x1FC8 => array(0x1F72),
1316
+					0x1FC9 => array(0x1F73), 0x1FCA => array(0x1F74), 0x1FCB => array(0x1F75),
1317
+					0x1FCC => array(0x3B7, 0x3B9), 0x1FD2 => array(0x3B9, 0x308, 0x300),
1318
+					0x1FD3 => array(0x3B9, 0x308, 0x301), 0x1FD6 => array(0x3B9, 0x342),
1319
+					0x1FD7 => array(0x3B9, 0x308, 0x342), 0x1FD8 => array(0x1FD0),
1320
+					0x1FD9 => array(0x1FD1), 0x1FDA => array(0x1F76),
1321
+					0x1FDB => array(0x1F77), 0x1FE2 => array(0x3C5, 0x308, 0x300),
1322
+					0x1FE3 => array(0x3C5, 0x308, 0x301), 0x1FE4 => array(0x3C1, 0x313),
1323
+					0x1FE6 => array(0x3C5, 0x342), 0x1FE7 => array(0x3C5, 0x308, 0x342),
1324
+					0x1FE8 => array(0x1FE0), 0x1FE9 => array(0x1FE1),
1325
+					0x1FEA => array(0x1F7A), 0x1FEB => array(0x1F7B),
1326
+					0x1FEC => array(0x1FE5), 0x1FF2 => array(0x1F7C, 0x3B9),
1327
+					0x1FF3 => array(0x3C9, 0x3B9), 0x1FF4 => array(0x3CE, 0x3B9),
1328
+					0x1FF6 => array(0x3C9, 0x342), 0x1FF7 => array(0x3C9, 0x342, 0x3B9),
1329
+					0x1FF8 => array(0x1F78), 0x1FF9 => array(0x1F79), 0x1FFA => array(0x1F7C),
1330
+					0x1FFB => array(0x1F7D), 0x1FFC => array(0x3C9, 0x3B9),
1331
+					0x20A8 => array(0x72, 0x73), 0x2102 => array(0x63), 0x2103 => array(0xB0, 0x63),
1332
+					0x2107 => array(0x25B), 0x2109 => array(0xB0, 0x66), 0x210B => array(0x68),
1333
+					0x210C => array(0x68), 0x210D => array(0x68), 0x2110 => array(0x69),
1334
+					0x2111 => array(0x69), 0x2112 => array(0x6C), 0x2115 => array(0x6E),
1335
+					0x2116 => array(0x6E, 0x6F), 0x2119 => array(0x70), 0x211A => array(0x71),
1336
+					0x211B => array(0x72), 0x211C => array(0x72), 0x211D => array(0x72),
1337
+					0x2120 => array(0x73, 0x6D), 0x2121 => array(0x74, 0x65, 0x6C),
1338
+					0x2122 => array(0x74, 0x6D), 0x2124 => array(0x7A), 0x2126 => array(0x3C9),
1339
+					0x2128 => array(0x7A), 0x212A => array(0x6B), 0x212B => array(0xE5),
1340
+					0x212C => array(0x62), 0x212D => array(0x63), 0x2130 => array(0x65),
1341
+					0x2131 => array(0x66), 0x2133 => array(0x6D), 0x213E => array(0x3B3),
1342
+					0x213F => array(0x3C0), 0x2145 => array(0x64), 0x2160 => array(0x2170),
1343
+					0x2161 => array(0x2171), 0x2162 => array(0x2172), 0x2163 => array(0x2173),
1344
+					0x2164 => array(0x2174), 0x2165 => array(0x2175), 0x2166 => array(0x2176),
1345
+					0x2167 => array(0x2177), 0x2168 => array(0x2178), 0x2169 => array(0x2179),
1346
+					0x216A => array(0x217A), 0x216B => array(0x217B), 0x216C => array(0x217C),
1347
+					0x216D => array(0x217D), 0x216E => array(0x217E), 0x216F => array(0x217F),
1348
+					0x24B6 => array(0x24D0), 0x24B7 => array(0x24D1), 0x24B8 => array(0x24D2),
1349
+					0x24B9 => array(0x24D3), 0x24BA => array(0x24D4), 0x24BB => array(0x24D5),
1350
+					0x24BC => array(0x24D6), 0x24BD => array(0x24D7), 0x24BE => array(0x24D8),
1351
+					0x24BF => array(0x24D9), 0x24C0 => array(0x24DA), 0x24C1 => array(0x24DB),
1352
+					0x24C2 => array(0x24DC), 0x24C3 => array(0x24DD), 0x24C4 => array(0x24DE),
1353
+					0x24C5 => array(0x24DF), 0x24C6 => array(0x24E0), 0x24C7 => array(0x24E1),
1354
+					0x24C8 => array(0x24E2), 0x24C9 => array(0x24E3), 0x24CA => array(0x24E4),
1355
+					0x24CB => array(0x24E5), 0x24CC => array(0x24E6), 0x24CD => array(0x24E7),
1356
+					0x24CE => array(0x24E8), 0x24CF => array(0x24E9), 0x3371 => array(0x68, 0x70, 0x61),
1357
+					0x3373 => array(0x61, 0x75), 0x3375 => array(0x6F, 0x76),
1358
+					0x3380 => array(0x70, 0x61), 0x3381 => array(0x6E, 0x61),
1359
+					0x3382 => array(0x3BC, 0x61), 0x3383 => array(0x6D, 0x61),
1360
+					0x3384 => array(0x6B, 0x61), 0x3385 => array(0x6B, 0x62),
1361
+					0x3386 => array(0x6D, 0x62), 0x3387 => array(0x67, 0x62),
1362
+					0x338A => array(0x70, 0x66), 0x338B => array(0x6E, 0x66),
1363
+					0x338C => array(0x3BC, 0x66), 0x3390 => array(0x68, 0x7A),
1364
+					0x3391 => array(0x6B, 0x68, 0x7A), 0x3392 => array(0x6D, 0x68, 0x7A),
1365
+					0x3393 => array(0x67, 0x68, 0x7A), 0x3394 => array(0x74, 0x68, 0x7A),
1366
+					0x33A9 => array(0x70, 0x61), 0x33AA => array(0x6B, 0x70, 0x61),
1367
+					0x33AB => array(0x6D, 0x70, 0x61), 0x33AC => array(0x67, 0x70, 0x61),
1368
+					0x33B4 => array(0x70, 0x76), 0x33B5 => array(0x6E, 0x76),
1369
+					0x33B6 => array(0x3BC, 0x76), 0x33B7 => array(0x6D, 0x76),
1370
+					0x33B8 => array(0x6B, 0x76), 0x33B9 => array(0x6D, 0x76),
1371
+					0x33BA => array(0x70, 0x77), 0x33BB => array(0x6E, 0x77),
1372
+					0x33BC => array(0x3BC, 0x77), 0x33BD => array(0x6D, 0x77),
1373
+					0x33BE => array(0x6B, 0x77), 0x33BF => array(0x6D, 0x77),
1374
+					0x33C0 => array(0x6B, 0x3C9), 0x33C1 => array(0x6D, 0x3C9), /*
1375 1375
                     0x33C2  => array(0x61, 0x2E, 0x6D, 0x2E), */
1376
-                    0x33C3 => array(0x62, 0x71), 0x33C6 => array(0x63, 0x2215, 0x6B, 0x67),
1377
-                    0x33C7 => array(0x63, 0x6F, 0x2E), 0x33C8 => array(0x64, 0x62),
1378
-                    0x33C9 => array(0x67, 0x79), 0x33CB => array(0x68, 0x70),
1379
-                    0x33CD => array(0x6B, 0x6B), 0x33CE => array(0x6B, 0x6D),
1380
-                    0x33D7 => array(0x70, 0x68), 0x33D9 => array(0x70, 0x70, 0x6D),
1381
-                    0x33DA => array(0x70, 0x72), 0x33DC => array(0x73, 0x76),
1382
-                    0x33DD => array(0x77, 0x62), 0xFB00 => array(0x66, 0x66),
1383
-                    0xFB01 => array(0x66, 0x69), 0xFB02 => array(0x66, 0x6C),
1384
-                    0xFB03 => array(0x66, 0x66, 0x69), 0xFB04 => array(0x66, 0x66, 0x6C),
1385
-                    0xFB05 => array(0x73, 0x74), 0xFB06 => array(0x73, 0x74),
1386
-                    0xFB13 => array(0x574, 0x576), 0xFB14 => array(0x574, 0x565),
1387
-                    0xFB15 => array(0x574, 0x56B), 0xFB16 => array(0x57E, 0x576),
1388
-                    0xFB17 => array(0x574, 0x56D), 0xFF21 => array(0xFF41),
1389
-                    0xFF22 => array(0xFF42), 0xFF23 => array(0xFF43), 0xFF24 => array(0xFF44),
1390
-                    0xFF25 => array(0xFF45), 0xFF26 => array(0xFF46), 0xFF27 => array(0xFF47),
1391
-                    0xFF28 => array(0xFF48), 0xFF29 => array(0xFF49), 0xFF2A => array(0xFF4A),
1392
-                    0xFF2B => array(0xFF4B), 0xFF2C => array(0xFF4C), 0xFF2D => array(0xFF4D),
1393
-                    0xFF2E => array(0xFF4E), 0xFF2F => array(0xFF4F), 0xFF30 => array(0xFF50),
1394
-                    0xFF31 => array(0xFF51), 0xFF32 => array(0xFF52), 0xFF33 => array(0xFF53),
1395
-                    0xFF34 => array(0xFF54), 0xFF35 => array(0xFF55), 0xFF36 => array(0xFF56),
1396
-                    0xFF37 => array(0xFF57), 0xFF38 => array(0xFF58), 0xFF39 => array(0xFF59),
1397
-                    0xFF3A => array(0xFF5A), 0x10400 => array(0x10428), 0x10401 => array(0x10429),
1398
-                    0x10402 => array(0x1042A), 0x10403 => array(0x1042B), 0x10404 => array(0x1042C),
1399
-                    0x10405 => array(0x1042D), 0x10406 => array(0x1042E), 0x10407 => array(0x1042F),
1400
-                    0x10408 => array(0x10430), 0x10409 => array(0x10431), 0x1040A => array(0x10432),
1401
-                    0x1040B => array(0x10433), 0x1040C => array(0x10434), 0x1040D => array(0x10435),
1402
-                    0x1040E => array(0x10436), 0x1040F => array(0x10437), 0x10410 => array(0x10438),
1403
-                    0x10411 => array(0x10439), 0x10412 => array(0x1043A), 0x10413 => array(0x1043B),
1404
-                    0x10414 => array(0x1043C), 0x10415 => array(0x1043D), 0x10416 => array(0x1043E),
1405
-                    0x10417 => array(0x1043F), 0x10418 => array(0x10440), 0x10419 => array(0x10441),
1406
-                    0x1041A => array(0x10442), 0x1041B => array(0x10443), 0x1041C => array(0x10444),
1407
-                    0x1041D => array(0x10445), 0x1041E => array(0x10446), 0x1041F => array(0x10447),
1408
-                    0x10420 => array(0x10448), 0x10421 => array(0x10449), 0x10422 => array(0x1044A),
1409
-                    0x10423 => array(0x1044B), 0x10424 => array(0x1044C), 0x10425 => array(0x1044D),
1410
-                    0x1D400 => array(0x61), 0x1D401 => array(0x62), 0x1D402 => array(0x63),
1411
-                    0x1D403 => array(0x64), 0x1D404 => array(0x65), 0x1D405 => array(0x66),
1412
-                    0x1D406 => array(0x67), 0x1D407 => array(0x68), 0x1D408 => array(0x69),
1413
-                    0x1D409 => array(0x6A), 0x1D40A => array(0x6B), 0x1D40B => array(0x6C),
1414
-                    0x1D40C => array(0x6D), 0x1D40D => array(0x6E), 0x1D40E => array(0x6F),
1415
-                    0x1D40F => array(0x70), 0x1D410 => array(0x71), 0x1D411 => array(0x72),
1416
-                    0x1D412 => array(0x73), 0x1D413 => array(0x74), 0x1D414 => array(0x75),
1417
-                    0x1D415 => array(0x76), 0x1D416 => array(0x77), 0x1D417 => array(0x78),
1418
-                    0x1D418 => array(0x79), 0x1D419 => array(0x7A), 0x1D434 => array(0x61),
1419
-                    0x1D435 => array(0x62), 0x1D436 => array(0x63), 0x1D437 => array(0x64),
1420
-                    0x1D438 => array(0x65), 0x1D439 => array(0x66), 0x1D43A => array(0x67),
1421
-                    0x1D43B => array(0x68), 0x1D43C => array(0x69), 0x1D43D => array(0x6A),
1422
-                    0x1D43E => array(0x6B), 0x1D43F => array(0x6C), 0x1D440 => array(0x6D),
1423
-                    0x1D441 => array(0x6E), 0x1D442 => array(0x6F), 0x1D443 => array(0x70),
1424
-                    0x1D444 => array(0x71), 0x1D445 => array(0x72), 0x1D446 => array(0x73),
1425
-                    0x1D447 => array(0x74), 0x1D448 => array(0x75), 0x1D449 => array(0x76),
1426
-                    0x1D44A => array(0x77), 0x1D44B => array(0x78), 0x1D44C => array(0x79),
1427
-                    0x1D44D => array(0x7A), 0x1D468 => array(0x61), 0x1D469 => array(0x62),
1428
-                    0x1D46A => array(0x63), 0x1D46B => array(0x64), 0x1D46C => array(0x65),
1429
-                    0x1D46D => array(0x66), 0x1D46E => array(0x67), 0x1D46F => array(0x68),
1430
-                    0x1D470 => array(0x69), 0x1D471 => array(0x6A), 0x1D472 => array(0x6B),
1431
-                    0x1D473 => array(0x6C), 0x1D474 => array(0x6D), 0x1D475 => array(0x6E),
1432
-                    0x1D476 => array(0x6F), 0x1D477 => array(0x70), 0x1D478 => array(0x71),
1433
-                    0x1D479 => array(0x72), 0x1D47A => array(0x73), 0x1D47B => array(0x74),
1434
-                    0x1D47C => array(0x75), 0x1D47D => array(0x76), 0x1D47E => array(0x77),
1435
-                    0x1D47F => array(0x78), 0x1D480 => array(0x79), 0x1D481 => array(0x7A),
1436
-                    0x1D49C => array(0x61), 0x1D49E => array(0x63), 0x1D49F => array(0x64),
1437
-                    0x1D4A2 => array(0x67), 0x1D4A5 => array(0x6A), 0x1D4A6 => array(0x6B),
1438
-                    0x1D4A9 => array(0x6E), 0x1D4AA => array(0x6F), 0x1D4AB => array(0x70),
1439
-                    0x1D4AC => array(0x71), 0x1D4AE => array(0x73), 0x1D4AF => array(0x74),
1440
-                    0x1D4B0 => array(0x75), 0x1D4B1 => array(0x76), 0x1D4B2 => array(0x77),
1441
-                    0x1D4B3 => array(0x78), 0x1D4B4 => array(0x79), 0x1D4B5 => array(0x7A),
1442
-                    0x1D4D0 => array(0x61), 0x1D4D1 => array(0x62), 0x1D4D2 => array(0x63),
1443
-                    0x1D4D3 => array(0x64), 0x1D4D4 => array(0x65), 0x1D4D5 => array(0x66),
1444
-                    0x1D4D6 => array(0x67), 0x1D4D7 => array(0x68), 0x1D4D8 => array(0x69),
1445
-                    0x1D4D9 => array(0x6A), 0x1D4DA => array(0x6B), 0x1D4DB => array(0x6C),
1446
-                    0x1D4DC => array(0x6D), 0x1D4DD => array(0x6E), 0x1D4DE => array(0x6F),
1447
-                    0x1D4DF => array(0x70), 0x1D4E0 => array(0x71), 0x1D4E1 => array(0x72),
1448
-                    0x1D4E2 => array(0x73), 0x1D4E3 => array(0x74), 0x1D4E4 => array(0x75),
1449
-                    0x1D4E5 => array(0x76), 0x1D4E6 => array(0x77), 0x1D4E7 => array(0x78),
1450
-                    0x1D4E8 => array(0x79), 0x1D4E9 => array(0x7A), 0x1D504 => array(0x61),
1451
-                    0x1D505 => array(0x62), 0x1D507 => array(0x64), 0x1D508 => array(0x65),
1452
-                    0x1D509 => array(0x66), 0x1D50A => array(0x67), 0x1D50D => array(0x6A),
1453
-                    0x1D50E => array(0x6B), 0x1D50F => array(0x6C), 0x1D510 => array(0x6D),
1454
-                    0x1D511 => array(0x6E), 0x1D512 => array(0x6F), 0x1D513 => array(0x70),
1455
-                    0x1D514 => array(0x71), 0x1D516 => array(0x73), 0x1D517 => array(0x74),
1456
-                    0x1D518 => array(0x75), 0x1D519 => array(0x76), 0x1D51A => array(0x77),
1457
-                    0x1D51B => array(0x78), 0x1D51C => array(0x79), 0x1D538 => array(0x61),
1458
-                    0x1D539 => array(0x62), 0x1D53B => array(0x64), 0x1D53C => array(0x65),
1459
-                    0x1D53D => array(0x66), 0x1D53E => array(0x67), 0x1D540 => array(0x69),
1460
-                    0x1D541 => array(0x6A), 0x1D542 => array(0x6B), 0x1D543 => array(0x6C),
1461
-                    0x1D544 => array(0x6D), 0x1D546 => array(0x6F), 0x1D54A => array(0x73),
1462
-                    0x1D54B => array(0x74), 0x1D54C => array(0x75), 0x1D54D => array(0x76),
1463
-                    0x1D54E => array(0x77), 0x1D54F => array(0x78), 0x1D550 => array(0x79),
1464
-                    0x1D56C => array(0x61), 0x1D56D => array(0x62), 0x1D56E => array(0x63),
1465
-                    0x1D56F => array(0x64), 0x1D570 => array(0x65), 0x1D571 => array(0x66),
1466
-                    0x1D572 => array(0x67), 0x1D573 => array(0x68), 0x1D574 => array(0x69),
1467
-                    0x1D575 => array(0x6A), 0x1D576 => array(0x6B), 0x1D577 => array(0x6C),
1468
-                    0x1D578 => array(0x6D), 0x1D579 => array(0x6E), 0x1D57A => array(0x6F),
1469
-                    0x1D57B => array(0x70), 0x1D57C => array(0x71), 0x1D57D => array(0x72),
1470
-                    0x1D57E => array(0x73), 0x1D57F => array(0x74), 0x1D580 => array(0x75),
1471
-                    0x1D581 => array(0x76), 0x1D582 => array(0x77), 0x1D583 => array(0x78),
1472
-                    0x1D584 => array(0x79), 0x1D585 => array(0x7A), 0x1D5A0 => array(0x61),
1473
-                    0x1D5A1 => array(0x62), 0x1D5A2 => array(0x63), 0x1D5A3 => array(0x64),
1474
-                    0x1D5A4 => array(0x65), 0x1D5A5 => array(0x66), 0x1D5A6 => array(0x67),
1475
-                    0x1D5A7 => array(0x68), 0x1D5A8 => array(0x69), 0x1D5A9 => array(0x6A),
1476
-                    0x1D5AA => array(0x6B), 0x1D5AB => array(0x6C), 0x1D5AC => array(0x6D),
1477
-                    0x1D5AD => array(0x6E), 0x1D5AE => array(0x6F), 0x1D5AF => array(0x70),
1478
-                    0x1D5B0 => array(0x71), 0x1D5B1 => array(0x72), 0x1D5B2 => array(0x73),
1479
-                    0x1D5B3 => array(0x74), 0x1D5B4 => array(0x75), 0x1D5B5 => array(0x76),
1480
-                    0x1D5B6 => array(0x77), 0x1D5B7 => array(0x78), 0x1D5B8 => array(0x79),
1481
-                    0x1D5B9 => array(0x7A), 0x1D5D4 => array(0x61), 0x1D5D5 => array(0x62),
1482
-                    0x1D5D6 => array(0x63), 0x1D5D7 => array(0x64), 0x1D5D8 => array(0x65),
1483
-                    0x1D5D9 => array(0x66), 0x1D5DA => array(0x67), 0x1D5DB => array(0x68),
1484
-                    0x1D5DC => array(0x69), 0x1D5DD => array(0x6A), 0x1D5DE => array(0x6B),
1485
-                    0x1D5DF => array(0x6C), 0x1D5E0 => array(0x6D), 0x1D5E1 => array(0x6E),
1486
-                    0x1D5E2 => array(0x6F), 0x1D5E3 => array(0x70), 0x1D5E4 => array(0x71),
1487
-                    0x1D5E5 => array(0x72), 0x1D5E6 => array(0x73), 0x1D5E7 => array(0x74),
1488
-                    0x1D5E8 => array(0x75), 0x1D5E9 => array(0x76), 0x1D5EA => array(0x77),
1489
-                    0x1D5EB => array(0x78), 0x1D5EC => array(0x79), 0x1D5ED => array(0x7A),
1490
-                    0x1D608 => array(0x61), 0x1D609 => array(0x62), 0x1D60A => array(0x63),
1491
-                    0x1D60B => array(0x64), 0x1D60C => array(0x65), 0x1D60D => array(0x66),
1492
-                    0x1D60E => array(0x67), 0x1D60F => array(0x68), 0x1D610 => array(0x69),
1493
-                    0x1D611 => array(0x6A), 0x1D612 => array(0x6B), 0x1D613 => array(0x6C),
1494
-                    0x1D614 => array(0x6D), 0x1D615 => array(0x6E), 0x1D616 => array(0x6F),
1495
-                    0x1D617 => array(0x70), 0x1D618 => array(0x71), 0x1D619 => array(0x72),
1496
-                    0x1D61A => array(0x73), 0x1D61B => array(0x74), 0x1D61C => array(0x75),
1497
-                    0x1D61D => array(0x76), 0x1D61E => array(0x77), 0x1D61F => array(0x78),
1498
-                    0x1D620 => array(0x79), 0x1D621 => array(0x7A), 0x1D63C => array(0x61),
1499
-                    0x1D63D => array(0x62), 0x1D63E => array(0x63), 0x1D63F => array(0x64),
1500
-                    0x1D640 => array(0x65), 0x1D641 => array(0x66), 0x1D642 => array(0x67),
1501
-                    0x1D643 => array(0x68), 0x1D644 => array(0x69), 0x1D645 => array(0x6A),
1502
-                    0x1D646 => array(0x6B), 0x1D647 => array(0x6C), 0x1D648 => array(0x6D),
1503
-                    0x1D649 => array(0x6E), 0x1D64A => array(0x6F), 0x1D64B => array(0x70),
1504
-                    0x1D64C => array(0x71), 0x1D64D => array(0x72), 0x1D64E => array(0x73),
1505
-                    0x1D64F => array(0x74), 0x1D650 => array(0x75), 0x1D651 => array(0x76),
1506
-                    0x1D652 => array(0x77), 0x1D653 => array(0x78), 0x1D654 => array(0x79),
1507
-                    0x1D655 => array(0x7A), 0x1D670 => array(0x61), 0x1D671 => array(0x62),
1508
-                    0x1D672 => array(0x63), 0x1D673 => array(0x64), 0x1D674 => array(0x65),
1509
-                    0x1D675 => array(0x66), 0x1D676 => array(0x67), 0x1D677 => array(0x68),
1510
-                    0x1D678 => array(0x69), 0x1D679 => array(0x6A), 0x1D67A => array(0x6B),
1511
-                    0x1D67B => array(0x6C), 0x1D67C => array(0x6D), 0x1D67D => array(0x6E),
1512
-                    0x1D67E => array(0x6F), 0x1D67F => array(0x70), 0x1D680 => array(0x71),
1513
-                    0x1D681 => array(0x72), 0x1D682 => array(0x73), 0x1D683 => array(0x74),
1514
-                    0x1D684 => array(0x75), 0x1D685 => array(0x76), 0x1D686 => array(0x77),
1515
-                    0x1D687 => array(0x78), 0x1D688 => array(0x79), 0x1D689 => array(0x7A),
1516
-                    0x1D6A8 => array(0x3B1), 0x1D6A9 => array(0x3B2), 0x1D6AA => array(0x3B3),
1517
-                    0x1D6AB => array(0x3B4), 0x1D6AC => array(0x3B5), 0x1D6AD => array(0x3B6),
1518
-                    0x1D6AE => array(0x3B7), 0x1D6AF => array(0x3B8), 0x1D6B0 => array(0x3B9),
1519
-                    0x1D6B1 => array(0x3BA), 0x1D6B2 => array(0x3BB), 0x1D6B3 => array(0x3BC),
1520
-                    0x1D6B4 => array(0x3BD), 0x1D6B5 => array(0x3BE), 0x1D6B6 => array(0x3BF),
1521
-                    0x1D6B7 => array(0x3C0), 0x1D6B8 => array(0x3C1), 0x1D6B9 => array(0x3B8),
1522
-                    0x1D6BA => array(0x3C3), 0x1D6BB => array(0x3C4), 0x1D6BC => array(0x3C5),
1523
-                    0x1D6BD => array(0x3C6), 0x1D6BE => array(0x3C7), 0x1D6BF => array(0x3C8),
1524
-                    0x1D6C0 => array(0x3C9), 0x1D6D3 => array(0x3C3), 0x1D6E2 => array(0x3B1),
1525
-                    0x1D6E3 => array(0x3B2), 0x1D6E4 => array(0x3B3), 0x1D6E5 => array(0x3B4),
1526
-                    0x1D6E6 => array(0x3B5), 0x1D6E7 => array(0x3B6), 0x1D6E8 => array(0x3B7),
1527
-                    0x1D6E9 => array(0x3B8), 0x1D6EA => array(0x3B9), 0x1D6EB => array(0x3BA),
1528
-                    0x1D6EC => array(0x3BB), 0x1D6ED => array(0x3BC), 0x1D6EE => array(0x3BD),
1529
-                    0x1D6EF => array(0x3BE), 0x1D6F0 => array(0x3BF), 0x1D6F1 => array(0x3C0),
1530
-                    0x1D6F2 => array(0x3C1), 0x1D6F3 => array(0x3B8), 0x1D6F4 => array(0x3C3),
1531
-                    0x1D6F5 => array(0x3C4), 0x1D6F6 => array(0x3C5), 0x1D6F7 => array(0x3C6),
1532
-                    0x1D6F8 => array(0x3C7), 0x1D6F9 => array(0x3C8), 0x1D6FA => array(0x3C9),
1533
-                    0x1D70D => array(0x3C3), 0x1D71C => array(0x3B1), 0x1D71D => array(0x3B2),
1534
-                    0x1D71E => array(0x3B3), 0x1D71F => array(0x3B4), 0x1D720 => array(0x3B5),
1535
-                    0x1D721 => array(0x3B6), 0x1D722 => array(0x3B7), 0x1D723 => array(0x3B8),
1536
-                    0x1D724 => array(0x3B9), 0x1D725 => array(0x3BA), 0x1D726 => array(0x3BB),
1537
-                    0x1D727 => array(0x3BC), 0x1D728 => array(0x3BD), 0x1D729 => array(0x3BE),
1538
-                    0x1D72A => array(0x3BF), 0x1D72B => array(0x3C0), 0x1D72C => array(0x3C1),
1539
-                    0x1D72D => array(0x3B8), 0x1D72E => array(0x3C3), 0x1D72F => array(0x3C4),
1540
-                    0x1D730 => array(0x3C5), 0x1D731 => array(0x3C6), 0x1D732 => array(0x3C7),
1541
-                    0x1D733 => array(0x3C8), 0x1D734 => array(0x3C9), 0x1D747 => array(0x3C3),
1542
-                    0x1D756 => array(0x3B1), 0x1D757 => array(0x3B2), 0x1D758 => array(0x3B3),
1543
-                    0x1D759 => array(0x3B4), 0x1D75A => array(0x3B5), 0x1D75B => array(0x3B6),
1544
-                    0x1D75C => array(0x3B7), 0x1D75D => array(0x3B8), 0x1D75E => array(0x3B9),
1545
-                    0x1D75F => array(0x3BA), 0x1D760 => array(0x3BB), 0x1D761 => array(0x3BC),
1546
-                    0x1D762 => array(0x3BD), 0x1D763 => array(0x3BE), 0x1D764 => array(0x3BF),
1547
-                    0x1D765 => array(0x3C0), 0x1D766 => array(0x3C1), 0x1D767 => array(0x3B8),
1548
-                    0x1D768 => array(0x3C3), 0x1D769 => array(0x3C4), 0x1D76A => array(0x3C5),
1549
-                    0x1D76B => array(0x3C6), 0x1D76C => array(0x3C7), 0x1D76D => array(0x3C8),
1550
-                    0x1D76E => array(0x3C9), 0x1D781 => array(0x3C3), 0x1D790 => array(0x3B1),
1551
-                    0x1D791 => array(0x3B2), 0x1D792 => array(0x3B3), 0x1D793 => array(0x3B4),
1552
-                    0x1D794 => array(0x3B5), 0x1D795 => array(0x3B6), 0x1D796 => array(0x3B7),
1553
-                    0x1D797 => array(0x3B8), 0x1D798 => array(0x3B9), 0x1D799 => array(0x3BA),
1554
-                    0x1D79A => array(0x3BB), 0x1D79B => array(0x3BC), 0x1D79C => array(0x3BD),
1555
-                    0x1D79D => array(0x3BE), 0x1D79E => array(0x3BF), 0x1D79F => array(0x3C0),
1556
-                    0x1D7A0 => array(0x3C1), 0x1D7A1 => array(0x3B8), 0x1D7A2 => array(0x3C3),
1557
-                    0x1D7A3 => array(0x3C4), 0x1D7A4 => array(0x3C5), 0x1D7A5 => array(0x3C6),
1558
-                    0x1D7A6 => array(0x3C7), 0x1D7A7 => array(0x3C8), 0x1D7A8 => array(0x3C9),
1559
-                    0x1D7BB => array(0x3C3), 0x3F9 => array(0x3C3), 0x1D2C => array(0x61),
1560
-                    0x1D2D => array(0xE6), 0x1D2E => array(0x62), 0x1D30 => array(0x64),
1561
-                    0x1D31 => array(0x65), 0x1D32 => array(0x1DD), 0x1D33 => array(0x67),
1562
-                    0x1D34 => array(0x68), 0x1D35 => array(0x69), 0x1D36 => array(0x6A),
1563
-                    0x1D37 => array(0x6B), 0x1D38 => array(0x6C), 0x1D39 => array(0x6D),
1564
-                    0x1D3A => array(0x6E), 0x1D3C => array(0x6F), 0x1D3D => array(0x223),
1565
-                    0x1D3E => array(0x70), 0x1D3F => array(0x72), 0x1D40 => array(0x74),
1566
-                    0x1D41 => array(0x75), 0x1D42 => array(0x77), 0x213B => array(0x66, 0x61, 0x78),
1567
-                    0x3250 => array(0x70, 0x74, 0x65), 0x32CC => array(0x68, 0x67),
1568
-                    0x32CE => array(0x65, 0x76), 0x32CF => array(0x6C, 0x74, 0x64),
1569
-                    0x337A => array(0x69, 0x75), 0x33DE => array(0x76, 0x2215, 0x6D),
1570
-                    0x33DF => array(0x61, 0x2215, 0x6D)
1571
-            ),
1572
-            'replacemaps' => array(0x41 => array(0x61), 0x42 => array(0x62), 0x43 => array(0x63),
1573
-                    0x44 => array(0x64), 0x45 => array(0x65), 0x46 => array(0x66),
1574
-                    0x47 => array(0x67), 0x48 => array(0x68), 0x49 => array(0x69),
1575
-                    0x4A => array(0x6A), 0x4B => array(0x6B), 0x4C => array(0x6C),
1576
-                    0x4D => array(0x6D), 0x4E => array(0x6E), 0x4F => array(0x6F),
1577
-                    0x50 => array(0x70), 0x51 => array(0x71), 0x52 => array(0x72),
1578
-                    0x53 => array(0x73), 0x54 => array(0x74), 0x55 => array(0x75),
1579
-                    0x56 => array(0x76), 0x57 => array(0x77), 0x58 => array(0x78),
1580
-                    0x59 => array(0x79), 0x5A => array(0x7A), 0xAA => array(0x61),
1581
-                    0xB2 => array(0x32), 0xB3 => array(0x33), 0xB5 => array(0x3BC),
1582
-                    0xB9 => array(0x31), 0xBA => array(0x6F), 0xBC => array(0x31, 0x2044, 0x34),
1583
-                    0xBD => array(0x31, 0x2044, 0x32), 0xBE => array(0x33, 0x2044, 0x34), 0xC0 => array(0xE0),
1584
-                    0xC1 => array(0xE1), 0xC2 => array(0xE2), 0xC3 => array(0xE3),
1585
-                    0xC4 => array(0xE4), 0xC5 => array(0xE5), 0xC6 => array(0xE6),
1586
-                    0xC7 => array(0xE7), 0xC8 => array(0xE8), 0xC9 => array(0xE9),
1587
-                    0xCA => array(0xEA), 0xCB => array(0xEB), 0xCC => array(0xEC),
1588
-                    0xCD => array(0xED), 0xCE => array(0xEE), 0xCF => array(0xEF),
1589
-                    0xD0 => array(0xF0), 0xD1 => array(0xF1), 0xD2 => array(0xF2),
1590
-                    0xD3 => array(0xF3), 0xD4 => array(0xF4), 0xD5 => array(0xF5),
1591
-                    0xD6 => array(0xF6), 0xD8 => array(0xF8), 0xD9 => array(0xF9),
1592
-                    0xDA => array(0xFA), 0xDB => array(0xFB), 0xDC => array(0xFC),
1593
-                    0xDD => array(0xFD), 0xDE => array(0xFE), 0x100 => array(0x101),
1594
-                    0x102 => array(0x103), 0x104 => array(0x105), 0x106 => array(0x107),
1595
-                    0x108 => array(0x109), 0x10A => array(0x10B), 0x10C => array(0x10D),
1596
-                    0x10E => array(0x10F), 0x110 => array(0x111), 0x112 => array(0x113),
1597
-                    0x114 => array(0x115), 0x116 => array(0x117), 0x118 => array(0x119),
1598
-                    0x11A => array(0x11B), 0x11C => array(0x11D), 0x11E => array(0x11F),
1599
-                    0x120 => array(0x121), 0x122 => array(0x123), 0x124 => array(0x125),
1600
-                    0x126 => array(0x127), 0x128 => array(0x129), 0x12A => array(0x12B),
1601
-                    0x12C => array(0x12D), 0x12E => array(0x12F), 0x130 => array(0x69, 0x307),
1602
-                    0x132 => array(0x69, 0x6A), 0x133 => array(0x69, 0x6A), 0x134 => array(0x135),
1603
-                    0x136 => array(0x137), 0x139 => array(0x13A), 0x13B => array(0x13C),
1604
-                    0x13D => array(0x13E), 0x13F => array(0x6C, 0xB7), 0x140 => array(0x6C, 0xB7),
1605
-                    0x141 => array(0x142), 0x143 => array(0x144), 0x145 => array(0x146),
1606
-                    0x147 => array(0x148), 0x149 => array(0x2BC, 0x6E), 0x14A => array(0x14B),
1607
-                    0x14C => array(0x14D), 0x14E => array(0x14F), 0x150 => array(0x151),
1608
-                    0x152 => array(0x153), 0x154 => array(0x155), 0x156 => array(0x157),
1609
-                    0x158 => array(0x159), 0x15A => array(0x15B), 0x15C => array(0x15D),
1610
-                    0x15E => array(0x15F), 0x160 => array(0x161), 0x162 => array(0x163),
1611
-                    0x164 => array(0x165), 0x166 => array(0x167), 0x168 => array(0x169),
1612
-                    0x16A => array(0x16B), 0x16C => array(0x16D), 0x16E => array(0x16F),
1613
-                    0x170 => array(0x171), 0x172 => array(0x173), 0x174 => array(0x175),
1614
-                    0x176 => array(0x177), 0x178 => array(0xFF), 0x179 => array(0x17A),
1615
-                    0x17B => array(0x17C), 0x17D => array(0x17E), 0x17F => array(0x73),
1616
-                    0x181 => array(0x253), 0x182 => array(0x183), 0x184 => array(0x185),
1617
-                    0x186 => array(0x254), 0x187 => array(0x188), 0x189 => array(0x256),
1618
-                    0x18A => array(0x257), 0x18B => array(0x18C), 0x18E => array(0x1DD),
1619
-                    0x18F => array(0x259), 0x190 => array(0x25B), 0x191 => array(0x192),
1620
-                    0x193 => array(0x260), 0x194 => array(0x263), 0x196 => array(0x269),
1621
-                    0x197 => array(0x268), 0x198 => array(0x199), 0x19C => array(0x26F),
1622
-                    0x19D => array(0x272), 0x19F => array(0x275), 0x1A0 => array(0x1A1),
1623
-                    0x1A2 => array(0x1A3), 0x1A4 => array(0x1A5), 0x1A6 => array(0x280),
1624
-                    0x1A7 => array(0x1A8), 0x1A9 => array(0x283), 0x1AC => array(0x1AD),
1625
-                    0x1AE => array(0x288), 0x1AF => array(0x1B0), 0x1B1 => array(0x28A),
1626
-                    0x1B2 => array(0x28B), 0x1B3 => array(0x1B4), 0x1B5 => array(0x1B6),
1627
-                    0x1B7 => array(0x292), 0x1B8 => array(0x1B9), 0x1BC => array(0x1BD),
1628
-                    0x1C4 => array(0x64, 0x17E), 0x1C5 => array(0x64, 0x17E), 0x1C6 => array(0x64, 0x17E),
1629
-                    0x1C7 => array(0x6C, 0x6A), 0x1C8 => array(0x6C, 0x6A), 0x1C9 => array(0x6C, 0x6A),
1630
-                    0x1CA => array(0x6E, 0x6A), 0x1CB => array(0x6E, 0x6A), 0x1CC => array(0x6E, 0x6A),
1631
-                    0x1CD => array(0x1CE), 0x1CF => array(0x1D0), 0x1D1 => array(0x1D2),
1632
-                    0x1D3 => array(0x1D4), 0x1D5 => array(0x1D6), 0x1D7 => array(0x1D8),
1633
-                    0x1D9 => array(0x1DA), 0x1DB => array(0x1DC), 0x1DE => array(0x1DF),
1634
-                    0x1E0 => array(0x1E1), 0x1E2 => array(0x1E3), 0x1E4 => array(0x1E5),
1635
-                    0x1E6 => array(0x1E7), 0x1E8 => array(0x1E9), 0x1EA => array(0x1EB),
1636
-                    0x1EC => array(0x1ED), 0x1EE => array(0x1EF), 0x1F1 => array(0x64, 0x7A),
1637
-                    0x1F2 => array(0x64, 0x7A), 0x1F3 => array(0x64, 0x7A), 0x1F4 => array(0x1F5),
1638
-                    0x1F6 => array(0x195), 0x1F7 => array(0x1BF), 0x1F8 => array(0x1F9),
1639
-                    0x1FA => array(0x1FB), 0x1FC => array(0x1FD), 0x1FE => array(0x1FF),
1640
-                    0x200 => array(0x201), 0x202 => array(0x203), 0x204 => array(0x205),
1641
-                    0x206 => array(0x207), 0x208 => array(0x209), 0x20A => array(0x20B),
1642
-                    0x20C => array(0x20D), 0x20E => array(0x20F), 0x210 => array(0x211),
1643
-                    0x212 => array(0x213), 0x214 => array(0x215), 0x216 => array(0x217),
1644
-                    0x218 => array(0x219), 0x21A => array(0x21B), 0x21C => array(0x21D),
1645
-                    0x21E => array(0x21F), 0x220 => array(0x19E), 0x222 => array(0x223),
1646
-                    0x224 => array(0x225), 0x226 => array(0x227), 0x228 => array(0x229),
1647
-                    0x22A => array(0x22B), 0x22C => array(0x22D), 0x22E => array(0x22F),
1648
-                    0x230 => array(0x231), 0x232 => array(0x233), 0x23A => array(0x2C65),
1649
-                    0x23B => array(0x23C), 0x23D => array(0x19A), 0x23E => array(0x2C66),
1650
-                    0x241 => array(0x242), 0x243 => array(0x180), 0x244 => array(0x289),
1651
-                    0x245 => array(0x28C), 0x246 => array(0x247), 0x248 => array(0x249),
1652
-                    0x24A => array(0x24B), 0x24C => array(0x24D), 0x24E => array(0x24F),
1653
-                    0x2B0 => array(0x68), 0x2B1 => array(0x266), 0x2B2 => array(0x6A),
1654
-                    0x2B3 => array(0x72), 0x2B4 => array(0x279), 0x2B5 => array(0x27B),
1655
-                    0x2B6 => array(0x281), 0x2B7 => array(0x77), 0x2B8 => array(0x79),
1656
-                    0x2E0 => array(0x263), 0x2E1 => array(0x6C), 0x2E2 => array(0x73),
1657
-                    0x2E3 => array(0x78), 0x2E4 => array(0x295), 0x340 => array(0x300),
1658
-                    0x341 => array(0x301), 0x343 => array(0x313), 0x344 => array(0x308, 0x301),
1659
-                    0x345 => array(0x3B9), 0x370 => array(0x371), 0x372 => array(0x373),
1660
-                    0x374 => array(0x2B9), 0x376 => array(0x377), 0x37F => array(0x3F3),
1661
-                    0x386 => array(0x3AC), 0x387 => array(0xB7), 0x388 => array(0x3AD),
1662
-                    0x389 => array(0x3AE), 0x38A => array(0x3AF), 0x38C => array(0x3CC),
1663
-                    0x38E => array(0x3CD), 0x38F => array(0x3CE), 0x391 => array(0x3B1),
1664
-                    0x392 => array(0x3B2), 0x393 => array(0x3B3), 0x394 => array(0x3B4),
1665
-                    0x395 => array(0x3B5), 0x396 => array(0x3B6), 0x397 => array(0x3B7),
1666
-                    0x398 => array(0x3B8), 0x399 => array(0x3B9), 0x39A => array(0x3BA),
1667
-                    0x39B => array(0x3BB), 0x39C => array(0x3BC), 0x39D => array(0x3BD),
1668
-                    0x39E => array(0x3BE), 0x39F => array(0x3BF), 0x3A0 => array(0x3C0),
1669
-                    0x3A1 => array(0x3C1), 0x3A3 => array(0x3C3), 0x3A4 => array(0x3C4),
1670
-                    0x3A5 => array(0x3C5), 0x3A6 => array(0x3C6), 0x3A7 => array(0x3C7),
1671
-                    0x3A8 => array(0x3C8), 0x3A9 => array(0x3C9), 0x3AA => array(0x3CA),
1672
-                    0x3AB => array(0x3CB), 0x3CF => array(0x3D7), 0x3D0 => array(0x3B2),
1673
-                    0x3D1 => array(0x3B8), 0x3D2 => array(0x3C5), 0x3D3 => array(0x3CD),
1674
-                    0x3D4 => array(0x3CB), 0x3D5 => array(0x3C6), 0x3D6 => array(0x3C0),
1675
-                    0x3D8 => array(0x3D9), 0x3DA => array(0x3DB), 0x3DC => array(0x3DD),
1676
-                    0x3DE => array(0x3DF), 0x3E0 => array(0x3E1), 0x3E2 => array(0x3E3),
1677
-                    0x3E4 => array(0x3E5), 0x3E6 => array(0x3E7), 0x3E8 => array(0x3E9),
1678
-                    0x3EA => array(0x3EB), 0x3EC => array(0x3ED), 0x3EE => array(0x3EF),
1679
-                    0x3F0 => array(0x3BA), 0x3F1 => array(0x3C1), 0x3F2 => array(0x3C3),
1680
-                    0x3F4 => array(0x3B8), 0x3F5 => array(0x3B5), 0x3F7 => array(0x3F8),
1681
-                    0x3F9 => array(0x3C3), 0x3FA => array(0x3FB), 0x3FD => array(0x37B),
1682
-                    0x3FE => array(0x37C), 0x3FF => array(0x37D), 0x400 => array(0x450),
1683
-                    0x401 => array(0x451), 0x402 => array(0x452), 0x403 => array(0x453),
1684
-                    0x404 => array(0x454), 0x405 => array(0x455), 0x406 => array(0x456),
1685
-                    0x407 => array(0x457), 0x408 => array(0x458), 0x409 => array(0x459),
1686
-                    0x40A => array(0x45A), 0x40B => array(0x45B), 0x40C => array(0x45C),
1687
-                    0x40D => array(0x45D), 0x40E => array(0x45E), 0x40F => array(0x45F),
1688
-                    0x410 => array(0x430), 0x411 => array(0x431), 0x412 => array(0x432),
1689
-                    0x413 => array(0x433), 0x414 => array(0x434), 0x415 => array(0x435),
1690
-                    0x416 => array(0x436), 0x417 => array(0x437), 0x418 => array(0x438),
1691
-                    0x419 => array(0x439), 0x41A => array(0x43A), 0x41B => array(0x43B),
1692
-                    0x41C => array(0x43C), 0x41D => array(0x43D), 0x41E => array(0x43E),
1693
-                    0x41F => array(0x43F), 0x420 => array(0x440), 0x421 => array(0x441),
1694
-                    0x422 => array(0x442), 0x423 => array(0x443), 0x424 => array(0x444),
1695
-                    0x425 => array(0x445), 0x426 => array(0x446), 0x427 => array(0x447),
1696
-                    0x428 => array(0x448), 0x429 => array(0x449), 0x42A => array(0x44A),
1697
-                    0x42B => array(0x44B), 0x42C => array(0x44C), 0x42D => array(0x44D),
1698
-                    0x42E => array(0x44E), 0x42F => array(0x44F), 0x460 => array(0x461),
1699
-                    0x462 => array(0x463), 0x464 => array(0x465), 0x466 => array(0x467),
1700
-                    0x468 => array(0x469), 0x46A => array(0x46B), 0x46C => array(0x46D),
1701
-                    0x46E => array(0x46F), 0x470 => array(0x471), 0x472 => array(0x473),
1702
-                    0x474 => array(0x475), 0x476 => array(0x477), 0x478 => array(0x479),
1703
-                    0x47A => array(0x47B), 0x47C => array(0x47D), 0x47E => array(0x47F),
1704
-                    0x480 => array(0x481), 0x48A => array(0x48B), 0x48C => array(0x48D),
1705
-                    0x48E => array(0x48F), 0x490 => array(0x491), 0x492 => array(0x493),
1706
-                    0x494 => array(0x495), 0x496 => array(0x497), 0x498 => array(0x499),
1707
-                    0x49A => array(0x49B), 0x49C => array(0x49D), 0x49E => array(0x49F),
1708
-                    0x4A0 => array(0x4A1), 0x4A2 => array(0x4A3), 0x4A4 => array(0x4A5),
1709
-                    0x4A6 => array(0x4A7), 0x4A8 => array(0x4A9), 0x4AA => array(0x4AB),
1710
-                    0x4AC => array(0x4AD), 0x4AE => array(0x4AF), 0x4B0 => array(0x4B1),
1711
-                    0x4B2 => array(0x4B3), 0x4B4 => array(0x4B5), 0x4B6 => array(0x4B7),
1712
-                    0x4B8 => array(0x4B9), 0x4BA => array(0x4BB), 0x4BC => array(0x4BD),
1713
-                    0x4BE => array(0x4BF), 0x4C1 => array(0x4C2), 0x4C3 => array(0x4C4),
1714
-                    0x4C5 => array(0x4C6), 0x4C7 => array(0x4C8), 0x4C9 => array(0x4CA),
1715
-                    0x4CB => array(0x4CC), 0x4CD => array(0x4CE), 0x4D0 => array(0x4D1),
1716
-                    0x4D2 => array(0x4D3), 0x4D4 => array(0x4D5), 0x4D6 => array(0x4D7),
1717
-                    0x4D8 => array(0x4D9), 0x4DA => array(0x4DB), 0x4DC => array(0x4DD),
1718
-                    0x4DE => array(0x4DF), 0x4E0 => array(0x4E1), 0x4E2 => array(0x4E3),
1719
-                    0x4E4 => array(0x4E5), 0x4E6 => array(0x4E7), 0x4E8 => array(0x4E9),
1720
-                    0x4EA => array(0x4EB), 0x4EC => array(0x4ED), 0x4EE => array(0x4EF),
1721
-                    0x4F0 => array(0x4F1), 0x4F2 => array(0x4F3), 0x4F4 => array(0x4F5),
1722
-                    0x4F6 => array(0x4F7), 0x4F8 => array(0x4F9), 0x4FA => array(0x4FB),
1723
-                    0x4FC => array(0x4FD), 0x4FE => array(0x4FF), 0x500 => array(0x501),
1724
-                    0x502 => array(0x503), 0x504 => array(0x505), 0x506 => array(0x507),
1725
-                    0x508 => array(0x509), 0x50A => array(0x50B), 0x50C => array(0x50D),
1726
-                    0x50E => array(0x50F), 0x510 => array(0x511), 0x512 => array(0x513),
1727
-                    0x514 => array(0x515), 0x516 => array(0x517), 0x518 => array(0x519),
1728
-                    0x51A => array(0x51B), 0x51C => array(0x51D), 0x51E => array(0x51F),
1729
-                    0x520 => array(0x521), 0x522 => array(0x523), 0x524 => array(0x525),
1730
-                    0x526 => array(0x527), 0x528 => array(0x529), 0x52A => array(0x52B),
1731
-                    0x52C => array(0x52D), 0x52E => array(0x52F), 0x531 => array(0x561),
1732
-                    0x532 => array(0x562), 0x533 => array(0x563), 0x534 => array(0x564),
1733
-                    0x535 => array(0x565), 0x536 => array(0x566), 0x537 => array(0x567),
1734
-                    0x538 => array(0x568), 0x539 => array(0x569), 0x53A => array(0x56A),
1735
-                    0x53B => array(0x56B), 0x53C => array(0x56C), 0x53D => array(0x56D),
1736
-                    0x53E => array(0x56E), 0x53F => array(0x56F), 0x540 => array(0x570),
1737
-                    0x541 => array(0x571), 0x542 => array(0x572), 0x543 => array(0x573),
1738
-                    0x544 => array(0x574), 0x545 => array(0x575), 0x546 => array(0x576),
1739
-                    0x547 => array(0x577), 0x548 => array(0x578), 0x549 => array(0x579),
1740
-                    0x54A => array(0x57A), 0x54B => array(0x57B), 0x54C => array(0x57C),
1741
-                    0x54D => array(0x57D), 0x54E => array(0x57E), 0x54F => array(0x57F),
1742
-                    0x550 => array(0x580), 0x551 => array(0x581), 0x552 => array(0x582),
1743
-                    0x553 => array(0x583), 0x554 => array(0x584), 0x555 => array(0x585),
1744
-                    0x556 => array(0x586), 0x587 => array(0x565, 0x582), 0x675 => array(0x627, 0x674),
1745
-                    0x676 => array(0x648, 0x674), 0x677 => array(0x6C7, 0x674), 0x678 => array(0x64A, 0x674),
1746
-                    0x958 => array(0x915, 0x93C), 0x959 => array(0x916, 0x93C), 0x95A => array(0x917, 0x93C),
1747
-                    0x95B => array(0x91C, 0x93C), 0x95C => array(0x921, 0x93C), 0x95D => array(0x922, 0x93C),
1748
-                    0x95E => array(0x92B, 0x93C), 0x95F => array(0x92F, 0x93C), 0x9DC => array(0x9A1, 0x9BC),
1749
-                    0x9DD => array(0x9A2, 0x9BC), 0x9DF => array(0x9AF, 0x9BC), 0xA33 => array(0xA32, 0xA3C),
1750
-                    0xA36 => array(0xA38, 0xA3C), 0xA59 => array(0xA16, 0xA3C), 0xA5A => array(0xA17, 0xA3C),
1751
-                    0xA5B => array(0xA1C, 0xA3C), 0xA5E => array(0xA2B, 0xA3C), 0xB5C => array(0xB21, 0xB3C),
1752
-                    0xB5D => array(0xB22, 0xB3C), 0xE33 => array(0xE4D, 0xE32), 0xEB3 => array(0xECD, 0xEB2),
1753
-                    0xEDC => array(0xEAB, 0xE99), 0xEDD => array(0xEAB, 0xEA1), 0xF0C => array(0xF0B),
1754
-                    0xF43 => array(0xF42, 0xFB7), 0xF4D => array(0xF4C, 0xFB7), 0xF52 => array(0xF51, 0xFB7),
1755
-                    0xF57 => array(0xF56, 0xFB7), 0xF5C => array(0xF5B, 0xFB7), 0xF69 => array(0xF40, 0xFB5),
1756
-                    0xF73 => array(0xF71, 0xF72), 0xF75 => array(0xF71, 0xF74), 0xF76 => array(0xFB2, 0xF80),
1757
-                    0xF77 => array(0xFB2, 0xF71, 0xF80), 0xF78 => array(0xFB3, 0xF80), 0xF79 => array(0xFB3, 0xF71, 0xF80),
1758
-                    0xF81 => array(0xF71, 0xF80), 0xF93 => array(0xF92, 0xFB7), 0xF9D => array(0xF9C, 0xFB7),
1759
-                    0xFA2 => array(0xFA1, 0xFB7), 0xFA7 => array(0xFA6, 0xFB7), 0xFAC => array(0xFAB, 0xFB7),
1760
-                    0xFB9 => array(0xF90, 0xFB5), 0x10C7 => array(0x2D27), 0x10CD => array(0x2D2D),
1761
-                    0x10FC => array(0x10DC), 0x1D2C => array(0x61), 0x1D2D => array(0xE6),
1762
-                    0x1D2E => array(0x62), 0x1D30 => array(0x64), 0x1D31 => array(0x65),
1763
-                    0x1D32 => array(0x1DD), 0x1D33 => array(0x67), 0x1D34 => array(0x68),
1764
-                    0x1D35 => array(0x69), 0x1D36 => array(0x6A), 0x1D37 => array(0x6B),
1765
-                    0x1D38 => array(0x6C), 0x1D39 => array(0x6D), 0x1D3A => array(0x6E),
1766
-                    0x1D3C => array(0x6F), 0x1D3D => array(0x223), 0x1D3E => array(0x70),
1767
-                    0x1D3F => array(0x72), 0x1D40 => array(0x74), 0x1D41 => array(0x75),
1768
-                    0x1D42 => array(0x77), 0x1D43 => array(0x61), 0x1D44 => array(0x250),
1769
-                    0x1D45 => array(0x251), 0x1D46 => array(0x1D02), 0x1D47 => array(0x62),
1770
-                    0x1D48 => array(0x64), 0x1D49 => array(0x65), 0x1D4A => array(0x259),
1771
-                    0x1D4B => array(0x25B), 0x1D4C => array(0x25C), 0x1D4D => array(0x67),
1772
-                    0x1D4F => array(0x6B), 0x1D50 => array(0x6D), 0x1D51 => array(0x14B),
1773
-                    0x1D52 => array(0x6F), 0x1D53 => array(0x254), 0x1D54 => array(0x1D16),
1774
-                    0x1D55 => array(0x1D17), 0x1D56 => array(0x70), 0x1D57 => array(0x74),
1775
-                    0x1D58 => array(0x75), 0x1D59 => array(0x1D1D), 0x1D5A => array(0x26F),
1776
-                    0x1D5B => array(0x76), 0x1D5C => array(0x1D25), 0x1D5D => array(0x3B2),
1777
-                    0x1D5E => array(0x3B3), 0x1D5F => array(0x3B4), 0x1D60 => array(0x3C6),
1778
-                    0x1D61 => array(0x3C7), 0x1D62 => array(0x69), 0x1D63 => array(0x72),
1779
-                    0x1D64 => array(0x75), 0x1D65 => array(0x76), 0x1D66 => array(0x3B2),
1780
-                    0x1D67 => array(0x3B3), 0x1D68 => array(0x3C1), 0x1D69 => array(0x3C6),
1781
-                    0x1D6A => array(0x3C7), 0x1D78 => array(0x43D), 0x1D9B => array(0x252),
1782
-                    0x1D9C => array(0x63), 0x1D9D => array(0x255), 0x1D9E => array(0xF0),
1783
-                    0x1D9F => array(0x25C), 0x1DA0 => array(0x66), 0x1DA1 => array(0x25F),
1784
-                    0x1DA2 => array(0x261), 0x1DA3 => array(0x265), 0x1DA4 => array(0x268),
1785
-                    0x1DA5 => array(0x269), 0x1DA6 => array(0x26A), 0x1DA7 => array(0x1D7B),
1786
-                    0x1DA8 => array(0x29D), 0x1DA9 => array(0x26D), 0x1DAA => array(0x1D85),
1787
-                    0x1DAB => array(0x29F), 0x1DAC => array(0x271), 0x1DAD => array(0x270),
1788
-                    0x1DAE => array(0x272), 0x1DAF => array(0x273), 0x1DB0 => array(0x274),
1789
-                    0x1DB1 => array(0x275), 0x1DB2 => array(0x278), 0x1DB3 => array(0x282),
1790
-                    0x1DB4 => array(0x283), 0x1DB5 => array(0x1AB), 0x1DB6 => array(0x289),
1791
-                    0x1DB7 => array(0x28A), 0x1DB8 => array(0x1D1C), 0x1DB9 => array(0x28B),
1792
-                    0x1DBA => array(0x28C), 0x1DBB => array(0x7A), 0x1DBC => array(0x290),
1793
-                    0x1DBD => array(0x291), 0x1DBE => array(0x292), 0x1DBF => array(0x3B8),
1794
-                    0x1E00 => array(0x1E01), 0x1E02 => array(0x1E03), 0x1E04 => array(0x1E05),
1795
-                    0x1E06 => array(0x1E07), 0x1E08 => array(0x1E09), 0x1E0A => array(0x1E0B),
1796
-                    0x1E0C => array(0x1E0D), 0x1E0E => array(0x1E0F), 0x1E10 => array(0x1E11),
1797
-                    0x1E12 => array(0x1E13), 0x1E14 => array(0x1E15), 0x1E16 => array(0x1E17),
1798
-                    0x1E18 => array(0x1E19), 0x1E1A => array(0x1E1B), 0x1E1C => array(0x1E1D),
1799
-                    0x1E1E => array(0x1E1F), 0x1E20 => array(0x1E21), 0x1E22 => array(0x1E23),
1800
-                    0x1E24 => array(0x1E25), 0x1E26 => array(0x1E27), 0x1E28 => array(0x1E29),
1801
-                    0x1E2A => array(0x1E2B), 0x1E2C => array(0x1E2D), 0x1E2E => array(0x1E2F),
1802
-                    0x1E30 => array(0x1E31), 0x1E32 => array(0x1E33), 0x1E34 => array(0x1E35),
1803
-                    0x1E36 => array(0x1E37), 0x1E38 => array(0x1E39), 0x1E3A => array(0x1E3B),
1804
-                    0x1E3C => array(0x1E3D), 0x1E3E => array(0x1E3F), 0x1E40 => array(0x1E41),
1805
-                    0x1E42 => array(0x1E43), 0x1E44 => array(0x1E45), 0x1E46 => array(0x1E47),
1806
-                    0x1E48 => array(0x1E49), 0x1E4A => array(0x1E4B), 0x1E4C => array(0x1E4D),
1807
-                    0x1E4E => array(0x1E4F), 0x1E50 => array(0x1E51), 0x1E52 => array(0x1E53),
1808
-                    0x1E54 => array(0x1E55), 0x1E56 => array(0x1E57), 0x1E58 => array(0x1E59),
1809
-                    0x1E5A => array(0x1E5B), 0x1E5C => array(0x1E5D), 0x1E5E => array(0x1E5F),
1810
-                    0x1E60 => array(0x1E61), 0x1E62 => array(0x1E63), 0x1E64 => array(0x1E65),
1811
-                    0x1E66 => array(0x1E67), 0x1E68 => array(0x1E69), 0x1E6A => array(0x1E6B),
1812
-                    0x1E6C => array(0x1E6D), 0x1E6E => array(0x1E6F), 0x1E70 => array(0x1E71),
1813
-                    0x1E72 => array(0x1E73), 0x1E74 => array(0x1E75), 0x1E76 => array(0x1E77),
1814
-                    0x1E78 => array(0x1E79), 0x1E7A => array(0x1E7B), 0x1E7C => array(0x1E7D),
1815
-                    0x1E7E => array(0x1E7F), 0x1E80 => array(0x1E81), 0x1E82 => array(0x1E83),
1816
-                    0x1E84 => array(0x1E85), 0x1E86 => array(0x1E87), 0x1E88 => array(0x1E89),
1817
-                    0x1E8A => array(0x1E8B), 0x1E8C => array(0x1E8D), 0x1E8E => array(0x1E8F),
1818
-                    0x1E90 => array(0x1E91), 0x1E92 => array(0x1E93), 0x1E94 => array(0x1E95),
1819
-                    0x1E9A => array(0x61, 0x2BE), 0x1E9B => array(0x1E61), 0x1E9E => array(0x73, 0x73),
1820
-                    0x1EA0 => array(0x1EA1), 0x1EA2 => array(0x1EA3), 0x1EA4 => array(0x1EA5),
1821
-                    0x1EA6 => array(0x1EA7), 0x1EA8 => array(0x1EA9), 0x1EAA => array(0x1EAB),
1822
-                    0x1EAC => array(0x1EAD), 0x1EAE => array(0x1EAF), 0x1EB0 => array(0x1EB1),
1823
-                    0x1EB2 => array(0x1EB3), 0x1EB4 => array(0x1EB5), 0x1EB6 => array(0x1EB7),
1824
-                    0x1EB8 => array(0x1EB9), 0x1EBA => array(0x1EBB), 0x1EBC => array(0x1EBD),
1825
-                    0x1EBE => array(0x1EBF), 0x1EC0 => array(0x1EC1), 0x1EC2 => array(0x1EC3),
1826
-                    0x1EC4 => array(0x1EC5), 0x1EC6 => array(0x1EC7), 0x1EC8 => array(0x1EC9),
1827
-                    0x1ECA => array(0x1ECB), 0x1ECC => array(0x1ECD), 0x1ECE => array(0x1ECF),
1828
-                    0x1ED0 => array(0x1ED1), 0x1ED2 => array(0x1ED3), 0x1ED4 => array(0x1ED5),
1829
-                    0x1ED6 => array(0x1ED7), 0x1ED8 => array(0x1ED9), 0x1EDA => array(0x1EDB),
1830
-                    0x1EDC => array(0x1EDD), 0x1EDE => array(0x1EDF), 0x1EE0 => array(0x1EE1),
1831
-                    0x1EE2 => array(0x1EE3), 0x1EE4 => array(0x1EE5), 0x1EE6 => array(0x1EE7),
1832
-                    0x1EE8 => array(0x1EE9), 0x1EEA => array(0x1EEB), 0x1EEC => array(0x1EED),
1833
-                    0x1EEE => array(0x1EEF), 0x1EF0 => array(0x1EF1), 0x1EF2 => array(0x1EF3),
1834
-                    0x1EF4 => array(0x1EF5), 0x1EF6 => array(0x1EF7), 0x1EF8 => array(0x1EF9),
1835
-                    0x1EFA => array(0x1EFB), 0x1EFC => array(0x1EFD), 0x1EFE => array(0x1EFF),
1836
-                    0x1F08 => array(0x1F00), 0x1F09 => array(0x1F01), 0x1F0A => array(0x1F02),
1837
-                    0x1F0B => array(0x1F03), 0x1F0C => array(0x1F04), 0x1F0D => array(0x1F05),
1838
-                    0x1F0E => array(0x1F06), 0x1F0F => array(0x1F07), 0x1F18 => array(0x1F10),
1839
-                    0x1F19 => array(0x1F11), 0x1F1A => array(0x1F12), 0x1F1B => array(0x1F13),
1840
-                    0x1F1C => array(0x1F14), 0x1F1D => array(0x1F15), 0x1F28 => array(0x1F20),
1841
-                    0x1F29 => array(0x1F21), 0x1F2A => array(0x1F22), 0x1F2B => array(0x1F23),
1842
-                    0x1F2C => array(0x1F24), 0x1F2D => array(0x1F25), 0x1F2E => array(0x1F26),
1843
-                    0x1F2F => array(0x1F27), 0x1F38 => array(0x1F30), 0x1F39 => array(0x1F31),
1844
-                    0x1F3A => array(0x1F32), 0x1F3B => array(0x1F33), 0x1F3C => array(0x1F34),
1845
-                    0x1F3D => array(0x1F35), 0x1F3E => array(0x1F36), 0x1F3F => array(0x1F37),
1846
-                    0x1F48 => array(0x1F40), 0x1F49 => array(0x1F41), 0x1F4A => array(0x1F42),
1847
-                    0x1F4B => array(0x1F43), 0x1F4C => array(0x1F44), 0x1F4D => array(0x1F45),
1848
-                    0x1F59 => array(0x1F51), 0x1F5B => array(0x1F53), 0x1F5D => array(0x1F55),
1849
-                    0x1F5F => array(0x1F57), 0x1F68 => array(0x1F60), 0x1F69 => array(0x1F61),
1850
-                    0x1F6A => array(0x1F62), 0x1F6B => array(0x1F63), 0x1F6C => array(0x1F64),
1851
-                    0x1F6D => array(0x1F65), 0x1F6E => array(0x1F66), 0x1F6F => array(0x1F67),
1852
-                    0x1F71 => array(0x3AC), 0x1F73 => array(0x3AD), 0x1F75 => array(0x3AE),
1853
-                    0x1F77 => array(0x3AF), 0x1F79 => array(0x3CC), 0x1F7B => array(0x3CD),
1854
-                    0x1F7D => array(0x3CE), 0x1F80 => array(0x1F00, 0x3B9), 0x1F81 => array(0x1F01, 0x3B9),
1855
-                    0x1F82 => array(0x1F02, 0x3B9), 0x1F83 => array(0x1F03, 0x3B9), 0x1F84 => array(0x1F04, 0x3B9),
1856
-                    0x1F85 => array(0x1F05, 0x3B9), 0x1F86 => array(0x1F06, 0x3B9), 0x1F87 => array(0x1F07, 0x3B9),
1857
-                    0x1F88 => array(0x1F00, 0x3B9), 0x1F89 => array(0x1F01, 0x3B9), 0x1F8A => array(0x1F02, 0x3B9),
1858
-                    0x1F8B => array(0x1F03, 0x3B9), 0x1F8C => array(0x1F04, 0x3B9), 0x1F8D => array(0x1F05, 0x3B9),
1859
-                    0x1F8E => array(0x1F06, 0x3B9), 0x1F8F => array(0x1F07, 0x3B9), 0x1F90 => array(0x1F20, 0x3B9),
1860
-                    0x1F91 => array(0x1F21, 0x3B9), 0x1F92 => array(0x1F22, 0x3B9), 0x1F93 => array(0x1F23, 0x3B9),
1861
-                    0x1F94 => array(0x1F24, 0x3B9), 0x1F95 => array(0x1F25, 0x3B9), 0x1F96 => array(0x1F26, 0x3B9),
1862
-                    0x1F97 => array(0x1F27, 0x3B9), 0x1F98 => array(0x1F20, 0x3B9), 0x1F99 => array(0x1F21, 0x3B9),
1863
-                    0x1F9A => array(0x1F22, 0x3B9), 0x1F9B => array(0x1F23, 0x3B9), 0x1F9C => array(0x1F24, 0x3B9),
1864
-                    0x1F9D => array(0x1F25, 0x3B9), 0x1F9E => array(0x1F26, 0x3B9), 0x1F9F => array(0x1F27, 0x3B9),
1865
-                    0x1FA0 => array(0x1F60, 0x3B9), 0x1FA1 => array(0x1F61, 0x3B9), 0x1FA2 => array(0x1F62, 0x3B9),
1866
-                    0x1FA3 => array(0x1F63, 0x3B9), 0x1FA4 => array(0x1F64, 0x3B9), 0x1FA5 => array(0x1F65, 0x3B9),
1867
-                    0x1FA6 => array(0x1F66, 0x3B9), 0x1FA7 => array(0x1F67, 0x3B9), 0x1FA8 => array(0x1F60, 0x3B9),
1868
-                    0x1FA9 => array(0x1F61, 0x3B9), 0x1FAA => array(0x1F62, 0x3B9), 0x1FAB => array(0x1F63, 0x3B9),
1869
-                    0x1FAC => array(0x1F64, 0x3B9), 0x1FAD => array(0x1F65, 0x3B9), 0x1FAE => array(0x1F66, 0x3B9),
1870
-                    0x1FAF => array(0x1F67, 0x3B9), 0x1FB2 => array(0x1F70, 0x3B9), 0x1FB3 => array(0x3B1, 0x3B9),
1871
-                    0x1FB4 => array(0x3AC, 0x3B9), 0x1FB7 => array(0x1FB6, 0x3B9), 0x1FB8 => array(0x1FB0),
1872
-                    0x1FB9 => array(0x1FB1), 0x1FBA => array(0x1F70), 0x1FBB => array(0x3AC),
1873
-                    0x1FBC => array(0x3B1, 0x3B9), 0x1FBE => array(0x3B9), 0x1FC2 => array(0x1F74, 0x3B9),
1874
-                    0x1FC3 => array(0x3B7, 0x3B9), 0x1FC4 => array(0x3AE, 0x3B9), 0x1FC7 => array(0x1FC6, 0x3B9),
1875
-                    0x1FC8 => array(0x1F72), 0x1FC9 => array(0x3AD), 0x1FCA => array(0x1F74),
1876
-                    0x1FCB => array(0x3AE), 0x1FCC => array(0x3B7, 0x3B9), 0x1FD3 => array(0x390),
1877
-                    0x1FD8 => array(0x1FD0), 0x1FD9 => array(0x1FD1), 0x1FDA => array(0x1F76),
1878
-                    0x1FDB => array(0x3AF), 0x1FE3 => array(0x3B0), 0x1FE8 => array(0x1FE0),
1879
-                    0x1FE9 => array(0x1FE1), 0x1FEA => array(0x1F7A), 0x1FEB => array(0x3CD),
1880
-                    0x1FEC => array(0x1FE5), 0x1FF2 => array(0x1F7C, 0x3B9), 0x1FF3 => array(0x3C9, 0x3B9),
1881
-                    0x1FF4 => array(0x3CE, 0x3B9), 0x1FF7 => array(0x1FF6, 0x3B9), 0x1FF8 => array(0x1F78),
1882
-                    0x1FF9 => array(0x3CC), 0x1FFA => array(0x1F7C), 0x1FFB => array(0x3CE),
1883
-                    0x1FFC => array(0x3C9, 0x3B9), 0x2011 => array(0x2010), 0x2033 => array(0x2032, 0x2032),
1884
-                    0x2034 => array(0x2032, 0x2032, 0x2032), 0x2036 => array(0x2035, 0x2035), 0x2037 => array(0x2035, 0x2035, 0x2035),
1885
-                    0x2057 => array(0x2032, 0x2032, 0x2032, 0x2032), 0x2070 => array(0x30), 0x2071 => array(0x69),
1886
-                    0x2074 => array(0x34), 0x2075 => array(0x35), 0x2076 => array(0x36),
1887
-                    0x2077 => array(0x37), 0x2078 => array(0x38), 0x2079 => array(0x39),
1888
-                    0x207B => array(0x2212), 0x207F => array(0x6E), 0x2080 => array(0x30),
1889
-                    0x2081 => array(0x31), 0x2082 => array(0x32), 0x2083 => array(0x33),
1890
-                    0x2084 => array(0x34), 0x2085 => array(0x35), 0x2086 => array(0x36),
1891
-                    0x2087 => array(0x37), 0x2088 => array(0x38), 0x2089 => array(0x39),
1892
-                    0x208B => array(0x2212), 0x2090 => array(0x61), 0x2091 => array(0x65),
1893
-                    0x2092 => array(0x6F), 0x2093 => array(0x78), 0x2094 => array(0x259),
1894
-                    0x2095 => array(0x68), 0x2096 => array(0x6B), 0x2097 => array(0x6C),
1895
-                    0x2098 => array(0x6D), 0x2099 => array(0x6E), 0x209A => array(0x70),
1896
-                    0x209B => array(0x73), 0x209C => array(0x74), 0x20A8 => array(0x72, 0x73),
1897
-                    0x2102 => array(0x63), 0x2103 => array(0xB0, 0x63), 0x2107 => array(0x25B),
1898
-                    0x2109 => array(0xB0, 0x66), 0x210A => array(0x67), 0x210B => array(0x68),
1899
-                    0x210C => array(0x68), 0x210D => array(0x68), 0x210E => array(0x68),
1900
-                    0x210F => array(0x127), 0x2110 => array(0x69), 0x2111 => array(0x69),
1901
-                    0x2112 => array(0x6C), 0x2113 => array(0x6C), 0x2115 => array(0x6E),
1902
-                    0x2116 => array(0x6E, 0x6F), 0x2119 => array(0x70), 0x211A => array(0x71),
1903
-                    0x211B => array(0x72), 0x211C => array(0x72), 0x211D => array(0x72),
1904
-                    0x2120 => array(0x73, 0x6D), 0x2121 => array(0x74, 0x65, 0x6C), 0x2122 => array(0x74, 0x6D),
1905
-                    0x2124 => array(0x7A), 0x2126 => array(0x3C9), 0x2128 => array(0x7A),
1906
-                    0x212A => array(0x6B), 0x212B => array(0xE5), 0x212C => array(0x62),
1907
-                    0x212D => array(0x63), 0x212F => array(0x65), 0x2130 => array(0x65),
1908
-                    0x2131 => array(0x66), 0x2133 => array(0x6D), 0x2134 => array(0x6F),
1909
-                    0x2135 => array(0x5D0), 0x2136 => array(0x5D1), 0x2137 => array(0x5D2),
1910
-                    0x2138 => array(0x5D3), 0x2139 => array(0x69), 0x213B => array(0x66, 0x61, 0x78),
1911
-                    0x213C => array(0x3C0), 0x213D => array(0x3B3), 0x213E => array(0x3B3),
1912
-                    0x213F => array(0x3C0), 0x2140 => array(0x2211), 0x2145 => array(0x64),
1913
-                    0x2146 => array(0x64), 0x2147 => array(0x65), 0x2148 => array(0x69),
1914
-                    0x2149 => array(0x6A), 0x2150 => array(0x31, 0x2044, 0x37), 0x2151 => array(0x31, 0x2044, 0x39),
1915
-                    0x2152 => array(0x31, 0x2044, 0x31, 0x30), 0x2153 => array(0x31, 0x2044, 0x33), 0x2154 => array(0x32, 0x2044, 0x33),
1916
-                    0x2155 => array(0x31, 0x2044, 0x35), 0x2156 => array(0x32, 0x2044, 0x35), 0x2157 => array(0x33, 0x2044, 0x35),
1917
-                    0x2158 => array(0x34, 0x2044, 0x35), 0x2159 => array(0x31, 0x2044, 0x36), 0x215A => array(0x35, 0x2044, 0x36),
1918
-                    0x215B => array(0x31, 0x2044, 0x38), 0x215C => array(0x33, 0x2044, 0x38), 0x215D => array(0x35, 0x2044, 0x38),
1919
-                    0x215E => array(0x37, 0x2044, 0x38), 0x215F => array(0x31, 0x2044), 0x2160 => array(0x69),
1920
-                    0x2161 => array(0x69, 0x69), 0x2162 => array(0x69, 0x69, 0x69), 0x2163 => array(0x69, 0x76),
1921
-                    0x2164 => array(0x76), 0x2165 => array(0x76, 0x69), 0x2166 => array(0x76, 0x69, 0x69),
1922
-                    0x2167 => array(0x76, 0x69, 0x69, 0x69), 0x2168 => array(0x69, 0x78), 0x2169 => array(0x78),
1923
-                    0x216A => array(0x78, 0x69), 0x216B => array(0x78, 0x69, 0x69), 0x216C => array(0x6C),
1924
-                    0x216D => array(0x63), 0x216E => array(0x64), 0x216F => array(0x6D),
1925
-                    0x2170 => array(0x69), 0x2171 => array(0x69, 0x69), 0x2172 => array(0x69, 0x69, 0x69),
1926
-                    0x2173 => array(0x69, 0x76), 0x2174 => array(0x76), 0x2175 => array(0x76, 0x69),
1927
-                    0x2176 => array(0x76, 0x69, 0x69), 0x2177 => array(0x76, 0x69, 0x69, 0x69), 0x2178 => array(0x69, 0x78),
1928
-                    0x2179 => array(0x78), 0x217A => array(0x78, 0x69), 0x217B => array(0x78, 0x69, 0x69),
1929
-                    0x217C => array(0x6C), 0x217D => array(0x63), 0x217E => array(0x64),
1930
-                    0x217F => array(0x6D), 0x2189 => array(0x30, 0x2044, 0x33), 0x222C => array(0x222B, 0x222B),
1931
-                    0x222D => array(0x222B, 0x222B, 0x222B), 0x222F => array(0x222E, 0x222E), 0x2230 => array(0x222E, 0x222E, 0x222E),
1932
-                    0x2329 => array(0x3008), 0x232A => array(0x3009), 0x2460 => array(0x31),
1933
-                    0x2461 => array(0x32), 0x2462 => array(0x33), 0x2463 => array(0x34),
1934
-                    0x2464 => array(0x35), 0x2465 => array(0x36), 0x2466 => array(0x37),
1935
-                    0x2467 => array(0x38), 0x2468 => array(0x39), 0x2469 => array(0x31, 0x30),
1936
-                    0x246A => array(0x31, 0x31), 0x246B => array(0x31, 0x32), 0x246C => array(0x31, 0x33),
1937
-                    0x246D => array(0x31, 0x34), 0x246E => array(0x31, 0x35), 0x246F => array(0x31, 0x36),
1938
-                    0x2470 => array(0x31, 0x37), 0x2471 => array(0x31, 0x38), 0x2472 => array(0x31, 0x39),
1939
-                    0x2473 => array(0x32, 0x30), 0x24B6 => array(0x61), 0x24B7 => array(0x62),
1940
-                    0x24B8 => array(0x63), 0x24B9 => array(0x64), 0x24BA => array(0x65),
1941
-                    0x24BB => array(0x66), 0x24BC => array(0x67), 0x24BD => array(0x68),
1942
-                    0x24BE => array(0x69), 0x24BF => array(0x6A), 0x24C0 => array(0x6B),
1943
-                    0x24C1 => array(0x6C), 0x24C2 => array(0x6D), 0x24C3 => array(0x6E),
1944
-                    0x24C4 => array(0x6F), 0x24C5 => array(0x70), 0x24C6 => array(0x71),
1945
-                    0x24C7 => array(0x72), 0x24C8 => array(0x73), 0x24C9 => array(0x74),
1946
-                    0x24CA => array(0x75), 0x24CB => array(0x76), 0x24CC => array(0x77),
1947
-                    0x24CD => array(0x78), 0x24CE => array(0x79), 0x24CF => array(0x7A),
1948
-                    0x24D0 => array(0x61), 0x24D1 => array(0x62), 0x24D2 => array(0x63),
1949
-                    0x24D3 => array(0x64), 0x24D4 => array(0x65), 0x24D5 => array(0x66),
1950
-                    0x24D6 => array(0x67), 0x24D7 => array(0x68), 0x24D8 => array(0x69),
1951
-                    0x24D9 => array(0x6A), 0x24DA => array(0x6B), 0x24DB => array(0x6C),
1952
-                    0x24DC => array(0x6D), 0x24DD => array(0x6E), 0x24DE => array(0x6F),
1953
-                    0x24DF => array(0x70), 0x24E0 => array(0x71), 0x24E1 => array(0x72),
1954
-                    0x24E2 => array(0x73), 0x24E3 => array(0x74), 0x24E4 => array(0x75),
1955
-                    0x24E5 => array(0x76), 0x24E6 => array(0x77), 0x24E7 => array(0x78),
1956
-                    0x24E8 => array(0x79), 0x24E9 => array(0x7A), 0x24EA => array(0x30),
1957
-                    0x2A0C => array(0x222B, 0x222B, 0x222B, 0x222B), 0x2ADC => array(0x2ADD, 0x338), 0x2C00 => array(0x2C30),
1958
-                    0x2C01 => array(0x2C31), 0x2C02 => array(0x2C32), 0x2C03 => array(0x2C33),
1959
-                    0x2C04 => array(0x2C34), 0x2C05 => array(0x2C35), 0x2C06 => array(0x2C36),
1960
-                    0x2C07 => array(0x2C37), 0x2C08 => array(0x2C38), 0x2C09 => array(0x2C39),
1961
-                    0x2C0A => array(0x2C3A), 0x2C0B => array(0x2C3B), 0x2C0C => array(0x2C3C),
1962
-                    0x2C0D => array(0x2C3D), 0x2C0E => array(0x2C3E), 0x2C0F => array(0x2C3F),
1963
-                    0x2C10 => array(0x2C40), 0x2C11 => array(0x2C41), 0x2C12 => array(0x2C42),
1964
-                    0x2C13 => array(0x2C43), 0x2C14 => array(0x2C44), 0x2C15 => array(0x2C45),
1965
-                    0x2C16 => array(0x2C46), 0x2C17 => array(0x2C47), 0x2C18 => array(0x2C48),
1966
-                    0x2C19 => array(0x2C49), 0x2C1A => array(0x2C4A), 0x2C1B => array(0x2C4B),
1967
-                    0x2C1C => array(0x2C4C), 0x2C1D => array(0x2C4D), 0x2C1E => array(0x2C4E),
1968
-                    0x2C1F => array(0x2C4F), 0x2C20 => array(0x2C50), 0x2C21 => array(0x2C51),
1969
-                    0x2C22 => array(0x2C52), 0x2C23 => array(0x2C53), 0x2C24 => array(0x2C54),
1970
-                    0x2C25 => array(0x2C55), 0x2C26 => array(0x2C56), 0x2C27 => array(0x2C57),
1971
-                    0x2C28 => array(0x2C58), 0x2C29 => array(0x2C59), 0x2C2A => array(0x2C5A),
1972
-                    0x2C2B => array(0x2C5B), 0x2C2C => array(0x2C5C), 0x2C2D => array(0x2C5D),
1973
-                    0x2C2E => array(0x2C5E), 0x2C60 => array(0x2C61), 0x2C62 => array(0x26B),
1974
-                    0x2C63 => array(0x1D7D), 0x2C64 => array(0x27D), 0x2C67 => array(0x2C68),
1975
-                    0x2C69 => array(0x2C6A), 0x2C6B => array(0x2C6C), 0x2C6D => array(0x251),
1976
-                    0x2C6E => array(0x271), 0x2C6F => array(0x250), 0x2C70 => array(0x252),
1977
-                    0x2C72 => array(0x2C73), 0x2C75 => array(0x2C76), 0x2C7C => array(0x6A),
1978
-                    0x2C7D => array(0x76), 0x2C7E => array(0x23F), 0x2C7F => array(0x240),
1979
-                    0x2C80 => array(0x2C81), 0x2C82 => array(0x2C83), 0x2C84 => array(0x2C85),
1980
-                    0x2C86 => array(0x2C87), 0x2C88 => array(0x2C89), 0x2C8A => array(0x2C8B),
1981
-                    0x2C8C => array(0x2C8D), 0x2C8E => array(0x2C8F), 0x2C90 => array(0x2C91),
1982
-                    0x2C92 => array(0x2C93), 0x2C94 => array(0x2C95), 0x2C96 => array(0x2C97),
1983
-                    0x2C98 => array(0x2C99), 0x2C9A => array(0x2C9B), 0x2C9C => array(0x2C9D),
1984
-                    0x2C9E => array(0x2C9F), 0x2CA0 => array(0x2CA1), 0x2CA2 => array(0x2CA3),
1985
-                    0x2CA4 => array(0x2CA5), 0x2CA6 => array(0x2CA7), 0x2CA8 => array(0x2CA9),
1986
-                    0x2CAA => array(0x2CAB), 0x2CAC => array(0x2CAD), 0x2CAE => array(0x2CAF),
1987
-                    0x2CB0 => array(0x2CB1), 0x2CB2 => array(0x2CB3), 0x2CB4 => array(0x2CB5),
1988
-                    0x2CB6 => array(0x2CB7), 0x2CB8 => array(0x2CB9), 0x2CBA => array(0x2CBB),
1989
-                    0x2CBC => array(0x2CBD), 0x2CBE => array(0x2CBF), 0x2CC0 => array(0x2CC1),
1990
-                    0x2CC2 => array(0x2CC3), 0x2CC4 => array(0x2CC5), 0x2CC6 => array(0x2CC7),
1991
-                    0x2CC8 => array(0x2CC9), 0x2CCA => array(0x2CCB), 0x2CCC => array(0x2CCD),
1992
-                    0x2CCE => array(0x2CCF), 0x2CD0 => array(0x2CD1), 0x2CD2 => array(0x2CD3),
1993
-                    0x2CD4 => array(0x2CD5), 0x2CD6 => array(0x2CD7), 0x2CD8 => array(0x2CD9),
1994
-                    0x2CDA => array(0x2CDB), 0x2CDC => array(0x2CDD), 0x2CDE => array(0x2CDF),
1995
-                    0x2CE0 => array(0x2CE1), 0x2CE2 => array(0x2CE3), 0x2CEB => array(0x2CEC),
1996
-                    0x2CED => array(0x2CEE), 0x2CF2 => array(0x2CF3), 0x2D6F => array(0x2D61),
1997
-                    0x2E9F => array(0x6BCD), 0x2EF3 => array(0x9F9F), 0x2F00 => array(0x4E00),
1998
-                    0x2F01 => array(0x4E28), 0x2F02 => array(0x4E36), 0x2F03 => array(0x4E3F),
1999
-                    0x2F04 => array(0x4E59), 0x2F05 => array(0x4E85), 0x2F06 => array(0x4E8C),
2000
-                    0x2F07 => array(0x4EA0), 0x2F08 => array(0x4EBA), 0x2F09 => array(0x513F),
2001
-                    0x2F0A => array(0x5165), 0x2F0B => array(0x516B), 0x2F0C => array(0x5182),
2002
-                    0x2F0D => array(0x5196), 0x2F0E => array(0x51AB), 0x2F0F => array(0x51E0),
2003
-                    0x2F10 => array(0x51F5), 0x2F11 => array(0x5200), 0x2F12 => array(0x529B),
2004
-                    0x2F13 => array(0x52F9), 0x2F14 => array(0x5315), 0x2F15 => array(0x531A),
2005
-                    0x2F16 => array(0x5338), 0x2F17 => array(0x5341), 0x2F18 => array(0x535C),
2006
-                    0x2F19 => array(0x5369), 0x2F1A => array(0x5382), 0x2F1B => array(0x53B6),
2007
-                    0x2F1C => array(0x53C8), 0x2F1D => array(0x53E3), 0x2F1E => array(0x56D7),
2008
-                    0x2F1F => array(0x571F), 0x2F20 => array(0x58EB), 0x2F21 => array(0x5902),
2009
-                    0x2F22 => array(0x590A), 0x2F23 => array(0x5915), 0x2F24 => array(0x5927),
2010
-                    0x2F25 => array(0x5973), 0x2F26 => array(0x5B50), 0x2F27 => array(0x5B80),
2011
-                    0x2F28 => array(0x5BF8), 0x2F29 => array(0x5C0F), 0x2F2A => array(0x5C22),
2012
-                    0x2F2B => array(0x5C38), 0x2F2C => array(0x5C6E), 0x2F2D => array(0x5C71),
2013
-                    0x2F2E => array(0x5DDB), 0x2F2F => array(0x5DE5), 0x2F30 => array(0x5DF1),
2014
-                    0x2F31 => array(0x5DFE), 0x2F32 => array(0x5E72), 0x2F33 => array(0x5E7A),
2015
-                    0x2F34 => array(0x5E7F), 0x2F35 => array(0x5EF4), 0x2F36 => array(0x5EFE),
2016
-                    0x2F37 => array(0x5F0B), 0x2F38 => array(0x5F13), 0x2F39 => array(0x5F50),
2017
-                    0x2F3A => array(0x5F61), 0x2F3B => array(0x5F73), 0x2F3C => array(0x5FC3),
2018
-                    0x2F3D => array(0x6208), 0x2F3E => array(0x6236), 0x2F3F => array(0x624B),
2019
-                    0x2F40 => array(0x652F), 0x2F41 => array(0x6534), 0x2F42 => array(0x6587),
2020
-                    0x2F43 => array(0x6597), 0x2F44 => array(0x65A4), 0x2F45 => array(0x65B9),
2021
-                    0x2F46 => array(0x65E0), 0x2F47 => array(0x65E5), 0x2F48 => array(0x66F0),
2022
-                    0x2F49 => array(0x6708), 0x2F4A => array(0x6728), 0x2F4B => array(0x6B20),
2023
-                    0x2F4C => array(0x6B62), 0x2F4D => array(0x6B79), 0x2F4E => array(0x6BB3),
2024
-                    0x2F4F => array(0x6BCB), 0x2F50 => array(0x6BD4), 0x2F51 => array(0x6BDB),
2025
-                    0x2F52 => array(0x6C0F), 0x2F53 => array(0x6C14), 0x2F54 => array(0x6C34),
2026
-                    0x2F55 => array(0x706B), 0x2F56 => array(0x722A), 0x2F57 => array(0x7236),
2027
-                    0x2F58 => array(0x723B), 0x2F59 => array(0x723F), 0x2F5A => array(0x7247),
2028
-                    0x2F5B => array(0x7259), 0x2F5C => array(0x725B), 0x2F5D => array(0x72AC),
2029
-                    0x2F5E => array(0x7384), 0x2F5F => array(0x7389), 0x2F60 => array(0x74DC),
2030
-                    0x2F61 => array(0x74E6), 0x2F62 => array(0x7518), 0x2F63 => array(0x751F),
2031
-                    0x2F64 => array(0x7528), 0x2F65 => array(0x7530), 0x2F66 => array(0x758B),
2032
-                    0x2F67 => array(0x7592), 0x2F68 => array(0x7676), 0x2F69 => array(0x767D),
2033
-                    0x2F6A => array(0x76AE), 0x2F6B => array(0x76BF), 0x2F6C => array(0x76EE),
2034
-                    0x2F6D => array(0x77DB), 0x2F6E => array(0x77E2), 0x2F6F => array(0x77F3),
2035
-                    0x2F70 => array(0x793A), 0x2F71 => array(0x79B8), 0x2F72 => array(0x79BE),
2036
-                    0x2F73 => array(0x7A74), 0x2F74 => array(0x7ACB), 0x2F75 => array(0x7AF9),
2037
-                    0x2F76 => array(0x7C73), 0x2F77 => array(0x7CF8), 0x2F78 => array(0x7F36),
2038
-                    0x2F79 => array(0x7F51), 0x2F7A => array(0x7F8A), 0x2F7B => array(0x7FBD),
2039
-                    0x2F7C => array(0x8001), 0x2F7D => array(0x800C), 0x2F7E => array(0x8012),
2040
-                    0x2F7F => array(0x8033), 0x2F80 => array(0x807F), 0x2F81 => array(0x8089),
2041
-                    0x2F82 => array(0x81E3), 0x2F83 => array(0x81EA), 0x2F84 => array(0x81F3),
2042
-                    0x2F85 => array(0x81FC), 0x2F86 => array(0x820C), 0x2F87 => array(0x821B),
2043
-                    0x2F88 => array(0x821F), 0x2F89 => array(0x826E), 0x2F8A => array(0x8272),
2044
-                    0x2F8B => array(0x8278), 0x2F8C => array(0x864D), 0x2F8D => array(0x866B),
2045
-                    0x2F8E => array(0x8840), 0x2F8F => array(0x884C), 0x2F90 => array(0x8863),
2046
-                    0x2F91 => array(0x897E), 0x2F92 => array(0x898B), 0x2F93 => array(0x89D2),
2047
-                    0x2F94 => array(0x8A00), 0x2F95 => array(0x8C37), 0x2F96 => array(0x8C46),
2048
-                    0x2F97 => array(0x8C55), 0x2F98 => array(0x8C78), 0x2F99 => array(0x8C9D),
2049
-                    0x2F9A => array(0x8D64), 0x2F9B => array(0x8D70), 0x2F9C => array(0x8DB3),
2050
-                    0x2F9D => array(0x8EAB), 0x2F9E => array(0x8ECA), 0x2F9F => array(0x8F9B),
2051
-                    0x2FA0 => array(0x8FB0), 0x2FA1 => array(0x8FB5), 0x2FA2 => array(0x9091),
2052
-                    0x2FA3 => array(0x9149), 0x2FA4 => array(0x91C6), 0x2FA5 => array(0x91CC),
2053
-                    0x2FA6 => array(0x91D1), 0x2FA7 => array(0x9577), 0x2FA8 => array(0x9580),
2054
-                    0x2FA9 => array(0x961C), 0x2FAA => array(0x96B6), 0x2FAB => array(0x96B9),
2055
-                    0x2FAC => array(0x96E8), 0x2FAD => array(0x9751), 0x2FAE => array(0x975E),
2056
-                    0x2FAF => array(0x9762), 0x2FB0 => array(0x9769), 0x2FB1 => array(0x97CB),
2057
-                    0x2FB2 => array(0x97ED), 0x2FB3 => array(0x97F3), 0x2FB4 => array(0x9801),
2058
-                    0x2FB5 => array(0x98A8), 0x2FB6 => array(0x98DB), 0x2FB7 => array(0x98DF),
2059
-                    0x2FB8 => array(0x9996), 0x2FB9 => array(0x9999), 0x2FBA => array(0x99AC),
2060
-                    0x2FBB => array(0x9AA8), 0x2FBC => array(0x9AD8), 0x2FBD => array(0x9ADF),
2061
-                    0x2FBE => array(0x9B25), 0x2FBF => array(0x9B2F), 0x2FC0 => array(0x9B32),
2062
-                    0x2FC1 => array(0x9B3C), 0x2FC2 => array(0x9B5A), 0x2FC3 => array(0x9CE5),
2063
-                    0x2FC4 => array(0x9E75), 0x2FC5 => array(0x9E7F), 0x2FC6 => array(0x9EA5),
2064
-                    0x2FC7 => array(0x9EBB), 0x2FC8 => array(0x9EC3), 0x2FC9 => array(0x9ECD),
2065
-                    0x2FCA => array(0x9ED1), 0x2FCB => array(0x9EF9), 0x2FCC => array(0x9EFD),
2066
-                    0x2FCD => array(0x9F0E), 0x2FCE => array(0x9F13), 0x2FCF => array(0x9F20),
2067
-                    0x2FD0 => array(0x9F3B), 0x2FD1 => array(0x9F4A), 0x2FD2 => array(0x9F52),
2068
-                    0x2FD3 => array(0x9F8D), 0x2FD4 => array(0x9F9C), 0x2FD5 => array(0x9FA0),
2069
-                    0x3002 => array(0x2E), 0x3036 => array(0x3012), 0x3038 => array(0x5341),
2070
-                    0x3039 => array(0x5344), 0x303A => array(0x5345), 0x309F => array(0x3088, 0x308A),
2071
-                    0x30FF => array(0x30B3, 0x30C8), 0x3131 => array(0x1100), 0x3132 => array(0x1101),
2072
-                    0x3133 => array(0x11AA), 0x3134 => array(0x1102), 0x3135 => array(0x11AC),
2073
-                    0x3136 => array(0x11AD), 0x3137 => array(0x1103), 0x3138 => array(0x1104),
2074
-                    0x3139 => array(0x1105), 0x313A => array(0x11B0), 0x313B => array(0x11B1),
2075
-                    0x313C => array(0x11B2), 0x313D => array(0x11B3), 0x313E => array(0x11B4),
2076
-                    0x313F => array(0x11B5), 0x3140 => array(0x111A), 0x3141 => array(0x1106),
2077
-                    0x3142 => array(0x1107), 0x3143 => array(0x1108), 0x3144 => array(0x1121),
2078
-                    0x3145 => array(0x1109), 0x3146 => array(0x110A), 0x3147 => array(0x110B),
2079
-                    0x3148 => array(0x110C), 0x3149 => array(0x110D), 0x314A => array(0x110E),
2080
-                    0x314B => array(0x110F), 0x314C => array(0x1110), 0x314D => array(0x1111),
2081
-                    0x314E => array(0x1112), 0x314F => array(0x1161), 0x3150 => array(0x1162),
2082
-                    0x3151 => array(0x1163), 0x3152 => array(0x1164), 0x3153 => array(0x1165),
2083
-                    0x3154 => array(0x1166), 0x3155 => array(0x1167), 0x3156 => array(0x1168),
2084
-                    0x3157 => array(0x1169), 0x3158 => array(0x116A), 0x3159 => array(0x116B),
2085
-                    0x315A => array(0x116C), 0x315B => array(0x116D), 0x315C => array(0x116E),
2086
-                    0x315D => array(0x116F), 0x315E => array(0x1170), 0x315F => array(0x1171),
2087
-                    0x3160 => array(0x1172), 0x3161 => array(0x1173), 0x3162 => array(0x1174),
2088
-                    0x3163 => array(0x1175), 0x3165 => array(0x1114), 0x3166 => array(0x1115),
2089
-                    0x3167 => array(0x11C7), 0x3168 => array(0x11C8), 0x3169 => array(0x11CC),
2090
-                    0x316A => array(0x11CE), 0x316B => array(0x11D3), 0x316C => array(0x11D7),
2091
-                    0x316D => array(0x11D9), 0x316E => array(0x111C), 0x316F => array(0x11DD),
2092
-                    0x3170 => array(0x11DF), 0x3171 => array(0x111D), 0x3172 => array(0x111E),
2093
-                    0x3173 => array(0x1120), 0x3174 => array(0x1122), 0x3175 => array(0x1123),
2094
-                    0x3176 => array(0x1127), 0x3177 => array(0x1129), 0x3178 => array(0x112B),
2095
-                    0x3179 => array(0x112C), 0x317A => array(0x112D), 0x317B => array(0x112E),
2096
-                    0x317C => array(0x112F), 0x317D => array(0x1132), 0x317E => array(0x1136),
2097
-                    0x317F => array(0x1140), 0x3180 => array(0x1147), 0x3181 => array(0x114C),
2098
-                    0x3182 => array(0x11F1), 0x3183 => array(0x11F2), 0x3184 => array(0x1157),
2099
-                    0x3185 => array(0x1158), 0x3186 => array(0x1159), 0x3187 => array(0x1184),
2100
-                    0x3188 => array(0x1185), 0x3189 => array(0x1188), 0x318A => array(0x1191),
2101
-                    0x318B => array(0x1192), 0x318C => array(0x1194), 0x318D => array(0x119E),
2102
-                    0x318E => array(0x11A1), 0x3192 => array(0x4E00), 0x3193 => array(0x4E8C),
2103
-                    0x3194 => array(0x4E09), 0x3195 => array(0x56DB), 0x3196 => array(0x4E0A),
2104
-                    0x3197 => array(0x4E2D), 0x3198 => array(0x4E0B), 0x3199 => array(0x7532),
2105
-                    0x319A => array(0x4E59), 0x319B => array(0x4E19), 0x319C => array(0x4E01),
2106
-                    0x319D => array(0x5929), 0x319E => array(0x5730), 0x319F => array(0x4EBA),
2107
-                    0x3244 => array(0x554F), 0x3245 => array(0x5E7C), 0x3246 => array(0x6587),
2108
-                    0x3247 => array(0x7B8F), 0x3250 => array(0x70, 0x74, 0x65), 0x3251 => array(0x32, 0x31),
2109
-                    0x3252 => array(0x32, 0x32), 0x3253 => array(0x32, 0x33), 0x3254 => array(0x32, 0x34),
2110
-                    0x3255 => array(0x32, 0x35), 0x3256 => array(0x32, 0x36), 0x3257 => array(0x32, 0x37),
2111
-                    0x3258 => array(0x32, 0x38), 0x3259 => array(0x32, 0x39), 0x325A => array(0x33, 0x30),
2112
-                    0x325B => array(0x33, 0x31), 0x325C => array(0x33, 0x32), 0x325D => array(0x33, 0x33),
2113
-                    0x325E => array(0x33, 0x34), 0x325F => array(0x33, 0x35), 0x3260 => array(0x1100),
2114
-                    0x3261 => array(0x1102), 0x3262 => array(0x1103), 0x3263 => array(0x1105),
2115
-                    0x3264 => array(0x1106), 0x3265 => array(0x1107), 0x3266 => array(0x1109),
2116
-                    0x3267 => array(0x110B), 0x3268 => array(0x110C), 0x3269 => array(0x110E),
2117
-                    0x326A => array(0x110F), 0x326B => array(0x1110), 0x326C => array(0x1111),
2118
-                    0x326D => array(0x1112), 0x326E => array(0xAC00), 0x326F => array(0xB098),
2119
-                    0x3270 => array(0xB2E4), 0x3271 => array(0xB77C), 0x3272 => array(0xB9C8),
2120
-                    0x3273 => array(0xBC14), 0x3274 => array(0xC0AC), 0x3275 => array(0xC544),
2121
-                    0x3276 => array(0xC790), 0x3277 => array(0xCC28), 0x3278 => array(0xCE74),
2122
-                    0x3279 => array(0xD0C0), 0x327A => array(0xD30C), 0x327B => array(0xD558),
2123
-                    0x327C => array(0xCC38, 0xACE0), 0x327D => array(0xC8FC, 0xC758), 0x327E => array(0xC6B0),
2124
-                    0x3280 => array(0x4E00), 0x3281 => array(0x4E8C), 0x3282 => array(0x4E09),
2125
-                    0x3283 => array(0x56DB), 0x3284 => array(0x4E94), 0x3285 => array(0x516D),
2126
-                    0x3286 => array(0x4E03), 0x3287 => array(0x516B), 0x3288 => array(0x4E5D),
2127
-                    0x3289 => array(0x5341), 0x328A => array(0x6708), 0x328B => array(0x706B),
2128
-                    0x328C => array(0x6C34), 0x328D => array(0x6728), 0x328E => array(0x91D1),
2129
-                    0x328F => array(0x571F), 0x3290 => array(0x65E5), 0x3291 => array(0x682A),
2130
-                    0x3292 => array(0x6709), 0x3293 => array(0x793E), 0x3294 => array(0x540D),
2131
-                    0x3295 => array(0x7279), 0x3296 => array(0x8CA1), 0x3297 => array(0x795D),
2132
-                    0x3298 => array(0x52B4), 0x3299 => array(0x79D8), 0x329A => array(0x7537),
2133
-                    0x329B => array(0x5973), 0x329C => array(0x9069), 0x329D => array(0x512A),
2134
-                    0x329E => array(0x5370), 0x329F => array(0x6CE8), 0x32A0 => array(0x9805),
2135
-                    0x32A1 => array(0x4F11), 0x32A2 => array(0x5199), 0x32A3 => array(0x6B63),
2136
-                    0x32A4 => array(0x4E0A), 0x32A5 => array(0x4E2D), 0x32A6 => array(0x4E0B),
2137
-                    0x32A7 => array(0x5DE6), 0x32A8 => array(0x53F3), 0x32A9 => array(0x533B),
2138
-                    0x32AA => array(0x5B97), 0x32AB => array(0x5B66), 0x32AC => array(0x76E3),
2139
-                    0x32AD => array(0x4F01), 0x32AE => array(0x8CC7), 0x32AF => array(0x5354),
2140
-                    0x32B0 => array(0x591C), 0x32B1 => array(0x33, 0x36), 0x32B2 => array(0x33, 0x37),
2141
-                    0x32B3 => array(0x33, 0x38), 0x32B4 => array(0x33, 0x39), 0x32B5 => array(0x34, 0x30),
2142
-                    0x32B6 => array(0x34, 0x31), 0x32B7 => array(0x34, 0x32), 0x32B8 => array(0x34, 0x33),
2143
-                    0x32B9 => array(0x34, 0x34), 0x32BA => array(0x34, 0x35), 0x32BB => array(0x34, 0x36),
2144
-                    0x32BC => array(0x34, 0x37), 0x32BD => array(0x34, 0x38), 0x32BE => array(0x34, 0x39),
2145
-                    0x32BF => array(0x35, 0x30), 0x32C0 => array(0x31, 0x6708), 0x32C1 => array(0x32, 0x6708),
2146
-                    0x32C2 => array(0x33, 0x6708), 0x32C3 => array(0x34, 0x6708), 0x32C4 => array(0x35, 0x6708),
2147
-                    0x32C5 => array(0x36, 0x6708), 0x32C6 => array(0x37, 0x6708), 0x32C7 => array(0x38, 0x6708),
2148
-                    0x32C8 => array(0x39, 0x6708), 0x32C9 => array(0x31, 0x30, 0x6708), 0x32CA => array(0x31, 0x31, 0x6708),
2149
-                    0x32CB => array(0x31, 0x32, 0x6708), 0x32CC => array(0x68, 0x67), 0x32CD => array(0x65, 0x72, 0x67),
2150
-                    0x32CE => array(0x65, 0x76), 0x32CF => array(0x6C, 0x74, 0x64), 0x32D0 => array(0x30A2),
2151
-                    0x32D1 => array(0x30A4), 0x32D2 => array(0x30A6), 0x32D3 => array(0x30A8),
2152
-                    0x32D4 => array(0x30AA), 0x32D5 => array(0x30AB), 0x32D6 => array(0x30AD),
2153
-                    0x32D7 => array(0x30AF), 0x32D8 => array(0x30B1), 0x32D9 => array(0x30B3),
2154
-                    0x32DA => array(0x30B5), 0x32DB => array(0x30B7), 0x32DC => array(0x30B9),
2155
-                    0x32DD => array(0x30BB), 0x32DE => array(0x30BD), 0x32DF => array(0x30BF),
2156
-                    0x32E0 => array(0x30C1), 0x32E1 => array(0x30C4), 0x32E2 => array(0x30C6),
2157
-                    0x32E3 => array(0x30C8), 0x32E4 => array(0x30CA), 0x32E5 => array(0x30CB),
2158
-                    0x32E6 => array(0x30CC), 0x32E7 => array(0x30CD), 0x32E8 => array(0x30CE),
2159
-                    0x32E9 => array(0x30CF), 0x32EA => array(0x30D2), 0x32EB => array(0x30D5),
2160
-                    0x32EC => array(0x30D8), 0x32ED => array(0x30DB), 0x32EE => array(0x30DE),
2161
-                    0x32EF => array(0x30DF), 0x32F0 => array(0x30E0), 0x32F1 => array(0x30E1),
2162
-                    0x32F2 => array(0x30E2), 0x32F3 => array(0x30E4), 0x32F4 => array(0x30E6),
2163
-                    0x32F5 => array(0x30E8), 0x32F6 => array(0x30E9), 0x32F7 => array(0x30EA),
2164
-                    0x32F8 => array(0x30EB), 0x32F9 => array(0x30EC), 0x32FA => array(0x30ED),
2165
-                    0x32FB => array(0x30EF), 0x32FC => array(0x30F0), 0x32FD => array(0x30F1),
2166
-                    0x32FE => array(0x30F2), 0x3300 => array(0x30A2, 0x30D1, 0x30FC, 0x30C8), 0x3301 => array(0x30A2, 0x30EB, 0x30D5, 0x30A1),
2167
-                    0x3302 => array(0x30A2, 0x30F3, 0x30DA, 0x30A2), 0x3303 => array(0x30A2, 0x30FC, 0x30EB), 0x3304 => array(0x30A4, 0x30CB, 0x30F3, 0x30B0),
2168
-                    0x3305 => array(0x30A4, 0x30F3, 0x30C1), 0x3306 => array(0x30A6, 0x30A9, 0x30F3), 0x3307 => array(0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C9),
2169
-                    0x3308 => array(0x30A8, 0x30FC, 0x30AB, 0x30FC), 0x3309 => array(0x30AA, 0x30F3, 0x30B9), 0x330A => array(0x30AA, 0x30FC, 0x30E0),
2170
-                    0x330B => array(0x30AB, 0x30A4, 0x30EA), 0x330C => array(0x30AB, 0x30E9, 0x30C3, 0x30C8), 0x330D => array(0x30AB, 0x30ED, 0x30EA, 0x30FC),
2171
-                    0x330E => array(0x30AC, 0x30ED, 0x30F3), 0x330F => array(0x30AC, 0x30F3, 0x30DE), 0x3310 => array(0x30AE, 0x30AC),
2172
-                    0x3311 => array(0x30AE, 0x30CB, 0x30FC), 0x3312 => array(0x30AD, 0x30E5, 0x30EA, 0x30FC), 0x3313 => array(0x30AE, 0x30EB, 0x30C0, 0x30FC),
2173
-                    0x3314 => array(0x30AD, 0x30ED), 0x3315 => array(0x30AD, 0x30ED, 0x30B0, 0x30E9, 0x30E0), 0x3316 => array(0x30AD, 0x30ED, 0x30E1, 0x30FC, 0x30C8, 0x30EB),
2174
-                    0x3317 => array(0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8), 0x3318 => array(0x30B0, 0x30E9, 0x30E0), 0x3319 => array(0x30B0, 0x30E9, 0x30E0, 0x30C8, 0x30F3),
2175
-                    0x331A => array(0x30AF, 0x30EB, 0x30BC, 0x30A4, 0x30ED), 0x331B => array(0x30AF, 0x30ED, 0x30FC, 0x30CD), 0x331C => array(0x30B1, 0x30FC, 0x30B9),
2176
-                    0x331D => array(0x30B3, 0x30EB, 0x30CA), 0x331E => array(0x30B3, 0x30FC, 0x30DD), 0x331F => array(0x30B5, 0x30A4, 0x30AF, 0x30EB),
2177
-                    0x3320 => array(0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0), 0x3321 => array(0x30B7, 0x30EA, 0x30F3, 0x30B0), 0x3322 => array(0x30BB, 0x30F3, 0x30C1),
2178
-                    0x3323 => array(0x30BB, 0x30F3, 0x30C8), 0x3324 => array(0x30C0, 0x30FC, 0x30B9), 0x3325 => array(0x30C7, 0x30B7),
2179
-                    0x3326 => array(0x30C9, 0x30EB), 0x3327 => array(0x30C8, 0x30F3), 0x3328 => array(0x30CA, 0x30CE),
2180
-                    0x3329 => array(0x30CE, 0x30C3, 0x30C8), 0x332A => array(0x30CF, 0x30A4, 0x30C4), 0x332B => array(0x30D1, 0x30FC, 0x30BB, 0x30F3, 0x30C8),
2181
-                    0x332C => array(0x30D1, 0x30FC, 0x30C4), 0x332D => array(0x30D0, 0x30FC, 0x30EC, 0x30EB), 0x332E => array(0x30D4, 0x30A2, 0x30B9, 0x30C8, 0x30EB),
2182
-                    0x332F => array(0x30D4, 0x30AF, 0x30EB), 0x3330 => array(0x30D4, 0x30B3), 0x3331 => array(0x30D3, 0x30EB),
2183
-                    0x3332 => array(0x30D5, 0x30A1, 0x30E9, 0x30C3, 0x30C9), 0x3333 => array(0x30D5, 0x30A3, 0x30FC, 0x30C8), 0x3334 => array(0x30D6, 0x30C3, 0x30B7, 0x30A7, 0x30EB),
2184
-                    0x3335 => array(0x30D5, 0x30E9, 0x30F3), 0x3336 => array(0x30D8, 0x30AF, 0x30BF, 0x30FC, 0x30EB), 0x3337 => array(0x30DA, 0x30BD),
2185
-                    0x3338 => array(0x30DA, 0x30CB, 0x30D2), 0x3339 => array(0x30D8, 0x30EB, 0x30C4), 0x333A => array(0x30DA, 0x30F3, 0x30B9),
2186
-                    0x333B => array(0x30DA, 0x30FC, 0x30B8), 0x333C => array(0x30D9, 0x30FC, 0x30BF), 0x333D => array(0x30DD, 0x30A4, 0x30F3, 0x30C8),
2187
-                    0x333E => array(0x30DC, 0x30EB, 0x30C8), 0x333F => array(0x30DB, 0x30F3), 0x3340 => array(0x30DD, 0x30F3, 0x30C9),
2188
-                    0x3341 => array(0x30DB, 0x30FC, 0x30EB), 0x3342 => array(0x30DB, 0x30FC, 0x30F3), 0x3343 => array(0x30DE, 0x30A4, 0x30AF, 0x30ED),
2189
-                    0x3344 => array(0x30DE, 0x30A4, 0x30EB), 0x3345 => array(0x30DE, 0x30C3, 0x30CF), 0x3346 => array(0x30DE, 0x30EB, 0x30AF),
2190
-                    0x3347 => array(0x30DE, 0x30F3, 0x30B7, 0x30E7, 0x30F3), 0x3348 => array(0x30DF, 0x30AF, 0x30ED, 0x30F3), 0x3349 => array(0x30DF, 0x30EA),
2191
-                    0x334A => array(0x30DF, 0x30EA, 0x30D0, 0x30FC, 0x30EB), 0x334B => array(0x30E1, 0x30AC), 0x334C => array(0x30E1, 0x30AC, 0x30C8, 0x30F3),
2192
-                    0x334D => array(0x30E1, 0x30FC, 0x30C8, 0x30EB), 0x334E => array(0x30E4, 0x30FC, 0x30C9), 0x334F => array(0x30E4, 0x30FC, 0x30EB),
2193
-                    0x3350 => array(0x30E6, 0x30A2, 0x30F3), 0x3351 => array(0x30EA, 0x30C3, 0x30C8, 0x30EB), 0x3352 => array(0x30EA, 0x30E9),
2194
-                    0x3353 => array(0x30EB, 0x30D4, 0x30FC), 0x3354 => array(0x30EB, 0x30FC, 0x30D6, 0x30EB), 0x3355 => array(0x30EC, 0x30E0),
2195
-                    0x3356 => array(0x30EC, 0x30F3, 0x30C8, 0x30B2, 0x30F3), 0x3357 => array(0x30EF, 0x30C3, 0x30C8), 0x3358 => array(0x30, 0x70B9),
2196
-                    0x3359 => array(0x31, 0x70B9), 0x335A => array(0x32, 0x70B9), 0x335B => array(0x33, 0x70B9),
2197
-                    0x335C => array(0x34, 0x70B9), 0x335D => array(0x35, 0x70B9), 0x335E => array(0x36, 0x70B9),
2198
-                    0x335F => array(0x37, 0x70B9), 0x3360 => array(0x38, 0x70B9), 0x3361 => array(0x39, 0x70B9),
2199
-                    0x3362 => array(0x31, 0x30, 0x70B9), 0x3363 => array(0x31, 0x31, 0x70B9), 0x3364 => array(0x31, 0x32, 0x70B9),
2200
-                    0x3365 => array(0x31, 0x33, 0x70B9), 0x3366 => array(0x31, 0x34, 0x70B9), 0x3367 => array(0x31, 0x35, 0x70B9),
2201
-                    0x3368 => array(0x31, 0x36, 0x70B9), 0x3369 => array(0x31, 0x37, 0x70B9), 0x336A => array(0x31, 0x38, 0x70B9),
2202
-                    0x336B => array(0x31, 0x39, 0x70B9), 0x336C => array(0x32, 0x30, 0x70B9), 0x336D => array(0x32, 0x31, 0x70B9),
2203
-                    0x336E => array(0x32, 0x32, 0x70B9), 0x336F => array(0x32, 0x33, 0x70B9), 0x3370 => array(0x32, 0x34, 0x70B9),
2204
-                    0x3371 => array(0x68, 0x70, 0x61), 0x3372 => array(0x64, 0x61), 0x3373 => array(0x61, 0x75),
2205
-                    0x3374 => array(0x62, 0x61, 0x72), 0x3375 => array(0x6F, 0x76), 0x3376 => array(0x70, 0x63),
2206
-                    0x3377 => array(0x64, 0x6D), 0x3378 => array(0x64, 0x6D, 0x32), 0x3379 => array(0x64, 0x6D, 0x33),
2207
-                    0x337A => array(0x69, 0x75), 0x337B => array(0x5E73, 0x6210), 0x337C => array(0x662D, 0x548C),
2208
-                    0x337D => array(0x5927, 0x6B63), 0x337E => array(0x660E, 0x6CBB), 0x337F => array(0x682A, 0x5F0F, 0x4F1A, 0x793E),
2209
-                    0x3380 => array(0x70, 0x61), 0x3381 => array(0x6E, 0x61), 0x3382 => array(0x3BC, 0x61),
2210
-                    0x3383 => array(0x6D, 0x61), 0x3384 => array(0x6B, 0x61), 0x3385 => array(0x6B, 0x62),
2211
-                    0x3386 => array(0x6D, 0x62), 0x3387 => array(0x67, 0x62), 0x3388 => array(0x63, 0x61, 0x6C),
2212
-                    0x3389 => array(0x6B, 0x63, 0x61, 0x6C), 0x338A => array(0x70, 0x66), 0x338B => array(0x6E, 0x66),
2213
-                    0x338C => array(0x3BC, 0x66), 0x338D => array(0x3BC, 0x67), 0x338E => array(0x6D, 0x67),
2214
-                    0x338F => array(0x6B, 0x67), 0x3390 => array(0x68, 0x7A), 0x3391 => array(0x6B, 0x68, 0x7A),
2215
-                    0x3392 => array(0x6D, 0x68, 0x7A), 0x3393 => array(0x67, 0x68, 0x7A), 0x3394 => array(0x74, 0x68, 0x7A),
2216
-                    0x3395 => array(0x3BC, 0x6C), 0x3396 => array(0x6D, 0x6C), 0x3397 => array(0x64, 0x6C),
2217
-                    0x3398 => array(0x6B, 0x6C), 0x3399 => array(0x66, 0x6D), 0x339A => array(0x6E, 0x6D),
2218
-                    0x339B => array(0x3BC, 0x6D), 0x339C => array(0x6D, 0x6D), 0x339D => array(0x63, 0x6D),
2219
-                    0x339E => array(0x6B, 0x6D), 0x339F => array(0x6D, 0x6D, 0x32), 0x33A0 => array(0x63, 0x6D, 0x32),
2220
-                    0x33A1 => array(0x6D, 0x32), 0x33A2 => array(0x6B, 0x6D, 0x32), 0x33A3 => array(0x6D, 0x6D, 0x33),
2221
-                    0x33A4 => array(0x63, 0x6D, 0x33), 0x33A5 => array(0x6D, 0x33), 0x33A6 => array(0x6B, 0x6D, 0x33),
2222
-                    0x33A7 => array(0x6D, 0x2215, 0x73), 0x33A8 => array(0x6D, 0x2215, 0x73, 0x32), 0x33A9 => array(0x70, 0x61),
2223
-                    0x33AA => array(0x6B, 0x70, 0x61), 0x33AB => array(0x6D, 0x70, 0x61), 0x33AC => array(0x67, 0x70, 0x61),
2224
-                    0x33AD => array(0x72, 0x61, 0x64), 0x33AE => array(0x72, 0x61, 0x64, 0x2215, 0x73), 0x33AF => array(0x72, 0x61, 0x64, 0x2215, 0x73, 0x32),
2225
-                    0x33B0 => array(0x70, 0x73), 0x33B1 => array(0x6E, 0x73), 0x33B2 => array(0x3BC, 0x73),
2226
-                    0x33B3 => array(0x6D, 0x73), 0x33B4 => array(0x70, 0x76), 0x33B5 => array(0x6E, 0x76),
2227
-                    0x33B6 => array(0x3BC, 0x76), 0x33B7 => array(0x6D, 0x76), 0x33B8 => array(0x6B, 0x76),
2228
-                    0x33B9 => array(0x6D, 0x76), 0x33BA => array(0x70, 0x77), 0x33BB => array(0x6E, 0x77),
2229
-                    0x33BC => array(0x3BC, 0x77), 0x33BD => array(0x6D, 0x77), 0x33BE => array(0x6B, 0x77),
2230
-                    0x33BF => array(0x6D, 0x77), 0x33C0 => array(0x6B, 0x3C9), 0x33C1 => array(0x6D, 0x3C9),
2231
-                    0x33C3 => array(0x62, 0x71), 0x33C4 => array(0x63, 0x63), 0x33C5 => array(0x63, 0x64),
2232
-                    0x33C6 => array(0x63, 0x2215, 0x6B, 0x67), 0x33C8 => array(0x64, 0x62), 0x33C9 => array(0x67, 0x79),
2233
-                    0x33CA => array(0x68, 0x61), 0x33CB => array(0x68, 0x70), 0x33CC => array(0x69, 0x6E),
2234
-                    0x33CD => array(0x6B, 0x6B), 0x33CE => array(0x6B, 0x6D), 0x33CF => array(0x6B, 0x74),
2235
-                    0x33D0 => array(0x6C, 0x6D), 0x33D1 => array(0x6C, 0x6E), 0x33D2 => array(0x6C, 0x6F, 0x67),
2236
-                    0x33D3 => array(0x6C, 0x78), 0x33D4 => array(0x6D, 0x62), 0x33D5 => array(0x6D, 0x69, 0x6C),
2237
-                    0x33D6 => array(0x6D, 0x6F, 0x6C), 0x33D7 => array(0x70, 0x68), 0x33D9 => array(0x70, 0x70, 0x6D),
2238
-                    0x33DA => array(0x70, 0x72), 0x33DB => array(0x73, 0x72), 0x33DC => array(0x73, 0x76),
2239
-                    0x33DD => array(0x77, 0x62), 0x33DE => array(0x76, 0x2215, 0x6D), 0x33DF => array(0x61, 0x2215, 0x6D),
2240
-                    0x33E0 => array(0x31, 0x65E5), 0x33E1 => array(0x32, 0x65E5), 0x33E2 => array(0x33, 0x65E5),
2241
-                    0x33E3 => array(0x34, 0x65E5), 0x33E4 => array(0x35, 0x65E5), 0x33E5 => array(0x36, 0x65E5),
2242
-                    0x33E6 => array(0x37, 0x65E5), 0x33E7 => array(0x38, 0x65E5), 0x33E8 => array(0x39, 0x65E5),
2243
-                    0x33E9 => array(0x31, 0x30, 0x65E5), 0x33EA => array(0x31, 0x31, 0x65E5), 0x33EB => array(0x31, 0x32, 0x65E5),
2244
-                    0x33EC => array(0x31, 0x33, 0x65E5), 0x33ED => array(0x31, 0x34, 0x65E5), 0x33EE => array(0x31, 0x35, 0x65E5),
2245
-                    0x33EF => array(0x31, 0x36, 0x65E5), 0x33F0 => array(0x31, 0x37, 0x65E5), 0x33F1 => array(0x31, 0x38, 0x65E5),
2246
-                    0x33F2 => array(0x31, 0x39, 0x65E5), 0x33F3 => array(0x32, 0x30, 0x65E5), 0x33F4 => array(0x32, 0x31, 0x65E5),
2247
-                    0x33F5 => array(0x32, 0x32, 0x65E5), 0x33F6 => array(0x32, 0x33, 0x65E5), 0x33F7 => array(0x32, 0x34, 0x65E5),
2248
-                    0x33F8 => array(0x32, 0x35, 0x65E5), 0x33F9 => array(0x32, 0x36, 0x65E5), 0x33FA => array(0x32, 0x37, 0x65E5),
2249
-                    0x33FB => array(0x32, 0x38, 0x65E5), 0x33FC => array(0x32, 0x39, 0x65E5), 0x33FD => array(0x33, 0x30, 0x65E5),
2250
-                    0x33FE => array(0x33, 0x31, 0x65E5), 0x33FF => array(0x67, 0x61, 0x6C), 0xA640 => array(0xA641),
2251
-                    0xA642 => array(0xA643), 0xA644 => array(0xA645), 0xA646 => array(0xA647),
2252
-                    0xA648 => array(0xA649), 0xA64A => array(0xA64B), 0xA64C => array(0xA64D),
2253
-                    0xA64E => array(0xA64F), 0xA650 => array(0xA651), 0xA652 => array(0xA653),
2254
-                    0xA654 => array(0xA655), 0xA656 => array(0xA657), 0xA658 => array(0xA659),
2255
-                    0xA65A => array(0xA65B), 0xA65C => array(0xA65D), 0xA65E => array(0xA65F),
2256
-                    0xA660 => array(0xA661), 0xA662 => array(0xA663), 0xA664 => array(0xA665),
2257
-                    0xA666 => array(0xA667), 0xA668 => array(0xA669), 0xA66A => array(0xA66B),
2258
-                    0xA66C => array(0xA66D), 0xA680 => array(0xA681), 0xA682 => array(0xA683),
2259
-                    0xA684 => array(0xA685), 0xA686 => array(0xA687), 0xA688 => array(0xA689),
2260
-                    0xA68A => array(0xA68B), 0xA68C => array(0xA68D), 0xA68E => array(0xA68F),
2261
-                    0xA690 => array(0xA691), 0xA692 => array(0xA693), 0xA694 => array(0xA695),
2262
-                    0xA696 => array(0xA697), 0xA698 => array(0xA699), 0xA69A => array(0xA69B),
2263
-                    0xA69C => array(0x44A), 0xA69D => array(0x44C), 0xA722 => array(0xA723),
2264
-                    0xA724 => array(0xA725), 0xA726 => array(0xA727), 0xA728 => array(0xA729),
2265
-                    0xA72A => array(0xA72B), 0xA72C => array(0xA72D), 0xA72E => array(0xA72F),
2266
-                    0xA732 => array(0xA733), 0xA734 => array(0xA735), 0xA736 => array(0xA737),
2267
-                    0xA738 => array(0xA739), 0xA73A => array(0xA73B), 0xA73C => array(0xA73D),
2268
-                    0xA73E => array(0xA73F), 0xA740 => array(0xA741), 0xA742 => array(0xA743),
2269
-                    0xA744 => array(0xA745), 0xA746 => array(0xA747), 0xA748 => array(0xA749),
2270
-                    0xA74A => array(0xA74B), 0xA74C => array(0xA74D), 0xA74E => array(0xA74F),
2271
-                    0xA750 => array(0xA751), 0xA752 => array(0xA753), 0xA754 => array(0xA755),
2272
-                    0xA756 => array(0xA757), 0xA758 => array(0xA759), 0xA75A => array(0xA75B),
2273
-                    0xA75C => array(0xA75D), 0xA75E => array(0xA75F), 0xA760 => array(0xA761),
2274
-                    0xA762 => array(0xA763), 0xA764 => array(0xA765), 0xA766 => array(0xA767),
2275
-                    0xA768 => array(0xA769), 0xA76A => array(0xA76B), 0xA76C => array(0xA76D),
2276
-                    0xA76E => array(0xA76F), 0xA770 => array(0xA76F), 0xA779 => array(0xA77A),
2277
-                    0xA77B => array(0xA77C), 0xA77D => array(0x1D79), 0xA77E => array(0xA77F),
2278
-                    0xA780 => array(0xA781), 0xA782 => array(0xA783), 0xA784 => array(0xA785),
2279
-                    0xA786 => array(0xA787), 0xA78B => array(0xA78C), 0xA78D => array(0x265),
2280
-                    0xA790 => array(0xA791), 0xA792 => array(0xA793), 0xA796 => array(0xA797),
2281
-                    0xA798 => array(0xA799), 0xA79A => array(0xA79B), 0xA79C => array(0xA79D),
2282
-                    0xA79E => array(0xA79F), 0xA7A0 => array(0xA7A1), 0xA7A2 => array(0xA7A3),
2283
-                    0xA7A4 => array(0xA7A5), 0xA7A6 => array(0xA7A7), 0xA7A8 => array(0xA7A9),
2284
-                    0xA7AA => array(0x266), 0xA7AB => array(0x25C), 0xA7AC => array(0x261),
2285
-                    0xA7AD => array(0x26C), 0xA7B0 => array(0x29E), 0xA7B1 => array(0x287),
2286
-                    0xA7F8 => array(0x127), 0xA7F9 => array(0x153), 0xAB5C => array(0xA727),
2287
-                    0xAB5D => array(0xAB37), 0xAB5E => array(0x26B), 0xAB5F => array(0xAB52),
2288
-                    0xF900 => array(0x8C48), 0xF901 => array(0x66F4), 0xF902 => array(0x8ECA),
2289
-                    0xF903 => array(0x8CC8), 0xF904 => array(0x6ED1), 0xF905 => array(0x4E32),
2290
-                    0xF906 => array(0x53E5), 0xF907 => array(0x9F9C), 0xF908 => array(0x9F9C),
2291
-                    0xF909 => array(0x5951), 0xF90A => array(0x91D1), 0xF90B => array(0x5587),
2292
-                    0xF90C => array(0x5948), 0xF90D => array(0x61F6), 0xF90E => array(0x7669),
2293
-                    0xF90F => array(0x7F85), 0xF910 => array(0x863F), 0xF911 => array(0x87BA),
2294
-                    0xF912 => array(0x88F8), 0xF913 => array(0x908F), 0xF914 => array(0x6A02),
2295
-                    0xF915 => array(0x6D1B), 0xF916 => array(0x70D9), 0xF917 => array(0x73DE),
2296
-                    0xF918 => array(0x843D), 0xF919 => array(0x916A), 0xF91A => array(0x99F1),
2297
-                    0xF91B => array(0x4E82), 0xF91C => array(0x5375), 0xF91D => array(0x6B04),
2298
-                    0xF91E => array(0x721B), 0xF91F => array(0x862D), 0xF920 => array(0x9E1E),
2299
-                    0xF921 => array(0x5D50), 0xF922 => array(0x6FEB), 0xF923 => array(0x85CD),
2300
-                    0xF924 => array(0x8964), 0xF925 => array(0x62C9), 0xF926 => array(0x81D8),
2301
-                    0xF927 => array(0x881F), 0xF928 => array(0x5ECA), 0xF929 => array(0x6717),
2302
-                    0xF92A => array(0x6D6A), 0xF92B => array(0x72FC), 0xF92C => array(0x90CE),
2303
-                    0xF92D => array(0x4F86), 0xF92E => array(0x51B7), 0xF92F => array(0x52DE),
2304
-                    0xF930 => array(0x64C4), 0xF931 => array(0x6AD3), 0xF932 => array(0x7210),
2305
-                    0xF933 => array(0x76E7), 0xF934 => array(0x8001), 0xF935 => array(0x8606),
2306
-                    0xF936 => array(0x865C), 0xF937 => array(0x8DEF), 0xF938 => array(0x9732),
2307
-                    0xF939 => array(0x9B6F), 0xF93A => array(0x9DFA), 0xF93B => array(0x788C),
2308
-                    0xF93C => array(0x797F), 0xF93D => array(0x7DA0), 0xF93E => array(0x83C9),
2309
-                    0xF93F => array(0x9304), 0xF940 => array(0x9E7F), 0xF941 => array(0x8AD6),
2310
-                    0xF942 => array(0x58DF), 0xF943 => array(0x5F04), 0xF944 => array(0x7C60),
2311
-                    0xF945 => array(0x807E), 0xF946 => array(0x7262), 0xF947 => array(0x78CA),
2312
-                    0xF948 => array(0x8CC2), 0xF949 => array(0x96F7), 0xF94A => array(0x58D8),
2313
-                    0xF94B => array(0x5C62), 0xF94C => array(0x6A13), 0xF94D => array(0x6DDA),
2314
-                    0xF94E => array(0x6F0F), 0xF94F => array(0x7D2F), 0xF950 => array(0x7E37),
2315
-                    0xF951 => array(0x964B), 0xF952 => array(0x52D2), 0xF953 => array(0x808B),
2316
-                    0xF954 => array(0x51DC), 0xF955 => array(0x51CC), 0xF956 => array(0x7A1C),
2317
-                    0xF957 => array(0x7DBE), 0xF958 => array(0x83F1), 0xF959 => array(0x9675),
2318
-                    0xF95A => array(0x8B80), 0xF95B => array(0x62CF), 0xF95C => array(0x6A02),
2319
-                    0xF95D => array(0x8AFE), 0xF95E => array(0x4E39), 0xF95F => array(0x5BE7),
2320
-                    0xF960 => array(0x6012), 0xF961 => array(0x7387), 0xF962 => array(0x7570),
2321
-                    0xF963 => array(0x5317), 0xF964 => array(0x78FB), 0xF965 => array(0x4FBF),
2322
-                    0xF966 => array(0x5FA9), 0xF967 => array(0x4E0D), 0xF968 => array(0x6CCC),
2323
-                    0xF969 => array(0x6578), 0xF96A => array(0x7D22), 0xF96B => array(0x53C3),
2324
-                    0xF96C => array(0x585E), 0xF96D => array(0x7701), 0xF96E => array(0x8449),
2325
-                    0xF96F => array(0x8AAA), 0xF970 => array(0x6BBA), 0xF971 => array(0x8FB0),
2326
-                    0xF972 => array(0x6C88), 0xF973 => array(0x62FE), 0xF974 => array(0x82E5),
2327
-                    0xF975 => array(0x63A0), 0xF976 => array(0x7565), 0xF977 => array(0x4EAE),
2328
-                    0xF978 => array(0x5169), 0xF979 => array(0x51C9), 0xF97A => array(0x6881),
2329
-                    0xF97B => array(0x7CE7), 0xF97C => array(0x826F), 0xF97D => array(0x8AD2),
2330
-                    0xF97E => array(0x91CF), 0xF97F => array(0x52F5), 0xF980 => array(0x5442),
2331
-                    0xF981 => array(0x5973), 0xF982 => array(0x5EEC), 0xF983 => array(0x65C5),
2332
-                    0xF984 => array(0x6FFE), 0xF985 => array(0x792A), 0xF986 => array(0x95AD),
2333
-                    0xF987 => array(0x9A6A), 0xF988 => array(0x9E97), 0xF989 => array(0x9ECE),
2334
-                    0xF98A => array(0x529B), 0xF98B => array(0x66C6), 0xF98C => array(0x6B77),
2335
-                    0xF98D => array(0x8F62), 0xF98E => array(0x5E74), 0xF98F => array(0x6190),
2336
-                    0xF990 => array(0x6200), 0xF991 => array(0x649A), 0xF992 => array(0x6F23),
2337
-                    0xF993 => array(0x7149), 0xF994 => array(0x7489), 0xF995 => array(0x79CA),
2338
-                    0xF996 => array(0x7DF4), 0xF997 => array(0x806F), 0xF998 => array(0x8F26),
2339
-                    0xF999 => array(0x84EE), 0xF99A => array(0x9023), 0xF99B => array(0x934A),
2340
-                    0xF99C => array(0x5217), 0xF99D => array(0x52A3), 0xF99E => array(0x54BD),
2341
-                    0xF99F => array(0x70C8), 0xF9A0 => array(0x88C2), 0xF9A1 => array(0x8AAA),
2342
-                    0xF9A2 => array(0x5EC9), 0xF9A3 => array(0x5FF5), 0xF9A4 => array(0x637B),
2343
-                    0xF9A5 => array(0x6BAE), 0xF9A6 => array(0x7C3E), 0xF9A7 => array(0x7375),
2344
-                    0xF9A8 => array(0x4EE4), 0xF9A9 => array(0x56F9), 0xF9AA => array(0x5BE7),
2345
-                    0xF9AB => array(0x5DBA), 0xF9AC => array(0x601C), 0xF9AD => array(0x73B2),
2346
-                    0xF9AE => array(0x7469), 0xF9AF => array(0x7F9A), 0xF9B0 => array(0x8046),
2347
-                    0xF9B1 => array(0x9234), 0xF9B2 => array(0x96F6), 0xF9B3 => array(0x9748),
2348
-                    0xF9B4 => array(0x9818), 0xF9B5 => array(0x4F8B), 0xF9B6 => array(0x79AE),
2349
-                    0xF9B7 => array(0x91B4), 0xF9B8 => array(0x96B8), 0xF9B9 => array(0x60E1),
2350
-                    0xF9BA => array(0x4E86), 0xF9BB => array(0x50DA), 0xF9BC => array(0x5BEE),
2351
-                    0xF9BD => array(0x5C3F), 0xF9BE => array(0x6599), 0xF9BF => array(0x6A02),
2352
-                    0xF9C0 => array(0x71CE), 0xF9C1 => array(0x7642), 0xF9C2 => array(0x84FC),
2353
-                    0xF9C3 => array(0x907C), 0xF9C4 => array(0x9F8D), 0xF9C5 => array(0x6688),
2354
-                    0xF9C6 => array(0x962E), 0xF9C7 => array(0x5289), 0xF9C8 => array(0x677B),
2355
-                    0xF9C9 => array(0x67F3), 0xF9CA => array(0x6D41), 0xF9CB => array(0x6E9C),
2356
-                    0xF9CC => array(0x7409), 0xF9CD => array(0x7559), 0xF9CE => array(0x786B),
2357
-                    0xF9CF => array(0x7D10), 0xF9D0 => array(0x985E), 0xF9D1 => array(0x516D),
2358
-                    0xF9D2 => array(0x622E), 0xF9D3 => array(0x9678), 0xF9D4 => array(0x502B),
2359
-                    0xF9D5 => array(0x5D19), 0xF9D6 => array(0x6DEA), 0xF9D7 => array(0x8F2A),
2360
-                    0xF9D8 => array(0x5F8B), 0xF9D9 => array(0x6144), 0xF9DA => array(0x6817),
2361
-                    0xF9DB => array(0x7387), 0xF9DC => array(0x9686), 0xF9DD => array(0x5229),
2362
-                    0xF9DE => array(0x540F), 0xF9DF => array(0x5C65), 0xF9E0 => array(0x6613),
2363
-                    0xF9E1 => array(0x674E), 0xF9E2 => array(0x68A8), 0xF9E3 => array(0x6CE5),
2364
-                    0xF9E4 => array(0x7406), 0xF9E5 => array(0x75E2), 0xF9E6 => array(0x7F79),
2365
-                    0xF9E7 => array(0x88CF), 0xF9E8 => array(0x88E1), 0xF9E9 => array(0x91CC),
2366
-                    0xF9EA => array(0x96E2), 0xF9EB => array(0x533F), 0xF9EC => array(0x6EBA),
2367
-                    0xF9ED => array(0x541D), 0xF9EE => array(0x71D0), 0xF9EF => array(0x7498),
2368
-                    0xF9F0 => array(0x85FA), 0xF9F1 => array(0x96A3), 0xF9F2 => array(0x9C57),
2369
-                    0xF9F3 => array(0x9E9F), 0xF9F4 => array(0x6797), 0xF9F5 => array(0x6DCB),
2370
-                    0xF9F6 => array(0x81E8), 0xF9F7 => array(0x7ACB), 0xF9F8 => array(0x7B20),
2371
-                    0xF9F9 => array(0x7C92), 0xF9FA => array(0x72C0), 0xF9FB => array(0x7099),
2372
-                    0xF9FC => array(0x8B58), 0xF9FD => array(0x4EC0), 0xF9FE => array(0x8336),
2373
-                    0xF9FF => array(0x523A), 0xFA00 => array(0x5207), 0xFA01 => array(0x5EA6),
2374
-                    0xFA02 => array(0x62D3), 0xFA03 => array(0x7CD6), 0xFA04 => array(0x5B85),
2375
-                    0xFA05 => array(0x6D1E), 0xFA06 => array(0x66B4), 0xFA07 => array(0x8F3B),
2376
-                    0xFA08 => array(0x884C), 0xFA09 => array(0x964D), 0xFA0A => array(0x898B),
2377
-                    0xFA0B => array(0x5ED3), 0xFA0C => array(0x5140), 0xFA0D => array(0x55C0),
2378
-                    0xFA10 => array(0x585A), 0xFA12 => array(0x6674), 0xFA15 => array(0x51DE),
2379
-                    0xFA16 => array(0x732A), 0xFA17 => array(0x76CA), 0xFA18 => array(0x793C),
2380
-                    0xFA19 => array(0x795E), 0xFA1A => array(0x7965), 0xFA1B => array(0x798F),
2381
-                    0xFA1C => array(0x9756), 0xFA1D => array(0x7CBE), 0xFA1E => array(0x7FBD),
2382
-                    0xFA20 => array(0x8612), 0xFA22 => array(0x8AF8), 0xFA25 => array(0x9038),
2383
-                    0xFA26 => array(0x90FD), 0xFA2A => array(0x98EF), 0xFA2B => array(0x98FC),
2384
-                    0xFA2C => array(0x9928), 0xFA2D => array(0x9DB4), 0xFA2E => array(0x90DE),
2385
-                    0xFA2F => array(0x96B7), 0xFA30 => array(0x4FAE), 0xFA31 => array(0x50E7),
2386
-                    0xFA32 => array(0x514D), 0xFA33 => array(0x52C9), 0xFA34 => array(0x52E4),
2387
-                    0xFA35 => array(0x5351), 0xFA36 => array(0x559D), 0xFA37 => array(0x5606),
2388
-                    0xFA38 => array(0x5668), 0xFA39 => array(0x5840), 0xFA3A => array(0x58A8),
2389
-                    0xFA3B => array(0x5C64), 0xFA3C => array(0x5C6E), 0xFA3D => array(0x6094),
2390
-                    0xFA3E => array(0x6168), 0xFA3F => array(0x618E), 0xFA40 => array(0x61F2),
2391
-                    0xFA41 => array(0x654F), 0xFA42 => array(0x65E2), 0xFA43 => array(0x6691),
2392
-                    0xFA44 => array(0x6885), 0xFA45 => array(0x6D77), 0xFA46 => array(0x6E1A),
2393
-                    0xFA47 => array(0x6F22), 0xFA48 => array(0x716E), 0xFA49 => array(0x722B),
2394
-                    0xFA4A => array(0x7422), 0xFA4B => array(0x7891), 0xFA4C => array(0x793E),
2395
-                    0xFA4D => array(0x7949), 0xFA4E => array(0x7948), 0xFA4F => array(0x7950),
2396
-                    0xFA50 => array(0x7956), 0xFA51 => array(0x795D), 0xFA52 => array(0x798D),
2397
-                    0xFA53 => array(0x798E), 0xFA54 => array(0x7A40), 0xFA55 => array(0x7A81),
2398
-                    0xFA56 => array(0x7BC0), 0xFA57 => array(0x7DF4), 0xFA58 => array(0x7E09),
2399
-                    0xFA59 => array(0x7E41), 0xFA5A => array(0x7F72), 0xFA5B => array(0x8005),
2400
-                    0xFA5C => array(0x81ED), 0xFA5D => array(0x8279), 0xFA5E => array(0x8279),
2401
-                    0xFA5F => array(0x8457), 0xFA60 => array(0x8910), 0xFA61 => array(0x8996),
2402
-                    0xFA62 => array(0x8B01), 0xFA63 => array(0x8B39), 0xFA64 => array(0x8CD3),
2403
-                    0xFA65 => array(0x8D08), 0xFA66 => array(0x8FB6), 0xFA67 => array(0x9038),
2404
-                    0xFA68 => array(0x96E3), 0xFA69 => array(0x97FF), 0xFA6A => array(0x983B),
2405
-                    0xFA6B => array(0x6075), 0xFA6C => array(0x242EE), 0xFA6D => array(0x8218),
2406
-                    0xFA70 => array(0x4E26), 0xFA71 => array(0x51B5), 0xFA72 => array(0x5168),
2407
-                    0xFA73 => array(0x4F80), 0xFA74 => array(0x5145), 0xFA75 => array(0x5180),
2408
-                    0xFA76 => array(0x52C7), 0xFA77 => array(0x52FA), 0xFA78 => array(0x559D),
2409
-                    0xFA79 => array(0x5555), 0xFA7A => array(0x5599), 0xFA7B => array(0x55E2),
2410
-                    0xFA7C => array(0x585A), 0xFA7D => array(0x58B3), 0xFA7E => array(0x5944),
2411
-                    0xFA7F => array(0x5954), 0xFA80 => array(0x5A62), 0xFA81 => array(0x5B28),
2412
-                    0xFA82 => array(0x5ED2), 0xFA83 => array(0x5ED9), 0xFA84 => array(0x5F69),
2413
-                    0xFA85 => array(0x5FAD), 0xFA86 => array(0x60D8), 0xFA87 => array(0x614E),
2414
-                    0xFA88 => array(0x6108), 0xFA89 => array(0x618E), 0xFA8A => array(0x6160),
2415
-                    0xFA8B => array(0x61F2), 0xFA8C => array(0x6234), 0xFA8D => array(0x63C4),
2416
-                    0xFA8E => array(0x641C), 0xFA8F => array(0x6452), 0xFA90 => array(0x6556),
2417
-                    0xFA91 => array(0x6674), 0xFA92 => array(0x6717), 0xFA93 => array(0x671B),
2418
-                    0xFA94 => array(0x6756), 0xFA95 => array(0x6B79), 0xFA96 => array(0x6BBA),
2419
-                    0xFA97 => array(0x6D41), 0xFA98 => array(0x6EDB), 0xFA99 => array(0x6ECB),
2420
-                    0xFA9A => array(0x6F22), 0xFA9B => array(0x701E), 0xFA9C => array(0x716E),
2421
-                    0xFA9D => array(0x77A7), 0xFA9E => array(0x7235), 0xFA9F => array(0x72AF),
2422
-                    0xFAA0 => array(0x732A), 0xFAA1 => array(0x7471), 0xFAA2 => array(0x7506),
2423
-                    0xFAA3 => array(0x753B), 0xFAA4 => array(0x761D), 0xFAA5 => array(0x761F),
2424
-                    0xFAA6 => array(0x76CA), 0xFAA7 => array(0x76DB), 0xFAA8 => array(0x76F4),
2425
-                    0xFAA9 => array(0x774A), 0xFAAA => array(0x7740), 0xFAAB => array(0x78CC),
2426
-                    0xFAAC => array(0x7AB1), 0xFAAD => array(0x7BC0), 0xFAAE => array(0x7C7B),
2427
-                    0xFAAF => array(0x7D5B), 0xFAB0 => array(0x7DF4), 0xFAB1 => array(0x7F3E),
2428
-                    0xFAB2 => array(0x8005), 0xFAB3 => array(0x8352), 0xFAB4 => array(0x83EF),
2429
-                    0xFAB5 => array(0x8779), 0xFAB6 => array(0x8941), 0xFAB7 => array(0x8986),
2430
-                    0xFAB8 => array(0x8996), 0xFAB9 => array(0x8ABF), 0xFABA => array(0x8AF8),
2431
-                    0xFABB => array(0x8ACB), 0xFABC => array(0x8B01), 0xFABD => array(0x8AFE),
2432
-                    0xFABE => array(0x8AED), 0xFABF => array(0x8B39), 0xFAC0 => array(0x8B8A),
2433
-                    0xFAC1 => array(0x8D08), 0xFAC2 => array(0x8F38), 0xFAC3 => array(0x9072),
2434
-                    0xFAC4 => array(0x9199), 0xFAC5 => array(0x9276), 0xFAC6 => array(0x967C),
2435
-                    0xFAC7 => array(0x96E3), 0xFAC8 => array(0x9756), 0xFAC9 => array(0x97DB),
2436
-                    0xFACA => array(0x97FF), 0xFACB => array(0x980B), 0xFACC => array(0x983B),
2437
-                    0xFACD => array(0x9B12), 0xFACE => array(0x9F9C), 0xFACF => array(0x2284A),
2438
-                    0xFAD0 => array(0x22844), 0xFAD1 => array(0x233D5), 0xFAD2 => array(0x3B9D),
2439
-                    0xFAD3 => array(0x4018), 0xFAD4 => array(0x4039), 0xFAD5 => array(0x25249),
2440
-                    0xFAD6 => array(0x25CD0), 0xFAD7 => array(0x27ED3), 0xFAD8 => array(0x9F43),
2441
-                    0xFAD9 => array(0x9F8E), 0xFB00 => array(0x66, 0x66), 0xFB01 => array(0x66, 0x69),
2442
-                    0xFB02 => array(0x66, 0x6C), 0xFB03 => array(0x66, 0x66, 0x69), 0xFB04 => array(0x66, 0x66, 0x6C),
2443
-                    0xFB05 => array(0x73, 0x74), 0xFB06 => array(0x73, 0x74), 0xFB13 => array(0x574, 0x576),
2444
-                    0xFB14 => array(0x574, 0x565), 0xFB15 => array(0x574, 0x56B), 0xFB16 => array(0x57E, 0x576),
2445
-                    0xFB17 => array(0x574, 0x56D), 0xFB1D => array(0x5D9, 0x5B4), 0xFB1F => array(0x5F2, 0x5B7),
2446
-                    0xFB20 => array(0x5E2), 0xFB21 => array(0x5D0), 0xFB22 => array(0x5D3),
2447
-                    0xFB23 => array(0x5D4), 0xFB24 => array(0x5DB), 0xFB25 => array(0x5DC),
2448
-                    0xFB26 => array(0x5DD), 0xFB27 => array(0x5E8), 0xFB28 => array(0x5EA),
2449
-                    0xFB2A => array(0x5E9, 0x5C1), 0xFB2B => array(0x5E9, 0x5C2), 0xFB2C => array(0x5E9, 0x5BC, 0x5C1),
2450
-                    0xFB2D => array(0x5E9, 0x5BC, 0x5C2), 0xFB2E => array(0x5D0, 0x5B7), 0xFB2F => array(0x5D0, 0x5B8),
2451
-                    0xFB30 => array(0x5D0, 0x5BC), 0xFB31 => array(0x5D1, 0x5BC), 0xFB32 => array(0x5D2, 0x5BC),
2452
-                    0xFB33 => array(0x5D3, 0x5BC), 0xFB34 => array(0x5D4, 0x5BC), 0xFB35 => array(0x5D5, 0x5BC),
2453
-                    0xFB36 => array(0x5D6, 0x5BC), 0xFB38 => array(0x5D8, 0x5BC), 0xFB39 => array(0x5D9, 0x5BC),
2454
-                    0xFB3A => array(0x5DA, 0x5BC), 0xFB3B => array(0x5DB, 0x5BC), 0xFB3C => array(0x5DC, 0x5BC),
2455
-                    0xFB3E => array(0x5DE, 0x5BC), 0xFB40 => array(0x5E0, 0x5BC), 0xFB41 => array(0x5E1, 0x5BC),
2456
-                    0xFB43 => array(0x5E3, 0x5BC), 0xFB44 => array(0x5E4, 0x5BC), 0xFB46 => array(0x5E6, 0x5BC),
2457
-                    0xFB47 => array(0x5E7, 0x5BC), 0xFB48 => array(0x5E8, 0x5BC), 0xFB49 => array(0x5E9, 0x5BC),
2458
-                    0xFB4A => array(0x5EA, 0x5BC), 0xFB4B => array(0x5D5, 0x5B9), 0xFB4C => array(0x5D1, 0x5BF),
2459
-                    0xFB4D => array(0x5DB, 0x5BF), 0xFB4E => array(0x5E4, 0x5BF), 0xFB4F => array(0x5D0, 0x5DC),
2460
-                    0xFB50 => array(0x671), 0xFB51 => array(0x671), 0xFB52 => array(0x67B),
2461
-                    0xFB53 => array(0x67B), 0xFB54 => array(0x67B), 0xFB55 => array(0x67B),
2462
-                    0xFB56 => array(0x67E), 0xFB57 => array(0x67E), 0xFB58 => array(0x67E),
2463
-                    0xFB59 => array(0x67E), 0xFB5A => array(0x680), 0xFB5B => array(0x680),
2464
-                    0xFB5C => array(0x680), 0xFB5D => array(0x680), 0xFB5E => array(0x67A),
2465
-                    0xFB5F => array(0x67A), 0xFB60 => array(0x67A), 0xFB61 => array(0x67A),
2466
-                    0xFB62 => array(0x67F), 0xFB63 => array(0x67F), 0xFB64 => array(0x67F),
2467
-                    0xFB65 => array(0x67F), 0xFB66 => array(0x679), 0xFB67 => array(0x679),
2468
-                    0xFB68 => array(0x679), 0xFB69 => array(0x679), 0xFB6A => array(0x6A4),
2469
-                    0xFB6B => array(0x6A4), 0xFB6C => array(0x6A4), 0xFB6D => array(0x6A4),
2470
-                    0xFB6E => array(0x6A6), 0xFB6F => array(0x6A6), 0xFB70 => array(0x6A6),
2471
-                    0xFB71 => array(0x6A6), 0xFB72 => array(0x684), 0xFB73 => array(0x684),
2472
-                    0xFB74 => array(0x684), 0xFB75 => array(0x684), 0xFB76 => array(0x683),
2473
-                    0xFB77 => array(0x683), 0xFB78 => array(0x683), 0xFB79 => array(0x683),
2474
-                    0xFB7A => array(0x686), 0xFB7B => array(0x686), 0xFB7C => array(0x686),
2475
-                    0xFB7D => array(0x686), 0xFB7E => array(0x687), 0xFB7F => array(0x687),
2476
-                    0xFB80 => array(0x687), 0xFB81 => array(0x687), 0xFB82 => array(0x68D),
2477
-                    0xFB83 => array(0x68D), 0xFB84 => array(0x68C), 0xFB85 => array(0x68C),
2478
-                    0xFB86 => array(0x68E), 0xFB87 => array(0x68E), 0xFB88 => array(0x688),
2479
-                    0xFB89 => array(0x688), 0xFB8A => array(0x698), 0xFB8B => array(0x698),
2480
-                    0xFB8C => array(0x691), 0xFB8D => array(0x691), 0xFB8E => array(0x6A9),
2481
-                    0xFB8F => array(0x6A9), 0xFB90 => array(0x6A9), 0xFB91 => array(0x6A9),
2482
-                    0xFB92 => array(0x6AF), 0xFB93 => array(0x6AF), 0xFB94 => array(0x6AF),
2483
-                    0xFB95 => array(0x6AF), 0xFB96 => array(0x6B3), 0xFB97 => array(0x6B3),
2484
-                    0xFB98 => array(0x6B3), 0xFB99 => array(0x6B3), 0xFB9A => array(0x6B1),
2485
-                    0xFB9B => array(0x6B1), 0xFB9C => array(0x6B1), 0xFB9D => array(0x6B1),
2486
-                    0xFB9E => array(0x6BA), 0xFB9F => array(0x6BA), 0xFBA0 => array(0x6BB),
2487
-                    0xFBA1 => array(0x6BB), 0xFBA2 => array(0x6BB), 0xFBA3 => array(0x6BB),
2488
-                    0xFBA4 => array(0x6C0), 0xFBA5 => array(0x6C0), 0xFBA6 => array(0x6C1),
2489
-                    0xFBA7 => array(0x6C1), 0xFBA8 => array(0x6C1), 0xFBA9 => array(0x6C1),
2490
-                    0xFBAA => array(0x6BE), 0xFBAB => array(0x6BE), 0xFBAC => array(0x6BE),
2491
-                    0xFBAD => array(0x6BE), 0xFBAE => array(0x6D2), 0xFBAF => array(0x6D2),
2492
-                    0xFBB0 => array(0x6D3), 0xFBB1 => array(0x6D3), 0xFBD3 => array(0x6AD),
2493
-                    0xFBD4 => array(0x6AD), 0xFBD5 => array(0x6AD), 0xFBD6 => array(0x6AD),
2494
-                    0xFBD7 => array(0x6C7), 0xFBD8 => array(0x6C7), 0xFBD9 => array(0x6C6),
2495
-                    0xFBDA => array(0x6C6), 0xFBDB => array(0x6C8), 0xFBDC => array(0x6C8),
2496
-                    0xFBDD => array(0x6C7, 0x674), 0xFBDE => array(0x6CB), 0xFBDF => array(0x6CB),
2497
-                    0xFBE0 => array(0x6C5), 0xFBE1 => array(0x6C5), 0xFBE2 => array(0x6C9),
2498
-                    0xFBE3 => array(0x6C9), 0xFBE4 => array(0x6D0), 0xFBE5 => array(0x6D0),
2499
-                    0xFBE6 => array(0x6D0), 0xFBE7 => array(0x6D0), 0xFBE8 => array(0x649),
2500
-                    0xFBE9 => array(0x649), 0xFBEA => array(0x626, 0x627), 0xFBEB => array(0x626, 0x627),
2501
-                    0xFBEC => array(0x626, 0x6D5), 0xFBED => array(0x626, 0x6D5), 0xFBEE => array(0x626, 0x648),
2502
-                    0xFBEF => array(0x626, 0x648), 0xFBF0 => array(0x626, 0x6C7), 0xFBF1 => array(0x626, 0x6C7),
2503
-                    0xFBF2 => array(0x626, 0x6C6), 0xFBF3 => array(0x626, 0x6C6), 0xFBF4 => array(0x626, 0x6C8),
2504
-                    0xFBF5 => array(0x626, 0x6C8), 0xFBF6 => array(0x626, 0x6D0), 0xFBF7 => array(0x626, 0x6D0),
2505
-                    0xFBF8 => array(0x626, 0x6D0), 0xFBF9 => array(0x626, 0x649), 0xFBFA => array(0x626, 0x649),
2506
-                    0xFBFB => array(0x626, 0x649), 0xFBFC => array(0x6CC), 0xFBFD => array(0x6CC),
2507
-                    0xFBFE => array(0x6CC), 0xFBFF => array(0x6CC), 0xFC00 => array(0x626, 0x62C),
2508
-                    0xFC01 => array(0x626, 0x62D), 0xFC02 => array(0x626, 0x645), 0xFC03 => array(0x626, 0x649),
2509
-                    0xFC04 => array(0x626, 0x64A), 0xFC05 => array(0x628, 0x62C), 0xFC06 => array(0x628, 0x62D),
2510
-                    0xFC07 => array(0x628, 0x62E), 0xFC08 => array(0x628, 0x645), 0xFC09 => array(0x628, 0x649),
2511
-                    0xFC0A => array(0x628, 0x64A), 0xFC0B => array(0x62A, 0x62C), 0xFC0C => array(0x62A, 0x62D),
2512
-                    0xFC0D => array(0x62A, 0x62E), 0xFC0E => array(0x62A, 0x645), 0xFC0F => array(0x62A, 0x649),
2513
-                    0xFC10 => array(0x62A, 0x64A), 0xFC11 => array(0x62B, 0x62C), 0xFC12 => array(0x62B, 0x645),
2514
-                    0xFC13 => array(0x62B, 0x649), 0xFC14 => array(0x62B, 0x64A), 0xFC15 => array(0x62C, 0x62D),
2515
-                    0xFC16 => array(0x62C, 0x645), 0xFC17 => array(0x62D, 0x62C), 0xFC18 => array(0x62D, 0x645),
2516
-                    0xFC19 => array(0x62E, 0x62C), 0xFC1A => array(0x62E, 0x62D), 0xFC1B => array(0x62E, 0x645),
2517
-                    0xFC1C => array(0x633, 0x62C), 0xFC1D => array(0x633, 0x62D), 0xFC1E => array(0x633, 0x62E),
2518
-                    0xFC1F => array(0x633, 0x645), 0xFC20 => array(0x635, 0x62D), 0xFC21 => array(0x635, 0x645),
2519
-                    0xFC22 => array(0x636, 0x62C), 0xFC23 => array(0x636, 0x62D), 0xFC24 => array(0x636, 0x62E),
2520
-                    0xFC25 => array(0x636, 0x645), 0xFC26 => array(0x637, 0x62D), 0xFC27 => array(0x637, 0x645),
2521
-                    0xFC28 => array(0x638, 0x645), 0xFC29 => array(0x639, 0x62C), 0xFC2A => array(0x639, 0x645),
2522
-                    0xFC2B => array(0x63A, 0x62C), 0xFC2C => array(0x63A, 0x645), 0xFC2D => array(0x641, 0x62C),
2523
-                    0xFC2E => array(0x641, 0x62D), 0xFC2F => array(0x641, 0x62E), 0xFC30 => array(0x641, 0x645),
2524
-                    0xFC31 => array(0x641, 0x649), 0xFC32 => array(0x641, 0x64A), 0xFC33 => array(0x642, 0x62D),
2525
-                    0xFC34 => array(0x642, 0x645), 0xFC35 => array(0x642, 0x649), 0xFC36 => array(0x642, 0x64A),
2526
-                    0xFC37 => array(0x643, 0x627), 0xFC38 => array(0x643, 0x62C), 0xFC39 => array(0x643, 0x62D),
2527
-                    0xFC3A => array(0x643, 0x62E), 0xFC3B => array(0x643, 0x644), 0xFC3C => array(0x643, 0x645),
2528
-                    0xFC3D => array(0x643, 0x649), 0xFC3E => array(0x643, 0x64A), 0xFC3F => array(0x644, 0x62C),
2529
-                    0xFC40 => array(0x644, 0x62D), 0xFC41 => array(0x644, 0x62E), 0xFC42 => array(0x644, 0x645),
2530
-                    0xFC43 => array(0x644, 0x649), 0xFC44 => array(0x644, 0x64A), 0xFC45 => array(0x645, 0x62C),
2531
-                    0xFC46 => array(0x645, 0x62D), 0xFC47 => array(0x645, 0x62E), 0xFC48 => array(0x645, 0x645),
2532
-                    0xFC49 => array(0x645, 0x649), 0xFC4A => array(0x645, 0x64A), 0xFC4B => array(0x646, 0x62C),
2533
-                    0xFC4C => array(0x646, 0x62D), 0xFC4D => array(0x646, 0x62E), 0xFC4E => array(0x646, 0x645),
2534
-                    0xFC4F => array(0x646, 0x649), 0xFC50 => array(0x646, 0x64A), 0xFC51 => array(0x647, 0x62C),
2535
-                    0xFC52 => array(0x647, 0x645), 0xFC53 => array(0x647, 0x649), 0xFC54 => array(0x647, 0x64A),
2536
-                    0xFC55 => array(0x64A, 0x62C), 0xFC56 => array(0x64A, 0x62D), 0xFC57 => array(0x64A, 0x62E),
2537
-                    0xFC58 => array(0x64A, 0x645), 0xFC59 => array(0x64A, 0x649), 0xFC5A => array(0x64A, 0x64A),
2538
-                    0xFC5B => array(0x630, 0x670), 0xFC5C => array(0x631, 0x670), 0xFC5D => array(0x649, 0x670),
2539
-                    0xFC64 => array(0x626, 0x631), 0xFC65 => array(0x626, 0x632), 0xFC66 => array(0x626, 0x645),
2540
-                    0xFC67 => array(0x626, 0x646), 0xFC68 => array(0x626, 0x649), 0xFC69 => array(0x626, 0x64A),
2541
-                    0xFC6A => array(0x628, 0x631), 0xFC6B => array(0x628, 0x632), 0xFC6C => array(0x628, 0x645),
2542
-                    0xFC6D => array(0x628, 0x646), 0xFC6E => array(0x628, 0x649), 0xFC6F => array(0x628, 0x64A),
2543
-                    0xFC70 => array(0x62A, 0x631), 0xFC71 => array(0x62A, 0x632), 0xFC72 => array(0x62A, 0x645),
2544
-                    0xFC73 => array(0x62A, 0x646), 0xFC74 => array(0x62A, 0x649), 0xFC75 => array(0x62A, 0x64A),
2545
-                    0xFC76 => array(0x62B, 0x631), 0xFC77 => array(0x62B, 0x632), 0xFC78 => array(0x62B, 0x645),
2546
-                    0xFC79 => array(0x62B, 0x646), 0xFC7A => array(0x62B, 0x649), 0xFC7B => array(0x62B, 0x64A),
2547
-                    0xFC7C => array(0x641, 0x649), 0xFC7D => array(0x641, 0x64A), 0xFC7E => array(0x642, 0x649),
2548
-                    0xFC7F => array(0x642, 0x64A), 0xFC80 => array(0x643, 0x627), 0xFC81 => array(0x643, 0x644),
2549
-                    0xFC82 => array(0x643, 0x645), 0xFC83 => array(0x643, 0x649), 0xFC84 => array(0x643, 0x64A),
2550
-                    0xFC85 => array(0x644, 0x645), 0xFC86 => array(0x644, 0x649), 0xFC87 => array(0x644, 0x64A),
2551
-                    0xFC88 => array(0x645, 0x627), 0xFC89 => array(0x645, 0x645), 0xFC8A => array(0x646, 0x631),
2552
-                    0xFC8B => array(0x646, 0x632), 0xFC8C => array(0x646, 0x645), 0xFC8D => array(0x646, 0x646),
2553
-                    0xFC8E => array(0x646, 0x649), 0xFC8F => array(0x646, 0x64A), 0xFC90 => array(0x649, 0x670),
2554
-                    0xFC91 => array(0x64A, 0x631), 0xFC92 => array(0x64A, 0x632), 0xFC93 => array(0x64A, 0x645),
2555
-                    0xFC94 => array(0x64A, 0x646), 0xFC95 => array(0x64A, 0x649), 0xFC96 => array(0x64A, 0x64A),
2556
-                    0xFC97 => array(0x626, 0x62C), 0xFC98 => array(0x626, 0x62D), 0xFC99 => array(0x626, 0x62E),
2557
-                    0xFC9A => array(0x626, 0x645), 0xFC9B => array(0x626, 0x647), 0xFC9C => array(0x628, 0x62C),
2558
-                    0xFC9D => array(0x628, 0x62D), 0xFC9E => array(0x628, 0x62E), 0xFC9F => array(0x628, 0x645),
2559
-                    0xFCA0 => array(0x628, 0x647), 0xFCA1 => array(0x62A, 0x62C), 0xFCA2 => array(0x62A, 0x62D),
2560
-                    0xFCA3 => array(0x62A, 0x62E), 0xFCA4 => array(0x62A, 0x645), 0xFCA5 => array(0x62A, 0x647),
2561
-                    0xFCA6 => array(0x62B, 0x645), 0xFCA7 => array(0x62C, 0x62D), 0xFCA8 => array(0x62C, 0x645),
2562
-                    0xFCA9 => array(0x62D, 0x62C), 0xFCAA => array(0x62D, 0x645), 0xFCAB => array(0x62E, 0x62C),
2563
-                    0xFCAC => array(0x62E, 0x645), 0xFCAD => array(0x633, 0x62C), 0xFCAE => array(0x633, 0x62D),
2564
-                    0xFCAF => array(0x633, 0x62E), 0xFCB0 => array(0x633, 0x645), 0xFCB1 => array(0x635, 0x62D),
2565
-                    0xFCB2 => array(0x635, 0x62E), 0xFCB3 => array(0x635, 0x645), 0xFCB4 => array(0x636, 0x62C),
2566
-                    0xFCB5 => array(0x636, 0x62D), 0xFCB6 => array(0x636, 0x62E), 0xFCB7 => array(0x636, 0x645),
2567
-                    0xFCB8 => array(0x637, 0x62D), 0xFCB9 => array(0x638, 0x645), 0xFCBA => array(0x639, 0x62C),
2568
-                    0xFCBB => array(0x639, 0x645), 0xFCBC => array(0x63A, 0x62C), 0xFCBD => array(0x63A, 0x645),
2569
-                    0xFCBE => array(0x641, 0x62C), 0xFCBF => array(0x641, 0x62D), 0xFCC0 => array(0x641, 0x62E),
2570
-                    0xFCC1 => array(0x641, 0x645), 0xFCC2 => array(0x642, 0x62D), 0xFCC3 => array(0x642, 0x645),
2571
-                    0xFCC4 => array(0x643, 0x62C), 0xFCC5 => array(0x643, 0x62D), 0xFCC6 => array(0x643, 0x62E),
2572
-                    0xFCC7 => array(0x643, 0x644), 0xFCC8 => array(0x643, 0x645), 0xFCC9 => array(0x644, 0x62C),
2573
-                    0xFCCA => array(0x644, 0x62D), 0xFCCB => array(0x644, 0x62E), 0xFCCC => array(0x644, 0x645),
2574
-                    0xFCCD => array(0x644, 0x647), 0xFCCE => array(0x645, 0x62C), 0xFCCF => array(0x645, 0x62D),
2575
-                    0xFCD0 => array(0x645, 0x62E), 0xFCD1 => array(0x645, 0x645), 0xFCD2 => array(0x646, 0x62C),
2576
-                    0xFCD3 => array(0x646, 0x62D), 0xFCD4 => array(0x646, 0x62E), 0xFCD5 => array(0x646, 0x645),
2577
-                    0xFCD6 => array(0x646, 0x647), 0xFCD7 => array(0x647, 0x62C), 0xFCD8 => array(0x647, 0x645),
2578
-                    0xFCD9 => array(0x647, 0x670), 0xFCDA => array(0x64A, 0x62C), 0xFCDB => array(0x64A, 0x62D),
2579
-                    0xFCDC => array(0x64A, 0x62E), 0xFCDD => array(0x64A, 0x645), 0xFCDE => array(0x64A, 0x647),
2580
-                    0xFCDF => array(0x626, 0x645), 0xFCE0 => array(0x626, 0x647), 0xFCE1 => array(0x628, 0x645),
2581
-                    0xFCE2 => array(0x628, 0x647), 0xFCE3 => array(0x62A, 0x645), 0xFCE4 => array(0x62A, 0x647),
2582
-                    0xFCE5 => array(0x62B, 0x645), 0xFCE6 => array(0x62B, 0x647), 0xFCE7 => array(0x633, 0x645),
2583
-                    0xFCE8 => array(0x633, 0x647), 0xFCE9 => array(0x634, 0x645), 0xFCEA => array(0x634, 0x647),
2584
-                    0xFCEB => array(0x643, 0x644), 0xFCEC => array(0x643, 0x645), 0xFCED => array(0x644, 0x645),
2585
-                    0xFCEE => array(0x646, 0x645), 0xFCEF => array(0x646, 0x647), 0xFCF0 => array(0x64A, 0x645),
2586
-                    0xFCF1 => array(0x64A, 0x647), 0xFCF2 => array(0x640, 0x64E, 0x651), 0xFCF3 => array(0x640, 0x64F, 0x651),
2587
-                    0xFCF4 => array(0x640, 0x650, 0x651), 0xFCF5 => array(0x637, 0x649), 0xFCF6 => array(0x637, 0x64A),
2588
-                    0xFCF7 => array(0x639, 0x649), 0xFCF8 => array(0x639, 0x64A), 0xFCF9 => array(0x63A, 0x649),
2589
-                    0xFCFA => array(0x63A, 0x64A), 0xFCFB => array(0x633, 0x649), 0xFCFC => array(0x633, 0x64A),
2590
-                    0xFCFD => array(0x634, 0x649), 0xFCFE => array(0x634, 0x64A), 0xFCFF => array(0x62D, 0x649),
2591
-                    0xFD00 => array(0x62D, 0x64A), 0xFD01 => array(0x62C, 0x649), 0xFD02 => array(0x62C, 0x64A),
2592
-                    0xFD03 => array(0x62E, 0x649), 0xFD04 => array(0x62E, 0x64A), 0xFD05 => array(0x635, 0x649),
2593
-                    0xFD06 => array(0x635, 0x64A), 0xFD07 => array(0x636, 0x649), 0xFD08 => array(0x636, 0x64A),
2594
-                    0xFD09 => array(0x634, 0x62C), 0xFD0A => array(0x634, 0x62D), 0xFD0B => array(0x634, 0x62E),
2595
-                    0xFD0C => array(0x634, 0x645), 0xFD0D => array(0x634, 0x631), 0xFD0E => array(0x633, 0x631),
2596
-                    0xFD0F => array(0x635, 0x631), 0xFD10 => array(0x636, 0x631), 0xFD11 => array(0x637, 0x649),
2597
-                    0xFD12 => array(0x637, 0x64A), 0xFD13 => array(0x639, 0x649), 0xFD14 => array(0x639, 0x64A),
2598
-                    0xFD15 => array(0x63A, 0x649), 0xFD16 => array(0x63A, 0x64A), 0xFD17 => array(0x633, 0x649),
2599
-                    0xFD18 => array(0x633, 0x64A), 0xFD19 => array(0x634, 0x649), 0xFD1A => array(0x634, 0x64A),
2600
-                    0xFD1B => array(0x62D, 0x649), 0xFD1C => array(0x62D, 0x64A), 0xFD1D => array(0x62C, 0x649),
2601
-                    0xFD1E => array(0x62C, 0x64A), 0xFD1F => array(0x62E, 0x649), 0xFD20 => array(0x62E, 0x64A),
2602
-                    0xFD21 => array(0x635, 0x649), 0xFD22 => array(0x635, 0x64A), 0xFD23 => array(0x636, 0x649),
2603
-                    0xFD24 => array(0x636, 0x64A), 0xFD25 => array(0x634, 0x62C), 0xFD26 => array(0x634, 0x62D),
2604
-                    0xFD27 => array(0x634, 0x62E), 0xFD28 => array(0x634, 0x645), 0xFD29 => array(0x634, 0x631),
2605
-                    0xFD2A => array(0x633, 0x631), 0xFD2B => array(0x635, 0x631), 0xFD2C => array(0x636, 0x631),
2606
-                    0xFD2D => array(0x634, 0x62C), 0xFD2E => array(0x634, 0x62D), 0xFD2F => array(0x634, 0x62E),
2607
-                    0xFD30 => array(0x634, 0x645), 0xFD31 => array(0x633, 0x647), 0xFD32 => array(0x634, 0x647),
2608
-                    0xFD33 => array(0x637, 0x645), 0xFD34 => array(0x633, 0x62C), 0xFD35 => array(0x633, 0x62D),
2609
-                    0xFD36 => array(0x633, 0x62E), 0xFD37 => array(0x634, 0x62C), 0xFD38 => array(0x634, 0x62D),
2610
-                    0xFD39 => array(0x634, 0x62E), 0xFD3A => array(0x637, 0x645), 0xFD3B => array(0x638, 0x645),
2611
-                    0xFD3C => array(0x627, 0x64B), 0xFD3D => array(0x627, 0x64B), 0xFD50 => array(0x62A, 0x62C, 0x645),
2612
-                    0xFD51 => array(0x62A, 0x62D, 0x62C), 0xFD52 => array(0x62A, 0x62D, 0x62C), 0xFD53 => array(0x62A, 0x62D, 0x645),
2613
-                    0xFD54 => array(0x62A, 0x62E, 0x645), 0xFD55 => array(0x62A, 0x645, 0x62C), 0xFD56 => array(0x62A, 0x645, 0x62D),
2614
-                    0xFD57 => array(0x62A, 0x645, 0x62E), 0xFD58 => array(0x62C, 0x645, 0x62D), 0xFD59 => array(0x62C, 0x645, 0x62D),
2615
-                    0xFD5A => array(0x62D, 0x645, 0x64A), 0xFD5B => array(0x62D, 0x645, 0x649), 0xFD5C => array(0x633, 0x62D, 0x62C),
2616
-                    0xFD5D => array(0x633, 0x62C, 0x62D), 0xFD5E => array(0x633, 0x62C, 0x649), 0xFD5F => array(0x633, 0x645, 0x62D),
2617
-                    0xFD60 => array(0x633, 0x645, 0x62D), 0xFD61 => array(0x633, 0x645, 0x62C), 0xFD62 => array(0x633, 0x645, 0x645),
2618
-                    0xFD63 => array(0x633, 0x645, 0x645), 0xFD64 => array(0x635, 0x62D, 0x62D), 0xFD65 => array(0x635, 0x62D, 0x62D),
2619
-                    0xFD66 => array(0x635, 0x645, 0x645), 0xFD67 => array(0x634, 0x62D, 0x645), 0xFD68 => array(0x634, 0x62D, 0x645),
2620
-                    0xFD69 => array(0x634, 0x62C, 0x64A), 0xFD6A => array(0x634, 0x645, 0x62E), 0xFD6B => array(0x634, 0x645, 0x62E),
2621
-                    0xFD6C => array(0x634, 0x645, 0x645), 0xFD6D => array(0x634, 0x645, 0x645), 0xFD6E => array(0x636, 0x62D, 0x649),
2622
-                    0xFD6F => array(0x636, 0x62E, 0x645), 0xFD70 => array(0x636, 0x62E, 0x645), 0xFD71 => array(0x637, 0x645, 0x62D),
2623
-                    0xFD72 => array(0x637, 0x645, 0x62D), 0xFD73 => array(0x637, 0x645, 0x645), 0xFD74 => array(0x637, 0x645, 0x64A),
2624
-                    0xFD75 => array(0x639, 0x62C, 0x645), 0xFD76 => array(0x639, 0x645, 0x645), 0xFD77 => array(0x639, 0x645, 0x645),
2625
-                    0xFD78 => array(0x639, 0x645, 0x649), 0xFD79 => array(0x63A, 0x645, 0x645), 0xFD7A => array(0x63A, 0x645, 0x64A),
2626
-                    0xFD7B => array(0x63A, 0x645, 0x649), 0xFD7C => array(0x641, 0x62E, 0x645), 0xFD7D => array(0x641, 0x62E, 0x645),
2627
-                    0xFD7E => array(0x642, 0x645, 0x62D), 0xFD7F => array(0x642, 0x645, 0x645), 0xFD80 => array(0x644, 0x62D, 0x645),
2628
-                    0xFD81 => array(0x644, 0x62D, 0x64A), 0xFD82 => array(0x644, 0x62D, 0x649), 0xFD83 => array(0x644, 0x62C, 0x62C),
2629
-                    0xFD84 => array(0x644, 0x62C, 0x62C), 0xFD85 => array(0x644, 0x62E, 0x645), 0xFD86 => array(0x644, 0x62E, 0x645),
2630
-                    0xFD87 => array(0x644, 0x645, 0x62D), 0xFD88 => array(0x644, 0x645, 0x62D), 0xFD89 => array(0x645, 0x62D, 0x62C),
2631
-                    0xFD8A => array(0x645, 0x62D, 0x645), 0xFD8B => array(0x645, 0x62D, 0x64A), 0xFD8C => array(0x645, 0x62C, 0x62D),
2632
-                    0xFD8D => array(0x645, 0x62C, 0x645), 0xFD8E => array(0x645, 0x62E, 0x62C), 0xFD8F => array(0x645, 0x62E, 0x645),
2633
-                    0xFD92 => array(0x645, 0x62C, 0x62E), 0xFD93 => array(0x647, 0x645, 0x62C), 0xFD94 => array(0x647, 0x645, 0x645),
2634
-                    0xFD95 => array(0x646, 0x62D, 0x645), 0xFD96 => array(0x646, 0x62D, 0x649), 0xFD97 => array(0x646, 0x62C, 0x645),
2635
-                    0xFD98 => array(0x646, 0x62C, 0x645), 0xFD99 => array(0x646, 0x62C, 0x649), 0xFD9A => array(0x646, 0x645, 0x64A),
2636
-                    0xFD9B => array(0x646, 0x645, 0x649), 0xFD9C => array(0x64A, 0x645, 0x645), 0xFD9D => array(0x64A, 0x645, 0x645),
2637
-                    0xFD9E => array(0x628, 0x62E, 0x64A), 0xFD9F => array(0x62A, 0x62C, 0x64A), 0xFDA0 => array(0x62A, 0x62C, 0x649),
2638
-                    0xFDA1 => array(0x62A, 0x62E, 0x64A), 0xFDA2 => array(0x62A, 0x62E, 0x649), 0xFDA3 => array(0x62A, 0x645, 0x64A),
2639
-                    0xFDA4 => array(0x62A, 0x645, 0x649), 0xFDA5 => array(0x62C, 0x645, 0x64A), 0xFDA6 => array(0x62C, 0x62D, 0x649),
2640
-                    0xFDA7 => array(0x62C, 0x645, 0x649), 0xFDA8 => array(0x633, 0x62E, 0x649), 0xFDA9 => array(0x635, 0x62D, 0x64A),
2641
-                    0xFDAA => array(0x634, 0x62D, 0x64A), 0xFDAB => array(0x636, 0x62D, 0x64A), 0xFDAC => array(0x644, 0x62C, 0x64A),
2642
-                    0xFDAD => array(0x644, 0x645, 0x64A), 0xFDAE => array(0x64A, 0x62D, 0x64A), 0xFDAF => array(0x64A, 0x62C, 0x64A),
2643
-                    0xFDB0 => array(0x64A, 0x645, 0x64A), 0xFDB1 => array(0x645, 0x645, 0x64A), 0xFDB2 => array(0x642, 0x645, 0x64A),
2644
-                    0xFDB3 => array(0x646, 0x62D, 0x64A), 0xFDB4 => array(0x642, 0x645, 0x62D), 0xFDB5 => array(0x644, 0x62D, 0x645),
2645
-                    0xFDB6 => array(0x639, 0x645, 0x64A), 0xFDB7 => array(0x643, 0x645, 0x64A), 0xFDB8 => array(0x646, 0x62C, 0x62D),
2646
-                    0xFDB9 => array(0x645, 0x62E, 0x64A), 0xFDBA => array(0x644, 0x62C, 0x645), 0xFDBB => array(0x643, 0x645, 0x645),
2647
-                    0xFDBC => array(0x644, 0x62C, 0x645), 0xFDBD => array(0x646, 0x62C, 0x62D), 0xFDBE => array(0x62C, 0x62D, 0x64A),
2648
-                    0xFDBF => array(0x62D, 0x62C, 0x64A), 0xFDC0 => array(0x645, 0x62C, 0x64A), 0xFDC1 => array(0x641, 0x645, 0x64A),
2649
-                    0xFDC2 => array(0x628, 0x62D, 0x64A), 0xFDC3 => array(0x643, 0x645, 0x645), 0xFDC4 => array(0x639, 0x62C, 0x645),
2650
-                    0xFDC5 => array(0x635, 0x645, 0x645), 0xFDC6 => array(0x633, 0x62E, 0x64A), 0xFDC7 => array(0x646, 0x62C, 0x64A),
2651
-                    0xFDF0 => array(0x635, 0x644, 0x6D2), 0xFDF1 => array(0x642, 0x644, 0x6D2), 0xFDF2 => array(0x627, 0x644, 0x644, 0x647),
2652
-                    0xFDF3 => array(0x627, 0x643, 0x628, 0x631), 0xFDF4 => array(0x645, 0x62D, 0x645, 0x62F), 0xFDF5 => array(0x635, 0x644, 0x639, 0x645),
2653
-                    0xFDF6 => array(0x631, 0x633, 0x648, 0x644), 0xFDF7 => array(0x639, 0x644, 0x64A, 0x647), 0xFDF8 => array(0x648, 0x633, 0x644, 0x645),
2654
-                    0xFDF9 => array(0x635, 0x644, 0x649), 0xFDFC => array(0x631, 0x6CC, 0x627, 0x644), 0xFE11 => array(0x3001),
2655
-                    0xFE17 => array(0x3016), 0xFE18 => array(0x3017), 0xFE31 => array(0x2014),
2656
-                    0xFE32 => array(0x2013), 0xFE39 => array(0x3014), 0xFE3A => array(0x3015),
2657
-                    0xFE3B => array(0x3010), 0xFE3C => array(0x3011), 0xFE3D => array(0x300A),
2658
-                    0xFE3E => array(0x300B), 0xFE3F => array(0x3008), 0xFE40 => array(0x3009),
2659
-                    0xFE41 => array(0x300C), 0xFE42 => array(0x300D), 0xFE43 => array(0x300E),
2660
-                    0xFE44 => array(0x300F), 0xFE51 => array(0x3001), 0xFE58 => array(0x2014),
2661
-                    0xFE5D => array(0x3014), 0xFE5E => array(0x3015), 0xFE63 => array(0x2D),
2662
-                    0xFE71 => array(0x640, 0x64B), 0xFE77 => array(0x640, 0x64E), 0xFE79 => array(0x640, 0x64F),
2663
-                    0xFE7B => array(0x640, 0x650), 0xFE7D => array(0x640, 0x651), 0xFE7F => array(0x640, 0x652),
2664
-                    0xFE80 => array(0x621), 0xFE81 => array(0x622), 0xFE82 => array(0x622),
2665
-                    0xFE83 => array(0x623), 0xFE84 => array(0x623), 0xFE85 => array(0x624),
2666
-                    0xFE86 => array(0x624), 0xFE87 => array(0x625), 0xFE88 => array(0x625),
2667
-                    0xFE89 => array(0x626), 0xFE8A => array(0x626), 0xFE8B => array(0x626),
2668
-                    0xFE8C => array(0x626), 0xFE8D => array(0x627), 0xFE8E => array(0x627),
2669
-                    0xFE8F => array(0x628), 0xFE90 => array(0x628), 0xFE91 => array(0x628),
2670
-                    0xFE92 => array(0x628), 0xFE93 => array(0x629), 0xFE94 => array(0x629),
2671
-                    0xFE95 => array(0x62A), 0xFE96 => array(0x62A), 0xFE97 => array(0x62A),
2672
-                    0xFE98 => array(0x62A), 0xFE99 => array(0x62B), 0xFE9A => array(0x62B),
2673
-                    0xFE9B => array(0x62B), 0xFE9C => array(0x62B), 0xFE9D => array(0x62C),
2674
-                    0xFE9E => array(0x62C), 0xFE9F => array(0x62C), 0xFEA0 => array(0x62C),
2675
-                    0xFEA1 => array(0x62D), 0xFEA2 => array(0x62D), 0xFEA3 => array(0x62D),
2676
-                    0xFEA4 => array(0x62D), 0xFEA5 => array(0x62E), 0xFEA6 => array(0x62E),
2677
-                    0xFEA7 => array(0x62E), 0xFEA8 => array(0x62E), 0xFEA9 => array(0x62F),
2678
-                    0xFEAA => array(0x62F), 0xFEAB => array(0x630), 0xFEAC => array(0x630),
2679
-                    0xFEAD => array(0x631), 0xFEAE => array(0x631), 0xFEAF => array(0x632),
2680
-                    0xFEB0 => array(0x632), 0xFEB1 => array(0x633), 0xFEB2 => array(0x633),
2681
-                    0xFEB3 => array(0x633), 0xFEB4 => array(0x633), 0xFEB5 => array(0x634),
2682
-                    0xFEB6 => array(0x634), 0xFEB7 => array(0x634), 0xFEB8 => array(0x634),
2683
-                    0xFEB9 => array(0x635), 0xFEBA => array(0x635), 0xFEBB => array(0x635),
2684
-                    0xFEBC => array(0x635), 0xFEBD => array(0x636), 0xFEBE => array(0x636),
2685
-                    0xFEBF => array(0x636), 0xFEC0 => array(0x636), 0xFEC1 => array(0x637),
2686
-                    0xFEC2 => array(0x637), 0xFEC3 => array(0x637), 0xFEC4 => array(0x637),
2687
-                    0xFEC5 => array(0x638), 0xFEC6 => array(0x638), 0xFEC7 => array(0x638),
2688
-                    0xFEC8 => array(0x638), 0xFEC9 => array(0x639), 0xFECA => array(0x639),
2689
-                    0xFECB => array(0x639), 0xFECC => array(0x639), 0xFECD => array(0x63A),
2690
-                    0xFECE => array(0x63A), 0xFECF => array(0x63A), 0xFED0 => array(0x63A),
2691
-                    0xFED1 => array(0x641), 0xFED2 => array(0x641), 0xFED3 => array(0x641),
2692
-                    0xFED4 => array(0x641), 0xFED5 => array(0x642), 0xFED6 => array(0x642),
2693
-                    0xFED7 => array(0x642), 0xFED8 => array(0x642), 0xFED9 => array(0x643),
2694
-                    0xFEDA => array(0x643), 0xFEDB => array(0x643), 0xFEDC => array(0x643),
2695
-                    0xFEDD => array(0x644), 0xFEDE => array(0x644), 0xFEDF => array(0x644),
2696
-                    0xFEE0 => array(0x644), 0xFEE1 => array(0x645), 0xFEE2 => array(0x645),
2697
-                    0xFEE3 => array(0x645), 0xFEE4 => array(0x645), 0xFEE5 => array(0x646),
2698
-                    0xFEE6 => array(0x646), 0xFEE7 => array(0x646), 0xFEE8 => array(0x646),
2699
-                    0xFEE9 => array(0x647), 0xFEEA => array(0x647), 0xFEEB => array(0x647),
2700
-                    0xFEEC => array(0x647), 0xFEED => array(0x648), 0xFEEE => array(0x648),
2701
-                    0xFEEF => array(0x649), 0xFEF0 => array(0x649), 0xFEF1 => array(0x64A),
2702
-                    0xFEF2 => array(0x64A), 0xFEF3 => array(0x64A), 0xFEF4 => array(0x64A),
2703
-                    0xFEF5 => array(0x644, 0x622), 0xFEF6 => array(0x644, 0x622), 0xFEF7 => array(0x644, 0x623),
2704
-                    0xFEF8 => array(0x644, 0x623), 0xFEF9 => array(0x644, 0x625), 0xFEFA => array(0x644, 0x625),
2705
-                    0xFEFB => array(0x644, 0x627), 0xFEFC => array(0x644, 0x627), 0xFF0D => array(0x2D),
2706
-                    0xFF0E => array(0x2E), 0xFF10 => array(0x30), 0xFF11 => array(0x31),
2707
-                    0xFF12 => array(0x32), 0xFF13 => array(0x33), 0xFF14 => array(0x34),
2708
-                    0xFF15 => array(0x35), 0xFF16 => array(0x36), 0xFF17 => array(0x37),
2709
-                    0xFF18 => array(0x38), 0xFF19 => array(0x39), 0xFF21 => array(0x61),
2710
-                    0xFF22 => array(0x62), 0xFF23 => array(0x63), 0xFF24 => array(0x64),
2711
-                    0xFF25 => array(0x65), 0xFF26 => array(0x66), 0xFF27 => array(0x67),
2712
-                    0xFF28 => array(0x68), 0xFF29 => array(0x69), 0xFF2A => array(0x6A),
2713
-                    0xFF2B => array(0x6B), 0xFF2C => array(0x6C), 0xFF2D => array(0x6D),
2714
-                    0xFF2E => array(0x6E), 0xFF2F => array(0x6F), 0xFF30 => array(0x70),
2715
-                    0xFF31 => array(0x71), 0xFF32 => array(0x72), 0xFF33 => array(0x73),
2716
-                    0xFF34 => array(0x74), 0xFF35 => array(0x75), 0xFF36 => array(0x76),
2717
-                    0xFF37 => array(0x77), 0xFF38 => array(0x78), 0xFF39 => array(0x79),
2718
-                    0xFF3A => array(0x7A), 0xFF41 => array(0x61), 0xFF42 => array(0x62),
2719
-                    0xFF43 => array(0x63), 0xFF44 => array(0x64), 0xFF45 => array(0x65),
2720
-                    0xFF46 => array(0x66), 0xFF47 => array(0x67), 0xFF48 => array(0x68),
2721
-                    0xFF49 => array(0x69), 0xFF4A => array(0x6A), 0xFF4B => array(0x6B),
2722
-                    0xFF4C => array(0x6C), 0xFF4D => array(0x6D), 0xFF4E => array(0x6E),
2723
-                    0xFF4F => array(0x6F), 0xFF50 => array(0x70), 0xFF51 => array(0x71),
2724
-                    0xFF52 => array(0x72), 0xFF53 => array(0x73), 0xFF54 => array(0x74),
2725
-                    0xFF55 => array(0x75), 0xFF56 => array(0x76), 0xFF57 => array(0x77),
2726
-                    0xFF58 => array(0x78), 0xFF59 => array(0x79), 0xFF5A => array(0x7A),
2727
-                    0xFF5F => array(0x2985), 0xFF60 => array(0x2986), 0xFF61 => array(0x2E),
2728
-                    0xFF62 => array(0x300C), 0xFF63 => array(0x300D), 0xFF64 => array(0x3001),
2729
-                    0xFF65 => array(0x30FB), 0xFF66 => array(0x30F2), 0xFF67 => array(0x30A1),
2730
-                    0xFF68 => array(0x30A3), 0xFF69 => array(0x30A5), 0xFF6A => array(0x30A7),
2731
-                    0xFF6B => array(0x30A9), 0xFF6C => array(0x30E3), 0xFF6D => array(0x30E5),
2732
-                    0xFF6E => array(0x30E7), 0xFF6F => array(0x30C3), 0xFF70 => array(0x30FC),
2733
-                    0xFF71 => array(0x30A2), 0xFF72 => array(0x30A4), 0xFF73 => array(0x30A6),
2734
-                    0xFF74 => array(0x30A8), 0xFF75 => array(0x30AA), 0xFF76 => array(0x30AB),
2735
-                    0xFF77 => array(0x30AD), 0xFF78 => array(0x30AF), 0xFF79 => array(0x30B1),
2736
-                    0xFF7A => array(0x30B3), 0xFF7B => array(0x30B5), 0xFF7C => array(0x30B7),
2737
-                    0xFF7D => array(0x30B9), 0xFF7E => array(0x30BB), 0xFF7F => array(0x30BD),
2738
-                    0xFF80 => array(0x30BF), 0xFF81 => array(0x30C1), 0xFF82 => array(0x30C4),
2739
-                    0xFF83 => array(0x30C6), 0xFF84 => array(0x30C8), 0xFF85 => array(0x30CA),
2740
-                    0xFF86 => array(0x30CB), 0xFF87 => array(0x30CC), 0xFF88 => array(0x30CD),
2741
-                    0xFF89 => array(0x30CE), 0xFF8A => array(0x30CF), 0xFF8B => array(0x30D2),
2742
-                    0xFF8C => array(0x30D5), 0xFF8D => array(0x30D8), 0xFF8E => array(0x30DB),
2743
-                    0xFF8F => array(0x30DE), 0xFF90 => array(0x30DF), 0xFF91 => array(0x30E0),
2744
-                    0xFF92 => array(0x30E1), 0xFF93 => array(0x30E2), 0xFF94 => array(0x30E4),
2745
-                    0xFF95 => array(0x30E6), 0xFF96 => array(0x30E8), 0xFF97 => array(0x30E9),
2746
-                    0xFF98 => array(0x30EA), 0xFF99 => array(0x30EB), 0xFF9A => array(0x30EC),
2747
-                    0xFF9B => array(0x30ED), 0xFF9C => array(0x30EF), 0xFF9D => array(0x30F3),
2748
-                    0xFF9E => array(0x3099), 0xFF9F => array(0x309A), 0xFFA1 => array(0x1100),
2749
-                    0xFFA2 => array(0x1101), 0xFFA3 => array(0x11AA), 0xFFA4 => array(0x1102),
2750
-                    0xFFA5 => array(0x11AC), 0xFFA6 => array(0x11AD), 0xFFA7 => array(0x1103),
2751
-                    0xFFA8 => array(0x1104), 0xFFA9 => array(0x1105), 0xFFAA => array(0x11B0),
2752
-                    0xFFAB => array(0x11B1), 0xFFAC => array(0x11B2), 0xFFAD => array(0x11B3),
2753
-                    0xFFAE => array(0x11B4), 0xFFAF => array(0x11B5), 0xFFB0 => array(0x111A),
2754
-                    0xFFB1 => array(0x1106), 0xFFB2 => array(0x1107), 0xFFB3 => array(0x1108),
2755
-                    0xFFB4 => array(0x1121), 0xFFB5 => array(0x1109), 0xFFB6 => array(0x110A),
2756
-                    0xFFB7 => array(0x110B), 0xFFB8 => array(0x110C), 0xFFB9 => array(0x110D),
2757
-                    0xFFBA => array(0x110E), 0xFFBB => array(0x110F), 0xFFBC => array(0x1110),
2758
-                    0xFFBD => array(0x1111), 0xFFBE => array(0x1112), 0xFFC2 => array(0x1161),
2759
-                    0xFFC3 => array(0x1162), 0xFFC4 => array(0x1163), 0xFFC5 => array(0x1164),
2760
-                    0xFFC6 => array(0x1165), 0xFFC7 => array(0x1166), 0xFFCA => array(0x1167),
2761
-                    0xFFCB => array(0x1168), 0xFFCC => array(0x1169), 0xFFCD => array(0x116A),
2762
-                    0xFFCE => array(0x116B), 0xFFCF => array(0x116C), 0xFFD2 => array(0x116D),
2763
-                    0xFFD3 => array(0x116E), 0xFFD4 => array(0x116F), 0xFFD5 => array(0x1170),
2764
-                    0xFFD6 => array(0x1171), 0xFFD7 => array(0x1172), 0xFFDA => array(0x1173),
2765
-                    0xFFDB => array(0x1174), 0xFFDC => array(0x1175), 0xFFE0 => array(0xA2),
2766
-                    0xFFE1 => array(0xA3), 0xFFE2 => array(0xAC), 0xFFE4 => array(0xA6),
2767
-                    0xFFE5 => array(0xA5), 0xFFE6 => array(0x20A9), 0xFFE8 => array(0x2502),
2768
-                    0xFFE9 => array(0x2190), 0xFFEA => array(0x2191), 0xFFEB => array(0x2192),
2769
-                    0xFFEC => array(0x2193), 0xFFED => array(0x25A0), 0xFFEE => array(0x25CB),
2770
-                    0x10400 => array(0x10428), 0x10401 => array(0x10429), 0x10402 => array(0x1042A),
2771
-                    0x10403 => array(0x1042B), 0x10404 => array(0x1042C), 0x10405 => array(0x1042D),
2772
-                    0x10406 => array(0x1042E), 0x10407 => array(0x1042F), 0x10408 => array(0x10430),
2773
-                    0x10409 => array(0x10431), 0x1040A => array(0x10432), 0x1040B => array(0x10433),
2774
-                    0x1040C => array(0x10434), 0x1040D => array(0x10435), 0x1040E => array(0x10436),
2775
-                    0x1040F => array(0x10437), 0x10410 => array(0x10438), 0x10411 => array(0x10439),
2776
-                    0x10412 => array(0x1043A), 0x10413 => array(0x1043B), 0x10414 => array(0x1043C),
2777
-                    0x10415 => array(0x1043D), 0x10416 => array(0x1043E), 0x10417 => array(0x1043F),
2778
-                    0x10418 => array(0x10440), 0x10419 => array(0x10441), 0x1041A => array(0x10442),
2779
-                    0x1041B => array(0x10443), 0x1041C => array(0x10444), 0x1041D => array(0x10445),
2780
-                    0x1041E => array(0x10446), 0x1041F => array(0x10447), 0x10420 => array(0x10448),
2781
-                    0x10421 => array(0x10449), 0x10422 => array(0x1044A), 0x10423 => array(0x1044B),
2782
-                    0x10424 => array(0x1044C), 0x10425 => array(0x1044D), 0x10426 => array(0x1044E),
2783
-                    0x10427 => array(0x1044F), 0x118A0 => array(0x118C0), 0x118A1 => array(0x118C1),
2784
-                    0x118A2 => array(0x118C2), 0x118A3 => array(0x118C3), 0x118A4 => array(0x118C4),
2785
-                    0x118A5 => array(0x118C5), 0x118A6 => array(0x118C6), 0x118A7 => array(0x118C7),
2786
-                    0x118A8 => array(0x118C8), 0x118A9 => array(0x118C9), 0x118AA => array(0x118CA),
2787
-                    0x118AB => array(0x118CB), 0x118AC => array(0x118CC), 0x118AD => array(0x118CD),
2788
-                    0x118AE => array(0x118CE), 0x118AF => array(0x118CF), 0x118B0 => array(0x118D0),
2789
-                    0x118B1 => array(0x118D1), 0x118B2 => array(0x118D2), 0x118B3 => array(0x118D3),
2790
-                    0x118B4 => array(0x118D4), 0x118B5 => array(0x118D5), 0x118B6 => array(0x118D6),
2791
-                    0x118B7 => array(0x118D7), 0x118B8 => array(0x118D8), 0x118B9 => array(0x118D9),
2792
-                    0x118BA => array(0x118DA), 0x118BB => array(0x118DB), 0x118BC => array(0x118DC),
2793
-                    0x118BD => array(0x118DD), 0x118BE => array(0x118DE), 0x118BF => array(0x118DF),
2794
-                    0x1D15E => array(0x1D157, 0x1D165), 0x1D15F => array(0x1D158, 0x1D165), 0x1D160 => array(0x1D158, 0x1D165, 0x1D16E),
2795
-                    0x1D161 => array(0x1D158, 0x1D165, 0x1D16F), 0x1D162 => array(0x1D158, 0x1D165, 0x1D170), 0x1D163 => array(0x1D158, 0x1D165, 0x1D171),
2796
-                    0x1D164 => array(0x1D158, 0x1D165, 0x1D172), 0x1D1BB => array(0x1D1B9, 0x1D165), 0x1D1BC => array(0x1D1BA, 0x1D165),
2797
-                    0x1D1BD => array(0x1D1B9, 0x1D165, 0x1D16E), 0x1D1BE => array(0x1D1BA, 0x1D165, 0x1D16E), 0x1D1BF => array(0x1D1B9, 0x1D165, 0x1D16F),
2798
-                    0x1D1C0 => array(0x1D1BA, 0x1D165, 0x1D16F), 0x1D400 => array(0x61), 0x1D401 => array(0x62),
2799
-                    0x1D402 => array(0x63), 0x1D403 => array(0x64), 0x1D404 => array(0x65),
2800
-                    0x1D405 => array(0x66), 0x1D406 => array(0x67), 0x1D407 => array(0x68),
2801
-                    0x1D408 => array(0x69), 0x1D409 => array(0x6A), 0x1D40A => array(0x6B),
2802
-                    0x1D40B => array(0x6C), 0x1D40C => array(0x6D), 0x1D40D => array(0x6E),
2803
-                    0x1D40E => array(0x6F), 0x1D40F => array(0x70), 0x1D410 => array(0x71),
2804
-                    0x1D411 => array(0x72), 0x1D412 => array(0x73), 0x1D413 => array(0x74),
2805
-                    0x1D414 => array(0x75), 0x1D415 => array(0x76), 0x1D416 => array(0x77),
2806
-                    0x1D417 => array(0x78), 0x1D418 => array(0x79), 0x1D419 => array(0x7A),
2807
-                    0x1D41A => array(0x61), 0x1D41B => array(0x62), 0x1D41C => array(0x63),
2808
-                    0x1D41D => array(0x64), 0x1D41E => array(0x65), 0x1D41F => array(0x66),
2809
-                    0x1D420 => array(0x67), 0x1D421 => array(0x68), 0x1D422 => array(0x69),
2810
-                    0x1D423 => array(0x6A), 0x1D424 => array(0x6B), 0x1D425 => array(0x6C),
2811
-                    0x1D426 => array(0x6D), 0x1D427 => array(0x6E), 0x1D428 => array(0x6F),
2812
-                    0x1D429 => array(0x70), 0x1D42A => array(0x71), 0x1D42B => array(0x72),
2813
-                    0x1D42C => array(0x73), 0x1D42D => array(0x74), 0x1D42E => array(0x75),
2814
-                    0x1D42F => array(0x76), 0x1D430 => array(0x77), 0x1D431 => array(0x78),
2815
-                    0x1D432 => array(0x79), 0x1D433 => array(0x7A), 0x1D434 => array(0x61),
2816
-                    0x1D435 => array(0x62), 0x1D436 => array(0x63), 0x1D437 => array(0x64),
2817
-                    0x1D438 => array(0x65), 0x1D439 => array(0x66), 0x1D43A => array(0x67),
2818
-                    0x1D43B => array(0x68), 0x1D43C => array(0x69), 0x1D43D => array(0x6A),
2819
-                    0x1D43E => array(0x6B), 0x1D43F => array(0x6C), 0x1D440 => array(0x6D),
2820
-                    0x1D441 => array(0x6E), 0x1D442 => array(0x6F), 0x1D443 => array(0x70),
2821
-                    0x1D444 => array(0x71), 0x1D445 => array(0x72), 0x1D446 => array(0x73),
2822
-                    0x1D447 => array(0x74), 0x1D448 => array(0x75), 0x1D449 => array(0x76),
2823
-                    0x1D44A => array(0x77), 0x1D44B => array(0x78), 0x1D44C => array(0x79),
2824
-                    0x1D44D => array(0x7A), 0x1D44E => array(0x61), 0x1D44F => array(0x62),
2825
-                    0x1D450 => array(0x63), 0x1D451 => array(0x64), 0x1D452 => array(0x65),
2826
-                    0x1D453 => array(0x66), 0x1D454 => array(0x67), 0x1D456 => array(0x69),
2827
-                    0x1D457 => array(0x6A), 0x1D458 => array(0x6B), 0x1D459 => array(0x6C),
2828
-                    0x1D45A => array(0x6D), 0x1D45B => array(0x6E), 0x1D45C => array(0x6F),
2829
-                    0x1D45D => array(0x70), 0x1D45E => array(0x71), 0x1D45F => array(0x72),
2830
-                    0x1D460 => array(0x73), 0x1D461 => array(0x74), 0x1D462 => array(0x75),
2831
-                    0x1D463 => array(0x76), 0x1D464 => array(0x77), 0x1D465 => array(0x78),
2832
-                    0x1D466 => array(0x79), 0x1D467 => array(0x7A), 0x1D468 => array(0x61),
2833
-                    0x1D469 => array(0x62), 0x1D46A => array(0x63), 0x1D46B => array(0x64),
2834
-                    0x1D46C => array(0x65), 0x1D46D => array(0x66), 0x1D46E => array(0x67),
2835
-                    0x1D46F => array(0x68), 0x1D470 => array(0x69), 0x1D471 => array(0x6A),
2836
-                    0x1D472 => array(0x6B), 0x1D473 => array(0x6C), 0x1D474 => array(0x6D),
2837
-                    0x1D475 => array(0x6E), 0x1D476 => array(0x6F), 0x1D477 => array(0x70),
2838
-                    0x1D478 => array(0x71), 0x1D479 => array(0x72), 0x1D47A => array(0x73),
2839
-                    0x1D47B => array(0x74), 0x1D47C => array(0x75), 0x1D47D => array(0x76),
2840
-                    0x1D47E => array(0x77), 0x1D47F => array(0x78), 0x1D480 => array(0x79),
2841
-                    0x1D481 => array(0x7A), 0x1D482 => array(0x61), 0x1D483 => array(0x62),
2842
-                    0x1D484 => array(0x63), 0x1D485 => array(0x64), 0x1D486 => array(0x65),
2843
-                    0x1D487 => array(0x66), 0x1D488 => array(0x67), 0x1D489 => array(0x68),
2844
-                    0x1D48A => array(0x69), 0x1D48B => array(0x6A), 0x1D48C => array(0x6B),
2845
-                    0x1D48D => array(0x6C), 0x1D48E => array(0x6D), 0x1D48F => array(0x6E),
2846
-                    0x1D490 => array(0x6F), 0x1D491 => array(0x70), 0x1D492 => array(0x71),
2847
-                    0x1D493 => array(0x72), 0x1D494 => array(0x73), 0x1D495 => array(0x74),
2848
-                    0x1D496 => array(0x75), 0x1D497 => array(0x76), 0x1D498 => array(0x77),
2849
-                    0x1D499 => array(0x78), 0x1D49A => array(0x79), 0x1D49B => array(0x7A),
2850
-                    0x1D49C => array(0x61), 0x1D49E => array(0x63), 0x1D49F => array(0x64),
2851
-                    0x1D4A2 => array(0x67), 0x1D4A5 => array(0x6A), 0x1D4A6 => array(0x6B),
2852
-                    0x1D4A9 => array(0x6E), 0x1D4AA => array(0x6F), 0x1D4AB => array(0x70),
2853
-                    0x1D4AC => array(0x71), 0x1D4AE => array(0x73), 0x1D4AF => array(0x74),
2854
-                    0x1D4B0 => array(0x75), 0x1D4B1 => array(0x76), 0x1D4B2 => array(0x77),
2855
-                    0x1D4B3 => array(0x78), 0x1D4B4 => array(0x79), 0x1D4B5 => array(0x7A),
2856
-                    0x1D4B6 => array(0x61), 0x1D4B7 => array(0x62), 0x1D4B8 => array(0x63),
2857
-                    0x1D4B9 => array(0x64), 0x1D4BB => array(0x66), 0x1D4BD => array(0x68),
2858
-                    0x1D4BE => array(0x69), 0x1D4BF => array(0x6A), 0x1D4C0 => array(0x6B),
2859
-                    0x1D4C1 => array(0x6C), 0x1D4C2 => array(0x6D), 0x1D4C3 => array(0x6E),
2860
-                    0x1D4C5 => array(0x70), 0x1D4C6 => array(0x71), 0x1D4C7 => array(0x72),
2861
-                    0x1D4C8 => array(0x73), 0x1D4C9 => array(0x74), 0x1D4CA => array(0x75),
2862
-                    0x1D4CB => array(0x76), 0x1D4CC => array(0x77), 0x1D4CD => array(0x78),
2863
-                    0x1D4CE => array(0x79), 0x1D4CF => array(0x7A), 0x1D4D0 => array(0x61),
2864
-                    0x1D4D1 => array(0x62), 0x1D4D2 => array(0x63), 0x1D4D3 => array(0x64),
2865
-                    0x1D4D4 => array(0x65), 0x1D4D5 => array(0x66), 0x1D4D6 => array(0x67),
2866
-                    0x1D4D7 => array(0x68), 0x1D4D8 => array(0x69), 0x1D4D9 => array(0x6A),
2867
-                    0x1D4DA => array(0x6B), 0x1D4DB => array(0x6C), 0x1D4DC => array(0x6D),
2868
-                    0x1D4DD => array(0x6E), 0x1D4DE => array(0x6F), 0x1D4DF => array(0x70),
2869
-                    0x1D4E0 => array(0x71), 0x1D4E1 => array(0x72), 0x1D4E2 => array(0x73),
2870
-                    0x1D4E3 => array(0x74), 0x1D4E4 => array(0x75), 0x1D4E5 => array(0x76),
2871
-                    0x1D4E6 => array(0x77), 0x1D4E7 => array(0x78), 0x1D4E8 => array(0x79),
2872
-                    0x1D4E9 => array(0x7A), 0x1D4EA => array(0x61), 0x1D4EB => array(0x62),
2873
-                    0x1D4EC => array(0x63), 0x1D4ED => array(0x64), 0x1D4EE => array(0x65),
2874
-                    0x1D4EF => array(0x66), 0x1D4F0 => array(0x67), 0x1D4F1 => array(0x68),
2875
-                    0x1D4F2 => array(0x69), 0x1D4F3 => array(0x6A), 0x1D4F4 => array(0x6B),
2876
-                    0x1D4F5 => array(0x6C), 0x1D4F6 => array(0x6D), 0x1D4F7 => array(0x6E),
2877
-                    0x1D4F8 => array(0x6F), 0x1D4F9 => array(0x70), 0x1D4FA => array(0x71),
2878
-                    0x1D4FB => array(0x72), 0x1D4FC => array(0x73), 0x1D4FD => array(0x74),
2879
-                    0x1D4FE => array(0x75), 0x1D4FF => array(0x76), 0x1D500 => array(0x77),
2880
-                    0x1D501 => array(0x78), 0x1D502 => array(0x79), 0x1D503 => array(0x7A),
2881
-                    0x1D504 => array(0x61), 0x1D505 => array(0x62), 0x1D507 => array(0x64),
2882
-                    0x1D508 => array(0x65), 0x1D509 => array(0x66), 0x1D50A => array(0x67),
2883
-                    0x1D50D => array(0x6A), 0x1D50E => array(0x6B), 0x1D50F => array(0x6C),
2884
-                    0x1D510 => array(0x6D), 0x1D511 => array(0x6E), 0x1D512 => array(0x6F),
2885
-                    0x1D513 => array(0x70), 0x1D514 => array(0x71), 0x1D516 => array(0x73),
2886
-                    0x1D517 => array(0x74), 0x1D518 => array(0x75), 0x1D519 => array(0x76),
2887
-                    0x1D51A => array(0x77), 0x1D51B => array(0x78), 0x1D51C => array(0x79),
2888
-                    0x1D51E => array(0x61), 0x1D51F => array(0x62), 0x1D520 => array(0x63),
2889
-                    0x1D521 => array(0x64), 0x1D522 => array(0x65), 0x1D523 => array(0x66),
2890
-                    0x1D524 => array(0x67), 0x1D525 => array(0x68), 0x1D526 => array(0x69),
2891
-                    0x1D527 => array(0x6A), 0x1D528 => array(0x6B), 0x1D529 => array(0x6C),
2892
-                    0x1D52A => array(0x6D), 0x1D52B => array(0x6E), 0x1D52C => array(0x6F),
2893
-                    0x1D52D => array(0x70), 0x1D52E => array(0x71), 0x1D52F => array(0x72),
2894
-                    0x1D530 => array(0x73), 0x1D531 => array(0x74), 0x1D532 => array(0x75),
2895
-                    0x1D533 => array(0x76), 0x1D534 => array(0x77), 0x1D535 => array(0x78),
2896
-                    0x1D536 => array(0x79), 0x1D537 => array(0x7A), 0x1D538 => array(0x61),
2897
-                    0x1D539 => array(0x62), 0x1D53B => array(0x64), 0x1D53C => array(0x65),
2898
-                    0x1D53D => array(0x66), 0x1D53E => array(0x67), 0x1D540 => array(0x69),
2899
-                    0x1D541 => array(0x6A), 0x1D542 => array(0x6B), 0x1D543 => array(0x6C),
2900
-                    0x1D544 => array(0x6D), 0x1D546 => array(0x6F), 0x1D54A => array(0x73),
2901
-                    0x1D54B => array(0x74), 0x1D54C => array(0x75), 0x1D54D => array(0x76),
2902
-                    0x1D54E => array(0x77), 0x1D54F => array(0x78), 0x1D550 => array(0x79),
2903
-                    0x1D552 => array(0x61), 0x1D553 => array(0x62), 0x1D554 => array(0x63),
2904
-                    0x1D555 => array(0x64), 0x1D556 => array(0x65), 0x1D557 => array(0x66),
2905
-                    0x1D558 => array(0x67), 0x1D559 => array(0x68), 0x1D55A => array(0x69),
2906
-                    0x1D55B => array(0x6A), 0x1D55C => array(0x6B), 0x1D55D => array(0x6C),
2907
-                    0x1D55E => array(0x6D), 0x1D55F => array(0x6E), 0x1D560 => array(0x6F),
2908
-                    0x1D561 => array(0x70), 0x1D562 => array(0x71), 0x1D563 => array(0x72),
2909
-                    0x1D564 => array(0x73), 0x1D565 => array(0x74), 0x1D566 => array(0x75),
2910
-                    0x1D567 => array(0x76), 0x1D568 => array(0x77), 0x1D569 => array(0x78),
2911
-                    0x1D56A => array(0x79), 0x1D56B => array(0x7A), 0x1D56C => array(0x61),
2912
-                    0x1D56D => array(0x62), 0x1D56E => array(0x63), 0x1D56F => array(0x64),
2913
-                    0x1D570 => array(0x65), 0x1D571 => array(0x66), 0x1D572 => array(0x67),
2914
-                    0x1D573 => array(0x68), 0x1D574 => array(0x69), 0x1D575 => array(0x6A),
2915
-                    0x1D576 => array(0x6B), 0x1D577 => array(0x6C), 0x1D578 => array(0x6D),
2916
-                    0x1D579 => array(0x6E), 0x1D57A => array(0x6F), 0x1D57B => array(0x70),
2917
-                    0x1D57C => array(0x71), 0x1D57D => array(0x72), 0x1D57E => array(0x73),
2918
-                    0x1D57F => array(0x74), 0x1D580 => array(0x75), 0x1D581 => array(0x76),
2919
-                    0x1D582 => array(0x77), 0x1D583 => array(0x78), 0x1D584 => array(0x79),
2920
-                    0x1D585 => array(0x7A), 0x1D586 => array(0x61), 0x1D587 => array(0x62),
2921
-                    0x1D588 => array(0x63), 0x1D589 => array(0x64), 0x1D58A => array(0x65),
2922
-                    0x1D58B => array(0x66), 0x1D58C => array(0x67), 0x1D58D => array(0x68),
2923
-                    0x1D58E => array(0x69), 0x1D58F => array(0x6A), 0x1D590 => array(0x6B),
2924
-                    0x1D591 => array(0x6C), 0x1D592 => array(0x6D), 0x1D593 => array(0x6E),
2925
-                    0x1D594 => array(0x6F), 0x1D595 => array(0x70), 0x1D596 => array(0x71),
2926
-                    0x1D597 => array(0x72), 0x1D598 => array(0x73), 0x1D599 => array(0x74),
2927
-                    0x1D59A => array(0x75), 0x1D59B => array(0x76), 0x1D59C => array(0x77),
2928
-                    0x1D59D => array(0x78), 0x1D59E => array(0x79), 0x1D59F => array(0x7A),
2929
-                    0x1D5A0 => array(0x61), 0x1D5A1 => array(0x62), 0x1D5A2 => array(0x63),
2930
-                    0x1D5A3 => array(0x64), 0x1D5A4 => array(0x65), 0x1D5A5 => array(0x66),
2931
-                    0x1D5A6 => array(0x67), 0x1D5A7 => array(0x68), 0x1D5A8 => array(0x69),
2932
-                    0x1D5A9 => array(0x6A), 0x1D5AA => array(0x6B), 0x1D5AB => array(0x6C),
2933
-                    0x1D5AC => array(0x6D), 0x1D5AD => array(0x6E), 0x1D5AE => array(0x6F),
2934
-                    0x1D5AF => array(0x70), 0x1D5B0 => array(0x71), 0x1D5B1 => array(0x72),
2935
-                    0x1D5B2 => array(0x73), 0x1D5B3 => array(0x74), 0x1D5B4 => array(0x75),
2936
-                    0x1D5B5 => array(0x76), 0x1D5B6 => array(0x77), 0x1D5B7 => array(0x78),
2937
-                    0x1D5B8 => array(0x79), 0x1D5B9 => array(0x7A), 0x1D5BA => array(0x61),
2938
-                    0x1D5BB => array(0x62), 0x1D5BC => array(0x63), 0x1D5BD => array(0x64),
2939
-                    0x1D5BE => array(0x65), 0x1D5BF => array(0x66), 0x1D5C0 => array(0x67),
2940
-                    0x1D5C1 => array(0x68), 0x1D5C2 => array(0x69), 0x1D5C3 => array(0x6A),
2941
-                    0x1D5C4 => array(0x6B), 0x1D5C5 => array(0x6C), 0x1D5C6 => array(0x6D),
2942
-                    0x1D5C7 => array(0x6E), 0x1D5C8 => array(0x6F), 0x1D5C9 => array(0x70),
2943
-                    0x1D5CA => array(0x71), 0x1D5CB => array(0x72), 0x1D5CC => array(0x73),
2944
-                    0x1D5CD => array(0x74), 0x1D5CE => array(0x75), 0x1D5CF => array(0x76),
2945
-                    0x1D5D0 => array(0x77), 0x1D5D1 => array(0x78), 0x1D5D2 => array(0x79),
2946
-                    0x1D5D3 => array(0x7A), 0x1D5D4 => array(0x61), 0x1D5D5 => array(0x62),
2947
-                    0x1D5D6 => array(0x63), 0x1D5D7 => array(0x64), 0x1D5D8 => array(0x65),
2948
-                    0x1D5D9 => array(0x66), 0x1D5DA => array(0x67), 0x1D5DB => array(0x68),
2949
-                    0x1D5DC => array(0x69), 0x1D5DD => array(0x6A), 0x1D5DE => array(0x6B),
2950
-                    0x1D5DF => array(0x6C), 0x1D5E0 => array(0x6D), 0x1D5E1 => array(0x6E),
2951
-                    0x1D5E2 => array(0x6F), 0x1D5E3 => array(0x70), 0x1D5E4 => array(0x71),
2952
-                    0x1D5E5 => array(0x72), 0x1D5E6 => array(0x73), 0x1D5E7 => array(0x74),
2953
-                    0x1D5E8 => array(0x75), 0x1D5E9 => array(0x76), 0x1D5EA => array(0x77),
2954
-                    0x1D5EB => array(0x78), 0x1D5EC => array(0x79), 0x1D5ED => array(0x7A),
2955
-                    0x1D5EE => array(0x61), 0x1D5EF => array(0x62), 0x1D5F0 => array(0x63),
2956
-                    0x1D5F1 => array(0x64), 0x1D5F2 => array(0x65), 0x1D5F3 => array(0x66),
2957
-                    0x1D5F4 => array(0x67), 0x1D5F5 => array(0x68), 0x1D5F6 => array(0x69),
2958
-                    0x1D5F7 => array(0x6A), 0x1D5F8 => array(0x6B), 0x1D5F9 => array(0x6C),
2959
-                    0x1D5FA => array(0x6D), 0x1D5FB => array(0x6E), 0x1D5FC => array(0x6F),
2960
-                    0x1D5FD => array(0x70), 0x1D5FE => array(0x71), 0x1D5FF => array(0x72),
2961
-                    0x1D600 => array(0x73), 0x1D601 => array(0x74), 0x1D602 => array(0x75),
2962
-                    0x1D603 => array(0x76), 0x1D604 => array(0x77), 0x1D605 => array(0x78),
2963
-                    0x1D606 => array(0x79), 0x1D607 => array(0x7A), 0x1D608 => array(0x61),
2964
-                    0x1D609 => array(0x62), 0x1D60A => array(0x63), 0x1D60B => array(0x64),
2965
-                    0x1D60C => array(0x65), 0x1D60D => array(0x66), 0x1D60E => array(0x67),
2966
-                    0x1D60F => array(0x68), 0x1D610 => array(0x69), 0x1D611 => array(0x6A),
2967
-                    0x1D612 => array(0x6B), 0x1D613 => array(0x6C), 0x1D614 => array(0x6D),
2968
-                    0x1D615 => array(0x6E), 0x1D616 => array(0x6F), 0x1D617 => array(0x70),
2969
-                    0x1D618 => array(0x71), 0x1D619 => array(0x72), 0x1D61A => array(0x73),
2970
-                    0x1D61B => array(0x74), 0x1D61C => array(0x75), 0x1D61D => array(0x76),
2971
-                    0x1D61E => array(0x77), 0x1D61F => array(0x78), 0x1D620 => array(0x79),
2972
-                    0x1D621 => array(0x7A), 0x1D622 => array(0x61), 0x1D623 => array(0x62),
2973
-                    0x1D624 => array(0x63), 0x1D625 => array(0x64), 0x1D626 => array(0x65),
2974
-                    0x1D627 => array(0x66), 0x1D628 => array(0x67), 0x1D629 => array(0x68),
2975
-                    0x1D62A => array(0x69), 0x1D62B => array(0x6A), 0x1D62C => array(0x6B),
2976
-                    0x1D62D => array(0x6C), 0x1D62E => array(0x6D), 0x1D62F => array(0x6E),
2977
-                    0x1D630 => array(0x6F), 0x1D631 => array(0x70), 0x1D632 => array(0x71),
2978
-                    0x1D633 => array(0x72), 0x1D634 => array(0x73), 0x1D635 => array(0x74),
2979
-                    0x1D636 => array(0x75), 0x1D637 => array(0x76), 0x1D638 => array(0x77),
2980
-                    0x1D639 => array(0x78), 0x1D63A => array(0x79), 0x1D63B => array(0x7A),
2981
-                    0x1D63C => array(0x61), 0x1D63D => array(0x62), 0x1D63E => array(0x63),
2982
-                    0x1D63F => array(0x64), 0x1D640 => array(0x65), 0x1D641 => array(0x66),
2983
-                    0x1D642 => array(0x67), 0x1D643 => array(0x68), 0x1D644 => array(0x69),
2984
-                    0x1D645 => array(0x6A), 0x1D646 => array(0x6B), 0x1D647 => array(0x6C),
2985
-                    0x1D648 => array(0x6D), 0x1D649 => array(0x6E), 0x1D64A => array(0x6F),
2986
-                    0x1D64B => array(0x70), 0x1D64C => array(0x71), 0x1D64D => array(0x72),
2987
-                    0x1D64E => array(0x73), 0x1D64F => array(0x74), 0x1D650 => array(0x75),
2988
-                    0x1D651 => array(0x76), 0x1D652 => array(0x77), 0x1D653 => array(0x78),
2989
-                    0x1D654 => array(0x79), 0x1D655 => array(0x7A), 0x1D656 => array(0x61),
2990
-                    0x1D657 => array(0x62), 0x1D658 => array(0x63), 0x1D659 => array(0x64),
2991
-                    0x1D65A => array(0x65), 0x1D65B => array(0x66), 0x1D65C => array(0x67),
2992
-                    0x1D65D => array(0x68), 0x1D65E => array(0x69), 0x1D65F => array(0x6A),
2993
-                    0x1D660 => array(0x6B), 0x1D661 => array(0x6C), 0x1D662 => array(0x6D),
2994
-                    0x1D663 => array(0x6E), 0x1D664 => array(0x6F), 0x1D665 => array(0x70),
2995
-                    0x1D666 => array(0x71), 0x1D667 => array(0x72), 0x1D668 => array(0x73),
2996
-                    0x1D669 => array(0x74), 0x1D66A => array(0x75), 0x1D66B => array(0x76),
2997
-                    0x1D66C => array(0x77), 0x1D66D => array(0x78), 0x1D66E => array(0x79),
2998
-                    0x1D66F => array(0x7A), 0x1D670 => array(0x61), 0x1D671 => array(0x62),
2999
-                    0x1D672 => array(0x63), 0x1D673 => array(0x64), 0x1D674 => array(0x65),
3000
-                    0x1D675 => array(0x66), 0x1D676 => array(0x67), 0x1D677 => array(0x68),
3001
-                    0x1D678 => array(0x69), 0x1D679 => array(0x6A), 0x1D67A => array(0x6B),
3002
-                    0x1D67B => array(0x6C), 0x1D67C => array(0x6D), 0x1D67D => array(0x6E),
3003
-                    0x1D67E => array(0x6F), 0x1D67F => array(0x70), 0x1D680 => array(0x71),
3004
-                    0x1D681 => array(0x72), 0x1D682 => array(0x73), 0x1D683 => array(0x74),
3005
-                    0x1D684 => array(0x75), 0x1D685 => array(0x76), 0x1D686 => array(0x77),
3006
-                    0x1D687 => array(0x78), 0x1D688 => array(0x79), 0x1D689 => array(0x7A),
3007
-                    0x1D68A => array(0x61), 0x1D68B => array(0x62), 0x1D68C => array(0x63),
3008
-                    0x1D68D => array(0x64), 0x1D68E => array(0x65), 0x1D68F => array(0x66),
3009
-                    0x1D690 => array(0x67), 0x1D691 => array(0x68), 0x1D692 => array(0x69),
3010
-                    0x1D693 => array(0x6A), 0x1D694 => array(0x6B), 0x1D695 => array(0x6C),
3011
-                    0x1D696 => array(0x6D), 0x1D697 => array(0x6E), 0x1D698 => array(0x6F),
3012
-                    0x1D699 => array(0x70), 0x1D69A => array(0x71), 0x1D69B => array(0x72),
3013
-                    0x1D69C => array(0x73), 0x1D69D => array(0x74), 0x1D69E => array(0x75),
3014
-                    0x1D69F => array(0x76), 0x1D6A0 => array(0x77), 0x1D6A1 => array(0x78),
3015
-                    0x1D6A2 => array(0x79), 0x1D6A3 => array(0x7A), 0x1D6A4 => array(0x131),
3016
-                    0x1D6A5 => array(0x237), 0x1D6A8 => array(0x3B1), 0x1D6A9 => array(0x3B2),
3017
-                    0x1D6AA => array(0x3B3), 0x1D6AB => array(0x3B4), 0x1D6AC => array(0x3B5),
3018
-                    0x1D6AD => array(0x3B6), 0x1D6AE => array(0x3B7), 0x1D6AF => array(0x3B8),
3019
-                    0x1D6B0 => array(0x3B9), 0x1D6B1 => array(0x3BA), 0x1D6B2 => array(0x3BB),
3020
-                    0x1D6B3 => array(0x3BC), 0x1D6B4 => array(0x3BD), 0x1D6B5 => array(0x3BE),
3021
-                    0x1D6B6 => array(0x3BF), 0x1D6B7 => array(0x3C0), 0x1D6B8 => array(0x3C1),
3022
-                    0x1D6B9 => array(0x3B8), 0x1D6BA => array(0x3C3), 0x1D6BB => array(0x3C4),
3023
-                    0x1D6BC => array(0x3C5), 0x1D6BD => array(0x3C6), 0x1D6BE => array(0x3C7),
3024
-                    0x1D6BF => array(0x3C8), 0x1D6C0 => array(0x3C9), 0x1D6C1 => array(0x2207),
3025
-                    0x1D6C2 => array(0x3B1), 0x1D6C3 => array(0x3B2), 0x1D6C4 => array(0x3B3),
3026
-                    0x1D6C5 => array(0x3B4), 0x1D6C6 => array(0x3B5), 0x1D6C7 => array(0x3B6),
3027
-                    0x1D6C8 => array(0x3B7), 0x1D6C9 => array(0x3B8), 0x1D6CA => array(0x3B9),
3028
-                    0x1D6CB => array(0x3BA), 0x1D6CC => array(0x3BB), 0x1D6CD => array(0x3BC),
3029
-                    0x1D6CE => array(0x3BD), 0x1D6CF => array(0x3BE), 0x1D6D0 => array(0x3BF),
3030
-                    0x1D6D1 => array(0x3C0), 0x1D6D2 => array(0x3C1), 0x1D6D3 => array(0x3C3),
3031
-                    0x1D6D4 => array(0x3C3), 0x1D6D5 => array(0x3C4), 0x1D6D6 => array(0x3C5),
3032
-                    0x1D6D7 => array(0x3C6), 0x1D6D8 => array(0x3C7), 0x1D6D9 => array(0x3C8),
3033
-                    0x1D6DA => array(0x3C9), 0x1D6DB => array(0x2202), 0x1D6DC => array(0x3B5),
3034
-                    0x1D6DD => array(0x3B8), 0x1D6DE => array(0x3BA), 0x1D6DF => array(0x3C6),
3035
-                    0x1D6E0 => array(0x3C1), 0x1D6E1 => array(0x3C0), 0x1D6E2 => array(0x3B1),
3036
-                    0x1D6E3 => array(0x3B2), 0x1D6E4 => array(0x3B3), 0x1D6E5 => array(0x3B4),
3037
-                    0x1D6E6 => array(0x3B5), 0x1D6E7 => array(0x3B6), 0x1D6E8 => array(0x3B7),
3038
-                    0x1D6E9 => array(0x3B8), 0x1D6EA => array(0x3B9), 0x1D6EB => array(0x3BA),
3039
-                    0x1D6EC => array(0x3BB), 0x1D6ED => array(0x3BC), 0x1D6EE => array(0x3BD),
3040
-                    0x1D6EF => array(0x3BE), 0x1D6F0 => array(0x3BF), 0x1D6F1 => array(0x3C0),
3041
-                    0x1D6F2 => array(0x3C1), 0x1D6F3 => array(0x3B8), 0x1D6F4 => array(0x3C3),
3042
-                    0x1D6F5 => array(0x3C4), 0x1D6F6 => array(0x3C5), 0x1D6F7 => array(0x3C6),
3043
-                    0x1D6F8 => array(0x3C7), 0x1D6F9 => array(0x3C8), 0x1D6FA => array(0x3C9),
3044
-                    0x1D6FB => array(0x2207), 0x1D6FC => array(0x3B1), 0x1D6FD => array(0x3B2),
3045
-                    0x1D6FE => array(0x3B3), 0x1D6FF => array(0x3B4), 0x1D700 => array(0x3B5),
3046
-                    0x1D701 => array(0x3B6), 0x1D702 => array(0x3B7), 0x1D703 => array(0x3B8),
3047
-                    0x1D704 => array(0x3B9), 0x1D705 => array(0x3BA), 0x1D706 => array(0x3BB),
3048
-                    0x1D707 => array(0x3BC), 0x1D708 => array(0x3BD), 0x1D709 => array(0x3BE),
3049
-                    0x1D70A => array(0x3BF), 0x1D70B => array(0x3C0), 0x1D70C => array(0x3C1),
3050
-                    0x1D70D => array(0x3C3), 0x1D70E => array(0x3C3), 0x1D70F => array(0x3C4),
3051
-                    0x1D710 => array(0x3C5), 0x1D711 => array(0x3C6), 0x1D712 => array(0x3C7),
3052
-                    0x1D713 => array(0x3C8), 0x1D714 => array(0x3C9), 0x1D715 => array(0x2202),
3053
-                    0x1D716 => array(0x3B5), 0x1D717 => array(0x3B8), 0x1D718 => array(0x3BA),
3054
-                    0x1D719 => array(0x3C6), 0x1D71A => array(0x3C1), 0x1D71B => array(0x3C0),
3055
-                    0x1D71C => array(0x3B1), 0x1D71D => array(0x3B2), 0x1D71E => array(0x3B3),
3056
-                    0x1D71F => array(0x3B4), 0x1D720 => array(0x3B5), 0x1D721 => array(0x3B6),
3057
-                    0x1D722 => array(0x3B7), 0x1D723 => array(0x3B8), 0x1D724 => array(0x3B9),
3058
-                    0x1D725 => array(0x3BA), 0x1D726 => array(0x3BB), 0x1D727 => array(0x3BC),
3059
-                    0x1D728 => array(0x3BD), 0x1D729 => array(0x3BE), 0x1D72A => array(0x3BF),
3060
-                    0x1D72B => array(0x3C0), 0x1D72C => array(0x3C1), 0x1D72D => array(0x3B8),
3061
-                    0x1D72E => array(0x3C3), 0x1D72F => array(0x3C4), 0x1D730 => array(0x3C5),
3062
-                    0x1D731 => array(0x3C6), 0x1D732 => array(0x3C7), 0x1D733 => array(0x3C8),
3063
-                    0x1D734 => array(0x3C9), 0x1D735 => array(0x2207), 0x1D736 => array(0x3B1),
3064
-                    0x1D737 => array(0x3B2), 0x1D738 => array(0x3B3), 0x1D739 => array(0x3B4),
3065
-                    0x1D73A => array(0x3B5), 0x1D73B => array(0x3B6), 0x1D73C => array(0x3B7),
3066
-                    0x1D73D => array(0x3B8), 0x1D73E => array(0x3B9), 0x1D73F => array(0x3BA),
3067
-                    0x1D740 => array(0x3BB), 0x1D741 => array(0x3BC), 0x1D742 => array(0x3BD),
3068
-                    0x1D743 => array(0x3BE), 0x1D744 => array(0x3BF), 0x1D745 => array(0x3C0),
3069
-                    0x1D746 => array(0x3C1), 0x1D747 => array(0x3C3), 0x1D748 => array(0x3C3),
3070
-                    0x1D749 => array(0x3C4), 0x1D74A => array(0x3C5), 0x1D74B => array(0x3C6),
3071
-                    0x1D74C => array(0x3C7), 0x1D74D => array(0x3C8), 0x1D74E => array(0x3C9),
3072
-                    0x1D74F => array(0x2202), 0x1D750 => array(0x3B5), 0x1D751 => array(0x3B8),
3073
-                    0x1D752 => array(0x3BA), 0x1D753 => array(0x3C6), 0x1D754 => array(0x3C1),
3074
-                    0x1D755 => array(0x3C0), 0x1D756 => array(0x3B1), 0x1D757 => array(0x3B2),
3075
-                    0x1D758 => array(0x3B3), 0x1D759 => array(0x3B4), 0x1D75A => array(0x3B5),
3076
-                    0x1D75B => array(0x3B6), 0x1D75C => array(0x3B7), 0x1D75D => array(0x3B8),
3077
-                    0x1D75E => array(0x3B9), 0x1D75F => array(0x3BA), 0x1D760 => array(0x3BB),
3078
-                    0x1D761 => array(0x3BC), 0x1D762 => array(0x3BD), 0x1D763 => array(0x3BE),
3079
-                    0x1D764 => array(0x3BF), 0x1D765 => array(0x3C0), 0x1D766 => array(0x3C1),
3080
-                    0x1D767 => array(0x3B8), 0x1D768 => array(0x3C3), 0x1D769 => array(0x3C4),
3081
-                    0x1D76A => array(0x3C5), 0x1D76B => array(0x3C6), 0x1D76C => array(0x3C7),
3082
-                    0x1D76D => array(0x3C8), 0x1D76E => array(0x3C9), 0x1D76F => array(0x2207),
3083
-                    0x1D770 => array(0x3B1), 0x1D771 => array(0x3B2), 0x1D772 => array(0x3B3),
3084
-                    0x1D773 => array(0x3B4), 0x1D774 => array(0x3B5), 0x1D775 => array(0x3B6),
3085
-                    0x1D776 => array(0x3B7), 0x1D777 => array(0x3B8), 0x1D778 => array(0x3B9),
3086
-                    0x1D779 => array(0x3BA), 0x1D77A => array(0x3BB), 0x1D77B => array(0x3BC),
3087
-                    0x1D77C => array(0x3BD), 0x1D77D => array(0x3BE), 0x1D77E => array(0x3BF),
3088
-                    0x1D77F => array(0x3C0), 0x1D780 => array(0x3C1), 0x1D781 => array(0x3C3),
3089
-                    0x1D782 => array(0x3C3), 0x1D783 => array(0x3C4), 0x1D784 => array(0x3C5),
3090
-                    0x1D785 => array(0x3C6), 0x1D786 => array(0x3C7), 0x1D787 => array(0x3C8),
3091
-                    0x1D788 => array(0x3C9), 0x1D789 => array(0x2202), 0x1D78A => array(0x3B5),
3092
-                    0x1D78B => array(0x3B8), 0x1D78C => array(0x3BA), 0x1D78D => array(0x3C6),
3093
-                    0x1D78E => array(0x3C1), 0x1D78F => array(0x3C0), 0x1D790 => array(0x3B1),
3094
-                    0x1D791 => array(0x3B2), 0x1D792 => array(0x3B3), 0x1D793 => array(0x3B4),
3095
-                    0x1D794 => array(0x3B5), 0x1D795 => array(0x3B6), 0x1D796 => array(0x3B7),
3096
-                    0x1D797 => array(0x3B8), 0x1D798 => array(0x3B9), 0x1D799 => array(0x3BA),
3097
-                    0x1D79A => array(0x3BB), 0x1D79B => array(0x3BC), 0x1D79C => array(0x3BD),
3098
-                    0x1D79D => array(0x3BE), 0x1D79E => array(0x3BF), 0x1D79F => array(0x3C0),
3099
-                    0x1D7A0 => array(0x3C1), 0x1D7A1 => array(0x3B8), 0x1D7A2 => array(0x3C3),
3100
-                    0x1D7A3 => array(0x3C4), 0x1D7A4 => array(0x3C5), 0x1D7A5 => array(0x3C6),
3101
-                    0x1D7A6 => array(0x3C7), 0x1D7A7 => array(0x3C8), 0x1D7A8 => array(0x3C9),
3102
-                    0x1D7A9 => array(0x2207), 0x1D7AA => array(0x3B1), 0x1D7AB => array(0x3B2),
3103
-                    0x1D7AC => array(0x3B3), 0x1D7AD => array(0x3B4), 0x1D7AE => array(0x3B5),
3104
-                    0x1D7AF => array(0x3B6), 0x1D7B0 => array(0x3B7), 0x1D7B1 => array(0x3B8),
3105
-                    0x1D7B2 => array(0x3B9), 0x1D7B3 => array(0x3BA), 0x1D7B4 => array(0x3BB),
3106
-                    0x1D7B5 => array(0x3BC), 0x1D7B6 => array(0x3BD), 0x1D7B7 => array(0x3BE),
3107
-                    0x1D7B8 => array(0x3BF), 0x1D7B9 => array(0x3C0), 0x1D7BA => array(0x3C1),
3108
-                    0x1D7BB => array(0x3C3), 0x1D7BC => array(0x3C3), 0x1D7BD => array(0x3C4),
3109
-                    0x1D7BE => array(0x3C5), 0x1D7BF => array(0x3C6), 0x1D7C0 => array(0x3C7),
3110
-                    0x1D7C1 => array(0x3C8), 0x1D7C2 => array(0x3C9), 0x1D7C3 => array(0x2202),
3111
-                    0x1D7C4 => array(0x3B5), 0x1D7C5 => array(0x3B8), 0x1D7C6 => array(0x3BA),
3112
-                    0x1D7C7 => array(0x3C6), 0x1D7C8 => array(0x3C1), 0x1D7C9 => array(0x3C0),
3113
-                    0x1D7CA => array(0x3DD), 0x1D7CB => array(0x3DD), 0x1D7CE => array(0x30),
3114
-                    0x1D7CF => array(0x31), 0x1D7D0 => array(0x32), 0x1D7D1 => array(0x33),
3115
-                    0x1D7D2 => array(0x34), 0x1D7D3 => array(0x35), 0x1D7D4 => array(0x36),
3116
-                    0x1D7D5 => array(0x37), 0x1D7D6 => array(0x38), 0x1D7D7 => array(0x39),
3117
-                    0x1D7D8 => array(0x30), 0x1D7D9 => array(0x31), 0x1D7DA => array(0x32),
3118
-                    0x1D7DB => array(0x33), 0x1D7DC => array(0x34), 0x1D7DD => array(0x35),
3119
-                    0x1D7DE => array(0x36), 0x1D7DF => array(0x37), 0x1D7E0 => array(0x38),
3120
-                    0x1D7E1 => array(0x39), 0x1D7E2 => array(0x30), 0x1D7E3 => array(0x31),
3121
-                    0x1D7E4 => array(0x32), 0x1D7E5 => array(0x33), 0x1D7E6 => array(0x34),
3122
-                    0x1D7E7 => array(0x35), 0x1D7E8 => array(0x36), 0x1D7E9 => array(0x37),
3123
-                    0x1D7EA => array(0x38), 0x1D7EB => array(0x39), 0x1D7EC => array(0x30),
3124
-                    0x1D7ED => array(0x31), 0x1D7EE => array(0x32), 0x1D7EF => array(0x33),
3125
-                    0x1D7F0 => array(0x34), 0x1D7F1 => array(0x35), 0x1D7F2 => array(0x36),
3126
-                    0x1D7F3 => array(0x37), 0x1D7F4 => array(0x38), 0x1D7F5 => array(0x39),
3127
-                    0x1D7F6 => array(0x30), 0x1D7F7 => array(0x31), 0x1D7F8 => array(0x32),
3128
-                    0x1D7F9 => array(0x33), 0x1D7FA => array(0x34), 0x1D7FB => array(0x35),
3129
-                    0x1D7FC => array(0x36), 0x1D7FD => array(0x37), 0x1D7FE => array(0x38),
3130
-                    0x1D7FF => array(0x39), 0x1EE00 => array(0x627), 0x1EE01 => array(0x628),
3131
-                    0x1EE02 => array(0x62C), 0x1EE03 => array(0x62F), 0x1EE05 => array(0x648),
3132
-                    0x1EE06 => array(0x632), 0x1EE07 => array(0x62D), 0x1EE08 => array(0x637),
3133
-                    0x1EE09 => array(0x64A), 0x1EE0A => array(0x643), 0x1EE0B => array(0x644),
3134
-                    0x1EE0C => array(0x645), 0x1EE0D => array(0x646), 0x1EE0E => array(0x633),
3135
-                    0x1EE0F => array(0x639), 0x1EE10 => array(0x641), 0x1EE11 => array(0x635),
3136
-                    0x1EE12 => array(0x642), 0x1EE13 => array(0x631), 0x1EE14 => array(0x634),
3137
-                    0x1EE15 => array(0x62A), 0x1EE16 => array(0x62B), 0x1EE17 => array(0x62E),
3138
-                    0x1EE18 => array(0x630), 0x1EE19 => array(0x636), 0x1EE1A => array(0x638),
3139
-                    0x1EE1B => array(0x63A), 0x1EE1C => array(0x66E), 0x1EE1D => array(0x6BA),
3140
-                    0x1EE1E => array(0x6A1), 0x1EE1F => array(0x66F), 0x1EE21 => array(0x628),
3141
-                    0x1EE22 => array(0x62C), 0x1EE24 => array(0x647), 0x1EE27 => array(0x62D),
3142
-                    0x1EE29 => array(0x64A), 0x1EE2A => array(0x643), 0x1EE2B => array(0x644),
3143
-                    0x1EE2C => array(0x645), 0x1EE2D => array(0x646), 0x1EE2E => array(0x633),
3144
-                    0x1EE2F => array(0x639), 0x1EE30 => array(0x641), 0x1EE31 => array(0x635),
3145
-                    0x1EE32 => array(0x642), 0x1EE34 => array(0x634), 0x1EE35 => array(0x62A),
3146
-                    0x1EE36 => array(0x62B), 0x1EE37 => array(0x62E), 0x1EE39 => array(0x636),
3147
-                    0x1EE3B => array(0x63A), 0x1EE42 => array(0x62C), 0x1EE47 => array(0x62D),
3148
-                    0x1EE49 => array(0x64A), 0x1EE4B => array(0x644), 0x1EE4D => array(0x646),
3149
-                    0x1EE4E => array(0x633), 0x1EE4F => array(0x639), 0x1EE51 => array(0x635),
3150
-                    0x1EE52 => array(0x642), 0x1EE54 => array(0x634), 0x1EE57 => array(0x62E),
3151
-                    0x1EE59 => array(0x636), 0x1EE5B => array(0x63A), 0x1EE5D => array(0x6BA),
3152
-                    0x1EE5F => array(0x66F), 0x1EE61 => array(0x628), 0x1EE62 => array(0x62C),
3153
-                    0x1EE64 => array(0x647), 0x1EE67 => array(0x62D), 0x1EE68 => array(0x637),
3154
-                    0x1EE69 => array(0x64A), 0x1EE6A => array(0x643), 0x1EE6C => array(0x645),
3155
-                    0x1EE6D => array(0x646), 0x1EE6E => array(0x633), 0x1EE6F => array(0x639),
3156
-                    0x1EE70 => array(0x641), 0x1EE71 => array(0x635), 0x1EE72 => array(0x642),
3157
-                    0x1EE74 => array(0x634), 0x1EE75 => array(0x62A), 0x1EE76 => array(0x62B),
3158
-                    0x1EE77 => array(0x62E), 0x1EE79 => array(0x636), 0x1EE7A => array(0x638),
3159
-                    0x1EE7B => array(0x63A), 0x1EE7C => array(0x66E), 0x1EE7E => array(0x6A1),
3160
-                    0x1EE80 => array(0x627), 0x1EE81 => array(0x628), 0x1EE82 => array(0x62C),
3161
-                    0x1EE83 => array(0x62F), 0x1EE84 => array(0x647), 0x1EE85 => array(0x648),
3162
-                    0x1EE86 => array(0x632), 0x1EE87 => array(0x62D), 0x1EE88 => array(0x637),
3163
-                    0x1EE89 => array(0x64A), 0x1EE8B => array(0x644), 0x1EE8C => array(0x645),
3164
-                    0x1EE8D => array(0x646), 0x1EE8E => array(0x633), 0x1EE8F => array(0x639),
3165
-                    0x1EE90 => array(0x641), 0x1EE91 => array(0x635), 0x1EE92 => array(0x642),
3166
-                    0x1EE93 => array(0x631), 0x1EE94 => array(0x634), 0x1EE95 => array(0x62A),
3167
-                    0x1EE96 => array(0x62B), 0x1EE97 => array(0x62E), 0x1EE98 => array(0x630),
3168
-                    0x1EE99 => array(0x636), 0x1EE9A => array(0x638), 0x1EE9B => array(0x63A),
3169
-                    0x1EEA1 => array(0x628), 0x1EEA2 => array(0x62C), 0x1EEA3 => array(0x62F),
3170
-                    0x1EEA5 => array(0x648), 0x1EEA6 => array(0x632), 0x1EEA7 => array(0x62D),
3171
-                    0x1EEA8 => array(0x637), 0x1EEA9 => array(0x64A), 0x1EEAB => array(0x644),
3172
-                    0x1EEAC => array(0x645), 0x1EEAD => array(0x646), 0x1EEAE => array(0x633),
3173
-                    0x1EEAF => array(0x639), 0x1EEB0 => array(0x641), 0x1EEB1 => array(0x635),
3174
-                    0x1EEB2 => array(0x642), 0x1EEB3 => array(0x631), 0x1EEB4 => array(0x634),
3175
-                    0x1EEB5 => array(0x62A), 0x1EEB6 => array(0x62B), 0x1EEB7 => array(0x62E),
3176
-                    0x1EEB8 => array(0x630), 0x1EEB9 => array(0x636), 0x1EEBA => array(0x638),
3177
-                    0x1EEBB => array(0x63A), 0x1F12A => array(0x3014, 0x73, 0x3015), 0x1F12B => array(0x63),
3178
-                    0x1F12C => array(0x72), 0x1F12D => array(0x63, 0x64), 0x1F12E => array(0x77, 0x7A),
3179
-                    0x1F130 => array(0x61), 0x1F131 => array(0x62), 0x1F132 => array(0x63),
3180
-                    0x1F133 => array(0x64), 0x1F134 => array(0x65), 0x1F135 => array(0x66),
3181
-                    0x1F136 => array(0x67), 0x1F137 => array(0x68), 0x1F138 => array(0x69),
3182
-                    0x1F139 => array(0x6A), 0x1F13A => array(0x6B), 0x1F13B => array(0x6C),
3183
-                    0x1F13C => array(0x6D), 0x1F13D => array(0x6E), 0x1F13E => array(0x6F),
3184
-                    0x1F13F => array(0x70), 0x1F140 => array(0x71), 0x1F141 => array(0x72),
3185
-                    0x1F142 => array(0x73), 0x1F143 => array(0x74), 0x1F144 => array(0x75),
3186
-                    0x1F145 => array(0x76), 0x1F146 => array(0x77), 0x1F147 => array(0x78),
3187
-                    0x1F148 => array(0x79), 0x1F149 => array(0x7A), 0x1F14A => array(0x68, 0x76),
3188
-                    0x1F14B => array(0x6D, 0x76), 0x1F14C => array(0x73, 0x64), 0x1F14D => array(0x73, 0x73),
3189
-                    0x1F14E => array(0x70, 0x70, 0x76), 0x1F14F => array(0x77, 0x63), 0x1F16A => array(0x6D, 0x63),
3190
-                    0x1F16B => array(0x6D, 0x64), 0x1F190 => array(0x64, 0x6A), 0x1F200 => array(0x307B, 0x304B),
3191
-                    0x1F201 => array(0x30B3, 0x30B3), 0x1F202 => array(0x30B5), 0x1F210 => array(0x624B),
3192
-                    0x1F211 => array(0x5B57), 0x1F212 => array(0x53CC), 0x1F213 => array(0x30C7),
3193
-                    0x1F214 => array(0x4E8C), 0x1F215 => array(0x591A), 0x1F216 => array(0x89E3),
3194
-                    0x1F217 => array(0x5929), 0x1F218 => array(0x4EA4), 0x1F219 => array(0x6620),
3195
-                    0x1F21A => array(0x7121), 0x1F21B => array(0x6599), 0x1F21C => array(0x524D),
3196
-                    0x1F21D => array(0x5F8C), 0x1F21E => array(0x518D), 0x1F21F => array(0x65B0),
3197
-                    0x1F220 => array(0x521D), 0x1F221 => array(0x7D42), 0x1F222 => array(0x751F),
3198
-                    0x1F223 => array(0x8CA9), 0x1F224 => array(0x58F0), 0x1F225 => array(0x5439),
3199
-                    0x1F226 => array(0x6F14), 0x1F227 => array(0x6295), 0x1F228 => array(0x6355),
3200
-                    0x1F229 => array(0x4E00), 0x1F22A => array(0x4E09), 0x1F22B => array(0x904A),
3201
-                    0x1F22C => array(0x5DE6), 0x1F22D => array(0x4E2D), 0x1F22E => array(0x53F3),
3202
-                    0x1F22F => array(0x6307), 0x1F230 => array(0x8D70), 0x1F231 => array(0x6253),
3203
-                    0x1F232 => array(0x7981), 0x1F233 => array(0x7A7A), 0x1F234 => array(0x5408),
3204
-                    0x1F235 => array(0x6E80), 0x1F236 => array(0x6709), 0x1F237 => array(0x6708),
3205
-                    0x1F238 => array(0x7533), 0x1F239 => array(0x5272), 0x1F23A => array(0x55B6),
3206
-                    0x1F240 => array(0x3014, 0x672C, 0x3015), 0x1F241 => array(0x3014, 0x4E09, 0x3015), 0x1F242 => array(0x3014, 0x4E8C, 0x3015),
3207
-                    0x1F243 => array(0x3014, 0x5B89, 0x3015), 0x1F244 => array(0x3014, 0x70B9, 0x3015), 0x1F245 => array(0x3014, 0x6253, 0x3015),
3208
-                    0x1F246 => array(0x3014, 0x76D7, 0x3015), 0x1F247 => array(0x3014, 0x52DD, 0x3015), 0x1F248 => array(0x3014, 0x6557, 0x3015),
3209
-                    0x1F250 => array(0x5F97), 0x1F251 => array(0x53EF), 0x2F800 => array(0x4E3D),
3210
-                    0x2F801 => array(0x4E38), 0x2F802 => array(0x4E41), 0x2F803 => array(0x20122),
3211
-                    0x2F804 => array(0x4F60), 0x2F805 => array(0x4FAE), 0x2F806 => array(0x4FBB),
3212
-                    0x2F807 => array(0x5002), 0x2F808 => array(0x507A), 0x2F809 => array(0x5099),
3213
-                    0x2F80A => array(0x50E7), 0x2F80B => array(0x50CF), 0x2F80C => array(0x349E),
3214
-                    0x2F80D => array(0x2063A), 0x2F80E => array(0x514D), 0x2F80F => array(0x5154),
3215
-                    0x2F810 => array(0x5164), 0x2F811 => array(0x5177), 0x2F812 => array(0x2051C),
3216
-                    0x2F813 => array(0x34B9), 0x2F814 => array(0x5167), 0x2F815 => array(0x518D),
3217
-                    0x2F816 => array(0x2054B), 0x2F817 => array(0x5197), 0x2F818 => array(0x51A4),
3218
-                    0x2F819 => array(0x4ECC), 0x2F81A => array(0x51AC), 0x2F81B => array(0x51B5),
3219
-                    0x2F81C => array(0x291DF), 0x2F81D => array(0x51F5), 0x2F81E => array(0x5203),
3220
-                    0x2F81F => array(0x34DF), 0x2F820 => array(0x523B), 0x2F821 => array(0x5246),
3221
-                    0x2F822 => array(0x5272), 0x2F823 => array(0x5277), 0x2F824 => array(0x3515),
3222
-                    0x2F825 => array(0x52C7), 0x2F826 => array(0x52C9), 0x2F827 => array(0x52E4),
3223
-                    0x2F828 => array(0x52FA), 0x2F829 => array(0x5305), 0x2F82A => array(0x5306),
3224
-                    0x2F82B => array(0x5317), 0x2F82C => array(0x5349), 0x2F82D => array(0x5351),
3225
-                    0x2F82E => array(0x535A), 0x2F82F => array(0x5373), 0x2F830 => array(0x537D),
3226
-                    0x2F831 => array(0x537F), 0x2F832 => array(0x537F), 0x2F833 => array(0x537F),
3227
-                    0x2F834 => array(0x20A2C), 0x2F835 => array(0x7070), 0x2F836 => array(0x53CA),
3228
-                    0x2F837 => array(0x53DF), 0x2F838 => array(0x20B63), 0x2F839 => array(0x53EB),
3229
-                    0x2F83A => array(0x53F1), 0x2F83B => array(0x5406), 0x2F83C => array(0x549E),
3230
-                    0x2F83D => array(0x5438), 0x2F83E => array(0x5448), 0x2F83F => array(0x5468),
3231
-                    0x2F840 => array(0x54A2), 0x2F841 => array(0x54F6), 0x2F842 => array(0x5510),
3232
-                    0x2F843 => array(0x5553), 0x2F844 => array(0x5563), 0x2F845 => array(0x5584),
3233
-                    0x2F846 => array(0x5584), 0x2F847 => array(0x5599), 0x2F848 => array(0x55AB),
3234
-                    0x2F849 => array(0x55B3), 0x2F84A => array(0x55C2), 0x2F84B => array(0x5716),
3235
-                    0x2F84C => array(0x5606), 0x2F84D => array(0x5717), 0x2F84E => array(0x5651),
3236
-                    0x2F84F => array(0x5674), 0x2F850 => array(0x5207), 0x2F851 => array(0x58EE),
3237
-                    0x2F852 => array(0x57CE), 0x2F853 => array(0x57F4), 0x2F854 => array(0x580D),
3238
-                    0x2F855 => array(0x578B), 0x2F856 => array(0x5832), 0x2F857 => array(0x5831),
3239
-                    0x2F858 => array(0x58AC), 0x2F859 => array(0x214E4), 0x2F85A => array(0x58F2),
3240
-                    0x2F85B => array(0x58F7), 0x2F85C => array(0x5906), 0x2F85D => array(0x591A),
3241
-                    0x2F85E => array(0x5922), 0x2F85F => array(0x5962), 0x2F860 => array(0x216A8),
3242
-                    0x2F861 => array(0x216EA), 0x2F862 => array(0x59EC), 0x2F863 => array(0x5A1B),
3243
-                    0x2F864 => array(0x5A27), 0x2F865 => array(0x59D8), 0x2F866 => array(0x5A66),
3244
-                    0x2F867 => array(0x36EE), 0x2F869 => array(0x5B08), 0x2F86A => array(0x5B3E),
3245
-                    0x2F86B => array(0x5B3E), 0x2F86C => array(0x219C8), 0x2F86D => array(0x5BC3),
3246
-                    0x2F86E => array(0x5BD8), 0x2F86F => array(0x5BE7), 0x2F870 => array(0x5BF3),
3247
-                    0x2F871 => array(0x21B18), 0x2F872 => array(0x5BFF), 0x2F873 => array(0x5C06),
3248
-                    0x2F875 => array(0x5C22), 0x2F876 => array(0x3781), 0x2F877 => array(0x5C60),
3249
-                    0x2F878 => array(0x5C6E), 0x2F879 => array(0x5CC0), 0x2F87A => array(0x5C8D),
3250
-                    0x2F87B => array(0x21DE4), 0x2F87C => array(0x5D43), 0x2F87D => array(0x21DE6),
3251
-                    0x2F87E => array(0x5D6E), 0x2F87F => array(0x5D6B), 0x2F880 => array(0x5D7C),
3252
-                    0x2F881 => array(0x5DE1), 0x2F882 => array(0x5DE2), 0x2F883 => array(0x382F),
3253
-                    0x2F884 => array(0x5DFD), 0x2F885 => array(0x5E28), 0x2F886 => array(0x5E3D),
3254
-                    0x2F887 => array(0x5E69), 0x2F888 => array(0x3862), 0x2F889 => array(0x22183),
3255
-                    0x2F88A => array(0x387C), 0x2F88B => array(0x5EB0), 0x2F88C => array(0x5EB3),
3256
-                    0x2F88D => array(0x5EB6), 0x2F88E => array(0x5ECA), 0x2F88F => array(0x2A392),
3257
-                    0x2F890 => array(0x5EFE), 0x2F891 => array(0x22331), 0x2F892 => array(0x22331),
3258
-                    0x2F893 => array(0x8201), 0x2F894 => array(0x5F22), 0x2F895 => array(0x5F22),
3259
-                    0x2F896 => array(0x38C7), 0x2F897 => array(0x232B8), 0x2F898 => array(0x261DA),
3260
-                    0x2F899 => array(0x5F62), 0x2F89A => array(0x5F6B), 0x2F89B => array(0x38E3),
3261
-                    0x2F89C => array(0x5F9A), 0x2F89D => array(0x5FCD), 0x2F89E => array(0x5FD7),
3262
-                    0x2F89F => array(0x5FF9), 0x2F8A0 => array(0x6081), 0x2F8A1 => array(0x393A),
3263
-                    0x2F8A2 => array(0x391C), 0x2F8A3 => array(0x6094), 0x2F8A4 => array(0x226D4),
3264
-                    0x2F8A5 => array(0x60C7), 0x2F8A6 => array(0x6148), 0x2F8A7 => array(0x614C),
3265
-                    0x2F8A8 => array(0x614E), 0x2F8A9 => array(0x614C), 0x2F8AA => array(0x617A),
3266
-                    0x2F8AB => array(0x618E), 0x2F8AC => array(0x61B2), 0x2F8AD => array(0x61A4),
3267
-                    0x2F8AE => array(0x61AF), 0x2F8AF => array(0x61DE), 0x2F8B0 => array(0x61F2),
3268
-                    0x2F8B1 => array(0x61F6), 0x2F8B2 => array(0x6210), 0x2F8B3 => array(0x621B),
3269
-                    0x2F8B4 => array(0x625D), 0x2F8B5 => array(0x62B1), 0x2F8B6 => array(0x62D4),
3270
-                    0x2F8B7 => array(0x6350), 0x2F8B8 => array(0x22B0C), 0x2F8B9 => array(0x633D),
3271
-                    0x2F8BA => array(0x62FC), 0x2F8BB => array(0x6368), 0x2F8BC => array(0x6383),
3272
-                    0x2F8BD => array(0x63E4), 0x2F8BE => array(0x22BF1), 0x2F8BF => array(0x6422),
3273
-                    0x2F8C0 => array(0x63C5), 0x2F8C1 => array(0x63A9), 0x2F8C2 => array(0x3A2E),
3274
-                    0x2F8C3 => array(0x6469), 0x2F8C4 => array(0x647E), 0x2F8C5 => array(0x649D),
3275
-                    0x2F8C6 => array(0x6477), 0x2F8C7 => array(0x3A6C), 0x2F8C8 => array(0x654F),
3276
-                    0x2F8C9 => array(0x656C), 0x2F8CA => array(0x2300A), 0x2F8CB => array(0x65E3),
3277
-                    0x2F8CC => array(0x66F8), 0x2F8CD => array(0x6649), 0x2F8CE => array(0x3B19),
3278
-                    0x2F8CF => array(0x6691), 0x2F8D0 => array(0x3B08), 0x2F8D1 => array(0x3AE4),
3279
-                    0x2F8D2 => array(0x5192), 0x2F8D3 => array(0x5195), 0x2F8D4 => array(0x6700),
3280
-                    0x2F8D5 => array(0x669C), 0x2F8D6 => array(0x80AD), 0x2F8D7 => array(0x43D9),
3281
-                    0x2F8D8 => array(0x6717), 0x2F8D9 => array(0x671B), 0x2F8DA => array(0x6721),
3282
-                    0x2F8DB => array(0x675E), 0x2F8DC => array(0x6753), 0x2F8DD => array(0x233C3),
3283
-                    0x2F8DE => array(0x3B49), 0x2F8DF => array(0x67FA), 0x2F8E0 => array(0x6785),
3284
-                    0x2F8E1 => array(0x6852), 0x2F8E2 => array(0x6885), 0x2F8E3 => array(0x2346D),
3285
-                    0x2F8E4 => array(0x688E), 0x2F8E5 => array(0x681F), 0x2F8E6 => array(0x6914),
3286
-                    0x2F8E7 => array(0x3B9D), 0x2F8E8 => array(0x6942), 0x2F8E9 => array(0x69A3),
3287
-                    0x2F8EA => array(0x69EA), 0x2F8EB => array(0x6AA8), 0x2F8EC => array(0x236A3),
3288
-                    0x2F8ED => array(0x6ADB), 0x2F8EE => array(0x3C18), 0x2F8EF => array(0x6B21),
3289
-                    0x2F8F0 => array(0x238A7), 0x2F8F1 => array(0x6B54), 0x2F8F2 => array(0x3C4E),
3290
-                    0x2F8F3 => array(0x6B72), 0x2F8F4 => array(0x6B9F), 0x2F8F5 => array(0x6BBA),
3291
-                    0x2F8F6 => array(0x6BBB), 0x2F8F7 => array(0x23A8D), 0x2F8F8 => array(0x21D0B),
3292
-                    0x2F8F9 => array(0x23AFA), 0x2F8FA => array(0x6C4E), 0x2F8FB => array(0x23CBC),
3293
-                    0x2F8FC => array(0x6CBF), 0x2F8FD => array(0x6CCD), 0x2F8FE => array(0x6C67),
3294
-                    0x2F8FF => array(0x6D16), 0x2F900 => array(0x6D3E), 0x2F901 => array(0x6D77),
3295
-                    0x2F902 => array(0x6D41), 0x2F903 => array(0x6D69), 0x2F904 => array(0x6D78),
3296
-                    0x2F905 => array(0x6D85), 0x2F906 => array(0x23D1E), 0x2F907 => array(0x6D34),
3297
-                    0x2F908 => array(0x6E2F), 0x2F909 => array(0x6E6E), 0x2F90A => array(0x3D33),
3298
-                    0x2F90B => array(0x6ECB), 0x2F90C => array(0x6EC7), 0x2F90D => array(0x23ED1),
3299
-                    0x2F90E => array(0x6DF9), 0x2F90F => array(0x6F6E), 0x2F910 => array(0x23F5E),
3300
-                    0x2F911 => array(0x23F8E), 0x2F912 => array(0x6FC6), 0x2F913 => array(0x7039),
3301
-                    0x2F914 => array(0x701E), 0x2F915 => array(0x701B), 0x2F916 => array(0x3D96),
3302
-                    0x2F917 => array(0x704A), 0x2F918 => array(0x707D), 0x2F919 => array(0x7077),
3303
-                    0x2F91A => array(0x70AD), 0x2F91B => array(0x20525), 0x2F91C => array(0x7145),
3304
-                    0x2F91D => array(0x24263), 0x2F91E => array(0x719C), 0x2F920 => array(0x7228),
3305
-                    0x2F921 => array(0x7235), 0x2F922 => array(0x7250), 0x2F923 => array(0x24608),
3306
-                    0x2F924 => array(0x7280), 0x2F925 => array(0x7295), 0x2F926 => array(0x24735),
3307
-                    0x2F927 => array(0x24814), 0x2F928 => array(0x737A), 0x2F929 => array(0x738B),
3308
-                    0x2F92A => array(0x3EAC), 0x2F92B => array(0x73A5), 0x2F92C => array(0x3EB8),
3309
-                    0x2F92D => array(0x3EB8), 0x2F92E => array(0x7447), 0x2F92F => array(0x745C),
3310
-                    0x2F930 => array(0x7471), 0x2F931 => array(0x7485), 0x2F932 => array(0x74CA),
3311
-                    0x2F933 => array(0x3F1B), 0x2F934 => array(0x7524), 0x2F935 => array(0x24C36),
3312
-                    0x2F936 => array(0x753E), 0x2F937 => array(0x24C92), 0x2F938 => array(0x7570),
3313
-                    0x2F939 => array(0x2219F), 0x2F93A => array(0x7610), 0x2F93B => array(0x24FA1),
3314
-                    0x2F93C => array(0x24FB8), 0x2F93D => array(0x25044), 0x2F93E => array(0x3FFC),
3315
-                    0x2F93F => array(0x4008), 0x2F940 => array(0x76F4), 0x2F941 => array(0x250F3),
3316
-                    0x2F942 => array(0x250F2), 0x2F943 => array(0x25119), 0x2F944 => array(0x25133),
3317
-                    0x2F945 => array(0x771E), 0x2F946 => array(0x771F), 0x2F947 => array(0x771F),
3318
-                    0x2F948 => array(0x774A), 0x2F949 => array(0x4039), 0x2F94A => array(0x778B),
3319
-                    0x2F94B => array(0x4046), 0x2F94C => array(0x4096), 0x2F94D => array(0x2541D),
3320
-                    0x2F94E => array(0x784E), 0x2F94F => array(0x788C), 0x2F950 => array(0x78CC),
3321
-                    0x2F951 => array(0x40E3), 0x2F952 => array(0x25626), 0x2F953 => array(0x7956),
3322
-                    0x2F954 => array(0x2569A), 0x2F955 => array(0x256C5), 0x2F956 => array(0x798F),
3323
-                    0x2F957 => array(0x79EB), 0x2F958 => array(0x412F), 0x2F959 => array(0x7A40),
3324
-                    0x2F95A => array(0x7A4A), 0x2F95B => array(0x7A4F), 0x2F95C => array(0x2597C),
3325
-                    0x2F95D => array(0x25AA7), 0x2F95E => array(0x25AA7), 0x2F960 => array(0x4202),
3326
-                    0x2F961 => array(0x25BAB), 0x2F962 => array(0x7BC6), 0x2F963 => array(0x7BC9),
3327
-                    0x2F964 => array(0x4227), 0x2F965 => array(0x25C80), 0x2F966 => array(0x7CD2),
3328
-                    0x2F967 => array(0x42A0), 0x2F968 => array(0x7CE8), 0x2F969 => array(0x7CE3),
3329
-                    0x2F96A => array(0x7D00), 0x2F96B => array(0x25F86), 0x2F96C => array(0x7D63),
3330
-                    0x2F96D => array(0x4301), 0x2F96E => array(0x7DC7), 0x2F96F => array(0x7E02),
3331
-                    0x2F970 => array(0x7E45), 0x2F971 => array(0x4334), 0x2F972 => array(0x26228),
3332
-                    0x2F973 => array(0x26247), 0x2F974 => array(0x4359), 0x2F975 => array(0x262D9),
3333
-                    0x2F976 => array(0x7F7A), 0x2F977 => array(0x2633E), 0x2F978 => array(0x7F95),
3334
-                    0x2F979 => array(0x7FFA), 0x2F97A => array(0x8005), 0x2F97B => array(0x264DA),
3335
-                    0x2F97C => array(0x26523), 0x2F97D => array(0x8060), 0x2F97E => array(0x265A8),
3336
-                    0x2F97F => array(0x8070), 0x2F980 => array(0x2335F), 0x2F981 => array(0x43D5),
3337
-                    0x2F982 => array(0x80B2), 0x2F983 => array(0x8103), 0x2F984 => array(0x440B),
3338
-                    0x2F985 => array(0x813E), 0x2F986 => array(0x5AB5), 0x2F987 => array(0x267A7),
3339
-                    0x2F988 => array(0x267B5), 0x2F989 => array(0x23393), 0x2F98A => array(0x2339C),
3340
-                    0x2F98B => array(0x8201), 0x2F98C => array(0x8204), 0x2F98D => array(0x8F9E),
3341
-                    0x2F98E => array(0x446B), 0x2F98F => array(0x8291), 0x2F990 => array(0x828B),
3342
-                    0x2F991 => array(0x829D), 0x2F992 => array(0x52B3), 0x2F993 => array(0x82B1),
3343
-                    0x2F994 => array(0x82B3), 0x2F995 => array(0x82BD), 0x2F996 => array(0x82E6),
3344
-                    0x2F997 => array(0x26B3C), 0x2F998 => array(0x82E5), 0x2F999 => array(0x831D),
3345
-                    0x2F99A => array(0x8363), 0x2F99B => array(0x83AD), 0x2F99C => array(0x8323),
3346
-                    0x2F99D => array(0x83BD), 0x2F99E => array(0x83E7), 0x2F99F => array(0x8457),
3347
-                    0x2F9A0 => array(0x8353), 0x2F9A1 => array(0x83CA), 0x2F9A2 => array(0x83CC),
3348
-                    0x2F9A3 => array(0x83DC), 0x2F9A4 => array(0x26C36), 0x2F9A5 => array(0x26D6B),
3349
-                    0x2F9A6 => array(0x26CD5), 0x2F9A7 => array(0x452B), 0x2F9A8 => array(0x84F1),
3350
-                    0x2F9A9 => array(0x84F3), 0x2F9AA => array(0x8516), 0x2F9AB => array(0x273CA),
3351
-                    0x2F9AC => array(0x8564), 0x2F9AD => array(0x26F2C), 0x2F9AE => array(0x455D),
3352
-                    0x2F9AF => array(0x4561), 0x2F9B0 => array(0x26FB1), 0x2F9B1 => array(0x270D2),
3353
-                    0x2F9B2 => array(0x456B), 0x2F9B3 => array(0x8650), 0x2F9B4 => array(0x865C),
3354
-                    0x2F9B5 => array(0x8667), 0x2F9B6 => array(0x8669), 0x2F9B7 => array(0x86A9),
3355
-                    0x2F9B8 => array(0x8688), 0x2F9B9 => array(0x870E), 0x2F9BA => array(0x86E2),
3356
-                    0x2F9BB => array(0x8779), 0x2F9BC => array(0x8728), 0x2F9BD => array(0x876B),
3357
-                    0x2F9BE => array(0x8786), 0x2F9C0 => array(0x87E1), 0x2F9C1 => array(0x8801),
3358
-                    0x2F9C2 => array(0x45F9), 0x2F9C3 => array(0x8860), 0x2F9C4 => array(0x8863),
3359
-                    0x2F9C5 => array(0x27667), 0x2F9C6 => array(0x88D7), 0x2F9C7 => array(0x88DE),
3360
-                    0x2F9C8 => array(0x4635), 0x2F9C9 => array(0x88FA), 0x2F9CA => array(0x34BB),
3361
-                    0x2F9CB => array(0x278AE), 0x2F9CC => array(0x27966), 0x2F9CD => array(0x46BE),
3362
-                    0x2F9CE => array(0x46C7), 0x2F9CF => array(0x8AA0), 0x2F9D0 => array(0x8AED),
3363
-                    0x2F9D1 => array(0x8B8A), 0x2F9D2 => array(0x8C55), 0x2F9D3 => array(0x27CA8),
3364
-                    0x2F9D4 => array(0x8CAB), 0x2F9D5 => array(0x8CC1), 0x2F9D6 => array(0x8D1B),
3365
-                    0x2F9D7 => array(0x8D77), 0x2F9D8 => array(0x27F2F), 0x2F9D9 => array(0x20804),
3366
-                    0x2F9DA => array(0x8DCB), 0x2F9DB => array(0x8DBC), 0x2F9DC => array(0x8DF0),
3367
-                    0x2F9DD => array(0x208DE), 0x2F9DE => array(0x8ED4), 0x2F9DF => array(0x8F38),
3368
-                    0x2F9E0 => array(0x285D2), 0x2F9E1 => array(0x285ED), 0x2F9E2 => array(0x9094),
3369
-                    0x2F9E3 => array(0x90F1), 0x2F9E4 => array(0x9111), 0x2F9E5 => array(0x2872E),
3370
-                    0x2F9E6 => array(0x911B), 0x2F9E7 => array(0x9238), 0x2F9E8 => array(0x92D7),
3371
-                    0x2F9E9 => array(0x92D8), 0x2F9EA => array(0x927C), 0x2F9EB => array(0x93F9),
3372
-                    0x2F9EC => array(0x9415), 0x2F9ED => array(0x28BFA), 0x2F9EE => array(0x958B),
3373
-                    0x2F9EF => array(0x4995), 0x2F9F0 => array(0x95B7), 0x2F9F1 => array(0x28D77),
3374
-                    0x2F9F2 => array(0x49E6), 0x2F9F3 => array(0x96C3), 0x2F9F4 => array(0x5DB2),
3375
-                    0x2F9F5 => array(0x9723), 0x2F9F6 => array(0x29145), 0x2F9F7 => array(0x2921A),
3376
-                    0x2F9F8 => array(0x4A6E), 0x2F9F9 => array(0x4A76), 0x2F9FA => array(0x97E0),
3377
-                    0x2F9FB => array(0x2940A), 0x2F9FC => array(0x4AB2), 0x2F9FD => array(0x29496),
3378
-                    0x2F9FE => array(0x980B), 0x2F9FF => array(0x980B), 0x2FA00 => array(0x9829),
3379
-                    0x2FA01 => array(0x295B6), 0x2FA02 => array(0x98E2), 0x2FA03 => array(0x4B33),
3380
-                    0x2FA04 => array(0x9929), 0x2FA05 => array(0x99A7), 0x2FA06 => array(0x99C2),
3381
-                    0x2FA07 => array(0x99FE), 0x2FA08 => array(0x4BCE), 0x2FA09 => array(0x29B30),
3382
-                    0x2FA0A => array(0x9B12), 0x2FA0B => array(0x9C40), 0x2FA0C => array(0x9CFD),
3383
-                    0x2FA0D => array(0x4CCE), 0x2FA0E => array(0x4CED), 0x2FA0F => array(0x9D67),
3384
-                    0x2FA10 => array(0x2A0CE), 0x2FA11 => array(0x4CF8), 0x2FA12 => array(0x2A105),
3385
-                    0x2FA13 => array(0x2A20E), 0x2FA14 => array(0x2A291), 0x2FA15 => array(0x9EBB),
3386
-                    0x2FA16 => array(0x4D56), 0x2FA17 => array(0x9EF9), 0x2FA18 => array(0x9EFE),
3387
-                    0x2FA19 => array(0x9F05), 0x2FA1A => array(0x9F0F), 0x2FA1B => array(0x9F16),
3388
-                    0x2FA1C => array(0x9F3B), 0x2FA1D => array(0x2A600)
3389
-            ),
3390
-            'norm_combcls' => array(0x334 => 1, 0x335 => 1, 0x336 => 1, 0x337 => 1,
3391
-                    0x338 => 1, 0x93C => 7, 0x9BC => 7, 0xA3C => 7, 0xABC => 7,
3392
-                    0xB3C => 7, 0xCBC => 7, 0x1037 => 7, 0x3099 => 8, 0x309A => 8,
3393
-                    0x94D => 9, 0x9CD => 9, 0xA4D => 9, 0xACD => 9, 0xB4D => 9,
3394
-                    0xBCD => 9, 0xC4D => 9, 0xCCD => 9, 0xD4D => 9, 0xDCA => 9,
3395
-                    0xE3A => 9, 0xF84 => 9, 0x1039 => 9, 0x1714 => 9, 0x1734 => 9,
3396
-                    0x17D2 => 9, 0x5B0 => 10, 0x5B1 => 11, 0x5B2 => 12, 0x5B3 => 13,
3397
-                    0x5B4 => 14, 0x5B5 => 15, 0x5B6 => 16, 0x5B7 => 17, 0x5B8 => 18,
3398
-                    0x5B9 => 19, 0x5BB => 20, 0x5Bc => 21, 0x5BD => 22, 0x5BF => 23,
3399
-                    0x5C1 => 24, 0x5C2 => 25, 0xFB1E => 26, 0x64B => 27, 0x64C => 28,
3400
-                    0x64D => 29, 0x64E => 30, 0x64F => 31, 0x650 => 32, 0x651 => 33,
3401
-                    0x652 => 34, 0x670 => 35, 0x711 => 36, 0xC55 => 84, 0xC56 => 91,
3402
-                    0xE38 => 103, 0xE39 => 103, 0xE48 => 107, 0xE49 => 107, 0xE4A => 107,
3403
-                    0xE4B => 107, 0xEB8 => 118, 0xEB9 => 118, 0xEC8 => 122, 0xEC9 => 122,
3404
-                    0xECA => 122, 0xECB => 122, 0xF71 => 129, 0xF72 => 130, 0xF7A => 130,
3405
-                    0xF7B => 130, 0xF7C => 130, 0xF7D => 130, 0xF80 => 130, 0xF74 => 132,
3406
-                    0x321 => 202, 0x322 => 202, 0x327 => 202, 0x328 => 202, 0x31B => 216,
3407
-                    0xF39 => 216, 0x1D165 => 216, 0x1D166 => 216, 0x1D16E => 216, 0x1D16F => 216,
3408
-                    0x1D170 => 216, 0x1D171 => 216, 0x1D172 => 216, 0x302A => 218, 0x316 => 220,
3409
-                    0x317 => 220, 0x318 => 220, 0x319 => 220, 0x31C => 220, 0x31D => 220,
3410
-                    0x31E => 220, 0x31F => 220, 0x320 => 220, 0x323 => 220, 0x324 => 220,
3411
-                    0x325 => 220, 0x326 => 220, 0x329 => 220, 0x32A => 220, 0x32B => 220,
3412
-                    0x32C => 220, 0x32D => 220, 0x32E => 220, 0x32F => 220, 0x330 => 220,
3413
-                    0x331 => 220, 0x332 => 220, 0x333 => 220, 0x339 => 220, 0x33A => 220,
3414
-                    0x33B => 220, 0x33C => 220, 0x347 => 220, 0x348 => 220, 0x349 => 220,
3415
-                    0x34D => 220, 0x34E => 220, 0x353 => 220, 0x354 => 220, 0x355 => 220,
3416
-                    0x356 => 220, 0x591 => 220, 0x596 => 220, 0x59B => 220, 0x5A3 => 220,
3417
-                    0x5A4 => 220, 0x5A5 => 220, 0x5A6 => 220, 0x5A7 => 220, 0x5AA => 220,
3418
-                    0x655 => 220, 0x656 => 220, 0x6E3 => 220, 0x6EA => 220, 0x6ED => 220,
3419
-                    0x731 => 220, 0x734 => 220, 0x737 => 220, 0x738 => 220, 0x739 => 220,
3420
-                    0x73B => 220, 0x73C => 220, 0x73E => 220, 0x742 => 220, 0x744 => 220,
3421
-                    0x746 => 220, 0x748 => 220, 0x952 => 220, 0xF18 => 220, 0xF19 => 220,
3422
-                    0xF35 => 220, 0xF37 => 220, 0xFC6 => 220, 0x193B => 220, 0x20E8 => 220,
3423
-                    0x1D17B => 220, 0x1D17C => 220, 0x1D17D => 220, 0x1D17E => 220, 0x1D17F => 220,
3424
-                    0x1D180 => 220, 0x1D181 => 220, 0x1D182 => 220, 0x1D18A => 220, 0x1D18B => 220,
3425
-                    0x59A => 222, 0x5AD => 222, 0x1929 => 222, 0x302D => 222, 0x302E => 224,
3426
-                    0x302F => 224, 0x1D16D => 226, 0x5AE => 228, 0x18A9 => 228, 0x302B => 228,
3427
-                    0x300 => 230, 0x301 => 230, 0x302 => 230, 0x303 => 230, 0x304 => 230,
3428
-                    0x305 => 230, 0x306 => 230, 0x307 => 230, 0x308 => 230, 0x309 => 230,
3429
-                    0x30A => 230, 0x30B => 230, 0x30C => 230, 0x30D => 230, 0x30E => 230,
3430
-                    0x30F => 230, 0x310 => 230, 0x311 => 230, 0x312 => 230, 0x313 => 230,
3431
-                    0x314 => 230, 0x33D => 230, 0x33E => 230, 0x33F => 230, 0x340 => 230,
3432
-                    0x341 => 230, 0x342 => 230, 0x343 => 230, 0x344 => 230, 0x346 => 230,
3433
-                    0x34A => 230, 0x34B => 230, 0x34C => 230, 0x350 => 230, 0x351 => 230,
3434
-                    0x352 => 230, 0x357 => 230, 0x363 => 230, 0x364 => 230, 0x365 => 230,
3435
-                    0x366 => 230, 0x367 => 230, 0x368 => 230, 0x369 => 230, 0x36A => 230,
3436
-                    0x36B => 230, 0x36C => 230, 0x36D => 230, 0x36E => 230, 0x36F => 230,
3437
-                    0x483 => 230, 0x484 => 230, 0x485 => 230, 0x486 => 230, 0x592 => 230,
3438
-                    0x593 => 230, 0x594 => 230, 0x595 => 230, 0x597 => 230, 0x598 => 230,
3439
-                    0x599 => 230, 0x59C => 230, 0x59D => 230, 0x59E => 230, 0x59F => 230,
3440
-                    0x5A0 => 230, 0x5A1 => 230, 0x5A8 => 230, 0x5A9 => 230, 0x5AB => 230,
3441
-                    0x5AC => 230, 0x5AF => 230, 0x5C4 => 230, 0x610 => 230, 0x611 => 230,
3442
-                    0x612 => 230, 0x613 => 230, 0x614 => 230, 0x615 => 230, 0x653 => 230,
3443
-                    0x654 => 230, 0x657 => 230, 0x658 => 230, 0x6D6 => 230, 0x6D7 => 230,
3444
-                    0x6D8 => 230, 0x6D9 => 230, 0x6DA => 230, 0x6DB => 230, 0x6DC => 230,
3445
-                    0x6DF => 230, 0x6E0 => 230, 0x6E1 => 230, 0x6E2 => 230, 0x6E4 => 230,
3446
-                    0x6E7 => 230, 0x6E8 => 230, 0x6EB => 230, 0x6EC => 230, 0x730 => 230,
3447
-                    0x732 => 230, 0x733 => 230, 0x735 => 230, 0x736 => 230, 0x73A => 230,
3448
-                    0x73D => 230, 0x73F => 230, 0x740 => 230, 0x741 => 230, 0x743 => 230,
3449
-                    0x745 => 230, 0x747 => 230, 0x749 => 230, 0x74A => 230, 0x951 => 230,
3450
-                    0x953 => 230, 0x954 => 230, 0xF82 => 230, 0xF83 => 230, 0xF86 => 230,
3451
-                    0xF87 => 230, 0x170D => 230, 0x193A => 230, 0x20D0 => 230, 0x20D1 => 230,
3452
-                    0x20D4 => 230, 0x20D5 => 230, 0x20D6 => 230, 0x20D7 => 230, 0x20DB => 230,
3453
-                    0x20DC => 230, 0x20E1 => 230, 0x20E7 => 230, 0x20E9 => 230, 0xFE20 => 230,
3454
-                    0xFE21 => 230, 0xFE22 => 230, 0xFE23 => 230, 0x1D185 => 230, 0x1D186 => 230,
3455
-                    0x1D187 => 230, 0x1D189 => 230, 0x1D188 => 230, 0x1D1AA => 230, 0x1D1AB => 230,
3456
-                    0x1D1AC => 230, 0x1D1AD => 230, 0x315 => 232, 0x31A => 232, 0x302C => 232,
3457
-                    0x35F => 233, 0x362 => 233, 0x35D => 234, 0x35E => 234, 0x360 => 234,
3458
-                    0x361 => 234, 0x345 => 240
3459
-            )
3460
-    );
1376
+					0x33C3 => array(0x62, 0x71), 0x33C6 => array(0x63, 0x2215, 0x6B, 0x67),
1377
+					0x33C7 => array(0x63, 0x6F, 0x2E), 0x33C8 => array(0x64, 0x62),
1378
+					0x33C9 => array(0x67, 0x79), 0x33CB => array(0x68, 0x70),
1379
+					0x33CD => array(0x6B, 0x6B), 0x33CE => array(0x6B, 0x6D),
1380
+					0x33D7 => array(0x70, 0x68), 0x33D9 => array(0x70, 0x70, 0x6D),
1381
+					0x33DA => array(0x70, 0x72), 0x33DC => array(0x73, 0x76),
1382
+					0x33DD => array(0x77, 0x62), 0xFB00 => array(0x66, 0x66),
1383
+					0xFB01 => array(0x66, 0x69), 0xFB02 => array(0x66, 0x6C),
1384
+					0xFB03 => array(0x66, 0x66, 0x69), 0xFB04 => array(0x66, 0x66, 0x6C),
1385
+					0xFB05 => array(0x73, 0x74), 0xFB06 => array(0x73, 0x74),
1386
+					0xFB13 => array(0x574, 0x576), 0xFB14 => array(0x574, 0x565),
1387
+					0xFB15 => array(0x574, 0x56B), 0xFB16 => array(0x57E, 0x576),
1388
+					0xFB17 => array(0x574, 0x56D), 0xFF21 => array(0xFF41),
1389
+					0xFF22 => array(0xFF42), 0xFF23 => array(0xFF43), 0xFF24 => array(0xFF44),
1390
+					0xFF25 => array(0xFF45), 0xFF26 => array(0xFF46), 0xFF27 => array(0xFF47),
1391
+					0xFF28 => array(0xFF48), 0xFF29 => array(0xFF49), 0xFF2A => array(0xFF4A),
1392
+					0xFF2B => array(0xFF4B), 0xFF2C => array(0xFF4C), 0xFF2D => array(0xFF4D),
1393
+					0xFF2E => array(0xFF4E), 0xFF2F => array(0xFF4F), 0xFF30 => array(0xFF50),
1394
+					0xFF31 => array(0xFF51), 0xFF32 => array(0xFF52), 0xFF33 => array(0xFF53),
1395
+					0xFF34 => array(0xFF54), 0xFF35 => array(0xFF55), 0xFF36 => array(0xFF56),
1396
+					0xFF37 => array(0xFF57), 0xFF38 => array(0xFF58), 0xFF39 => array(0xFF59),
1397
+					0xFF3A => array(0xFF5A), 0x10400 => array(0x10428), 0x10401 => array(0x10429),
1398
+					0x10402 => array(0x1042A), 0x10403 => array(0x1042B), 0x10404 => array(0x1042C),
1399
+					0x10405 => array(0x1042D), 0x10406 => array(0x1042E), 0x10407 => array(0x1042F),
1400
+					0x10408 => array(0x10430), 0x10409 => array(0x10431), 0x1040A => array(0x10432),
1401
+					0x1040B => array(0x10433), 0x1040C => array(0x10434), 0x1040D => array(0x10435),
1402
+					0x1040E => array(0x10436), 0x1040F => array(0x10437), 0x10410 => array(0x10438),
1403
+					0x10411 => array(0x10439), 0x10412 => array(0x1043A), 0x10413 => array(0x1043B),
1404
+					0x10414 => array(0x1043C), 0x10415 => array(0x1043D), 0x10416 => array(0x1043E),
1405
+					0x10417 => array(0x1043F), 0x10418 => array(0x10440), 0x10419 => array(0x10441),
1406
+					0x1041A => array(0x10442), 0x1041B => array(0x10443), 0x1041C => array(0x10444),
1407
+					0x1041D => array(0x10445), 0x1041E => array(0x10446), 0x1041F => array(0x10447),
1408
+					0x10420 => array(0x10448), 0x10421 => array(0x10449), 0x10422 => array(0x1044A),
1409
+					0x10423 => array(0x1044B), 0x10424 => array(0x1044C), 0x10425 => array(0x1044D),
1410
+					0x1D400 => array(0x61), 0x1D401 => array(0x62), 0x1D402 => array(0x63),
1411
+					0x1D403 => array(0x64), 0x1D404 => array(0x65), 0x1D405 => array(0x66),
1412
+					0x1D406 => array(0x67), 0x1D407 => array(0x68), 0x1D408 => array(0x69),
1413
+					0x1D409 => array(0x6A), 0x1D40A => array(0x6B), 0x1D40B => array(0x6C),
1414
+					0x1D40C => array(0x6D), 0x1D40D => array(0x6E), 0x1D40E => array(0x6F),
1415
+					0x1D40F => array(0x70), 0x1D410 => array(0x71), 0x1D411 => array(0x72),
1416
+					0x1D412 => array(0x73), 0x1D413 => array(0x74), 0x1D414 => array(0x75),
1417
+					0x1D415 => array(0x76), 0x1D416 => array(0x77), 0x1D417 => array(0x78),
1418
+					0x1D418 => array(0x79), 0x1D419 => array(0x7A), 0x1D434 => array(0x61),
1419
+					0x1D435 => array(0x62), 0x1D436 => array(0x63), 0x1D437 => array(0x64),
1420
+					0x1D438 => array(0x65), 0x1D439 => array(0x66), 0x1D43A => array(0x67),
1421
+					0x1D43B => array(0x68), 0x1D43C => array(0x69), 0x1D43D => array(0x6A),
1422
+					0x1D43E => array(0x6B), 0x1D43F => array(0x6C), 0x1D440 => array(0x6D),
1423
+					0x1D441 => array(0x6E), 0x1D442 => array(0x6F), 0x1D443 => array(0x70),
1424
+					0x1D444 => array(0x71), 0x1D445 => array(0x72), 0x1D446 => array(0x73),
1425
+					0x1D447 => array(0x74), 0x1D448 => array(0x75), 0x1D449 => array(0x76),
1426
+					0x1D44A => array(0x77), 0x1D44B => array(0x78), 0x1D44C => array(0x79),
1427
+					0x1D44D => array(0x7A), 0x1D468 => array(0x61), 0x1D469 => array(0x62),
1428
+					0x1D46A => array(0x63), 0x1D46B => array(0x64), 0x1D46C => array(0x65),
1429
+					0x1D46D => array(0x66), 0x1D46E => array(0x67), 0x1D46F => array(0x68),
1430
+					0x1D470 => array(0x69), 0x1D471 => array(0x6A), 0x1D472 => array(0x6B),
1431
+					0x1D473 => array(0x6C), 0x1D474 => array(0x6D), 0x1D475 => array(0x6E),
1432
+					0x1D476 => array(0x6F), 0x1D477 => array(0x70), 0x1D478 => array(0x71),
1433
+					0x1D479 => array(0x72), 0x1D47A => array(0x73), 0x1D47B => array(0x74),
1434
+					0x1D47C => array(0x75), 0x1D47D => array(0x76), 0x1D47E => array(0x77),
1435
+					0x1D47F => array(0x78), 0x1D480 => array(0x79), 0x1D481 => array(0x7A),
1436
+					0x1D49C => array(0x61), 0x1D49E => array(0x63), 0x1D49F => array(0x64),
1437
+					0x1D4A2 => array(0x67), 0x1D4A5 => array(0x6A), 0x1D4A6 => array(0x6B),
1438
+					0x1D4A9 => array(0x6E), 0x1D4AA => array(0x6F), 0x1D4AB => array(0x70),
1439
+					0x1D4AC => array(0x71), 0x1D4AE => array(0x73), 0x1D4AF => array(0x74),
1440
+					0x1D4B0 => array(0x75), 0x1D4B1 => array(0x76), 0x1D4B2 => array(0x77),
1441
+					0x1D4B3 => array(0x78), 0x1D4B4 => array(0x79), 0x1D4B5 => array(0x7A),
1442
+					0x1D4D0 => array(0x61), 0x1D4D1 => array(0x62), 0x1D4D2 => array(0x63),
1443
+					0x1D4D3 => array(0x64), 0x1D4D4 => array(0x65), 0x1D4D5 => array(0x66),
1444
+					0x1D4D6 => array(0x67), 0x1D4D7 => array(0x68), 0x1D4D8 => array(0x69),
1445
+					0x1D4D9 => array(0x6A), 0x1D4DA => array(0x6B), 0x1D4DB => array(0x6C),
1446
+					0x1D4DC => array(0x6D), 0x1D4DD => array(0x6E), 0x1D4DE => array(0x6F),
1447
+					0x1D4DF => array(0x70), 0x1D4E0 => array(0x71), 0x1D4E1 => array(0x72),
1448
+					0x1D4E2 => array(0x73), 0x1D4E3 => array(0x74), 0x1D4E4 => array(0x75),
1449
+					0x1D4E5 => array(0x76), 0x1D4E6 => array(0x77), 0x1D4E7 => array(0x78),
1450
+					0x1D4E8 => array(0x79), 0x1D4E9 => array(0x7A), 0x1D504 => array(0x61),
1451
+					0x1D505 => array(0x62), 0x1D507 => array(0x64), 0x1D508 => array(0x65),
1452
+					0x1D509 => array(0x66), 0x1D50A => array(0x67), 0x1D50D => array(0x6A),
1453
+					0x1D50E => array(0x6B), 0x1D50F => array(0x6C), 0x1D510 => array(0x6D),
1454
+					0x1D511 => array(0x6E), 0x1D512 => array(0x6F), 0x1D513 => array(0x70),
1455
+					0x1D514 => array(0x71), 0x1D516 => array(0x73), 0x1D517 => array(0x74),
1456
+					0x1D518 => array(0x75), 0x1D519 => array(0x76), 0x1D51A => array(0x77),
1457
+					0x1D51B => array(0x78), 0x1D51C => array(0x79), 0x1D538 => array(0x61),
1458
+					0x1D539 => array(0x62), 0x1D53B => array(0x64), 0x1D53C => array(0x65),
1459
+					0x1D53D => array(0x66), 0x1D53E => array(0x67), 0x1D540 => array(0x69),
1460
+					0x1D541 => array(0x6A), 0x1D542 => array(0x6B), 0x1D543 => array(0x6C),
1461
+					0x1D544 => array(0x6D), 0x1D546 => array(0x6F), 0x1D54A => array(0x73),
1462
+					0x1D54B => array(0x74), 0x1D54C => array(0x75), 0x1D54D => array(0x76),
1463
+					0x1D54E => array(0x77), 0x1D54F => array(0x78), 0x1D550 => array(0x79),
1464
+					0x1D56C => array(0x61), 0x1D56D => array(0x62), 0x1D56E => array(0x63),
1465
+					0x1D56F => array(0x64), 0x1D570 => array(0x65), 0x1D571 => array(0x66),
1466
+					0x1D572 => array(0x67), 0x1D573 => array(0x68), 0x1D574 => array(0x69),
1467
+					0x1D575 => array(0x6A), 0x1D576 => array(0x6B), 0x1D577 => array(0x6C),
1468
+					0x1D578 => array(0x6D), 0x1D579 => array(0x6E), 0x1D57A => array(0x6F),
1469
+					0x1D57B => array(0x70), 0x1D57C => array(0x71), 0x1D57D => array(0x72),
1470
+					0x1D57E => array(0x73), 0x1D57F => array(0x74), 0x1D580 => array(0x75),
1471
+					0x1D581 => array(0x76), 0x1D582 => array(0x77), 0x1D583 => array(0x78),
1472
+					0x1D584 => array(0x79), 0x1D585 => array(0x7A), 0x1D5A0 => array(0x61),
1473
+					0x1D5A1 => array(0x62), 0x1D5A2 => array(0x63), 0x1D5A3 => array(0x64),
1474
+					0x1D5A4 => array(0x65), 0x1D5A5 => array(0x66), 0x1D5A6 => array(0x67),
1475
+					0x1D5A7 => array(0x68), 0x1D5A8 => array(0x69), 0x1D5A9 => array(0x6A),
1476
+					0x1D5AA => array(0x6B), 0x1D5AB => array(0x6C), 0x1D5AC => array(0x6D),
1477
+					0x1D5AD => array(0x6E), 0x1D5AE => array(0x6F), 0x1D5AF => array(0x70),
1478
+					0x1D5B0 => array(0x71), 0x1D5B1 => array(0x72), 0x1D5B2 => array(0x73),
1479
+					0x1D5B3 => array(0x74), 0x1D5B4 => array(0x75), 0x1D5B5 => array(0x76),
1480
+					0x1D5B6 => array(0x77), 0x1D5B7 => array(0x78), 0x1D5B8 => array(0x79),
1481
+					0x1D5B9 => array(0x7A), 0x1D5D4 => array(0x61), 0x1D5D5 => array(0x62),
1482
+					0x1D5D6 => array(0x63), 0x1D5D7 => array(0x64), 0x1D5D8 => array(0x65),
1483
+					0x1D5D9 => array(0x66), 0x1D5DA => array(0x67), 0x1D5DB => array(0x68),
1484
+					0x1D5DC => array(0x69), 0x1D5DD => array(0x6A), 0x1D5DE => array(0x6B),
1485
+					0x1D5DF => array(0x6C), 0x1D5E0 => array(0x6D), 0x1D5E1 => array(0x6E),
1486
+					0x1D5E2 => array(0x6F), 0x1D5E3 => array(0x70), 0x1D5E4 => array(0x71),
1487
+					0x1D5E5 => array(0x72), 0x1D5E6 => array(0x73), 0x1D5E7 => array(0x74),
1488
+					0x1D5E8 => array(0x75), 0x1D5E9 => array(0x76), 0x1D5EA => array(0x77),
1489
+					0x1D5EB => array(0x78), 0x1D5EC => array(0x79), 0x1D5ED => array(0x7A),
1490
+					0x1D608 => array(0x61), 0x1D609 => array(0x62), 0x1D60A => array(0x63),
1491
+					0x1D60B => array(0x64), 0x1D60C => array(0x65), 0x1D60D => array(0x66),
1492
+					0x1D60E => array(0x67), 0x1D60F => array(0x68), 0x1D610 => array(0x69),
1493
+					0x1D611 => array(0x6A), 0x1D612 => array(0x6B), 0x1D613 => array(0x6C),
1494
+					0x1D614 => array(0x6D), 0x1D615 => array(0x6E), 0x1D616 => array(0x6F),
1495
+					0x1D617 => array(0x70), 0x1D618 => array(0x71), 0x1D619 => array(0x72),
1496
+					0x1D61A => array(0x73), 0x1D61B => array(0x74), 0x1D61C => array(0x75),
1497
+					0x1D61D => array(0x76), 0x1D61E => array(0x77), 0x1D61F => array(0x78),
1498
+					0x1D620 => array(0x79), 0x1D621 => array(0x7A), 0x1D63C => array(0x61),
1499
+					0x1D63D => array(0x62), 0x1D63E => array(0x63), 0x1D63F => array(0x64),
1500
+					0x1D640 => array(0x65), 0x1D641 => array(0x66), 0x1D642 => array(0x67),
1501
+					0x1D643 => array(0x68), 0x1D644 => array(0x69), 0x1D645 => array(0x6A),
1502
+					0x1D646 => array(0x6B), 0x1D647 => array(0x6C), 0x1D648 => array(0x6D),
1503
+					0x1D649 => array(0x6E), 0x1D64A => array(0x6F), 0x1D64B => array(0x70),
1504
+					0x1D64C => array(0x71), 0x1D64D => array(0x72), 0x1D64E => array(0x73),
1505
+					0x1D64F => array(0x74), 0x1D650 => array(0x75), 0x1D651 => array(0x76),
1506
+					0x1D652 => array(0x77), 0x1D653 => array(0x78), 0x1D654 => array(0x79),
1507
+					0x1D655 => array(0x7A), 0x1D670 => array(0x61), 0x1D671 => array(0x62),
1508
+					0x1D672 => array(0x63), 0x1D673 => array(0x64), 0x1D674 => array(0x65),
1509
+					0x1D675 => array(0x66), 0x1D676 => array(0x67), 0x1D677 => array(0x68),
1510
+					0x1D678 => array(0x69), 0x1D679 => array(0x6A), 0x1D67A => array(0x6B),
1511
+					0x1D67B => array(0x6C), 0x1D67C => array(0x6D), 0x1D67D => array(0x6E),
1512
+					0x1D67E => array(0x6F), 0x1D67F => array(0x70), 0x1D680 => array(0x71),
1513
+					0x1D681 => array(0x72), 0x1D682 => array(0x73), 0x1D683 => array(0x74),
1514
+					0x1D684 => array(0x75), 0x1D685 => array(0x76), 0x1D686 => array(0x77),
1515
+					0x1D687 => array(0x78), 0x1D688 => array(0x79), 0x1D689 => array(0x7A),
1516
+					0x1D6A8 => array(0x3B1), 0x1D6A9 => array(0x3B2), 0x1D6AA => array(0x3B3),
1517
+					0x1D6AB => array(0x3B4), 0x1D6AC => array(0x3B5), 0x1D6AD => array(0x3B6),
1518
+					0x1D6AE => array(0x3B7), 0x1D6AF => array(0x3B8), 0x1D6B0 => array(0x3B9),
1519
+					0x1D6B1 => array(0x3BA), 0x1D6B2 => array(0x3BB), 0x1D6B3 => array(0x3BC),
1520
+					0x1D6B4 => array(0x3BD), 0x1D6B5 => array(0x3BE), 0x1D6B6 => array(0x3BF),
1521
+					0x1D6B7 => array(0x3C0), 0x1D6B8 => array(0x3C1), 0x1D6B9 => array(0x3B8),
1522
+					0x1D6BA => array(0x3C3), 0x1D6BB => array(0x3C4), 0x1D6BC => array(0x3C5),
1523
+					0x1D6BD => array(0x3C6), 0x1D6BE => array(0x3C7), 0x1D6BF => array(0x3C8),
1524
+					0x1D6C0 => array(0x3C9), 0x1D6D3 => array(0x3C3), 0x1D6E2 => array(0x3B1),
1525
+					0x1D6E3 => array(0x3B2), 0x1D6E4 => array(0x3B3), 0x1D6E5 => array(0x3B4),
1526
+					0x1D6E6 => array(0x3B5), 0x1D6E7 => array(0x3B6), 0x1D6E8 => array(0x3B7),
1527
+					0x1D6E9 => array(0x3B8), 0x1D6EA => array(0x3B9), 0x1D6EB => array(0x3BA),
1528
+					0x1D6EC => array(0x3BB), 0x1D6ED => array(0x3BC), 0x1D6EE => array(0x3BD),
1529
+					0x1D6EF => array(0x3BE), 0x1D6F0 => array(0x3BF), 0x1D6F1 => array(0x3C0),
1530
+					0x1D6F2 => array(0x3C1), 0x1D6F3 => array(0x3B8), 0x1D6F4 => array(0x3C3),
1531
+					0x1D6F5 => array(0x3C4), 0x1D6F6 => array(0x3C5), 0x1D6F7 => array(0x3C6),
1532
+					0x1D6F8 => array(0x3C7), 0x1D6F9 => array(0x3C8), 0x1D6FA => array(0x3C9),
1533
+					0x1D70D => array(0x3C3), 0x1D71C => array(0x3B1), 0x1D71D => array(0x3B2),
1534
+					0x1D71E => array(0x3B3), 0x1D71F => array(0x3B4), 0x1D720 => array(0x3B5),
1535
+					0x1D721 => array(0x3B6), 0x1D722 => array(0x3B7), 0x1D723 => array(0x3B8),
1536
+					0x1D724 => array(0x3B9), 0x1D725 => array(0x3BA), 0x1D726 => array(0x3BB),
1537
+					0x1D727 => array(0x3BC), 0x1D728 => array(0x3BD), 0x1D729 => array(0x3BE),
1538
+					0x1D72A => array(0x3BF), 0x1D72B => array(0x3C0), 0x1D72C => array(0x3C1),
1539
+					0x1D72D => array(0x3B8), 0x1D72E => array(0x3C3), 0x1D72F => array(0x3C4),
1540
+					0x1D730 => array(0x3C5), 0x1D731 => array(0x3C6), 0x1D732 => array(0x3C7),
1541
+					0x1D733 => array(0x3C8), 0x1D734 => array(0x3C9), 0x1D747 => array(0x3C3),
1542
+					0x1D756 => array(0x3B1), 0x1D757 => array(0x3B2), 0x1D758 => array(0x3B3),
1543
+					0x1D759 => array(0x3B4), 0x1D75A => array(0x3B5), 0x1D75B => array(0x3B6),
1544
+					0x1D75C => array(0x3B7), 0x1D75D => array(0x3B8), 0x1D75E => array(0x3B9),
1545
+					0x1D75F => array(0x3BA), 0x1D760 => array(0x3BB), 0x1D761 => array(0x3BC),
1546
+					0x1D762 => array(0x3BD), 0x1D763 => array(0x3BE), 0x1D764 => array(0x3BF),
1547
+					0x1D765 => array(0x3C0), 0x1D766 => array(0x3C1), 0x1D767 => array(0x3B8),
1548
+					0x1D768 => array(0x3C3), 0x1D769 => array(0x3C4), 0x1D76A => array(0x3C5),
1549
+					0x1D76B => array(0x3C6), 0x1D76C => array(0x3C7), 0x1D76D => array(0x3C8),
1550
+					0x1D76E => array(0x3C9), 0x1D781 => array(0x3C3), 0x1D790 => array(0x3B1),
1551
+					0x1D791 => array(0x3B2), 0x1D792 => array(0x3B3), 0x1D793 => array(0x3B4),
1552
+					0x1D794 => array(0x3B5), 0x1D795 => array(0x3B6), 0x1D796 => array(0x3B7),
1553
+					0x1D797 => array(0x3B8), 0x1D798 => array(0x3B9), 0x1D799 => array(0x3BA),
1554
+					0x1D79A => array(0x3BB), 0x1D79B => array(0x3BC), 0x1D79C => array(0x3BD),
1555
+					0x1D79D => array(0x3BE), 0x1D79E => array(0x3BF), 0x1D79F => array(0x3C0),
1556
+					0x1D7A0 => array(0x3C1), 0x1D7A1 => array(0x3B8), 0x1D7A2 => array(0x3C3),
1557
+					0x1D7A3 => array(0x3C4), 0x1D7A4 => array(0x3C5), 0x1D7A5 => array(0x3C6),
1558
+					0x1D7A6 => array(0x3C7), 0x1D7A7 => array(0x3C8), 0x1D7A8 => array(0x3C9),
1559
+					0x1D7BB => array(0x3C3), 0x3F9 => array(0x3C3), 0x1D2C => array(0x61),
1560
+					0x1D2D => array(0xE6), 0x1D2E => array(0x62), 0x1D30 => array(0x64),
1561
+					0x1D31 => array(0x65), 0x1D32 => array(0x1DD), 0x1D33 => array(0x67),
1562
+					0x1D34 => array(0x68), 0x1D35 => array(0x69), 0x1D36 => array(0x6A),
1563
+					0x1D37 => array(0x6B), 0x1D38 => array(0x6C), 0x1D39 => array(0x6D),
1564
+					0x1D3A => array(0x6E), 0x1D3C => array(0x6F), 0x1D3D => array(0x223),
1565
+					0x1D3E => array(0x70), 0x1D3F => array(0x72), 0x1D40 => array(0x74),
1566
+					0x1D41 => array(0x75), 0x1D42 => array(0x77), 0x213B => array(0x66, 0x61, 0x78),
1567
+					0x3250 => array(0x70, 0x74, 0x65), 0x32CC => array(0x68, 0x67),
1568
+					0x32CE => array(0x65, 0x76), 0x32CF => array(0x6C, 0x74, 0x64),
1569
+					0x337A => array(0x69, 0x75), 0x33DE => array(0x76, 0x2215, 0x6D),
1570
+					0x33DF => array(0x61, 0x2215, 0x6D)
1571
+			),
1572
+			'replacemaps' => array(0x41 => array(0x61), 0x42 => array(0x62), 0x43 => array(0x63),
1573
+					0x44 => array(0x64), 0x45 => array(0x65), 0x46 => array(0x66),
1574
+					0x47 => array(0x67), 0x48 => array(0x68), 0x49 => array(0x69),
1575
+					0x4A => array(0x6A), 0x4B => array(0x6B), 0x4C => array(0x6C),
1576
+					0x4D => array(0x6D), 0x4E => array(0x6E), 0x4F => array(0x6F),
1577
+					0x50 => array(0x70), 0x51 => array(0x71), 0x52 => array(0x72),
1578
+					0x53 => array(0x73), 0x54 => array(0x74), 0x55 => array(0x75),
1579
+					0x56 => array(0x76), 0x57 => array(0x77), 0x58 => array(0x78),
1580
+					0x59 => array(0x79), 0x5A => array(0x7A), 0xAA => array(0x61),
1581
+					0xB2 => array(0x32), 0xB3 => array(0x33), 0xB5 => array(0x3BC),
1582
+					0xB9 => array(0x31), 0xBA => array(0x6F), 0xBC => array(0x31, 0x2044, 0x34),
1583
+					0xBD => array(0x31, 0x2044, 0x32), 0xBE => array(0x33, 0x2044, 0x34), 0xC0 => array(0xE0),
1584
+					0xC1 => array(0xE1), 0xC2 => array(0xE2), 0xC3 => array(0xE3),
1585
+					0xC4 => array(0xE4), 0xC5 => array(0xE5), 0xC6 => array(0xE6),
1586
+					0xC7 => array(0xE7), 0xC8 => array(0xE8), 0xC9 => array(0xE9),
1587
+					0xCA => array(0xEA), 0xCB => array(0xEB), 0xCC => array(0xEC),
1588
+					0xCD => array(0xED), 0xCE => array(0xEE), 0xCF => array(0xEF),
1589
+					0xD0 => array(0xF0), 0xD1 => array(0xF1), 0xD2 => array(0xF2),
1590
+					0xD3 => array(0xF3), 0xD4 => array(0xF4), 0xD5 => array(0xF5),
1591
+					0xD6 => array(0xF6), 0xD8 => array(0xF8), 0xD9 => array(0xF9),
1592
+					0xDA => array(0xFA), 0xDB => array(0xFB), 0xDC => array(0xFC),
1593
+					0xDD => array(0xFD), 0xDE => array(0xFE), 0x100 => array(0x101),
1594
+					0x102 => array(0x103), 0x104 => array(0x105), 0x106 => array(0x107),
1595
+					0x108 => array(0x109), 0x10A => array(0x10B), 0x10C => array(0x10D),
1596
+					0x10E => array(0x10F), 0x110 => array(0x111), 0x112 => array(0x113),
1597
+					0x114 => array(0x115), 0x116 => array(0x117), 0x118 => array(0x119),
1598
+					0x11A => array(0x11B), 0x11C => array(0x11D), 0x11E => array(0x11F),
1599
+					0x120 => array(0x121), 0x122 => array(0x123), 0x124 => array(0x125),
1600
+					0x126 => array(0x127), 0x128 => array(0x129), 0x12A => array(0x12B),
1601
+					0x12C => array(0x12D), 0x12E => array(0x12F), 0x130 => array(0x69, 0x307),
1602
+					0x132 => array(0x69, 0x6A), 0x133 => array(0x69, 0x6A), 0x134 => array(0x135),
1603
+					0x136 => array(0x137), 0x139 => array(0x13A), 0x13B => array(0x13C),
1604
+					0x13D => array(0x13E), 0x13F => array(0x6C, 0xB7), 0x140 => array(0x6C, 0xB7),
1605
+					0x141 => array(0x142), 0x143 => array(0x144), 0x145 => array(0x146),
1606
+					0x147 => array(0x148), 0x149 => array(0x2BC, 0x6E), 0x14A => array(0x14B),
1607
+					0x14C => array(0x14D), 0x14E => array(0x14F), 0x150 => array(0x151),
1608
+					0x152 => array(0x153), 0x154 => array(0x155), 0x156 => array(0x157),
1609
+					0x158 => array(0x159), 0x15A => array(0x15B), 0x15C => array(0x15D),
1610
+					0x15E => array(0x15F), 0x160 => array(0x161), 0x162 => array(0x163),
1611
+					0x164 => array(0x165), 0x166 => array(0x167), 0x168 => array(0x169),
1612
+					0x16A => array(0x16B), 0x16C => array(0x16D), 0x16E => array(0x16F),
1613
+					0x170 => array(0x171), 0x172 => array(0x173), 0x174 => array(0x175),
1614
+					0x176 => array(0x177), 0x178 => array(0xFF), 0x179 => array(0x17A),
1615
+					0x17B => array(0x17C), 0x17D => array(0x17E), 0x17F => array(0x73),
1616
+					0x181 => array(0x253), 0x182 => array(0x183), 0x184 => array(0x185),
1617
+					0x186 => array(0x254), 0x187 => array(0x188), 0x189 => array(0x256),
1618
+					0x18A => array(0x257), 0x18B => array(0x18C), 0x18E => array(0x1DD),
1619
+					0x18F => array(0x259), 0x190 => array(0x25B), 0x191 => array(0x192),
1620
+					0x193 => array(0x260), 0x194 => array(0x263), 0x196 => array(0x269),
1621
+					0x197 => array(0x268), 0x198 => array(0x199), 0x19C => array(0x26F),
1622
+					0x19D => array(0x272), 0x19F => array(0x275), 0x1A0 => array(0x1A1),
1623
+					0x1A2 => array(0x1A3), 0x1A4 => array(0x1A5), 0x1A6 => array(0x280),
1624
+					0x1A7 => array(0x1A8), 0x1A9 => array(0x283), 0x1AC => array(0x1AD),
1625
+					0x1AE => array(0x288), 0x1AF => array(0x1B0), 0x1B1 => array(0x28A),
1626
+					0x1B2 => array(0x28B), 0x1B3 => array(0x1B4), 0x1B5 => array(0x1B6),
1627
+					0x1B7 => array(0x292), 0x1B8 => array(0x1B9), 0x1BC => array(0x1BD),
1628
+					0x1C4 => array(0x64, 0x17E), 0x1C5 => array(0x64, 0x17E), 0x1C6 => array(0x64, 0x17E),
1629
+					0x1C7 => array(0x6C, 0x6A), 0x1C8 => array(0x6C, 0x6A), 0x1C9 => array(0x6C, 0x6A),
1630
+					0x1CA => array(0x6E, 0x6A), 0x1CB => array(0x6E, 0x6A), 0x1CC => array(0x6E, 0x6A),
1631
+					0x1CD => array(0x1CE), 0x1CF => array(0x1D0), 0x1D1 => array(0x1D2),
1632
+					0x1D3 => array(0x1D4), 0x1D5 => array(0x1D6), 0x1D7 => array(0x1D8),
1633
+					0x1D9 => array(0x1DA), 0x1DB => array(0x1DC), 0x1DE => array(0x1DF),
1634
+					0x1E0 => array(0x1E1), 0x1E2 => array(0x1E3), 0x1E4 => array(0x1E5),
1635
+					0x1E6 => array(0x1E7), 0x1E8 => array(0x1E9), 0x1EA => array(0x1EB),
1636
+					0x1EC => array(0x1ED), 0x1EE => array(0x1EF), 0x1F1 => array(0x64, 0x7A),
1637
+					0x1F2 => array(0x64, 0x7A), 0x1F3 => array(0x64, 0x7A), 0x1F4 => array(0x1F5),
1638
+					0x1F6 => array(0x195), 0x1F7 => array(0x1BF), 0x1F8 => array(0x1F9),
1639
+					0x1FA => array(0x1FB), 0x1FC => array(0x1FD), 0x1FE => array(0x1FF),
1640
+					0x200 => array(0x201), 0x202 => array(0x203), 0x204 => array(0x205),
1641
+					0x206 => array(0x207), 0x208 => array(0x209), 0x20A => array(0x20B),
1642
+					0x20C => array(0x20D), 0x20E => array(0x20F), 0x210 => array(0x211),
1643
+					0x212 => array(0x213), 0x214 => array(0x215), 0x216 => array(0x217),
1644
+					0x218 => array(0x219), 0x21A => array(0x21B), 0x21C => array(0x21D),
1645
+					0x21E => array(0x21F), 0x220 => array(0x19E), 0x222 => array(0x223),
1646
+					0x224 => array(0x225), 0x226 => array(0x227), 0x228 => array(0x229),
1647
+					0x22A => array(0x22B), 0x22C => array(0x22D), 0x22E => array(0x22F),
1648
+					0x230 => array(0x231), 0x232 => array(0x233), 0x23A => array(0x2C65),
1649
+					0x23B => array(0x23C), 0x23D => array(0x19A), 0x23E => array(0x2C66),
1650
+					0x241 => array(0x242), 0x243 => array(0x180), 0x244 => array(0x289),
1651
+					0x245 => array(0x28C), 0x246 => array(0x247), 0x248 => array(0x249),
1652
+					0x24A => array(0x24B), 0x24C => array(0x24D), 0x24E => array(0x24F),
1653
+					0x2B0 => array(0x68), 0x2B1 => array(0x266), 0x2B2 => array(0x6A),
1654
+					0x2B3 => array(0x72), 0x2B4 => array(0x279), 0x2B5 => array(0x27B),
1655
+					0x2B6 => array(0x281), 0x2B7 => array(0x77), 0x2B8 => array(0x79),
1656
+					0x2E0 => array(0x263), 0x2E1 => array(0x6C), 0x2E2 => array(0x73),
1657
+					0x2E3 => array(0x78), 0x2E4 => array(0x295), 0x340 => array(0x300),
1658
+					0x341 => array(0x301), 0x343 => array(0x313), 0x344 => array(0x308, 0x301),
1659
+					0x345 => array(0x3B9), 0x370 => array(0x371), 0x372 => array(0x373),
1660
+					0x374 => array(0x2B9), 0x376 => array(0x377), 0x37F => array(0x3F3),
1661
+					0x386 => array(0x3AC), 0x387 => array(0xB7), 0x388 => array(0x3AD),
1662
+					0x389 => array(0x3AE), 0x38A => array(0x3AF), 0x38C => array(0x3CC),
1663
+					0x38E => array(0x3CD), 0x38F => array(0x3CE), 0x391 => array(0x3B1),
1664
+					0x392 => array(0x3B2), 0x393 => array(0x3B3), 0x394 => array(0x3B4),
1665
+					0x395 => array(0x3B5), 0x396 => array(0x3B6), 0x397 => array(0x3B7),
1666
+					0x398 => array(0x3B8), 0x399 => array(0x3B9), 0x39A => array(0x3BA),
1667
+					0x39B => array(0x3BB), 0x39C => array(0x3BC), 0x39D => array(0x3BD),
1668
+					0x39E => array(0x3BE), 0x39F => array(0x3BF), 0x3A0 => array(0x3C0),
1669
+					0x3A1 => array(0x3C1), 0x3A3 => array(0x3C3), 0x3A4 => array(0x3C4),
1670
+					0x3A5 => array(0x3C5), 0x3A6 => array(0x3C6), 0x3A7 => array(0x3C7),
1671
+					0x3A8 => array(0x3C8), 0x3A9 => array(0x3C9), 0x3AA => array(0x3CA),
1672
+					0x3AB => array(0x3CB), 0x3CF => array(0x3D7), 0x3D0 => array(0x3B2),
1673
+					0x3D1 => array(0x3B8), 0x3D2 => array(0x3C5), 0x3D3 => array(0x3CD),
1674
+					0x3D4 => array(0x3CB), 0x3D5 => array(0x3C6), 0x3D6 => array(0x3C0),
1675
+					0x3D8 => array(0x3D9), 0x3DA => array(0x3DB), 0x3DC => array(0x3DD),
1676
+					0x3DE => array(0x3DF), 0x3E0 => array(0x3E1), 0x3E2 => array(0x3E3),
1677
+					0x3E4 => array(0x3E5), 0x3E6 => array(0x3E7), 0x3E8 => array(0x3E9),
1678
+					0x3EA => array(0x3EB), 0x3EC => array(0x3ED), 0x3EE => array(0x3EF),
1679
+					0x3F0 => array(0x3BA), 0x3F1 => array(0x3C1), 0x3F2 => array(0x3C3),
1680
+					0x3F4 => array(0x3B8), 0x3F5 => array(0x3B5), 0x3F7 => array(0x3F8),
1681
+					0x3F9 => array(0x3C3), 0x3FA => array(0x3FB), 0x3FD => array(0x37B),
1682
+					0x3FE => array(0x37C), 0x3FF => array(0x37D), 0x400 => array(0x450),
1683
+					0x401 => array(0x451), 0x402 => array(0x452), 0x403 => array(0x453),
1684
+					0x404 => array(0x454), 0x405 => array(0x455), 0x406 => array(0x456),
1685
+					0x407 => array(0x457), 0x408 => array(0x458), 0x409 => array(0x459),
1686
+					0x40A => array(0x45A), 0x40B => array(0x45B), 0x40C => array(0x45C),
1687
+					0x40D => array(0x45D), 0x40E => array(0x45E), 0x40F => array(0x45F),
1688
+					0x410 => array(0x430), 0x411 => array(0x431), 0x412 => array(0x432),
1689
+					0x413 => array(0x433), 0x414 => array(0x434), 0x415 => array(0x435),
1690
+					0x416 => array(0x436), 0x417 => array(0x437), 0x418 => array(0x438),
1691
+					0x419 => array(0x439), 0x41A => array(0x43A), 0x41B => array(0x43B),
1692
+					0x41C => array(0x43C), 0x41D => array(0x43D), 0x41E => array(0x43E),
1693
+					0x41F => array(0x43F), 0x420 => array(0x440), 0x421 => array(0x441),
1694
+					0x422 => array(0x442), 0x423 => array(0x443), 0x424 => array(0x444),
1695
+					0x425 => array(0x445), 0x426 => array(0x446), 0x427 => array(0x447),
1696
+					0x428 => array(0x448), 0x429 => array(0x449), 0x42A => array(0x44A),
1697
+					0x42B => array(0x44B), 0x42C => array(0x44C), 0x42D => array(0x44D),
1698
+					0x42E => array(0x44E), 0x42F => array(0x44F), 0x460 => array(0x461),
1699
+					0x462 => array(0x463), 0x464 => array(0x465), 0x466 => array(0x467),
1700
+					0x468 => array(0x469), 0x46A => array(0x46B), 0x46C => array(0x46D),
1701
+					0x46E => array(0x46F), 0x470 => array(0x471), 0x472 => array(0x473),
1702
+					0x474 => array(0x475), 0x476 => array(0x477), 0x478 => array(0x479),
1703
+					0x47A => array(0x47B), 0x47C => array(0x47D), 0x47E => array(0x47F),
1704
+					0x480 => array(0x481), 0x48A => array(0x48B), 0x48C => array(0x48D),
1705
+					0x48E => array(0x48F), 0x490 => array(0x491), 0x492 => array(0x493),
1706
+					0x494 => array(0x495), 0x496 => array(0x497), 0x498 => array(0x499),
1707
+					0x49A => array(0x49B), 0x49C => array(0x49D), 0x49E => array(0x49F),
1708
+					0x4A0 => array(0x4A1), 0x4A2 => array(0x4A3), 0x4A4 => array(0x4A5),
1709
+					0x4A6 => array(0x4A7), 0x4A8 => array(0x4A9), 0x4AA => array(0x4AB),
1710
+					0x4AC => array(0x4AD), 0x4AE => array(0x4AF), 0x4B0 => array(0x4B1),
1711
+					0x4B2 => array(0x4B3), 0x4B4 => array(0x4B5), 0x4B6 => array(0x4B7),
1712
+					0x4B8 => array(0x4B9), 0x4BA => array(0x4BB), 0x4BC => array(0x4BD),
1713
+					0x4BE => array(0x4BF), 0x4C1 => array(0x4C2), 0x4C3 => array(0x4C4),
1714
+					0x4C5 => array(0x4C6), 0x4C7 => array(0x4C8), 0x4C9 => array(0x4CA),
1715
+					0x4CB => array(0x4CC), 0x4CD => array(0x4CE), 0x4D0 => array(0x4D1),
1716
+					0x4D2 => array(0x4D3), 0x4D4 => array(0x4D5), 0x4D6 => array(0x4D7),
1717
+					0x4D8 => array(0x4D9), 0x4DA => array(0x4DB), 0x4DC => array(0x4DD),
1718
+					0x4DE => array(0x4DF), 0x4E0 => array(0x4E1), 0x4E2 => array(0x4E3),
1719
+					0x4E4 => array(0x4E5), 0x4E6 => array(0x4E7), 0x4E8 => array(0x4E9),
1720
+					0x4EA => array(0x4EB), 0x4EC => array(0x4ED), 0x4EE => array(0x4EF),
1721
+					0x4F0 => array(0x4F1), 0x4F2 => array(0x4F3), 0x4F4 => array(0x4F5),
1722
+					0x4F6 => array(0x4F7), 0x4F8 => array(0x4F9), 0x4FA => array(0x4FB),
1723
+					0x4FC => array(0x4FD), 0x4FE => array(0x4FF), 0x500 => array(0x501),
1724
+					0x502 => array(0x503), 0x504 => array(0x505), 0x506 => array(0x507),
1725
+					0x508 => array(0x509), 0x50A => array(0x50B), 0x50C => array(0x50D),
1726
+					0x50E => array(0x50F), 0x510 => array(0x511), 0x512 => array(0x513),
1727
+					0x514 => array(0x515), 0x516 => array(0x517), 0x518 => array(0x519),
1728
+					0x51A => array(0x51B), 0x51C => array(0x51D), 0x51E => array(0x51F),
1729
+					0x520 => array(0x521), 0x522 => array(0x523), 0x524 => array(0x525),
1730
+					0x526 => array(0x527), 0x528 => array(0x529), 0x52A => array(0x52B),
1731
+					0x52C => array(0x52D), 0x52E => array(0x52F), 0x531 => array(0x561),
1732
+					0x532 => array(0x562), 0x533 => array(0x563), 0x534 => array(0x564),
1733
+					0x535 => array(0x565), 0x536 => array(0x566), 0x537 => array(0x567),
1734
+					0x538 => array(0x568), 0x539 => array(0x569), 0x53A => array(0x56A),
1735
+					0x53B => array(0x56B), 0x53C => array(0x56C), 0x53D => array(0x56D),
1736
+					0x53E => array(0x56E), 0x53F => array(0x56F), 0x540 => array(0x570),
1737
+					0x541 => array(0x571), 0x542 => array(0x572), 0x543 => array(0x573),
1738
+					0x544 => array(0x574), 0x545 => array(0x575), 0x546 => array(0x576),
1739
+					0x547 => array(0x577), 0x548 => array(0x578), 0x549 => array(0x579),
1740
+					0x54A => array(0x57A), 0x54B => array(0x57B), 0x54C => array(0x57C),
1741
+					0x54D => array(0x57D), 0x54E => array(0x57E), 0x54F => array(0x57F),
1742
+					0x550 => array(0x580), 0x551 => array(0x581), 0x552 => array(0x582),
1743
+					0x553 => array(0x583), 0x554 => array(0x584), 0x555 => array(0x585),
1744
+					0x556 => array(0x586), 0x587 => array(0x565, 0x582), 0x675 => array(0x627, 0x674),
1745
+					0x676 => array(0x648, 0x674), 0x677 => array(0x6C7, 0x674), 0x678 => array(0x64A, 0x674),
1746
+					0x958 => array(0x915, 0x93C), 0x959 => array(0x916, 0x93C), 0x95A => array(0x917, 0x93C),
1747
+					0x95B => array(0x91C, 0x93C), 0x95C => array(0x921, 0x93C), 0x95D => array(0x922, 0x93C),
1748
+					0x95E => array(0x92B, 0x93C), 0x95F => array(0x92F, 0x93C), 0x9DC => array(0x9A1, 0x9BC),
1749
+					0x9DD => array(0x9A2, 0x9BC), 0x9DF => array(0x9AF, 0x9BC), 0xA33 => array(0xA32, 0xA3C),
1750
+					0xA36 => array(0xA38, 0xA3C), 0xA59 => array(0xA16, 0xA3C), 0xA5A => array(0xA17, 0xA3C),
1751
+					0xA5B => array(0xA1C, 0xA3C), 0xA5E => array(0xA2B, 0xA3C), 0xB5C => array(0xB21, 0xB3C),
1752
+					0xB5D => array(0xB22, 0xB3C), 0xE33 => array(0xE4D, 0xE32), 0xEB3 => array(0xECD, 0xEB2),
1753
+					0xEDC => array(0xEAB, 0xE99), 0xEDD => array(0xEAB, 0xEA1), 0xF0C => array(0xF0B),
1754
+					0xF43 => array(0xF42, 0xFB7), 0xF4D => array(0xF4C, 0xFB7), 0xF52 => array(0xF51, 0xFB7),
1755
+					0xF57 => array(0xF56, 0xFB7), 0xF5C => array(0xF5B, 0xFB7), 0xF69 => array(0xF40, 0xFB5),
1756
+					0xF73 => array(0xF71, 0xF72), 0xF75 => array(0xF71, 0xF74), 0xF76 => array(0xFB2, 0xF80),
1757
+					0xF77 => array(0xFB2, 0xF71, 0xF80), 0xF78 => array(0xFB3, 0xF80), 0xF79 => array(0xFB3, 0xF71, 0xF80),
1758
+					0xF81 => array(0xF71, 0xF80), 0xF93 => array(0xF92, 0xFB7), 0xF9D => array(0xF9C, 0xFB7),
1759
+					0xFA2 => array(0xFA1, 0xFB7), 0xFA7 => array(0xFA6, 0xFB7), 0xFAC => array(0xFAB, 0xFB7),
1760
+					0xFB9 => array(0xF90, 0xFB5), 0x10C7 => array(0x2D27), 0x10CD => array(0x2D2D),
1761
+					0x10FC => array(0x10DC), 0x1D2C => array(0x61), 0x1D2D => array(0xE6),
1762
+					0x1D2E => array(0x62), 0x1D30 => array(0x64), 0x1D31 => array(0x65),
1763
+					0x1D32 => array(0x1DD), 0x1D33 => array(0x67), 0x1D34 => array(0x68),
1764
+					0x1D35 => array(0x69), 0x1D36 => array(0x6A), 0x1D37 => array(0x6B),
1765
+					0x1D38 => array(0x6C), 0x1D39 => array(0x6D), 0x1D3A => array(0x6E),
1766
+					0x1D3C => array(0x6F), 0x1D3D => array(0x223), 0x1D3E => array(0x70),
1767
+					0x1D3F => array(0x72), 0x1D40 => array(0x74), 0x1D41 => array(0x75),
1768
+					0x1D42 => array(0x77), 0x1D43 => array(0x61), 0x1D44 => array(0x250),
1769
+					0x1D45 => array(0x251), 0x1D46 => array(0x1D02), 0x1D47 => array(0x62),
1770
+					0x1D48 => array(0x64), 0x1D49 => array(0x65), 0x1D4A => array(0x259),
1771
+					0x1D4B => array(0x25B), 0x1D4C => array(0x25C), 0x1D4D => array(0x67),
1772
+					0x1D4F => array(0x6B), 0x1D50 => array(0x6D), 0x1D51 => array(0x14B),
1773
+					0x1D52 => array(0x6F), 0x1D53 => array(0x254), 0x1D54 => array(0x1D16),
1774
+					0x1D55 => array(0x1D17), 0x1D56 => array(0x70), 0x1D57 => array(0x74),
1775
+					0x1D58 => array(0x75), 0x1D59 => array(0x1D1D), 0x1D5A => array(0x26F),
1776
+					0x1D5B => array(0x76), 0x1D5C => array(0x1D25), 0x1D5D => array(0x3B2),
1777
+					0x1D5E => array(0x3B3), 0x1D5F => array(0x3B4), 0x1D60 => array(0x3C6),
1778
+					0x1D61 => array(0x3C7), 0x1D62 => array(0x69), 0x1D63 => array(0x72),
1779
+					0x1D64 => array(0x75), 0x1D65 => array(0x76), 0x1D66 => array(0x3B2),
1780
+					0x1D67 => array(0x3B3), 0x1D68 => array(0x3C1), 0x1D69 => array(0x3C6),
1781
+					0x1D6A => array(0x3C7), 0x1D78 => array(0x43D), 0x1D9B => array(0x252),
1782
+					0x1D9C => array(0x63), 0x1D9D => array(0x255), 0x1D9E => array(0xF0),
1783
+					0x1D9F => array(0x25C), 0x1DA0 => array(0x66), 0x1DA1 => array(0x25F),
1784
+					0x1DA2 => array(0x261), 0x1DA3 => array(0x265), 0x1DA4 => array(0x268),
1785
+					0x1DA5 => array(0x269), 0x1DA6 => array(0x26A), 0x1DA7 => array(0x1D7B),
1786
+					0x1DA8 => array(0x29D), 0x1DA9 => array(0x26D), 0x1DAA => array(0x1D85),
1787
+					0x1DAB => array(0x29F), 0x1DAC => array(0x271), 0x1DAD => array(0x270),
1788
+					0x1DAE => array(0x272), 0x1DAF => array(0x273), 0x1DB0 => array(0x274),
1789
+					0x1DB1 => array(0x275), 0x1DB2 => array(0x278), 0x1DB3 => array(0x282),
1790
+					0x1DB4 => array(0x283), 0x1DB5 => array(0x1AB), 0x1DB6 => array(0x289),
1791
+					0x1DB7 => array(0x28A), 0x1DB8 => array(0x1D1C), 0x1DB9 => array(0x28B),
1792
+					0x1DBA => array(0x28C), 0x1DBB => array(0x7A), 0x1DBC => array(0x290),
1793
+					0x1DBD => array(0x291), 0x1DBE => array(0x292), 0x1DBF => array(0x3B8),
1794
+					0x1E00 => array(0x1E01), 0x1E02 => array(0x1E03), 0x1E04 => array(0x1E05),
1795
+					0x1E06 => array(0x1E07), 0x1E08 => array(0x1E09), 0x1E0A => array(0x1E0B),
1796
+					0x1E0C => array(0x1E0D), 0x1E0E => array(0x1E0F), 0x1E10 => array(0x1E11),
1797
+					0x1E12 => array(0x1E13), 0x1E14 => array(0x1E15), 0x1E16 => array(0x1E17),
1798
+					0x1E18 => array(0x1E19), 0x1E1A => array(0x1E1B), 0x1E1C => array(0x1E1D),
1799
+					0x1E1E => array(0x1E1F), 0x1E20 => array(0x1E21), 0x1E22 => array(0x1E23),
1800
+					0x1E24 => array(0x1E25), 0x1E26 => array(0x1E27), 0x1E28 => array(0x1E29),
1801
+					0x1E2A => array(0x1E2B), 0x1E2C => array(0x1E2D), 0x1E2E => array(0x1E2F),
1802
+					0x1E30 => array(0x1E31), 0x1E32 => array(0x1E33), 0x1E34 => array(0x1E35),
1803
+					0x1E36 => array(0x1E37), 0x1E38 => array(0x1E39), 0x1E3A => array(0x1E3B),
1804
+					0x1E3C => array(0x1E3D), 0x1E3E => array(0x1E3F), 0x1E40 => array(0x1E41),
1805
+					0x1E42 => array(0x1E43), 0x1E44 => array(0x1E45), 0x1E46 => array(0x1E47),
1806
+					0x1E48 => array(0x1E49), 0x1E4A => array(0x1E4B), 0x1E4C => array(0x1E4D),
1807
+					0x1E4E => array(0x1E4F), 0x1E50 => array(0x1E51), 0x1E52 => array(0x1E53),
1808
+					0x1E54 => array(0x1E55), 0x1E56 => array(0x1E57), 0x1E58 => array(0x1E59),
1809
+					0x1E5A => array(0x1E5B), 0x1E5C => array(0x1E5D), 0x1E5E => array(0x1E5F),
1810
+					0x1E60 => array(0x1E61), 0x1E62 => array(0x1E63), 0x1E64 => array(0x1E65),
1811
+					0x1E66 => array(0x1E67), 0x1E68 => array(0x1E69), 0x1E6A => array(0x1E6B),
1812
+					0x1E6C => array(0x1E6D), 0x1E6E => array(0x1E6F), 0x1E70 => array(0x1E71),
1813
+					0x1E72 => array(0x1E73), 0x1E74 => array(0x1E75), 0x1E76 => array(0x1E77),
1814
+					0x1E78 => array(0x1E79), 0x1E7A => array(0x1E7B), 0x1E7C => array(0x1E7D),
1815
+					0x1E7E => array(0x1E7F), 0x1E80 => array(0x1E81), 0x1E82 => array(0x1E83),
1816
+					0x1E84 => array(0x1E85), 0x1E86 => array(0x1E87), 0x1E88 => array(0x1E89),
1817
+					0x1E8A => array(0x1E8B), 0x1E8C => array(0x1E8D), 0x1E8E => array(0x1E8F),
1818
+					0x1E90 => array(0x1E91), 0x1E92 => array(0x1E93), 0x1E94 => array(0x1E95),
1819
+					0x1E9A => array(0x61, 0x2BE), 0x1E9B => array(0x1E61), 0x1E9E => array(0x73, 0x73),
1820
+					0x1EA0 => array(0x1EA1), 0x1EA2 => array(0x1EA3), 0x1EA4 => array(0x1EA5),
1821
+					0x1EA6 => array(0x1EA7), 0x1EA8 => array(0x1EA9), 0x1EAA => array(0x1EAB),
1822
+					0x1EAC => array(0x1EAD), 0x1EAE => array(0x1EAF), 0x1EB0 => array(0x1EB1),
1823
+					0x1EB2 => array(0x1EB3), 0x1EB4 => array(0x1EB5), 0x1EB6 => array(0x1EB7),
1824
+					0x1EB8 => array(0x1EB9), 0x1EBA => array(0x1EBB), 0x1EBC => array(0x1EBD),
1825
+					0x1EBE => array(0x1EBF), 0x1EC0 => array(0x1EC1), 0x1EC2 => array(0x1EC3),
1826
+					0x1EC4 => array(0x1EC5), 0x1EC6 => array(0x1EC7), 0x1EC8 => array(0x1EC9),
1827
+					0x1ECA => array(0x1ECB), 0x1ECC => array(0x1ECD), 0x1ECE => array(0x1ECF),
1828
+					0x1ED0 => array(0x1ED1), 0x1ED2 => array(0x1ED3), 0x1ED4 => array(0x1ED5),
1829
+					0x1ED6 => array(0x1ED7), 0x1ED8 => array(0x1ED9), 0x1EDA => array(0x1EDB),
1830
+					0x1EDC => array(0x1EDD), 0x1EDE => array(0x1EDF), 0x1EE0 => array(0x1EE1),
1831
+					0x1EE2 => array(0x1EE3), 0x1EE4 => array(0x1EE5), 0x1EE6 => array(0x1EE7),
1832
+					0x1EE8 => array(0x1EE9), 0x1EEA => array(0x1EEB), 0x1EEC => array(0x1EED),
1833
+					0x1EEE => array(0x1EEF), 0x1EF0 => array(0x1EF1), 0x1EF2 => array(0x1EF3),
1834
+					0x1EF4 => array(0x1EF5), 0x1EF6 => array(0x1EF7), 0x1EF8 => array(0x1EF9),
1835
+					0x1EFA => array(0x1EFB), 0x1EFC => array(0x1EFD), 0x1EFE => array(0x1EFF),
1836
+					0x1F08 => array(0x1F00), 0x1F09 => array(0x1F01), 0x1F0A => array(0x1F02),
1837
+					0x1F0B => array(0x1F03), 0x1F0C => array(0x1F04), 0x1F0D => array(0x1F05),
1838
+					0x1F0E => array(0x1F06), 0x1F0F => array(0x1F07), 0x1F18 => array(0x1F10),
1839
+					0x1F19 => array(0x1F11), 0x1F1A => array(0x1F12), 0x1F1B => array(0x1F13),
1840
+					0x1F1C => array(0x1F14), 0x1F1D => array(0x1F15), 0x1F28 => array(0x1F20),
1841
+					0x1F29 => array(0x1F21), 0x1F2A => array(0x1F22), 0x1F2B => array(0x1F23),
1842
+					0x1F2C => array(0x1F24), 0x1F2D => array(0x1F25), 0x1F2E => array(0x1F26),
1843
+					0x1F2F => array(0x1F27), 0x1F38 => array(0x1F30), 0x1F39 => array(0x1F31),
1844
+					0x1F3A => array(0x1F32), 0x1F3B => array(0x1F33), 0x1F3C => array(0x1F34),
1845
+					0x1F3D => array(0x1F35), 0x1F3E => array(0x1F36), 0x1F3F => array(0x1F37),
1846
+					0x1F48 => array(0x1F40), 0x1F49 => array(0x1F41), 0x1F4A => array(0x1F42),
1847
+					0x1F4B => array(0x1F43), 0x1F4C => array(0x1F44), 0x1F4D => array(0x1F45),
1848
+					0x1F59 => array(0x1F51), 0x1F5B => array(0x1F53), 0x1F5D => array(0x1F55),
1849
+					0x1F5F => array(0x1F57), 0x1F68 => array(0x1F60), 0x1F69 => array(0x1F61),
1850
+					0x1F6A => array(0x1F62), 0x1F6B => array(0x1F63), 0x1F6C => array(0x1F64),
1851
+					0x1F6D => array(0x1F65), 0x1F6E => array(0x1F66), 0x1F6F => array(0x1F67),
1852
+					0x1F71 => array(0x3AC), 0x1F73 => array(0x3AD), 0x1F75 => array(0x3AE),
1853
+					0x1F77 => array(0x3AF), 0x1F79 => array(0x3CC), 0x1F7B => array(0x3CD),
1854
+					0x1F7D => array(0x3CE), 0x1F80 => array(0x1F00, 0x3B9), 0x1F81 => array(0x1F01, 0x3B9),
1855
+					0x1F82 => array(0x1F02, 0x3B9), 0x1F83 => array(0x1F03, 0x3B9), 0x1F84 => array(0x1F04, 0x3B9),
1856
+					0x1F85 => array(0x1F05, 0x3B9), 0x1F86 => array(0x1F06, 0x3B9), 0x1F87 => array(0x1F07, 0x3B9),
1857
+					0x1F88 => array(0x1F00, 0x3B9), 0x1F89 => array(0x1F01, 0x3B9), 0x1F8A => array(0x1F02, 0x3B9),
1858
+					0x1F8B => array(0x1F03, 0x3B9), 0x1F8C => array(0x1F04, 0x3B9), 0x1F8D => array(0x1F05, 0x3B9),
1859
+					0x1F8E => array(0x1F06, 0x3B9), 0x1F8F => array(0x1F07, 0x3B9), 0x1F90 => array(0x1F20, 0x3B9),
1860
+					0x1F91 => array(0x1F21, 0x3B9), 0x1F92 => array(0x1F22, 0x3B9), 0x1F93 => array(0x1F23, 0x3B9),
1861
+					0x1F94 => array(0x1F24, 0x3B9), 0x1F95 => array(0x1F25, 0x3B9), 0x1F96 => array(0x1F26, 0x3B9),
1862
+					0x1F97 => array(0x1F27, 0x3B9), 0x1F98 => array(0x1F20, 0x3B9), 0x1F99 => array(0x1F21, 0x3B9),
1863
+					0x1F9A => array(0x1F22, 0x3B9), 0x1F9B => array(0x1F23, 0x3B9), 0x1F9C => array(0x1F24, 0x3B9),
1864
+					0x1F9D => array(0x1F25, 0x3B9), 0x1F9E => array(0x1F26, 0x3B9), 0x1F9F => array(0x1F27, 0x3B9),
1865
+					0x1FA0 => array(0x1F60, 0x3B9), 0x1FA1 => array(0x1F61, 0x3B9), 0x1FA2 => array(0x1F62, 0x3B9),
1866
+					0x1FA3 => array(0x1F63, 0x3B9), 0x1FA4 => array(0x1F64, 0x3B9), 0x1FA5 => array(0x1F65, 0x3B9),
1867
+					0x1FA6 => array(0x1F66, 0x3B9), 0x1FA7 => array(0x1F67, 0x3B9), 0x1FA8 => array(0x1F60, 0x3B9),
1868
+					0x1FA9 => array(0x1F61, 0x3B9), 0x1FAA => array(0x1F62, 0x3B9), 0x1FAB => array(0x1F63, 0x3B9),
1869
+					0x1FAC => array(0x1F64, 0x3B9), 0x1FAD => array(0x1F65, 0x3B9), 0x1FAE => array(0x1F66, 0x3B9),
1870
+					0x1FAF => array(0x1F67, 0x3B9), 0x1FB2 => array(0x1F70, 0x3B9), 0x1FB3 => array(0x3B1, 0x3B9),
1871
+					0x1FB4 => array(0x3AC, 0x3B9), 0x1FB7 => array(0x1FB6, 0x3B9), 0x1FB8 => array(0x1FB0),
1872
+					0x1FB9 => array(0x1FB1), 0x1FBA => array(0x1F70), 0x1FBB => array(0x3AC),
1873
+					0x1FBC => array(0x3B1, 0x3B9), 0x1FBE => array(0x3B9), 0x1FC2 => array(0x1F74, 0x3B9),
1874
+					0x1FC3 => array(0x3B7, 0x3B9), 0x1FC4 => array(0x3AE, 0x3B9), 0x1FC7 => array(0x1FC6, 0x3B9),
1875
+					0x1FC8 => array(0x1F72), 0x1FC9 => array(0x3AD), 0x1FCA => array(0x1F74),
1876
+					0x1FCB => array(0x3AE), 0x1FCC => array(0x3B7, 0x3B9), 0x1FD3 => array(0x390),
1877
+					0x1FD8 => array(0x1FD0), 0x1FD9 => array(0x1FD1), 0x1FDA => array(0x1F76),
1878
+					0x1FDB => array(0x3AF), 0x1FE3 => array(0x3B0), 0x1FE8 => array(0x1FE0),
1879
+					0x1FE9 => array(0x1FE1), 0x1FEA => array(0x1F7A), 0x1FEB => array(0x3CD),
1880
+					0x1FEC => array(0x1FE5), 0x1FF2 => array(0x1F7C, 0x3B9), 0x1FF3 => array(0x3C9, 0x3B9),
1881
+					0x1FF4 => array(0x3CE, 0x3B9), 0x1FF7 => array(0x1FF6, 0x3B9), 0x1FF8 => array(0x1F78),
1882
+					0x1FF9 => array(0x3CC), 0x1FFA => array(0x1F7C), 0x1FFB => array(0x3CE),
1883
+					0x1FFC => array(0x3C9, 0x3B9), 0x2011 => array(0x2010), 0x2033 => array(0x2032, 0x2032),
1884
+					0x2034 => array(0x2032, 0x2032, 0x2032), 0x2036 => array(0x2035, 0x2035), 0x2037 => array(0x2035, 0x2035, 0x2035),
1885
+					0x2057 => array(0x2032, 0x2032, 0x2032, 0x2032), 0x2070 => array(0x30), 0x2071 => array(0x69),
1886
+					0x2074 => array(0x34), 0x2075 => array(0x35), 0x2076 => array(0x36),
1887
+					0x2077 => array(0x37), 0x2078 => array(0x38), 0x2079 => array(0x39),
1888
+					0x207B => array(0x2212), 0x207F => array(0x6E), 0x2080 => array(0x30),
1889
+					0x2081 => array(0x31), 0x2082 => array(0x32), 0x2083 => array(0x33),
1890
+					0x2084 => array(0x34), 0x2085 => array(0x35), 0x2086 => array(0x36),
1891
+					0x2087 => array(0x37), 0x2088 => array(0x38), 0x2089 => array(0x39),
1892
+					0x208B => array(0x2212), 0x2090 => array(0x61), 0x2091 => array(0x65),
1893
+					0x2092 => array(0x6F), 0x2093 => array(0x78), 0x2094 => array(0x259),
1894
+					0x2095 => array(0x68), 0x2096 => array(0x6B), 0x2097 => array(0x6C),
1895
+					0x2098 => array(0x6D), 0x2099 => array(0x6E), 0x209A => array(0x70),
1896
+					0x209B => array(0x73), 0x209C => array(0x74), 0x20A8 => array(0x72, 0x73),
1897
+					0x2102 => array(0x63), 0x2103 => array(0xB0, 0x63), 0x2107 => array(0x25B),
1898
+					0x2109 => array(0xB0, 0x66), 0x210A => array(0x67), 0x210B => array(0x68),
1899
+					0x210C => array(0x68), 0x210D => array(0x68), 0x210E => array(0x68),
1900
+					0x210F => array(0x127), 0x2110 => array(0x69), 0x2111 => array(0x69),
1901
+					0x2112 => array(0x6C), 0x2113 => array(0x6C), 0x2115 => array(0x6E),
1902
+					0x2116 => array(0x6E, 0x6F), 0x2119 => array(0x70), 0x211A => array(0x71),
1903
+					0x211B => array(0x72), 0x211C => array(0x72), 0x211D => array(0x72),
1904
+					0x2120 => array(0x73, 0x6D), 0x2121 => array(0x74, 0x65, 0x6C), 0x2122 => array(0x74, 0x6D),
1905
+					0x2124 => array(0x7A), 0x2126 => array(0x3C9), 0x2128 => array(0x7A),
1906
+					0x212A => array(0x6B), 0x212B => array(0xE5), 0x212C => array(0x62),
1907
+					0x212D => array(0x63), 0x212F => array(0x65), 0x2130 => array(0x65),
1908
+					0x2131 => array(0x66), 0x2133 => array(0x6D), 0x2134 => array(0x6F),
1909
+					0x2135 => array(0x5D0), 0x2136 => array(0x5D1), 0x2137 => array(0x5D2),
1910
+					0x2138 => array(0x5D3), 0x2139 => array(0x69), 0x213B => array(0x66, 0x61, 0x78),
1911
+					0x213C => array(0x3C0), 0x213D => array(0x3B3), 0x213E => array(0x3B3),
1912
+					0x213F => array(0x3C0), 0x2140 => array(0x2211), 0x2145 => array(0x64),
1913
+					0x2146 => array(0x64), 0x2147 => array(0x65), 0x2148 => array(0x69),
1914
+					0x2149 => array(0x6A), 0x2150 => array(0x31, 0x2044, 0x37), 0x2151 => array(0x31, 0x2044, 0x39),
1915
+					0x2152 => array(0x31, 0x2044, 0x31, 0x30), 0x2153 => array(0x31, 0x2044, 0x33), 0x2154 => array(0x32, 0x2044, 0x33),
1916
+					0x2155 => array(0x31, 0x2044, 0x35), 0x2156 => array(0x32, 0x2044, 0x35), 0x2157 => array(0x33, 0x2044, 0x35),
1917
+					0x2158 => array(0x34, 0x2044, 0x35), 0x2159 => array(0x31, 0x2044, 0x36), 0x215A => array(0x35, 0x2044, 0x36),
1918
+					0x215B => array(0x31, 0x2044, 0x38), 0x215C => array(0x33, 0x2044, 0x38), 0x215D => array(0x35, 0x2044, 0x38),
1919
+					0x215E => array(0x37, 0x2044, 0x38), 0x215F => array(0x31, 0x2044), 0x2160 => array(0x69),
1920
+					0x2161 => array(0x69, 0x69), 0x2162 => array(0x69, 0x69, 0x69), 0x2163 => array(0x69, 0x76),
1921
+					0x2164 => array(0x76), 0x2165 => array(0x76, 0x69), 0x2166 => array(0x76, 0x69, 0x69),
1922
+					0x2167 => array(0x76, 0x69, 0x69, 0x69), 0x2168 => array(0x69, 0x78), 0x2169 => array(0x78),
1923
+					0x216A => array(0x78, 0x69), 0x216B => array(0x78, 0x69, 0x69), 0x216C => array(0x6C),
1924
+					0x216D => array(0x63), 0x216E => array(0x64), 0x216F => array(0x6D),
1925
+					0x2170 => array(0x69), 0x2171 => array(0x69, 0x69), 0x2172 => array(0x69, 0x69, 0x69),
1926
+					0x2173 => array(0x69, 0x76), 0x2174 => array(0x76), 0x2175 => array(0x76, 0x69),
1927
+					0x2176 => array(0x76, 0x69, 0x69), 0x2177 => array(0x76, 0x69, 0x69, 0x69), 0x2178 => array(0x69, 0x78),
1928
+					0x2179 => array(0x78), 0x217A => array(0x78, 0x69), 0x217B => array(0x78, 0x69, 0x69),
1929
+					0x217C => array(0x6C), 0x217D => array(0x63), 0x217E => array(0x64),
1930
+					0x217F => array(0x6D), 0x2189 => array(0x30, 0x2044, 0x33), 0x222C => array(0x222B, 0x222B),
1931
+					0x222D => array(0x222B, 0x222B, 0x222B), 0x222F => array(0x222E, 0x222E), 0x2230 => array(0x222E, 0x222E, 0x222E),
1932
+					0x2329 => array(0x3008), 0x232A => array(0x3009), 0x2460 => array(0x31),
1933
+					0x2461 => array(0x32), 0x2462 => array(0x33), 0x2463 => array(0x34),
1934
+					0x2464 => array(0x35), 0x2465 => array(0x36), 0x2466 => array(0x37),
1935
+					0x2467 => array(0x38), 0x2468 => array(0x39), 0x2469 => array(0x31, 0x30),
1936
+					0x246A => array(0x31, 0x31), 0x246B => array(0x31, 0x32), 0x246C => array(0x31, 0x33),
1937
+					0x246D => array(0x31, 0x34), 0x246E => array(0x31, 0x35), 0x246F => array(0x31, 0x36),
1938
+					0x2470 => array(0x31, 0x37), 0x2471 => array(0x31, 0x38), 0x2472 => array(0x31, 0x39),
1939
+					0x2473 => array(0x32, 0x30), 0x24B6 => array(0x61), 0x24B7 => array(0x62),
1940
+					0x24B8 => array(0x63), 0x24B9 => array(0x64), 0x24BA => array(0x65),
1941
+					0x24BB => array(0x66), 0x24BC => array(0x67), 0x24BD => array(0x68),
1942
+					0x24BE => array(0x69), 0x24BF => array(0x6A), 0x24C0 => array(0x6B),
1943
+					0x24C1 => array(0x6C), 0x24C2 => array(0x6D), 0x24C3 => array(0x6E),
1944
+					0x24C4 => array(0x6F), 0x24C5 => array(0x70), 0x24C6 => array(0x71),
1945
+					0x24C7 => array(0x72), 0x24C8 => array(0x73), 0x24C9 => array(0x74),
1946
+					0x24CA => array(0x75), 0x24CB => array(0x76), 0x24CC => array(0x77),
1947
+					0x24CD => array(0x78), 0x24CE => array(0x79), 0x24CF => array(0x7A),
1948
+					0x24D0 => array(0x61), 0x24D1 => array(0x62), 0x24D2 => array(0x63),
1949
+					0x24D3 => array(0x64), 0x24D4 => array(0x65), 0x24D5 => array(0x66),
1950
+					0x24D6 => array(0x67), 0x24D7 => array(0x68), 0x24D8 => array(0x69),
1951
+					0x24D9 => array(0x6A), 0x24DA => array(0x6B), 0x24DB => array(0x6C),
1952
+					0x24DC => array(0x6D), 0x24DD => array(0x6E), 0x24DE => array(0x6F),
1953
+					0x24DF => array(0x70), 0x24E0 => array(0x71), 0x24E1 => array(0x72),
1954
+					0x24E2 => array(0x73), 0x24E3 => array(0x74), 0x24E4 => array(0x75),
1955
+					0x24E5 => array(0x76), 0x24E6 => array(0x77), 0x24E7 => array(0x78),
1956
+					0x24E8 => array(0x79), 0x24E9 => array(0x7A), 0x24EA => array(0x30),
1957
+					0x2A0C => array(0x222B, 0x222B, 0x222B, 0x222B), 0x2ADC => array(0x2ADD, 0x338), 0x2C00 => array(0x2C30),
1958
+					0x2C01 => array(0x2C31), 0x2C02 => array(0x2C32), 0x2C03 => array(0x2C33),
1959
+					0x2C04 => array(0x2C34), 0x2C05 => array(0x2C35), 0x2C06 => array(0x2C36),
1960
+					0x2C07 => array(0x2C37), 0x2C08 => array(0x2C38), 0x2C09 => array(0x2C39),
1961
+					0x2C0A => array(0x2C3A), 0x2C0B => array(0x2C3B), 0x2C0C => array(0x2C3C),
1962
+					0x2C0D => array(0x2C3D), 0x2C0E => array(0x2C3E), 0x2C0F => array(0x2C3F),
1963
+					0x2C10 => array(0x2C40), 0x2C11 => array(0x2C41), 0x2C12 => array(0x2C42),
1964
+					0x2C13 => array(0x2C43), 0x2C14 => array(0x2C44), 0x2C15 => array(0x2C45),
1965
+					0x2C16 => array(0x2C46), 0x2C17 => array(0x2C47), 0x2C18 => array(0x2C48),
1966
+					0x2C19 => array(0x2C49), 0x2C1A => array(0x2C4A), 0x2C1B => array(0x2C4B),
1967
+					0x2C1C => array(0x2C4C), 0x2C1D => array(0x2C4D), 0x2C1E => array(0x2C4E),
1968
+					0x2C1F => array(0x2C4F), 0x2C20 => array(0x2C50), 0x2C21 => array(0x2C51),
1969
+					0x2C22 => array(0x2C52), 0x2C23 => array(0x2C53), 0x2C24 => array(0x2C54),
1970
+					0x2C25 => array(0x2C55), 0x2C26 => array(0x2C56), 0x2C27 => array(0x2C57),
1971
+					0x2C28 => array(0x2C58), 0x2C29 => array(0x2C59), 0x2C2A => array(0x2C5A),
1972
+					0x2C2B => array(0x2C5B), 0x2C2C => array(0x2C5C), 0x2C2D => array(0x2C5D),
1973
+					0x2C2E => array(0x2C5E), 0x2C60 => array(0x2C61), 0x2C62 => array(0x26B),
1974
+					0x2C63 => array(0x1D7D), 0x2C64 => array(0x27D), 0x2C67 => array(0x2C68),
1975
+					0x2C69 => array(0x2C6A), 0x2C6B => array(0x2C6C), 0x2C6D => array(0x251),
1976
+					0x2C6E => array(0x271), 0x2C6F => array(0x250), 0x2C70 => array(0x252),
1977
+					0x2C72 => array(0x2C73), 0x2C75 => array(0x2C76), 0x2C7C => array(0x6A),
1978
+					0x2C7D => array(0x76), 0x2C7E => array(0x23F), 0x2C7F => array(0x240),
1979
+					0x2C80 => array(0x2C81), 0x2C82 => array(0x2C83), 0x2C84 => array(0x2C85),
1980
+					0x2C86 => array(0x2C87), 0x2C88 => array(0x2C89), 0x2C8A => array(0x2C8B),
1981
+					0x2C8C => array(0x2C8D), 0x2C8E => array(0x2C8F), 0x2C90 => array(0x2C91),
1982
+					0x2C92 => array(0x2C93), 0x2C94 => array(0x2C95), 0x2C96 => array(0x2C97),
1983
+					0x2C98 => array(0x2C99), 0x2C9A => array(0x2C9B), 0x2C9C => array(0x2C9D),
1984
+					0x2C9E => array(0x2C9F), 0x2CA0 => array(0x2CA1), 0x2CA2 => array(0x2CA3),
1985
+					0x2CA4 => array(0x2CA5), 0x2CA6 => array(0x2CA7), 0x2CA8 => array(0x2CA9),
1986
+					0x2CAA => array(0x2CAB), 0x2CAC => array(0x2CAD), 0x2CAE => array(0x2CAF),
1987
+					0x2CB0 => array(0x2CB1), 0x2CB2 => array(0x2CB3), 0x2CB4 => array(0x2CB5),
1988
+					0x2CB6 => array(0x2CB7), 0x2CB8 => array(0x2CB9), 0x2CBA => array(0x2CBB),
1989
+					0x2CBC => array(0x2CBD), 0x2CBE => array(0x2CBF), 0x2CC0 => array(0x2CC1),
1990
+					0x2CC2 => array(0x2CC3), 0x2CC4 => array(0x2CC5), 0x2CC6 => array(0x2CC7),
1991
+					0x2CC8 => array(0x2CC9), 0x2CCA => array(0x2CCB), 0x2CCC => array(0x2CCD),
1992
+					0x2CCE => array(0x2CCF), 0x2CD0 => array(0x2CD1), 0x2CD2 => array(0x2CD3),
1993
+					0x2CD4 => array(0x2CD5), 0x2CD6 => array(0x2CD7), 0x2CD8 => array(0x2CD9),
1994
+					0x2CDA => array(0x2CDB), 0x2CDC => array(0x2CDD), 0x2CDE => array(0x2CDF),
1995
+					0x2CE0 => array(0x2CE1), 0x2CE2 => array(0x2CE3), 0x2CEB => array(0x2CEC),
1996
+					0x2CED => array(0x2CEE), 0x2CF2 => array(0x2CF3), 0x2D6F => array(0x2D61),
1997
+					0x2E9F => array(0x6BCD), 0x2EF3 => array(0x9F9F), 0x2F00 => array(0x4E00),
1998
+					0x2F01 => array(0x4E28), 0x2F02 => array(0x4E36), 0x2F03 => array(0x4E3F),
1999
+					0x2F04 => array(0x4E59), 0x2F05 => array(0x4E85), 0x2F06 => array(0x4E8C),
2000
+					0x2F07 => array(0x4EA0), 0x2F08 => array(0x4EBA), 0x2F09 => array(0x513F),
2001
+					0x2F0A => array(0x5165), 0x2F0B => array(0x516B), 0x2F0C => array(0x5182),
2002
+					0x2F0D => array(0x5196), 0x2F0E => array(0x51AB), 0x2F0F => array(0x51E0),
2003
+					0x2F10 => array(0x51F5), 0x2F11 => array(0x5200), 0x2F12 => array(0x529B),
2004
+					0x2F13 => array(0x52F9), 0x2F14 => array(0x5315), 0x2F15 => array(0x531A),
2005
+					0x2F16 => array(0x5338), 0x2F17 => array(0x5341), 0x2F18 => array(0x535C),
2006
+					0x2F19 => array(0x5369), 0x2F1A => array(0x5382), 0x2F1B => array(0x53B6),
2007
+					0x2F1C => array(0x53C8), 0x2F1D => array(0x53E3), 0x2F1E => array(0x56D7),
2008
+					0x2F1F => array(0x571F), 0x2F20 => array(0x58EB), 0x2F21 => array(0x5902),
2009
+					0x2F22 => array(0x590A), 0x2F23 => array(0x5915), 0x2F24 => array(0x5927),
2010
+					0x2F25 => array(0x5973), 0x2F26 => array(0x5B50), 0x2F27 => array(0x5B80),
2011
+					0x2F28 => array(0x5BF8), 0x2F29 => array(0x5C0F), 0x2F2A => array(0x5C22),
2012
+					0x2F2B => array(0x5C38), 0x2F2C => array(0x5C6E), 0x2F2D => array(0x5C71),
2013
+					0x2F2E => array(0x5DDB), 0x2F2F => array(0x5DE5), 0x2F30 => array(0x5DF1),
2014
+					0x2F31 => array(0x5DFE), 0x2F32 => array(0x5E72), 0x2F33 => array(0x5E7A),
2015
+					0x2F34 => array(0x5E7F), 0x2F35 => array(0x5EF4), 0x2F36 => array(0x5EFE),
2016
+					0x2F37 => array(0x5F0B), 0x2F38 => array(0x5F13), 0x2F39 => array(0x5F50),
2017
+					0x2F3A => array(0x5F61), 0x2F3B => array(0x5F73), 0x2F3C => array(0x5FC3),
2018
+					0x2F3D => array(0x6208), 0x2F3E => array(0x6236), 0x2F3F => array(0x624B),
2019
+					0x2F40 => array(0x652F), 0x2F41 => array(0x6534), 0x2F42 => array(0x6587),
2020
+					0x2F43 => array(0x6597), 0x2F44 => array(0x65A4), 0x2F45 => array(0x65B9),
2021
+					0x2F46 => array(0x65E0), 0x2F47 => array(0x65E5), 0x2F48 => array(0x66F0),
2022
+					0x2F49 => array(0x6708), 0x2F4A => array(0x6728), 0x2F4B => array(0x6B20),
2023
+					0x2F4C => array(0x6B62), 0x2F4D => array(0x6B79), 0x2F4E => array(0x6BB3),
2024
+					0x2F4F => array(0x6BCB), 0x2F50 => array(0x6BD4), 0x2F51 => array(0x6BDB),
2025
+					0x2F52 => array(0x6C0F), 0x2F53 => array(0x6C14), 0x2F54 => array(0x6C34),
2026
+					0x2F55 => array(0x706B), 0x2F56 => array(0x722A), 0x2F57 => array(0x7236),
2027
+					0x2F58 => array(0x723B), 0x2F59 => array(0x723F), 0x2F5A => array(0x7247),
2028
+					0x2F5B => array(0x7259), 0x2F5C => array(0x725B), 0x2F5D => array(0x72AC),
2029
+					0x2F5E => array(0x7384), 0x2F5F => array(0x7389), 0x2F60 => array(0x74DC),
2030
+					0x2F61 => array(0x74E6), 0x2F62 => array(0x7518), 0x2F63 => array(0x751F),
2031
+					0x2F64 => array(0x7528), 0x2F65 => array(0x7530), 0x2F66 => array(0x758B),
2032
+					0x2F67 => array(0x7592), 0x2F68 => array(0x7676), 0x2F69 => array(0x767D),
2033
+					0x2F6A => array(0x76AE), 0x2F6B => array(0x76BF), 0x2F6C => array(0x76EE),
2034
+					0x2F6D => array(0x77DB), 0x2F6E => array(0x77E2), 0x2F6F => array(0x77F3),
2035
+					0x2F70 => array(0x793A), 0x2F71 => array(0x79B8), 0x2F72 => array(0x79BE),
2036
+					0x2F73 => array(0x7A74), 0x2F74 => array(0x7ACB), 0x2F75 => array(0x7AF9),
2037
+					0x2F76 => array(0x7C73), 0x2F77 => array(0x7CF8), 0x2F78 => array(0x7F36),
2038
+					0x2F79 => array(0x7F51), 0x2F7A => array(0x7F8A), 0x2F7B => array(0x7FBD),
2039
+					0x2F7C => array(0x8001), 0x2F7D => array(0x800C), 0x2F7E => array(0x8012),
2040
+					0x2F7F => array(0x8033), 0x2F80 => array(0x807F), 0x2F81 => array(0x8089),
2041
+					0x2F82 => array(0x81E3), 0x2F83 => array(0x81EA), 0x2F84 => array(0x81F3),
2042
+					0x2F85 => array(0x81FC), 0x2F86 => array(0x820C), 0x2F87 => array(0x821B),
2043
+					0x2F88 => array(0x821F), 0x2F89 => array(0x826E), 0x2F8A => array(0x8272),
2044
+					0x2F8B => array(0x8278), 0x2F8C => array(0x864D), 0x2F8D => array(0x866B),
2045
+					0x2F8E => array(0x8840), 0x2F8F => array(0x884C), 0x2F90 => array(0x8863),
2046
+					0x2F91 => array(0x897E), 0x2F92 => array(0x898B), 0x2F93 => array(0x89D2),
2047
+					0x2F94 => array(0x8A00), 0x2F95 => array(0x8C37), 0x2F96 => array(0x8C46),
2048
+					0x2F97 => array(0x8C55), 0x2F98 => array(0x8C78), 0x2F99 => array(0x8C9D),
2049
+					0x2F9A => array(0x8D64), 0x2F9B => array(0x8D70), 0x2F9C => array(0x8DB3),
2050
+					0x2F9D => array(0x8EAB), 0x2F9E => array(0x8ECA), 0x2F9F => array(0x8F9B),
2051
+					0x2FA0 => array(0x8FB0), 0x2FA1 => array(0x8FB5), 0x2FA2 => array(0x9091),
2052
+					0x2FA3 => array(0x9149), 0x2FA4 => array(0x91C6), 0x2FA5 => array(0x91CC),
2053
+					0x2FA6 => array(0x91D1), 0x2FA7 => array(0x9577), 0x2FA8 => array(0x9580),
2054
+					0x2FA9 => array(0x961C), 0x2FAA => array(0x96B6), 0x2FAB => array(0x96B9),
2055
+					0x2FAC => array(0x96E8), 0x2FAD => array(0x9751), 0x2FAE => array(0x975E),
2056
+					0x2FAF => array(0x9762), 0x2FB0 => array(0x9769), 0x2FB1 => array(0x97CB),
2057
+					0x2FB2 => array(0x97ED), 0x2FB3 => array(0x97F3), 0x2FB4 => array(0x9801),
2058
+					0x2FB5 => array(0x98A8), 0x2FB6 => array(0x98DB), 0x2FB7 => array(0x98DF),
2059
+					0x2FB8 => array(0x9996), 0x2FB9 => array(0x9999), 0x2FBA => array(0x99AC),
2060
+					0x2FBB => array(0x9AA8), 0x2FBC => array(0x9AD8), 0x2FBD => array(0x9ADF),
2061
+					0x2FBE => array(0x9B25), 0x2FBF => array(0x9B2F), 0x2FC0 => array(0x9B32),
2062
+					0x2FC1 => array(0x9B3C), 0x2FC2 => array(0x9B5A), 0x2FC3 => array(0x9CE5),
2063
+					0x2FC4 => array(0x9E75), 0x2FC5 => array(0x9E7F), 0x2FC6 => array(0x9EA5),
2064
+					0x2FC7 => array(0x9EBB), 0x2FC8 => array(0x9EC3), 0x2FC9 => array(0x9ECD),
2065
+					0x2FCA => array(0x9ED1), 0x2FCB => array(0x9EF9), 0x2FCC => array(0x9EFD),
2066
+					0x2FCD => array(0x9F0E), 0x2FCE => array(0x9F13), 0x2FCF => array(0x9F20),
2067
+					0x2FD0 => array(0x9F3B), 0x2FD1 => array(0x9F4A), 0x2FD2 => array(0x9F52),
2068
+					0x2FD3 => array(0x9F8D), 0x2FD4 => array(0x9F9C), 0x2FD5 => array(0x9FA0),
2069
+					0x3002 => array(0x2E), 0x3036 => array(0x3012), 0x3038 => array(0x5341),
2070
+					0x3039 => array(0x5344), 0x303A => array(0x5345), 0x309F => array(0x3088, 0x308A),
2071
+					0x30FF => array(0x30B3, 0x30C8), 0x3131 => array(0x1100), 0x3132 => array(0x1101),
2072
+					0x3133 => array(0x11AA), 0x3134 => array(0x1102), 0x3135 => array(0x11AC),
2073
+					0x3136 => array(0x11AD), 0x3137 => array(0x1103), 0x3138 => array(0x1104),
2074
+					0x3139 => array(0x1105), 0x313A => array(0x11B0), 0x313B => array(0x11B1),
2075
+					0x313C => array(0x11B2), 0x313D => array(0x11B3), 0x313E => array(0x11B4),
2076
+					0x313F => array(0x11B5), 0x3140 => array(0x111A), 0x3141 => array(0x1106),
2077
+					0x3142 => array(0x1107), 0x3143 => array(0x1108), 0x3144 => array(0x1121),
2078
+					0x3145 => array(0x1109), 0x3146 => array(0x110A), 0x3147 => array(0x110B),
2079
+					0x3148 => array(0x110C), 0x3149 => array(0x110D), 0x314A => array(0x110E),
2080
+					0x314B => array(0x110F), 0x314C => array(0x1110), 0x314D => array(0x1111),
2081
+					0x314E => array(0x1112), 0x314F => array(0x1161), 0x3150 => array(0x1162),
2082
+					0x3151 => array(0x1163), 0x3152 => array(0x1164), 0x3153 => array(0x1165),
2083
+					0x3154 => array(0x1166), 0x3155 => array(0x1167), 0x3156 => array(0x1168),
2084
+					0x3157 => array(0x1169), 0x3158 => array(0x116A), 0x3159 => array(0x116B),
2085
+					0x315A => array(0x116C), 0x315B => array(0x116D), 0x315C => array(0x116E),
2086
+					0x315D => array(0x116F), 0x315E => array(0x1170), 0x315F => array(0x1171),
2087
+					0x3160 => array(0x1172), 0x3161 => array(0x1173), 0x3162 => array(0x1174),
2088
+					0x3163 => array(0x1175), 0x3165 => array(0x1114), 0x3166 => array(0x1115),
2089
+					0x3167 => array(0x11C7), 0x3168 => array(0x11C8), 0x3169 => array(0x11CC),
2090
+					0x316A => array(0x11CE), 0x316B => array(0x11D3), 0x316C => array(0x11D7),
2091
+					0x316D => array(0x11D9), 0x316E => array(0x111C), 0x316F => array(0x11DD),
2092
+					0x3170 => array(0x11DF), 0x3171 => array(0x111D), 0x3172 => array(0x111E),
2093
+					0x3173 => array(0x1120), 0x3174 => array(0x1122), 0x3175 => array(0x1123),
2094
+					0x3176 => array(0x1127), 0x3177 => array(0x1129), 0x3178 => array(0x112B),
2095
+					0x3179 => array(0x112C), 0x317A => array(0x112D), 0x317B => array(0x112E),
2096
+					0x317C => array(0x112F), 0x317D => array(0x1132), 0x317E => array(0x1136),
2097
+					0x317F => array(0x1140), 0x3180 => array(0x1147), 0x3181 => array(0x114C),
2098
+					0x3182 => array(0x11F1), 0x3183 => array(0x11F2), 0x3184 => array(0x1157),
2099
+					0x3185 => array(0x1158), 0x3186 => array(0x1159), 0x3187 => array(0x1184),
2100
+					0x3188 => array(0x1185), 0x3189 => array(0x1188), 0x318A => array(0x1191),
2101
+					0x318B => array(0x1192), 0x318C => array(0x1194), 0x318D => array(0x119E),
2102
+					0x318E => array(0x11A1), 0x3192 => array(0x4E00), 0x3193 => array(0x4E8C),
2103
+					0x3194 => array(0x4E09), 0x3195 => array(0x56DB), 0x3196 => array(0x4E0A),
2104
+					0x3197 => array(0x4E2D), 0x3198 => array(0x4E0B), 0x3199 => array(0x7532),
2105
+					0x319A => array(0x4E59), 0x319B => array(0x4E19), 0x319C => array(0x4E01),
2106
+					0x319D => array(0x5929), 0x319E => array(0x5730), 0x319F => array(0x4EBA),
2107
+					0x3244 => array(0x554F), 0x3245 => array(0x5E7C), 0x3246 => array(0x6587),
2108
+					0x3247 => array(0x7B8F), 0x3250 => array(0x70, 0x74, 0x65), 0x3251 => array(0x32, 0x31),
2109
+					0x3252 => array(0x32, 0x32), 0x3253 => array(0x32, 0x33), 0x3254 => array(0x32, 0x34),
2110
+					0x3255 => array(0x32, 0x35), 0x3256 => array(0x32, 0x36), 0x3257 => array(0x32, 0x37),
2111
+					0x3258 => array(0x32, 0x38), 0x3259 => array(0x32, 0x39), 0x325A => array(0x33, 0x30),
2112
+					0x325B => array(0x33, 0x31), 0x325C => array(0x33, 0x32), 0x325D => array(0x33, 0x33),
2113
+					0x325E => array(0x33, 0x34), 0x325F => array(0x33, 0x35), 0x3260 => array(0x1100),
2114
+					0x3261 => array(0x1102), 0x3262 => array(0x1103), 0x3263 => array(0x1105),
2115
+					0x3264 => array(0x1106), 0x3265 => array(0x1107), 0x3266 => array(0x1109),
2116
+					0x3267 => array(0x110B), 0x3268 => array(0x110C), 0x3269 => array(0x110E),
2117
+					0x326A => array(0x110F), 0x326B => array(0x1110), 0x326C => array(0x1111),
2118
+					0x326D => array(0x1112), 0x326E => array(0xAC00), 0x326F => array(0xB098),
2119
+					0x3270 => array(0xB2E4), 0x3271 => array(0xB77C), 0x3272 => array(0xB9C8),
2120
+					0x3273 => array(0xBC14), 0x3274 => array(0xC0AC), 0x3275 => array(0xC544),
2121
+					0x3276 => array(0xC790), 0x3277 => array(0xCC28), 0x3278 => array(0xCE74),
2122
+					0x3279 => array(0xD0C0), 0x327A => array(0xD30C), 0x327B => array(0xD558),
2123
+					0x327C => array(0xCC38, 0xACE0), 0x327D => array(0xC8FC, 0xC758), 0x327E => array(0xC6B0),
2124
+					0x3280 => array(0x4E00), 0x3281 => array(0x4E8C), 0x3282 => array(0x4E09),
2125
+					0x3283 => array(0x56DB), 0x3284 => array(0x4E94), 0x3285 => array(0x516D),
2126
+					0x3286 => array(0x4E03), 0x3287 => array(0x516B), 0x3288 => array(0x4E5D),
2127
+					0x3289 => array(0x5341), 0x328A => array(0x6708), 0x328B => array(0x706B),
2128
+					0x328C => array(0x6C34), 0x328D => array(0x6728), 0x328E => array(0x91D1),
2129
+					0x328F => array(0x571F), 0x3290 => array(0x65E5), 0x3291 => array(0x682A),
2130
+					0x3292 => array(0x6709), 0x3293 => array(0x793E), 0x3294 => array(0x540D),
2131
+					0x3295 => array(0x7279), 0x3296 => array(0x8CA1), 0x3297 => array(0x795D),
2132
+					0x3298 => array(0x52B4), 0x3299 => array(0x79D8), 0x329A => array(0x7537),
2133
+					0x329B => array(0x5973), 0x329C => array(0x9069), 0x329D => array(0x512A),
2134
+					0x329E => array(0x5370), 0x329F => array(0x6CE8), 0x32A0 => array(0x9805),
2135
+					0x32A1 => array(0x4F11), 0x32A2 => array(0x5199), 0x32A3 => array(0x6B63),
2136
+					0x32A4 => array(0x4E0A), 0x32A5 => array(0x4E2D), 0x32A6 => array(0x4E0B),
2137
+					0x32A7 => array(0x5DE6), 0x32A8 => array(0x53F3), 0x32A9 => array(0x533B),
2138
+					0x32AA => array(0x5B97), 0x32AB => array(0x5B66), 0x32AC => array(0x76E3),
2139
+					0x32AD => array(0x4F01), 0x32AE => array(0x8CC7), 0x32AF => array(0x5354),
2140
+					0x32B0 => array(0x591C), 0x32B1 => array(0x33, 0x36), 0x32B2 => array(0x33, 0x37),
2141
+					0x32B3 => array(0x33, 0x38), 0x32B4 => array(0x33, 0x39), 0x32B5 => array(0x34, 0x30),
2142
+					0x32B6 => array(0x34, 0x31), 0x32B7 => array(0x34, 0x32), 0x32B8 => array(0x34, 0x33),
2143
+					0x32B9 => array(0x34, 0x34), 0x32BA => array(0x34, 0x35), 0x32BB => array(0x34, 0x36),
2144
+					0x32BC => array(0x34, 0x37), 0x32BD => array(0x34, 0x38), 0x32BE => array(0x34, 0x39),
2145
+					0x32BF => array(0x35, 0x30), 0x32C0 => array(0x31, 0x6708), 0x32C1 => array(0x32, 0x6708),
2146
+					0x32C2 => array(0x33, 0x6708), 0x32C3 => array(0x34, 0x6708), 0x32C4 => array(0x35, 0x6708),
2147
+					0x32C5 => array(0x36, 0x6708), 0x32C6 => array(0x37, 0x6708), 0x32C7 => array(0x38, 0x6708),
2148
+					0x32C8 => array(0x39, 0x6708), 0x32C9 => array(0x31, 0x30, 0x6708), 0x32CA => array(0x31, 0x31, 0x6708),
2149
+					0x32CB => array(0x31, 0x32, 0x6708), 0x32CC => array(0x68, 0x67), 0x32CD => array(0x65, 0x72, 0x67),
2150
+					0x32CE => array(0x65, 0x76), 0x32CF => array(0x6C, 0x74, 0x64), 0x32D0 => array(0x30A2),
2151
+					0x32D1 => array(0x30A4), 0x32D2 => array(0x30A6), 0x32D3 => array(0x30A8),
2152
+					0x32D4 => array(0x30AA), 0x32D5 => array(0x30AB), 0x32D6 => array(0x30AD),
2153
+					0x32D7 => array(0x30AF), 0x32D8 => array(0x30B1), 0x32D9 => array(0x30B3),
2154
+					0x32DA => array(0x30B5), 0x32DB => array(0x30B7), 0x32DC => array(0x30B9),
2155
+					0x32DD => array(0x30BB), 0x32DE => array(0x30BD), 0x32DF => array(0x30BF),
2156
+					0x32E0 => array(0x30C1), 0x32E1 => array(0x30C4), 0x32E2 => array(0x30C6),
2157
+					0x32E3 => array(0x30C8), 0x32E4 => array(0x30CA), 0x32E5 => array(0x30CB),
2158
+					0x32E6 => array(0x30CC), 0x32E7 => array(0x30CD), 0x32E8 => array(0x30CE),
2159
+					0x32E9 => array(0x30CF), 0x32EA => array(0x30D2), 0x32EB => array(0x30D5),
2160
+					0x32EC => array(0x30D8), 0x32ED => array(0x30DB), 0x32EE => array(0x30DE),
2161
+					0x32EF => array(0x30DF), 0x32F0 => array(0x30E0), 0x32F1 => array(0x30E1),
2162
+					0x32F2 => array(0x30E2), 0x32F3 => array(0x30E4), 0x32F4 => array(0x30E6),
2163
+					0x32F5 => array(0x30E8), 0x32F6 => array(0x30E9), 0x32F7 => array(0x30EA),
2164
+					0x32F8 => array(0x30EB), 0x32F9 => array(0x30EC), 0x32FA => array(0x30ED),
2165
+					0x32FB => array(0x30EF), 0x32FC => array(0x30F0), 0x32FD => array(0x30F1),
2166
+					0x32FE => array(0x30F2), 0x3300 => array(0x30A2, 0x30D1, 0x30FC, 0x30C8), 0x3301 => array(0x30A2, 0x30EB, 0x30D5, 0x30A1),
2167
+					0x3302 => array(0x30A2, 0x30F3, 0x30DA, 0x30A2), 0x3303 => array(0x30A2, 0x30FC, 0x30EB), 0x3304 => array(0x30A4, 0x30CB, 0x30F3, 0x30B0),
2168
+					0x3305 => array(0x30A4, 0x30F3, 0x30C1), 0x3306 => array(0x30A6, 0x30A9, 0x30F3), 0x3307 => array(0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C9),
2169
+					0x3308 => array(0x30A8, 0x30FC, 0x30AB, 0x30FC), 0x3309 => array(0x30AA, 0x30F3, 0x30B9), 0x330A => array(0x30AA, 0x30FC, 0x30E0),
2170
+					0x330B => array(0x30AB, 0x30A4, 0x30EA), 0x330C => array(0x30AB, 0x30E9, 0x30C3, 0x30C8), 0x330D => array(0x30AB, 0x30ED, 0x30EA, 0x30FC),
2171
+					0x330E => array(0x30AC, 0x30ED, 0x30F3), 0x330F => array(0x30AC, 0x30F3, 0x30DE), 0x3310 => array(0x30AE, 0x30AC),
2172
+					0x3311 => array(0x30AE, 0x30CB, 0x30FC), 0x3312 => array(0x30AD, 0x30E5, 0x30EA, 0x30FC), 0x3313 => array(0x30AE, 0x30EB, 0x30C0, 0x30FC),
2173
+					0x3314 => array(0x30AD, 0x30ED), 0x3315 => array(0x30AD, 0x30ED, 0x30B0, 0x30E9, 0x30E0), 0x3316 => array(0x30AD, 0x30ED, 0x30E1, 0x30FC, 0x30C8, 0x30EB),
2174
+					0x3317 => array(0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8), 0x3318 => array(0x30B0, 0x30E9, 0x30E0), 0x3319 => array(0x30B0, 0x30E9, 0x30E0, 0x30C8, 0x30F3),
2175
+					0x331A => array(0x30AF, 0x30EB, 0x30BC, 0x30A4, 0x30ED), 0x331B => array(0x30AF, 0x30ED, 0x30FC, 0x30CD), 0x331C => array(0x30B1, 0x30FC, 0x30B9),
2176
+					0x331D => array(0x30B3, 0x30EB, 0x30CA), 0x331E => array(0x30B3, 0x30FC, 0x30DD), 0x331F => array(0x30B5, 0x30A4, 0x30AF, 0x30EB),
2177
+					0x3320 => array(0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0), 0x3321 => array(0x30B7, 0x30EA, 0x30F3, 0x30B0), 0x3322 => array(0x30BB, 0x30F3, 0x30C1),
2178
+					0x3323 => array(0x30BB, 0x30F3, 0x30C8), 0x3324 => array(0x30C0, 0x30FC, 0x30B9), 0x3325 => array(0x30C7, 0x30B7),
2179
+					0x3326 => array(0x30C9, 0x30EB), 0x3327 => array(0x30C8, 0x30F3), 0x3328 => array(0x30CA, 0x30CE),
2180
+					0x3329 => array(0x30CE, 0x30C3, 0x30C8), 0x332A => array(0x30CF, 0x30A4, 0x30C4), 0x332B => array(0x30D1, 0x30FC, 0x30BB, 0x30F3, 0x30C8),
2181
+					0x332C => array(0x30D1, 0x30FC, 0x30C4), 0x332D => array(0x30D0, 0x30FC, 0x30EC, 0x30EB), 0x332E => array(0x30D4, 0x30A2, 0x30B9, 0x30C8, 0x30EB),
2182
+					0x332F => array(0x30D4, 0x30AF, 0x30EB), 0x3330 => array(0x30D4, 0x30B3), 0x3331 => array(0x30D3, 0x30EB),
2183
+					0x3332 => array(0x30D5, 0x30A1, 0x30E9, 0x30C3, 0x30C9), 0x3333 => array(0x30D5, 0x30A3, 0x30FC, 0x30C8), 0x3334 => array(0x30D6, 0x30C3, 0x30B7, 0x30A7, 0x30EB),
2184
+					0x3335 => array(0x30D5, 0x30E9, 0x30F3), 0x3336 => array(0x30D8, 0x30AF, 0x30BF, 0x30FC, 0x30EB), 0x3337 => array(0x30DA, 0x30BD),
2185
+					0x3338 => array(0x30DA, 0x30CB, 0x30D2), 0x3339 => array(0x30D8, 0x30EB, 0x30C4), 0x333A => array(0x30DA, 0x30F3, 0x30B9),
2186
+					0x333B => array(0x30DA, 0x30FC, 0x30B8), 0x333C => array(0x30D9, 0x30FC, 0x30BF), 0x333D => array(0x30DD, 0x30A4, 0x30F3, 0x30C8),
2187
+					0x333E => array(0x30DC, 0x30EB, 0x30C8), 0x333F => array(0x30DB, 0x30F3), 0x3340 => array(0x30DD, 0x30F3, 0x30C9),
2188
+					0x3341 => array(0x30DB, 0x30FC, 0x30EB), 0x3342 => array(0x30DB, 0x30FC, 0x30F3), 0x3343 => array(0x30DE, 0x30A4, 0x30AF, 0x30ED),
2189
+					0x3344 => array(0x30DE, 0x30A4, 0x30EB), 0x3345 => array(0x30DE, 0x30C3, 0x30CF), 0x3346 => array(0x30DE, 0x30EB, 0x30AF),
2190
+					0x3347 => array(0x30DE, 0x30F3, 0x30B7, 0x30E7, 0x30F3), 0x3348 => array(0x30DF, 0x30AF, 0x30ED, 0x30F3), 0x3349 => array(0x30DF, 0x30EA),
2191
+					0x334A => array(0x30DF, 0x30EA, 0x30D0, 0x30FC, 0x30EB), 0x334B => array(0x30E1, 0x30AC), 0x334C => array(0x30E1, 0x30AC, 0x30C8, 0x30F3),
2192
+					0x334D => array(0x30E1, 0x30FC, 0x30C8, 0x30EB), 0x334E => array(0x30E4, 0x30FC, 0x30C9), 0x334F => array(0x30E4, 0x30FC, 0x30EB),
2193
+					0x3350 => array(0x30E6, 0x30A2, 0x30F3), 0x3351 => array(0x30EA, 0x30C3, 0x30C8, 0x30EB), 0x3352 => array(0x30EA, 0x30E9),
2194
+					0x3353 => array(0x30EB, 0x30D4, 0x30FC), 0x3354 => array(0x30EB, 0x30FC, 0x30D6, 0x30EB), 0x3355 => array(0x30EC, 0x30E0),
2195
+					0x3356 => array(0x30EC, 0x30F3, 0x30C8, 0x30B2, 0x30F3), 0x3357 => array(0x30EF, 0x30C3, 0x30C8), 0x3358 => array(0x30, 0x70B9),
2196
+					0x3359 => array(0x31, 0x70B9), 0x335A => array(0x32, 0x70B9), 0x335B => array(0x33, 0x70B9),
2197
+					0x335C => array(0x34, 0x70B9), 0x335D => array(0x35, 0x70B9), 0x335E => array(0x36, 0x70B9),
2198
+					0x335F => array(0x37, 0x70B9), 0x3360 => array(0x38, 0x70B9), 0x3361 => array(0x39, 0x70B9),
2199
+					0x3362 => array(0x31, 0x30, 0x70B9), 0x3363 => array(0x31, 0x31, 0x70B9), 0x3364 => array(0x31, 0x32, 0x70B9),
2200
+					0x3365 => array(0x31, 0x33, 0x70B9), 0x3366 => array(0x31, 0x34, 0x70B9), 0x3367 => array(0x31, 0x35, 0x70B9),
2201
+					0x3368 => array(0x31, 0x36, 0x70B9), 0x3369 => array(0x31, 0x37, 0x70B9), 0x336A => array(0x31, 0x38, 0x70B9),
2202
+					0x336B => array(0x31, 0x39, 0x70B9), 0x336C => array(0x32, 0x30, 0x70B9), 0x336D => array(0x32, 0x31, 0x70B9),
2203
+					0x336E => array(0x32, 0x32, 0x70B9), 0x336F => array(0x32, 0x33, 0x70B9), 0x3370 => array(0x32, 0x34, 0x70B9),
2204
+					0x3371 => array(0x68, 0x70, 0x61), 0x3372 => array(0x64, 0x61), 0x3373 => array(0x61, 0x75),
2205
+					0x3374 => array(0x62, 0x61, 0x72), 0x3375 => array(0x6F, 0x76), 0x3376 => array(0x70, 0x63),
2206
+					0x3377 => array(0x64, 0x6D), 0x3378 => array(0x64, 0x6D, 0x32), 0x3379 => array(0x64, 0x6D, 0x33),
2207
+					0x337A => array(0x69, 0x75), 0x337B => array(0x5E73, 0x6210), 0x337C => array(0x662D, 0x548C),
2208
+					0x337D => array(0x5927, 0x6B63), 0x337E => array(0x660E, 0x6CBB), 0x337F => array(0x682A, 0x5F0F, 0x4F1A, 0x793E),
2209
+					0x3380 => array(0x70, 0x61), 0x3381 => array(0x6E, 0x61), 0x3382 => array(0x3BC, 0x61),
2210
+					0x3383 => array(0x6D, 0x61), 0x3384 => array(0x6B, 0x61), 0x3385 => array(0x6B, 0x62),
2211
+					0x3386 => array(0x6D, 0x62), 0x3387 => array(0x67, 0x62), 0x3388 => array(0x63, 0x61, 0x6C),
2212
+					0x3389 => array(0x6B, 0x63, 0x61, 0x6C), 0x338A => array(0x70, 0x66), 0x338B => array(0x6E, 0x66),
2213
+					0x338C => array(0x3BC, 0x66), 0x338D => array(0x3BC, 0x67), 0x338E => array(0x6D, 0x67),
2214
+					0x338F => array(0x6B, 0x67), 0x3390 => array(0x68, 0x7A), 0x3391 => array(0x6B, 0x68, 0x7A),
2215
+					0x3392 => array(0x6D, 0x68, 0x7A), 0x3393 => array(0x67, 0x68, 0x7A), 0x3394 => array(0x74, 0x68, 0x7A),
2216
+					0x3395 => array(0x3BC, 0x6C), 0x3396 => array(0x6D, 0x6C), 0x3397 => array(0x64, 0x6C),
2217
+					0x3398 => array(0x6B, 0x6C), 0x3399 => array(0x66, 0x6D), 0x339A => array(0x6E, 0x6D),
2218
+					0x339B => array(0x3BC, 0x6D), 0x339C => array(0x6D, 0x6D), 0x339D => array(0x63, 0x6D),
2219
+					0x339E => array(0x6B, 0x6D), 0x339F => array(0x6D, 0x6D, 0x32), 0x33A0 => array(0x63, 0x6D, 0x32),
2220
+					0x33A1 => array(0x6D, 0x32), 0x33A2 => array(0x6B, 0x6D, 0x32), 0x33A3 => array(0x6D, 0x6D, 0x33),
2221
+					0x33A4 => array(0x63, 0x6D, 0x33), 0x33A5 => array(0x6D, 0x33), 0x33A6 => array(0x6B, 0x6D, 0x33),
2222
+					0x33A7 => array(0x6D, 0x2215, 0x73), 0x33A8 => array(0x6D, 0x2215, 0x73, 0x32), 0x33A9 => array(0x70, 0x61),
2223
+					0x33AA => array(0x6B, 0x70, 0x61), 0x33AB => array(0x6D, 0x70, 0x61), 0x33AC => array(0x67, 0x70, 0x61),
2224
+					0x33AD => array(0x72, 0x61, 0x64), 0x33AE => array(0x72, 0x61, 0x64, 0x2215, 0x73), 0x33AF => array(0x72, 0x61, 0x64, 0x2215, 0x73, 0x32),
2225
+					0x33B0 => array(0x70, 0x73), 0x33B1 => array(0x6E, 0x73), 0x33B2 => array(0x3BC, 0x73),
2226
+					0x33B3 => array(0x6D, 0x73), 0x33B4 => array(0x70, 0x76), 0x33B5 => array(0x6E, 0x76),
2227
+					0x33B6 => array(0x3BC, 0x76), 0x33B7 => array(0x6D, 0x76), 0x33B8 => array(0x6B, 0x76),
2228
+					0x33B9 => array(0x6D, 0x76), 0x33BA => array(0x70, 0x77), 0x33BB => array(0x6E, 0x77),
2229
+					0x33BC => array(0x3BC, 0x77), 0x33BD => array(0x6D, 0x77), 0x33BE => array(0x6B, 0x77),
2230
+					0x33BF => array(0x6D, 0x77), 0x33C0 => array(0x6B, 0x3C9), 0x33C1 => array(0x6D, 0x3C9),
2231
+					0x33C3 => array(0x62, 0x71), 0x33C4 => array(0x63, 0x63), 0x33C5 => array(0x63, 0x64),
2232
+					0x33C6 => array(0x63, 0x2215, 0x6B, 0x67), 0x33C8 => array(0x64, 0x62), 0x33C9 => array(0x67, 0x79),
2233
+					0x33CA => array(0x68, 0x61), 0x33CB => array(0x68, 0x70), 0x33CC => array(0x69, 0x6E),
2234
+					0x33CD => array(0x6B, 0x6B), 0x33CE => array(0x6B, 0x6D), 0x33CF => array(0x6B, 0x74),
2235
+					0x33D0 => array(0x6C, 0x6D), 0x33D1 => array(0x6C, 0x6E), 0x33D2 => array(0x6C, 0x6F, 0x67),
2236
+					0x33D3 => array(0x6C, 0x78), 0x33D4 => array(0x6D, 0x62), 0x33D5 => array(0x6D, 0x69, 0x6C),
2237
+					0x33D6 => array(0x6D, 0x6F, 0x6C), 0x33D7 => array(0x70, 0x68), 0x33D9 => array(0x70, 0x70, 0x6D),
2238
+					0x33DA => array(0x70, 0x72), 0x33DB => array(0x73, 0x72), 0x33DC => array(0x73, 0x76),
2239
+					0x33DD => array(0x77, 0x62), 0x33DE => array(0x76, 0x2215, 0x6D), 0x33DF => array(0x61, 0x2215, 0x6D),
2240
+					0x33E0 => array(0x31, 0x65E5), 0x33E1 => array(0x32, 0x65E5), 0x33E2 => array(0x33, 0x65E5),
2241
+					0x33E3 => array(0x34, 0x65E5), 0x33E4 => array(0x35, 0x65E5), 0x33E5 => array(0x36, 0x65E5),
2242
+					0x33E6 => array(0x37, 0x65E5), 0x33E7 => array(0x38, 0x65E5), 0x33E8 => array(0x39, 0x65E5),
2243
+					0x33E9 => array(0x31, 0x30, 0x65E5), 0x33EA => array(0x31, 0x31, 0x65E5), 0x33EB => array(0x31, 0x32, 0x65E5),
2244
+					0x33EC => array(0x31, 0x33, 0x65E5), 0x33ED => array(0x31, 0x34, 0x65E5), 0x33EE => array(0x31, 0x35, 0x65E5),
2245
+					0x33EF => array(0x31, 0x36, 0x65E5), 0x33F0 => array(0x31, 0x37, 0x65E5), 0x33F1 => array(0x31, 0x38, 0x65E5),
2246
+					0x33F2 => array(0x31, 0x39, 0x65E5), 0x33F3 => array(0x32, 0x30, 0x65E5), 0x33F4 => array(0x32, 0x31, 0x65E5),
2247
+					0x33F5 => array(0x32, 0x32, 0x65E5), 0x33F6 => array(0x32, 0x33, 0x65E5), 0x33F7 => array(0x32, 0x34, 0x65E5),
2248
+					0x33F8 => array(0x32, 0x35, 0x65E5), 0x33F9 => array(0x32, 0x36, 0x65E5), 0x33FA => array(0x32, 0x37, 0x65E5),
2249
+					0x33FB => array(0x32, 0x38, 0x65E5), 0x33FC => array(0x32, 0x39, 0x65E5), 0x33FD => array(0x33, 0x30, 0x65E5),
2250
+					0x33FE => array(0x33, 0x31, 0x65E5), 0x33FF => array(0x67, 0x61, 0x6C), 0xA640 => array(0xA641),
2251
+					0xA642 => array(0xA643), 0xA644 => array(0xA645), 0xA646 => array(0xA647),
2252
+					0xA648 => array(0xA649), 0xA64A => array(0xA64B), 0xA64C => array(0xA64D),
2253
+					0xA64E => array(0xA64F), 0xA650 => array(0xA651), 0xA652 => array(0xA653),
2254
+					0xA654 => array(0xA655), 0xA656 => array(0xA657), 0xA658 => array(0xA659),
2255
+					0xA65A => array(0xA65B), 0xA65C => array(0xA65D), 0xA65E => array(0xA65F),
2256
+					0xA660 => array(0xA661), 0xA662 => array(0xA663), 0xA664 => array(0xA665),
2257
+					0xA666 => array(0xA667), 0xA668 => array(0xA669), 0xA66A => array(0xA66B),
2258
+					0xA66C => array(0xA66D), 0xA680 => array(0xA681), 0xA682 => array(0xA683),
2259
+					0xA684 => array(0xA685), 0xA686 => array(0xA687), 0xA688 => array(0xA689),
2260
+					0xA68A => array(0xA68B), 0xA68C => array(0xA68D), 0xA68E => array(0xA68F),
2261
+					0xA690 => array(0xA691), 0xA692 => array(0xA693), 0xA694 => array(0xA695),
2262
+					0xA696 => array(0xA697), 0xA698 => array(0xA699), 0xA69A => array(0xA69B),
2263
+					0xA69C => array(0x44A), 0xA69D => array(0x44C), 0xA722 => array(0xA723),
2264
+					0xA724 => array(0xA725), 0xA726 => array(0xA727), 0xA728 => array(0xA729),
2265
+					0xA72A => array(0xA72B), 0xA72C => array(0xA72D), 0xA72E => array(0xA72F),
2266
+					0xA732 => array(0xA733), 0xA734 => array(0xA735), 0xA736 => array(0xA737),
2267
+					0xA738 => array(0xA739), 0xA73A => array(0xA73B), 0xA73C => array(0xA73D),
2268
+					0xA73E => array(0xA73F), 0xA740 => array(0xA741), 0xA742 => array(0xA743),
2269
+					0xA744 => array(0xA745), 0xA746 => array(0xA747), 0xA748 => array(0xA749),
2270
+					0xA74A => array(0xA74B), 0xA74C => array(0xA74D), 0xA74E => array(0xA74F),
2271
+					0xA750 => array(0xA751), 0xA752 => array(0xA753), 0xA754 => array(0xA755),
2272
+					0xA756 => array(0xA757), 0xA758 => array(0xA759), 0xA75A => array(0xA75B),
2273
+					0xA75C => array(0xA75D), 0xA75E => array(0xA75F), 0xA760 => array(0xA761),
2274
+					0xA762 => array(0xA763), 0xA764 => array(0xA765), 0xA766 => array(0xA767),
2275
+					0xA768 => array(0xA769), 0xA76A => array(0xA76B), 0xA76C => array(0xA76D),
2276
+					0xA76E => array(0xA76F), 0xA770 => array(0xA76F), 0xA779 => array(0xA77A),
2277
+					0xA77B => array(0xA77C), 0xA77D => array(0x1D79), 0xA77E => array(0xA77F),
2278
+					0xA780 => array(0xA781), 0xA782 => array(0xA783), 0xA784 => array(0xA785),
2279
+					0xA786 => array(0xA787), 0xA78B => array(0xA78C), 0xA78D => array(0x265),
2280
+					0xA790 => array(0xA791), 0xA792 => array(0xA793), 0xA796 => array(0xA797),
2281
+					0xA798 => array(0xA799), 0xA79A => array(0xA79B), 0xA79C => array(0xA79D),
2282
+					0xA79E => array(0xA79F), 0xA7A0 => array(0xA7A1), 0xA7A2 => array(0xA7A3),
2283
+					0xA7A4 => array(0xA7A5), 0xA7A6 => array(0xA7A7), 0xA7A8 => array(0xA7A9),
2284
+					0xA7AA => array(0x266), 0xA7AB => array(0x25C), 0xA7AC => array(0x261),
2285
+					0xA7AD => array(0x26C), 0xA7B0 => array(0x29E), 0xA7B1 => array(0x287),
2286
+					0xA7F8 => array(0x127), 0xA7F9 => array(0x153), 0xAB5C => array(0xA727),
2287
+					0xAB5D => array(0xAB37), 0xAB5E => array(0x26B), 0xAB5F => array(0xAB52),
2288
+					0xF900 => array(0x8C48), 0xF901 => array(0x66F4), 0xF902 => array(0x8ECA),
2289
+					0xF903 => array(0x8CC8), 0xF904 => array(0x6ED1), 0xF905 => array(0x4E32),
2290
+					0xF906 => array(0x53E5), 0xF907 => array(0x9F9C), 0xF908 => array(0x9F9C),
2291
+					0xF909 => array(0x5951), 0xF90A => array(0x91D1), 0xF90B => array(0x5587),
2292
+					0xF90C => array(0x5948), 0xF90D => array(0x61F6), 0xF90E => array(0x7669),
2293
+					0xF90F => array(0x7F85), 0xF910 => array(0x863F), 0xF911 => array(0x87BA),
2294
+					0xF912 => array(0x88F8), 0xF913 => array(0x908F), 0xF914 => array(0x6A02),
2295
+					0xF915 => array(0x6D1B), 0xF916 => array(0x70D9), 0xF917 => array(0x73DE),
2296
+					0xF918 => array(0x843D), 0xF919 => array(0x916A), 0xF91A => array(0x99F1),
2297
+					0xF91B => array(0x4E82), 0xF91C => array(0x5375), 0xF91D => array(0x6B04),
2298
+					0xF91E => array(0x721B), 0xF91F => array(0x862D), 0xF920 => array(0x9E1E),
2299
+					0xF921 => array(0x5D50), 0xF922 => array(0x6FEB), 0xF923 => array(0x85CD),
2300
+					0xF924 => array(0x8964), 0xF925 => array(0x62C9), 0xF926 => array(0x81D8),
2301
+					0xF927 => array(0x881F), 0xF928 => array(0x5ECA), 0xF929 => array(0x6717),
2302
+					0xF92A => array(0x6D6A), 0xF92B => array(0x72FC), 0xF92C => array(0x90CE),
2303
+					0xF92D => array(0x4F86), 0xF92E => array(0x51B7), 0xF92F => array(0x52DE),
2304
+					0xF930 => array(0x64C4), 0xF931 => array(0x6AD3), 0xF932 => array(0x7210),
2305
+					0xF933 => array(0x76E7), 0xF934 => array(0x8001), 0xF935 => array(0x8606),
2306
+					0xF936 => array(0x865C), 0xF937 => array(0x8DEF), 0xF938 => array(0x9732),
2307
+					0xF939 => array(0x9B6F), 0xF93A => array(0x9DFA), 0xF93B => array(0x788C),
2308
+					0xF93C => array(0x797F), 0xF93D => array(0x7DA0), 0xF93E => array(0x83C9),
2309
+					0xF93F => array(0x9304), 0xF940 => array(0x9E7F), 0xF941 => array(0x8AD6),
2310
+					0xF942 => array(0x58DF), 0xF943 => array(0x5F04), 0xF944 => array(0x7C60),
2311
+					0xF945 => array(0x807E), 0xF946 => array(0x7262), 0xF947 => array(0x78CA),
2312
+					0xF948 => array(0x8CC2), 0xF949 => array(0x96F7), 0xF94A => array(0x58D8),
2313
+					0xF94B => array(0x5C62), 0xF94C => array(0x6A13), 0xF94D => array(0x6DDA),
2314
+					0xF94E => array(0x6F0F), 0xF94F => array(0x7D2F), 0xF950 => array(0x7E37),
2315
+					0xF951 => array(0x964B), 0xF952 => array(0x52D2), 0xF953 => array(0x808B),
2316
+					0xF954 => array(0x51DC), 0xF955 => array(0x51CC), 0xF956 => array(0x7A1C),
2317
+					0xF957 => array(0x7DBE), 0xF958 => array(0x83F1), 0xF959 => array(0x9675),
2318
+					0xF95A => array(0x8B80), 0xF95B => array(0x62CF), 0xF95C => array(0x6A02),
2319
+					0xF95D => array(0x8AFE), 0xF95E => array(0x4E39), 0xF95F => array(0x5BE7),
2320
+					0xF960 => array(0x6012), 0xF961 => array(0x7387), 0xF962 => array(0x7570),
2321
+					0xF963 => array(0x5317), 0xF964 => array(0x78FB), 0xF965 => array(0x4FBF),
2322
+					0xF966 => array(0x5FA9), 0xF967 => array(0x4E0D), 0xF968 => array(0x6CCC),
2323
+					0xF969 => array(0x6578), 0xF96A => array(0x7D22), 0xF96B => array(0x53C3),
2324
+					0xF96C => array(0x585E), 0xF96D => array(0x7701), 0xF96E => array(0x8449),
2325
+					0xF96F => array(0x8AAA), 0xF970 => array(0x6BBA), 0xF971 => array(0x8FB0),
2326
+					0xF972 => array(0x6C88), 0xF973 => array(0x62FE), 0xF974 => array(0x82E5),
2327
+					0xF975 => array(0x63A0), 0xF976 => array(0x7565), 0xF977 => array(0x4EAE),
2328
+					0xF978 => array(0x5169), 0xF979 => array(0x51C9), 0xF97A => array(0x6881),
2329
+					0xF97B => array(0x7CE7), 0xF97C => array(0x826F), 0xF97D => array(0x8AD2),
2330
+					0xF97E => array(0x91CF), 0xF97F => array(0x52F5), 0xF980 => array(0x5442),
2331
+					0xF981 => array(0x5973), 0xF982 => array(0x5EEC), 0xF983 => array(0x65C5),
2332
+					0xF984 => array(0x6FFE), 0xF985 => array(0x792A), 0xF986 => array(0x95AD),
2333
+					0xF987 => array(0x9A6A), 0xF988 => array(0x9E97), 0xF989 => array(0x9ECE),
2334
+					0xF98A => array(0x529B), 0xF98B => array(0x66C6), 0xF98C => array(0x6B77),
2335
+					0xF98D => array(0x8F62), 0xF98E => array(0x5E74), 0xF98F => array(0x6190),
2336
+					0xF990 => array(0x6200), 0xF991 => array(0x649A), 0xF992 => array(0x6F23),
2337
+					0xF993 => array(0x7149), 0xF994 => array(0x7489), 0xF995 => array(0x79CA),
2338
+					0xF996 => array(0x7DF4), 0xF997 => array(0x806F), 0xF998 => array(0x8F26),
2339
+					0xF999 => array(0x84EE), 0xF99A => array(0x9023), 0xF99B => array(0x934A),
2340
+					0xF99C => array(0x5217), 0xF99D => array(0x52A3), 0xF99E => array(0x54BD),
2341
+					0xF99F => array(0x70C8), 0xF9A0 => array(0x88C2), 0xF9A1 => array(0x8AAA),
2342
+					0xF9A2 => array(0x5EC9), 0xF9A3 => array(0x5FF5), 0xF9A4 => array(0x637B),
2343
+					0xF9A5 => array(0x6BAE), 0xF9A6 => array(0x7C3E), 0xF9A7 => array(0x7375),
2344
+					0xF9A8 => array(0x4EE4), 0xF9A9 => array(0x56F9), 0xF9AA => array(0x5BE7),
2345
+					0xF9AB => array(0x5DBA), 0xF9AC => array(0x601C), 0xF9AD => array(0x73B2),
2346
+					0xF9AE => array(0x7469), 0xF9AF => array(0x7F9A), 0xF9B0 => array(0x8046),
2347
+					0xF9B1 => array(0x9234), 0xF9B2 => array(0x96F6), 0xF9B3 => array(0x9748),
2348
+					0xF9B4 => array(0x9818), 0xF9B5 => array(0x4F8B), 0xF9B6 => array(0x79AE),
2349
+					0xF9B7 => array(0x91B4), 0xF9B8 => array(0x96B8), 0xF9B9 => array(0x60E1),
2350
+					0xF9BA => array(0x4E86), 0xF9BB => array(0x50DA), 0xF9BC => array(0x5BEE),
2351
+					0xF9BD => array(0x5C3F), 0xF9BE => array(0x6599), 0xF9BF => array(0x6A02),
2352
+					0xF9C0 => array(0x71CE), 0xF9C1 => array(0x7642), 0xF9C2 => array(0x84FC),
2353
+					0xF9C3 => array(0x907C), 0xF9C4 => array(0x9F8D), 0xF9C5 => array(0x6688),
2354
+					0xF9C6 => array(0x962E), 0xF9C7 => array(0x5289), 0xF9C8 => array(0x677B),
2355
+					0xF9C9 => array(0x67F3), 0xF9CA => array(0x6D41), 0xF9CB => array(0x6E9C),
2356
+					0xF9CC => array(0x7409), 0xF9CD => array(0x7559), 0xF9CE => array(0x786B),
2357
+					0xF9CF => array(0x7D10), 0xF9D0 => array(0x985E), 0xF9D1 => array(0x516D),
2358
+					0xF9D2 => array(0x622E), 0xF9D3 => array(0x9678), 0xF9D4 => array(0x502B),
2359
+					0xF9D5 => array(0x5D19), 0xF9D6 => array(0x6DEA), 0xF9D7 => array(0x8F2A),
2360
+					0xF9D8 => array(0x5F8B), 0xF9D9 => array(0x6144), 0xF9DA => array(0x6817),
2361
+					0xF9DB => array(0x7387), 0xF9DC => array(0x9686), 0xF9DD => array(0x5229),
2362
+					0xF9DE => array(0x540F), 0xF9DF => array(0x5C65), 0xF9E0 => array(0x6613),
2363
+					0xF9E1 => array(0x674E), 0xF9E2 => array(0x68A8), 0xF9E3 => array(0x6CE5),
2364
+					0xF9E4 => array(0x7406), 0xF9E5 => array(0x75E2), 0xF9E6 => array(0x7F79),
2365
+					0xF9E7 => array(0x88CF), 0xF9E8 => array(0x88E1), 0xF9E9 => array(0x91CC),
2366
+					0xF9EA => array(0x96E2), 0xF9EB => array(0x533F), 0xF9EC => array(0x6EBA),
2367
+					0xF9ED => array(0x541D), 0xF9EE => array(0x71D0), 0xF9EF => array(0x7498),
2368
+					0xF9F0 => array(0x85FA), 0xF9F1 => array(0x96A3), 0xF9F2 => array(0x9C57),
2369
+					0xF9F3 => array(0x9E9F), 0xF9F4 => array(0x6797), 0xF9F5 => array(0x6DCB),
2370
+					0xF9F6 => array(0x81E8), 0xF9F7 => array(0x7ACB), 0xF9F8 => array(0x7B20),
2371
+					0xF9F9 => array(0x7C92), 0xF9FA => array(0x72C0), 0xF9FB => array(0x7099),
2372
+					0xF9FC => array(0x8B58), 0xF9FD => array(0x4EC0), 0xF9FE => array(0x8336),
2373
+					0xF9FF => array(0x523A), 0xFA00 => array(0x5207), 0xFA01 => array(0x5EA6),
2374
+					0xFA02 => array(0x62D3), 0xFA03 => array(0x7CD6), 0xFA04 => array(0x5B85),
2375
+					0xFA05 => array(0x6D1E), 0xFA06 => array(0x66B4), 0xFA07 => array(0x8F3B),
2376
+					0xFA08 => array(0x884C), 0xFA09 => array(0x964D), 0xFA0A => array(0x898B),
2377
+					0xFA0B => array(0x5ED3), 0xFA0C => array(0x5140), 0xFA0D => array(0x55C0),
2378
+					0xFA10 => array(0x585A), 0xFA12 => array(0x6674), 0xFA15 => array(0x51DE),
2379
+					0xFA16 => array(0x732A), 0xFA17 => array(0x76CA), 0xFA18 => array(0x793C),
2380
+					0xFA19 => array(0x795E), 0xFA1A => array(0x7965), 0xFA1B => array(0x798F),
2381
+					0xFA1C => array(0x9756), 0xFA1D => array(0x7CBE), 0xFA1E => array(0x7FBD),
2382
+					0xFA20 => array(0x8612), 0xFA22 => array(0x8AF8), 0xFA25 => array(0x9038),
2383
+					0xFA26 => array(0x90FD), 0xFA2A => array(0x98EF), 0xFA2B => array(0x98FC),
2384
+					0xFA2C => array(0x9928), 0xFA2D => array(0x9DB4), 0xFA2E => array(0x90DE),
2385
+					0xFA2F => array(0x96B7), 0xFA30 => array(0x4FAE), 0xFA31 => array(0x50E7),
2386
+					0xFA32 => array(0x514D), 0xFA33 => array(0x52C9), 0xFA34 => array(0x52E4),
2387
+					0xFA35 => array(0x5351), 0xFA36 => array(0x559D), 0xFA37 => array(0x5606),
2388
+					0xFA38 => array(0x5668), 0xFA39 => array(0x5840), 0xFA3A => array(0x58A8),
2389
+					0xFA3B => array(0x5C64), 0xFA3C => array(0x5C6E), 0xFA3D => array(0x6094),
2390
+					0xFA3E => array(0x6168), 0xFA3F => array(0x618E), 0xFA40 => array(0x61F2),
2391
+					0xFA41 => array(0x654F), 0xFA42 => array(0x65E2), 0xFA43 => array(0x6691),
2392
+					0xFA44 => array(0x6885), 0xFA45 => array(0x6D77), 0xFA46 => array(0x6E1A),
2393
+					0xFA47 => array(0x6F22), 0xFA48 => array(0x716E), 0xFA49 => array(0x722B),
2394
+					0xFA4A => array(0x7422), 0xFA4B => array(0x7891), 0xFA4C => array(0x793E),
2395
+					0xFA4D => array(0x7949), 0xFA4E => array(0x7948), 0xFA4F => array(0x7950),
2396
+					0xFA50 => array(0x7956), 0xFA51 => array(0x795D), 0xFA52 => array(0x798D),
2397
+					0xFA53 => array(0x798E), 0xFA54 => array(0x7A40), 0xFA55 => array(0x7A81),
2398
+					0xFA56 => array(0x7BC0), 0xFA57 => array(0x7DF4), 0xFA58 => array(0x7E09),
2399
+					0xFA59 => array(0x7E41), 0xFA5A => array(0x7F72), 0xFA5B => array(0x8005),
2400
+					0xFA5C => array(0x81ED), 0xFA5D => array(0x8279), 0xFA5E => array(0x8279),
2401
+					0xFA5F => array(0x8457), 0xFA60 => array(0x8910), 0xFA61 => array(0x8996),
2402
+					0xFA62 => array(0x8B01), 0xFA63 => array(0x8B39), 0xFA64 => array(0x8CD3),
2403
+					0xFA65 => array(0x8D08), 0xFA66 => array(0x8FB6), 0xFA67 => array(0x9038),
2404
+					0xFA68 => array(0x96E3), 0xFA69 => array(0x97FF), 0xFA6A => array(0x983B),
2405
+					0xFA6B => array(0x6075), 0xFA6C => array(0x242EE), 0xFA6D => array(0x8218),
2406
+					0xFA70 => array(0x4E26), 0xFA71 => array(0x51B5), 0xFA72 => array(0x5168),
2407
+					0xFA73 => array(0x4F80), 0xFA74 => array(0x5145), 0xFA75 => array(0x5180),
2408
+					0xFA76 => array(0x52C7), 0xFA77 => array(0x52FA), 0xFA78 => array(0x559D),
2409
+					0xFA79 => array(0x5555), 0xFA7A => array(0x5599), 0xFA7B => array(0x55E2),
2410
+					0xFA7C => array(0x585A), 0xFA7D => array(0x58B3), 0xFA7E => array(0x5944),
2411
+					0xFA7F => array(0x5954), 0xFA80 => array(0x5A62), 0xFA81 => array(0x5B28),
2412
+					0xFA82 => array(0x5ED2), 0xFA83 => array(0x5ED9), 0xFA84 => array(0x5F69),
2413
+					0xFA85 => array(0x5FAD), 0xFA86 => array(0x60D8), 0xFA87 => array(0x614E),
2414
+					0xFA88 => array(0x6108), 0xFA89 => array(0x618E), 0xFA8A => array(0x6160),
2415
+					0xFA8B => array(0x61F2), 0xFA8C => array(0x6234), 0xFA8D => array(0x63C4),
2416
+					0xFA8E => array(0x641C), 0xFA8F => array(0x6452), 0xFA90 => array(0x6556),
2417
+					0xFA91 => array(0x6674), 0xFA92 => array(0x6717), 0xFA93 => array(0x671B),
2418
+					0xFA94 => array(0x6756), 0xFA95 => array(0x6B79), 0xFA96 => array(0x6BBA),
2419
+					0xFA97 => array(0x6D41), 0xFA98 => array(0x6EDB), 0xFA99 => array(0x6ECB),
2420
+					0xFA9A => array(0x6F22), 0xFA9B => array(0x701E), 0xFA9C => array(0x716E),
2421
+					0xFA9D => array(0x77A7), 0xFA9E => array(0x7235), 0xFA9F => array(0x72AF),
2422
+					0xFAA0 => array(0x732A), 0xFAA1 => array(0x7471), 0xFAA2 => array(0x7506),
2423
+					0xFAA3 => array(0x753B), 0xFAA4 => array(0x761D), 0xFAA5 => array(0x761F),
2424
+					0xFAA6 => array(0x76CA), 0xFAA7 => array(0x76DB), 0xFAA8 => array(0x76F4),
2425
+					0xFAA9 => array(0x774A), 0xFAAA => array(0x7740), 0xFAAB => array(0x78CC),
2426
+					0xFAAC => array(0x7AB1), 0xFAAD => array(0x7BC0), 0xFAAE => array(0x7C7B),
2427
+					0xFAAF => array(0x7D5B), 0xFAB0 => array(0x7DF4), 0xFAB1 => array(0x7F3E),
2428
+					0xFAB2 => array(0x8005), 0xFAB3 => array(0x8352), 0xFAB4 => array(0x83EF),
2429
+					0xFAB5 => array(0x8779), 0xFAB6 => array(0x8941), 0xFAB7 => array(0x8986),
2430
+					0xFAB8 => array(0x8996), 0xFAB9 => array(0x8ABF), 0xFABA => array(0x8AF8),
2431
+					0xFABB => array(0x8ACB), 0xFABC => array(0x8B01), 0xFABD => array(0x8AFE),
2432
+					0xFABE => array(0x8AED), 0xFABF => array(0x8B39), 0xFAC0 => array(0x8B8A),
2433
+					0xFAC1 => array(0x8D08), 0xFAC2 => array(0x8F38), 0xFAC3 => array(0x9072),
2434
+					0xFAC4 => array(0x9199), 0xFAC5 => array(0x9276), 0xFAC6 => array(0x967C),
2435
+					0xFAC7 => array(0x96E3), 0xFAC8 => array(0x9756), 0xFAC9 => array(0x97DB),
2436
+					0xFACA => array(0x97FF), 0xFACB => array(0x980B), 0xFACC => array(0x983B),
2437
+					0xFACD => array(0x9B12), 0xFACE => array(0x9F9C), 0xFACF => array(0x2284A),
2438
+					0xFAD0 => array(0x22844), 0xFAD1 => array(0x233D5), 0xFAD2 => array(0x3B9D),
2439
+					0xFAD3 => array(0x4018), 0xFAD4 => array(0x4039), 0xFAD5 => array(0x25249),
2440
+					0xFAD6 => array(0x25CD0), 0xFAD7 => array(0x27ED3), 0xFAD8 => array(0x9F43),
2441
+					0xFAD9 => array(0x9F8E), 0xFB00 => array(0x66, 0x66), 0xFB01 => array(0x66, 0x69),
2442
+					0xFB02 => array(0x66, 0x6C), 0xFB03 => array(0x66, 0x66, 0x69), 0xFB04 => array(0x66, 0x66, 0x6C),
2443
+					0xFB05 => array(0x73, 0x74), 0xFB06 => array(0x73, 0x74), 0xFB13 => array(0x574, 0x576),
2444
+					0xFB14 => array(0x574, 0x565), 0xFB15 => array(0x574, 0x56B), 0xFB16 => array(0x57E, 0x576),
2445
+					0xFB17 => array(0x574, 0x56D), 0xFB1D => array(0x5D9, 0x5B4), 0xFB1F => array(0x5F2, 0x5B7),
2446
+					0xFB20 => array(0x5E2), 0xFB21 => array(0x5D0), 0xFB22 => array(0x5D3),
2447
+					0xFB23 => array(0x5D4), 0xFB24 => array(0x5DB), 0xFB25 => array(0x5DC),
2448
+					0xFB26 => array(0x5DD), 0xFB27 => array(0x5E8), 0xFB28 => array(0x5EA),
2449
+					0xFB2A => array(0x5E9, 0x5C1), 0xFB2B => array(0x5E9, 0x5C2), 0xFB2C => array(0x5E9, 0x5BC, 0x5C1),
2450
+					0xFB2D => array(0x5E9, 0x5BC, 0x5C2), 0xFB2E => array(0x5D0, 0x5B7), 0xFB2F => array(0x5D0, 0x5B8),
2451
+					0xFB30 => array(0x5D0, 0x5BC), 0xFB31 => array(0x5D1, 0x5BC), 0xFB32 => array(0x5D2, 0x5BC),
2452
+					0xFB33 => array(0x5D3, 0x5BC), 0xFB34 => array(0x5D4, 0x5BC), 0xFB35 => array(0x5D5, 0x5BC),
2453
+					0xFB36 => array(0x5D6, 0x5BC), 0xFB38 => array(0x5D8, 0x5BC), 0xFB39 => array(0x5D9, 0x5BC),
2454
+					0xFB3A => array(0x5DA, 0x5BC), 0xFB3B => array(0x5DB, 0x5BC), 0xFB3C => array(0x5DC, 0x5BC),
2455
+					0xFB3E => array(0x5DE, 0x5BC), 0xFB40 => array(0x5E0, 0x5BC), 0xFB41 => array(0x5E1, 0x5BC),
2456
+					0xFB43 => array(0x5E3, 0x5BC), 0xFB44 => array(0x5E4, 0x5BC), 0xFB46 => array(0x5E6, 0x5BC),
2457
+					0xFB47 => array(0x5E7, 0x5BC), 0xFB48 => array(0x5E8, 0x5BC), 0xFB49 => array(0x5E9, 0x5BC),
2458
+					0xFB4A => array(0x5EA, 0x5BC), 0xFB4B => array(0x5D5, 0x5B9), 0xFB4C => array(0x5D1, 0x5BF),
2459
+					0xFB4D => array(0x5DB, 0x5BF), 0xFB4E => array(0x5E4, 0x5BF), 0xFB4F => array(0x5D0, 0x5DC),
2460
+					0xFB50 => array(0x671), 0xFB51 => array(0x671), 0xFB52 => array(0x67B),
2461
+					0xFB53 => array(0x67B), 0xFB54 => array(0x67B), 0xFB55 => array(0x67B),
2462
+					0xFB56 => array(0x67E), 0xFB57 => array(0x67E), 0xFB58 => array(0x67E),
2463
+					0xFB59 => array(0x67E), 0xFB5A => array(0x680), 0xFB5B => array(0x680),
2464
+					0xFB5C => array(0x680), 0xFB5D => array(0x680), 0xFB5E => array(0x67A),
2465
+					0xFB5F => array(0x67A), 0xFB60 => array(0x67A), 0xFB61 => array(0x67A),
2466
+					0xFB62 => array(0x67F), 0xFB63 => array(0x67F), 0xFB64 => array(0x67F),
2467
+					0xFB65 => array(0x67F), 0xFB66 => array(0x679), 0xFB67 => array(0x679),
2468
+					0xFB68 => array(0x679), 0xFB69 => array(0x679), 0xFB6A => array(0x6A4),
2469
+					0xFB6B => array(0x6A4), 0xFB6C => array(0x6A4), 0xFB6D => array(0x6A4),
2470
+					0xFB6E => array(0x6A6), 0xFB6F => array(0x6A6), 0xFB70 => array(0x6A6),
2471
+					0xFB71 => array(0x6A6), 0xFB72 => array(0x684), 0xFB73 => array(0x684),
2472
+					0xFB74 => array(0x684), 0xFB75 => array(0x684), 0xFB76 => array(0x683),
2473
+					0xFB77 => array(0x683), 0xFB78 => array(0x683), 0xFB79 => array(0x683),
2474
+					0xFB7A => array(0x686), 0xFB7B => array(0x686), 0xFB7C => array(0x686),
2475
+					0xFB7D => array(0x686), 0xFB7E => array(0x687), 0xFB7F => array(0x687),
2476
+					0xFB80 => array(0x687), 0xFB81 => array(0x687), 0xFB82 => array(0x68D),
2477
+					0xFB83 => array(0x68D), 0xFB84 => array(0x68C), 0xFB85 => array(0x68C),
2478
+					0xFB86 => array(0x68E), 0xFB87 => array(0x68E), 0xFB88 => array(0x688),
2479
+					0xFB89 => array(0x688), 0xFB8A => array(0x698), 0xFB8B => array(0x698),
2480
+					0xFB8C => array(0x691), 0xFB8D => array(0x691), 0xFB8E => array(0x6A9),
2481
+					0xFB8F => array(0x6A9), 0xFB90 => array(0x6A9), 0xFB91 => array(0x6A9),
2482
+					0xFB92 => array(0x6AF), 0xFB93 => array(0x6AF), 0xFB94 => array(0x6AF),
2483
+					0xFB95 => array(0x6AF), 0xFB96 => array(0x6B3), 0xFB97 => array(0x6B3),
2484
+					0xFB98 => array(0x6B3), 0xFB99 => array(0x6B3), 0xFB9A => array(0x6B1),
2485
+					0xFB9B => array(0x6B1), 0xFB9C => array(0x6B1), 0xFB9D => array(0x6B1),
2486
+					0xFB9E => array(0x6BA), 0xFB9F => array(0x6BA), 0xFBA0 => array(0x6BB),
2487
+					0xFBA1 => array(0x6BB), 0xFBA2 => array(0x6BB), 0xFBA3 => array(0x6BB),
2488
+					0xFBA4 => array(0x6C0), 0xFBA5 => array(0x6C0), 0xFBA6 => array(0x6C1),
2489
+					0xFBA7 => array(0x6C1), 0xFBA8 => array(0x6C1), 0xFBA9 => array(0x6C1),
2490
+					0xFBAA => array(0x6BE), 0xFBAB => array(0x6BE), 0xFBAC => array(0x6BE),
2491
+					0xFBAD => array(0x6BE), 0xFBAE => array(0x6D2), 0xFBAF => array(0x6D2),
2492
+					0xFBB0 => array(0x6D3), 0xFBB1 => array(0x6D3), 0xFBD3 => array(0x6AD),
2493
+					0xFBD4 => array(0x6AD), 0xFBD5 => array(0x6AD), 0xFBD6 => array(0x6AD),
2494
+					0xFBD7 => array(0x6C7), 0xFBD8 => array(0x6C7), 0xFBD9 => array(0x6C6),
2495
+					0xFBDA => array(0x6C6), 0xFBDB => array(0x6C8), 0xFBDC => array(0x6C8),
2496
+					0xFBDD => array(0x6C7, 0x674), 0xFBDE => array(0x6CB), 0xFBDF => array(0x6CB),
2497
+					0xFBE0 => array(0x6C5), 0xFBE1 => array(0x6C5), 0xFBE2 => array(0x6C9),
2498
+					0xFBE3 => array(0x6C9), 0xFBE4 => array(0x6D0), 0xFBE5 => array(0x6D0),
2499
+					0xFBE6 => array(0x6D0), 0xFBE7 => array(0x6D0), 0xFBE8 => array(0x649),
2500
+					0xFBE9 => array(0x649), 0xFBEA => array(0x626, 0x627), 0xFBEB => array(0x626, 0x627),
2501
+					0xFBEC => array(0x626, 0x6D5), 0xFBED => array(0x626, 0x6D5), 0xFBEE => array(0x626, 0x648),
2502
+					0xFBEF => array(0x626, 0x648), 0xFBF0 => array(0x626, 0x6C7), 0xFBF1 => array(0x626, 0x6C7),
2503
+					0xFBF2 => array(0x626, 0x6C6), 0xFBF3 => array(0x626, 0x6C6), 0xFBF4 => array(0x626, 0x6C8),
2504
+					0xFBF5 => array(0x626, 0x6C8), 0xFBF6 => array(0x626, 0x6D0), 0xFBF7 => array(0x626, 0x6D0),
2505
+					0xFBF8 => array(0x626, 0x6D0), 0xFBF9 => array(0x626, 0x649), 0xFBFA => array(0x626, 0x649),
2506
+					0xFBFB => array(0x626, 0x649), 0xFBFC => array(0x6CC), 0xFBFD => array(0x6CC),
2507
+					0xFBFE => array(0x6CC), 0xFBFF => array(0x6CC), 0xFC00 => array(0x626, 0x62C),
2508
+					0xFC01 => array(0x626, 0x62D), 0xFC02 => array(0x626, 0x645), 0xFC03 => array(0x626, 0x649),
2509
+					0xFC04 => array(0x626, 0x64A), 0xFC05 => array(0x628, 0x62C), 0xFC06 => array(0x628, 0x62D),
2510
+					0xFC07 => array(0x628, 0x62E), 0xFC08 => array(0x628, 0x645), 0xFC09 => array(0x628, 0x649),
2511
+					0xFC0A => array(0x628, 0x64A), 0xFC0B => array(0x62A, 0x62C), 0xFC0C => array(0x62A, 0x62D),
2512
+					0xFC0D => array(0x62A, 0x62E), 0xFC0E => array(0x62A, 0x645), 0xFC0F => array(0x62A, 0x649),
2513
+					0xFC10 => array(0x62A, 0x64A), 0xFC11 => array(0x62B, 0x62C), 0xFC12 => array(0x62B, 0x645),
2514
+					0xFC13 => array(0x62B, 0x649), 0xFC14 => array(0x62B, 0x64A), 0xFC15 => array(0x62C, 0x62D),
2515
+					0xFC16 => array(0x62C, 0x645), 0xFC17 => array(0x62D, 0x62C), 0xFC18 => array(0x62D, 0x645),
2516
+					0xFC19 => array(0x62E, 0x62C), 0xFC1A => array(0x62E, 0x62D), 0xFC1B => array(0x62E, 0x645),
2517
+					0xFC1C => array(0x633, 0x62C), 0xFC1D => array(0x633, 0x62D), 0xFC1E => array(0x633, 0x62E),
2518
+					0xFC1F => array(0x633, 0x645), 0xFC20 => array(0x635, 0x62D), 0xFC21 => array(0x635, 0x645),
2519
+					0xFC22 => array(0x636, 0x62C), 0xFC23 => array(0x636, 0x62D), 0xFC24 => array(0x636, 0x62E),
2520
+					0xFC25 => array(0x636, 0x645), 0xFC26 => array(0x637, 0x62D), 0xFC27 => array(0x637, 0x645),
2521
+					0xFC28 => array(0x638, 0x645), 0xFC29 => array(0x639, 0x62C), 0xFC2A => array(0x639, 0x645),
2522
+					0xFC2B => array(0x63A, 0x62C), 0xFC2C => array(0x63A, 0x645), 0xFC2D => array(0x641, 0x62C),
2523
+					0xFC2E => array(0x641, 0x62D), 0xFC2F => array(0x641, 0x62E), 0xFC30 => array(0x641, 0x645),
2524
+					0xFC31 => array(0x641, 0x649), 0xFC32 => array(0x641, 0x64A), 0xFC33 => array(0x642, 0x62D),
2525
+					0xFC34 => array(0x642, 0x645), 0xFC35 => array(0x642, 0x649), 0xFC36 => array(0x642, 0x64A),
2526
+					0xFC37 => array(0x643, 0x627), 0xFC38 => array(0x643, 0x62C), 0xFC39 => array(0x643, 0x62D),
2527
+					0xFC3A => array(0x643, 0x62E), 0xFC3B => array(0x643, 0x644), 0xFC3C => array(0x643, 0x645),
2528
+					0xFC3D => array(0x643, 0x649), 0xFC3E => array(0x643, 0x64A), 0xFC3F => array(0x644, 0x62C),
2529
+					0xFC40 => array(0x644, 0x62D), 0xFC41 => array(0x644, 0x62E), 0xFC42 => array(0x644, 0x645),
2530
+					0xFC43 => array(0x644, 0x649), 0xFC44 => array(0x644, 0x64A), 0xFC45 => array(0x645, 0x62C),
2531
+					0xFC46 => array(0x645, 0x62D), 0xFC47 => array(0x645, 0x62E), 0xFC48 => array(0x645, 0x645),
2532
+					0xFC49 => array(0x645, 0x649), 0xFC4A => array(0x645, 0x64A), 0xFC4B => array(0x646, 0x62C),
2533
+					0xFC4C => array(0x646, 0x62D), 0xFC4D => array(0x646, 0x62E), 0xFC4E => array(0x646, 0x645),
2534
+					0xFC4F => array(0x646, 0x649), 0xFC50 => array(0x646, 0x64A), 0xFC51 => array(0x647, 0x62C),
2535
+					0xFC52 => array(0x647, 0x645), 0xFC53 => array(0x647, 0x649), 0xFC54 => array(0x647, 0x64A),
2536
+					0xFC55 => array(0x64A, 0x62C), 0xFC56 => array(0x64A, 0x62D), 0xFC57 => array(0x64A, 0x62E),
2537
+					0xFC58 => array(0x64A, 0x645), 0xFC59 => array(0x64A, 0x649), 0xFC5A => array(0x64A, 0x64A),
2538
+					0xFC5B => array(0x630, 0x670), 0xFC5C => array(0x631, 0x670), 0xFC5D => array(0x649, 0x670),
2539
+					0xFC64 => array(0x626, 0x631), 0xFC65 => array(0x626, 0x632), 0xFC66 => array(0x626, 0x645),
2540
+					0xFC67 => array(0x626, 0x646), 0xFC68 => array(0x626, 0x649), 0xFC69 => array(0x626, 0x64A),
2541
+					0xFC6A => array(0x628, 0x631), 0xFC6B => array(0x628, 0x632), 0xFC6C => array(0x628, 0x645),
2542
+					0xFC6D => array(0x628, 0x646), 0xFC6E => array(0x628, 0x649), 0xFC6F => array(0x628, 0x64A),
2543
+					0xFC70 => array(0x62A, 0x631), 0xFC71 => array(0x62A, 0x632), 0xFC72 => array(0x62A, 0x645),
2544
+					0xFC73 => array(0x62A, 0x646), 0xFC74 => array(0x62A, 0x649), 0xFC75 => array(0x62A, 0x64A),
2545
+					0xFC76 => array(0x62B, 0x631), 0xFC77 => array(0x62B, 0x632), 0xFC78 => array(0x62B, 0x645),
2546
+					0xFC79 => array(0x62B, 0x646), 0xFC7A => array(0x62B, 0x649), 0xFC7B => array(0x62B, 0x64A),
2547
+					0xFC7C => array(0x641, 0x649), 0xFC7D => array(0x641, 0x64A), 0xFC7E => array(0x642, 0x649),
2548
+					0xFC7F => array(0x642, 0x64A), 0xFC80 => array(0x643, 0x627), 0xFC81 => array(0x643, 0x644),
2549
+					0xFC82 => array(0x643, 0x645), 0xFC83 => array(0x643, 0x649), 0xFC84 => array(0x643, 0x64A),
2550
+					0xFC85 => array(0x644, 0x645), 0xFC86 => array(0x644, 0x649), 0xFC87 => array(0x644, 0x64A),
2551
+					0xFC88 => array(0x645, 0x627), 0xFC89 => array(0x645, 0x645), 0xFC8A => array(0x646, 0x631),
2552
+					0xFC8B => array(0x646, 0x632), 0xFC8C => array(0x646, 0x645), 0xFC8D => array(0x646, 0x646),
2553
+					0xFC8E => array(0x646, 0x649), 0xFC8F => array(0x646, 0x64A), 0xFC90 => array(0x649, 0x670),
2554
+					0xFC91 => array(0x64A, 0x631), 0xFC92 => array(0x64A, 0x632), 0xFC93 => array(0x64A, 0x645),
2555
+					0xFC94 => array(0x64A, 0x646), 0xFC95 => array(0x64A, 0x649), 0xFC96 => array(0x64A, 0x64A),
2556
+					0xFC97 => array(0x626, 0x62C), 0xFC98 => array(0x626, 0x62D), 0xFC99 => array(0x626, 0x62E),
2557
+					0xFC9A => array(0x626, 0x645), 0xFC9B => array(0x626, 0x647), 0xFC9C => array(0x628, 0x62C),
2558
+					0xFC9D => array(0x628, 0x62D), 0xFC9E => array(0x628, 0x62E), 0xFC9F => array(0x628, 0x645),
2559
+					0xFCA0 => array(0x628, 0x647), 0xFCA1 => array(0x62A, 0x62C), 0xFCA2 => array(0x62A, 0x62D),
2560
+					0xFCA3 => array(0x62A, 0x62E), 0xFCA4 => array(0x62A, 0x645), 0xFCA5 => array(0x62A, 0x647),
2561
+					0xFCA6 => array(0x62B, 0x645), 0xFCA7 => array(0x62C, 0x62D), 0xFCA8 => array(0x62C, 0x645),
2562
+					0xFCA9 => array(0x62D, 0x62C), 0xFCAA => array(0x62D, 0x645), 0xFCAB => array(0x62E, 0x62C),
2563
+					0xFCAC => array(0x62E, 0x645), 0xFCAD => array(0x633, 0x62C), 0xFCAE => array(0x633, 0x62D),
2564
+					0xFCAF => array(0x633, 0x62E), 0xFCB0 => array(0x633, 0x645), 0xFCB1 => array(0x635, 0x62D),
2565
+					0xFCB2 => array(0x635, 0x62E), 0xFCB3 => array(0x635, 0x645), 0xFCB4 => array(0x636, 0x62C),
2566
+					0xFCB5 => array(0x636, 0x62D), 0xFCB6 => array(0x636, 0x62E), 0xFCB7 => array(0x636, 0x645),
2567
+					0xFCB8 => array(0x637, 0x62D), 0xFCB9 => array(0x638, 0x645), 0xFCBA => array(0x639, 0x62C),
2568
+					0xFCBB => array(0x639, 0x645), 0xFCBC => array(0x63A, 0x62C), 0xFCBD => array(0x63A, 0x645),
2569
+					0xFCBE => array(0x641, 0x62C), 0xFCBF => array(0x641, 0x62D), 0xFCC0 => array(0x641, 0x62E),
2570
+					0xFCC1 => array(0x641, 0x645), 0xFCC2 => array(0x642, 0x62D), 0xFCC3 => array(0x642, 0x645),
2571
+					0xFCC4 => array(0x643, 0x62C), 0xFCC5 => array(0x643, 0x62D), 0xFCC6 => array(0x643, 0x62E),
2572
+					0xFCC7 => array(0x643, 0x644), 0xFCC8 => array(0x643, 0x645), 0xFCC9 => array(0x644, 0x62C),
2573
+					0xFCCA => array(0x644, 0x62D), 0xFCCB => array(0x644, 0x62E), 0xFCCC => array(0x644, 0x645),
2574
+					0xFCCD => array(0x644, 0x647), 0xFCCE => array(0x645, 0x62C), 0xFCCF => array(0x645, 0x62D),
2575
+					0xFCD0 => array(0x645, 0x62E), 0xFCD1 => array(0x645, 0x645), 0xFCD2 => array(0x646, 0x62C),
2576
+					0xFCD3 => array(0x646, 0x62D), 0xFCD4 => array(0x646, 0x62E), 0xFCD5 => array(0x646, 0x645),
2577
+					0xFCD6 => array(0x646, 0x647), 0xFCD7 => array(0x647, 0x62C), 0xFCD8 => array(0x647, 0x645),
2578
+					0xFCD9 => array(0x647, 0x670), 0xFCDA => array(0x64A, 0x62C), 0xFCDB => array(0x64A, 0x62D),
2579
+					0xFCDC => array(0x64A, 0x62E), 0xFCDD => array(0x64A, 0x645), 0xFCDE => array(0x64A, 0x647),
2580
+					0xFCDF => array(0x626, 0x645), 0xFCE0 => array(0x626, 0x647), 0xFCE1 => array(0x628, 0x645),
2581
+					0xFCE2 => array(0x628, 0x647), 0xFCE3 => array(0x62A, 0x645), 0xFCE4 => array(0x62A, 0x647),
2582
+					0xFCE5 => array(0x62B, 0x645), 0xFCE6 => array(0x62B, 0x647), 0xFCE7 => array(0x633, 0x645),
2583
+					0xFCE8 => array(0x633, 0x647), 0xFCE9 => array(0x634, 0x645), 0xFCEA => array(0x634, 0x647),
2584
+					0xFCEB => array(0x643, 0x644), 0xFCEC => array(0x643, 0x645), 0xFCED => array(0x644, 0x645),
2585
+					0xFCEE => array(0x646, 0x645), 0xFCEF => array(0x646, 0x647), 0xFCF0 => array(0x64A, 0x645),
2586
+					0xFCF1 => array(0x64A, 0x647), 0xFCF2 => array(0x640, 0x64E, 0x651), 0xFCF3 => array(0x640, 0x64F, 0x651),
2587
+					0xFCF4 => array(0x640, 0x650, 0x651), 0xFCF5 => array(0x637, 0x649), 0xFCF6 => array(0x637, 0x64A),
2588
+					0xFCF7 => array(0x639, 0x649), 0xFCF8 => array(0x639, 0x64A), 0xFCF9 => array(0x63A, 0x649),
2589
+					0xFCFA => array(0x63A, 0x64A), 0xFCFB => array(0x633, 0x649), 0xFCFC => array(0x633, 0x64A),
2590
+					0xFCFD => array(0x634, 0x649), 0xFCFE => array(0x634, 0x64A), 0xFCFF => array(0x62D, 0x649),
2591
+					0xFD00 => array(0x62D, 0x64A), 0xFD01 => array(0x62C, 0x649), 0xFD02 => array(0x62C, 0x64A),
2592
+					0xFD03 => array(0x62E, 0x649), 0xFD04 => array(0x62E, 0x64A), 0xFD05 => array(0x635, 0x649),
2593
+					0xFD06 => array(0x635, 0x64A), 0xFD07 => array(0x636, 0x649), 0xFD08 => array(0x636, 0x64A),
2594
+					0xFD09 => array(0x634, 0x62C), 0xFD0A => array(0x634, 0x62D), 0xFD0B => array(0x634, 0x62E),
2595
+					0xFD0C => array(0x634, 0x645), 0xFD0D => array(0x634, 0x631), 0xFD0E => array(0x633, 0x631),
2596
+					0xFD0F => array(0x635, 0x631), 0xFD10 => array(0x636, 0x631), 0xFD11 => array(0x637, 0x649),
2597
+					0xFD12 => array(0x637, 0x64A), 0xFD13 => array(0x639, 0x649), 0xFD14 => array(0x639, 0x64A),
2598
+					0xFD15 => array(0x63A, 0x649), 0xFD16 => array(0x63A, 0x64A), 0xFD17 => array(0x633, 0x649),
2599
+					0xFD18 => array(0x633, 0x64A), 0xFD19 => array(0x634, 0x649), 0xFD1A => array(0x634, 0x64A),
2600
+					0xFD1B => array(0x62D, 0x649), 0xFD1C => array(0x62D, 0x64A), 0xFD1D => array(0x62C, 0x649),
2601
+					0xFD1E => array(0x62C, 0x64A), 0xFD1F => array(0x62E, 0x649), 0xFD20 => array(0x62E, 0x64A),
2602
+					0xFD21 => array(0x635, 0x649), 0xFD22 => array(0x635, 0x64A), 0xFD23 => array(0x636, 0x649),
2603
+					0xFD24 => array(0x636, 0x64A), 0xFD25 => array(0x634, 0x62C), 0xFD26 => array(0x634, 0x62D),
2604
+					0xFD27 => array(0x634, 0x62E), 0xFD28 => array(0x634, 0x645), 0xFD29 => array(0x634, 0x631),
2605
+					0xFD2A => array(0x633, 0x631), 0xFD2B => array(0x635, 0x631), 0xFD2C => array(0x636, 0x631),
2606
+					0xFD2D => array(0x634, 0x62C), 0xFD2E => array(0x634, 0x62D), 0xFD2F => array(0x634, 0x62E),
2607
+					0xFD30 => array(0x634, 0x645), 0xFD31 => array(0x633, 0x647), 0xFD32 => array(0x634, 0x647),
2608
+					0xFD33 => array(0x637, 0x645), 0xFD34 => array(0x633, 0x62C), 0xFD35 => array(0x633, 0x62D),
2609
+					0xFD36 => array(0x633, 0x62E), 0xFD37 => array(0x634, 0x62C), 0xFD38 => array(0x634, 0x62D),
2610
+					0xFD39 => array(0x634, 0x62E), 0xFD3A => array(0x637, 0x645), 0xFD3B => array(0x638, 0x645),
2611
+					0xFD3C => array(0x627, 0x64B), 0xFD3D => array(0x627, 0x64B), 0xFD50 => array(0x62A, 0x62C, 0x645),
2612
+					0xFD51 => array(0x62A, 0x62D, 0x62C), 0xFD52 => array(0x62A, 0x62D, 0x62C), 0xFD53 => array(0x62A, 0x62D, 0x645),
2613
+					0xFD54 => array(0x62A, 0x62E, 0x645), 0xFD55 => array(0x62A, 0x645, 0x62C), 0xFD56 => array(0x62A, 0x645, 0x62D),
2614
+					0xFD57 => array(0x62A, 0x645, 0x62E), 0xFD58 => array(0x62C, 0x645, 0x62D), 0xFD59 => array(0x62C, 0x645, 0x62D),
2615
+					0xFD5A => array(0x62D, 0x645, 0x64A), 0xFD5B => array(0x62D, 0x645, 0x649), 0xFD5C => array(0x633, 0x62D, 0x62C),
2616
+					0xFD5D => array(0x633, 0x62C, 0x62D), 0xFD5E => array(0x633, 0x62C, 0x649), 0xFD5F => array(0x633, 0x645, 0x62D),
2617
+					0xFD60 => array(0x633, 0x645, 0x62D), 0xFD61 => array(0x633, 0x645, 0x62C), 0xFD62 => array(0x633, 0x645, 0x645),
2618
+					0xFD63 => array(0x633, 0x645, 0x645), 0xFD64 => array(0x635, 0x62D, 0x62D), 0xFD65 => array(0x635, 0x62D, 0x62D),
2619
+					0xFD66 => array(0x635, 0x645, 0x645), 0xFD67 => array(0x634, 0x62D, 0x645), 0xFD68 => array(0x634, 0x62D, 0x645),
2620
+					0xFD69 => array(0x634, 0x62C, 0x64A), 0xFD6A => array(0x634, 0x645, 0x62E), 0xFD6B => array(0x634, 0x645, 0x62E),
2621
+					0xFD6C => array(0x634, 0x645, 0x645), 0xFD6D => array(0x634, 0x645, 0x645), 0xFD6E => array(0x636, 0x62D, 0x649),
2622
+					0xFD6F => array(0x636, 0x62E, 0x645), 0xFD70 => array(0x636, 0x62E, 0x645), 0xFD71 => array(0x637, 0x645, 0x62D),
2623
+					0xFD72 => array(0x637, 0x645, 0x62D), 0xFD73 => array(0x637, 0x645, 0x645), 0xFD74 => array(0x637, 0x645, 0x64A),
2624
+					0xFD75 => array(0x639, 0x62C, 0x645), 0xFD76 => array(0x639, 0x645, 0x645), 0xFD77 => array(0x639, 0x645, 0x645),
2625
+					0xFD78 => array(0x639, 0x645, 0x649), 0xFD79 => array(0x63A, 0x645, 0x645), 0xFD7A => array(0x63A, 0x645, 0x64A),
2626
+					0xFD7B => array(0x63A, 0x645, 0x649), 0xFD7C => array(0x641, 0x62E, 0x645), 0xFD7D => array(0x641, 0x62E, 0x645),
2627
+					0xFD7E => array(0x642, 0x645, 0x62D), 0xFD7F => array(0x642, 0x645, 0x645), 0xFD80 => array(0x644, 0x62D, 0x645),
2628
+					0xFD81 => array(0x644, 0x62D, 0x64A), 0xFD82 => array(0x644, 0x62D, 0x649), 0xFD83 => array(0x644, 0x62C, 0x62C),
2629
+					0xFD84 => array(0x644, 0x62C, 0x62C), 0xFD85 => array(0x644, 0x62E, 0x645), 0xFD86 => array(0x644, 0x62E, 0x645),
2630
+					0xFD87 => array(0x644, 0x645, 0x62D), 0xFD88 => array(0x644, 0x645, 0x62D), 0xFD89 => array(0x645, 0x62D, 0x62C),
2631
+					0xFD8A => array(0x645, 0x62D, 0x645), 0xFD8B => array(0x645, 0x62D, 0x64A), 0xFD8C => array(0x645, 0x62C, 0x62D),
2632
+					0xFD8D => array(0x645, 0x62C, 0x645), 0xFD8E => array(0x645, 0x62E, 0x62C), 0xFD8F => array(0x645, 0x62E, 0x645),
2633
+					0xFD92 => array(0x645, 0x62C, 0x62E), 0xFD93 => array(0x647, 0x645, 0x62C), 0xFD94 => array(0x647, 0x645, 0x645),
2634
+					0xFD95 => array(0x646, 0x62D, 0x645), 0xFD96 => array(0x646, 0x62D, 0x649), 0xFD97 => array(0x646, 0x62C, 0x645),
2635
+					0xFD98 => array(0x646, 0x62C, 0x645), 0xFD99 => array(0x646, 0x62C, 0x649), 0xFD9A => array(0x646, 0x645, 0x64A),
2636
+					0xFD9B => array(0x646, 0x645, 0x649), 0xFD9C => array(0x64A, 0x645, 0x645), 0xFD9D => array(0x64A, 0x645, 0x645),
2637
+					0xFD9E => array(0x628, 0x62E, 0x64A), 0xFD9F => array(0x62A, 0x62C, 0x64A), 0xFDA0 => array(0x62A, 0x62C, 0x649),
2638
+					0xFDA1 => array(0x62A, 0x62E, 0x64A), 0xFDA2 => array(0x62A, 0x62E, 0x649), 0xFDA3 => array(0x62A, 0x645, 0x64A),
2639
+					0xFDA4 => array(0x62A, 0x645, 0x649), 0xFDA5 => array(0x62C, 0x645, 0x64A), 0xFDA6 => array(0x62C, 0x62D, 0x649),
2640
+					0xFDA7 => array(0x62C, 0x645, 0x649), 0xFDA8 => array(0x633, 0x62E, 0x649), 0xFDA9 => array(0x635, 0x62D, 0x64A),
2641
+					0xFDAA => array(0x634, 0x62D, 0x64A), 0xFDAB => array(0x636, 0x62D, 0x64A), 0xFDAC => array(0x644, 0x62C, 0x64A),
2642
+					0xFDAD => array(0x644, 0x645, 0x64A), 0xFDAE => array(0x64A, 0x62D, 0x64A), 0xFDAF => array(0x64A, 0x62C, 0x64A),
2643
+					0xFDB0 => array(0x64A, 0x645, 0x64A), 0xFDB1 => array(0x645, 0x645, 0x64A), 0xFDB2 => array(0x642, 0x645, 0x64A),
2644
+					0xFDB3 => array(0x646, 0x62D, 0x64A), 0xFDB4 => array(0x642, 0x645, 0x62D), 0xFDB5 => array(0x644, 0x62D, 0x645),
2645
+					0xFDB6 => array(0x639, 0x645, 0x64A), 0xFDB7 => array(0x643, 0x645, 0x64A), 0xFDB8 => array(0x646, 0x62C, 0x62D),
2646
+					0xFDB9 => array(0x645, 0x62E, 0x64A), 0xFDBA => array(0x644, 0x62C, 0x645), 0xFDBB => array(0x643, 0x645, 0x645),
2647
+					0xFDBC => array(0x644, 0x62C, 0x645), 0xFDBD => array(0x646, 0x62C, 0x62D), 0xFDBE => array(0x62C, 0x62D, 0x64A),
2648
+					0xFDBF => array(0x62D, 0x62C, 0x64A), 0xFDC0 => array(0x645, 0x62C, 0x64A), 0xFDC1 => array(0x641, 0x645, 0x64A),
2649
+					0xFDC2 => array(0x628, 0x62D, 0x64A), 0xFDC3 => array(0x643, 0x645, 0x645), 0xFDC4 => array(0x639, 0x62C, 0x645),
2650
+					0xFDC5 => array(0x635, 0x645, 0x645), 0xFDC6 => array(0x633, 0x62E, 0x64A), 0xFDC7 => array(0x646, 0x62C, 0x64A),
2651
+					0xFDF0 => array(0x635, 0x644, 0x6D2), 0xFDF1 => array(0x642, 0x644, 0x6D2), 0xFDF2 => array(0x627, 0x644, 0x644, 0x647),
2652
+					0xFDF3 => array(0x627, 0x643, 0x628, 0x631), 0xFDF4 => array(0x645, 0x62D, 0x645, 0x62F), 0xFDF5 => array(0x635, 0x644, 0x639, 0x645),
2653
+					0xFDF6 => array(0x631, 0x633, 0x648, 0x644), 0xFDF7 => array(0x639, 0x644, 0x64A, 0x647), 0xFDF8 => array(0x648, 0x633, 0x644, 0x645),
2654
+					0xFDF9 => array(0x635, 0x644, 0x649), 0xFDFC => array(0x631, 0x6CC, 0x627, 0x644), 0xFE11 => array(0x3001),
2655
+					0xFE17 => array(0x3016), 0xFE18 => array(0x3017), 0xFE31 => array(0x2014),
2656
+					0xFE32 => array(0x2013), 0xFE39 => array(0x3014), 0xFE3A => array(0x3015),
2657
+					0xFE3B => array(0x3010), 0xFE3C => array(0x3011), 0xFE3D => array(0x300A),
2658
+					0xFE3E => array(0x300B), 0xFE3F => array(0x3008), 0xFE40 => array(0x3009),
2659
+					0xFE41 => array(0x300C), 0xFE42 => array(0x300D), 0xFE43 => array(0x300E),
2660
+					0xFE44 => array(0x300F), 0xFE51 => array(0x3001), 0xFE58 => array(0x2014),
2661
+					0xFE5D => array(0x3014), 0xFE5E => array(0x3015), 0xFE63 => array(0x2D),
2662
+					0xFE71 => array(0x640, 0x64B), 0xFE77 => array(0x640, 0x64E), 0xFE79 => array(0x640, 0x64F),
2663
+					0xFE7B => array(0x640, 0x650), 0xFE7D => array(0x640, 0x651), 0xFE7F => array(0x640, 0x652),
2664
+					0xFE80 => array(0x621), 0xFE81 => array(0x622), 0xFE82 => array(0x622),
2665
+					0xFE83 => array(0x623), 0xFE84 => array(0x623), 0xFE85 => array(0x624),
2666
+					0xFE86 => array(0x624), 0xFE87 => array(0x625), 0xFE88 => array(0x625),
2667
+					0xFE89 => array(0x626), 0xFE8A => array(0x626), 0xFE8B => array(0x626),
2668
+					0xFE8C => array(0x626), 0xFE8D => array(0x627), 0xFE8E => array(0x627),
2669
+					0xFE8F => array(0x628), 0xFE90 => array(0x628), 0xFE91 => array(0x628),
2670
+					0xFE92 => array(0x628), 0xFE93 => array(0x629), 0xFE94 => array(0x629),
2671
+					0xFE95 => array(0x62A), 0xFE96 => array(0x62A), 0xFE97 => array(0x62A),
2672
+					0xFE98 => array(0x62A), 0xFE99 => array(0x62B), 0xFE9A => array(0x62B),
2673
+					0xFE9B => array(0x62B), 0xFE9C => array(0x62B), 0xFE9D => array(0x62C),
2674
+					0xFE9E => array(0x62C), 0xFE9F => array(0x62C), 0xFEA0 => array(0x62C),
2675
+					0xFEA1 => array(0x62D), 0xFEA2 => array(0x62D), 0xFEA3 => array(0x62D),
2676
+					0xFEA4 => array(0x62D), 0xFEA5 => array(0x62E), 0xFEA6 => array(0x62E),
2677
+					0xFEA7 => array(0x62E), 0xFEA8 => array(0x62E), 0xFEA9 => array(0x62F),
2678
+					0xFEAA => array(0x62F), 0xFEAB => array(0x630), 0xFEAC => array(0x630),
2679
+					0xFEAD => array(0x631), 0xFEAE => array(0x631), 0xFEAF => array(0x632),
2680
+					0xFEB0 => array(0x632), 0xFEB1 => array(0x633), 0xFEB2 => array(0x633),
2681
+					0xFEB3 => array(0x633), 0xFEB4 => array(0x633), 0xFEB5 => array(0x634),
2682
+					0xFEB6 => array(0x634), 0xFEB7 => array(0x634), 0xFEB8 => array(0x634),
2683
+					0xFEB9 => array(0x635), 0xFEBA => array(0x635), 0xFEBB => array(0x635),
2684
+					0xFEBC => array(0x635), 0xFEBD => array(0x636), 0xFEBE => array(0x636),
2685
+					0xFEBF => array(0x636), 0xFEC0 => array(0x636), 0xFEC1 => array(0x637),
2686
+					0xFEC2 => array(0x637), 0xFEC3 => array(0x637), 0xFEC4 => array(0x637),
2687
+					0xFEC5 => array(0x638), 0xFEC6 => array(0x638), 0xFEC7 => array(0x638),
2688
+					0xFEC8 => array(0x638), 0xFEC9 => array(0x639), 0xFECA => array(0x639),
2689
+					0xFECB => array(0x639), 0xFECC => array(0x639), 0xFECD => array(0x63A),
2690
+					0xFECE => array(0x63A), 0xFECF => array(0x63A), 0xFED0 => array(0x63A),
2691
+					0xFED1 => array(0x641), 0xFED2 => array(0x641), 0xFED3 => array(0x641),
2692
+					0xFED4 => array(0x641), 0xFED5 => array(0x642), 0xFED6 => array(0x642),
2693
+					0xFED7 => array(0x642), 0xFED8 => array(0x642), 0xFED9 => array(0x643),
2694
+					0xFEDA => array(0x643), 0xFEDB => array(0x643), 0xFEDC => array(0x643),
2695
+					0xFEDD => array(0x644), 0xFEDE => array(0x644), 0xFEDF => array(0x644),
2696
+					0xFEE0 => array(0x644), 0xFEE1 => array(0x645), 0xFEE2 => array(0x645),
2697
+					0xFEE3 => array(0x645), 0xFEE4 => array(0x645), 0xFEE5 => array(0x646),
2698
+					0xFEE6 => array(0x646), 0xFEE7 => array(0x646), 0xFEE8 => array(0x646),
2699
+					0xFEE9 => array(0x647), 0xFEEA => array(0x647), 0xFEEB => array(0x647),
2700
+					0xFEEC => array(0x647), 0xFEED => array(0x648), 0xFEEE => array(0x648),
2701
+					0xFEEF => array(0x649), 0xFEF0 => array(0x649), 0xFEF1 => array(0x64A),
2702
+					0xFEF2 => array(0x64A), 0xFEF3 => array(0x64A), 0xFEF4 => array(0x64A),
2703
+					0xFEF5 => array(0x644, 0x622), 0xFEF6 => array(0x644, 0x622), 0xFEF7 => array(0x644, 0x623),
2704
+					0xFEF8 => array(0x644, 0x623), 0xFEF9 => array(0x644, 0x625), 0xFEFA => array(0x644, 0x625),
2705
+					0xFEFB => array(0x644, 0x627), 0xFEFC => array(0x644, 0x627), 0xFF0D => array(0x2D),
2706
+					0xFF0E => array(0x2E), 0xFF10 => array(0x30), 0xFF11 => array(0x31),
2707
+					0xFF12 => array(0x32), 0xFF13 => array(0x33), 0xFF14 => array(0x34),
2708
+					0xFF15 => array(0x35), 0xFF16 => array(0x36), 0xFF17 => array(0x37),
2709
+					0xFF18 => array(0x38), 0xFF19 => array(0x39), 0xFF21 => array(0x61),
2710
+					0xFF22 => array(0x62), 0xFF23 => array(0x63), 0xFF24 => array(0x64),
2711
+					0xFF25 => array(0x65), 0xFF26 => array(0x66), 0xFF27 => array(0x67),
2712
+					0xFF28 => array(0x68), 0xFF29 => array(0x69), 0xFF2A => array(0x6A),
2713
+					0xFF2B => array(0x6B), 0xFF2C => array(0x6C), 0xFF2D => array(0x6D),
2714
+					0xFF2E => array(0x6E), 0xFF2F => array(0x6F), 0xFF30 => array(0x70),
2715
+					0xFF31 => array(0x71), 0xFF32 => array(0x72), 0xFF33 => array(0x73),
2716
+					0xFF34 => array(0x74), 0xFF35 => array(0x75), 0xFF36 => array(0x76),
2717
+					0xFF37 => array(0x77), 0xFF38 => array(0x78), 0xFF39 => array(0x79),
2718
+					0xFF3A => array(0x7A), 0xFF41 => array(0x61), 0xFF42 => array(0x62),
2719
+					0xFF43 => array(0x63), 0xFF44 => array(0x64), 0xFF45 => array(0x65),
2720
+					0xFF46 => array(0x66), 0xFF47 => array(0x67), 0xFF48 => array(0x68),
2721
+					0xFF49 => array(0x69), 0xFF4A => array(0x6A), 0xFF4B => array(0x6B),
2722
+					0xFF4C => array(0x6C), 0xFF4D => array(0x6D), 0xFF4E => array(0x6E),
2723
+					0xFF4F => array(0x6F), 0xFF50 => array(0x70), 0xFF51 => array(0x71),
2724
+					0xFF52 => array(0x72), 0xFF53 => array(0x73), 0xFF54 => array(0x74),
2725
+					0xFF55 => array(0x75), 0xFF56 => array(0x76), 0xFF57 => array(0x77),
2726
+					0xFF58 => array(0x78), 0xFF59 => array(0x79), 0xFF5A => array(0x7A),
2727
+					0xFF5F => array(0x2985), 0xFF60 => array(0x2986), 0xFF61 => array(0x2E),
2728
+					0xFF62 => array(0x300C), 0xFF63 => array(0x300D), 0xFF64 => array(0x3001),
2729
+					0xFF65 => array(0x30FB), 0xFF66 => array(0x30F2), 0xFF67 => array(0x30A1),
2730
+					0xFF68 => array(0x30A3), 0xFF69 => array(0x30A5), 0xFF6A => array(0x30A7),
2731
+					0xFF6B => array(0x30A9), 0xFF6C => array(0x30E3), 0xFF6D => array(0x30E5),
2732
+					0xFF6E => array(0x30E7), 0xFF6F => array(0x30C3), 0xFF70 => array(0x30FC),
2733
+					0xFF71 => array(0x30A2), 0xFF72 => array(0x30A4), 0xFF73 => array(0x30A6),
2734
+					0xFF74 => array(0x30A8), 0xFF75 => array(0x30AA), 0xFF76 => array(0x30AB),
2735
+					0xFF77 => array(0x30AD), 0xFF78 => array(0x30AF), 0xFF79 => array(0x30B1),
2736
+					0xFF7A => array(0x30B3), 0xFF7B => array(0x30B5), 0xFF7C => array(0x30B7),
2737
+					0xFF7D => array(0x30B9), 0xFF7E => array(0x30BB), 0xFF7F => array(0x30BD),
2738
+					0xFF80 => array(0x30BF), 0xFF81 => array(0x30C1), 0xFF82 => array(0x30C4),
2739
+					0xFF83 => array(0x30C6), 0xFF84 => array(0x30C8), 0xFF85 => array(0x30CA),
2740
+					0xFF86 => array(0x30CB), 0xFF87 => array(0x30CC), 0xFF88 => array(0x30CD),
2741
+					0xFF89 => array(0x30CE), 0xFF8A => array(0x30CF), 0xFF8B => array(0x30D2),
2742
+					0xFF8C => array(0x30D5), 0xFF8D => array(0x30D8), 0xFF8E => array(0x30DB),
2743
+					0xFF8F => array(0x30DE), 0xFF90 => array(0x30DF), 0xFF91 => array(0x30E0),
2744
+					0xFF92 => array(0x30E1), 0xFF93 => array(0x30E2), 0xFF94 => array(0x30E4),
2745
+					0xFF95 => array(0x30E6), 0xFF96 => array(0x30E8), 0xFF97 => array(0x30E9),
2746
+					0xFF98 => array(0x30EA), 0xFF99 => array(0x30EB), 0xFF9A => array(0x30EC),
2747
+					0xFF9B => array(0x30ED), 0xFF9C => array(0x30EF), 0xFF9D => array(0x30F3),
2748
+					0xFF9E => array(0x3099), 0xFF9F => array(0x309A), 0xFFA1 => array(0x1100),
2749
+					0xFFA2 => array(0x1101), 0xFFA3 => array(0x11AA), 0xFFA4 => array(0x1102),
2750
+					0xFFA5 => array(0x11AC), 0xFFA6 => array(0x11AD), 0xFFA7 => array(0x1103),
2751
+					0xFFA8 => array(0x1104), 0xFFA9 => array(0x1105), 0xFFAA => array(0x11B0),
2752
+					0xFFAB => array(0x11B1), 0xFFAC => array(0x11B2), 0xFFAD => array(0x11B3),
2753
+					0xFFAE => array(0x11B4), 0xFFAF => array(0x11B5), 0xFFB0 => array(0x111A),
2754
+					0xFFB1 => array(0x1106), 0xFFB2 => array(0x1107), 0xFFB3 => array(0x1108),
2755
+					0xFFB4 => array(0x1121), 0xFFB5 => array(0x1109), 0xFFB6 => array(0x110A),
2756
+					0xFFB7 => array(0x110B), 0xFFB8 => array(0x110C), 0xFFB9 => array(0x110D),
2757
+					0xFFBA => array(0x110E), 0xFFBB => array(0x110F), 0xFFBC => array(0x1110),
2758
+					0xFFBD => array(0x1111), 0xFFBE => array(0x1112), 0xFFC2 => array(0x1161),
2759
+					0xFFC3 => array(0x1162), 0xFFC4 => array(0x1163), 0xFFC5 => array(0x1164),
2760
+					0xFFC6 => array(0x1165), 0xFFC7 => array(0x1166), 0xFFCA => array(0x1167),
2761
+					0xFFCB => array(0x1168), 0xFFCC => array(0x1169), 0xFFCD => array(0x116A),
2762
+					0xFFCE => array(0x116B), 0xFFCF => array(0x116C), 0xFFD2 => array(0x116D),
2763
+					0xFFD3 => array(0x116E), 0xFFD4 => array(0x116F), 0xFFD5 => array(0x1170),
2764
+					0xFFD6 => array(0x1171), 0xFFD7 => array(0x1172), 0xFFDA => array(0x1173),
2765
+					0xFFDB => array(0x1174), 0xFFDC => array(0x1175), 0xFFE0 => array(0xA2),
2766
+					0xFFE1 => array(0xA3), 0xFFE2 => array(0xAC), 0xFFE4 => array(0xA6),
2767
+					0xFFE5 => array(0xA5), 0xFFE6 => array(0x20A9), 0xFFE8 => array(0x2502),
2768
+					0xFFE9 => array(0x2190), 0xFFEA => array(0x2191), 0xFFEB => array(0x2192),
2769
+					0xFFEC => array(0x2193), 0xFFED => array(0x25A0), 0xFFEE => array(0x25CB),
2770
+					0x10400 => array(0x10428), 0x10401 => array(0x10429), 0x10402 => array(0x1042A),
2771
+					0x10403 => array(0x1042B), 0x10404 => array(0x1042C), 0x10405 => array(0x1042D),
2772
+					0x10406 => array(0x1042E), 0x10407 => array(0x1042F), 0x10408 => array(0x10430),
2773
+					0x10409 => array(0x10431), 0x1040A => array(0x10432), 0x1040B => array(0x10433),
2774
+					0x1040C => array(0x10434), 0x1040D => array(0x10435), 0x1040E => array(0x10436),
2775
+					0x1040F => array(0x10437), 0x10410 => array(0x10438), 0x10411 => array(0x10439),
2776
+					0x10412 => array(0x1043A), 0x10413 => array(0x1043B), 0x10414 => array(0x1043C),
2777
+					0x10415 => array(0x1043D), 0x10416 => array(0x1043E), 0x10417 => array(0x1043F),
2778
+					0x10418 => array(0x10440), 0x10419 => array(0x10441), 0x1041A => array(0x10442),
2779
+					0x1041B => array(0x10443), 0x1041C => array(0x10444), 0x1041D => array(0x10445),
2780
+					0x1041E => array(0x10446), 0x1041F => array(0x10447), 0x10420 => array(0x10448),
2781
+					0x10421 => array(0x10449), 0x10422 => array(0x1044A), 0x10423 => array(0x1044B),
2782
+					0x10424 => array(0x1044C), 0x10425 => array(0x1044D), 0x10426 => array(0x1044E),
2783
+					0x10427 => array(0x1044F), 0x118A0 => array(0x118C0), 0x118A1 => array(0x118C1),
2784
+					0x118A2 => array(0x118C2), 0x118A3 => array(0x118C3), 0x118A4 => array(0x118C4),
2785
+					0x118A5 => array(0x118C5), 0x118A6 => array(0x118C6), 0x118A7 => array(0x118C7),
2786
+					0x118A8 => array(0x118C8), 0x118A9 => array(0x118C9), 0x118AA => array(0x118CA),
2787
+					0x118AB => array(0x118CB), 0x118AC => array(0x118CC), 0x118AD => array(0x118CD),
2788
+					0x118AE => array(0x118CE), 0x118AF => array(0x118CF), 0x118B0 => array(0x118D0),
2789
+					0x118B1 => array(0x118D1), 0x118B2 => array(0x118D2), 0x118B3 => array(0x118D3),
2790
+					0x118B4 => array(0x118D4), 0x118B5 => array(0x118D5), 0x118B6 => array(0x118D6),
2791
+					0x118B7 => array(0x118D7), 0x118B8 => array(0x118D8), 0x118B9 => array(0x118D9),
2792
+					0x118BA => array(0x118DA), 0x118BB => array(0x118DB), 0x118BC => array(0x118DC),
2793
+					0x118BD => array(0x118DD), 0x118BE => array(0x118DE), 0x118BF => array(0x118DF),
2794
+					0x1D15E => array(0x1D157, 0x1D165), 0x1D15F => array(0x1D158, 0x1D165), 0x1D160 => array(0x1D158, 0x1D165, 0x1D16E),
2795
+					0x1D161 => array(0x1D158, 0x1D165, 0x1D16F), 0x1D162 => array(0x1D158, 0x1D165, 0x1D170), 0x1D163 => array(0x1D158, 0x1D165, 0x1D171),
2796
+					0x1D164 => array(0x1D158, 0x1D165, 0x1D172), 0x1D1BB => array(0x1D1B9, 0x1D165), 0x1D1BC => array(0x1D1BA, 0x1D165),
2797
+					0x1D1BD => array(0x1D1B9, 0x1D165, 0x1D16E), 0x1D1BE => array(0x1D1BA, 0x1D165, 0x1D16E), 0x1D1BF => array(0x1D1B9, 0x1D165, 0x1D16F),
2798
+					0x1D1C0 => array(0x1D1BA, 0x1D165, 0x1D16F), 0x1D400 => array(0x61), 0x1D401 => array(0x62),
2799
+					0x1D402 => array(0x63), 0x1D403 => array(0x64), 0x1D404 => array(0x65),
2800
+					0x1D405 => array(0x66), 0x1D406 => array(0x67), 0x1D407 => array(0x68),
2801
+					0x1D408 => array(0x69), 0x1D409 => array(0x6A), 0x1D40A => array(0x6B),
2802
+					0x1D40B => array(0x6C), 0x1D40C => array(0x6D), 0x1D40D => array(0x6E),
2803
+					0x1D40E => array(0x6F), 0x1D40F => array(0x70), 0x1D410 => array(0x71),
2804
+					0x1D411 => array(0x72), 0x1D412 => array(0x73), 0x1D413 => array(0x74),
2805
+					0x1D414 => array(0x75), 0x1D415 => array(0x76), 0x1D416 => array(0x77),
2806
+					0x1D417 => array(0x78), 0x1D418 => array(0x79), 0x1D419 => array(0x7A),
2807
+					0x1D41A => array(0x61), 0x1D41B => array(0x62), 0x1D41C => array(0x63),
2808
+					0x1D41D => array(0x64), 0x1D41E => array(0x65), 0x1D41F => array(0x66),
2809
+					0x1D420 => array(0x67), 0x1D421 => array(0x68), 0x1D422 => array(0x69),
2810
+					0x1D423 => array(0x6A), 0x1D424 => array(0x6B), 0x1D425 => array(0x6C),
2811
+					0x1D426 => array(0x6D), 0x1D427 => array(0x6E), 0x1D428 => array(0x6F),
2812
+					0x1D429 => array(0x70), 0x1D42A => array(0x71), 0x1D42B => array(0x72),
2813
+					0x1D42C => array(0x73), 0x1D42D => array(0x74), 0x1D42E => array(0x75),
2814
+					0x1D42F => array(0x76), 0x1D430 => array(0x77), 0x1D431 => array(0x78),
2815
+					0x1D432 => array(0x79), 0x1D433 => array(0x7A), 0x1D434 => array(0x61),
2816
+					0x1D435 => array(0x62), 0x1D436 => array(0x63), 0x1D437 => array(0x64),
2817
+					0x1D438 => array(0x65), 0x1D439 => array(0x66), 0x1D43A => array(0x67),
2818
+					0x1D43B => array(0x68), 0x1D43C => array(0x69), 0x1D43D => array(0x6A),
2819
+					0x1D43E => array(0x6B), 0x1D43F => array(0x6C), 0x1D440 => array(0x6D),
2820
+					0x1D441 => array(0x6E), 0x1D442 => array(0x6F), 0x1D443 => array(0x70),
2821
+					0x1D444 => array(0x71), 0x1D445 => array(0x72), 0x1D446 => array(0x73),
2822
+					0x1D447 => array(0x74), 0x1D448 => array(0x75), 0x1D449 => array(0x76),
2823
+					0x1D44A => array(0x77), 0x1D44B => array(0x78), 0x1D44C => array(0x79),
2824
+					0x1D44D => array(0x7A), 0x1D44E => array(0x61), 0x1D44F => array(0x62),
2825
+					0x1D450 => array(0x63), 0x1D451 => array(0x64), 0x1D452 => array(0x65),
2826
+					0x1D453 => array(0x66), 0x1D454 => array(0x67), 0x1D456 => array(0x69),
2827
+					0x1D457 => array(0x6A), 0x1D458 => array(0x6B), 0x1D459 => array(0x6C),
2828
+					0x1D45A => array(0x6D), 0x1D45B => array(0x6E), 0x1D45C => array(0x6F),
2829
+					0x1D45D => array(0x70), 0x1D45E => array(0x71), 0x1D45F => array(0x72),
2830
+					0x1D460 => array(0x73), 0x1D461 => array(0x74), 0x1D462 => array(0x75),
2831
+					0x1D463 => array(0x76), 0x1D464 => array(0x77), 0x1D465 => array(0x78),
2832
+					0x1D466 => array(0x79), 0x1D467 => array(0x7A), 0x1D468 => array(0x61),
2833
+					0x1D469 => array(0x62), 0x1D46A => array(0x63), 0x1D46B => array(0x64),
2834
+					0x1D46C => array(0x65), 0x1D46D => array(0x66), 0x1D46E => array(0x67),
2835
+					0x1D46F => array(0x68), 0x1D470 => array(0x69), 0x1D471 => array(0x6A),
2836
+					0x1D472 => array(0x6B), 0x1D473 => array(0x6C), 0x1D474 => array(0x6D),
2837
+					0x1D475 => array(0x6E), 0x1D476 => array(0x6F), 0x1D477 => array(0x70),
2838
+					0x1D478 => array(0x71), 0x1D479 => array(0x72), 0x1D47A => array(0x73),
2839
+					0x1D47B => array(0x74), 0x1D47C => array(0x75), 0x1D47D => array(0x76),
2840
+					0x1D47E => array(0x77), 0x1D47F => array(0x78), 0x1D480 => array(0x79),
2841
+					0x1D481 => array(0x7A), 0x1D482 => array(0x61), 0x1D483 => array(0x62),
2842
+					0x1D484 => array(0x63), 0x1D485 => array(0x64), 0x1D486 => array(0x65),
2843
+					0x1D487 => array(0x66), 0x1D488 => array(0x67), 0x1D489 => array(0x68),
2844
+					0x1D48A => array(0x69), 0x1D48B => array(0x6A), 0x1D48C => array(0x6B),
2845
+					0x1D48D => array(0x6C), 0x1D48E => array(0x6D), 0x1D48F => array(0x6E),
2846
+					0x1D490 => array(0x6F), 0x1D491 => array(0x70), 0x1D492 => array(0x71),
2847
+					0x1D493 => array(0x72), 0x1D494 => array(0x73), 0x1D495 => array(0x74),
2848
+					0x1D496 => array(0x75), 0x1D497 => array(0x76), 0x1D498 => array(0x77),
2849
+					0x1D499 => array(0x78), 0x1D49A => array(0x79), 0x1D49B => array(0x7A),
2850
+					0x1D49C => array(0x61), 0x1D49E => array(0x63), 0x1D49F => array(0x64),
2851
+					0x1D4A2 => array(0x67), 0x1D4A5 => array(0x6A), 0x1D4A6 => array(0x6B),
2852
+					0x1D4A9 => array(0x6E), 0x1D4AA => array(0x6F), 0x1D4AB => array(0x70),
2853
+					0x1D4AC => array(0x71), 0x1D4AE => array(0x73), 0x1D4AF => array(0x74),
2854
+					0x1D4B0 => array(0x75), 0x1D4B1 => array(0x76), 0x1D4B2 => array(0x77),
2855
+					0x1D4B3 => array(0x78), 0x1D4B4 => array(0x79), 0x1D4B5 => array(0x7A),
2856
+					0x1D4B6 => array(0x61), 0x1D4B7 => array(0x62), 0x1D4B8 => array(0x63),
2857
+					0x1D4B9 => array(0x64), 0x1D4BB => array(0x66), 0x1D4BD => array(0x68),
2858
+					0x1D4BE => array(0x69), 0x1D4BF => array(0x6A), 0x1D4C0 => array(0x6B),
2859
+					0x1D4C1 => array(0x6C), 0x1D4C2 => array(0x6D), 0x1D4C3 => array(0x6E),
2860
+					0x1D4C5 => array(0x70), 0x1D4C6 => array(0x71), 0x1D4C7 => array(0x72),
2861
+					0x1D4C8 => array(0x73), 0x1D4C9 => array(0x74), 0x1D4CA => array(0x75),
2862
+					0x1D4CB => array(0x76), 0x1D4CC => array(0x77), 0x1D4CD => array(0x78),
2863
+					0x1D4CE => array(0x79), 0x1D4CF => array(0x7A), 0x1D4D0 => array(0x61),
2864
+					0x1D4D1 => array(0x62), 0x1D4D2 => array(0x63), 0x1D4D3 => array(0x64),
2865
+					0x1D4D4 => array(0x65), 0x1D4D5 => array(0x66), 0x1D4D6 => array(0x67),
2866
+					0x1D4D7 => array(0x68), 0x1D4D8 => array(0x69), 0x1D4D9 => array(0x6A),
2867
+					0x1D4DA => array(0x6B), 0x1D4DB => array(0x6C), 0x1D4DC => array(0x6D),
2868
+					0x1D4DD => array(0x6E), 0x1D4DE => array(0x6F), 0x1D4DF => array(0x70),
2869
+					0x1D4E0 => array(0x71), 0x1D4E1 => array(0x72), 0x1D4E2 => array(0x73),
2870
+					0x1D4E3 => array(0x74), 0x1D4E4 => array(0x75), 0x1D4E5 => array(0x76),
2871
+					0x1D4E6 => array(0x77), 0x1D4E7 => array(0x78), 0x1D4E8 => array(0x79),
2872
+					0x1D4E9 => array(0x7A), 0x1D4EA => array(0x61), 0x1D4EB => array(0x62),
2873
+					0x1D4EC => array(0x63), 0x1D4ED => array(0x64), 0x1D4EE => array(0x65),
2874
+					0x1D4EF => array(0x66), 0x1D4F0 => array(0x67), 0x1D4F1 => array(0x68),
2875
+					0x1D4F2 => array(0x69), 0x1D4F3 => array(0x6A), 0x1D4F4 => array(0x6B),
2876
+					0x1D4F5 => array(0x6C), 0x1D4F6 => array(0x6D), 0x1D4F7 => array(0x6E),
2877
+					0x1D4F8 => array(0x6F), 0x1D4F9 => array(0x70), 0x1D4FA => array(0x71),
2878
+					0x1D4FB => array(0x72), 0x1D4FC => array(0x73), 0x1D4FD => array(0x74),
2879
+					0x1D4FE => array(0x75), 0x1D4FF => array(0x76), 0x1D500 => array(0x77),
2880
+					0x1D501 => array(0x78), 0x1D502 => array(0x79), 0x1D503 => array(0x7A),
2881
+					0x1D504 => array(0x61), 0x1D505 => array(0x62), 0x1D507 => array(0x64),
2882
+					0x1D508 => array(0x65), 0x1D509 => array(0x66), 0x1D50A => array(0x67),
2883
+					0x1D50D => array(0x6A), 0x1D50E => array(0x6B), 0x1D50F => array(0x6C),
2884
+					0x1D510 => array(0x6D), 0x1D511 => array(0x6E), 0x1D512 => array(0x6F),
2885
+					0x1D513 => array(0x70), 0x1D514 => array(0x71), 0x1D516 => array(0x73),
2886
+					0x1D517 => array(0x74), 0x1D518 => array(0x75), 0x1D519 => array(0x76),
2887
+					0x1D51A => array(0x77), 0x1D51B => array(0x78), 0x1D51C => array(0x79),
2888
+					0x1D51E => array(0x61), 0x1D51F => array(0x62), 0x1D520 => array(0x63),
2889
+					0x1D521 => array(0x64), 0x1D522 => array(0x65), 0x1D523 => array(0x66),
2890
+					0x1D524 => array(0x67), 0x1D525 => array(0x68), 0x1D526 => array(0x69),
2891
+					0x1D527 => array(0x6A), 0x1D528 => array(0x6B), 0x1D529 => array(0x6C),
2892
+					0x1D52A => array(0x6D), 0x1D52B => array(0x6E), 0x1D52C => array(0x6F),
2893
+					0x1D52D => array(0x70), 0x1D52E => array(0x71), 0x1D52F => array(0x72),
2894
+					0x1D530 => array(0x73), 0x1D531 => array(0x74), 0x1D532 => array(0x75),
2895
+					0x1D533 => array(0x76), 0x1D534 => array(0x77), 0x1D535 => array(0x78),
2896
+					0x1D536 => array(0x79), 0x1D537 => array(0x7A), 0x1D538 => array(0x61),
2897
+					0x1D539 => array(0x62), 0x1D53B => array(0x64), 0x1D53C => array(0x65),
2898
+					0x1D53D => array(0x66), 0x1D53E => array(0x67), 0x1D540 => array(0x69),
2899
+					0x1D541 => array(0x6A), 0x1D542 => array(0x6B), 0x1D543 => array(0x6C),
2900
+					0x1D544 => array(0x6D), 0x1D546 => array(0x6F), 0x1D54A => array(0x73),
2901
+					0x1D54B => array(0x74), 0x1D54C => array(0x75), 0x1D54D => array(0x76),
2902
+					0x1D54E => array(0x77), 0x1D54F => array(0x78), 0x1D550 => array(0x79),
2903
+					0x1D552 => array(0x61), 0x1D553 => array(0x62), 0x1D554 => array(0x63),
2904
+					0x1D555 => array(0x64), 0x1D556 => array(0x65), 0x1D557 => array(0x66),
2905
+					0x1D558 => array(0x67), 0x1D559 => array(0x68), 0x1D55A => array(0x69),
2906
+					0x1D55B => array(0x6A), 0x1D55C => array(0x6B), 0x1D55D => array(0x6C),
2907
+					0x1D55E => array(0x6D), 0x1D55F => array(0x6E), 0x1D560 => array(0x6F),
2908
+					0x1D561 => array(0x70), 0x1D562 => array(0x71), 0x1D563 => array(0x72),
2909
+					0x1D564 => array(0x73), 0x1D565 => array(0x74), 0x1D566 => array(0x75),
2910
+					0x1D567 => array(0x76), 0x1D568 => array(0x77), 0x1D569 => array(0x78),
2911
+					0x1D56A => array(0x79), 0x1D56B => array(0x7A), 0x1D56C => array(0x61),
2912
+					0x1D56D => array(0x62), 0x1D56E => array(0x63), 0x1D56F => array(0x64),
2913
+					0x1D570 => array(0x65), 0x1D571 => array(0x66), 0x1D572 => array(0x67),
2914
+					0x1D573 => array(0x68), 0x1D574 => array(0x69), 0x1D575 => array(0x6A),
2915
+					0x1D576 => array(0x6B), 0x1D577 => array(0x6C), 0x1D578 => array(0x6D),
2916
+					0x1D579 => array(0x6E), 0x1D57A => array(0x6F), 0x1D57B => array(0x70),
2917
+					0x1D57C => array(0x71), 0x1D57D => array(0x72), 0x1D57E => array(0x73),
2918
+					0x1D57F => array(0x74), 0x1D580 => array(0x75), 0x1D581 => array(0x76),
2919
+					0x1D582 => array(0x77), 0x1D583 => array(0x78), 0x1D584 => array(0x79),
2920
+					0x1D585 => array(0x7A), 0x1D586 => array(0x61), 0x1D587 => array(0x62),
2921
+					0x1D588 => array(0x63), 0x1D589 => array(0x64), 0x1D58A => array(0x65),
2922
+					0x1D58B => array(0x66), 0x1D58C => array(0x67), 0x1D58D => array(0x68),
2923
+					0x1D58E => array(0x69), 0x1D58F => array(0x6A), 0x1D590 => array(0x6B),
2924
+					0x1D591 => array(0x6C), 0x1D592 => array(0x6D), 0x1D593 => array(0x6E),
2925
+					0x1D594 => array(0x6F), 0x1D595 => array(0x70), 0x1D596 => array(0x71),
2926
+					0x1D597 => array(0x72), 0x1D598 => array(0x73), 0x1D599 => array(0x74),
2927
+					0x1D59A => array(0x75), 0x1D59B => array(0x76), 0x1D59C => array(0x77),
2928
+					0x1D59D => array(0x78), 0x1D59E => array(0x79), 0x1D59F => array(0x7A),
2929
+					0x1D5A0 => array(0x61), 0x1D5A1 => array(0x62), 0x1D5A2 => array(0x63),
2930
+					0x1D5A3 => array(0x64), 0x1D5A4 => array(0x65), 0x1D5A5 => array(0x66),
2931
+					0x1D5A6 => array(0x67), 0x1D5A7 => array(0x68), 0x1D5A8 => array(0x69),
2932
+					0x1D5A9 => array(0x6A), 0x1D5AA => array(0x6B), 0x1D5AB => array(0x6C),
2933
+					0x1D5AC => array(0x6D), 0x1D5AD => array(0x6E), 0x1D5AE => array(0x6F),
2934
+					0x1D5AF => array(0x70), 0x1D5B0 => array(0x71), 0x1D5B1 => array(0x72),
2935
+					0x1D5B2 => array(0x73), 0x1D5B3 => array(0x74), 0x1D5B4 => array(0x75),
2936
+					0x1D5B5 => array(0x76), 0x1D5B6 => array(0x77), 0x1D5B7 => array(0x78),
2937
+					0x1D5B8 => array(0x79), 0x1D5B9 => array(0x7A), 0x1D5BA => array(0x61),
2938
+					0x1D5BB => array(0x62), 0x1D5BC => array(0x63), 0x1D5BD => array(0x64),
2939
+					0x1D5BE => array(0x65), 0x1D5BF => array(0x66), 0x1D5C0 => array(0x67),
2940
+					0x1D5C1 => array(0x68), 0x1D5C2 => array(0x69), 0x1D5C3 => array(0x6A),
2941
+					0x1D5C4 => array(0x6B), 0x1D5C5 => array(0x6C), 0x1D5C6 => array(0x6D),
2942
+					0x1D5C7 => array(0x6E), 0x1D5C8 => array(0x6F), 0x1D5C9 => array(0x70),
2943
+					0x1D5CA => array(0x71), 0x1D5CB => array(0x72), 0x1D5CC => array(0x73),
2944
+					0x1D5CD => array(0x74), 0x1D5CE => array(0x75), 0x1D5CF => array(0x76),
2945
+					0x1D5D0 => array(0x77), 0x1D5D1 => array(0x78), 0x1D5D2 => array(0x79),
2946
+					0x1D5D3 => array(0x7A), 0x1D5D4 => array(0x61), 0x1D5D5 => array(0x62),
2947
+					0x1D5D6 => array(0x63), 0x1D5D7 => array(0x64), 0x1D5D8 => array(0x65),
2948
+					0x1D5D9 => array(0x66), 0x1D5DA => array(0x67), 0x1D5DB => array(0x68),
2949
+					0x1D5DC => array(0x69), 0x1D5DD => array(0x6A), 0x1D5DE => array(0x6B),
2950
+					0x1D5DF => array(0x6C), 0x1D5E0 => array(0x6D), 0x1D5E1 => array(0x6E),
2951
+					0x1D5E2 => array(0x6F), 0x1D5E3 => array(0x70), 0x1D5E4 => array(0x71),
2952
+					0x1D5E5 => array(0x72), 0x1D5E6 => array(0x73), 0x1D5E7 => array(0x74),
2953
+					0x1D5E8 => array(0x75), 0x1D5E9 => array(0x76), 0x1D5EA => array(0x77),
2954
+					0x1D5EB => array(0x78), 0x1D5EC => array(0x79), 0x1D5ED => array(0x7A),
2955
+					0x1D5EE => array(0x61), 0x1D5EF => array(0x62), 0x1D5F0 => array(0x63),
2956
+					0x1D5F1 => array(0x64), 0x1D5F2 => array(0x65), 0x1D5F3 => array(0x66),
2957
+					0x1D5F4 => array(0x67), 0x1D5F5 => array(0x68), 0x1D5F6 => array(0x69),
2958
+					0x1D5F7 => array(0x6A), 0x1D5F8 => array(0x6B), 0x1D5F9 => array(0x6C),
2959
+					0x1D5FA => array(0x6D), 0x1D5FB => array(0x6E), 0x1D5FC => array(0x6F),
2960
+					0x1D5FD => array(0x70), 0x1D5FE => array(0x71), 0x1D5FF => array(0x72),
2961
+					0x1D600 => array(0x73), 0x1D601 => array(0x74), 0x1D602 => array(0x75),
2962
+					0x1D603 => array(0x76), 0x1D604 => array(0x77), 0x1D605 => array(0x78),
2963
+					0x1D606 => array(0x79), 0x1D607 => array(0x7A), 0x1D608 => array(0x61),
2964
+					0x1D609 => array(0x62), 0x1D60A => array(0x63), 0x1D60B => array(0x64),
2965
+					0x1D60C => array(0x65), 0x1D60D => array(0x66), 0x1D60E => array(0x67),
2966
+					0x1D60F => array(0x68), 0x1D610 => array(0x69), 0x1D611 => array(0x6A),
2967
+					0x1D612 => array(0x6B), 0x1D613 => array(0x6C), 0x1D614 => array(0x6D),
2968
+					0x1D615 => array(0x6E), 0x1D616 => array(0x6F), 0x1D617 => array(0x70),
2969
+					0x1D618 => array(0x71), 0x1D619 => array(0x72), 0x1D61A => array(0x73),
2970
+					0x1D61B => array(0x74), 0x1D61C => array(0x75), 0x1D61D => array(0x76),
2971
+					0x1D61E => array(0x77), 0x1D61F => array(0x78), 0x1D620 => array(0x79),
2972
+					0x1D621 => array(0x7A), 0x1D622 => array(0x61), 0x1D623 => array(0x62),
2973
+					0x1D624 => array(0x63), 0x1D625 => array(0x64), 0x1D626 => array(0x65),
2974
+					0x1D627 => array(0x66), 0x1D628 => array(0x67), 0x1D629 => array(0x68),
2975
+					0x1D62A => array(0x69), 0x1D62B => array(0x6A), 0x1D62C => array(0x6B),
2976
+					0x1D62D => array(0x6C), 0x1D62E => array(0x6D), 0x1D62F => array(0x6E),
2977
+					0x1D630 => array(0x6F), 0x1D631 => array(0x70), 0x1D632 => array(0x71),
2978
+					0x1D633 => array(0x72), 0x1D634 => array(0x73), 0x1D635 => array(0x74),
2979
+					0x1D636 => array(0x75), 0x1D637 => array(0x76), 0x1D638 => array(0x77),
2980
+					0x1D639 => array(0x78), 0x1D63A => array(0x79), 0x1D63B => array(0x7A),
2981
+					0x1D63C => array(0x61), 0x1D63D => array(0x62), 0x1D63E => array(0x63),
2982
+					0x1D63F => array(0x64), 0x1D640 => array(0x65), 0x1D641 => array(0x66),
2983
+					0x1D642 => array(0x67), 0x1D643 => array(0x68), 0x1D644 => array(0x69),
2984
+					0x1D645 => array(0x6A), 0x1D646 => array(0x6B), 0x1D647 => array(0x6C),
2985
+					0x1D648 => array(0x6D), 0x1D649 => array(0x6E), 0x1D64A => array(0x6F),
2986
+					0x1D64B => array(0x70), 0x1D64C => array(0x71), 0x1D64D => array(0x72),
2987
+					0x1D64E => array(0x73), 0x1D64F => array(0x74), 0x1D650 => array(0x75),
2988
+					0x1D651 => array(0x76), 0x1D652 => array(0x77), 0x1D653 => array(0x78),
2989
+					0x1D654 => array(0x79), 0x1D655 => array(0x7A), 0x1D656 => array(0x61),
2990
+					0x1D657 => array(0x62), 0x1D658 => array(0x63), 0x1D659 => array(0x64),
2991
+					0x1D65A => array(0x65), 0x1D65B => array(0x66), 0x1D65C => array(0x67),
2992
+					0x1D65D => array(0x68), 0x1D65E => array(0x69), 0x1D65F => array(0x6A),
2993
+					0x1D660 => array(0x6B), 0x1D661 => array(0x6C), 0x1D662 => array(0x6D),
2994
+					0x1D663 => array(0x6E), 0x1D664 => array(0x6F), 0x1D665 => array(0x70),
2995
+					0x1D666 => array(0x71), 0x1D667 => array(0x72), 0x1D668 => array(0x73),
2996
+					0x1D669 => array(0x74), 0x1D66A => array(0x75), 0x1D66B => array(0x76),
2997
+					0x1D66C => array(0x77), 0x1D66D => array(0x78), 0x1D66E => array(0x79),
2998
+					0x1D66F => array(0x7A), 0x1D670 => array(0x61), 0x1D671 => array(0x62),
2999
+					0x1D672 => array(0x63), 0x1D673 => array(0x64), 0x1D674 => array(0x65),
3000
+					0x1D675 => array(0x66), 0x1D676 => array(0x67), 0x1D677 => array(0x68),
3001
+					0x1D678 => array(0x69), 0x1D679 => array(0x6A), 0x1D67A => array(0x6B),
3002
+					0x1D67B => array(0x6C), 0x1D67C => array(0x6D), 0x1D67D => array(0x6E),
3003
+					0x1D67E => array(0x6F), 0x1D67F => array(0x70), 0x1D680 => array(0x71),
3004
+					0x1D681 => array(0x72), 0x1D682 => array(0x73), 0x1D683 => array(0x74),
3005
+					0x1D684 => array(0x75), 0x1D685 => array(0x76), 0x1D686 => array(0x77),
3006
+					0x1D687 => array(0x78), 0x1D688 => array(0x79), 0x1D689 => array(0x7A),
3007
+					0x1D68A => array(0x61), 0x1D68B => array(0x62), 0x1D68C => array(0x63),
3008
+					0x1D68D => array(0x64), 0x1D68E => array(0x65), 0x1D68F => array(0x66),
3009
+					0x1D690 => array(0x67), 0x1D691 => array(0x68), 0x1D692 => array(0x69),
3010
+					0x1D693 => array(0x6A), 0x1D694 => array(0x6B), 0x1D695 => array(0x6C),
3011
+					0x1D696 => array(0x6D), 0x1D697 => array(0x6E), 0x1D698 => array(0x6F),
3012
+					0x1D699 => array(0x70), 0x1D69A => array(0x71), 0x1D69B => array(0x72),
3013
+					0x1D69C => array(0x73), 0x1D69D => array(0x74), 0x1D69E => array(0x75),
3014
+					0x1D69F => array(0x76), 0x1D6A0 => array(0x77), 0x1D6A1 => array(0x78),
3015
+					0x1D6A2 => array(0x79), 0x1D6A3 => array(0x7A), 0x1D6A4 => array(0x131),
3016
+					0x1D6A5 => array(0x237), 0x1D6A8 => array(0x3B1), 0x1D6A9 => array(0x3B2),
3017
+					0x1D6AA => array(0x3B3), 0x1D6AB => array(0x3B4), 0x1D6AC => array(0x3B5),
3018
+					0x1D6AD => array(0x3B6), 0x1D6AE => array(0x3B7), 0x1D6AF => array(0x3B8),
3019
+					0x1D6B0 => array(0x3B9), 0x1D6B1 => array(0x3BA), 0x1D6B2 => array(0x3BB),
3020
+					0x1D6B3 => array(0x3BC), 0x1D6B4 => array(0x3BD), 0x1D6B5 => array(0x3BE),
3021
+					0x1D6B6 => array(0x3BF), 0x1D6B7 => array(0x3C0), 0x1D6B8 => array(0x3C1),
3022
+					0x1D6B9 => array(0x3B8), 0x1D6BA => array(0x3C3), 0x1D6BB => array(0x3C4),
3023
+					0x1D6BC => array(0x3C5), 0x1D6BD => array(0x3C6), 0x1D6BE => array(0x3C7),
3024
+					0x1D6BF => array(0x3C8), 0x1D6C0 => array(0x3C9), 0x1D6C1 => array(0x2207),
3025
+					0x1D6C2 => array(0x3B1), 0x1D6C3 => array(0x3B2), 0x1D6C4 => array(0x3B3),
3026
+					0x1D6C5 => array(0x3B4), 0x1D6C6 => array(0x3B5), 0x1D6C7 => array(0x3B6),
3027
+					0x1D6C8 => array(0x3B7), 0x1D6C9 => array(0x3B8), 0x1D6CA => array(0x3B9),
3028
+					0x1D6CB => array(0x3BA), 0x1D6CC => array(0x3BB), 0x1D6CD => array(0x3BC),
3029
+					0x1D6CE => array(0x3BD), 0x1D6CF => array(0x3BE), 0x1D6D0 => array(0x3BF),
3030
+					0x1D6D1 => array(0x3C0), 0x1D6D2 => array(0x3C1), 0x1D6D3 => array(0x3C3),
3031
+					0x1D6D4 => array(0x3C3), 0x1D6D5 => array(0x3C4), 0x1D6D6 => array(0x3C5),
3032
+					0x1D6D7 => array(0x3C6), 0x1D6D8 => array(0x3C7), 0x1D6D9 => array(0x3C8),
3033
+					0x1D6DA => array(0x3C9), 0x1D6DB => array(0x2202), 0x1D6DC => array(0x3B5),
3034
+					0x1D6DD => array(0x3B8), 0x1D6DE => array(0x3BA), 0x1D6DF => array(0x3C6),
3035
+					0x1D6E0 => array(0x3C1), 0x1D6E1 => array(0x3C0), 0x1D6E2 => array(0x3B1),
3036
+					0x1D6E3 => array(0x3B2), 0x1D6E4 => array(0x3B3), 0x1D6E5 => array(0x3B4),
3037
+					0x1D6E6 => array(0x3B5), 0x1D6E7 => array(0x3B6), 0x1D6E8 => array(0x3B7),
3038
+					0x1D6E9 => array(0x3B8), 0x1D6EA => array(0x3B9), 0x1D6EB => array(0x3BA),
3039
+					0x1D6EC => array(0x3BB), 0x1D6ED => array(0x3BC), 0x1D6EE => array(0x3BD),
3040
+					0x1D6EF => array(0x3BE), 0x1D6F0 => array(0x3BF), 0x1D6F1 => array(0x3C0),
3041
+					0x1D6F2 => array(0x3C1), 0x1D6F3 => array(0x3B8), 0x1D6F4 => array(0x3C3),
3042
+					0x1D6F5 => array(0x3C4), 0x1D6F6 => array(0x3C5), 0x1D6F7 => array(0x3C6),
3043
+					0x1D6F8 => array(0x3C7), 0x1D6F9 => array(0x3C8), 0x1D6FA => array(0x3C9),
3044
+					0x1D6FB => array(0x2207), 0x1D6FC => array(0x3B1), 0x1D6FD => array(0x3B2),
3045
+					0x1D6FE => array(0x3B3), 0x1D6FF => array(0x3B4), 0x1D700 => array(0x3B5),
3046
+					0x1D701 => array(0x3B6), 0x1D702 => array(0x3B7), 0x1D703 => array(0x3B8),
3047
+					0x1D704 => array(0x3B9), 0x1D705 => array(0x3BA), 0x1D706 => array(0x3BB),
3048
+					0x1D707 => array(0x3BC), 0x1D708 => array(0x3BD), 0x1D709 => array(0x3BE),
3049
+					0x1D70A => array(0x3BF), 0x1D70B => array(0x3C0), 0x1D70C => array(0x3C1),
3050
+					0x1D70D => array(0x3C3), 0x1D70E => array(0x3C3), 0x1D70F => array(0x3C4),
3051
+					0x1D710 => array(0x3C5), 0x1D711 => array(0x3C6), 0x1D712 => array(0x3C7),
3052
+					0x1D713 => array(0x3C8), 0x1D714 => array(0x3C9), 0x1D715 => array(0x2202),
3053
+					0x1D716 => array(0x3B5), 0x1D717 => array(0x3B8), 0x1D718 => array(0x3BA),
3054
+					0x1D719 => array(0x3C6), 0x1D71A => array(0x3C1), 0x1D71B => array(0x3C0),
3055
+					0x1D71C => array(0x3B1), 0x1D71D => array(0x3B2), 0x1D71E => array(0x3B3),
3056
+					0x1D71F => array(0x3B4), 0x1D720 => array(0x3B5), 0x1D721 => array(0x3B6),
3057
+					0x1D722 => array(0x3B7), 0x1D723 => array(0x3B8), 0x1D724 => array(0x3B9),
3058
+					0x1D725 => array(0x3BA), 0x1D726 => array(0x3BB), 0x1D727 => array(0x3BC),
3059
+					0x1D728 => array(0x3BD), 0x1D729 => array(0x3BE), 0x1D72A => array(0x3BF),
3060
+					0x1D72B => array(0x3C0), 0x1D72C => array(0x3C1), 0x1D72D => array(0x3B8),
3061
+					0x1D72E => array(0x3C3), 0x1D72F => array(0x3C4), 0x1D730 => array(0x3C5),
3062
+					0x1D731 => array(0x3C6), 0x1D732 => array(0x3C7), 0x1D733 => array(0x3C8),
3063
+					0x1D734 => array(0x3C9), 0x1D735 => array(0x2207), 0x1D736 => array(0x3B1),
3064
+					0x1D737 => array(0x3B2), 0x1D738 => array(0x3B3), 0x1D739 => array(0x3B4),
3065
+					0x1D73A => array(0x3B5), 0x1D73B => array(0x3B6), 0x1D73C => array(0x3B7),
3066
+					0x1D73D => array(0x3B8), 0x1D73E => array(0x3B9), 0x1D73F => array(0x3BA),
3067
+					0x1D740 => array(0x3BB), 0x1D741 => array(0x3BC), 0x1D742 => array(0x3BD),
3068
+					0x1D743 => array(0x3BE), 0x1D744 => array(0x3BF), 0x1D745 => array(0x3C0),
3069
+					0x1D746 => array(0x3C1), 0x1D747 => array(0x3C3), 0x1D748 => array(0x3C3),
3070
+					0x1D749 => array(0x3C4), 0x1D74A => array(0x3C5), 0x1D74B => array(0x3C6),
3071
+					0x1D74C => array(0x3C7), 0x1D74D => array(0x3C8), 0x1D74E => array(0x3C9),
3072
+					0x1D74F => array(0x2202), 0x1D750 => array(0x3B5), 0x1D751 => array(0x3B8),
3073
+					0x1D752 => array(0x3BA), 0x1D753 => array(0x3C6), 0x1D754 => array(0x3C1),
3074
+					0x1D755 => array(0x3C0), 0x1D756 => array(0x3B1), 0x1D757 => array(0x3B2),
3075
+					0x1D758 => array(0x3B3), 0x1D759 => array(0x3B4), 0x1D75A => array(0x3B5),
3076
+					0x1D75B => array(0x3B6), 0x1D75C => array(0x3B7), 0x1D75D => array(0x3B8),
3077
+					0x1D75E => array(0x3B9), 0x1D75F => array(0x3BA), 0x1D760 => array(0x3BB),
3078
+					0x1D761 => array(0x3BC), 0x1D762 => array(0x3BD), 0x1D763 => array(0x3BE),
3079
+					0x1D764 => array(0x3BF), 0x1D765 => array(0x3C0), 0x1D766 => array(0x3C1),
3080
+					0x1D767 => array(0x3B8), 0x1D768 => array(0x3C3), 0x1D769 => array(0x3C4),
3081
+					0x1D76A => array(0x3C5), 0x1D76B => array(0x3C6), 0x1D76C => array(0x3C7),
3082
+					0x1D76D => array(0x3C8), 0x1D76E => array(0x3C9), 0x1D76F => array(0x2207),
3083
+					0x1D770 => array(0x3B1), 0x1D771 => array(0x3B2), 0x1D772 => array(0x3B3),
3084
+					0x1D773 => array(0x3B4), 0x1D774 => array(0x3B5), 0x1D775 => array(0x3B6),
3085
+					0x1D776 => array(0x3B7), 0x1D777 => array(0x3B8), 0x1D778 => array(0x3B9),
3086
+					0x1D779 => array(0x3BA), 0x1D77A => array(0x3BB), 0x1D77B => array(0x3BC),
3087
+					0x1D77C => array(0x3BD), 0x1D77D => array(0x3BE), 0x1D77E => array(0x3BF),
3088
+					0x1D77F => array(0x3C0), 0x1D780 => array(0x3C1), 0x1D781 => array(0x3C3),
3089
+					0x1D782 => array(0x3C3), 0x1D783 => array(0x3C4), 0x1D784 => array(0x3C5),
3090
+					0x1D785 => array(0x3C6), 0x1D786 => array(0x3C7), 0x1D787 => array(0x3C8),
3091
+					0x1D788 => array(0x3C9), 0x1D789 => array(0x2202), 0x1D78A => array(0x3B5),
3092
+					0x1D78B => array(0x3B8), 0x1D78C => array(0x3BA), 0x1D78D => array(0x3C6),
3093
+					0x1D78E => array(0x3C1), 0x1D78F => array(0x3C0), 0x1D790 => array(0x3B1),
3094
+					0x1D791 => array(0x3B2), 0x1D792 => array(0x3B3), 0x1D793 => array(0x3B4),
3095
+					0x1D794 => array(0x3B5), 0x1D795 => array(0x3B6), 0x1D796 => array(0x3B7),
3096
+					0x1D797 => array(0x3B8), 0x1D798 => array(0x3B9), 0x1D799 => array(0x3BA),
3097
+					0x1D79A => array(0x3BB), 0x1D79B => array(0x3BC), 0x1D79C => array(0x3BD),
3098
+					0x1D79D => array(0x3BE), 0x1D79E => array(0x3BF), 0x1D79F => array(0x3C0),
3099
+					0x1D7A0 => array(0x3C1), 0x1D7A1 => array(0x3B8), 0x1D7A2 => array(0x3C3),
3100
+					0x1D7A3 => array(0x3C4), 0x1D7A4 => array(0x3C5), 0x1D7A5 => array(0x3C6),
3101
+					0x1D7A6 => array(0x3C7), 0x1D7A7 => array(0x3C8), 0x1D7A8 => array(0x3C9),
3102
+					0x1D7A9 => array(0x2207), 0x1D7AA => array(0x3B1), 0x1D7AB => array(0x3B2),
3103
+					0x1D7AC => array(0x3B3), 0x1D7AD => array(0x3B4), 0x1D7AE => array(0x3B5),
3104
+					0x1D7AF => array(0x3B6), 0x1D7B0 => array(0x3B7), 0x1D7B1 => array(0x3B8),
3105
+					0x1D7B2 => array(0x3B9), 0x1D7B3 => array(0x3BA), 0x1D7B4 => array(0x3BB),
3106
+					0x1D7B5 => array(0x3BC), 0x1D7B6 => array(0x3BD), 0x1D7B7 => array(0x3BE),
3107
+					0x1D7B8 => array(0x3BF), 0x1D7B9 => array(0x3C0), 0x1D7BA => array(0x3C1),
3108
+					0x1D7BB => array(0x3C3), 0x1D7BC => array(0x3C3), 0x1D7BD => array(0x3C4),
3109
+					0x1D7BE => array(0x3C5), 0x1D7BF => array(0x3C6), 0x1D7C0 => array(0x3C7),
3110
+					0x1D7C1 => array(0x3C8), 0x1D7C2 => array(0x3C9), 0x1D7C3 => array(0x2202),
3111
+					0x1D7C4 => array(0x3B5), 0x1D7C5 => array(0x3B8), 0x1D7C6 => array(0x3BA),
3112
+					0x1D7C7 => array(0x3C6), 0x1D7C8 => array(0x3C1), 0x1D7C9 => array(0x3C0),
3113
+					0x1D7CA => array(0x3DD), 0x1D7CB => array(0x3DD), 0x1D7CE => array(0x30),
3114
+					0x1D7CF => array(0x31), 0x1D7D0 => array(0x32), 0x1D7D1 => array(0x33),
3115
+					0x1D7D2 => array(0x34), 0x1D7D3 => array(0x35), 0x1D7D4 => array(0x36),
3116
+					0x1D7D5 => array(0x37), 0x1D7D6 => array(0x38), 0x1D7D7 => array(0x39),
3117
+					0x1D7D8 => array(0x30), 0x1D7D9 => array(0x31), 0x1D7DA => array(0x32),
3118
+					0x1D7DB => array(0x33), 0x1D7DC => array(0x34), 0x1D7DD => array(0x35),
3119
+					0x1D7DE => array(0x36), 0x1D7DF => array(0x37), 0x1D7E0 => array(0x38),
3120
+					0x1D7E1 => array(0x39), 0x1D7E2 => array(0x30), 0x1D7E3 => array(0x31),
3121
+					0x1D7E4 => array(0x32), 0x1D7E5 => array(0x33), 0x1D7E6 => array(0x34),
3122
+					0x1D7E7 => array(0x35), 0x1D7E8 => array(0x36), 0x1D7E9 => array(0x37),
3123
+					0x1D7EA => array(0x38), 0x1D7EB => array(0x39), 0x1D7EC => array(0x30),
3124
+					0x1D7ED => array(0x31), 0x1D7EE => array(0x32), 0x1D7EF => array(0x33),
3125
+					0x1D7F0 => array(0x34), 0x1D7F1 => array(0x35), 0x1D7F2 => array(0x36),
3126
+					0x1D7F3 => array(0x37), 0x1D7F4 => array(0x38), 0x1D7F5 => array(0x39),
3127
+					0x1D7F6 => array(0x30), 0x1D7F7 => array(0x31), 0x1D7F8 => array(0x32),
3128
+					0x1D7F9 => array(0x33), 0x1D7FA => array(0x34), 0x1D7FB => array(0x35),
3129
+					0x1D7FC => array(0x36), 0x1D7FD => array(0x37), 0x1D7FE => array(0x38),
3130
+					0x1D7FF => array(0x39), 0x1EE00 => array(0x627), 0x1EE01 => array(0x628),
3131
+					0x1EE02 => array(0x62C), 0x1EE03 => array(0x62F), 0x1EE05 => array(0x648),
3132
+					0x1EE06 => array(0x632), 0x1EE07 => array(0x62D), 0x1EE08 => array(0x637),
3133
+					0x1EE09 => array(0x64A), 0x1EE0A => array(0x643), 0x1EE0B => array(0x644),
3134
+					0x1EE0C => array(0x645), 0x1EE0D => array(0x646), 0x1EE0E => array(0x633),
3135
+					0x1EE0F => array(0x639), 0x1EE10 => array(0x641), 0x1EE11 => array(0x635),
3136
+					0x1EE12 => array(0x642), 0x1EE13 => array(0x631), 0x1EE14 => array(0x634),
3137
+					0x1EE15 => array(0x62A), 0x1EE16 => array(0x62B), 0x1EE17 => array(0x62E),
3138
+					0x1EE18 => array(0x630), 0x1EE19 => array(0x636), 0x1EE1A => array(0x638),
3139
+					0x1EE1B => array(0x63A), 0x1EE1C => array(0x66E), 0x1EE1D => array(0x6BA),
3140
+					0x1EE1E => array(0x6A1), 0x1EE1F => array(0x66F), 0x1EE21 => array(0x628),
3141
+					0x1EE22 => array(0x62C), 0x1EE24 => array(0x647), 0x1EE27 => array(0x62D),
3142
+					0x1EE29 => array(0x64A), 0x1EE2A => array(0x643), 0x1EE2B => array(0x644),
3143
+					0x1EE2C => array(0x645), 0x1EE2D => array(0x646), 0x1EE2E => array(0x633),
3144
+					0x1EE2F => array(0x639), 0x1EE30 => array(0x641), 0x1EE31 => array(0x635),
3145
+					0x1EE32 => array(0x642), 0x1EE34 => array(0x634), 0x1EE35 => array(0x62A),
3146
+					0x1EE36 => array(0x62B), 0x1EE37 => array(0x62E), 0x1EE39 => array(0x636),
3147
+					0x1EE3B => array(0x63A), 0x1EE42 => array(0x62C), 0x1EE47 => array(0x62D),
3148
+					0x1EE49 => array(0x64A), 0x1EE4B => array(0x644), 0x1EE4D => array(0x646),
3149
+					0x1EE4E => array(0x633), 0x1EE4F => array(0x639), 0x1EE51 => array(0x635),
3150
+					0x1EE52 => array(0x642), 0x1EE54 => array(0x634), 0x1EE57 => array(0x62E),
3151
+					0x1EE59 => array(0x636), 0x1EE5B => array(0x63A), 0x1EE5D => array(0x6BA),
3152
+					0x1EE5F => array(0x66F), 0x1EE61 => array(0x628), 0x1EE62 => array(0x62C),
3153
+					0x1EE64 => array(0x647), 0x1EE67 => array(0x62D), 0x1EE68 => array(0x637),
3154
+					0x1EE69 => array(0x64A), 0x1EE6A => array(0x643), 0x1EE6C => array(0x645),
3155
+					0x1EE6D => array(0x646), 0x1EE6E => array(0x633), 0x1EE6F => array(0x639),
3156
+					0x1EE70 => array(0x641), 0x1EE71 => array(0x635), 0x1EE72 => array(0x642),
3157
+					0x1EE74 => array(0x634), 0x1EE75 => array(0x62A), 0x1EE76 => array(0x62B),
3158
+					0x1EE77 => array(0x62E), 0x1EE79 => array(0x636), 0x1EE7A => array(0x638),
3159
+					0x1EE7B => array(0x63A), 0x1EE7C => array(0x66E), 0x1EE7E => array(0x6A1),
3160
+					0x1EE80 => array(0x627), 0x1EE81 => array(0x628), 0x1EE82 => array(0x62C),
3161
+					0x1EE83 => array(0x62F), 0x1EE84 => array(0x647), 0x1EE85 => array(0x648),
3162
+					0x1EE86 => array(0x632), 0x1EE87 => array(0x62D), 0x1EE88 => array(0x637),
3163
+					0x1EE89 => array(0x64A), 0x1EE8B => array(0x644), 0x1EE8C => array(0x645),
3164
+					0x1EE8D => array(0x646), 0x1EE8E => array(0x633), 0x1EE8F => array(0x639),
3165
+					0x1EE90 => array(0x641), 0x1EE91 => array(0x635), 0x1EE92 => array(0x642),
3166
+					0x1EE93 => array(0x631), 0x1EE94 => array(0x634), 0x1EE95 => array(0x62A),
3167
+					0x1EE96 => array(0x62B), 0x1EE97 => array(0x62E), 0x1EE98 => array(0x630),
3168
+					0x1EE99 => array(0x636), 0x1EE9A => array(0x638), 0x1EE9B => array(0x63A),
3169
+					0x1EEA1 => array(0x628), 0x1EEA2 => array(0x62C), 0x1EEA3 => array(0x62F),
3170
+					0x1EEA5 => array(0x648), 0x1EEA6 => array(0x632), 0x1EEA7 => array(0x62D),
3171
+					0x1EEA8 => array(0x637), 0x1EEA9 => array(0x64A), 0x1EEAB => array(0x644),
3172
+					0x1EEAC => array(0x645), 0x1EEAD => array(0x646), 0x1EEAE => array(0x633),
3173
+					0x1EEAF => array(0x639), 0x1EEB0 => array(0x641), 0x1EEB1 => array(0x635),
3174
+					0x1EEB2 => array(0x642), 0x1EEB3 => array(0x631), 0x1EEB4 => array(0x634),
3175
+					0x1EEB5 => array(0x62A), 0x1EEB6 => array(0x62B), 0x1EEB7 => array(0x62E),
3176
+					0x1EEB8 => array(0x630), 0x1EEB9 => array(0x636), 0x1EEBA => array(0x638),
3177
+					0x1EEBB => array(0x63A), 0x1F12A => array(0x3014, 0x73, 0x3015), 0x1F12B => array(0x63),
3178
+					0x1F12C => array(0x72), 0x1F12D => array(0x63, 0x64), 0x1F12E => array(0x77, 0x7A),
3179
+					0x1F130 => array(0x61), 0x1F131 => array(0x62), 0x1F132 => array(0x63),
3180
+					0x1F133 => array(0x64), 0x1F134 => array(0x65), 0x1F135 => array(0x66),
3181
+					0x1F136 => array(0x67), 0x1F137 => array(0x68), 0x1F138 => array(0x69),
3182
+					0x1F139 => array(0x6A), 0x1F13A => array(0x6B), 0x1F13B => array(0x6C),
3183
+					0x1F13C => array(0x6D), 0x1F13D => array(0x6E), 0x1F13E => array(0x6F),
3184
+					0x1F13F => array(0x70), 0x1F140 => array(0x71), 0x1F141 => array(0x72),
3185
+					0x1F142 => array(0x73), 0x1F143 => array(0x74), 0x1F144 => array(0x75),
3186
+					0x1F145 => array(0x76), 0x1F146 => array(0x77), 0x1F147 => array(0x78),
3187
+					0x1F148 => array(0x79), 0x1F149 => array(0x7A), 0x1F14A => array(0x68, 0x76),
3188
+					0x1F14B => array(0x6D, 0x76), 0x1F14C => array(0x73, 0x64), 0x1F14D => array(0x73, 0x73),
3189
+					0x1F14E => array(0x70, 0x70, 0x76), 0x1F14F => array(0x77, 0x63), 0x1F16A => array(0x6D, 0x63),
3190
+					0x1F16B => array(0x6D, 0x64), 0x1F190 => array(0x64, 0x6A), 0x1F200 => array(0x307B, 0x304B),
3191
+					0x1F201 => array(0x30B3, 0x30B3), 0x1F202 => array(0x30B5), 0x1F210 => array(0x624B),
3192
+					0x1F211 => array(0x5B57), 0x1F212 => array(0x53CC), 0x1F213 => array(0x30C7),
3193
+					0x1F214 => array(0x4E8C), 0x1F215 => array(0x591A), 0x1F216 => array(0x89E3),
3194
+					0x1F217 => array(0x5929), 0x1F218 => array(0x4EA4), 0x1F219 => array(0x6620),
3195
+					0x1F21A => array(0x7121), 0x1F21B => array(0x6599), 0x1F21C => array(0x524D),
3196
+					0x1F21D => array(0x5F8C), 0x1F21E => array(0x518D), 0x1F21F => array(0x65B0),
3197
+					0x1F220 => array(0x521D), 0x1F221 => array(0x7D42), 0x1F222 => array(0x751F),
3198
+					0x1F223 => array(0x8CA9), 0x1F224 => array(0x58F0), 0x1F225 => array(0x5439),
3199
+					0x1F226 => array(0x6F14), 0x1F227 => array(0x6295), 0x1F228 => array(0x6355),
3200
+					0x1F229 => array(0x4E00), 0x1F22A => array(0x4E09), 0x1F22B => array(0x904A),
3201
+					0x1F22C => array(0x5DE6), 0x1F22D => array(0x4E2D), 0x1F22E => array(0x53F3),
3202
+					0x1F22F => array(0x6307), 0x1F230 => array(0x8D70), 0x1F231 => array(0x6253),
3203
+					0x1F232 => array(0x7981), 0x1F233 => array(0x7A7A), 0x1F234 => array(0x5408),
3204
+					0x1F235 => array(0x6E80), 0x1F236 => array(0x6709), 0x1F237 => array(0x6708),
3205
+					0x1F238 => array(0x7533), 0x1F239 => array(0x5272), 0x1F23A => array(0x55B6),
3206
+					0x1F240 => array(0x3014, 0x672C, 0x3015), 0x1F241 => array(0x3014, 0x4E09, 0x3015), 0x1F242 => array(0x3014, 0x4E8C, 0x3015),
3207
+					0x1F243 => array(0x3014, 0x5B89, 0x3015), 0x1F244 => array(0x3014, 0x70B9, 0x3015), 0x1F245 => array(0x3014, 0x6253, 0x3015),
3208
+					0x1F246 => array(0x3014, 0x76D7, 0x3015), 0x1F247 => array(0x3014, 0x52DD, 0x3015), 0x1F248 => array(0x3014, 0x6557, 0x3015),
3209
+					0x1F250 => array(0x5F97), 0x1F251 => array(0x53EF), 0x2F800 => array(0x4E3D),
3210
+					0x2F801 => array(0x4E38), 0x2F802 => array(0x4E41), 0x2F803 => array(0x20122),
3211
+					0x2F804 => array(0x4F60), 0x2F805 => array(0x4FAE), 0x2F806 => array(0x4FBB),
3212
+					0x2F807 => array(0x5002), 0x2F808 => array(0x507A), 0x2F809 => array(0x5099),
3213
+					0x2F80A => array(0x50E7), 0x2F80B => array(0x50CF), 0x2F80C => array(0x349E),
3214
+					0x2F80D => array(0x2063A), 0x2F80E => array(0x514D), 0x2F80F => array(0x5154),
3215
+					0x2F810 => array(0x5164), 0x2F811 => array(0x5177), 0x2F812 => array(0x2051C),
3216
+					0x2F813 => array(0x34B9), 0x2F814 => array(0x5167), 0x2F815 => array(0x518D),
3217
+					0x2F816 => array(0x2054B), 0x2F817 => array(0x5197), 0x2F818 => array(0x51A4),
3218
+					0x2F819 => array(0x4ECC), 0x2F81A => array(0x51AC), 0x2F81B => array(0x51B5),
3219
+					0x2F81C => array(0x291DF), 0x2F81D => array(0x51F5), 0x2F81E => array(0x5203),
3220
+					0x2F81F => array(0x34DF), 0x2F820 => array(0x523B), 0x2F821 => array(0x5246),
3221
+					0x2F822 => array(0x5272), 0x2F823 => array(0x5277), 0x2F824 => array(0x3515),
3222
+					0x2F825 => array(0x52C7), 0x2F826 => array(0x52C9), 0x2F827 => array(0x52E4),
3223
+					0x2F828 => array(0x52FA), 0x2F829 => array(0x5305), 0x2F82A => array(0x5306),
3224
+					0x2F82B => array(0x5317), 0x2F82C => array(0x5349), 0x2F82D => array(0x5351),
3225
+					0x2F82E => array(0x535A), 0x2F82F => array(0x5373), 0x2F830 => array(0x537D),
3226
+					0x2F831 => array(0x537F), 0x2F832 => array(0x537F), 0x2F833 => array(0x537F),
3227
+					0x2F834 => array(0x20A2C), 0x2F835 => array(0x7070), 0x2F836 => array(0x53CA),
3228
+					0x2F837 => array(0x53DF), 0x2F838 => array(0x20B63), 0x2F839 => array(0x53EB),
3229
+					0x2F83A => array(0x53F1), 0x2F83B => array(0x5406), 0x2F83C => array(0x549E),
3230
+					0x2F83D => array(0x5438), 0x2F83E => array(0x5448), 0x2F83F => array(0x5468),
3231
+					0x2F840 => array(0x54A2), 0x2F841 => array(0x54F6), 0x2F842 => array(0x5510),
3232
+					0x2F843 => array(0x5553), 0x2F844 => array(0x5563), 0x2F845 => array(0x5584),
3233
+					0x2F846 => array(0x5584), 0x2F847 => array(0x5599), 0x2F848 => array(0x55AB),
3234
+					0x2F849 => array(0x55B3), 0x2F84A => array(0x55C2), 0x2F84B => array(0x5716),
3235
+					0x2F84C => array(0x5606), 0x2F84D => array(0x5717), 0x2F84E => array(0x5651),
3236
+					0x2F84F => array(0x5674), 0x2F850 => array(0x5207), 0x2F851 => array(0x58EE),
3237
+					0x2F852 => array(0x57CE), 0x2F853 => array(0x57F4), 0x2F854 => array(0x580D),
3238
+					0x2F855 => array(0x578B), 0x2F856 => array(0x5832), 0x2F857 => array(0x5831),
3239
+					0x2F858 => array(0x58AC), 0x2F859 => array(0x214E4), 0x2F85A => array(0x58F2),
3240
+					0x2F85B => array(0x58F7), 0x2F85C => array(0x5906), 0x2F85D => array(0x591A),
3241
+					0x2F85E => array(0x5922), 0x2F85F => array(0x5962), 0x2F860 => array(0x216A8),
3242
+					0x2F861 => array(0x216EA), 0x2F862 => array(0x59EC), 0x2F863 => array(0x5A1B),
3243
+					0x2F864 => array(0x5A27), 0x2F865 => array(0x59D8), 0x2F866 => array(0x5A66),
3244
+					0x2F867 => array(0x36EE), 0x2F869 => array(0x5B08), 0x2F86A => array(0x5B3E),
3245
+					0x2F86B => array(0x5B3E), 0x2F86C => array(0x219C8), 0x2F86D => array(0x5BC3),
3246
+					0x2F86E => array(0x5BD8), 0x2F86F => array(0x5BE7), 0x2F870 => array(0x5BF3),
3247
+					0x2F871 => array(0x21B18), 0x2F872 => array(0x5BFF), 0x2F873 => array(0x5C06),
3248
+					0x2F875 => array(0x5C22), 0x2F876 => array(0x3781), 0x2F877 => array(0x5C60),
3249
+					0x2F878 => array(0x5C6E), 0x2F879 => array(0x5CC0), 0x2F87A => array(0x5C8D),
3250
+					0x2F87B => array(0x21DE4), 0x2F87C => array(0x5D43), 0x2F87D => array(0x21DE6),
3251
+					0x2F87E => array(0x5D6E), 0x2F87F => array(0x5D6B), 0x2F880 => array(0x5D7C),
3252
+					0x2F881 => array(0x5DE1), 0x2F882 => array(0x5DE2), 0x2F883 => array(0x382F),
3253
+					0x2F884 => array(0x5DFD), 0x2F885 => array(0x5E28), 0x2F886 => array(0x5E3D),
3254
+					0x2F887 => array(0x5E69), 0x2F888 => array(0x3862), 0x2F889 => array(0x22183),
3255
+					0x2F88A => array(0x387C), 0x2F88B => array(0x5EB0), 0x2F88C => array(0x5EB3),
3256
+					0x2F88D => array(0x5EB6), 0x2F88E => array(0x5ECA), 0x2F88F => array(0x2A392),
3257
+					0x2F890 => array(0x5EFE), 0x2F891 => array(0x22331), 0x2F892 => array(0x22331),
3258
+					0x2F893 => array(0x8201), 0x2F894 => array(0x5F22), 0x2F895 => array(0x5F22),
3259
+					0x2F896 => array(0x38C7), 0x2F897 => array(0x232B8), 0x2F898 => array(0x261DA),
3260
+					0x2F899 => array(0x5F62), 0x2F89A => array(0x5F6B), 0x2F89B => array(0x38E3),
3261
+					0x2F89C => array(0x5F9A), 0x2F89D => array(0x5FCD), 0x2F89E => array(0x5FD7),
3262
+					0x2F89F => array(0x5FF9), 0x2F8A0 => array(0x6081), 0x2F8A1 => array(0x393A),
3263
+					0x2F8A2 => array(0x391C), 0x2F8A3 => array(0x6094), 0x2F8A4 => array(0x226D4),
3264
+					0x2F8A5 => array(0x60C7), 0x2F8A6 => array(0x6148), 0x2F8A7 => array(0x614C),
3265
+					0x2F8A8 => array(0x614E), 0x2F8A9 => array(0x614C), 0x2F8AA => array(0x617A),
3266
+					0x2F8AB => array(0x618E), 0x2F8AC => array(0x61B2), 0x2F8AD => array(0x61A4),
3267
+					0x2F8AE => array(0x61AF), 0x2F8AF => array(0x61DE), 0x2F8B0 => array(0x61F2),
3268
+					0x2F8B1 => array(0x61F6), 0x2F8B2 => array(0x6210), 0x2F8B3 => array(0x621B),
3269
+					0x2F8B4 => array(0x625D), 0x2F8B5 => array(0x62B1), 0x2F8B6 => array(0x62D4),
3270
+					0x2F8B7 => array(0x6350), 0x2F8B8 => array(0x22B0C), 0x2F8B9 => array(0x633D),
3271
+					0x2F8BA => array(0x62FC), 0x2F8BB => array(0x6368), 0x2F8BC => array(0x6383),
3272
+					0x2F8BD => array(0x63E4), 0x2F8BE => array(0x22BF1), 0x2F8BF => array(0x6422),
3273
+					0x2F8C0 => array(0x63C5), 0x2F8C1 => array(0x63A9), 0x2F8C2 => array(0x3A2E),
3274
+					0x2F8C3 => array(0x6469), 0x2F8C4 => array(0x647E), 0x2F8C5 => array(0x649D),
3275
+					0x2F8C6 => array(0x6477), 0x2F8C7 => array(0x3A6C), 0x2F8C8 => array(0x654F),
3276
+					0x2F8C9 => array(0x656C), 0x2F8CA => array(0x2300A), 0x2F8CB => array(0x65E3),
3277
+					0x2F8CC => array(0x66F8), 0x2F8CD => array(0x6649), 0x2F8CE => array(0x3B19),
3278
+					0x2F8CF => array(0x6691), 0x2F8D0 => array(0x3B08), 0x2F8D1 => array(0x3AE4),
3279
+					0x2F8D2 => array(0x5192), 0x2F8D3 => array(0x5195), 0x2F8D4 => array(0x6700),
3280
+					0x2F8D5 => array(0x669C), 0x2F8D6 => array(0x80AD), 0x2F8D7 => array(0x43D9),
3281
+					0x2F8D8 => array(0x6717), 0x2F8D9 => array(0x671B), 0x2F8DA => array(0x6721),
3282
+					0x2F8DB => array(0x675E), 0x2F8DC => array(0x6753), 0x2F8DD => array(0x233C3),
3283
+					0x2F8DE => array(0x3B49), 0x2F8DF => array(0x67FA), 0x2F8E0 => array(0x6785),
3284
+					0x2F8E1 => array(0x6852), 0x2F8E2 => array(0x6885), 0x2F8E3 => array(0x2346D),
3285
+					0x2F8E4 => array(0x688E), 0x2F8E5 => array(0x681F), 0x2F8E6 => array(0x6914),
3286
+					0x2F8E7 => array(0x3B9D), 0x2F8E8 => array(0x6942), 0x2F8E9 => array(0x69A3),
3287
+					0x2F8EA => array(0x69EA), 0x2F8EB => array(0x6AA8), 0x2F8EC => array(0x236A3),
3288
+					0x2F8ED => array(0x6ADB), 0x2F8EE => array(0x3C18), 0x2F8EF => array(0x6B21),
3289
+					0x2F8F0 => array(0x238A7), 0x2F8F1 => array(0x6B54), 0x2F8F2 => array(0x3C4E),
3290
+					0x2F8F3 => array(0x6B72), 0x2F8F4 => array(0x6B9F), 0x2F8F5 => array(0x6BBA),
3291
+					0x2F8F6 => array(0x6BBB), 0x2F8F7 => array(0x23A8D), 0x2F8F8 => array(0x21D0B),
3292
+					0x2F8F9 => array(0x23AFA), 0x2F8FA => array(0x6C4E), 0x2F8FB => array(0x23CBC),
3293
+					0x2F8FC => array(0x6CBF), 0x2F8FD => array(0x6CCD), 0x2F8FE => array(0x6C67),
3294
+					0x2F8FF => array(0x6D16), 0x2F900 => array(0x6D3E), 0x2F901 => array(0x6D77),
3295
+					0x2F902 => array(0x6D41), 0x2F903 => array(0x6D69), 0x2F904 => array(0x6D78),
3296
+					0x2F905 => array(0x6D85), 0x2F906 => array(0x23D1E), 0x2F907 => array(0x6D34),
3297
+					0x2F908 => array(0x6E2F), 0x2F909 => array(0x6E6E), 0x2F90A => array(0x3D33),
3298
+					0x2F90B => array(0x6ECB), 0x2F90C => array(0x6EC7), 0x2F90D => array(0x23ED1),
3299
+					0x2F90E => array(0x6DF9), 0x2F90F => array(0x6F6E), 0x2F910 => array(0x23F5E),
3300
+					0x2F911 => array(0x23F8E), 0x2F912 => array(0x6FC6), 0x2F913 => array(0x7039),
3301
+					0x2F914 => array(0x701E), 0x2F915 => array(0x701B), 0x2F916 => array(0x3D96),
3302
+					0x2F917 => array(0x704A), 0x2F918 => array(0x707D), 0x2F919 => array(0x7077),
3303
+					0x2F91A => array(0x70AD), 0x2F91B => array(0x20525), 0x2F91C => array(0x7145),
3304
+					0x2F91D => array(0x24263), 0x2F91E => array(0x719C), 0x2F920 => array(0x7228),
3305
+					0x2F921 => array(0x7235), 0x2F922 => array(0x7250), 0x2F923 => array(0x24608),
3306
+					0x2F924 => array(0x7280), 0x2F925 => array(0x7295), 0x2F926 => array(0x24735),
3307
+					0x2F927 => array(0x24814), 0x2F928 => array(0x737A), 0x2F929 => array(0x738B),
3308
+					0x2F92A => array(0x3EAC), 0x2F92B => array(0x73A5), 0x2F92C => array(0x3EB8),
3309
+					0x2F92D => array(0x3EB8), 0x2F92E => array(0x7447), 0x2F92F => array(0x745C),
3310
+					0x2F930 => array(0x7471), 0x2F931 => array(0x7485), 0x2F932 => array(0x74CA),
3311
+					0x2F933 => array(0x3F1B), 0x2F934 => array(0x7524), 0x2F935 => array(0x24C36),
3312
+					0x2F936 => array(0x753E), 0x2F937 => array(0x24C92), 0x2F938 => array(0x7570),
3313
+					0x2F939 => array(0x2219F), 0x2F93A => array(0x7610), 0x2F93B => array(0x24FA1),
3314
+					0x2F93C => array(0x24FB8), 0x2F93D => array(0x25044), 0x2F93E => array(0x3FFC),
3315
+					0x2F93F => array(0x4008), 0x2F940 => array(0x76F4), 0x2F941 => array(0x250F3),
3316
+					0x2F942 => array(0x250F2), 0x2F943 => array(0x25119), 0x2F944 => array(0x25133),
3317
+					0x2F945 => array(0x771E), 0x2F946 => array(0x771F), 0x2F947 => array(0x771F),
3318
+					0x2F948 => array(0x774A), 0x2F949 => array(0x4039), 0x2F94A => array(0x778B),
3319
+					0x2F94B => array(0x4046), 0x2F94C => array(0x4096), 0x2F94D => array(0x2541D),
3320
+					0x2F94E => array(0x784E), 0x2F94F => array(0x788C), 0x2F950 => array(0x78CC),
3321
+					0x2F951 => array(0x40E3), 0x2F952 => array(0x25626), 0x2F953 => array(0x7956),
3322
+					0x2F954 => array(0x2569A), 0x2F955 => array(0x256C5), 0x2F956 => array(0x798F),
3323
+					0x2F957 => array(0x79EB), 0x2F958 => array(0x412F), 0x2F959 => array(0x7A40),
3324
+					0x2F95A => array(0x7A4A), 0x2F95B => array(0x7A4F), 0x2F95C => array(0x2597C),
3325
+					0x2F95D => array(0x25AA7), 0x2F95E => array(0x25AA7), 0x2F960 => array(0x4202),
3326
+					0x2F961 => array(0x25BAB), 0x2F962 => array(0x7BC6), 0x2F963 => array(0x7BC9),
3327
+					0x2F964 => array(0x4227), 0x2F965 => array(0x25C80), 0x2F966 => array(0x7CD2),
3328
+					0x2F967 => array(0x42A0), 0x2F968 => array(0x7CE8), 0x2F969 => array(0x7CE3),
3329
+					0x2F96A => array(0x7D00), 0x2F96B => array(0x25F86), 0x2F96C => array(0x7D63),
3330
+					0x2F96D => array(0x4301), 0x2F96E => array(0x7DC7), 0x2F96F => array(0x7E02),
3331
+					0x2F970 => array(0x7E45), 0x2F971 => array(0x4334), 0x2F972 => array(0x26228),
3332
+					0x2F973 => array(0x26247), 0x2F974 => array(0x4359), 0x2F975 => array(0x262D9),
3333
+					0x2F976 => array(0x7F7A), 0x2F977 => array(0x2633E), 0x2F978 => array(0x7F95),
3334
+					0x2F979 => array(0x7FFA), 0x2F97A => array(0x8005), 0x2F97B => array(0x264DA),
3335
+					0x2F97C => array(0x26523), 0x2F97D => array(0x8060), 0x2F97E => array(0x265A8),
3336
+					0x2F97F => array(0x8070), 0x2F980 => array(0x2335F), 0x2F981 => array(0x43D5),
3337
+					0x2F982 => array(0x80B2), 0x2F983 => array(0x8103), 0x2F984 => array(0x440B),
3338
+					0x2F985 => array(0x813E), 0x2F986 => array(0x5AB5), 0x2F987 => array(0x267A7),
3339
+					0x2F988 => array(0x267B5), 0x2F989 => array(0x23393), 0x2F98A => array(0x2339C),
3340
+					0x2F98B => array(0x8201), 0x2F98C => array(0x8204), 0x2F98D => array(0x8F9E),
3341
+					0x2F98E => array(0x446B), 0x2F98F => array(0x8291), 0x2F990 => array(0x828B),
3342
+					0x2F991 => array(0x829D), 0x2F992 => array(0x52B3), 0x2F993 => array(0x82B1),
3343
+					0x2F994 => array(0x82B3), 0x2F995 => array(0x82BD), 0x2F996 => array(0x82E6),
3344
+					0x2F997 => array(0x26B3C), 0x2F998 => array(0x82E5), 0x2F999 => array(0x831D),
3345
+					0x2F99A => array(0x8363), 0x2F99B => array(0x83AD), 0x2F99C => array(0x8323),
3346
+					0x2F99D => array(0x83BD), 0x2F99E => array(0x83E7), 0x2F99F => array(0x8457),
3347
+					0x2F9A0 => array(0x8353), 0x2F9A1 => array(0x83CA), 0x2F9A2 => array(0x83CC),
3348
+					0x2F9A3 => array(0x83DC), 0x2F9A4 => array(0x26C36), 0x2F9A5 => array(0x26D6B),
3349
+					0x2F9A6 => array(0x26CD5), 0x2F9A7 => array(0x452B), 0x2F9A8 => array(0x84F1),
3350
+					0x2F9A9 => array(0x84F3), 0x2F9AA => array(0x8516), 0x2F9AB => array(0x273CA),
3351
+					0x2F9AC => array(0x8564), 0x2F9AD => array(0x26F2C), 0x2F9AE => array(0x455D),
3352
+					0x2F9AF => array(0x4561), 0x2F9B0 => array(0x26FB1), 0x2F9B1 => array(0x270D2),
3353
+					0x2F9B2 => array(0x456B), 0x2F9B3 => array(0x8650), 0x2F9B4 => array(0x865C),
3354
+					0x2F9B5 => array(0x8667), 0x2F9B6 => array(0x8669), 0x2F9B7 => array(0x86A9),
3355
+					0x2F9B8 => array(0x8688), 0x2F9B9 => array(0x870E), 0x2F9BA => array(0x86E2),
3356
+					0x2F9BB => array(0x8779), 0x2F9BC => array(0x8728), 0x2F9BD => array(0x876B),
3357
+					0x2F9BE => array(0x8786), 0x2F9C0 => array(0x87E1), 0x2F9C1 => array(0x8801),
3358
+					0x2F9C2 => array(0x45F9), 0x2F9C3 => array(0x8860), 0x2F9C4 => array(0x8863),
3359
+					0x2F9C5 => array(0x27667), 0x2F9C6 => array(0x88D7), 0x2F9C7 => array(0x88DE),
3360
+					0x2F9C8 => array(0x4635), 0x2F9C9 => array(0x88FA), 0x2F9CA => array(0x34BB),
3361
+					0x2F9CB => array(0x278AE), 0x2F9CC => array(0x27966), 0x2F9CD => array(0x46BE),
3362
+					0x2F9CE => array(0x46C7), 0x2F9CF => array(0x8AA0), 0x2F9D0 => array(0x8AED),
3363
+					0x2F9D1 => array(0x8B8A), 0x2F9D2 => array(0x8C55), 0x2F9D3 => array(0x27CA8),
3364
+					0x2F9D4 => array(0x8CAB), 0x2F9D5 => array(0x8CC1), 0x2F9D6 => array(0x8D1B),
3365
+					0x2F9D7 => array(0x8D77), 0x2F9D8 => array(0x27F2F), 0x2F9D9 => array(0x20804),
3366
+					0x2F9DA => array(0x8DCB), 0x2F9DB => array(0x8DBC), 0x2F9DC => array(0x8DF0),
3367
+					0x2F9DD => array(0x208DE), 0x2F9DE => array(0x8ED4), 0x2F9DF => array(0x8F38),
3368
+					0x2F9E0 => array(0x285D2), 0x2F9E1 => array(0x285ED), 0x2F9E2 => array(0x9094),
3369
+					0x2F9E3 => array(0x90F1), 0x2F9E4 => array(0x9111), 0x2F9E5 => array(0x2872E),
3370
+					0x2F9E6 => array(0x911B), 0x2F9E7 => array(0x9238), 0x2F9E8 => array(0x92D7),
3371
+					0x2F9E9 => array(0x92D8), 0x2F9EA => array(0x927C), 0x2F9EB => array(0x93F9),
3372
+					0x2F9EC => array(0x9415), 0x2F9ED => array(0x28BFA), 0x2F9EE => array(0x958B),
3373
+					0x2F9EF => array(0x4995), 0x2F9F0 => array(0x95B7), 0x2F9F1 => array(0x28D77),
3374
+					0x2F9F2 => array(0x49E6), 0x2F9F3 => array(0x96C3), 0x2F9F4 => array(0x5DB2),
3375
+					0x2F9F5 => array(0x9723), 0x2F9F6 => array(0x29145), 0x2F9F7 => array(0x2921A),
3376
+					0x2F9F8 => array(0x4A6E), 0x2F9F9 => array(0x4A76), 0x2F9FA => array(0x97E0),
3377
+					0x2F9FB => array(0x2940A), 0x2F9FC => array(0x4AB2), 0x2F9FD => array(0x29496),
3378
+					0x2F9FE => array(0x980B), 0x2F9FF => array(0x980B), 0x2FA00 => array(0x9829),
3379
+					0x2FA01 => array(0x295B6), 0x2FA02 => array(0x98E2), 0x2FA03 => array(0x4B33),
3380
+					0x2FA04 => array(0x9929), 0x2FA05 => array(0x99A7), 0x2FA06 => array(0x99C2),
3381
+					0x2FA07 => array(0x99FE), 0x2FA08 => array(0x4BCE), 0x2FA09 => array(0x29B30),
3382
+					0x2FA0A => array(0x9B12), 0x2FA0B => array(0x9C40), 0x2FA0C => array(0x9CFD),
3383
+					0x2FA0D => array(0x4CCE), 0x2FA0E => array(0x4CED), 0x2FA0F => array(0x9D67),
3384
+					0x2FA10 => array(0x2A0CE), 0x2FA11 => array(0x4CF8), 0x2FA12 => array(0x2A105),
3385
+					0x2FA13 => array(0x2A20E), 0x2FA14 => array(0x2A291), 0x2FA15 => array(0x9EBB),
3386
+					0x2FA16 => array(0x4D56), 0x2FA17 => array(0x9EF9), 0x2FA18 => array(0x9EFE),
3387
+					0x2FA19 => array(0x9F05), 0x2FA1A => array(0x9F0F), 0x2FA1B => array(0x9F16),
3388
+					0x2FA1C => array(0x9F3B), 0x2FA1D => array(0x2A600)
3389
+			),
3390
+			'norm_combcls' => array(0x334 => 1, 0x335 => 1, 0x336 => 1, 0x337 => 1,
3391
+					0x338 => 1, 0x93C => 7, 0x9BC => 7, 0xA3C => 7, 0xABC => 7,
3392
+					0xB3C => 7, 0xCBC => 7, 0x1037 => 7, 0x3099 => 8, 0x309A => 8,
3393
+					0x94D => 9, 0x9CD => 9, 0xA4D => 9, 0xACD => 9, 0xB4D => 9,
3394
+					0xBCD => 9, 0xC4D => 9, 0xCCD => 9, 0xD4D => 9, 0xDCA => 9,
3395
+					0xE3A => 9, 0xF84 => 9, 0x1039 => 9, 0x1714 => 9, 0x1734 => 9,
3396
+					0x17D2 => 9, 0x5B0 => 10, 0x5B1 => 11, 0x5B2 => 12, 0x5B3 => 13,
3397
+					0x5B4 => 14, 0x5B5 => 15, 0x5B6 => 16, 0x5B7 => 17, 0x5B8 => 18,
3398
+					0x5B9 => 19, 0x5BB => 20, 0x5Bc => 21, 0x5BD => 22, 0x5BF => 23,
3399
+					0x5C1 => 24, 0x5C2 => 25, 0xFB1E => 26, 0x64B => 27, 0x64C => 28,
3400
+					0x64D => 29, 0x64E => 30, 0x64F => 31, 0x650 => 32, 0x651 => 33,
3401
+					0x652 => 34, 0x670 => 35, 0x711 => 36, 0xC55 => 84, 0xC56 => 91,
3402
+					0xE38 => 103, 0xE39 => 103, 0xE48 => 107, 0xE49 => 107, 0xE4A => 107,
3403
+					0xE4B => 107, 0xEB8 => 118, 0xEB9 => 118, 0xEC8 => 122, 0xEC9 => 122,
3404
+					0xECA => 122, 0xECB => 122, 0xF71 => 129, 0xF72 => 130, 0xF7A => 130,
3405
+					0xF7B => 130, 0xF7C => 130, 0xF7D => 130, 0xF80 => 130, 0xF74 => 132,
3406
+					0x321 => 202, 0x322 => 202, 0x327 => 202, 0x328 => 202, 0x31B => 216,
3407
+					0xF39 => 216, 0x1D165 => 216, 0x1D166 => 216, 0x1D16E => 216, 0x1D16F => 216,
3408
+					0x1D170 => 216, 0x1D171 => 216, 0x1D172 => 216, 0x302A => 218, 0x316 => 220,
3409
+					0x317 => 220, 0x318 => 220, 0x319 => 220, 0x31C => 220, 0x31D => 220,
3410
+					0x31E => 220, 0x31F => 220, 0x320 => 220, 0x323 => 220, 0x324 => 220,
3411
+					0x325 => 220, 0x326 => 220, 0x329 => 220, 0x32A => 220, 0x32B => 220,
3412
+					0x32C => 220, 0x32D => 220, 0x32E => 220, 0x32F => 220, 0x330 => 220,
3413
+					0x331 => 220, 0x332 => 220, 0x333 => 220, 0x339 => 220, 0x33A => 220,
3414
+					0x33B => 220, 0x33C => 220, 0x347 => 220, 0x348 => 220, 0x349 => 220,
3415
+					0x34D => 220, 0x34E => 220, 0x353 => 220, 0x354 => 220, 0x355 => 220,
3416
+					0x356 => 220, 0x591 => 220, 0x596 => 220, 0x59B => 220, 0x5A3 => 220,
3417
+					0x5A4 => 220, 0x5A5 => 220, 0x5A6 => 220, 0x5A7 => 220, 0x5AA => 220,
3418
+					0x655 => 220, 0x656 => 220, 0x6E3 => 220, 0x6EA => 220, 0x6ED => 220,
3419
+					0x731 => 220, 0x734 => 220, 0x737 => 220, 0x738 => 220, 0x739 => 220,
3420
+					0x73B => 220, 0x73C => 220, 0x73E => 220, 0x742 => 220, 0x744 => 220,
3421
+					0x746 => 220, 0x748 => 220, 0x952 => 220, 0xF18 => 220, 0xF19 => 220,
3422
+					0xF35 => 220, 0xF37 => 220, 0xFC6 => 220, 0x193B => 220, 0x20E8 => 220,
3423
+					0x1D17B => 220, 0x1D17C => 220, 0x1D17D => 220, 0x1D17E => 220, 0x1D17F => 220,
3424
+					0x1D180 => 220, 0x1D181 => 220, 0x1D182 => 220, 0x1D18A => 220, 0x1D18B => 220,
3425
+					0x59A => 222, 0x5AD => 222, 0x1929 => 222, 0x302D => 222, 0x302E => 224,
3426
+					0x302F => 224, 0x1D16D => 226, 0x5AE => 228, 0x18A9 => 228, 0x302B => 228,
3427
+					0x300 => 230, 0x301 => 230, 0x302 => 230, 0x303 => 230, 0x304 => 230,
3428
+					0x305 => 230, 0x306 => 230, 0x307 => 230, 0x308 => 230, 0x309 => 230,
3429
+					0x30A => 230, 0x30B => 230, 0x30C => 230, 0x30D => 230, 0x30E => 230,
3430
+					0x30F => 230, 0x310 => 230, 0x311 => 230, 0x312 => 230, 0x313 => 230,
3431
+					0x314 => 230, 0x33D => 230, 0x33E => 230, 0x33F => 230, 0x340 => 230,
3432
+					0x341 => 230, 0x342 => 230, 0x343 => 230, 0x344 => 230, 0x346 => 230,
3433
+					0x34A => 230, 0x34B => 230, 0x34C => 230, 0x350 => 230, 0x351 => 230,
3434
+					0x352 => 230, 0x357 => 230, 0x363 => 230, 0x364 => 230, 0x365 => 230,
3435
+					0x366 => 230, 0x367 => 230, 0x368 => 230, 0x369 => 230, 0x36A => 230,
3436
+					0x36B => 230, 0x36C => 230, 0x36D => 230, 0x36E => 230, 0x36F => 230,
3437
+					0x483 => 230, 0x484 => 230, 0x485 => 230, 0x486 => 230, 0x592 => 230,
3438
+					0x593 => 230, 0x594 => 230, 0x595 => 230, 0x597 => 230, 0x598 => 230,
3439
+					0x599 => 230, 0x59C => 230, 0x59D => 230, 0x59E => 230, 0x59F => 230,
3440
+					0x5A0 => 230, 0x5A1 => 230, 0x5A8 => 230, 0x5A9 => 230, 0x5AB => 230,
3441
+					0x5AC => 230, 0x5AF => 230, 0x5C4 => 230, 0x610 => 230, 0x611 => 230,
3442
+					0x612 => 230, 0x613 => 230, 0x614 => 230, 0x615 => 230, 0x653 => 230,
3443
+					0x654 => 230, 0x657 => 230, 0x658 => 230, 0x6D6 => 230, 0x6D7 => 230,
3444
+					0x6D8 => 230, 0x6D9 => 230, 0x6DA => 230, 0x6DB => 230, 0x6DC => 230,
3445
+					0x6DF => 230, 0x6E0 => 230, 0x6E1 => 230, 0x6E2 => 230, 0x6E4 => 230,
3446
+					0x6E7 => 230, 0x6E8 => 230, 0x6EB => 230, 0x6EC => 230, 0x730 => 230,
3447
+					0x732 => 230, 0x733 => 230, 0x735 => 230, 0x736 => 230, 0x73A => 230,
3448
+					0x73D => 230, 0x73F => 230, 0x740 => 230, 0x741 => 230, 0x743 => 230,
3449
+					0x745 => 230, 0x747 => 230, 0x749 => 230, 0x74A => 230, 0x951 => 230,
3450
+					0x953 => 230, 0x954 => 230, 0xF82 => 230, 0xF83 => 230, 0xF86 => 230,
3451
+					0xF87 => 230, 0x170D => 230, 0x193A => 230, 0x20D0 => 230, 0x20D1 => 230,
3452
+					0x20D4 => 230, 0x20D5 => 230, 0x20D6 => 230, 0x20D7 => 230, 0x20DB => 230,
3453
+					0x20DC => 230, 0x20E1 => 230, 0x20E7 => 230, 0x20E9 => 230, 0xFE20 => 230,
3454
+					0xFE21 => 230, 0xFE22 => 230, 0xFE23 => 230, 0x1D185 => 230, 0x1D186 => 230,
3455
+					0x1D187 => 230, 0x1D189 => 230, 0x1D188 => 230, 0x1D1AA => 230, 0x1D1AB => 230,
3456
+					0x1D1AC => 230, 0x1D1AD => 230, 0x315 => 232, 0x31A => 232, 0x302C => 232,
3457
+					0x35F => 233, 0x362 => 233, 0x35D => 234, 0x35E => 234, 0x360 => 234,
3458
+					0x361 => 234, 0x345 => 240
3459
+			)
3460
+	);
3461 3461
 }
3462 3462
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +24 added lines, -27 removed lines patch added patch discarded remove patch
@@ -73,16 +73,16 @@  discard block
 block discarded – undo
73 73
     protected $_lcount = 19;
74 74
     protected $_vcount = 21;
75 75
     protected $_tcount = 28;
76
-    protected $_ncount = 588;   // _vcount * _tcount
76
+    protected $_ncount = 588; // _vcount * _tcount
77 77
     protected $_scount = 11172; // _lcount * _tcount * _vcount
78 78
     protected $_error = false;
79 79
     protected static $_mb_string_overload = null;
80 80
     // See {@link set_paramter()} for details of how to change the following
81 81
     // settings from within your script / application
82
-    protected $_api_encoding = 'utf8';   // Default input charset is UTF-8
83
-    protected $_allow_overlong = false;  // Overlong UTF-8 encodings are forbidden
84
-    protected $_strict_mode = false;     // Behave strict or not
85
-    protected $_idn_version = 2003;      // Can be either 2003 (old, default) or 2008
82
+    protected $_api_encoding = 'utf8'; // Default input charset is UTF-8
83
+    protected $_allow_overlong = false; // Overlong UTF-8 encodings are forbidden
84
+    protected $_strict_mode = false; // Behave strict or not
85
+    protected $_idn_version = 2003; // Can be either 2003 (old, default) or 2008
86 86
 
87 87
     /**
88 88
      * the constructor
@@ -107,7 +107,7 @@  discard block
 block discarded – undo
107 107
 
108 108
     public function get_version()
109 109
     {
110
-        return $this->version.'-'.$this->sub_version;
110
+        return $this->version . '-' . $this->sub_version;
111 111
     }
112 112
 
113 113
     /**
@@ -241,12 +241,12 @@  discard block
 block discarded – undo
241 241
                     }
242 242
                 }
243 243
                 $parsed['host'] = join('.', $arr);
244
-                $return = (empty($parsed['scheme']) ? '' : $parsed['scheme'] . (strtolower($parsed['scheme']) == 'mailto' ? ':' : '://')).
245
-                        (empty($parsed['user']) ? '' : $parsed['user'] . (empty($parsed['pass']) ? '' : ':' . $parsed['pass']) . '@').
246
-                        $parsed['host'].
247
-                        (empty($parsed['port']) ? '' : ':' . $parsed['port']).
248
-                        (empty($parsed['path']) ? '' : $parsed['path']).
249
-                        (empty($parsed['query']) ? '' : '?' . $parsed['query']).
244
+                $return = (empty($parsed['scheme']) ? '' : $parsed['scheme'] . (strtolower($parsed['scheme']) == 'mailto' ? ':' : '://')) .
245
+                        (empty($parsed['user']) ? '' : $parsed['user'] . (empty($parsed['pass']) ? '' : ':' . $parsed['pass']) . '@') .
246
+                        $parsed['host'] .
247
+                        (empty($parsed['port']) ? '' : ':' . $parsed['port']) .
248
+                        (empty($parsed['path']) ? '' : $parsed['path']) .
249
+                        (empty($parsed['query']) ? '' : '?' . $parsed['query']) .
250 250
                         (empty($parsed['fragment']) ? '' : '#' . $parsed['fragment']);
251 251
             } else { // parse_url seems to have failed, try without it
252 252
                 $arr = explode('.', $input);
@@ -265,8 +265,8 @@  discard block
 block discarded – undo
265 265
         // The output is UTF-8 by default, other output formats need conversion here
266 266
         // If one time encoding is given, use this, else the objects property
267 267
         switch (($one_time_encoding) ? $one_time_encoding : $this->_api_encoding) {
268
-            case 'utf8':        return $return; // break;
269
-            case 'ucs4_string': return $this->_ucs4_to_ucs4_string($this->_utf8_to_ucs4($return));  // break;
268
+            case 'utf8' : return $return; // break;
269
+            case 'ucs4_string': return $this->_ucs4_to_ucs4_string($this->_utf8_to_ucs4($return)); // break;
270 270
             case 'ucs4_array':  return $this->_utf8_to_ucs4($return); // break;
271 271
             default:            $this->_error('Unsupported output format'); return false;
272 272
         }
@@ -283,8 +283,7 @@  discard block
 block discarded – undo
283 283
         // Forcing conversion of input to UCS4 array
284 284
         // If one time encoding is given, use this, else the objects property
285 285
         switch ($one_time_encoding ? $one_time_encoding : $this->_api_encoding) {
286
-            case 'utf8':
287
-                $decoded = $this->_utf8_to_ucs4($decoded);
286
+            case 'utf8' : $decoded = $this->_utf8_to_ucs4($decoded);
288 287
                 break;
289 288
             case 'ucs4_string':
290 289
                 $decoded = $this->_ucs4_string_to_ucs4($decoded);
@@ -380,12 +379,12 @@  discard block
 block discarded – undo
380 379
             }
381 380
         }
382 381
         $parsed['host'] = join('.', $arr);
383
-        $return = (empty($parsed['scheme']) ? '' : $parsed['scheme'] . (strtolower($parsed['scheme']) == 'mailto' ? ':' : '://')).
384
-                (empty($parsed['user']) ? '' : $parsed['user'] . (empty($parsed['pass']) ? '' : ':' . $parsed['pass']) . '@').
385
-                $parsed['host'].
386
-                (empty($parsed['port']) ? '' : ':' . $parsed['port']).
387
-                (empty($parsed['path']) ? '' : $parsed['path']).
388
-                (empty($parsed['query']) ? '' : '?' . $parsed['query']).
382
+        $return = (empty($parsed['scheme']) ? '' : $parsed['scheme'] . (strtolower($parsed['scheme']) == 'mailto' ? ':' : '://')) .
383
+                (empty($parsed['user']) ? '' : $parsed['user'] . (empty($parsed['pass']) ? '' : ':' . $parsed['pass']) . '@') .
384
+                $parsed['host'] .
385
+                (empty($parsed['port']) ? '' : ':' . $parsed['port']) .
386
+                (empty($parsed['path']) ? '' : $parsed['path']) .
387
+                (empty($parsed['query']) ? '' : '?' . $parsed['query']) .
389 388
                 (empty($parsed['fragment']) ? '' : '#' . $parsed['fragment']);
390 389
         return $return;
391 390
     }
@@ -439,8 +438,7 @@  discard block
 block discarded – undo
439 438
             for ($old_idx = $idx, $w = 1, $k = $this->_base; 1; $k += $this->_base) {
440 439
                 $digit = $this->_decode_digit($encoded{$enco_idx++});
441 440
                 $idx += $digit * $w;
442
-                $t = ($k <= $bias) ? $this->_tmin :
443
-                        (($k >= $bias + $this->_tmax) ? $this->_tmax : ($k - $bias));
441
+                $t = ($k <= $bias) ? $this->_tmin : (($k >= $bias + $this->_tmax) ? $this->_tmax : ($k - $bias));
444 442
                 if ($digit < $t) {
445 443
                     break;
446 444
                 }
@@ -540,8 +538,7 @@  discard block
 block discarded – undo
540 538
                     $delta++;
541 539
                 } elseif ($decoded[$i] == $cur_code) {
542 540
                     for ($q = $delta, $k = $this->_base; 1; $k += $this->_base) {
543
-                        $t = ($k <= $bias) ? $this->_tmin :
544
-                                (($k >= $bias + $this->_tmax) ? $this->_tmax : $k - $bias);
541
+                        $t = ($k <= $bias) ? $this->_tmin : (($k >= $bias + $this->_tmax) ? $this->_tmax : $k - $bias);
545 542
                         if ($q < $t) {
546 543
                             break;
547 544
                         }
@@ -995,7 +992,7 @@  discard block
 block discarded – undo
995 992
                 $out_len++;
996 993
                 $output[$out_len] = 0;
997 994
             }
998
-            $output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4) ) );
995
+            $output[$out_len] += ord($input{$i}) << (8 * (3 - ($i % 4)));
999 996
         }
1000 997
         return $output;
1001 998
     }
Please login to merge, or discard this patch.
libs/PEAR.1.9.5/HTTP/Request2.php 3 patches
Doc Comments   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -261,7 +261,7 @@  discard block
 block discarded – undo
261 261
     /**
262 262
      * Returns the request URL
263 263
      *
264
-     * @return   Net_URL2
264
+     * @return   string
265 265
      */
266 266
     public function getUrl()
267 267
     {
@@ -573,7 +573,7 @@  discard block
 block discarded – undo
573 573
      * If you provide file pointer rather than file name, it should support
574 574
      * fstat() and rewind() operations.
575 575
      *
576
-     * @param string|resource|HTTP_Request2_MultipartBody $body       Either a
576
+     * @param string $body       Either a
577 577
      *               string with the body or filename containing body or
578 578
      *               pointer to an open file or object with multipart body data
579 579
      * @param bool                                        $isFilename Whether
@@ -892,7 +892,7 @@  discard block
 block discarded – undo
892 892
     /**
893 893
      * Returns current CookieJar object or null if none
894 894
      *
895
-     * @return HTTP_Request2_CookieJar|null
895
+     * @return HTTP_Request2_CookieJar
896 896
      */
897 897
     public function getCookieJar()
898 898
     {
Please login to merge, or discard this patch.
Indentation   +977 added lines, -977 removed lines patch added patch discarded remove patch
@@ -41,990 +41,990 @@
 block discarded – undo
41 41
  */
42 42
 class HTTP_Request2 implements SplSubject
43 43
 {
44
-    /**#@+
44
+	/**#@+
45 45
      * Constants for HTTP request methods
46 46
      *
47 47
      * @link http://tools.ietf.org/html/rfc2616#section-5.1.1
48 48
      */
49
-    const METHOD_OPTIONS = 'OPTIONS';
50
-    const METHOD_GET     = 'GET';
51
-    const METHOD_HEAD    = 'HEAD';
52
-    const METHOD_POST    = 'POST';
53
-    const METHOD_PUT     = 'PUT';
54
-    const METHOD_DELETE  = 'DELETE';
55
-    const METHOD_TRACE   = 'TRACE';
56
-    const METHOD_CONNECT = 'CONNECT';
57
-    /**#@-*/
58
-
59
-    /**#@+
49
+	const METHOD_OPTIONS = 'OPTIONS';
50
+	const METHOD_GET     = 'GET';
51
+	const METHOD_HEAD    = 'HEAD';
52
+	const METHOD_POST    = 'POST';
53
+	const METHOD_PUT     = 'PUT';
54
+	const METHOD_DELETE  = 'DELETE';
55
+	const METHOD_TRACE   = 'TRACE';
56
+	const METHOD_CONNECT = 'CONNECT';
57
+	/**#@-*/
58
+
59
+	/**#@+
60 60
      * Constants for HTTP authentication schemes
61 61
      *
62 62
      * @link http://tools.ietf.org/html/rfc2617
63 63
      */
64
-    const AUTH_BASIC  = 'basic';
65
-    const AUTH_DIGEST = 'digest';
66
-    /**#@-*/
67
-
68
-    /**
69
-     * Regular expression used to check for invalid symbols in RFC 2616 tokens
70
-     * @link http://pear.php.net/bugs/bug.php?id=15630
71
-     */
72
-    const REGEXP_INVALID_TOKEN = '![\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]!';
73
-
74
-    /**
75
-     * Regular expression used to check for invalid symbols in cookie strings
76
-     * @link http://pear.php.net/bugs/bug.php?id=15630
77
-     * @link http://web.archive.org/web/20080331104521/http://cgi.netscape.com/newsref/std/cookie_spec.html
78
-     */
79
-    const REGEXP_INVALID_COOKIE = '/[\s,;]/';
80
-
81
-    /**
82
-     * Fileinfo magic database resource
83
-     * @var  resource
84
-     * @see  detectMimeType()
85
-     */
86
-    private static $_fileinfoDb;
87
-
88
-    /**
89
-     * Observers attached to the request (instances of SplObserver)
90
-     * @var  array
91
-     */
92
-    protected $observers = array();
93
-
94
-    /**
95
-     * Request URL
96
-     * @var  Net_URL2
97
-     */
98
-    protected $url;
99
-
100
-    /**
101
-     * Request method
102
-     * @var  string
103
-     */
104
-    protected $method = self::METHOD_GET;
105
-
106
-    /**
107
-     * Authentication data
108
-     * @var  array
109
-     * @see  getAuth()
110
-     */
111
-    protected $auth;
112
-
113
-    /**
114
-     * Request headers
115
-     * @var  array
116
-     */
117
-    protected $headers = array();
118
-
119
-    /**
120
-     * Configuration parameters
121
-     * @var  array
122
-     * @see  setConfig()
123
-     */
124
-    protected $config = array(
125
-        'adapter'           => 'HTTP_Request2_Adapter_Socket',
126
-        'connect_timeout'   => 10,
127
-        'timeout'           => 0,
128
-        'use_brackets'      => true,
129
-        'protocol_version'  => '1.1',
130
-        'buffer_size'       => 16384,
131
-        'store_body'        => true,
132
-        'local_ip'          => null,
133
-
134
-        'proxy_host'        => '',
135
-        'proxy_port'        => '',
136
-        'proxy_user'        => '',
137
-        'proxy_password'    => '',
138
-        'proxy_auth_scheme' => self::AUTH_BASIC,
139
-        'proxy_type'        => 'http',
140
-
141
-        'ssl_verify_peer'   => true,
142
-        'ssl_verify_host'   => true,
143
-        'ssl_cafile'        => null,
144
-        'ssl_capath'        => null,
145
-        'ssl_local_cert'    => null,
146
-        'ssl_passphrase'    => null,
147
-
148
-        'digest_compat_ie'  => false,
149
-
150
-        'follow_redirects'  => false,
151
-        'max_redirects'     => 5,
152
-        'strict_redirects'  => false
153
-    );
154
-
155
-    /**
156
-     * Last event in request / response handling, intended for observers
157
-     * @var  array
158
-     * @see  getLastEvent()
159
-     */
160
-    protected $lastEvent = array(
161
-        'name' => 'start',
162
-        'data' => null
163
-    );
164
-
165
-    /**
166
-     * Request body
167
-     * @var  string|resource
168
-     * @see  setBody()
169
-     */
170
-    protected $body = '';
171
-
172
-    /**
173
-     * Array of POST parameters
174
-     * @var  array
175
-     */
176
-    protected $postParams = array();
177
-
178
-    /**
179
-     * Array of file uploads (for multipart/form-data POST requests)
180
-     * @var  array
181
-     */
182
-    protected $uploads = array();
183
-
184
-    /**
185
-     * Adapter used to perform actual HTTP request
186
-     * @var  HTTP_Request2_Adapter
187
-     */
188
-    protected $adapter;
189
-
190
-    /**
191
-     * Cookie jar to persist cookies between requests
192
-     * @var HTTP_Request2_CookieJar
193
-     */
194
-    protected $cookieJar = null;
195
-
196
-    /**
197
-     * Constructor. Can set request URL, method and configuration array.
198
-     *
199
-     * Also sets a default value for User-Agent header.
200
-     *
201
-     * @param string|Net_Url2 $url    Request URL
202
-     * @param string          $method Request method
203
-     * @param array           $config Configuration for this Request instance
204
-     */
205
-    public function __construct(
206
-        $url = null, $method = self::METHOD_GET, array $config = array()
207
-    ) {
208
-        $this->setConfig($config);
209
-        if (!empty($url)) {
210
-            $this->setUrl($url);
211
-        }
212
-        if (!empty($method)) {
213
-            $this->setMethod($method);
214
-        }
215
-        $this->setHeader(
216
-            'user-agent', 'HTTP_Request2/2.2.1 ' .
217
-            '(http://pear.php.net/package/http_request2) PHP/' . phpversion()
218
-        );
219
-    }
220
-
221
-    /**
222
-     * Sets the URL for this request
223
-     *
224
-     * If the URL has userinfo part (username & password) these will be removed
225
-     * and converted to auth data. If the URL does not have a path component,
226
-     * that will be set to '/'.
227
-     *
228
-     * @param string|Net_URL2 $url Request URL
229
-     *
230
-     * @return   HTTP_Request2
231
-     * @throws   HTTP_Request2_LogicException
232
-     */
233
-    public function setUrl($url)
234
-    {
235
-        if (is_string($url)) {
236
-            $url = new Net_URL2(
237
-                $url, array(Net_URL2::OPTION_USE_BRACKETS => $this->config['use_brackets'])
238
-            );
239
-        }
240
-        if (!$url instanceof Net_URL2) {
241
-            throw new HTTP_Request2_LogicException(
242
-                'Parameter is not a valid HTTP URL',
243
-                HTTP_Request2_Exception::INVALID_ARGUMENT
244
-            );
245
-        }
246
-        // URL contains username / password?
247
-        if ($url->getUserinfo()) {
248
-            $username = $url->getUser();
249
-            $password = $url->getPassword();
250
-            $this->setAuth(rawurldecode($username), $password? rawurldecode($password): '');
251
-            $url->setUserinfo('');
252
-        }
253
-        if ('' == $url->getPath()) {
254
-            $url->setPath('/');
255
-        }
256
-        $this->url = $url;
257
-
258
-        return $this;
259
-    }
260
-
261
-    /**
262
-     * Returns the request URL
263
-     *
264
-     * @return   Net_URL2
265
-     */
266
-    public function getUrl()
267
-    {
268
-        return $this->url;
269
-    }
270
-
271
-    /**
272
-     * Sets the request method
273
-     *
274
-     * @param string $method one of the methods defined in RFC 2616
275
-     *
276
-     * @return   HTTP_Request2
277
-     * @throws   HTTP_Request2_LogicException if the method name is invalid
278
-     */
279
-    public function setMethod($method)
280
-    {
281
-        // Method name should be a token: http://tools.ietf.org/html/rfc2616#section-5.1.1
282
-        if (preg_match(self::REGEXP_INVALID_TOKEN, $method)) {
283
-            throw new HTTP_Request2_LogicException(
284
-                "Invalid request method '{$method}'",
285
-                HTTP_Request2_Exception::INVALID_ARGUMENT
286
-            );
287
-        }
288
-        $this->method = $method;
289
-
290
-        return $this;
291
-    }
292
-
293
-    /**
294
-     * Returns the request method
295
-     *
296
-     * @return   string
297
-     */
298
-    public function getMethod()
299
-    {
300
-        return $this->method;
301
-    }
302
-
303
-    /**
304
-     * Sets the configuration parameter(s)
305
-     *
306
-     * The following parameters are available:
307
-     * <ul>
308
-     *   <li> 'adapter'           - adapter to use (string)</li>
309
-     *   <li> 'connect_timeout'   - Connection timeout in seconds (integer)</li>
310
-     *   <li> 'timeout'           - Total number of seconds a request can take.
311
-     *                              Use 0 for no limit, should be greater than
312
-     *                              'connect_timeout' if set (integer)</li>
313
-     *   <li> 'use_brackets'      - Whether to append [] to array variable names (bool)</li>
314
-     *   <li> 'protocol_version'  - HTTP Version to use, '1.0' or '1.1' (string)</li>
315
-     *   <li> 'buffer_size'       - Buffer size to use for reading and writing (int)</li>
316
-     *   <li> 'store_body'        - Whether to store response body in response object.
317
-     *                              Set to false if receiving a huge response and
318
-     *                              using an Observer to save it (boolean)</li>
319
-     *   <li> 'local_ip'          - Specifies the IP address that will be used for accessing
320
-     *                              the network (string)</li>
321
-     *   <li> 'proxy_type'        - Proxy type, 'http' or 'socks5' (string)</li>
322
-     *   <li> 'proxy_host'        - Proxy server host (string)</li>
323
-     *   <li> 'proxy_port'        - Proxy server port (integer)</li>
324
-     *   <li> 'proxy_user'        - Proxy auth username (string)</li>
325
-     *   <li> 'proxy_password'    - Proxy auth password (string)</li>
326
-     *   <li> 'proxy_auth_scheme' - Proxy auth scheme, one of HTTP_Request2::AUTH_* constants (string)</li>
327
-     *   <li> 'proxy'             - Shorthand for proxy_* parameters, proxy given as URL,
328
-     *                              e.g. 'socks5://localhost:1080/' (string)</li>
329
-     *   <li> 'ssl_verify_peer'   - Whether to verify peer's SSL certificate (bool)</li>
330
-     *   <li> 'ssl_verify_host'   - Whether to check that Common Name in SSL
331
-     *                              certificate matches host name (bool)</li>
332
-     *   <li> 'ssl_cafile'        - Cerificate Authority file to verify the peer
333
-     *                              with (use with 'ssl_verify_peer') (string)</li>
334
-     *   <li> 'ssl_capath'        - Directory holding multiple Certificate
335
-     *                              Authority files (string)</li>
336
-     *   <li> 'ssl_local_cert'    - Name of a file containing local cerificate (string)</li>
337
-     *   <li> 'ssl_passphrase'    - Passphrase with which local certificate
338
-     *                              was encoded (string)</li>
339
-     *   <li> 'digest_compat_ie'  - Whether to imitate behaviour of MSIE 5 and 6
340
-     *                              in using URL without query string in digest
341
-     *                              authentication (boolean)</li>
342
-     *   <li> 'follow_redirects'  - Whether to automatically follow HTTP Redirects (boolean)</li>
343
-     *   <li> 'max_redirects'     - Maximum number of redirects to follow (integer)</li>
344
-     *   <li> 'strict_redirects'  - Whether to keep request method on redirects via status 301 and
345
-     *                              302 (true, needed for compatibility with RFC 2616)
346
-     *                              or switch to GET (false, needed for compatibility with most
347
-     *                              browsers) (boolean)</li>
348
-     * </ul>
349
-     *
350
-     * @param string|array $nameOrConfig configuration parameter name or array
351
-     *                                   ('parameter name' => 'parameter value')
352
-     * @param mixed        $value        parameter value if $nameOrConfig is not an array
353
-     *
354
-     * @return   HTTP_Request2
355
-     * @throws   HTTP_Request2_LogicException If the parameter is unknown
356
-     */
357
-    public function setConfig($nameOrConfig, $value = null)
358
-    {
359
-        if (is_array($nameOrConfig)) {
360
-            foreach ($nameOrConfig as $name => $value) {
361
-                $this->setConfig($name, $value);
362
-            }
363
-
364
-        } elseif ('proxy' == $nameOrConfig) {
365
-            $url = new Net_URL2($value);
366
-            $this->setConfig(array(
367
-                'proxy_type'     => $url->getScheme(),
368
-                'proxy_host'     => $url->getHost(),
369
-                'proxy_port'     => $url->getPort(),
370
-                'proxy_user'     => rawurldecode($url->getUser()),
371
-                'proxy_password' => rawurldecode($url->getPassword())
372
-            ));
373
-
374
-        } else {
375
-            if (!array_key_exists($nameOrConfig, $this->config)) {
376
-                throw new HTTP_Request2_LogicException(
377
-                    "Unknown configuration parameter '{$nameOrConfig}'",
378
-                    HTTP_Request2_Exception::INVALID_ARGUMENT
379
-                );
380
-            }
381
-            $this->config[$nameOrConfig] = $value;
382
-        }
383
-
384
-        return $this;
385
-    }
386
-
387
-    /**
388
-     * Returns the value(s) of the configuration parameter(s)
389
-     *
390
-     * @param string $name parameter name
391
-     *
392
-     * @return   mixed   value of $name parameter, array of all configuration
393
-     *                   parameters if $name is not given
394
-     * @throws   HTTP_Request2_LogicException If the parameter is unknown
395
-     */
396
-    public function getConfig($name = null)
397
-    {
398
-        if (null === $name) {
399
-            return $this->config;
400
-        } elseif (!array_key_exists($name, $this->config)) {
401
-            throw new HTTP_Request2_LogicException(
402
-                "Unknown configuration parameter '{$name}'",
403
-                HTTP_Request2_Exception::INVALID_ARGUMENT
404
-            );
405
-        }
406
-        return $this->config[$name];
407
-    }
408
-
409
-    /**
410
-     * Sets the autentification data
411
-     *
412
-     * @param string $user     user name
413
-     * @param string $password password
414
-     * @param string $scheme   authentication scheme
415
-     *
416
-     * @return   HTTP_Request2
417
-     */
418
-    public function setAuth($user, $password = '', $scheme = self::AUTH_BASIC)
419
-    {
420
-        if (empty($user)) {
421
-            $this->auth = null;
422
-        } else {
423
-            $this->auth = array(
424
-                'user'     => (string)$user,
425
-                'password' => (string)$password,
426
-                'scheme'   => $scheme
427
-            );
428
-        }
429
-
430
-        return $this;
431
-    }
432
-
433
-    /**
434
-     * Returns the authentication data
435
-     *
436
-     * The array has the keys 'user', 'password' and 'scheme', where 'scheme'
437
-     * is one of the HTTP_Request2::AUTH_* constants.
438
-     *
439
-     * @return   array
440
-     */
441
-    public function getAuth()
442
-    {
443
-        return $this->auth;
444
-    }
445
-
446
-    /**
447
-     * Sets request header(s)
448
-     *
449
-     * The first parameter may be either a full header string 'header: value' or
450
-     * header name. In the former case $value parameter is ignored, in the latter
451
-     * the header's value will either be set to $value or the header will be
452
-     * removed if $value is null. The first parameter can also be an array of
453
-     * headers, in that case method will be called recursively.
454
-     *
455
-     * Note that headers are treated case insensitively as per RFC 2616.
456
-     *
457
-     * <code>
458
-     * $req->setHeader('Foo: Bar'); // sets the value of 'Foo' header to 'Bar'
459
-     * $req->setHeader('FoO', 'Baz'); // sets the value of 'Foo' header to 'Baz'
460
-     * $req->setHeader(array('foo' => 'Quux')); // sets the value of 'Foo' header to 'Quux'
461
-     * $req->setHeader('FOO'); // removes 'Foo' header from request
462
-     * </code>
463
-     *
464
-     * @param string|array      $name    header name, header string ('Header: value')
465
-     *                                   or an array of headers
466
-     * @param string|array|null $value   header value if $name is not an array,
467
-     *                                   header will be removed if value is null
468
-     * @param bool              $replace whether to replace previous header with the
469
-     *                                   same name or append to its value
470
-     *
471
-     * @return   HTTP_Request2
472
-     * @throws   HTTP_Request2_LogicException
473
-     */
474
-    public function setHeader($name, $value = null, $replace = true)
475
-    {
476
-        if (is_array($name)) {
477
-            foreach ($name as $k => $v) {
478
-                if (is_string($k)) {
479
-                    $this->setHeader($k, $v, $replace);
480
-                } else {
481
-                    $this->setHeader($v, null, $replace);
482
-                }
483
-            }
484
-        } else {
485
-            if (null === $value && strpos($name, ':')) {
486
-                list($name, $value) = array_map('trim', explode(':', $name, 2));
487
-            }
488
-            // Header name should be a token: http://tools.ietf.org/html/rfc2616#section-4.2
489
-            if (preg_match(self::REGEXP_INVALID_TOKEN, $name)) {
490
-                throw new HTTP_Request2_LogicException(
491
-                    "Invalid header name '{$name}'",
492
-                    HTTP_Request2_Exception::INVALID_ARGUMENT
493
-                );
494
-            }
495
-            // Header names are case insensitive anyway
496
-            $name = strtolower($name);
497
-            if (null === $value) {
498
-                unset($this->headers[$name]);
499
-
500
-            } else {
501
-                if (is_array($value)) {
502
-                    $value = implode(', ', array_map('trim', $value));
503
-                } elseif (is_string($value)) {
504
-                    $value = trim($value);
505
-                }
506
-                if (!isset($this->headers[$name]) || $replace) {
507
-                    $this->headers[$name] = $value;
508
-                } else {
509
-                    $this->headers[$name] .= ', ' . $value;
510
-                }
511
-            }
512
-        }
513
-
514
-        return $this;
515
-    }
516
-
517
-    /**
518
-     * Returns the request headers
519
-     *
520
-     * The array is of the form ('header name' => 'header value'), header names
521
-     * are lowercased
522
-     *
523
-     * @return   array
524
-     */
525
-    public function getHeaders()
526
-    {
527
-        return $this->headers;
528
-    }
529
-
530
-    /**
531
-     * Adds a cookie to the request
532
-     *
533
-     * If the request does not have a CookieJar object set, this method simply
534
-     * appends a cookie to "Cookie:" header.
535
-     *
536
-     * If a CookieJar object is available, the cookie is stored in that object.
537
-     * Data from request URL will be used for setting its 'domain' and 'path'
538
-     * parameters, 'expires' and 'secure' will be set to null and false,
539
-     * respectively. If you need further control, use CookieJar's methods.
540
-     *
541
-     * @param string $name  cookie name
542
-     * @param string $value cookie value
543
-     *
544
-     * @return   HTTP_Request2
545
-     * @throws   HTTP_Request2_LogicException
546
-     * @see      setCookieJar()
547
-     */
548
-    public function addCookie($name, $value)
549
-    {
550
-        if (!empty($this->cookieJar)) {
551
-            $this->cookieJar->store(
552
-                array('name' => $name, 'value' => $value), $this->url
553
-            );
554
-
555
-        } else {
556
-            $cookie = $name . '=' . $value;
557
-            if (preg_match(self::REGEXP_INVALID_COOKIE, $cookie)) {
558
-                throw new HTTP_Request2_LogicException(
559
-                    "Invalid cookie: '{$cookie}'",
560
-                    HTTP_Request2_Exception::INVALID_ARGUMENT
561
-                );
562
-            }
563
-            $cookies = empty($this->headers['cookie'])? '': $this->headers['cookie'] . '; ';
564
-            $this->setHeader('cookie', $cookies . $cookie);
565
-        }
566
-
567
-        return $this;
568
-    }
569
-
570
-    /**
571
-     * Sets the request body
572
-     *
573
-     * If you provide file pointer rather than file name, it should support
574
-     * fstat() and rewind() operations.
575
-     *
576
-     * @param string|resource|HTTP_Request2_MultipartBody $body       Either a
577
-     *               string with the body or filename containing body or
578
-     *               pointer to an open file or object with multipart body data
579
-     * @param bool                                        $isFilename Whether
580
-     *               first parameter is a filename
581
-     *
582
-     * @return   HTTP_Request2
583
-     * @throws   HTTP_Request2_LogicException
584
-     */
585
-    public function setBody($body, $isFilename = false)
586
-    {
587
-        if (!$isFilename && !is_resource($body)) {
588
-            if (!$body instanceof HTTP_Request2_MultipartBody) {
589
-                $this->body = (string)$body;
590
-            } else {
591
-                $this->body = $body;
592
-            }
593
-        } else {
594
-            $fileData = $this->fopenWrapper($body, empty($this->headers['content-type']));
595
-            $this->body = $fileData['fp'];
596
-            if (empty($this->headers['content-type'])) {
597
-                $this->setHeader('content-type', $fileData['type']);
598
-            }
599
-        }
600
-        $this->postParams = $this->uploads = array();
601
-
602
-        return $this;
603
-    }
604
-
605
-    /**
606
-     * Returns the request body
607
-     *
608
-     * @return   string|resource|HTTP_Request2_MultipartBody
609
-     */
610
-    public function getBody()
611
-    {
612
-        if (self::METHOD_POST == $this->method
613
-            && (!empty($this->postParams) || !empty($this->uploads))
614
-        ) {
615
-            if (0 === strpos($this->headers['content-type'], 'application/x-www-form-urlencoded')) {
616
-                $body = http_build_query($this->postParams, '', '&');
617
-                if (!$this->getConfig('use_brackets')) {
618
-                    $body = preg_replace('/%5B\d+%5D=/', '=', $body);
619
-                }
620
-                // support RFC 3986 by not encoding '~' symbol (request #15368)
621
-                return str_replace('%7E', '~', $body);
622
-
623
-            } elseif (0 === strpos($this->headers['content-type'], 'multipart/form-data')) {
624
-                require_once 'HTTP/Request2/MultipartBody.php';
625
-                return new HTTP_Request2_MultipartBody(
626
-                    $this->postParams, $this->uploads, $this->getConfig('use_brackets')
627
-                );
628
-            }
629
-        }
630
-        return $this->body;
631
-    }
632
-
633
-    /**
634
-     * Adds a file to form-based file upload
635
-     *
636
-     * Used to emulate file upload via a HTML form. The method also sets
637
-     * Content-Type of HTTP request to 'multipart/form-data'.
638
-     *
639
-     * If you just want to send the contents of a file as the body of HTTP
640
-     * request you should use setBody() method.
641
-     *
642
-     * If you provide file pointers rather than file names, they should support
643
-     * fstat() and rewind() operations.
644
-     *
645
-     * @param string                $fieldName    name of file-upload field
646
-     * @param string|resource|array $filename     full name of local file,
647
-     *               pointer to open file or an array of files
648
-     * @param string                $sendFilename filename to send in the request
649
-     * @param string                $contentType  content-type of file being uploaded
650
-     *
651
-     * @return   HTTP_Request2
652
-     * @throws   HTTP_Request2_LogicException
653
-     */
654
-    public function addUpload(
655
-        $fieldName, $filename, $sendFilename = null, $contentType = null
656
-    ) {
657
-        if (!is_array($filename)) {
658
-            $fileData = $this->fopenWrapper($filename, empty($contentType));
659
-            $this->uploads[$fieldName] = array(
660
-                'fp'        => $fileData['fp'],
661
-                'filename'  => !empty($sendFilename)? $sendFilename
662
-                                :(is_string($filename)? basename($filename): 'anonymous.blob') ,
663
-                'size'      => $fileData['size'],
664
-                'type'      => empty($contentType)? $fileData['type']: $contentType
665
-            );
666
-        } else {
667
-            $fps = $names = $sizes = $types = array();
668
-            foreach ($filename as $f) {
669
-                if (!is_array($f)) {
670
-                    $f = array($f);
671
-                }
672
-                $fileData = $this->fopenWrapper($f[0], empty($f[2]));
673
-                $fps[]   = $fileData['fp'];
674
-                $names[] = !empty($f[1])? $f[1]
675
-                            :(is_string($f[0])? basename($f[0]): 'anonymous.blob');
676
-                $sizes[] = $fileData['size'];
677
-                $types[] = empty($f[2])? $fileData['type']: $f[2];
678
-            }
679
-            $this->uploads[$fieldName] = array(
680
-                'fp' => $fps, 'filename' => $names, 'size' => $sizes, 'type' => $types
681
-            );
682
-        }
683
-        if (empty($this->headers['content-type'])
684
-            || 'application/x-www-form-urlencoded' == $this->headers['content-type']
685
-        ) {
686
-            $this->setHeader('content-type', 'multipart/form-data');
687
-        }
688
-
689
-        return $this;
690
-    }
691
-
692
-    /**
693
-     * Adds POST parameter(s) to the request.
694
-     *
695
-     * @param string|array $name  parameter name or array ('name' => 'value')
696
-     * @param mixed        $value parameter value (can be an array)
697
-     *
698
-     * @return   HTTP_Request2
699
-     */
700
-    public function addPostParameter($name, $value = null)
701
-    {
702
-        if (!is_array($name)) {
703
-            $this->postParams[$name] = $value;
704
-        } else {
705
-            foreach ($name as $k => $v) {
706
-                $this->addPostParameter($k, $v);
707
-            }
708
-        }
709
-        if (empty($this->headers['content-type'])) {
710
-            $this->setHeader('content-type', 'application/x-www-form-urlencoded');
711
-        }
712
-
713
-        return $this;
714
-    }
715
-
716
-    /**
717
-     * Attaches a new observer
718
-     *
719
-     * @param SplObserver $observer any object implementing SplObserver
720
-     */
721
-    public function attach(SplObserver $observer)
722
-    {
723
-        foreach ($this->observers as $attached) {
724
-            if ($attached === $observer) {
725
-                return;
726
-            }
727
-        }
728
-        $this->observers[] = $observer;
729
-    }
730
-
731
-    /**
732
-     * Detaches an existing observer
733
-     *
734
-     * @param SplObserver $observer any object implementing SplObserver
735
-     */
736
-    public function detach(SplObserver $observer)
737
-    {
738
-        foreach ($this->observers as $key => $attached) {
739
-            if ($attached === $observer) {
740
-                unset($this->observers[$key]);
741
-                return;
742
-            }
743
-        }
744
-    }
745
-
746
-    /**
747
-     * Notifies all observers
748
-     */
749
-    public function notify()
750
-    {
751
-        foreach ($this->observers as $observer) {
752
-            $observer->update($this);
753
-        }
754
-    }
755
-
756
-    /**
757
-     * Sets the last event
758
-     *
759
-     * Adapters should use this method to set the current state of the request
760
-     * and notify the observers.
761
-     *
762
-     * @param string $name event name
763
-     * @param mixed  $data event data
764
-     */
765
-    public function setLastEvent($name, $data = null)
766
-    {
767
-        $this->lastEvent = array(
768
-            'name' => $name,
769
-            'data' => $data
770
-        );
771
-        $this->notify();
772
-    }
773
-
774
-    /**
775
-     * Returns the last event
776
-     *
777
-     * Observers should use this method to access the last change in request.
778
-     * The following event names are possible:
779
-     * <ul>
780
-     *   <li>'connect'                 - after connection to remote server,
781
-     *                                   data is the destination (string)</li>
782
-     *   <li>'disconnect'              - after disconnection from server</li>
783
-     *   <li>'sentHeaders'             - after sending the request headers,
784
-     *                                   data is the headers sent (string)</li>
785
-     *   <li>'sentBodyPart'            - after sending a part of the request body,
786
-     *                                   data is the length of that part (int)</li>
787
-     *   <li>'sentBody'                - after sending the whole request body,
788
-     *                                   data is request body length (int)</li>
789
-     *   <li>'receivedHeaders'         - after receiving the response headers,
790
-     *                                   data is HTTP_Request2_Response object</li>
791
-     *   <li>'receivedBodyPart'        - after receiving a part of the response
792
-     *                                   body, data is that part (string)</li>
793
-     *   <li>'receivedEncodedBodyPart' - as 'receivedBodyPart', but data is still
794
-     *                                   encoded by Content-Encoding</li>
795
-     *   <li>'receivedBody'            - after receiving the complete response
796
-     *                                   body, data is HTTP_Request2_Response object</li>
797
-     * </ul>
798
-     * Different adapters may not send all the event types. Mock adapter does
799
-     * not send any events to the observers.
800
-     *
801
-     * @return   array   The array has two keys: 'name' and 'data'
802
-     */
803
-    public function getLastEvent()
804
-    {
805
-        return $this->lastEvent;
806
-    }
807
-
808
-    /**
809
-     * Sets the adapter used to actually perform the request
810
-     *
811
-     * You can pass either an instance of a class implementing HTTP_Request2_Adapter
812
-     * or a class name. The method will only try to include a file if the class
813
-     * name starts with HTTP_Request2_Adapter_, it will also try to prepend this
814
-     * prefix to the class name if it doesn't contain any underscores, so that
815
-     * <code>
816
-     * $request->setAdapter('curl');
817
-     * </code>
818
-     * will work.
819
-     *
820
-     * @param string|HTTP_Request2_Adapter $adapter Adapter to use
821
-     *
822
-     * @return   HTTP_Request2
823
-     * @throws   HTTP_Request2_LogicException
824
-     */
825
-    public function setAdapter($adapter)
826
-    {
827
-        if (is_string($adapter)) {
828
-            if (!class_exists($adapter, false)) {
829
-                if (false === strpos($adapter, '_')) {
830
-                    $adapter = 'HTTP_Request2_Adapter_' . ucfirst($adapter);
831
-                }
832
-                if (!class_exists($adapter, false)
833
-                    && preg_match('/^HTTP_Request2_Adapter_([a-zA-Z0-9]+)$/', $adapter)
834
-                ) {
835
-                    include_once str_replace('_', DIRECTORY_SEPARATOR, $adapter) . '.php';
836
-                }
837
-                if (!class_exists($adapter, false)) {
838
-                    throw new HTTP_Request2_LogicException(
839
-                        "Class {$adapter} not found",
840
-                        HTTP_Request2_Exception::MISSING_VALUE
841
-                    );
842
-                }
843
-            }
844
-            $adapter = new $adapter;
845
-        }
846
-        if (!$adapter instanceof HTTP_Request2_Adapter) {
847
-            throw new HTTP_Request2_LogicException(
848
-                'Parameter is not a HTTP request adapter',
849
-                HTTP_Request2_Exception::INVALID_ARGUMENT
850
-            );
851
-        }
852
-        $this->adapter = $adapter;
853
-
854
-        return $this;
855
-    }
856
-
857
-    /**
858
-     * Sets the cookie jar
859
-     *
860
-     * A cookie jar is used to maintain cookies across HTTP requests and
861
-     * responses. Cookies from jar will be automatically added to the request
862
-     * headers based on request URL.
863
-     *
864
-     * @param HTTP_Request2_CookieJar|bool $jar Existing CookieJar object, true to
865
-     *                                          create a new one, false to remove
866
-     *
867
-     * @return HTTP_Request2
868
-     * @throws HTTP_Request2_LogicException
869
-     */
870
-    public function setCookieJar($jar = true)
871
-    {
872
-        if (!class_exists('HTTP_Request2_CookieJar', false)) {
873
-            require_once 'HTTP/Request2/CookieJar.php';
874
-        }
875
-
876
-        if ($jar instanceof HTTP_Request2_CookieJar) {
877
-            $this->cookieJar = $jar;
878
-        } elseif (true === $jar) {
879
-            $this->cookieJar = new HTTP_Request2_CookieJar();
880
-        } elseif (!$jar) {
881
-            $this->cookieJar = null;
882
-        } else {
883
-            throw new HTTP_Request2_LogicException(
884
-                'Invalid parameter passed to setCookieJar()',
885
-                HTTP_Request2_Exception::INVALID_ARGUMENT
886
-            );
887
-        }
888
-
889
-        return $this;
890
-    }
891
-
892
-    /**
893
-     * Returns current CookieJar object or null if none
894
-     *
895
-     * @return HTTP_Request2_CookieJar|null
896
-     */
897
-    public function getCookieJar()
898
-    {
899
-        return $this->cookieJar;
900
-    }
901
-
902
-    /**
903
-     * Sends the request and returns the response
904
-     *
905
-     * @throws   HTTP_Request2_Exception
906
-     * @return   HTTP_Request2_Response
907
-     */
908
-    public function send()
909
-    {
910
-        // Sanity check for URL
911
-        if (!$this->url instanceof Net_URL2
912
-            || !$this->url->isAbsolute()
913
-            || !in_array(strtolower($this->url->getScheme()), array('https', 'http'))
914
-        ) {
915
-            throw new HTTP_Request2_LogicException(
916
-                'HTTP_Request2 needs an absolute HTTP(S) request URL, '
917
-                . ($this->url instanceof Net_URL2
918
-                   ? "'" . $this->url->__toString() . "'" : 'none')
919
-                . ' given',
920
-                HTTP_Request2_Exception::INVALID_ARGUMENT
921
-            );
922
-        }
923
-        if (empty($this->adapter)) {
924
-            $this->setAdapter($this->getConfig('adapter'));
925
-        }
926
-        // magic_quotes_runtime may break file uploads and chunked response
927
-        // processing; see bug #4543. Don't use ini_get() here; see bug #16440.
928
-        if ($magicQuotes = get_magic_quotes_runtime()) {
929
-            set_magic_quotes_runtime(false);
930
-        }
931
-        // force using single byte encoding if mbstring extension overloads
932
-        // strlen() and substr(); see bug #1781, bug #10605
933
-        if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) {
934
-            $oldEncoding = mb_internal_encoding();
935
-            mb_internal_encoding('8bit');
936
-        }
937
-
938
-        try {
939
-            $response = $this->adapter->sendRequest($this);
940
-        } catch (Exception $e) {
941
-        }
942
-        // cleanup in either case (poor man's "finally" clause)
943
-        if ($magicQuotes) {
944
-            set_magic_quotes_runtime(true);
945
-        }
946
-        if (!empty($oldEncoding)) {
947
-            mb_internal_encoding($oldEncoding);
948
-        }
949
-        // rethrow the exception
950
-        if (!empty($e)) {
951
-            throw $e;
952
-        }
953
-        return $response;
954
-    }
955
-
956
-    /**
957
-     * Wrapper around fopen()/fstat() used by setBody() and addUpload()
958
-     *
959
-     * @param string|resource $file       file name or pointer to open file
960
-     * @param bool            $detectType whether to try autodetecting MIME
961
-     *                        type of file, will only work if $file is a
962
-     *                        filename, not pointer
963
-     *
964
-     * @return array array('fp' => file pointer, 'size' => file size, 'type' => MIME type)
965
-     * @throws HTTP_Request2_LogicException
966
-     */
967
-    protected function fopenWrapper($file, $detectType = false)
968
-    {
969
-        if (!is_string($file) && !is_resource($file)) {
970
-            throw new HTTP_Request2_LogicException(
971
-                "Filename or file pointer resource expected",
972
-                HTTP_Request2_Exception::INVALID_ARGUMENT
973
-            );
974
-        }
975
-        $fileData = array(
976
-            'fp'   => is_string($file)? null: $file,
977
-            'type' => 'application/octet-stream',
978
-            'size' => 0
979
-        );
980
-        if (is_string($file)) {
981
-            if (!($fileData['fp'] = @fopen($file, 'rb'))) {
982
-                $error = error_get_last();
983
-                throw new HTTP_Request2_LogicException(
984
-                    $error['message'], HTTP_Request2_Exception::READ_ERROR
985
-                );
986
-            }
987
-            if ($detectType) {
988
-                $fileData['type'] = self::detectMimeType($file);
989
-            }
990
-        }
991
-        if (!($stat = fstat($fileData['fp']))) {
992
-            throw new HTTP_Request2_LogicException(
993
-                "fstat() call failed", HTTP_Request2_Exception::READ_ERROR
994
-            );
995
-        }
996
-        $fileData['size'] = $stat['size'];
997
-
998
-        return $fileData;
999
-    }
1000
-
1001
-    /**
1002
-     * Tries to detect MIME type of a file
1003
-     *
1004
-     * The method will try to use fileinfo extension if it is available,
1005
-     * deprecated mime_content_type() function in the other case. If neither
1006
-     * works, default 'application/octet-stream' MIME type is returned
1007
-     *
1008
-     * @param string $filename file name
1009
-     *
1010
-     * @return   string  file MIME type
1011
-     */
1012
-    protected static function detectMimeType($filename)
1013
-    {
1014
-        // finfo extension from PECL available
1015
-        if (function_exists('finfo_open')) {
1016
-            if (!isset(self::$_fileinfoDb)) {
1017
-                self::$_fileinfoDb = @finfo_open(FILEINFO_MIME);
1018
-            }
1019
-            if (self::$_fileinfoDb) {
1020
-                $info = finfo_file(self::$_fileinfoDb, $filename);
1021
-            }
1022
-        }
1023
-        // (deprecated) mime_content_type function available
1024
-        if (empty($info) && function_exists('mime_content_type')) {
1025
-            return mime_content_type($filename);
1026
-        }
1027
-        return empty($info)? 'application/octet-stream': $info;
1028
-    }
64
+	const AUTH_BASIC  = 'basic';
65
+	const AUTH_DIGEST = 'digest';
66
+	/**#@-*/
67
+
68
+	/**
69
+	 * Regular expression used to check for invalid symbols in RFC 2616 tokens
70
+	 * @link http://pear.php.net/bugs/bug.php?id=15630
71
+	 */
72
+	const REGEXP_INVALID_TOKEN = '![\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]!';
73
+
74
+	/**
75
+	 * Regular expression used to check for invalid symbols in cookie strings
76
+	 * @link http://pear.php.net/bugs/bug.php?id=15630
77
+	 * @link http://web.archive.org/web/20080331104521/http://cgi.netscape.com/newsref/std/cookie_spec.html
78
+	 */
79
+	const REGEXP_INVALID_COOKIE = '/[\s,;]/';
80
+
81
+	/**
82
+	 * Fileinfo magic database resource
83
+	 * @var  resource
84
+	 * @see  detectMimeType()
85
+	 */
86
+	private static $_fileinfoDb;
87
+
88
+	/**
89
+	 * Observers attached to the request (instances of SplObserver)
90
+	 * @var  array
91
+	 */
92
+	protected $observers = array();
93
+
94
+	/**
95
+	 * Request URL
96
+	 * @var  Net_URL2
97
+	 */
98
+	protected $url;
99
+
100
+	/**
101
+	 * Request method
102
+	 * @var  string
103
+	 */
104
+	protected $method = self::METHOD_GET;
105
+
106
+	/**
107
+	 * Authentication data
108
+	 * @var  array
109
+	 * @see  getAuth()
110
+	 */
111
+	protected $auth;
112
+
113
+	/**
114
+	 * Request headers
115
+	 * @var  array
116
+	 */
117
+	protected $headers = array();
118
+
119
+	/**
120
+	 * Configuration parameters
121
+	 * @var  array
122
+	 * @see  setConfig()
123
+	 */
124
+	protected $config = array(
125
+		'adapter'           => 'HTTP_Request2_Adapter_Socket',
126
+		'connect_timeout'   => 10,
127
+		'timeout'           => 0,
128
+		'use_brackets'      => true,
129
+		'protocol_version'  => '1.1',
130
+		'buffer_size'       => 16384,
131
+		'store_body'        => true,
132
+		'local_ip'          => null,
133
+
134
+		'proxy_host'        => '',
135
+		'proxy_port'        => '',
136
+		'proxy_user'        => '',
137
+		'proxy_password'    => '',
138
+		'proxy_auth_scheme' => self::AUTH_BASIC,
139
+		'proxy_type'        => 'http',
140
+
141
+		'ssl_verify_peer'   => true,
142
+		'ssl_verify_host'   => true,
143
+		'ssl_cafile'        => null,
144
+		'ssl_capath'        => null,
145
+		'ssl_local_cert'    => null,
146
+		'ssl_passphrase'    => null,
147
+
148
+		'digest_compat_ie'  => false,
149
+
150
+		'follow_redirects'  => false,
151
+		'max_redirects'     => 5,
152
+		'strict_redirects'  => false
153
+	);
154
+
155
+	/**
156
+	 * Last event in request / response handling, intended for observers
157
+	 * @var  array
158
+	 * @see  getLastEvent()
159
+	 */
160
+	protected $lastEvent = array(
161
+		'name' => 'start',
162
+		'data' => null
163
+	);
164
+
165
+	/**
166
+	 * Request body
167
+	 * @var  string|resource
168
+	 * @see  setBody()
169
+	 */
170
+	protected $body = '';
171
+
172
+	/**
173
+	 * Array of POST parameters
174
+	 * @var  array
175
+	 */
176
+	protected $postParams = array();
177
+
178
+	/**
179
+	 * Array of file uploads (for multipart/form-data POST requests)
180
+	 * @var  array
181
+	 */
182
+	protected $uploads = array();
183
+
184
+	/**
185
+	 * Adapter used to perform actual HTTP request
186
+	 * @var  HTTP_Request2_Adapter
187
+	 */
188
+	protected $adapter;
189
+
190
+	/**
191
+	 * Cookie jar to persist cookies between requests
192
+	 * @var HTTP_Request2_CookieJar
193
+	 */
194
+	protected $cookieJar = null;
195
+
196
+	/**
197
+	 * Constructor. Can set request URL, method and configuration array.
198
+	 *
199
+	 * Also sets a default value for User-Agent header.
200
+	 *
201
+	 * @param string|Net_Url2 $url    Request URL
202
+	 * @param string          $method Request method
203
+	 * @param array           $config Configuration for this Request instance
204
+	 */
205
+	public function __construct(
206
+		$url = null, $method = self::METHOD_GET, array $config = array()
207
+	) {
208
+		$this->setConfig($config);
209
+		if (!empty($url)) {
210
+			$this->setUrl($url);
211
+		}
212
+		if (!empty($method)) {
213
+			$this->setMethod($method);
214
+		}
215
+		$this->setHeader(
216
+			'user-agent', 'HTTP_Request2/2.2.1 ' .
217
+			'(http://pear.php.net/package/http_request2) PHP/' . phpversion()
218
+		);
219
+	}
220
+
221
+	/**
222
+	 * Sets the URL for this request
223
+	 *
224
+	 * If the URL has userinfo part (username & password) these will be removed
225
+	 * and converted to auth data. If the URL does not have a path component,
226
+	 * that will be set to '/'.
227
+	 *
228
+	 * @param string|Net_URL2 $url Request URL
229
+	 *
230
+	 * @return   HTTP_Request2
231
+	 * @throws   HTTP_Request2_LogicException
232
+	 */
233
+	public function setUrl($url)
234
+	{
235
+		if (is_string($url)) {
236
+			$url = new Net_URL2(
237
+				$url, array(Net_URL2::OPTION_USE_BRACKETS => $this->config['use_brackets'])
238
+			);
239
+		}
240
+		if (!$url instanceof Net_URL2) {
241
+			throw new HTTP_Request2_LogicException(
242
+				'Parameter is not a valid HTTP URL',
243
+				HTTP_Request2_Exception::INVALID_ARGUMENT
244
+			);
245
+		}
246
+		// URL contains username / password?
247
+		if ($url->getUserinfo()) {
248
+			$username = $url->getUser();
249
+			$password = $url->getPassword();
250
+			$this->setAuth(rawurldecode($username), $password? rawurldecode($password): '');
251
+			$url->setUserinfo('');
252
+		}
253
+		if ('' == $url->getPath()) {
254
+			$url->setPath('/');
255
+		}
256
+		$this->url = $url;
257
+
258
+		return $this;
259
+	}
260
+
261
+	/**
262
+	 * Returns the request URL
263
+	 *
264
+	 * @return   Net_URL2
265
+	 */
266
+	public function getUrl()
267
+	{
268
+		return $this->url;
269
+	}
270
+
271
+	/**
272
+	 * Sets the request method
273
+	 *
274
+	 * @param string $method one of the methods defined in RFC 2616
275
+	 *
276
+	 * @return   HTTP_Request2
277
+	 * @throws   HTTP_Request2_LogicException if the method name is invalid
278
+	 */
279
+	public function setMethod($method)
280
+	{
281
+		// Method name should be a token: http://tools.ietf.org/html/rfc2616#section-5.1.1
282
+		if (preg_match(self::REGEXP_INVALID_TOKEN, $method)) {
283
+			throw new HTTP_Request2_LogicException(
284
+				"Invalid request method '{$method}'",
285
+				HTTP_Request2_Exception::INVALID_ARGUMENT
286
+			);
287
+		}
288
+		$this->method = $method;
289
+
290
+		return $this;
291
+	}
292
+
293
+	/**
294
+	 * Returns the request method
295
+	 *
296
+	 * @return   string
297
+	 */
298
+	public function getMethod()
299
+	{
300
+		return $this->method;
301
+	}
302
+
303
+	/**
304
+	 * Sets the configuration parameter(s)
305
+	 *
306
+	 * The following parameters are available:
307
+	 * <ul>
308
+	 *   <li> 'adapter'           - adapter to use (string)</li>
309
+	 *   <li> 'connect_timeout'   - Connection timeout in seconds (integer)</li>
310
+	 *   <li> 'timeout'           - Total number of seconds a request can take.
311
+	 *                              Use 0 for no limit, should be greater than
312
+	 *                              'connect_timeout' if set (integer)</li>
313
+	 *   <li> 'use_brackets'      - Whether to append [] to array variable names (bool)</li>
314
+	 *   <li> 'protocol_version'  - HTTP Version to use, '1.0' or '1.1' (string)</li>
315
+	 *   <li> 'buffer_size'       - Buffer size to use for reading and writing (int)</li>
316
+	 *   <li> 'store_body'        - Whether to store response body in response object.
317
+	 *                              Set to false if receiving a huge response and
318
+	 *                              using an Observer to save it (boolean)</li>
319
+	 *   <li> 'local_ip'          - Specifies the IP address that will be used for accessing
320
+	 *                              the network (string)</li>
321
+	 *   <li> 'proxy_type'        - Proxy type, 'http' or 'socks5' (string)</li>
322
+	 *   <li> 'proxy_host'        - Proxy server host (string)</li>
323
+	 *   <li> 'proxy_port'        - Proxy server port (integer)</li>
324
+	 *   <li> 'proxy_user'        - Proxy auth username (string)</li>
325
+	 *   <li> 'proxy_password'    - Proxy auth password (string)</li>
326
+	 *   <li> 'proxy_auth_scheme' - Proxy auth scheme, one of HTTP_Request2::AUTH_* constants (string)</li>
327
+	 *   <li> 'proxy'             - Shorthand for proxy_* parameters, proxy given as URL,
328
+	 *                              e.g. 'socks5://localhost:1080/' (string)</li>
329
+	 *   <li> 'ssl_verify_peer'   - Whether to verify peer's SSL certificate (bool)</li>
330
+	 *   <li> 'ssl_verify_host'   - Whether to check that Common Name in SSL
331
+	 *                              certificate matches host name (bool)</li>
332
+	 *   <li> 'ssl_cafile'        - Cerificate Authority file to verify the peer
333
+	 *                              with (use with 'ssl_verify_peer') (string)</li>
334
+	 *   <li> 'ssl_capath'        - Directory holding multiple Certificate
335
+	 *                              Authority files (string)</li>
336
+	 *   <li> 'ssl_local_cert'    - Name of a file containing local cerificate (string)</li>
337
+	 *   <li> 'ssl_passphrase'    - Passphrase with which local certificate
338
+	 *                              was encoded (string)</li>
339
+	 *   <li> 'digest_compat_ie'  - Whether to imitate behaviour of MSIE 5 and 6
340
+	 *                              in using URL without query string in digest
341
+	 *                              authentication (boolean)</li>
342
+	 *   <li> 'follow_redirects'  - Whether to automatically follow HTTP Redirects (boolean)</li>
343
+	 *   <li> 'max_redirects'     - Maximum number of redirects to follow (integer)</li>
344
+	 *   <li> 'strict_redirects'  - Whether to keep request method on redirects via status 301 and
345
+	 *                              302 (true, needed for compatibility with RFC 2616)
346
+	 *                              or switch to GET (false, needed for compatibility with most
347
+	 *                              browsers) (boolean)</li>
348
+	 * </ul>
349
+	 *
350
+	 * @param string|array $nameOrConfig configuration parameter name or array
351
+	 *                                   ('parameter name' => 'parameter value')
352
+	 * @param mixed        $value        parameter value if $nameOrConfig is not an array
353
+	 *
354
+	 * @return   HTTP_Request2
355
+	 * @throws   HTTP_Request2_LogicException If the parameter is unknown
356
+	 */
357
+	public function setConfig($nameOrConfig, $value = null)
358
+	{
359
+		if (is_array($nameOrConfig)) {
360
+			foreach ($nameOrConfig as $name => $value) {
361
+				$this->setConfig($name, $value);
362
+			}
363
+
364
+		} elseif ('proxy' == $nameOrConfig) {
365
+			$url = new Net_URL2($value);
366
+			$this->setConfig(array(
367
+				'proxy_type'     => $url->getScheme(),
368
+				'proxy_host'     => $url->getHost(),
369
+				'proxy_port'     => $url->getPort(),
370
+				'proxy_user'     => rawurldecode($url->getUser()),
371
+				'proxy_password' => rawurldecode($url->getPassword())
372
+			));
373
+
374
+		} else {
375
+			if (!array_key_exists($nameOrConfig, $this->config)) {
376
+				throw new HTTP_Request2_LogicException(
377
+					"Unknown configuration parameter '{$nameOrConfig}'",
378
+					HTTP_Request2_Exception::INVALID_ARGUMENT
379
+				);
380
+			}
381
+			$this->config[$nameOrConfig] = $value;
382
+		}
383
+
384
+		return $this;
385
+	}
386
+
387
+	/**
388
+	 * Returns the value(s) of the configuration parameter(s)
389
+	 *
390
+	 * @param string $name parameter name
391
+	 *
392
+	 * @return   mixed   value of $name parameter, array of all configuration
393
+	 *                   parameters if $name is not given
394
+	 * @throws   HTTP_Request2_LogicException If the parameter is unknown
395
+	 */
396
+	public function getConfig($name = null)
397
+	{
398
+		if (null === $name) {
399
+			return $this->config;
400
+		} elseif (!array_key_exists($name, $this->config)) {
401
+			throw new HTTP_Request2_LogicException(
402
+				"Unknown configuration parameter '{$name}'",
403
+				HTTP_Request2_Exception::INVALID_ARGUMENT
404
+			);
405
+		}
406
+		return $this->config[$name];
407
+	}
408
+
409
+	/**
410
+	 * Sets the autentification data
411
+	 *
412
+	 * @param string $user     user name
413
+	 * @param string $password password
414
+	 * @param string $scheme   authentication scheme
415
+	 *
416
+	 * @return   HTTP_Request2
417
+	 */
418
+	public function setAuth($user, $password = '', $scheme = self::AUTH_BASIC)
419
+	{
420
+		if (empty($user)) {
421
+			$this->auth = null;
422
+		} else {
423
+			$this->auth = array(
424
+				'user'     => (string)$user,
425
+				'password' => (string)$password,
426
+				'scheme'   => $scheme
427
+			);
428
+		}
429
+
430
+		return $this;
431
+	}
432
+
433
+	/**
434
+	 * Returns the authentication data
435
+	 *
436
+	 * The array has the keys 'user', 'password' and 'scheme', where 'scheme'
437
+	 * is one of the HTTP_Request2::AUTH_* constants.
438
+	 *
439
+	 * @return   array
440
+	 */
441
+	public function getAuth()
442
+	{
443
+		return $this->auth;
444
+	}
445
+
446
+	/**
447
+	 * Sets request header(s)
448
+	 *
449
+	 * The first parameter may be either a full header string 'header: value' or
450
+	 * header name. In the former case $value parameter is ignored, in the latter
451
+	 * the header's value will either be set to $value or the header will be
452
+	 * removed if $value is null. The first parameter can also be an array of
453
+	 * headers, in that case method will be called recursively.
454
+	 *
455
+	 * Note that headers are treated case insensitively as per RFC 2616.
456
+	 *
457
+	 * <code>
458
+	 * $req->setHeader('Foo: Bar'); // sets the value of 'Foo' header to 'Bar'
459
+	 * $req->setHeader('FoO', 'Baz'); // sets the value of 'Foo' header to 'Baz'
460
+	 * $req->setHeader(array('foo' => 'Quux')); // sets the value of 'Foo' header to 'Quux'
461
+	 * $req->setHeader('FOO'); // removes 'Foo' header from request
462
+	 * </code>
463
+	 *
464
+	 * @param string|array      $name    header name, header string ('Header: value')
465
+	 *                                   or an array of headers
466
+	 * @param string|array|null $value   header value if $name is not an array,
467
+	 *                                   header will be removed if value is null
468
+	 * @param bool              $replace whether to replace previous header with the
469
+	 *                                   same name or append to its value
470
+	 *
471
+	 * @return   HTTP_Request2
472
+	 * @throws   HTTP_Request2_LogicException
473
+	 */
474
+	public function setHeader($name, $value = null, $replace = true)
475
+	{
476
+		if (is_array($name)) {
477
+			foreach ($name as $k => $v) {
478
+				if (is_string($k)) {
479
+					$this->setHeader($k, $v, $replace);
480
+				} else {
481
+					$this->setHeader($v, null, $replace);
482
+				}
483
+			}
484
+		} else {
485
+			if (null === $value && strpos($name, ':')) {
486
+				list($name, $value) = array_map('trim', explode(':', $name, 2));
487
+			}
488
+			// Header name should be a token: http://tools.ietf.org/html/rfc2616#section-4.2
489
+			if (preg_match(self::REGEXP_INVALID_TOKEN, $name)) {
490
+				throw new HTTP_Request2_LogicException(
491
+					"Invalid header name '{$name}'",
492
+					HTTP_Request2_Exception::INVALID_ARGUMENT
493
+				);
494
+			}
495
+			// Header names are case insensitive anyway
496
+			$name = strtolower($name);
497
+			if (null === $value) {
498
+				unset($this->headers[$name]);
499
+
500
+			} else {
501
+				if (is_array($value)) {
502
+					$value = implode(', ', array_map('trim', $value));
503
+				} elseif (is_string($value)) {
504
+					$value = trim($value);
505
+				}
506
+				if (!isset($this->headers[$name]) || $replace) {
507
+					$this->headers[$name] = $value;
508
+				} else {
509
+					$this->headers[$name] .= ', ' . $value;
510
+				}
511
+			}
512
+		}
513
+
514
+		return $this;
515
+	}
516
+
517
+	/**
518
+	 * Returns the request headers
519
+	 *
520
+	 * The array is of the form ('header name' => 'header value'), header names
521
+	 * are lowercased
522
+	 *
523
+	 * @return   array
524
+	 */
525
+	public function getHeaders()
526
+	{
527
+		return $this->headers;
528
+	}
529
+
530
+	/**
531
+	 * Adds a cookie to the request
532
+	 *
533
+	 * If the request does not have a CookieJar object set, this method simply
534
+	 * appends a cookie to "Cookie:" header.
535
+	 *
536
+	 * If a CookieJar object is available, the cookie is stored in that object.
537
+	 * Data from request URL will be used for setting its 'domain' and 'path'
538
+	 * parameters, 'expires' and 'secure' will be set to null and false,
539
+	 * respectively. If you need further control, use CookieJar's methods.
540
+	 *
541
+	 * @param string $name  cookie name
542
+	 * @param string $value cookie value
543
+	 *
544
+	 * @return   HTTP_Request2
545
+	 * @throws   HTTP_Request2_LogicException
546
+	 * @see      setCookieJar()
547
+	 */
548
+	public function addCookie($name, $value)
549
+	{
550
+		if (!empty($this->cookieJar)) {
551
+			$this->cookieJar->store(
552
+				array('name' => $name, 'value' => $value), $this->url
553
+			);
554
+
555
+		} else {
556
+			$cookie = $name . '=' . $value;
557
+			if (preg_match(self::REGEXP_INVALID_COOKIE, $cookie)) {
558
+				throw new HTTP_Request2_LogicException(
559
+					"Invalid cookie: '{$cookie}'",
560
+					HTTP_Request2_Exception::INVALID_ARGUMENT
561
+				);
562
+			}
563
+			$cookies = empty($this->headers['cookie'])? '': $this->headers['cookie'] . '; ';
564
+			$this->setHeader('cookie', $cookies . $cookie);
565
+		}
566
+
567
+		return $this;
568
+	}
569
+
570
+	/**
571
+	 * Sets the request body
572
+	 *
573
+	 * If you provide file pointer rather than file name, it should support
574
+	 * fstat() and rewind() operations.
575
+	 *
576
+	 * @param string|resource|HTTP_Request2_MultipartBody $body       Either a
577
+	 *               string with the body or filename containing body or
578
+	 *               pointer to an open file or object with multipart body data
579
+	 * @param bool                                        $isFilename Whether
580
+	 *               first parameter is a filename
581
+	 *
582
+	 * @return   HTTP_Request2
583
+	 * @throws   HTTP_Request2_LogicException
584
+	 */
585
+	public function setBody($body, $isFilename = false)
586
+	{
587
+		if (!$isFilename && !is_resource($body)) {
588
+			if (!$body instanceof HTTP_Request2_MultipartBody) {
589
+				$this->body = (string)$body;
590
+			} else {
591
+				$this->body = $body;
592
+			}
593
+		} else {
594
+			$fileData = $this->fopenWrapper($body, empty($this->headers['content-type']));
595
+			$this->body = $fileData['fp'];
596
+			if (empty($this->headers['content-type'])) {
597
+				$this->setHeader('content-type', $fileData['type']);
598
+			}
599
+		}
600
+		$this->postParams = $this->uploads = array();
601
+
602
+		return $this;
603
+	}
604
+
605
+	/**
606
+	 * Returns the request body
607
+	 *
608
+	 * @return   string|resource|HTTP_Request2_MultipartBody
609
+	 */
610
+	public function getBody()
611
+	{
612
+		if (self::METHOD_POST == $this->method
613
+			&& (!empty($this->postParams) || !empty($this->uploads))
614
+		) {
615
+			if (0 === strpos($this->headers['content-type'], 'application/x-www-form-urlencoded')) {
616
+				$body = http_build_query($this->postParams, '', '&');
617
+				if (!$this->getConfig('use_brackets')) {
618
+					$body = preg_replace('/%5B\d+%5D=/', '=', $body);
619
+				}
620
+				// support RFC 3986 by not encoding '~' symbol (request #15368)
621
+				return str_replace('%7E', '~', $body);
622
+
623
+			} elseif (0 === strpos($this->headers['content-type'], 'multipart/form-data')) {
624
+				require_once 'HTTP/Request2/MultipartBody.php';
625
+				return new HTTP_Request2_MultipartBody(
626
+					$this->postParams, $this->uploads, $this->getConfig('use_brackets')
627
+				);
628
+			}
629
+		}
630
+		return $this->body;
631
+	}
632
+
633
+	/**
634
+	 * Adds a file to form-based file upload
635
+	 *
636
+	 * Used to emulate file upload via a HTML form. The method also sets
637
+	 * Content-Type of HTTP request to 'multipart/form-data'.
638
+	 *
639
+	 * If you just want to send the contents of a file as the body of HTTP
640
+	 * request you should use setBody() method.
641
+	 *
642
+	 * If you provide file pointers rather than file names, they should support
643
+	 * fstat() and rewind() operations.
644
+	 *
645
+	 * @param string                $fieldName    name of file-upload field
646
+	 * @param string|resource|array $filename     full name of local file,
647
+	 *               pointer to open file or an array of files
648
+	 * @param string                $sendFilename filename to send in the request
649
+	 * @param string                $contentType  content-type of file being uploaded
650
+	 *
651
+	 * @return   HTTP_Request2
652
+	 * @throws   HTTP_Request2_LogicException
653
+	 */
654
+	public function addUpload(
655
+		$fieldName, $filename, $sendFilename = null, $contentType = null
656
+	) {
657
+		if (!is_array($filename)) {
658
+			$fileData = $this->fopenWrapper($filename, empty($contentType));
659
+			$this->uploads[$fieldName] = array(
660
+				'fp'        => $fileData['fp'],
661
+				'filename'  => !empty($sendFilename)? $sendFilename
662
+								:(is_string($filename)? basename($filename): 'anonymous.blob') ,
663
+				'size'      => $fileData['size'],
664
+				'type'      => empty($contentType)? $fileData['type']: $contentType
665
+			);
666
+		} else {
667
+			$fps = $names = $sizes = $types = array();
668
+			foreach ($filename as $f) {
669
+				if (!is_array($f)) {
670
+					$f = array($f);
671
+				}
672
+				$fileData = $this->fopenWrapper($f[0], empty($f[2]));
673
+				$fps[]   = $fileData['fp'];
674
+				$names[] = !empty($f[1])? $f[1]
675
+							:(is_string($f[0])? basename($f[0]): 'anonymous.blob');
676
+				$sizes[] = $fileData['size'];
677
+				$types[] = empty($f[2])? $fileData['type']: $f[2];
678
+			}
679
+			$this->uploads[$fieldName] = array(
680
+				'fp' => $fps, 'filename' => $names, 'size' => $sizes, 'type' => $types
681
+			);
682
+		}
683
+		if (empty($this->headers['content-type'])
684
+			|| 'application/x-www-form-urlencoded' == $this->headers['content-type']
685
+		) {
686
+			$this->setHeader('content-type', 'multipart/form-data');
687
+		}
688
+
689
+		return $this;
690
+	}
691
+
692
+	/**
693
+	 * Adds POST parameter(s) to the request.
694
+	 *
695
+	 * @param string|array $name  parameter name or array ('name' => 'value')
696
+	 * @param mixed        $value parameter value (can be an array)
697
+	 *
698
+	 * @return   HTTP_Request2
699
+	 */
700
+	public function addPostParameter($name, $value = null)
701
+	{
702
+		if (!is_array($name)) {
703
+			$this->postParams[$name] = $value;
704
+		} else {
705
+			foreach ($name as $k => $v) {
706
+				$this->addPostParameter($k, $v);
707
+			}
708
+		}
709
+		if (empty($this->headers['content-type'])) {
710
+			$this->setHeader('content-type', 'application/x-www-form-urlencoded');
711
+		}
712
+
713
+		return $this;
714
+	}
715
+
716
+	/**
717
+	 * Attaches a new observer
718
+	 *
719
+	 * @param SplObserver $observer any object implementing SplObserver
720
+	 */
721
+	public function attach(SplObserver $observer)
722
+	{
723
+		foreach ($this->observers as $attached) {
724
+			if ($attached === $observer) {
725
+				return;
726
+			}
727
+		}
728
+		$this->observers[] = $observer;
729
+	}
730
+
731
+	/**
732
+	 * Detaches an existing observer
733
+	 *
734
+	 * @param SplObserver $observer any object implementing SplObserver
735
+	 */
736
+	public function detach(SplObserver $observer)
737
+	{
738
+		foreach ($this->observers as $key => $attached) {
739
+			if ($attached === $observer) {
740
+				unset($this->observers[$key]);
741
+				return;
742
+			}
743
+		}
744
+	}
745
+
746
+	/**
747
+	 * Notifies all observers
748
+	 */
749
+	public function notify()
750
+	{
751
+		foreach ($this->observers as $observer) {
752
+			$observer->update($this);
753
+		}
754
+	}
755
+
756
+	/**
757
+	 * Sets the last event
758
+	 *
759
+	 * Adapters should use this method to set the current state of the request
760
+	 * and notify the observers.
761
+	 *
762
+	 * @param string $name event name
763
+	 * @param mixed  $data event data
764
+	 */
765
+	public function setLastEvent($name, $data = null)
766
+	{
767
+		$this->lastEvent = array(
768
+			'name' => $name,
769
+			'data' => $data
770
+		);
771
+		$this->notify();
772
+	}
773
+
774
+	/**
775
+	 * Returns the last event
776
+	 *
777
+	 * Observers should use this method to access the last change in request.
778
+	 * The following event names are possible:
779
+	 * <ul>
780
+	 *   <li>'connect'                 - after connection to remote server,
781
+	 *                                   data is the destination (string)</li>
782
+	 *   <li>'disconnect'              - after disconnection from server</li>
783
+	 *   <li>'sentHeaders'             - after sending the request headers,
784
+	 *                                   data is the headers sent (string)</li>
785
+	 *   <li>'sentBodyPart'            - after sending a part of the request body,
786
+	 *                                   data is the length of that part (int)</li>
787
+	 *   <li>'sentBody'                - after sending the whole request body,
788
+	 *                                   data is request body length (int)</li>
789
+	 *   <li>'receivedHeaders'         - after receiving the response headers,
790
+	 *                                   data is HTTP_Request2_Response object</li>
791
+	 *   <li>'receivedBodyPart'        - after receiving a part of the response
792
+	 *                                   body, data is that part (string)</li>
793
+	 *   <li>'receivedEncodedBodyPart' - as 'receivedBodyPart', but data is still
794
+	 *                                   encoded by Content-Encoding</li>
795
+	 *   <li>'receivedBody'            - after receiving the complete response
796
+	 *                                   body, data is HTTP_Request2_Response object</li>
797
+	 * </ul>
798
+	 * Different adapters may not send all the event types. Mock adapter does
799
+	 * not send any events to the observers.
800
+	 *
801
+	 * @return   array   The array has two keys: 'name' and 'data'
802
+	 */
803
+	public function getLastEvent()
804
+	{
805
+		return $this->lastEvent;
806
+	}
807
+
808
+	/**
809
+	 * Sets the adapter used to actually perform the request
810
+	 *
811
+	 * You can pass either an instance of a class implementing HTTP_Request2_Adapter
812
+	 * or a class name. The method will only try to include a file if the class
813
+	 * name starts with HTTP_Request2_Adapter_, it will also try to prepend this
814
+	 * prefix to the class name if it doesn't contain any underscores, so that
815
+	 * <code>
816
+	 * $request->setAdapter('curl');
817
+	 * </code>
818
+	 * will work.
819
+	 *
820
+	 * @param string|HTTP_Request2_Adapter $adapter Adapter to use
821
+	 *
822
+	 * @return   HTTP_Request2
823
+	 * @throws   HTTP_Request2_LogicException
824
+	 */
825
+	public function setAdapter($adapter)
826
+	{
827
+		if (is_string($adapter)) {
828
+			if (!class_exists($adapter, false)) {
829
+				if (false === strpos($adapter, '_')) {
830
+					$adapter = 'HTTP_Request2_Adapter_' . ucfirst($adapter);
831
+				}
832
+				if (!class_exists($adapter, false)
833
+					&& preg_match('/^HTTP_Request2_Adapter_([a-zA-Z0-9]+)$/', $adapter)
834
+				) {
835
+					include_once str_replace('_', DIRECTORY_SEPARATOR, $adapter) . '.php';
836
+				}
837
+				if (!class_exists($adapter, false)) {
838
+					throw new HTTP_Request2_LogicException(
839
+						"Class {$adapter} not found",
840
+						HTTP_Request2_Exception::MISSING_VALUE
841
+					);
842
+				}
843
+			}
844
+			$adapter = new $adapter;
845
+		}
846
+		if (!$adapter instanceof HTTP_Request2_Adapter) {
847
+			throw new HTTP_Request2_LogicException(
848
+				'Parameter is not a HTTP request adapter',
849
+				HTTP_Request2_Exception::INVALID_ARGUMENT
850
+			);
851
+		}
852
+		$this->adapter = $adapter;
853
+
854
+		return $this;
855
+	}
856
+
857
+	/**
858
+	 * Sets the cookie jar
859
+	 *
860
+	 * A cookie jar is used to maintain cookies across HTTP requests and
861
+	 * responses. Cookies from jar will be automatically added to the request
862
+	 * headers based on request URL.
863
+	 *
864
+	 * @param HTTP_Request2_CookieJar|bool $jar Existing CookieJar object, true to
865
+	 *                                          create a new one, false to remove
866
+	 *
867
+	 * @return HTTP_Request2
868
+	 * @throws HTTP_Request2_LogicException
869
+	 */
870
+	public function setCookieJar($jar = true)
871
+	{
872
+		if (!class_exists('HTTP_Request2_CookieJar', false)) {
873
+			require_once 'HTTP/Request2/CookieJar.php';
874
+		}
875
+
876
+		if ($jar instanceof HTTP_Request2_CookieJar) {
877
+			$this->cookieJar = $jar;
878
+		} elseif (true === $jar) {
879
+			$this->cookieJar = new HTTP_Request2_CookieJar();
880
+		} elseif (!$jar) {
881
+			$this->cookieJar = null;
882
+		} else {
883
+			throw new HTTP_Request2_LogicException(
884
+				'Invalid parameter passed to setCookieJar()',
885
+				HTTP_Request2_Exception::INVALID_ARGUMENT
886
+			);
887
+		}
888
+
889
+		return $this;
890
+	}
891
+
892
+	/**
893
+	 * Returns current CookieJar object or null if none
894
+	 *
895
+	 * @return HTTP_Request2_CookieJar|null
896
+	 */
897
+	public function getCookieJar()
898
+	{
899
+		return $this->cookieJar;
900
+	}
901
+
902
+	/**
903
+	 * Sends the request and returns the response
904
+	 *
905
+	 * @throws   HTTP_Request2_Exception
906
+	 * @return   HTTP_Request2_Response
907
+	 */
908
+	public function send()
909
+	{
910
+		// Sanity check for URL
911
+		if (!$this->url instanceof Net_URL2
912
+			|| !$this->url->isAbsolute()
913
+			|| !in_array(strtolower($this->url->getScheme()), array('https', 'http'))
914
+		) {
915
+			throw new HTTP_Request2_LogicException(
916
+				'HTTP_Request2 needs an absolute HTTP(S) request URL, '
917
+				. ($this->url instanceof Net_URL2
918
+				   ? "'" . $this->url->__toString() . "'" : 'none')
919
+				. ' given',
920
+				HTTP_Request2_Exception::INVALID_ARGUMENT
921
+			);
922
+		}
923
+		if (empty($this->adapter)) {
924
+			$this->setAdapter($this->getConfig('adapter'));
925
+		}
926
+		// magic_quotes_runtime may break file uploads and chunked response
927
+		// processing; see bug #4543. Don't use ini_get() here; see bug #16440.
928
+		if ($magicQuotes = get_magic_quotes_runtime()) {
929
+			set_magic_quotes_runtime(false);
930
+		}
931
+		// force using single byte encoding if mbstring extension overloads
932
+		// strlen() and substr(); see bug #1781, bug #10605
933
+		if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) {
934
+			$oldEncoding = mb_internal_encoding();
935
+			mb_internal_encoding('8bit');
936
+		}
937
+
938
+		try {
939
+			$response = $this->adapter->sendRequest($this);
940
+		} catch (Exception $e) {
941
+		}
942
+		// cleanup in either case (poor man's "finally" clause)
943
+		if ($magicQuotes) {
944
+			set_magic_quotes_runtime(true);
945
+		}
946
+		if (!empty($oldEncoding)) {
947
+			mb_internal_encoding($oldEncoding);
948
+		}
949
+		// rethrow the exception
950
+		if (!empty($e)) {
951
+			throw $e;
952
+		}
953
+		return $response;
954
+	}
955
+
956
+	/**
957
+	 * Wrapper around fopen()/fstat() used by setBody() and addUpload()
958
+	 *
959
+	 * @param string|resource $file       file name or pointer to open file
960
+	 * @param bool            $detectType whether to try autodetecting MIME
961
+	 *                        type of file, will only work if $file is a
962
+	 *                        filename, not pointer
963
+	 *
964
+	 * @return array array('fp' => file pointer, 'size' => file size, 'type' => MIME type)
965
+	 * @throws HTTP_Request2_LogicException
966
+	 */
967
+	protected function fopenWrapper($file, $detectType = false)
968
+	{
969
+		if (!is_string($file) && !is_resource($file)) {
970
+			throw new HTTP_Request2_LogicException(
971
+				"Filename or file pointer resource expected",
972
+				HTTP_Request2_Exception::INVALID_ARGUMENT
973
+			);
974
+		}
975
+		$fileData = array(
976
+			'fp'   => is_string($file)? null: $file,
977
+			'type' => 'application/octet-stream',
978
+			'size' => 0
979
+		);
980
+		if (is_string($file)) {
981
+			if (!($fileData['fp'] = @fopen($file, 'rb'))) {
982
+				$error = error_get_last();
983
+				throw new HTTP_Request2_LogicException(
984
+					$error['message'], HTTP_Request2_Exception::READ_ERROR
985
+				);
986
+			}
987
+			if ($detectType) {
988
+				$fileData['type'] = self::detectMimeType($file);
989
+			}
990
+		}
991
+		if (!($stat = fstat($fileData['fp']))) {
992
+			throw new HTTP_Request2_LogicException(
993
+				"fstat() call failed", HTTP_Request2_Exception::READ_ERROR
994
+			);
995
+		}
996
+		$fileData['size'] = $stat['size'];
997
+
998
+		return $fileData;
999
+	}
1000
+
1001
+	/**
1002
+	 * Tries to detect MIME type of a file
1003
+	 *
1004
+	 * The method will try to use fileinfo extension if it is available,
1005
+	 * deprecated mime_content_type() function in the other case. If neither
1006
+	 * works, default 'application/octet-stream' MIME type is returned
1007
+	 *
1008
+	 * @param string $filename file name
1009
+	 *
1010
+	 * @return   string  file MIME type
1011
+	 */
1012
+	protected static function detectMimeType($filename)
1013
+	{
1014
+		// finfo extension from PECL available
1015
+		if (function_exists('finfo_open')) {
1016
+			if (!isset(self::$_fileinfoDb)) {
1017
+				self::$_fileinfoDb = @finfo_open(FILEINFO_MIME);
1018
+			}
1019
+			if (self::$_fileinfoDb) {
1020
+				$info = finfo_file(self::$_fileinfoDb, $filename);
1021
+			}
1022
+		}
1023
+		// (deprecated) mime_content_type function available
1024
+		if (empty($info) && function_exists('mime_content_type')) {
1025
+			return mime_content_type($filename);
1026
+		}
1027
+		return empty($info)? 'application/octet-stream': $info;
1028
+	}
1029 1029
 }
1030 1030
 ?>
Please login to merge, or discard this patch.
Spacing   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -247,7 +247,7 @@  discard block
 block discarded – undo
247 247
         if ($url->getUserinfo()) {
248 248
             $username = $url->getUser();
249 249
             $password = $url->getPassword();
250
-            $this->setAuth(rawurldecode($username), $password? rawurldecode($password): '');
250
+            $this->setAuth(rawurldecode($username), $password ? rawurldecode($password) : '');
251 251
             $url->setUserinfo('');
252 252
         }
253 253
         if ('' == $url->getPath()) {
@@ -421,8 +421,8 @@  discard block
 block discarded – undo
421 421
             $this->auth = null;
422 422
         } else {
423 423
             $this->auth = array(
424
-                'user'     => (string)$user,
425
-                'password' => (string)$password,
424
+                'user'     => (string) $user,
425
+                'password' => (string) $password,
426 426
                 'scheme'   => $scheme
427 427
             );
428 428
         }
@@ -560,7 +560,7 @@  discard block
 block discarded – undo
560 560
                     HTTP_Request2_Exception::INVALID_ARGUMENT
561 561
                 );
562 562
             }
563
-            $cookies = empty($this->headers['cookie'])? '': $this->headers['cookie'] . '; ';
563
+            $cookies = empty($this->headers['cookie']) ? '' : $this->headers['cookie'] . '; ';
564 564
             $this->setHeader('cookie', $cookies . $cookie);
565 565
         }
566 566
 
@@ -586,7 +586,7 @@  discard block
 block discarded – undo
586 586
     {
587 587
         if (!$isFilename && !is_resource($body)) {
588 588
             if (!$body instanceof HTTP_Request2_MultipartBody) {
589
-                $this->body = (string)$body;
589
+                $this->body = (string) $body;
590 590
             } else {
591 591
                 $this->body = $body;
592 592
             }
@@ -658,10 +658,10 @@  discard block
 block discarded – undo
658 658
             $fileData = $this->fopenWrapper($filename, empty($contentType));
659 659
             $this->uploads[$fieldName] = array(
660 660
                 'fp'        => $fileData['fp'],
661
-                'filename'  => !empty($sendFilename)? $sendFilename
662
-                                :(is_string($filename)? basename($filename): 'anonymous.blob') ,
661
+                'filename'  => !empty($sendFilename) ? $sendFilename
662
+                                :(is_string($filename) ? basename($filename) : 'anonymous.blob'),
663 663
                 'size'      => $fileData['size'],
664
-                'type'      => empty($contentType)? $fileData['type']: $contentType
664
+                'type'      => empty($contentType) ? $fileData['type'] : $contentType
665 665
             );
666 666
         } else {
667 667
             $fps = $names = $sizes = $types = array();
@@ -671,10 +671,10 @@  discard block
 block discarded – undo
671 671
                 }
672 672
                 $fileData = $this->fopenWrapper($f[0], empty($f[2]));
673 673
                 $fps[]   = $fileData['fp'];
674
-                $names[] = !empty($f[1])? $f[1]
675
-                            :(is_string($f[0])? basename($f[0]): 'anonymous.blob');
674
+                $names[] = !empty($f[1]) ? $f[1]
675
+                            :(is_string($f[0]) ? basename($f[0]) : 'anonymous.blob');
676 676
                 $sizes[] = $fileData['size'];
677
-                $types[] = empty($f[2])? $fileData['type']: $f[2];
677
+                $types[] = empty($f[2]) ? $fileData['type'] : $f[2];
678 678
             }
679 679
             $this->uploads[$fieldName] = array(
680 680
                 'fp' => $fps, 'filename' => $names, 'size' => $sizes, 'type' => $types
@@ -973,7 +973,7 @@  discard block
 block discarded – undo
973 973
             );
974 974
         }
975 975
         $fileData = array(
976
-            'fp'   => is_string($file)? null: $file,
976
+            'fp'   => is_string($file) ? null : $file,
977 977
             'type' => 'application/octet-stream',
978 978
             'size' => 0
979 979
         );
@@ -1024,7 +1024,7 @@  discard block
 block discarded – undo
1024 1024
         if (empty($info) && function_exists('mime_content_type')) {
1025 1025
             return mime_content_type($filename);
1026 1026
         }
1027
-        return empty($info)? 'application/octet-stream': $info;
1027
+        return empty($info) ? 'application/octet-stream' : $info;
1028 1028
     }
1029 1029
 }
1030 1030
 ?>
Please login to merge, or discard this patch.
libs/PEAR.1.9.5/HTTP/Request2/CookieJar.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -425,7 +425,7 @@
 block discarded – undo
425 425
      *
426 426
      * @param string $domain domain name
427 427
      *
428
-     * @return string|bool   registered domain, will return false if $domain is
428
+     * @return false|string   registered domain, will return false if $domain is
429 429
      *                       either invalid or a TLD itself
430 430
      */
431 431
     public static function getRegisteredDomain($domain)
Please login to merge, or discard this patch.
Indentation   +457 added lines, -457 removed lines patch added patch discarded remove patch
@@ -33,462 +33,462 @@
 block discarded – undo
33 33
  */
34 34
 class HTTP_Request2_CookieJar implements Serializable
35 35
 {
36
-    /**
37
-     * Array of stored cookies
38
-     *
39
-     * The array is indexed by domain, path and cookie name
40
-     *   .example.com
41
-     *     /
42
-     *       some_cookie => cookie data
43
-     *     /subdir
44
-     *       other_cookie => cookie data
45
-     *   .example.org
46
-     *     ...
47
-     *
48
-     * @var array
49
-     */
50
-    protected $cookies = array();
51
-
52
-    /**
53
-     * Whether session cookies should be serialized when serializing the jar
54
-     * @var bool
55
-     */
56
-    protected $serializeSession = false;
57
-
58
-    /**
59
-     * Whether Public Suffix List should be used for domain matching
60
-     * @var bool
61
-     */
62
-    protected $useList = true;
63
-
64
-    /**
65
-     * Array with Public Suffix List data
66
-     * @var  array
67
-     * @link http://publicsuffix.org/
68
-     */
69
-    protected static $psl = array();
70
-
71
-    /**
72
-     * Class constructor, sets various options
73
-     *
74
-     * @param bool $serializeSessionCookies Controls serializing session cookies,
75
-     *                                      see {@link serializeSessionCookies()}
76
-     * @param bool $usePublicSuffixList     Controls using Public Suffix List,
77
-     *                                      see {@link usePublicSuffixList()}
78
-     */
79
-    public function __construct(
80
-        $serializeSessionCookies = false, $usePublicSuffixList = true
81
-    ) {
82
-        $this->serializeSessionCookies($serializeSessionCookies);
83
-        $this->usePublicSuffixList($usePublicSuffixList);
84
-    }
85
-
86
-    /**
87
-     * Returns current time formatted in ISO-8601 at UTC timezone
88
-     *
89
-     * @return string
90
-     */
91
-    protected function now()
92
-    {
93
-        $dt = new DateTime();
94
-        $dt->setTimezone(new DateTimeZone('UTC'));
95
-        return $dt->format(DateTime::ISO8601);
96
-    }
97
-
98
-    /**
99
-     * Checks cookie array for correctness, possibly updating its 'domain', 'path' and 'expires' fields
100
-     *
101
-     * The checks are as follows:
102
-     *   - cookie array should contain 'name' and 'value' fields;
103
-     *   - name and value should not contain disallowed symbols;
104
-     *   - 'expires' should be either empty parseable by DateTime;
105
-     *   - 'domain' and 'path' should be either not empty or an URL where
106
-     *     cookie was set should be provided.
107
-     *   - if $setter is provided, then document at that URL should be allowed
108
-     *     to set a cookie for that 'domain'. If $setter is not provided,
109
-     *     then no domain checks will be made.
110
-     *
111
-     * 'expires' field will be converted to ISO8601 format from COOKIE format,
112
-     * 'domain' and 'path' will be set from setter URL if empty.
113
-     *
114
-     * @param array    $cookie cookie data, as returned by
115
-     *                         {@link HTTP_Request2_Response::getCookies()}
116
-     * @param Net_URL2 $setter URL of the document that sent Set-Cookie header
117
-     *
118
-     * @return   array    Updated cookie array
119
-     * @throws   HTTP_Request2_LogicException
120
-     * @throws   HTTP_Request2_MessageException
121
-     */
122
-    protected function checkAndUpdateFields(array $cookie, Net_URL2 $setter = null)
123
-    {
124
-        if ($missing = array_diff(array('name', 'value'), array_keys($cookie))) {
125
-            throw new HTTP_Request2_LogicException(
126
-                "Cookie array should contain 'name' and 'value' fields",
127
-                HTTP_Request2_Exception::MISSING_VALUE
128
-            );
129
-        }
130
-        if (preg_match(HTTP_Request2::REGEXP_INVALID_COOKIE, $cookie['name'])) {
131
-            throw new HTTP_Request2_LogicException(
132
-                "Invalid cookie name: '{$cookie['name']}'",
133
-                HTTP_Request2_Exception::INVALID_ARGUMENT
134
-            );
135
-        }
136
-        if (preg_match(HTTP_Request2::REGEXP_INVALID_COOKIE, $cookie['value'])) {
137
-            throw new HTTP_Request2_LogicException(
138
-                "Invalid cookie value: '{$cookie['value']}'",
139
-                HTTP_Request2_Exception::INVALID_ARGUMENT
140
-            );
141
-        }
142
-        $cookie += array('domain' => '', 'path' => '', 'expires' => null, 'secure' => false);
143
-
144
-        // Need ISO-8601 date @ UTC timezone
145
-        if (!empty($cookie['expires'])
146
-            && !preg_match('/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\+0000$/', $cookie['expires'])
147
-        ) {
148
-            try {
149
-                $dt = new DateTime($cookie['expires']);
150
-                $dt->setTimezone(new DateTimeZone('UTC'));
151
-                $cookie['expires'] = $dt->format(DateTime::ISO8601);
152
-            } catch (Exception $e) {
153
-                throw new HTTP_Request2_LogicException($e->getMessage());
154
-            }
155
-        }
156
-
157
-        if (empty($cookie['domain']) || empty($cookie['path'])) {
158
-            if (!$setter) {
159
-                throw new HTTP_Request2_LogicException(
160
-                    'Cookie misses domain and/or path component, cookie setter URL needed',
161
-                    HTTP_Request2_Exception::MISSING_VALUE
162
-                );
163
-            }
164
-            if (empty($cookie['domain'])) {
165
-                if ($host = $setter->getHost()) {
166
-                    $cookie['domain'] = $host;
167
-                } else {
168
-                    throw new HTTP_Request2_LogicException(
169
-                        'Setter URL does not contain host part, can\'t set cookie domain',
170
-                        HTTP_Request2_Exception::MISSING_VALUE
171
-                    );
172
-                }
173
-            }
174
-            if (empty($cookie['path'])) {
175
-                $path = $setter->getPath();
176
-                $cookie['path'] = empty($path)? '/': substr($path, 0, strrpos($path, '/') + 1);
177
-            }
178
-        }
179
-
180
-        if ($setter && !$this->domainMatch($setter->getHost(), $cookie['domain'])) {
181
-            throw new HTTP_Request2_MessageException(
182
-                "Domain " . $setter->getHost() . " cannot set cookies for "
183
-                . $cookie['domain']
184
-            );
185
-        }
186
-
187
-        return $cookie;
188
-    }
189
-
190
-    /**
191
-     * Stores a cookie in the jar
192
-     *
193
-     * @param array    $cookie cookie data, as returned by
194
-     *                         {@link HTTP_Request2_Response::getCookies()}
195
-     * @param Net_URL2 $setter URL of the document that sent Set-Cookie header
196
-     *
197
-     * @throws   HTTP_Request2_Exception
198
-     */
199
-    public function store(array $cookie, Net_URL2 $setter = null)
200
-    {
201
-        $cookie = $this->checkAndUpdateFields($cookie, $setter);
202
-
203
-        if (strlen($cookie['value'])
204
-            && (is_null($cookie['expires']) || $cookie['expires'] > $this->now())
205
-        ) {
206
-            if (!isset($this->cookies[$cookie['domain']])) {
207
-                $this->cookies[$cookie['domain']] = array();
208
-            }
209
-            if (!isset($this->cookies[$cookie['domain']][$cookie['path']])) {
210
-                $this->cookies[$cookie['domain']][$cookie['path']] = array();
211
-            }
212
-            $this->cookies[$cookie['domain']][$cookie['path']][$cookie['name']] = $cookie;
213
-
214
-        } elseif (isset($this->cookies[$cookie['domain']][$cookie['path']][$cookie['name']])) {
215
-            unset($this->cookies[$cookie['domain']][$cookie['path']][$cookie['name']]);
216
-        }
217
-    }
218
-
219
-    /**
220
-     * Adds cookies set in HTTP response to the jar
221
-     *
222
-     * @param HTTP_Request2_Response $response HTTP response message
223
-     * @param Net_URL2               $setter   original request URL, needed for
224
-     *                               setting default domain/path
225
-     */
226
-    public function addCookiesFromResponse(HTTP_Request2_Response $response, Net_URL2 $setter)
227
-    {
228
-        foreach ($response->getCookies() as $cookie) {
229
-            $this->store($cookie, $setter);
230
-        }
231
-    }
232
-
233
-    /**
234
-     * Returns all cookies matching a given request URL
235
-     *
236
-     * The following checks are made:
237
-     *   - cookie domain should match request host
238
-     *   - cookie path should be a prefix for request path
239
-     *   - 'secure' cookies will only be sent for HTTPS requests
240
-     *
241
-     * @param Net_URL2 $url      Request url
242
-     * @param bool     $asString Whether to return cookies as string for "Cookie: " header
243
-     *
244
-     * @return array|string Matching cookies
245
-     */
246
-    public function getMatching(Net_URL2 $url, $asString = false)
247
-    {
248
-        $host   = $url->getHost();
249
-        $path   = $url->getPath();
250
-        $secure = 0 == strcasecmp($url->getScheme(), 'https');
251
-
252
-        $matched = $ret = array();
253
-        foreach (array_keys($this->cookies) as $domain) {
254
-            if ($this->domainMatch($host, $domain)) {
255
-                foreach (array_keys($this->cookies[$domain]) as $cPath) {
256
-                    if (0 === strpos($path, $cPath)) {
257
-                        foreach ($this->cookies[$domain][$cPath] as $name => $cookie) {
258
-                            if (!$cookie['secure'] || $secure) {
259
-                                $matched[$name][strlen($cookie['path'])] = $cookie;
260
-                            }
261
-                        }
262
-                    }
263
-                }
264
-            }
265
-        }
266
-        foreach ($matched as $cookies) {
267
-            krsort($cookies);
268
-            $ret = array_merge($ret, $cookies);
269
-        }
270
-        if (!$asString) {
271
-            return $ret;
272
-        } else {
273
-            $str = '';
274
-            foreach ($ret as $c) {
275
-                $str .= (empty($str)? '': '; ') . $c['name'] . '=' . $c['value'];
276
-            }
277
-            return $str;
278
-        }
279
-    }
280
-
281
-    /**
282
-     * Returns all cookies stored in a jar
283
-     *
284
-     * @return array
285
-     */
286
-    public function getAll()
287
-    {
288
-        $cookies = array();
289
-        foreach (array_keys($this->cookies) as $domain) {
290
-            foreach (array_keys($this->cookies[$domain]) as $path) {
291
-                foreach ($this->cookies[$domain][$path] as $name => $cookie) {
292
-                    $cookies[] = $cookie;
293
-                }
294
-            }
295
-        }
296
-        return $cookies;
297
-    }
298
-
299
-    /**
300
-     * Sets whether session cookies should be serialized when serializing the jar
301
-     *
302
-     * @param boolean $serialize serialize?
303
-     */
304
-    public function serializeSessionCookies($serialize)
305
-    {
306
-        $this->serializeSession = (bool)$serialize;
307
-    }
308
-
309
-    /**
310
-     * Sets whether Public Suffix List should be used for restricting cookie-setting
311
-     *
312
-     * Without PSL {@link domainMatch()} will only prevent setting cookies for
313
-     * top-level domains like '.com' or '.org'. However, it will not prevent
314
-     * setting a cookie for '.co.uk' even though only third-level registrations
315
-     * are possible in .uk domain.
316
-     *
317
-     * With the List it is possible to find the highest level at which a domain
318
-     * may be registered for a particular top-level domain and consequently
319
-     * prevent cookies set for '.co.uk' or '.msk.ru'. The same list is used by
320
-     * Firefox, Chrome and Opera browsers to restrict cookie setting.
321
-     *
322
-     * Note that PSL is licensed differently to HTTP_Request2 package (refer to
323
-     * the license information in public-suffix-list.php), so you can disable
324
-     * its use if this is an issue for you.
325
-     *
326
-     * @param boolean $useList use the list?
327
-     *
328
-     * @link     http://publicsuffix.org/learn/
329
-     */
330
-    public function usePublicSuffixList($useList)
331
-    {
332
-        $this->useList = (bool)$useList;
333
-    }
334
-
335
-    /**
336
-     * Returns string representation of object
337
-     *
338
-     * @return string
339
-     *
340
-     * @see    Serializable::serialize()
341
-     */
342
-    public function serialize()
343
-    {
344
-        $cookies = $this->getAll();
345
-        if (!$this->serializeSession) {
346
-            for ($i = count($cookies) - 1; $i >= 0; $i--) {
347
-                if (empty($cookies[$i]['expires'])) {
348
-                    unset($cookies[$i]);
349
-                }
350
-            }
351
-        }
352
-        return serialize(array(
353
-            'cookies'          => $cookies,
354
-            'serializeSession' => $this->serializeSession,
355
-            'useList'          => $this->useList
356
-        ));
357
-    }
358
-
359
-    /**
360
-     * Constructs the object from serialized string
361
-     *
362
-     * @param string $serialized string representation
363
-     *
364
-     * @see   Serializable::unserialize()
365
-     */
366
-    public function unserialize($serialized)
367
-    {
368
-        $data = unserialize($serialized);
369
-        $now  = $this->now();
370
-        $this->serializeSessionCookies($data['serializeSession']);
371
-        $this->usePublicSuffixList($data['useList']);
372
-        foreach ($data['cookies'] as $cookie) {
373
-            if (!empty($cookie['expires']) && $cookie['expires'] <= $now) {
374
-                continue;
375
-            }
376
-            if (!isset($this->cookies[$cookie['domain']])) {
377
-                $this->cookies[$cookie['domain']] = array();
378
-            }
379
-            if (!isset($this->cookies[$cookie['domain']][$cookie['path']])) {
380
-                $this->cookies[$cookie['domain']][$cookie['path']] = array();
381
-            }
382
-            $this->cookies[$cookie['domain']][$cookie['path']][$cookie['name']] = $cookie;
383
-        }
384
-    }
385
-
386
-    /**
387
-     * Checks whether a cookie domain matches a request host.
388
-     *
389
-     * The method is used by {@link store()} to check for whether a document
390
-     * at given URL can set a cookie with a given domain attribute and by
391
-     * {@link getMatching()} to find cookies matching the request URL.
392
-     *
393
-     * @param string $requestHost  request host
394
-     * @param string $cookieDomain cookie domain
395
-     *
396
-     * @return   bool    match success
397
-     */
398
-    public function domainMatch($requestHost, $cookieDomain)
399
-    {
400
-        if ($requestHost == $cookieDomain) {
401
-            return true;
402
-        }
403
-        // IP address, we require exact match
404
-        if (preg_match('/^(?:\d{1,3}\.){3}\d{1,3}$/', $requestHost)) {
405
-            return false;
406
-        }
407
-        if ('.' != $cookieDomain[0]) {
408
-            $cookieDomain = '.' . $cookieDomain;
409
-        }
410
-        // prevents setting cookies for '.com' and similar domains
411
-        if (!$this->useList && substr_count($cookieDomain, '.') < 2
412
-            || $this->useList && !self::getRegisteredDomain($cookieDomain)
413
-        ) {
414
-            return false;
415
-        }
416
-        return substr('.' . $requestHost, -strlen($cookieDomain)) == $cookieDomain;
417
-    }
418
-
419
-    /**
420
-     * Removes subdomains to get the registered domain (the first after top-level)
421
-     *
422
-     * The method will check Public Suffix List to find out where top-level
423
-     * domain ends and registered domain starts. It will remove domain parts
424
-     * to the left of registered one.
425
-     *
426
-     * @param string $domain domain name
427
-     *
428
-     * @return string|bool   registered domain, will return false if $domain is
429
-     *                       either invalid or a TLD itself
430
-     */
431
-    public static function getRegisteredDomain($domain)
432
-    {
433
-        $domainParts = explode('.', ltrim($domain, '.'));
434
-
435
-        // load the list if needed
436
-        if (empty(self::$psl)) {
437
-            $path = '@data_dir@' . DIRECTORY_SEPARATOR . 'HTTP_Request2';
438
-            if (0 === strpos($path, '@' . 'data_dir@')) {
439
-                $path = realpath(
440
-                    dirname(__FILE__) . DIRECTORY_SEPARATOR . '..'
441
-                    . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'data'
442
-                );
443
-            }
444
-            self::$psl = include_once $path . DIRECTORY_SEPARATOR . 'public-suffix-list.php';
445
-        }
446
-
447
-        if (!($result = self::checkDomainsList($domainParts, self::$psl))) {
448
-            // known TLD, invalid domain name
449
-            return false;
450
-        }
451
-
452
-        // unknown TLD
453
-        if (!strpos($result, '.')) {
454
-            // fallback to checking that domain "has at least two dots"
455
-            if (2 > ($count = count($domainParts))) {
456
-                return false;
457
-            }
458
-            return $domainParts[$count - 2] . '.' . $domainParts[$count - 1];
459
-        }
460
-        return $result;
461
-    }
462
-
463
-    /**
464
-     * Recursive helper method for {@link getRegisteredDomain()}
465
-     *
466
-     * @param array $domainParts remaining domain parts
467
-     * @param mixed $listNode    node in {@link HTTP_Request2_CookieJar::$psl} to check
468
-     *
469
-     * @return string|null   concatenated domain parts, null in case of error
470
-     */
471
-    protected static function checkDomainsList(array $domainParts, $listNode)
472
-    {
473
-        $sub    = array_pop($domainParts);
474
-        $result = null;
475
-
476
-        if (!is_array($listNode) || is_null($sub)
477
-            || array_key_exists('!' . $sub, $listNode)
478
-        ) {
479
-            return $sub;
480
-
481
-        } elseif (array_key_exists($sub, $listNode)) {
482
-            $result = self::checkDomainsList($domainParts, $listNode[$sub]);
483
-
484
-        } elseif (array_key_exists('*', $listNode)) {
485
-            $result = self::checkDomainsList($domainParts, $listNode['*']);
486
-
487
-        } else {
488
-            return $sub;
489
-        }
490
-
491
-        return (strlen($result) > 0) ? ($result . '.' . $sub) : null;
492
-    }
36
+	/**
37
+	 * Array of stored cookies
38
+	 *
39
+	 * The array is indexed by domain, path and cookie name
40
+	 *   .example.com
41
+	 *     /
42
+	 *       some_cookie => cookie data
43
+	 *     /subdir
44
+	 *       other_cookie => cookie data
45
+	 *   .example.org
46
+	 *     ...
47
+	 *
48
+	 * @var array
49
+	 */
50
+	protected $cookies = array();
51
+
52
+	/**
53
+	 * Whether session cookies should be serialized when serializing the jar
54
+	 * @var bool
55
+	 */
56
+	protected $serializeSession = false;
57
+
58
+	/**
59
+	 * Whether Public Suffix List should be used for domain matching
60
+	 * @var bool
61
+	 */
62
+	protected $useList = true;
63
+
64
+	/**
65
+	 * Array with Public Suffix List data
66
+	 * @var  array
67
+	 * @link http://publicsuffix.org/
68
+	 */
69
+	protected static $psl = array();
70
+
71
+	/**
72
+	 * Class constructor, sets various options
73
+	 *
74
+	 * @param bool $serializeSessionCookies Controls serializing session cookies,
75
+	 *                                      see {@link serializeSessionCookies()}
76
+	 * @param bool $usePublicSuffixList     Controls using Public Suffix List,
77
+	 *                                      see {@link usePublicSuffixList()}
78
+	 */
79
+	public function __construct(
80
+		$serializeSessionCookies = false, $usePublicSuffixList = true
81
+	) {
82
+		$this->serializeSessionCookies($serializeSessionCookies);
83
+		$this->usePublicSuffixList($usePublicSuffixList);
84
+	}
85
+
86
+	/**
87
+	 * Returns current time formatted in ISO-8601 at UTC timezone
88
+	 *
89
+	 * @return string
90
+	 */
91
+	protected function now()
92
+	{
93
+		$dt = new DateTime();
94
+		$dt->setTimezone(new DateTimeZone('UTC'));
95
+		return $dt->format(DateTime::ISO8601);
96
+	}
97
+
98
+	/**
99
+	 * Checks cookie array for correctness, possibly updating its 'domain', 'path' and 'expires' fields
100
+	 *
101
+	 * The checks are as follows:
102
+	 *   - cookie array should contain 'name' and 'value' fields;
103
+	 *   - name and value should not contain disallowed symbols;
104
+	 *   - 'expires' should be either empty parseable by DateTime;
105
+	 *   - 'domain' and 'path' should be either not empty or an URL where
106
+	 *     cookie was set should be provided.
107
+	 *   - if $setter is provided, then document at that URL should be allowed
108
+	 *     to set a cookie for that 'domain'. If $setter is not provided,
109
+	 *     then no domain checks will be made.
110
+	 *
111
+	 * 'expires' field will be converted to ISO8601 format from COOKIE format,
112
+	 * 'domain' and 'path' will be set from setter URL if empty.
113
+	 *
114
+	 * @param array    $cookie cookie data, as returned by
115
+	 *                         {@link HTTP_Request2_Response::getCookies()}
116
+	 * @param Net_URL2 $setter URL of the document that sent Set-Cookie header
117
+	 *
118
+	 * @return   array    Updated cookie array
119
+	 * @throws   HTTP_Request2_LogicException
120
+	 * @throws   HTTP_Request2_MessageException
121
+	 */
122
+	protected function checkAndUpdateFields(array $cookie, Net_URL2 $setter = null)
123
+	{
124
+		if ($missing = array_diff(array('name', 'value'), array_keys($cookie))) {
125
+			throw new HTTP_Request2_LogicException(
126
+				"Cookie array should contain 'name' and 'value' fields",
127
+				HTTP_Request2_Exception::MISSING_VALUE
128
+			);
129
+		}
130
+		if (preg_match(HTTP_Request2::REGEXP_INVALID_COOKIE, $cookie['name'])) {
131
+			throw new HTTP_Request2_LogicException(
132
+				"Invalid cookie name: '{$cookie['name']}'",
133
+				HTTP_Request2_Exception::INVALID_ARGUMENT
134
+			);
135
+		}
136
+		if (preg_match(HTTP_Request2::REGEXP_INVALID_COOKIE, $cookie['value'])) {
137
+			throw new HTTP_Request2_LogicException(
138
+				"Invalid cookie value: '{$cookie['value']}'",
139
+				HTTP_Request2_Exception::INVALID_ARGUMENT
140
+			);
141
+		}
142
+		$cookie += array('domain' => '', 'path' => '', 'expires' => null, 'secure' => false);
143
+
144
+		// Need ISO-8601 date @ UTC timezone
145
+		if (!empty($cookie['expires'])
146
+			&& !preg_match('/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\+0000$/', $cookie['expires'])
147
+		) {
148
+			try {
149
+				$dt = new DateTime($cookie['expires']);
150
+				$dt->setTimezone(new DateTimeZone('UTC'));
151
+				$cookie['expires'] = $dt->format(DateTime::ISO8601);
152
+			} catch (Exception $e) {
153
+				throw new HTTP_Request2_LogicException($e->getMessage());
154
+			}
155
+		}
156
+
157
+		if (empty($cookie['domain']) || empty($cookie['path'])) {
158
+			if (!$setter) {
159
+				throw new HTTP_Request2_LogicException(
160
+					'Cookie misses domain and/or path component, cookie setter URL needed',
161
+					HTTP_Request2_Exception::MISSING_VALUE
162
+				);
163
+			}
164
+			if (empty($cookie['domain'])) {
165
+				if ($host = $setter->getHost()) {
166
+					$cookie['domain'] = $host;
167
+				} else {
168
+					throw new HTTP_Request2_LogicException(
169
+						'Setter URL does not contain host part, can\'t set cookie domain',
170
+						HTTP_Request2_Exception::MISSING_VALUE
171
+					);
172
+				}
173
+			}
174
+			if (empty($cookie['path'])) {
175
+				$path = $setter->getPath();
176
+				$cookie['path'] = empty($path)? '/': substr($path, 0, strrpos($path, '/') + 1);
177
+			}
178
+		}
179
+
180
+		if ($setter && !$this->domainMatch($setter->getHost(), $cookie['domain'])) {
181
+			throw new HTTP_Request2_MessageException(
182
+				"Domain " . $setter->getHost() . " cannot set cookies for "
183
+				. $cookie['domain']
184
+			);
185
+		}
186
+
187
+		return $cookie;
188
+	}
189
+
190
+	/**
191
+	 * Stores a cookie in the jar
192
+	 *
193
+	 * @param array    $cookie cookie data, as returned by
194
+	 *                         {@link HTTP_Request2_Response::getCookies()}
195
+	 * @param Net_URL2 $setter URL of the document that sent Set-Cookie header
196
+	 *
197
+	 * @throws   HTTP_Request2_Exception
198
+	 */
199
+	public function store(array $cookie, Net_URL2 $setter = null)
200
+	{
201
+		$cookie = $this->checkAndUpdateFields($cookie, $setter);
202
+
203
+		if (strlen($cookie['value'])
204
+			&& (is_null($cookie['expires']) || $cookie['expires'] > $this->now())
205
+		) {
206
+			if (!isset($this->cookies[$cookie['domain']])) {
207
+				$this->cookies[$cookie['domain']] = array();
208
+			}
209
+			if (!isset($this->cookies[$cookie['domain']][$cookie['path']])) {
210
+				$this->cookies[$cookie['domain']][$cookie['path']] = array();
211
+			}
212
+			$this->cookies[$cookie['domain']][$cookie['path']][$cookie['name']] = $cookie;
213
+
214
+		} elseif (isset($this->cookies[$cookie['domain']][$cookie['path']][$cookie['name']])) {
215
+			unset($this->cookies[$cookie['domain']][$cookie['path']][$cookie['name']]);
216
+		}
217
+	}
218
+
219
+	/**
220
+	 * Adds cookies set in HTTP response to the jar
221
+	 *
222
+	 * @param HTTP_Request2_Response $response HTTP response message
223
+	 * @param Net_URL2               $setter   original request URL, needed for
224
+	 *                               setting default domain/path
225
+	 */
226
+	public function addCookiesFromResponse(HTTP_Request2_Response $response, Net_URL2 $setter)
227
+	{
228
+		foreach ($response->getCookies() as $cookie) {
229
+			$this->store($cookie, $setter);
230
+		}
231
+	}
232
+
233
+	/**
234
+	 * Returns all cookies matching a given request URL
235
+	 *
236
+	 * The following checks are made:
237
+	 *   - cookie domain should match request host
238
+	 *   - cookie path should be a prefix for request path
239
+	 *   - 'secure' cookies will only be sent for HTTPS requests
240
+	 *
241
+	 * @param Net_URL2 $url      Request url
242
+	 * @param bool     $asString Whether to return cookies as string for "Cookie: " header
243
+	 *
244
+	 * @return array|string Matching cookies
245
+	 */
246
+	public function getMatching(Net_URL2 $url, $asString = false)
247
+	{
248
+		$host   = $url->getHost();
249
+		$path   = $url->getPath();
250
+		$secure = 0 == strcasecmp($url->getScheme(), 'https');
251
+
252
+		$matched = $ret = array();
253
+		foreach (array_keys($this->cookies) as $domain) {
254
+			if ($this->domainMatch($host, $domain)) {
255
+				foreach (array_keys($this->cookies[$domain]) as $cPath) {
256
+					if (0 === strpos($path, $cPath)) {
257
+						foreach ($this->cookies[$domain][$cPath] as $name => $cookie) {
258
+							if (!$cookie['secure'] || $secure) {
259
+								$matched[$name][strlen($cookie['path'])] = $cookie;
260
+							}
261
+						}
262
+					}
263
+				}
264
+			}
265
+		}
266
+		foreach ($matched as $cookies) {
267
+			krsort($cookies);
268
+			$ret = array_merge($ret, $cookies);
269
+		}
270
+		if (!$asString) {
271
+			return $ret;
272
+		} else {
273
+			$str = '';
274
+			foreach ($ret as $c) {
275
+				$str .= (empty($str)? '': '; ') . $c['name'] . '=' . $c['value'];
276
+			}
277
+			return $str;
278
+		}
279
+	}
280
+
281
+	/**
282
+	 * Returns all cookies stored in a jar
283
+	 *
284
+	 * @return array
285
+	 */
286
+	public function getAll()
287
+	{
288
+		$cookies = array();
289
+		foreach (array_keys($this->cookies) as $domain) {
290
+			foreach (array_keys($this->cookies[$domain]) as $path) {
291
+				foreach ($this->cookies[$domain][$path] as $name => $cookie) {
292
+					$cookies[] = $cookie;
293
+				}
294
+			}
295
+		}
296
+		return $cookies;
297
+	}
298
+
299
+	/**
300
+	 * Sets whether session cookies should be serialized when serializing the jar
301
+	 *
302
+	 * @param boolean $serialize serialize?
303
+	 */
304
+	public function serializeSessionCookies($serialize)
305
+	{
306
+		$this->serializeSession = (bool)$serialize;
307
+	}
308
+
309
+	/**
310
+	 * Sets whether Public Suffix List should be used for restricting cookie-setting
311
+	 *
312
+	 * Without PSL {@link domainMatch()} will only prevent setting cookies for
313
+	 * top-level domains like '.com' or '.org'. However, it will not prevent
314
+	 * setting a cookie for '.co.uk' even though only third-level registrations
315
+	 * are possible in .uk domain.
316
+	 *
317
+	 * With the List it is possible to find the highest level at which a domain
318
+	 * may be registered for a particular top-level domain and consequently
319
+	 * prevent cookies set for '.co.uk' or '.msk.ru'. The same list is used by
320
+	 * Firefox, Chrome and Opera browsers to restrict cookie setting.
321
+	 *
322
+	 * Note that PSL is licensed differently to HTTP_Request2 package (refer to
323
+	 * the license information in public-suffix-list.php), so you can disable
324
+	 * its use if this is an issue for you.
325
+	 *
326
+	 * @param boolean $useList use the list?
327
+	 *
328
+	 * @link     http://publicsuffix.org/learn/
329
+	 */
330
+	public function usePublicSuffixList($useList)
331
+	{
332
+		$this->useList = (bool)$useList;
333
+	}
334
+
335
+	/**
336
+	 * Returns string representation of object
337
+	 *
338
+	 * @return string
339
+	 *
340
+	 * @see    Serializable::serialize()
341
+	 */
342
+	public function serialize()
343
+	{
344
+		$cookies = $this->getAll();
345
+		if (!$this->serializeSession) {
346
+			for ($i = count($cookies) - 1; $i >= 0; $i--) {
347
+				if (empty($cookies[$i]['expires'])) {
348
+					unset($cookies[$i]);
349
+				}
350
+			}
351
+		}
352
+		return serialize(array(
353
+			'cookies'          => $cookies,
354
+			'serializeSession' => $this->serializeSession,
355
+			'useList'          => $this->useList
356
+		));
357
+	}
358
+
359
+	/**
360
+	 * Constructs the object from serialized string
361
+	 *
362
+	 * @param string $serialized string representation
363
+	 *
364
+	 * @see   Serializable::unserialize()
365
+	 */
366
+	public function unserialize($serialized)
367
+	{
368
+		$data = unserialize($serialized);
369
+		$now  = $this->now();
370
+		$this->serializeSessionCookies($data['serializeSession']);
371
+		$this->usePublicSuffixList($data['useList']);
372
+		foreach ($data['cookies'] as $cookie) {
373
+			if (!empty($cookie['expires']) && $cookie['expires'] <= $now) {
374
+				continue;
375
+			}
376
+			if (!isset($this->cookies[$cookie['domain']])) {
377
+				$this->cookies[$cookie['domain']] = array();
378
+			}
379
+			if (!isset($this->cookies[$cookie['domain']][$cookie['path']])) {
380
+				$this->cookies[$cookie['domain']][$cookie['path']] = array();
381
+			}
382
+			$this->cookies[$cookie['domain']][$cookie['path']][$cookie['name']] = $cookie;
383
+		}
384
+	}
385
+
386
+	/**
387
+	 * Checks whether a cookie domain matches a request host.
388
+	 *
389
+	 * The method is used by {@link store()} to check for whether a document
390
+	 * at given URL can set a cookie with a given domain attribute and by
391
+	 * {@link getMatching()} to find cookies matching the request URL.
392
+	 *
393
+	 * @param string $requestHost  request host
394
+	 * @param string $cookieDomain cookie domain
395
+	 *
396
+	 * @return   bool    match success
397
+	 */
398
+	public function domainMatch($requestHost, $cookieDomain)
399
+	{
400
+		if ($requestHost == $cookieDomain) {
401
+			return true;
402
+		}
403
+		// IP address, we require exact match
404
+		if (preg_match('/^(?:\d{1,3}\.){3}\d{1,3}$/', $requestHost)) {
405
+			return false;
406
+		}
407
+		if ('.' != $cookieDomain[0]) {
408
+			$cookieDomain = '.' . $cookieDomain;
409
+		}
410
+		// prevents setting cookies for '.com' and similar domains
411
+		if (!$this->useList && substr_count($cookieDomain, '.') < 2
412
+			|| $this->useList && !self::getRegisteredDomain($cookieDomain)
413
+		) {
414
+			return false;
415
+		}
416
+		return substr('.' . $requestHost, -strlen($cookieDomain)) == $cookieDomain;
417
+	}
418
+
419
+	/**
420
+	 * Removes subdomains to get the registered domain (the first after top-level)
421
+	 *
422
+	 * The method will check Public Suffix List to find out where top-level
423
+	 * domain ends and registered domain starts. It will remove domain parts
424
+	 * to the left of registered one.
425
+	 *
426
+	 * @param string $domain domain name
427
+	 *
428
+	 * @return string|bool   registered domain, will return false if $domain is
429
+	 *                       either invalid or a TLD itself
430
+	 */
431
+	public static function getRegisteredDomain($domain)
432
+	{
433
+		$domainParts = explode('.', ltrim($domain, '.'));
434
+
435
+		// load the list if needed
436
+		if (empty(self::$psl)) {
437
+			$path = '@data_dir@' . DIRECTORY_SEPARATOR . 'HTTP_Request2';
438
+			if (0 === strpos($path, '@' . 'data_dir@')) {
439
+				$path = realpath(
440
+					dirname(__FILE__) . DIRECTORY_SEPARATOR . '..'
441
+					. DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'data'
442
+				);
443
+			}
444
+			self::$psl = include_once $path . DIRECTORY_SEPARATOR . 'public-suffix-list.php';
445
+		}
446
+
447
+		if (!($result = self::checkDomainsList($domainParts, self::$psl))) {
448
+			// known TLD, invalid domain name
449
+			return false;
450
+		}
451
+
452
+		// unknown TLD
453
+		if (!strpos($result, '.')) {
454
+			// fallback to checking that domain "has at least two dots"
455
+			if (2 > ($count = count($domainParts))) {
456
+				return false;
457
+			}
458
+			return $domainParts[$count - 2] . '.' . $domainParts[$count - 1];
459
+		}
460
+		return $result;
461
+	}
462
+
463
+	/**
464
+	 * Recursive helper method for {@link getRegisteredDomain()}
465
+	 *
466
+	 * @param array $domainParts remaining domain parts
467
+	 * @param mixed $listNode    node in {@link HTTP_Request2_CookieJar::$psl} to check
468
+	 *
469
+	 * @return string|null   concatenated domain parts, null in case of error
470
+	 */
471
+	protected static function checkDomainsList(array $domainParts, $listNode)
472
+	{
473
+		$sub    = array_pop($domainParts);
474
+		$result = null;
475
+
476
+		if (!is_array($listNode) || is_null($sub)
477
+			|| array_key_exists('!' . $sub, $listNode)
478
+		) {
479
+			return $sub;
480
+
481
+		} elseif (array_key_exists($sub, $listNode)) {
482
+			$result = self::checkDomainsList($domainParts, $listNode[$sub]);
483
+
484
+		} elseif (array_key_exists('*', $listNode)) {
485
+			$result = self::checkDomainsList($domainParts, $listNode['*']);
486
+
487
+		} else {
488
+			return $sub;
489
+		}
490
+
491
+		return (strlen($result) > 0) ? ($result . '.' . $sub) : null;
492
+	}
493 493
 }
494 494
 ?>
495 495
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -173,7 +173,7 @@  discard block
 block discarded – undo
173 173
             }
174 174
             if (empty($cookie['path'])) {
175 175
                 $path = $setter->getPath();
176
-                $cookie['path'] = empty($path)? '/': substr($path, 0, strrpos($path, '/') + 1);
176
+                $cookie['path'] = empty($path) ? '/' : substr($path, 0, strrpos($path, '/') + 1);
177 177
             }
178 178
         }
179 179
 
@@ -272,7 +272,7 @@  discard block
 block discarded – undo
272 272
         } else {
273 273
             $str = '';
274 274
             foreach ($ret as $c) {
275
-                $str .= (empty($str)? '': '; ') . $c['name'] . '=' . $c['value'];
275
+                $str .= (empty($str) ? '' : '; ') . $c['name'] . '=' . $c['value'];
276 276
             }
277 277
             return $str;
278 278
         }
@@ -303,7 +303,7 @@  discard block
 block discarded – undo
303 303
      */
304 304
     public function serializeSessionCookies($serialize)
305 305
     {
306
-        $this->serializeSession = (bool)$serialize;
306
+        $this->serializeSession = (bool) $serialize;
307 307
     }
308 308
 
309 309
     /**
@@ -329,7 +329,7 @@  discard block
 block discarded – undo
329 329
      */
330 330
     public function usePublicSuffixList($useList)
331 331
     {
332
-        $this->useList = (bool)$useList;
332
+        $this->useList = (bool) $useList;
333 333
     }
334 334
 
335 335
     /**
Please login to merge, or discard this patch.
libs/PEAR.1.9.5/Net/URL2.php 3 patches
Doc Comments   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -229,7 +229,7 @@  discard block
 block discarded – undo
229 229
      * Returns the user part of the userinfo part (the part preceding the first
230 230
      *  ":"), or false if there is no userinfo part.
231 231
      *
232
-     * @return string|bool
232
+     * @return string|false
233 233
      */
234 234
     public function getUser()
235 235
     {
@@ -244,7 +244,7 @@  discard block
 block discarded – undo
244 244
      * contain "@" in front of the hostname) or the userinfo part does not
245 245
      * contain ":".
246 246
      *
247
-     * @return string|bool
247
+     * @return string|false
248 248
      */
249 249
     public function getPassword()
250 250
     {
@@ -341,7 +341,7 @@  discard block
 block discarded – undo
341 341
      * Returns the authority part, i.e. [ userinfo "@" ] host [ ":" port ], or
342 342
      * false if there is no authority.
343 343
      *
344
-     * @return string|bool
344
+     * @return false|string
345 345
      */
346 346
     public function getAuthority()
347 347
     {
@@ -874,7 +874,7 @@  discard block
 block discarded – undo
874 874
      * Returns an Net_URL2 instance representing an absolute URL relative to
875 875
      * this URL.
876 876
      *
877
-     * @param Net_URL2|string $reference relative URL
877
+     * @param Net_URL2 $reference relative URL
878 878
      *
879 879
      * @throws Exception
880 880
      * @return $this
@@ -1047,7 +1047,7 @@  discard block
 block discarded – undo
1047 1047
      * currently executing PHP script.
1048 1048
      *
1049 1049
      * @throws Exception
1050
-     * @return string
1050
+     * @return Net_URL2
1051 1051
      */
1052 1052
     public static function getCanonical()
1053 1053
     {
@@ -1106,7 +1106,7 @@  discard block
 block discarded – undo
1106 1106
      *
1107 1107
      * @param string $optionName The name of the option to retrieve
1108 1108
      *
1109
-     * @return mixed
1109
+     * @return string
1110 1110
      */
1111 1111
     public function getOption($optionName)
1112 1112
     {
Please login to merge, or discard this patch.
Indentation   +1202 added lines, -1202 removed lines patch added patch discarded remove patch
@@ -1,47 +1,47 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 /**
3
- * Net_URL2, a class representing a URL as per RFC 3986.
4
- *
5
- * PHP version 5
6
- *
7
- * LICENSE:
8
- *
9
- * Copyright (c) 2007-2009, Peytz & Co. A/S
10
- * All rights reserved.
11
- *
12
- * Redistribution and use in source and binary forms, with or without
13
- * modification, are permitted provided that the following conditions
14
- * are met:
15
- *
16
- *   * Redistributions of source code must retain the above copyright
17
- *     notice, this list of conditions and the following disclaimer.
18
- *   * Redistributions in binary form must reproduce the above copyright
19
- *     notice, this list of conditions and the following disclaimer in
20
- *     the documentation and/or other materials provided with the distribution.
21
- *   * Neither the name of the Net_URL2 nor the names of its contributors may
22
- *     be used to endorse or promote products derived from this software
23
- *     without specific prior written permission.
24
- *
25
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
26
- * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
27
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
29
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
33
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
- *
37
- * @category  Networking
38
- * @package   Net_URL2
39
- * @author    Christian Schmidt <[email protected]>
40
- * @copyright 2007-2009 Peytz & Co. A/S
41
- * @license   https://spdx.org/licenses/BSD-3-Clause BSD-3-Clause
42
- * @version   CVS: $Id$
43
- * @link      https://tools.ietf.org/html/rfc3986
44
- */
3
+	 * Net_URL2, a class representing a URL as per RFC 3986.
4
+	 *
5
+	 * PHP version 5
6
+	 *
7
+	 * LICENSE:
8
+	 *
9
+	 * Copyright (c) 2007-2009, Peytz & Co. A/S
10
+	 * All rights reserved.
11
+	 *
12
+	 * Redistribution and use in source and binary forms, with or without
13
+	 * modification, are permitted provided that the following conditions
14
+	 * are met:
15
+	 *
16
+	 *   * Redistributions of source code must retain the above copyright
17
+	 *     notice, this list of conditions and the following disclaimer.
18
+	 *   * Redistributions in binary form must reproduce the above copyright
19
+	 *     notice, this list of conditions and the following disclaimer in
20
+	 *     the documentation and/or other materials provided with the distribution.
21
+	 *   * Neither the name of the Net_URL2 nor the names of its contributors may
22
+	 *     be used to endorse or promote products derived from this software
23
+	 *     without specific prior written permission.
24
+	 *
25
+	 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
26
+	 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
27
+	 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28
+	 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
29
+	 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30
+	 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31
+	 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32
+	 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
33
+	 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34
+	 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35
+	 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
+	 *
37
+	 * @category  Networking
38
+	 * @package   Net_URL2
39
+	 * @author    Christian Schmidt <[email protected]>
40
+	 * @copyright 2007-2009 Peytz & Co. A/S
41
+	 * @license   https://spdx.org/licenses/BSD-3-Clause BSD-3-Clause
42
+	 * @version   CVS: $Id$
43
+	 * @link      https://tools.ietf.org/html/rfc3986
44
+	 */
45 45
 
46 46
 /**
47 47
  * Represents a URL as per RFC 3986.
@@ -56,1164 +56,1164 @@  discard block
 block discarded – undo
56 56
  */
57 57
 class Net_URL2
58 58
 {
59
-    /**
60
-     * Do strict parsing in resolve() (see RFC 3986, section 5.2.2). Default
61
-     * is true.
62
-     */
63
-    const OPTION_STRICT = 'strict';
64
-
65
-    /**
66
-     * Represent arrays in query using PHP's [] notation. Default is true.
67
-     */
68
-    const OPTION_USE_BRACKETS = 'use_brackets';
69
-
70
-    /**
71
-     * Drop zero-based integer sequences in query using PHP's [] notation. Default
72
-     * is true.
73
-     */
74
-    const OPTION_DROP_SEQUENCE = 'drop_sequence';
75
-
76
-    /**
77
-     * URL-encode query variable keys. Default is true.
78
-     */
79
-    const OPTION_ENCODE_KEYS = 'encode_keys';
80
-
81
-    /**
82
-     * Query variable separators when parsing the query string. Every character
83
-     * is considered a separator. Default is "&".
84
-     */
85
-    const OPTION_SEPARATOR_INPUT = 'input_separator';
86
-
87
-    /**
88
-     * Query variable separator used when generating the query string. Default
89
-     * is "&".
90
-     */
91
-    const OPTION_SEPARATOR_OUTPUT = 'output_separator';
92
-
93
-    /**
94
-     * Default options corresponds to how PHP handles $_GET.
95
-     */
96
-    private $_options = array(
97
-        self::OPTION_STRICT           => true,
98
-        self::OPTION_USE_BRACKETS     => true,
99
-        self::OPTION_DROP_SEQUENCE    => true,
100
-        self::OPTION_ENCODE_KEYS      => true,
101
-        self::OPTION_SEPARATOR_INPUT  => '&',
102
-        self::OPTION_SEPARATOR_OUTPUT => '&',
103
-        );
104
-
105
-    /**
106
-     * @var  string|bool
107
-     */
108
-    private $_scheme = false;
109
-
110
-    /**
111
-     * @var  string|bool
112
-     */
113
-    private $_userinfo = false;
114
-
115
-    /**
116
-     * @var  string|bool
117
-     */
118
-    private $_host = false;
119
-
120
-    /**
121
-     * @var  string|bool
122
-     */
123
-    private $_port = false;
124
-
125
-    /**
126
-     * @var  string
127
-     */
128
-    private $_path = '';
129
-
130
-    /**
131
-     * @var  string|bool
132
-     */
133
-    private $_query = false;
134
-
135
-    /**
136
-     * @var  string|bool
137
-     */
138
-    private $_fragment = false;
139
-
140
-    /**
141
-     * Constructor.
142
-     *
143
-     * @param string $url     an absolute or relative URL
144
-     * @param array  $options an array of OPTION_xxx constants
145
-     *
146
-     * @uses   self::parseUrl()
147
-     */
148
-    public function __construct($url, array $options = array())
149
-    {
150
-        foreach ($options as $optionName => $value) {
151
-            if (array_key_exists($optionName, $this->_options)) {
152
-                $this->_options[$optionName] = $value;
153
-            }
154
-        }
155
-
156
-        $this->parseUrl($url);
157
-    }
158
-
159
-    /**
160
-     * Magic Setter.
161
-     *
162
-     * This method will magically set the value of a private variable ($var)
163
-     * with the value passed as the args
164
-     *
165
-     * @param string $var The private variable to set.
166
-     * @param mixed  $arg An argument of any type.
167
-     *
168
-     * @return void
169
-     */
170
-    public function __set($var, $arg)
171
-    {
172
-        $method = 'set' . $var;
173
-        if (method_exists($this, $method)) {
174
-            $this->$method($arg);
175
-        }
176
-    }
177
-
178
-    /**
179
-     * Magic Getter.
180
-     *
181
-     * This is the magic get method to retrieve the private variable
182
-     * that was set by either __set() or it's setter...
183
-     *
184
-     * @param string $var The property name to retrieve.
185
-     *
186
-     * @return mixed  $this->$var Either a boolean false if the
187
-     *                            property is not set or the value
188
-     *                            of the private property.
189
-     */
190
-    public function __get($var)
191
-    {
192
-        $method = 'get' . $var;
193
-        if (method_exists($this, $method)) {
194
-            return $this->$method();
195
-        }
196
-
197
-        return false;
198
-    }
199
-
200
-    /**
201
-     * Returns the scheme, e.g. "http" or "urn", or false if there is no
202
-     * scheme specified, i.e. if this is a relative URL.
203
-     *
204
-     * @return string|bool
205
-     */
206
-    public function getScheme()
207
-    {
208
-        return $this->_scheme;
209
-    }
210
-
211
-    /**
212
-     * Sets the scheme, e.g. "http" or "urn". Specify false if there is no
213
-     * scheme specified, i.e. if this is a relative URL.
214
-     *
215
-     * @param string|bool $scheme e.g. "http" or "urn", or false if there is no
216
-     *                            scheme specified, i.e. if this is a relative
217
-     *                            URL
218
-     *
219
-     * @return $this
220
-     * @see    getScheme
221
-     */
222
-    public function setScheme($scheme)
223
-    {
224
-        $this->_scheme = $scheme;
225
-        return $this;
226
-    }
227
-
228
-    /**
229
-     * Returns the user part of the userinfo part (the part preceding the first
230
-     *  ":"), or false if there is no userinfo part.
231
-     *
232
-     * @return string|bool
233
-     */
234
-    public function getUser()
235
-    {
236
-        return $this->_userinfo !== false
237
-            ? preg_replace('(:.*$)', '', $this->_userinfo)
238
-            : false;
239
-    }
240
-
241
-    /**
242
-     * Returns the password part of the userinfo part (the part after the first
243
-     *  ":"), or false if there is no userinfo part (i.e. the URL does not
244
-     * contain "@" in front of the hostname) or the userinfo part does not
245
-     * contain ":".
246
-     *
247
-     * @return string|bool
248
-     */
249
-    public function getPassword()
250
-    {
251
-        return $this->_userinfo !== false
252
-            ? substr(strstr($this->_userinfo, ':'), 1)
253
-            : false;
254
-    }
255
-
256
-    /**
257
-     * Returns the userinfo part, or false if there is none, i.e. if the
258
-     * authority part does not contain "@".
259
-     *
260
-     * @return string|bool
261
-     */
262
-    public function getUserinfo()
263
-    {
264
-        return $this->_userinfo;
265
-    }
266
-
267
-    /**
268
-     * Sets the userinfo part. If two arguments are passed, they are combined
269
-     * in the userinfo part as username ":" password.
270
-     *
271
-     * @param string|bool $userinfo userinfo or username
272
-     * @param string|bool $password optional password, or false
273
-     *
274
-     * @return $this
275
-     */
276
-    public function setUserinfo($userinfo, $password = false)
277
-    {
278
-        if ($password !== false) {
279
-            $userinfo .= ':' . $password;
280
-        }
281
-
282
-        if ($userinfo !== false) {
283
-            $userinfo = $this->_encodeData($userinfo);
284
-        }
285
-
286
-        $this->_userinfo = $userinfo;
287
-        return $this;
288
-    }
289
-
290
-    /**
291
-     * Returns the host part, or false if there is no authority part, e.g.
292
-     * relative URLs.
293
-     *
294
-     * @return string|bool a hostname, an IP address, or false
295
-     */
296
-    public function getHost()
297
-    {
298
-        return $this->_host;
299
-    }
300
-
301
-    /**
302
-     * Sets the host part. Specify false if there is no authority part, e.g.
303
-     * relative URLs.
304
-     *
305
-     * @param string|bool $host a hostname, an IP address, or false
306
-     *
307
-     * @return $this
308
-     */
309
-    public function setHost($host)
310
-    {
311
-        $this->_host = $host;
312
-        return $this;
313
-    }
314
-
315
-    /**
316
-     * Returns the port number, or false if there is no port number specified,
317
-     * i.e. if the default port is to be used.
318
-     *
319
-     * @return string|bool
320
-     */
321
-    public function getPort()
322
-    {
323
-        return $this->_port;
324
-    }
325
-
326
-    /**
327
-     * Sets the port number. Specify false if there is no port number specified,
328
-     * i.e. if the default port is to be used.
329
-     *
330
-     * @param string|bool $port a port number, or false
331
-     *
332
-     * @return $this
333
-     */
334
-    public function setPort($port)
335
-    {
336
-        $this->_port = $port;
337
-        return $this;
338
-    }
339
-
340
-    /**
341
-     * Returns the authority part, i.e. [ userinfo "@" ] host [ ":" port ], or
342
-     * false if there is no authority.
343
-     *
344
-     * @return string|bool
345
-     */
346
-    public function getAuthority()
347
-    {
348
-        if (false === $this->_host) {
349
-            return false;
350
-        }
351
-
352
-        $authority = '';
353
-
354
-        if (strlen($this->_userinfo)) {
355
-            $authority .= $this->_userinfo . '@';
356
-        }
357
-
358
-        $authority .= $this->_host;
359
-
360
-        if ($this->_port !== false) {
361
-            $authority .= ':' . $this->_port;
362
-        }
363
-
364
-        return $authority;
365
-    }
366
-
367
-    /**
368
-     * Sets the authority part, i.e. [ userinfo "@" ] host [ ":" port ]. Specify
369
-     * false if there is no authority.
370
-     *
371
-     * @param string|bool $authority a hostname or an IP address, possibly
372
-     *                                with userinfo prefixed and port number
373
-     *                                appended, e.g. "foo:[email protected]:81".
374
-     *
375
-     * @return $this
376
-     */
377
-    public function setAuthority($authority)
378
-    {
379
-        $this->_userinfo = false;
380
-        $this->_host     = false;
381
-        $this->_port     = false;
382
-
383
-        if ('' === $authority) {
384
-            $this->_host = $authority;
385
-            return $this;
386
-        }
387
-
388
-        if (!preg_match('(^(([^\@]*)\@)?(.+?)(:(\d*))?$)', $authority, $matches)) {
389
-            return $this;
390
-        }
391
-
392
-        if ($matches[1]) {
393
-            $this->_userinfo = $this->_encodeData($matches[2]);
394
-        }
395
-
396
-        $this->_host = $matches[3];
397
-
398
-        if (isset($matches[5]) && strlen($matches[5])) {
399
-            $this->_port = $matches[5];
400
-        }
401
-        return $this;
402
-    }
403
-
404
-    /**
405
-     * Returns the path part (possibly an empty string).
406
-     *
407
-     * @return string
408
-     */
409
-    public function getPath()
410
-    {
411
-        return $this->_path;
412
-    }
413
-
414
-    /**
415
-     * Sets the path part (possibly an empty string).
416
-     *
417
-     * @param string $path a path
418
-     *
419
-     * @return $this
420
-     */
421
-    public function setPath($path)
422
-    {
423
-        $this->_path = $path;
424
-        return $this;
425
-    }
426
-
427
-    /**
428
-     * Returns the query string (excluding the leading "?"), or false if "?"
429
-     * is not present in the URL.
430
-     *
431
-     * @return  string|bool
432
-     * @see     getQueryVariables
433
-     */
434
-    public function getQuery()
435
-    {
436
-        return $this->_query;
437
-    }
438
-
439
-    /**
440
-     * Sets the query string (excluding the leading "?"). Specify false if "?"
441
-     * is not present in the URL.
442
-     *
443
-     * @param string|bool $query a query string, e.g. "foo=1&bar=2"
444
-     *
445
-     * @return $this
446
-     * @see    setQueryVariables
447
-     */
448
-    public function setQuery($query)
449
-    {
450
-        $this->_query = $query;
451
-        return $this;
452
-    }
453
-
454
-    /**
455
-     * Returns the fragment name, or false if "#" is not present in the URL.
456
-     *
457
-     * @return string|bool
458
-     */
459
-    public function getFragment()
460
-    {
461
-        return $this->_fragment;
462
-    }
463
-
464
-    /**
465
-     * Sets the fragment name. Specify false if "#" is not present in the URL.
466
-     *
467
-     * @param string|bool $fragment a fragment excluding the leading "#", or
468
-     *                              false
469
-     *
470
-     * @return $this
471
-     */
472
-    public function setFragment($fragment)
473
-    {
474
-        $this->_fragment = $fragment;
475
-        return $this;
476
-    }
477
-
478
-    /**
479
-     * Returns the query string like an array as the variables would appear in
480
-     * $_GET in a PHP script. If the URL does not contain a "?", an empty array
481
-     * is returned.
482
-     *
483
-     * @return array
484
-     */
485
-    public function getQueryVariables()
486
-    {
487
-        $separator   = $this->getOption(self::OPTION_SEPARATOR_INPUT);
488
-        $encodeKeys  = $this->getOption(self::OPTION_ENCODE_KEYS);
489
-        $useBrackets = $this->getOption(self::OPTION_USE_BRACKETS);
490
-
491
-        $return  = array();
492
-
493
-        for ($part = strtok($this->_query, $separator);
494
-            strlen($part);
495
-            $part = strtok($separator)
496
-        ) {
497
-            list($key, $value) = explode('=', $part, 2) + array(1 => '');
498
-
499
-            if ($encodeKeys) {
500
-                $key = rawurldecode($key);
501
-            }
502
-            $value = rawurldecode($value);
503
-
504
-            if ($useBrackets) {
505
-                $return = $this->_queryArrayByKey($key, $value, $return);
506
-            } else {
507
-                if (isset($return[$key])) {
508
-                    $return[$key]  = (array) $return[$key];
509
-                    $return[$key][] = $value;
510
-                } else {
511
-                    $return[$key] = $value;
512
-                }
513
-            }
514
-        }
515
-
516
-        return $return;
517
-    }
518
-
519
-    /**
520
-     * Parse a single query key=value pair into an existing php array
521
-     *
522
-     * @param string $key   query-key
523
-     * @param string $value query-value
524
-     * @param array  $array of existing query variables (if any)
525
-     *
526
-     * @return mixed
527
-     */
528
-    private function _queryArrayByKey($key, $value, array $array = array())
529
-    {
530
-        if (!strlen($key)) {
531
-            return $array;
532
-        }
533
-
534
-        $offset = $this->_queryKeyBracketOffset($key);
535
-        if ($offset === false) {
536
-            $name = $key;
537
-        } else {
538
-            $name = substr($key, 0, $offset);
539
-        }
540
-
541
-        if (!strlen($name)) {
542
-            return $array;
543
-        }
544
-
545
-        if (!$offset) {
546
-            // named value
547
-            $array[$name] = $value;
548
-        } else {
549
-            // array
550
-            $brackets = substr($key, $offset);
551
-            if (!isset($array[$name])) {
552
-                $array[$name] = null;
553
-            }
554
-            $array[$name] = $this->_queryArrayByBrackets(
555
-                $brackets, $value, $array[$name]
556
-            );
557
-        }
558
-
559
-        return $array;
560
-    }
561
-
562
-    /**
563
-     * Parse a key-buffer to place value in array
564
-     *
565
-     * @param string $buffer to consume all keys from
566
-     * @param string $value  to be set/add
567
-     * @param array  $array  to traverse and set/add value in
568
-     *
569
-     * @throws Exception
570
-     * @return array
571
-     */
572
-    private function _queryArrayByBrackets($buffer, $value, array $array = null)
573
-    {
574
-        $entry = &$array;
575
-
576
-        for ($iteration = 0; strlen($buffer); $iteration++) {
577
-            $open = $this->_queryKeyBracketOffset($buffer);
578
-            if ($open !== 0) {
579
-                // Opening bracket [ must exist at offset 0, if not, there is
580
-                // no bracket to parse and the value dropped.
581
-                // if this happens in the first iteration, this is flawed, see
582
-                // as well the second exception below.
583
-                if ($iteration) {
584
-                    break;
585
-                }
586
-                // @codeCoverageIgnoreStart
587
-                throw new Exception(
588
-                    'Net_URL2 Internal Error: '. __METHOD__ .'(): ' .
589
-                    'Opening bracket [ must exist at offset 0'
590
-                );
591
-                // @codeCoverageIgnoreEnd
592
-            }
593
-
594
-            $close = strpos($buffer, ']', 1);
595
-            if (!$close) {
596
-                // this error condition should never be reached as this is a
597
-                // private method and bracket pairs are checked beforehand.
598
-                // See as well the first exception for the opening bracket.
599
-                // @codeCoverageIgnoreStart
600
-                throw new Exception(
601
-                    'Net_URL2 Internal Error: '. __METHOD__ .'(): ' .
602
-                    'Closing bracket ] must exist, not found'
603
-                );
604
-                // @codeCoverageIgnoreEnd
605
-            }
606
-
607
-            $index = substr($buffer, 1, $close - 1);
608
-            if (strlen($index)) {
609
-                $entry = &$entry[$index];
610
-            } else {
611
-                if (!is_array($entry)) {
612
-                    $entry = array();
613
-                }
614
-                $entry[] = &$new;
615
-                $entry = &$new;
616
-                unset($new);
617
-            }
618
-            $buffer = substr($buffer, $close + 1);
619
-        }
620
-
621
-        $entry = $value;
622
-
623
-        return $array;
624
-    }
625
-
626
-    /**
627
-     * Query-key has brackets ("...[]")
628
-     *
629
-     * @param string $key query-key
630
-     *
631
-     * @return bool|int offset of opening bracket, false if no brackets
632
-     */
633
-    private function _queryKeyBracketOffset($key)
634
-    {
635
-        if (false !== $open = strpos($key, '[')
636
-            and false === strpos($key, ']', $open + 1)
637
-        ) {
638
-            $open = false;
639
-        }
640
-
641
-        return $open;
642
-    }
643
-
644
-    /**
645
-     * Sets the query string to the specified variable in the query string.
646
-     *
647
-     * @param array $array (name => value) array
648
-     *
649
-     * @return $this
650
-     */
651
-    public function setQueryVariables(array $array)
652
-    {
653
-        if (!$array) {
654
-            $this->_query = false;
655
-        } else {
656
-            $this->_query = $this->buildQuery(
657
-                $array,
658
-                $this->getOption(self::OPTION_SEPARATOR_OUTPUT)
659
-            );
660
-        }
661
-        return $this;
662
-    }
663
-
664
-    /**
665
-     * Sets the specified variable in the query string.
666
-     *
667
-     * @param string $name  variable name
668
-     * @param mixed  $value variable value
669
-     *
670
-     * @return $this
671
-     */
672
-    public function setQueryVariable($name, $value)
673
-    {
674
-        $array = $this->getQueryVariables();
675
-        $array[$name] = $value;
676
-        $this->setQueryVariables($array);
677
-        return $this;
678
-    }
679
-
680
-    /**
681
-     * Removes the specified variable from the query string.
682
-     *
683
-     * @param string $name a query string variable, e.g. "foo" in "?foo=1"
684
-     *
685
-     * @return void
686
-     */
687
-    public function unsetQueryVariable($name)
688
-    {
689
-        $array = $this->getQueryVariables();
690
-        unset($array[$name]);
691
-        $this->setQueryVariables($array);
692
-    }
693
-
694
-    /**
695
-     * Returns a string representation of this URL.
696
-     *
697
-     * @return string
698
-     */
699
-    public function getURL()
700
-    {
701
-        // See RFC 3986, section 5.3
702
-        $url = '';
703
-
704
-        if ($this->_scheme !== false) {
705
-            $url .= $this->_scheme . ':';
706
-        }
707
-
708
-        $authority = $this->getAuthority();
709
-        if ($authority === false && strtolower($this->_scheme) === 'file') {
710
-            $authority = '';
711
-        }
712
-
713
-        $url .= $this->_buildAuthorityAndPath($authority, $this->_path);
714
-
715
-        if ($this->_query !== false) {
716
-            $url .= '?' . $this->_query;
717
-        }
718
-
719
-        if ($this->_fragment !== false) {
720
-            $url .= '#' . $this->_fragment;
721
-        }
722
-
723
-        return $url;
724
-    }
725
-
726
-    /**
727
-     * Put authority and path together, wrapping authority
728
-     * into proper separators/terminators.
729
-     *
730
-     * @param string|bool $authority authority
731
-     * @param string      $path      path
732
-     *
733
-     * @return string
734
-     */
735
-    private function _buildAuthorityAndPath($authority, $path)
736
-    {
737
-        if ($authority === false) {
738
-            return $path;
739
-        }
740
-
741
-        $terminator = ($path !== '' && $path[0] !== '/') ? '/' : '';
742
-
743
-        return '//' . $authority . $terminator . $path;
744
-    }
745
-
746
-    /**
747
-     * Returns a string representation of this URL.
748
-     *
749
-     * @return string
750
-     * @link https://php.net/language.oop5.magic#object.tostring
751
-     */
752
-    public function __toString()
753
-    {
754
-        return $this->getURL();
755
-    }
756
-
757
-    /**
758
-     * Returns a normalized string representation of this URL. This is useful
759
-     * for comparison of URLs.
760
-     *
761
-     * @return string
762
-     */
763
-    public function getNormalizedURL()
764
-    {
765
-        $url = clone $this;
766
-        $url->normalize();
767
-        return $url->getUrl();
768
-    }
769
-
770
-    /**
771
-     * Normalizes the URL
772
-     *
773
-     * See RFC 3986, Section 6.  Normalization and Comparison
774
-     *
775
-     * @link https://tools.ietf.org/html/rfc3986#section-6
776
-     *
777
-     * @return void
778
-     */
779
-    public function normalize()
780
-    {
781
-        // See RFC 3986, section 6
782
-
783
-        // Scheme is case-insensitive
784
-        if ($this->_scheme) {
785
-            $this->_scheme = strtolower($this->_scheme);
786
-        }
787
-
788
-        // Hostname is case-insensitive
789
-        if ($this->_host) {
790
-            $this->_host = strtolower($this->_host);
791
-        }
792
-
793
-        // Remove default port number for known schemes (RFC 3986, section 6.2.3)
794
-        if ('' === $this->_port
795
-            || $this->_port
796
-            && $this->_scheme
797
-            && $this->_port == getservbyname($this->_scheme, 'tcp')
798
-        ) {
799
-            $this->_port = false;
800
-        }
801
-
802
-        // Normalize case of %XX percentage-encodings (RFC 3986, section 6.2.2.1)
803
-        // Normalize percentage-encoded unreserved characters (section 6.2.2.2)
804
-        $fields = array(&$this->_userinfo, &$this->_host, &$this->_path,
805
-                        &$this->_query, &$this->_fragment);
806
-        foreach ($fields as &$field) {
807
-            if ($field !== false) {
808
-                $field = $this->_normalize("$field");
809
-            }
810
-        }
811
-        unset($field);
812
-
813
-        // Path segment normalization (RFC 3986, section 6.2.2.3)
814
-        $this->_path = self::removeDotSegments($this->_path);
815
-
816
-        // Scheme based normalization (RFC 3986, section 6.2.3)
817
-        if (false !== $this->_host && '' === $this->_path) {
818
-            $this->_path = '/';
819
-        }
820
-
821
-        // path should start with '/' if there is authority (section 3.3.)
822
-        if (strlen($this->getAuthority())
823
-            && strlen($this->_path)
824
-            && $this->_path[0] !== '/'
825
-        ) {
826
-            $this->_path = '/' . $this->_path;
827
-        }
828
-    }
829
-
830
-    /**
831
-     * Normalize case of %XX percentage-encodings (RFC 3986, section 6.2.2.1)
832
-     * Normalize percentage-encoded unreserved characters (section 6.2.2.2)
833
-     *
834
-     * @param string|array $mixed string or array of strings to normalize
835
-     *
836
-     * @return string|array
837
-     * @see normalize
838
-     * @see _normalizeCallback()
839
-     */
840
-    private function _normalize($mixed)
841
-    {
842
-        return preg_replace_callback(
843
-            '((?:%[0-9a-fA-Z]{2})+)', array($this, '_normalizeCallback'),
844
-            $mixed
845
-        );
846
-    }
847
-
848
-    /**
849
-     * Callback for _normalize() of %XX percentage-encodings
850
-     *
851
-     * @param array $matches as by preg_replace_callback
852
-     *
853
-     * @return string
854
-     * @see normalize
855
-     * @see _normalize
856
-     * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
857
-     */
858
-    private function _normalizeCallback($matches)
859
-    {
860
-        return self::urlencode(urldecode($matches[0]));
861
-    }
862
-
863
-    /**
864
-     * Returns whether this instance represents an absolute URL.
865
-     *
866
-     * @return bool
867
-     */
868
-    public function isAbsolute()
869
-    {
870
-        return (bool) $this->_scheme;
871
-    }
872
-
873
-    /**
874
-     * Returns an Net_URL2 instance representing an absolute URL relative to
875
-     * this URL.
876
-     *
877
-     * @param Net_URL2|string $reference relative URL
878
-     *
879
-     * @throws Exception
880
-     * @return $this
881
-     */
882
-    public function resolve($reference)
883
-    {
884
-        if (!$reference instanceof Net_URL2) {
885
-            $reference = new self($reference);
886
-        }
887
-        if (!$reference->_isFragmentOnly() && !$this->isAbsolute()) {
888
-            throw new Exception(
889
-                'Base-URL must be absolute if reference is not fragment-only'
890
-            );
891
-        }
892
-
893
-        // A non-strict parser may ignore a scheme in the reference if it is
894
-        // identical to the base URI's scheme.
895
-        if (!$this->getOption(self::OPTION_STRICT)
896
-            && $reference->_scheme == $this->_scheme
897
-        ) {
898
-            $reference->_scheme = false;
899
-        }
900
-
901
-        $target = new self('');
902
-        if ($reference->_scheme !== false) {
903
-            $target->_scheme = $reference->_scheme;
904
-            $target->setAuthority($reference->getAuthority());
905
-            $target->_path  = self::removeDotSegments($reference->_path);
906
-            $target->_query = $reference->_query;
907
-        } else {
908
-            $authority = $reference->getAuthority();
909
-            if ($authority !== false) {
910
-                $target->setAuthority($authority);
911
-                $target->_path  = self::removeDotSegments($reference->_path);
912
-                $target->_query = $reference->_query;
913
-            } else {
914
-                if ($reference->_path == '') {
915
-                    $target->_path = $this->_path;
916
-                    if ($reference->_query !== false) {
917
-                        $target->_query = $reference->_query;
918
-                    } else {
919
-                        $target->_query = $this->_query;
920
-                    }
921
-                } else {
922
-                    if (substr($reference->_path, 0, 1) == '/') {
923
-                        $target->_path = self::removeDotSegments($reference->_path);
924
-                    } else {
925
-                        // Merge paths (RFC 3986, section 5.2.3)
926
-                        if ($this->_host !== false && $this->_path == '') {
927
-                            $target->_path = '/' . $reference->_path;
928
-                        } else {
929
-                            $i = strrpos($this->_path, '/');
930
-                            if ($i !== false) {
931
-                                $target->_path = substr($this->_path, 0, $i + 1);
932
-                            }
933
-                            $target->_path .= $reference->_path;
934
-                        }
935
-                        $target->_path = self::removeDotSegments($target->_path);
936
-                    }
937
-                    $target->_query = $reference->_query;
938
-                }
939
-                $target->setAuthority($this->getAuthority());
940
-            }
941
-            $target->_scheme = $this->_scheme;
942
-        }
943
-
944
-        $target->_fragment = $reference->_fragment;
945
-
946
-        return $target;
947
-    }
948
-
949
-    /**
950
-     * URL is fragment-only
951
-     *
952
-     * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
953
-     * @return bool
954
-     */
955
-    private function _isFragmentOnly()
956
-    {
957
-        return (
958
-            $this->_fragment !== false
959
-            && $this->_query === false
960
-            && $this->_path === ''
961
-            && $this->_port === false
962
-            && $this->_host === false
963
-            && $this->_userinfo === false
964
-            && $this->_scheme === false
965
-        );
966
-    }
967
-
968
-    /**
969
-     * Removes dots as described in RFC 3986, section 5.2.4, e.g.
970
-     * "/foo/../bar/baz" => "/bar/baz"
971
-     *
972
-     * @param string $path a path
973
-     *
974
-     * @return string a path
975
-     */
976
-    public static function removeDotSegments($path)
977
-    {
978
-        $path = (string) $path;
979
-        $output = '';
980
-
981
-        // Make sure not to be trapped in an infinite loop due to a bug in this
982
-        // method
983
-        $loopLimit = 256;
984
-        $j = 0;
985
-        while ('' !== $path && $j++ < $loopLimit) {
986
-            if (substr($path, 0, 2) === './') {
987
-                // Step 2.A
988
-                $path = substr($path, 2);
989
-            } elseif (substr($path, 0, 3) === '../') {
990
-                // Step 2.A
991
-                $path = substr($path, 3);
992
-            } elseif (substr($path, 0, 3) === '/./' || $path === '/.') {
993
-                // Step 2.B
994
-                $path = '/' . substr($path, 3);
995
-            } elseif (substr($path, 0, 4) === '/../' || $path === '/..') {
996
-                // Step 2.C
997
-                $path   = '/' . substr($path, 4);
998
-                $i      = strrpos($output, '/');
999
-                $output = $i === false ? '' : substr($output, 0, $i);
1000
-            } elseif ($path === '.' || $path === '..') {
1001
-                // Step 2.D
1002
-                $path = '';
1003
-            } else {
1004
-                // Step 2.E
1005
-                $i = strpos($path, '/', $path[0] === '/');
1006
-                if ($i === false) {
1007
-                    $output .= $path;
1008
-                    $path = '';
1009
-                    break;
1010
-                }
1011
-                $output .= substr($path, 0, $i);
1012
-                $path = substr($path, $i);
1013
-            }
1014
-        }
1015
-
1016
-        if ($path !== '') {
1017
-            $message = sprintf(
1018
-                'Unable to remove dot segments; hit loop limit %d (left: %s)',
1019
-                $j, var_export($path, true)
1020
-            );
1021
-            trigger_error($message, E_USER_WARNING);
1022
-        }
1023
-
1024
-        return $output;
1025
-    }
1026
-
1027
-    /**
1028
-     * Percent-encodes all non-alphanumeric characters except these: _ . - ~
1029
-     * Similar to PHP's rawurlencode(), except that it also encodes ~ in PHP
1030
-     * 5.2.x and earlier.
1031
-     *
1032
-     * @param string $string string to encode
1033
-     *
1034
-     * @return string
1035
-     */
1036
-    public static function urlencode($string)
1037
-    {
1038
-        $encoded = rawurlencode($string);
1039
-
1040
-        // This is only necessary in PHP < 5.3.
1041
-        $encoded = str_replace('%7E', '~', $encoded);
1042
-        return $encoded;
1043
-    }
1044
-
1045
-    /**
1046
-     * Returns a Net_URL2 instance representing the canonical URL of the
1047
-     * currently executing PHP script.
1048
-     *
1049
-     * @throws Exception
1050
-     * @return string
1051
-     */
1052
-    public static function getCanonical()
1053
-    {
1054
-        if (!isset($_SERVER['REQUEST_METHOD'])) {
1055
-            // ALERT - no current URL
1056
-            throw new Exception('Script was not called through a webserver');
1057
-        }
1058
-
1059
-        // Begin with a relative URL
1060
-        $url = new self($_SERVER['PHP_SELF']);
1061
-        $url->_scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http';
1062
-        $url->_host   = $_SERVER['SERVER_NAME'];
1063
-        $port = $_SERVER['SERVER_PORT'];
1064
-        if ($url->_scheme == 'http' && $port != 80
1065
-            || $url->_scheme == 'https' && $port != 443
1066
-        ) {
1067
-            $url->_port = $port;
1068
-        }
1069
-        return $url;
1070
-    }
1071
-
1072
-    /**
1073
-     * Returns the URL used to retrieve the current request.
1074
-     *
1075
-     * @return  string
1076
-     */
1077
-    public static function getRequestedURL()
1078
-    {
1079
-        return self::getRequested()->getUrl();
1080
-    }
1081
-
1082
-    /**
1083
-     * Returns a Net_URL2 instance representing the URL used to retrieve the
1084
-     * current request.
1085
-     *
1086
-     * @throws Exception
1087
-     * @return $this
1088
-     */
1089
-    public static function getRequested()
1090
-    {
1091
-        if (!isset($_SERVER['REQUEST_METHOD'])) {
1092
-            // ALERT - no current URL
1093
-            throw new Exception('Script was not called through a webserver');
1094
-        }
1095
-
1096
-        // Begin with a relative URL
1097
-        $url = new self($_SERVER['REQUEST_URI']);
1098
-        $url->_scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http';
1099
-        // Set host and possibly port
1100
-        $url->setAuthority($_SERVER['HTTP_HOST']);
1101
-        return $url;
1102
-    }
1103
-
1104
-    /**
1105
-     * Returns the value of the specified option.
1106
-     *
1107
-     * @param string $optionName The name of the option to retrieve
1108
-     *
1109
-     * @return mixed
1110
-     */
1111
-    public function getOption($optionName)
1112
-    {
1113
-        return isset($this->_options[$optionName])
1114
-            ? $this->_options[$optionName] : false;
1115
-    }
1116
-
1117
-    /**
1118
-     * A simple version of http_build_query in userland. The encoded string is
1119
-     * percentage encoded according to RFC 3986.
1120
-     *
1121
-     * @param array  $data      An array, which has to be converted into
1122
-     *                          QUERY_STRING. Anything is possible.
1123
-     * @param string $separator Separator {@link self::OPTION_SEPARATOR_OUTPUT}
1124
-     * @param string $key       For stacked values (arrays in an array).
1125
-     *
1126
-     * @return string
1127
-     */
1128
-    protected function buildQuery(array $data, $separator, $key = null)
1129
-    {
1130
-        $query = array();
1131
-        $drop_names = (
1132
-            $this->_options[self::OPTION_DROP_SEQUENCE] === true
1133
-            && array_keys($data) === array_keys(array_values($data))
1134
-        );
1135
-        foreach ($data as $name => $value) {
1136
-            if ($this->getOption(self::OPTION_ENCODE_KEYS) === true) {
1137
-                $name = rawurlencode($name);
1138
-            }
1139
-            if ($key !== null) {
1140
-                if ($this->getOption(self::OPTION_USE_BRACKETS) === true) {
1141
-                    $drop_names && $name = '';
1142
-                    $name = $key . '[' . $name . ']';
1143
-                } else {
1144
-                    $name = $key;
1145
-                }
1146
-            }
1147
-            if (is_array($value)) {
1148
-                $query[] = $this->buildQuery($value, $separator, $name);
1149
-            } else {
1150
-                $query[] = $name . '=' . rawurlencode($value);
1151
-            }
1152
-        }
1153
-        return implode($separator, $query);
1154
-    }
1155
-
1156
-    /**
1157
-     * This method uses a regex to parse the url into the designated parts.
1158
-     *
1159
-     * @param string $url URL
1160
-     *
1161
-     * @return void
1162
-     * @uses   self::$_scheme, self::setAuthority(), self::$_path, self::$_query,
1163
-     *         self::$_fragment
1164
-     * @see    __construct
1165
-     */
1166
-    protected function parseUrl($url)
1167
-    {
1168
-        // The regular expression is copied verbatim from RFC 3986, appendix B.
1169
-        // The expression does not validate the URL but matches any string.
1170
-        preg_match(
1171
-            '(^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?)',
1172
-            $url, $matches
1173
-        );
1174
-
1175
-        // "path" is always present (possibly as an empty string); the rest
1176
-        // are optional.
1177
-        $this->_scheme   = !empty($matches[1]) ? $matches[2] : false;
1178
-        $this->setAuthority(!empty($matches[3]) ? $matches[4] : false);
1179
-        $this->_path     = $this->_encodeData($matches[5]);
1180
-        $this->_query    = !empty($matches[6])
1181
-                           ? $this->_encodeData($matches[7])
1182
-                           : false
1183
-            ;
1184
-        $this->_fragment = !empty($matches[8]) ? $matches[9] : false;
1185
-    }
1186
-
1187
-    /**
1188
-     * Encode characters that might have been forgotten to encode when passing
1189
-     * in an URL. Applied onto Userinfo, Path and Query.
1190
-     *
1191
-     * @param string $url URL
1192
-     *
1193
-     * @return string
1194
-     * @see parseUrl
1195
-     * @see setAuthority
1196
-     * @link https://pear.php.net/bugs/bug.php?id=20425
1197
-     */
1198
-    private function _encodeData($url)
1199
-    {
1200
-        return preg_replace_callback(
1201
-            '([\x-\x20\x22\x3C\x3E\x7F-\xFF]+)',
1202
-            array($this, '_encodeCallback'), $url
1203
-        );
1204
-    }
1205
-
1206
-    /**
1207
-     * callback for encoding character data
1208
-     *
1209
-     * @param array $matches Matches
1210
-     *
1211
-     * @return string
1212
-     * @see _encodeData
1213
-     * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
1214
-     */
1215
-    private function _encodeCallback(array $matches)
1216
-    {
1217
-        return rawurlencode($matches[0]);
1218
-    }
59
+	/**
60
+	 * Do strict parsing in resolve() (see RFC 3986, section 5.2.2). Default
61
+	 * is true.
62
+	 */
63
+	const OPTION_STRICT = 'strict';
64
+
65
+	/**
66
+	 * Represent arrays in query using PHP's [] notation. Default is true.
67
+	 */
68
+	const OPTION_USE_BRACKETS = 'use_brackets';
69
+
70
+	/**
71
+	 * Drop zero-based integer sequences in query using PHP's [] notation. Default
72
+	 * is true.
73
+	 */
74
+	const OPTION_DROP_SEQUENCE = 'drop_sequence';
75
+
76
+	/**
77
+	 * URL-encode query variable keys. Default is true.
78
+	 */
79
+	const OPTION_ENCODE_KEYS = 'encode_keys';
80
+
81
+	/**
82
+	 * Query variable separators when parsing the query string. Every character
83
+	 * is considered a separator. Default is "&".
84
+	 */
85
+	const OPTION_SEPARATOR_INPUT = 'input_separator';
86
+
87
+	/**
88
+	 * Query variable separator used when generating the query string. Default
89
+	 * is "&".
90
+	 */
91
+	const OPTION_SEPARATOR_OUTPUT = 'output_separator';
92
+
93
+	/**
94
+	 * Default options corresponds to how PHP handles $_GET.
95
+	 */
96
+	private $_options = array(
97
+		self::OPTION_STRICT           => true,
98
+		self::OPTION_USE_BRACKETS     => true,
99
+		self::OPTION_DROP_SEQUENCE    => true,
100
+		self::OPTION_ENCODE_KEYS      => true,
101
+		self::OPTION_SEPARATOR_INPUT  => '&',
102
+		self::OPTION_SEPARATOR_OUTPUT => '&',
103
+		);
104
+
105
+	/**
106
+	 * @var  string|bool
107
+	 */
108
+	private $_scheme = false;
109
+
110
+	/**
111
+	 * @var  string|bool
112
+	 */
113
+	private $_userinfo = false;
114
+
115
+	/**
116
+	 * @var  string|bool
117
+	 */
118
+	private $_host = false;
119
+
120
+	/**
121
+	 * @var  string|bool
122
+	 */
123
+	private $_port = false;
124
+
125
+	/**
126
+	 * @var  string
127
+	 */
128
+	private $_path = '';
129
+
130
+	/**
131
+	 * @var  string|bool
132
+	 */
133
+	private $_query = false;
134
+
135
+	/**
136
+	 * @var  string|bool
137
+	 */
138
+	private $_fragment = false;
139
+
140
+	/**
141
+	 * Constructor.
142
+	 *
143
+	 * @param string $url     an absolute or relative URL
144
+	 * @param array  $options an array of OPTION_xxx constants
145
+	 *
146
+	 * @uses   self::parseUrl()
147
+	 */
148
+	public function __construct($url, array $options = array())
149
+	{
150
+		foreach ($options as $optionName => $value) {
151
+			if (array_key_exists($optionName, $this->_options)) {
152
+				$this->_options[$optionName] = $value;
153
+			}
154
+		}
155
+
156
+		$this->parseUrl($url);
157
+	}
158
+
159
+	/**
160
+	 * Magic Setter.
161
+	 *
162
+	 * This method will magically set the value of a private variable ($var)
163
+	 * with the value passed as the args
164
+	 *
165
+	 * @param string $var The private variable to set.
166
+	 * @param mixed  $arg An argument of any type.
167
+	 *
168
+	 * @return void
169
+	 */
170
+	public function __set($var, $arg)
171
+	{
172
+		$method = 'set' . $var;
173
+		if (method_exists($this, $method)) {
174
+			$this->$method($arg);
175
+		}
176
+	}
177
+
178
+	/**
179
+	 * Magic Getter.
180
+	 *
181
+	 * This is the magic get method to retrieve the private variable
182
+	 * that was set by either __set() or it's setter...
183
+	 *
184
+	 * @param string $var The property name to retrieve.
185
+	 *
186
+	 * @return mixed  $this->$var Either a boolean false if the
187
+	 *                            property is not set or the value
188
+	 *                            of the private property.
189
+	 */
190
+	public function __get($var)
191
+	{
192
+		$method = 'get' . $var;
193
+		if (method_exists($this, $method)) {
194
+			return $this->$method();
195
+		}
196
+
197
+		return false;
198
+	}
199
+
200
+	/**
201
+	 * Returns the scheme, e.g. "http" or "urn", or false if there is no
202
+	 * scheme specified, i.e. if this is a relative URL.
203
+	 *
204
+	 * @return string|bool
205
+	 */
206
+	public function getScheme()
207
+	{
208
+		return $this->_scheme;
209
+	}
210
+
211
+	/**
212
+	 * Sets the scheme, e.g. "http" or "urn". Specify false if there is no
213
+	 * scheme specified, i.e. if this is a relative URL.
214
+	 *
215
+	 * @param string|bool $scheme e.g. "http" or "urn", or false if there is no
216
+	 *                            scheme specified, i.e. if this is a relative
217
+	 *                            URL
218
+	 *
219
+	 * @return $this
220
+	 * @see    getScheme
221
+	 */
222
+	public function setScheme($scheme)
223
+	{
224
+		$this->_scheme = $scheme;
225
+		return $this;
226
+	}
227
+
228
+	/**
229
+	 * Returns the user part of the userinfo part (the part preceding the first
230
+	 *  ":"), or false if there is no userinfo part.
231
+	 *
232
+	 * @return string|bool
233
+	 */
234
+	public function getUser()
235
+	{
236
+		return $this->_userinfo !== false
237
+			? preg_replace('(:.*$)', '', $this->_userinfo)
238
+			: false;
239
+	}
240
+
241
+	/**
242
+	 * Returns the password part of the userinfo part (the part after the first
243
+	 *  ":"), or false if there is no userinfo part (i.e. the URL does not
244
+	 * contain "@" in front of the hostname) or the userinfo part does not
245
+	 * contain ":".
246
+	 *
247
+	 * @return string|bool
248
+	 */
249
+	public function getPassword()
250
+	{
251
+		return $this->_userinfo !== false
252
+			? substr(strstr($this->_userinfo, ':'), 1)
253
+			: false;
254
+	}
255
+
256
+	/**
257
+	 * Returns the userinfo part, or false if there is none, i.e. if the
258
+	 * authority part does not contain "@".
259
+	 *
260
+	 * @return string|bool
261
+	 */
262
+	public function getUserinfo()
263
+	{
264
+		return $this->_userinfo;
265
+	}
266
+
267
+	/**
268
+	 * Sets the userinfo part. If two arguments are passed, they are combined
269
+	 * in the userinfo part as username ":" password.
270
+	 *
271
+	 * @param string|bool $userinfo userinfo or username
272
+	 * @param string|bool $password optional password, or false
273
+	 *
274
+	 * @return $this
275
+	 */
276
+	public function setUserinfo($userinfo, $password = false)
277
+	{
278
+		if ($password !== false) {
279
+			$userinfo .= ':' . $password;
280
+		}
281
+
282
+		if ($userinfo !== false) {
283
+			$userinfo = $this->_encodeData($userinfo);
284
+		}
285
+
286
+		$this->_userinfo = $userinfo;
287
+		return $this;
288
+	}
289
+
290
+	/**
291
+	 * Returns the host part, or false if there is no authority part, e.g.
292
+	 * relative URLs.
293
+	 *
294
+	 * @return string|bool a hostname, an IP address, or false
295
+	 */
296
+	public function getHost()
297
+	{
298
+		return $this->_host;
299
+	}
300
+
301
+	/**
302
+	 * Sets the host part. Specify false if there is no authority part, e.g.
303
+	 * relative URLs.
304
+	 *
305
+	 * @param string|bool $host a hostname, an IP address, or false
306
+	 *
307
+	 * @return $this
308
+	 */
309
+	public function setHost($host)
310
+	{
311
+		$this->_host = $host;
312
+		return $this;
313
+	}
314
+
315
+	/**
316
+	 * Returns the port number, or false if there is no port number specified,
317
+	 * i.e. if the default port is to be used.
318
+	 *
319
+	 * @return string|bool
320
+	 */
321
+	public function getPort()
322
+	{
323
+		return $this->_port;
324
+	}
325
+
326
+	/**
327
+	 * Sets the port number. Specify false if there is no port number specified,
328
+	 * i.e. if the default port is to be used.
329
+	 *
330
+	 * @param string|bool $port a port number, or false
331
+	 *
332
+	 * @return $this
333
+	 */
334
+	public function setPort($port)
335
+	{
336
+		$this->_port = $port;
337
+		return $this;
338
+	}
339
+
340
+	/**
341
+	 * Returns the authority part, i.e. [ userinfo "@" ] host [ ":" port ], or
342
+	 * false if there is no authority.
343
+	 *
344
+	 * @return string|bool
345
+	 */
346
+	public function getAuthority()
347
+	{
348
+		if (false === $this->_host) {
349
+			return false;
350
+		}
351
+
352
+		$authority = '';
353
+
354
+		if (strlen($this->_userinfo)) {
355
+			$authority .= $this->_userinfo . '@';
356
+		}
357
+
358
+		$authority .= $this->_host;
359
+
360
+		if ($this->_port !== false) {
361
+			$authority .= ':' . $this->_port;
362
+		}
363
+
364
+		return $authority;
365
+	}
366
+
367
+	/**
368
+	 * Sets the authority part, i.e. [ userinfo "@" ] host [ ":" port ]. Specify
369
+	 * false if there is no authority.
370
+	 *
371
+	 * @param string|bool $authority a hostname or an IP address, possibly
372
+	 *                                with userinfo prefixed and port number
373
+	 *                                appended, e.g. "foo:[email protected]:81".
374
+	 *
375
+	 * @return $this
376
+	 */
377
+	public function setAuthority($authority)
378
+	{
379
+		$this->_userinfo = false;
380
+		$this->_host     = false;
381
+		$this->_port     = false;
382
+
383
+		if ('' === $authority) {
384
+			$this->_host = $authority;
385
+			return $this;
386
+		}
387
+
388
+		if (!preg_match('(^(([^\@]*)\@)?(.+?)(:(\d*))?$)', $authority, $matches)) {
389
+			return $this;
390
+		}
391
+
392
+		if ($matches[1]) {
393
+			$this->_userinfo = $this->_encodeData($matches[2]);
394
+		}
395
+
396
+		$this->_host = $matches[3];
397
+
398
+		if (isset($matches[5]) && strlen($matches[5])) {
399
+			$this->_port = $matches[5];
400
+		}
401
+		return $this;
402
+	}
403
+
404
+	/**
405
+	 * Returns the path part (possibly an empty string).
406
+	 *
407
+	 * @return string
408
+	 */
409
+	public function getPath()
410
+	{
411
+		return $this->_path;
412
+	}
413
+
414
+	/**
415
+	 * Sets the path part (possibly an empty string).
416
+	 *
417
+	 * @param string $path a path
418
+	 *
419
+	 * @return $this
420
+	 */
421
+	public function setPath($path)
422
+	{
423
+		$this->_path = $path;
424
+		return $this;
425
+	}
426
+
427
+	/**
428
+	 * Returns the query string (excluding the leading "?"), or false if "?"
429
+	 * is not present in the URL.
430
+	 *
431
+	 * @return  string|bool
432
+	 * @see     getQueryVariables
433
+	 */
434
+	public function getQuery()
435
+	{
436
+		return $this->_query;
437
+	}
438
+
439
+	/**
440
+	 * Sets the query string (excluding the leading "?"). Specify false if "?"
441
+	 * is not present in the URL.
442
+	 *
443
+	 * @param string|bool $query a query string, e.g. "foo=1&bar=2"
444
+	 *
445
+	 * @return $this
446
+	 * @see    setQueryVariables
447
+	 */
448
+	public function setQuery($query)
449
+	{
450
+		$this->_query = $query;
451
+		return $this;
452
+	}
453
+
454
+	/**
455
+	 * Returns the fragment name, or false if "#" is not present in the URL.
456
+	 *
457
+	 * @return string|bool
458
+	 */
459
+	public function getFragment()
460
+	{
461
+		return $this->_fragment;
462
+	}
463
+
464
+	/**
465
+	 * Sets the fragment name. Specify false if "#" is not present in the URL.
466
+	 *
467
+	 * @param string|bool $fragment a fragment excluding the leading "#", or
468
+	 *                              false
469
+	 *
470
+	 * @return $this
471
+	 */
472
+	public function setFragment($fragment)
473
+	{
474
+		$this->_fragment = $fragment;
475
+		return $this;
476
+	}
477
+
478
+	/**
479
+	 * Returns the query string like an array as the variables would appear in
480
+	 * $_GET in a PHP script. If the URL does not contain a "?", an empty array
481
+	 * is returned.
482
+	 *
483
+	 * @return array
484
+	 */
485
+	public function getQueryVariables()
486
+	{
487
+		$separator   = $this->getOption(self::OPTION_SEPARATOR_INPUT);
488
+		$encodeKeys  = $this->getOption(self::OPTION_ENCODE_KEYS);
489
+		$useBrackets = $this->getOption(self::OPTION_USE_BRACKETS);
490
+
491
+		$return  = array();
492
+
493
+		for ($part = strtok($this->_query, $separator);
494
+			strlen($part);
495
+			$part = strtok($separator)
496
+		) {
497
+			list($key, $value) = explode('=', $part, 2) + array(1 => '');
498
+
499
+			if ($encodeKeys) {
500
+				$key = rawurldecode($key);
501
+			}
502
+			$value = rawurldecode($value);
503
+
504
+			if ($useBrackets) {
505
+				$return = $this->_queryArrayByKey($key, $value, $return);
506
+			} else {
507
+				if (isset($return[$key])) {
508
+					$return[$key]  = (array) $return[$key];
509
+					$return[$key][] = $value;
510
+				} else {
511
+					$return[$key] = $value;
512
+				}
513
+			}
514
+		}
515
+
516
+		return $return;
517
+	}
518
+
519
+	/**
520
+	 * Parse a single query key=value pair into an existing php array
521
+	 *
522
+	 * @param string $key   query-key
523
+	 * @param string $value query-value
524
+	 * @param array  $array of existing query variables (if any)
525
+	 *
526
+	 * @return mixed
527
+	 */
528
+	private function _queryArrayByKey($key, $value, array $array = array())
529
+	{
530
+		if (!strlen($key)) {
531
+			return $array;
532
+		}
533
+
534
+		$offset = $this->_queryKeyBracketOffset($key);
535
+		if ($offset === false) {
536
+			$name = $key;
537
+		} else {
538
+			$name = substr($key, 0, $offset);
539
+		}
540
+
541
+		if (!strlen($name)) {
542
+			return $array;
543
+		}
544
+
545
+		if (!$offset) {
546
+			// named value
547
+			$array[$name] = $value;
548
+		} else {
549
+			// array
550
+			$brackets = substr($key, $offset);
551
+			if (!isset($array[$name])) {
552
+				$array[$name] = null;
553
+			}
554
+			$array[$name] = $this->_queryArrayByBrackets(
555
+				$brackets, $value, $array[$name]
556
+			);
557
+		}
558
+
559
+		return $array;
560
+	}
561
+
562
+	/**
563
+	 * Parse a key-buffer to place value in array
564
+	 *
565
+	 * @param string $buffer to consume all keys from
566
+	 * @param string $value  to be set/add
567
+	 * @param array  $array  to traverse and set/add value in
568
+	 *
569
+	 * @throws Exception
570
+	 * @return array
571
+	 */
572
+	private function _queryArrayByBrackets($buffer, $value, array $array = null)
573
+	{
574
+		$entry = &$array;
575
+
576
+		for ($iteration = 0; strlen($buffer); $iteration++) {
577
+			$open = $this->_queryKeyBracketOffset($buffer);
578
+			if ($open !== 0) {
579
+				// Opening bracket [ must exist at offset 0, if not, there is
580
+				// no bracket to parse and the value dropped.
581
+				// if this happens in the first iteration, this is flawed, see
582
+				// as well the second exception below.
583
+				if ($iteration) {
584
+					break;
585
+				}
586
+				// @codeCoverageIgnoreStart
587
+				throw new Exception(
588
+					'Net_URL2 Internal Error: '. __METHOD__ .'(): ' .
589
+					'Opening bracket [ must exist at offset 0'
590
+				);
591
+				// @codeCoverageIgnoreEnd
592
+			}
593
+
594
+			$close = strpos($buffer, ']', 1);
595
+			if (!$close) {
596
+				// this error condition should never be reached as this is a
597
+				// private method and bracket pairs are checked beforehand.
598
+				// See as well the first exception for the opening bracket.
599
+				// @codeCoverageIgnoreStart
600
+				throw new Exception(
601
+					'Net_URL2 Internal Error: '. __METHOD__ .'(): ' .
602
+					'Closing bracket ] must exist, not found'
603
+				);
604
+				// @codeCoverageIgnoreEnd
605
+			}
606
+
607
+			$index = substr($buffer, 1, $close - 1);
608
+			if (strlen($index)) {
609
+				$entry = &$entry[$index];
610
+			} else {
611
+				if (!is_array($entry)) {
612
+					$entry = array();
613
+				}
614
+				$entry[] = &$new;
615
+				$entry = &$new;
616
+				unset($new);
617
+			}
618
+			$buffer = substr($buffer, $close + 1);
619
+		}
620
+
621
+		$entry = $value;
622
+
623
+		return $array;
624
+	}
625
+
626
+	/**
627
+	 * Query-key has brackets ("...[]")
628
+	 *
629
+	 * @param string $key query-key
630
+	 *
631
+	 * @return bool|int offset of opening bracket, false if no brackets
632
+	 */
633
+	private function _queryKeyBracketOffset($key)
634
+	{
635
+		if (false !== $open = strpos($key, '[')
636
+			and false === strpos($key, ']', $open + 1)
637
+		) {
638
+			$open = false;
639
+		}
640
+
641
+		return $open;
642
+	}
643
+
644
+	/**
645
+	 * Sets the query string to the specified variable in the query string.
646
+	 *
647
+	 * @param array $array (name => value) array
648
+	 *
649
+	 * @return $this
650
+	 */
651
+	public function setQueryVariables(array $array)
652
+	{
653
+		if (!$array) {
654
+			$this->_query = false;
655
+		} else {
656
+			$this->_query = $this->buildQuery(
657
+				$array,
658
+				$this->getOption(self::OPTION_SEPARATOR_OUTPUT)
659
+			);
660
+		}
661
+		return $this;
662
+	}
663
+
664
+	/**
665
+	 * Sets the specified variable in the query string.
666
+	 *
667
+	 * @param string $name  variable name
668
+	 * @param mixed  $value variable value
669
+	 *
670
+	 * @return $this
671
+	 */
672
+	public function setQueryVariable($name, $value)
673
+	{
674
+		$array = $this->getQueryVariables();
675
+		$array[$name] = $value;
676
+		$this->setQueryVariables($array);
677
+		return $this;
678
+	}
679
+
680
+	/**
681
+	 * Removes the specified variable from the query string.
682
+	 *
683
+	 * @param string $name a query string variable, e.g. "foo" in "?foo=1"
684
+	 *
685
+	 * @return void
686
+	 */
687
+	public function unsetQueryVariable($name)
688
+	{
689
+		$array = $this->getQueryVariables();
690
+		unset($array[$name]);
691
+		$this->setQueryVariables($array);
692
+	}
693
+
694
+	/**
695
+	 * Returns a string representation of this URL.
696
+	 *
697
+	 * @return string
698
+	 */
699
+	public function getURL()
700
+	{
701
+		// See RFC 3986, section 5.3
702
+		$url = '';
703
+
704
+		if ($this->_scheme !== false) {
705
+			$url .= $this->_scheme . ':';
706
+		}
707
+
708
+		$authority = $this->getAuthority();
709
+		if ($authority === false && strtolower($this->_scheme) === 'file') {
710
+			$authority = '';
711
+		}
712
+
713
+		$url .= $this->_buildAuthorityAndPath($authority, $this->_path);
714
+
715
+		if ($this->_query !== false) {
716
+			$url .= '?' . $this->_query;
717
+		}
718
+
719
+		if ($this->_fragment !== false) {
720
+			$url .= '#' . $this->_fragment;
721
+		}
722
+
723
+		return $url;
724
+	}
725
+
726
+	/**
727
+	 * Put authority and path together, wrapping authority
728
+	 * into proper separators/terminators.
729
+	 *
730
+	 * @param string|bool $authority authority
731
+	 * @param string      $path      path
732
+	 *
733
+	 * @return string
734
+	 */
735
+	private function _buildAuthorityAndPath($authority, $path)
736
+	{
737
+		if ($authority === false) {
738
+			return $path;
739
+		}
740
+
741
+		$terminator = ($path !== '' && $path[0] !== '/') ? '/' : '';
742
+
743
+		return '//' . $authority . $terminator . $path;
744
+	}
745
+
746
+	/**
747
+	 * Returns a string representation of this URL.
748
+	 *
749
+	 * @return string
750
+	 * @link https://php.net/language.oop5.magic#object.tostring
751
+	 */
752
+	public function __toString()
753
+	{
754
+		return $this->getURL();
755
+	}
756
+
757
+	/**
758
+	 * Returns a normalized string representation of this URL. This is useful
759
+	 * for comparison of URLs.
760
+	 *
761
+	 * @return string
762
+	 */
763
+	public function getNormalizedURL()
764
+	{
765
+		$url = clone $this;
766
+		$url->normalize();
767
+		return $url->getUrl();
768
+	}
769
+
770
+	/**
771
+	 * Normalizes the URL
772
+	 *
773
+	 * See RFC 3986, Section 6.  Normalization and Comparison
774
+	 *
775
+	 * @link https://tools.ietf.org/html/rfc3986#section-6
776
+	 *
777
+	 * @return void
778
+	 */
779
+	public function normalize()
780
+	{
781
+		// See RFC 3986, section 6
782
+
783
+		// Scheme is case-insensitive
784
+		if ($this->_scheme) {
785
+			$this->_scheme = strtolower($this->_scheme);
786
+		}
787
+
788
+		// Hostname is case-insensitive
789
+		if ($this->_host) {
790
+			$this->_host = strtolower($this->_host);
791
+		}
792
+
793
+		// Remove default port number for known schemes (RFC 3986, section 6.2.3)
794
+		if ('' === $this->_port
795
+			|| $this->_port
796
+			&& $this->_scheme
797
+			&& $this->_port == getservbyname($this->_scheme, 'tcp')
798
+		) {
799
+			$this->_port = false;
800
+		}
801
+
802
+		// Normalize case of %XX percentage-encodings (RFC 3986, section 6.2.2.1)
803
+		// Normalize percentage-encoded unreserved characters (section 6.2.2.2)
804
+		$fields = array(&$this->_userinfo, &$this->_host, &$this->_path,
805
+						&$this->_query, &$this->_fragment);
806
+		foreach ($fields as &$field) {
807
+			if ($field !== false) {
808
+				$field = $this->_normalize("$field");
809
+			}
810
+		}
811
+		unset($field);
812
+
813
+		// Path segment normalization (RFC 3986, section 6.2.2.3)
814
+		$this->_path = self::removeDotSegments($this->_path);
815
+
816
+		// Scheme based normalization (RFC 3986, section 6.2.3)
817
+		if (false !== $this->_host && '' === $this->_path) {
818
+			$this->_path = '/';
819
+		}
820
+
821
+		// path should start with '/' if there is authority (section 3.3.)
822
+		if (strlen($this->getAuthority())
823
+			&& strlen($this->_path)
824
+			&& $this->_path[0] !== '/'
825
+		) {
826
+			$this->_path = '/' . $this->_path;
827
+		}
828
+	}
829
+
830
+	/**
831
+	 * Normalize case of %XX percentage-encodings (RFC 3986, section 6.2.2.1)
832
+	 * Normalize percentage-encoded unreserved characters (section 6.2.2.2)
833
+	 *
834
+	 * @param string|array $mixed string or array of strings to normalize
835
+	 *
836
+	 * @return string|array
837
+	 * @see normalize
838
+	 * @see _normalizeCallback()
839
+	 */
840
+	private function _normalize($mixed)
841
+	{
842
+		return preg_replace_callback(
843
+			'((?:%[0-9a-fA-Z]{2})+)', array($this, '_normalizeCallback'),
844
+			$mixed
845
+		);
846
+	}
847
+
848
+	/**
849
+	 * Callback for _normalize() of %XX percentage-encodings
850
+	 *
851
+	 * @param array $matches as by preg_replace_callback
852
+	 *
853
+	 * @return string
854
+	 * @see normalize
855
+	 * @see _normalize
856
+	 * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
857
+	 */
858
+	private function _normalizeCallback($matches)
859
+	{
860
+		return self::urlencode(urldecode($matches[0]));
861
+	}
862
+
863
+	/**
864
+	 * Returns whether this instance represents an absolute URL.
865
+	 *
866
+	 * @return bool
867
+	 */
868
+	public function isAbsolute()
869
+	{
870
+		return (bool) $this->_scheme;
871
+	}
872
+
873
+	/**
874
+	 * Returns an Net_URL2 instance representing an absolute URL relative to
875
+	 * this URL.
876
+	 *
877
+	 * @param Net_URL2|string $reference relative URL
878
+	 *
879
+	 * @throws Exception
880
+	 * @return $this
881
+	 */
882
+	public function resolve($reference)
883
+	{
884
+		if (!$reference instanceof Net_URL2) {
885
+			$reference = new self($reference);
886
+		}
887
+		if (!$reference->_isFragmentOnly() && !$this->isAbsolute()) {
888
+			throw new Exception(
889
+				'Base-URL must be absolute if reference is not fragment-only'
890
+			);
891
+		}
892
+
893
+		// A non-strict parser may ignore a scheme in the reference if it is
894
+		// identical to the base URI's scheme.
895
+		if (!$this->getOption(self::OPTION_STRICT)
896
+			&& $reference->_scheme == $this->_scheme
897
+		) {
898
+			$reference->_scheme = false;
899
+		}
900
+
901
+		$target = new self('');
902
+		if ($reference->_scheme !== false) {
903
+			$target->_scheme = $reference->_scheme;
904
+			$target->setAuthority($reference->getAuthority());
905
+			$target->_path  = self::removeDotSegments($reference->_path);
906
+			$target->_query = $reference->_query;
907
+		} else {
908
+			$authority = $reference->getAuthority();
909
+			if ($authority !== false) {
910
+				$target->setAuthority($authority);
911
+				$target->_path  = self::removeDotSegments($reference->_path);
912
+				$target->_query = $reference->_query;
913
+			} else {
914
+				if ($reference->_path == '') {
915
+					$target->_path = $this->_path;
916
+					if ($reference->_query !== false) {
917
+						$target->_query = $reference->_query;
918
+					} else {
919
+						$target->_query = $this->_query;
920
+					}
921
+				} else {
922
+					if (substr($reference->_path, 0, 1) == '/') {
923
+						$target->_path = self::removeDotSegments($reference->_path);
924
+					} else {
925
+						// Merge paths (RFC 3986, section 5.2.3)
926
+						if ($this->_host !== false && $this->_path == '') {
927
+							$target->_path = '/' . $reference->_path;
928
+						} else {
929
+							$i = strrpos($this->_path, '/');
930
+							if ($i !== false) {
931
+								$target->_path = substr($this->_path, 0, $i + 1);
932
+							}
933
+							$target->_path .= $reference->_path;
934
+						}
935
+						$target->_path = self::removeDotSegments($target->_path);
936
+					}
937
+					$target->_query = $reference->_query;
938
+				}
939
+				$target->setAuthority($this->getAuthority());
940
+			}
941
+			$target->_scheme = $this->_scheme;
942
+		}
943
+
944
+		$target->_fragment = $reference->_fragment;
945
+
946
+		return $target;
947
+	}
948
+
949
+	/**
950
+	 * URL is fragment-only
951
+	 *
952
+	 * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
953
+	 * @return bool
954
+	 */
955
+	private function _isFragmentOnly()
956
+	{
957
+		return (
958
+			$this->_fragment !== false
959
+			&& $this->_query === false
960
+			&& $this->_path === ''
961
+			&& $this->_port === false
962
+			&& $this->_host === false
963
+			&& $this->_userinfo === false
964
+			&& $this->_scheme === false
965
+		);
966
+	}
967
+
968
+	/**
969
+	 * Removes dots as described in RFC 3986, section 5.2.4, e.g.
970
+	 * "/foo/../bar/baz" => "/bar/baz"
971
+	 *
972
+	 * @param string $path a path
973
+	 *
974
+	 * @return string a path
975
+	 */
976
+	public static function removeDotSegments($path)
977
+	{
978
+		$path = (string) $path;
979
+		$output = '';
980
+
981
+		// Make sure not to be trapped in an infinite loop due to a bug in this
982
+		// method
983
+		$loopLimit = 256;
984
+		$j = 0;
985
+		while ('' !== $path && $j++ < $loopLimit) {
986
+			if (substr($path, 0, 2) === './') {
987
+				// Step 2.A
988
+				$path = substr($path, 2);
989
+			} elseif (substr($path, 0, 3) === '../') {
990
+				// Step 2.A
991
+				$path = substr($path, 3);
992
+			} elseif (substr($path, 0, 3) === '/./' || $path === '/.') {
993
+				// Step 2.B
994
+				$path = '/' . substr($path, 3);
995
+			} elseif (substr($path, 0, 4) === '/../' || $path === '/..') {
996
+				// Step 2.C
997
+				$path   = '/' . substr($path, 4);
998
+				$i      = strrpos($output, '/');
999
+				$output = $i === false ? '' : substr($output, 0, $i);
1000
+			} elseif ($path === '.' || $path === '..') {
1001
+				// Step 2.D
1002
+				$path = '';
1003
+			} else {
1004
+				// Step 2.E
1005
+				$i = strpos($path, '/', $path[0] === '/');
1006
+				if ($i === false) {
1007
+					$output .= $path;
1008
+					$path = '';
1009
+					break;
1010
+				}
1011
+				$output .= substr($path, 0, $i);
1012
+				$path = substr($path, $i);
1013
+			}
1014
+		}
1015
+
1016
+		if ($path !== '') {
1017
+			$message = sprintf(
1018
+				'Unable to remove dot segments; hit loop limit %d (left: %s)',
1019
+				$j, var_export($path, true)
1020
+			);
1021
+			trigger_error($message, E_USER_WARNING);
1022
+		}
1023
+
1024
+		return $output;
1025
+	}
1026
+
1027
+	/**
1028
+	 * Percent-encodes all non-alphanumeric characters except these: _ . - ~
1029
+	 * Similar to PHP's rawurlencode(), except that it also encodes ~ in PHP
1030
+	 * 5.2.x and earlier.
1031
+	 *
1032
+	 * @param string $string string to encode
1033
+	 *
1034
+	 * @return string
1035
+	 */
1036
+	public static function urlencode($string)
1037
+	{
1038
+		$encoded = rawurlencode($string);
1039
+
1040
+		// This is only necessary in PHP < 5.3.
1041
+		$encoded = str_replace('%7E', '~', $encoded);
1042
+		return $encoded;
1043
+	}
1044
+
1045
+	/**
1046
+	 * Returns a Net_URL2 instance representing the canonical URL of the
1047
+	 * currently executing PHP script.
1048
+	 *
1049
+	 * @throws Exception
1050
+	 * @return string
1051
+	 */
1052
+	public static function getCanonical()
1053
+	{
1054
+		if (!isset($_SERVER['REQUEST_METHOD'])) {
1055
+			// ALERT - no current URL
1056
+			throw new Exception('Script was not called through a webserver');
1057
+		}
1058
+
1059
+		// Begin with a relative URL
1060
+		$url = new self($_SERVER['PHP_SELF']);
1061
+		$url->_scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http';
1062
+		$url->_host   = $_SERVER['SERVER_NAME'];
1063
+		$port = $_SERVER['SERVER_PORT'];
1064
+		if ($url->_scheme == 'http' && $port != 80
1065
+			|| $url->_scheme == 'https' && $port != 443
1066
+		) {
1067
+			$url->_port = $port;
1068
+		}
1069
+		return $url;
1070
+	}
1071
+
1072
+	/**
1073
+	 * Returns the URL used to retrieve the current request.
1074
+	 *
1075
+	 * @return  string
1076
+	 */
1077
+	public static function getRequestedURL()
1078
+	{
1079
+		return self::getRequested()->getUrl();
1080
+	}
1081
+
1082
+	/**
1083
+	 * Returns a Net_URL2 instance representing the URL used to retrieve the
1084
+	 * current request.
1085
+	 *
1086
+	 * @throws Exception
1087
+	 * @return $this
1088
+	 */
1089
+	public static function getRequested()
1090
+	{
1091
+		if (!isset($_SERVER['REQUEST_METHOD'])) {
1092
+			// ALERT - no current URL
1093
+			throw new Exception('Script was not called through a webserver');
1094
+		}
1095
+
1096
+		// Begin with a relative URL
1097
+		$url = new self($_SERVER['REQUEST_URI']);
1098
+		$url->_scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http';
1099
+		// Set host and possibly port
1100
+		$url->setAuthority($_SERVER['HTTP_HOST']);
1101
+		return $url;
1102
+	}
1103
+
1104
+	/**
1105
+	 * Returns the value of the specified option.
1106
+	 *
1107
+	 * @param string $optionName The name of the option to retrieve
1108
+	 *
1109
+	 * @return mixed
1110
+	 */
1111
+	public function getOption($optionName)
1112
+	{
1113
+		return isset($this->_options[$optionName])
1114
+			? $this->_options[$optionName] : false;
1115
+	}
1116
+
1117
+	/**
1118
+	 * A simple version of http_build_query in userland. The encoded string is
1119
+	 * percentage encoded according to RFC 3986.
1120
+	 *
1121
+	 * @param array  $data      An array, which has to be converted into
1122
+	 *                          QUERY_STRING. Anything is possible.
1123
+	 * @param string $separator Separator {@link self::OPTION_SEPARATOR_OUTPUT}
1124
+	 * @param string $key       For stacked values (arrays in an array).
1125
+	 *
1126
+	 * @return string
1127
+	 */
1128
+	protected function buildQuery(array $data, $separator, $key = null)
1129
+	{
1130
+		$query = array();
1131
+		$drop_names = (
1132
+			$this->_options[self::OPTION_DROP_SEQUENCE] === true
1133
+			&& array_keys($data) === array_keys(array_values($data))
1134
+		);
1135
+		foreach ($data as $name => $value) {
1136
+			if ($this->getOption(self::OPTION_ENCODE_KEYS) === true) {
1137
+				$name = rawurlencode($name);
1138
+			}
1139
+			if ($key !== null) {
1140
+				if ($this->getOption(self::OPTION_USE_BRACKETS) === true) {
1141
+					$drop_names && $name = '';
1142
+					$name = $key . '[' . $name . ']';
1143
+				} else {
1144
+					$name = $key;
1145
+				}
1146
+			}
1147
+			if (is_array($value)) {
1148
+				$query[] = $this->buildQuery($value, $separator, $name);
1149
+			} else {
1150
+				$query[] = $name . '=' . rawurlencode($value);
1151
+			}
1152
+		}
1153
+		return implode($separator, $query);
1154
+	}
1155
+
1156
+	/**
1157
+	 * This method uses a regex to parse the url into the designated parts.
1158
+	 *
1159
+	 * @param string $url URL
1160
+	 *
1161
+	 * @return void
1162
+	 * @uses   self::$_scheme, self::setAuthority(), self::$_path, self::$_query,
1163
+	 *         self::$_fragment
1164
+	 * @see    __construct
1165
+	 */
1166
+	protected function parseUrl($url)
1167
+	{
1168
+		// The regular expression is copied verbatim from RFC 3986, appendix B.
1169
+		// The expression does not validate the URL but matches any string.
1170
+		preg_match(
1171
+			'(^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?)',
1172
+			$url, $matches
1173
+		);
1174
+
1175
+		// "path" is always present (possibly as an empty string); the rest
1176
+		// are optional.
1177
+		$this->_scheme   = !empty($matches[1]) ? $matches[2] : false;
1178
+		$this->setAuthority(!empty($matches[3]) ? $matches[4] : false);
1179
+		$this->_path     = $this->_encodeData($matches[5]);
1180
+		$this->_query    = !empty($matches[6])
1181
+						   ? $this->_encodeData($matches[7])
1182
+						   : false
1183
+			;
1184
+		$this->_fragment = !empty($matches[8]) ? $matches[9] : false;
1185
+	}
1186
+
1187
+	/**
1188
+	 * Encode characters that might have been forgotten to encode when passing
1189
+	 * in an URL. Applied onto Userinfo, Path and Query.
1190
+	 *
1191
+	 * @param string $url URL
1192
+	 *
1193
+	 * @return string
1194
+	 * @see parseUrl
1195
+	 * @see setAuthority
1196
+	 * @link https://pear.php.net/bugs/bug.php?id=20425
1197
+	 */
1198
+	private function _encodeData($url)
1199
+	{
1200
+		return preg_replace_callback(
1201
+			'([\x-\x20\x22\x3C\x3E\x7F-\xFF]+)',
1202
+			array($this, '_encodeCallback'), $url
1203
+		);
1204
+	}
1205
+
1206
+	/**
1207
+	 * callback for encoding character data
1208
+	 *
1209
+	 * @param array $matches Matches
1210
+	 *
1211
+	 * @return string
1212
+	 * @see _encodeData
1213
+	 * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
1214
+	 */
1215
+	private function _encodeCallback(array $matches)
1216
+	{
1217
+		return rawurlencode($matches[0]);
1218
+	}
1219 1219
 }
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -488,7 +488,7 @@  discard block
 block discarded – undo
488 488
         $encodeKeys  = $this->getOption(self::OPTION_ENCODE_KEYS);
489 489
         $useBrackets = $this->getOption(self::OPTION_USE_BRACKETS);
490 490
 
491
-        $return  = array();
491
+        $return = array();
492 492
 
493 493
         for ($part = strtok($this->_query, $separator);
494 494
             strlen($part);
@@ -505,7 +505,7 @@  discard block
 block discarded – undo
505 505
                 $return = $this->_queryArrayByKey($key, $value, $return);
506 506
             } else {
507 507
                 if (isset($return[$key])) {
508
-                    $return[$key]  = (array) $return[$key];
508
+                    $return[$key] = (array) $return[$key];
509 509
                     $return[$key][] = $value;
510 510
                 } else {
511 511
                     $return[$key] = $value;
@@ -585,7 +585,7 @@  discard block
 block discarded – undo
585 585
                 }
586 586
                 // @codeCoverageIgnoreStart
587 587
                 throw new Exception(
588
-                    'Net_URL2 Internal Error: '. __METHOD__ .'(): ' .
588
+                    'Net_URL2 Internal Error: ' . __METHOD__ . '(): ' .
589 589
                     'Opening bracket [ must exist at offset 0'
590 590
                 );
591 591
                 // @codeCoverageIgnoreEnd
@@ -598,7 +598,7 @@  discard block
 block discarded – undo
598 598
                 // See as well the first exception for the opening bracket.
599 599
                 // @codeCoverageIgnoreStart
600 600
                 throw new Exception(
601
-                    'Net_URL2 Internal Error: '. __METHOD__ .'(): ' .
601
+                    'Net_URL2 Internal Error: ' . __METHOD__ . '(): ' .
602 602
                     'Closing bracket ] must exist, not found'
603 603
                 );
604 604
                 // @codeCoverageIgnoreEnd
Please login to merge, or discard this patch.
libs/PEAR.1.9.5/PEAR/Exception.php 4 patches
Doc Comments   +2 added lines patch added patch discarded remove patch
@@ -117,6 +117,8 @@
 block discarded – undo
117 117
      * @param string exception message
118 118
      * @param int|Exception|PEAR_Error|array|null exception cause
119 119
      * @param int|null exception code or null
120
+     * @param string|null $message
121
+     * @param integer $p2
120 122
      */
121 123
     public function __construct($message, $p2 = null, $p3 = null)
122 124
     {
Please login to merge, or discard this patch.
Indentation   +275 added lines, -275 removed lines patch added patch discarded remove patch
@@ -96,294 +96,294 @@
 block discarded – undo
96 96
  */
97 97
 class PEAR_Exception extends Exception
98 98
 {
99
-    const OBSERVER_PRINT = -2;
100
-    const OBSERVER_TRIGGER = -4;
101
-    const OBSERVER_DIE = -8;
102
-    protected $cause;
103
-    private static $_observers = array();
104
-    private static $_uniqueid = 0;
105
-    private $_trace;
99
+	const OBSERVER_PRINT = -2;
100
+	const OBSERVER_TRIGGER = -4;
101
+	const OBSERVER_DIE = -8;
102
+	protected $cause;
103
+	private static $_observers = array();
104
+	private static $_uniqueid = 0;
105
+	private $_trace;
106 106
 
107
-    /**
108
-     * Supported signatures:
109
-     *  - PEAR_Exception(string $message);
110
-     *  - PEAR_Exception(string $message, int $code);
111
-     *  - PEAR_Exception(string $message, Exception $cause);
112
-     *  - PEAR_Exception(string $message, Exception $cause, int $code);
113
-     *  - PEAR_Exception(string $message, PEAR_Error $cause);
114
-     *  - PEAR_Exception(string $message, PEAR_Error $cause, int $code);
115
-     *  - PEAR_Exception(string $message, array $causes);
116
-     *  - PEAR_Exception(string $message, array $causes, int $code);
117
-     * @param string exception message
118
-     * @param int|Exception|PEAR_Error|array|null exception cause
119
-     * @param int|null exception code or null
120
-     */
121
-    public function __construct($message, $p2 = null, $p3 = null)
122
-    {
123
-        if (is_int($p2)) {
124
-            $code = $p2;
125
-            $this->cause = null;
126
-        } elseif (is_object($p2) || is_array($p2)) {
127
-            // using is_object allows both Exception and PEAR_Error
128
-            if (is_object($p2) && !($p2 instanceof Exception)) {
129
-                if (!class_exists('PEAR_Error') || !($p2 instanceof PEAR_Error)) {
130
-                    throw new PEAR_Exception('exception cause must be Exception, ' .
131
-                        'array, or PEAR_Error');
132
-                }
133
-            }
134
-            $code = $p3;
135
-            if (is_array($p2) && isset($p2['message'])) {
136
-                // fix potential problem of passing in a single warning
137
-                $p2 = array($p2);
138
-            }
139
-            $this->cause = $p2;
140
-        } else {
141
-            $code = null;
142
-            $this->cause = null;
143
-        }
144
-        parent::__construct($message, $code);
145
-        $this->signal();
146
-    }
107
+	/**
108
+	 * Supported signatures:
109
+	 *  - PEAR_Exception(string $message);
110
+	 *  - PEAR_Exception(string $message, int $code);
111
+	 *  - PEAR_Exception(string $message, Exception $cause);
112
+	 *  - PEAR_Exception(string $message, Exception $cause, int $code);
113
+	 *  - PEAR_Exception(string $message, PEAR_Error $cause);
114
+	 *  - PEAR_Exception(string $message, PEAR_Error $cause, int $code);
115
+	 *  - PEAR_Exception(string $message, array $causes);
116
+	 *  - PEAR_Exception(string $message, array $causes, int $code);
117
+	 * @param string exception message
118
+	 * @param int|Exception|PEAR_Error|array|null exception cause
119
+	 * @param int|null exception code or null
120
+	 */
121
+	public function __construct($message, $p2 = null, $p3 = null)
122
+	{
123
+		if (is_int($p2)) {
124
+			$code = $p2;
125
+			$this->cause = null;
126
+		} elseif (is_object($p2) || is_array($p2)) {
127
+			// using is_object allows both Exception and PEAR_Error
128
+			if (is_object($p2) && !($p2 instanceof Exception)) {
129
+				if (!class_exists('PEAR_Error') || !($p2 instanceof PEAR_Error)) {
130
+					throw new PEAR_Exception('exception cause must be Exception, ' .
131
+						'array, or PEAR_Error');
132
+				}
133
+			}
134
+			$code = $p3;
135
+			if (is_array($p2) && isset($p2['message'])) {
136
+				// fix potential problem of passing in a single warning
137
+				$p2 = array($p2);
138
+			}
139
+			$this->cause = $p2;
140
+		} else {
141
+			$code = null;
142
+			$this->cause = null;
143
+		}
144
+		parent::__construct($message, $code);
145
+		$this->signal();
146
+	}
147 147
 
148
-    /**
149
-     * @param mixed $callback  - A valid php callback, see php func is_callable()
150
-     *                         - A PEAR_Exception::OBSERVER_* constant
151
-     *                         - An array(const PEAR_Exception::OBSERVER_*,
152
-     *                           mixed $options)
153
-     * @param string $label    The name of the observer. Use this if you want
154
-     *                         to remove it later with removeObserver()
155
-     */
156
-    public static function addObserver($callback, $label = 'default')
157
-    {
158
-        self::$_observers[$label] = $callback;
159
-    }
148
+	/**
149
+	 * @param mixed $callback  - A valid php callback, see php func is_callable()
150
+	 *                         - A PEAR_Exception::OBSERVER_* constant
151
+	 *                         - An array(const PEAR_Exception::OBSERVER_*,
152
+	 *                           mixed $options)
153
+	 * @param string $label    The name of the observer. Use this if you want
154
+	 *                         to remove it later with removeObserver()
155
+	 */
156
+	public static function addObserver($callback, $label = 'default')
157
+	{
158
+		self::$_observers[$label] = $callback;
159
+	}
160 160
 
161
-    public static function removeObserver($label = 'default')
162
-    {
163
-        unset(self::$_observers[$label]);
164
-    }
161
+	public static function removeObserver($label = 'default')
162
+	{
163
+		unset(self::$_observers[$label]);
164
+	}
165 165
 
166
-    /**
167
-     * @return int unique identifier for an observer
168
-     */
169
-    public static function getUniqueId()
170
-    {
171
-        return self::$_uniqueid++;
172
-    }
166
+	/**
167
+	 * @return int unique identifier for an observer
168
+	 */
169
+	public static function getUniqueId()
170
+	{
171
+		return self::$_uniqueid++;
172
+	}
173 173
 
174
-    private function signal()
175
-    {
176
-        foreach (self::$_observers as $func) {
177
-            if (is_callable($func)) {
178
-                call_user_func($func, $this);
179
-                continue;
180
-            }
181
-            settype($func, 'array');
182
-            switch ($func[0]) {
183
-                case self::OBSERVER_PRINT :
184
-                    $f = (isset($func[1])) ? $func[1] : '%s';
185
-                    printf($f, $this->getMessage());
186
-                    break;
187
-                case self::OBSERVER_TRIGGER :
188
-                    $f = (isset($func[1])) ? $func[1] : E_USER_NOTICE;
189
-                    trigger_error($this->getMessage(), $f);
190
-                    break;
191
-                case self::OBSERVER_DIE :
192
-                    $f = (isset($func[1])) ? $func[1] : '%s';
193
-                    die(printf($f, $this->getMessage()));
194
-                    break;
195
-                default:
196
-                    trigger_error('invalid observer type', E_USER_WARNING);
197
-            }
198
-        }
199
-    }
174
+	private function signal()
175
+	{
176
+		foreach (self::$_observers as $func) {
177
+			if (is_callable($func)) {
178
+				call_user_func($func, $this);
179
+				continue;
180
+			}
181
+			settype($func, 'array');
182
+			switch ($func[0]) {
183
+				case self::OBSERVER_PRINT :
184
+					$f = (isset($func[1])) ? $func[1] : '%s';
185
+					printf($f, $this->getMessage());
186
+					break;
187
+				case self::OBSERVER_TRIGGER :
188
+					$f = (isset($func[1])) ? $func[1] : E_USER_NOTICE;
189
+					trigger_error($this->getMessage(), $f);
190
+					break;
191
+				case self::OBSERVER_DIE :
192
+					$f = (isset($func[1])) ? $func[1] : '%s';
193
+					die(printf($f, $this->getMessage()));
194
+					break;
195
+				default:
196
+					trigger_error('invalid observer type', E_USER_WARNING);
197
+			}
198
+		}
199
+	}
200 200
 
201
-    /**
202
-     * Return specific error information that can be used for more detailed
203
-     * error messages or translation.
204
-     *
205
-     * This method may be overridden in child exception classes in order
206
-     * to add functionality not present in PEAR_Exception and is a placeholder
207
-     * to define API
208
-     *
209
-     * The returned array must be an associative array of parameter => value like so:
210
-     * <pre>
211
-     * array('name' => $name, 'context' => array(...))
212
-     * </pre>
213
-     * @return array
214
-     */
215
-    public function getErrorData()
216
-    {
217
-        return array();
218
-    }
201
+	/**
202
+	 * Return specific error information that can be used for more detailed
203
+	 * error messages or translation.
204
+	 *
205
+	 * This method may be overridden in child exception classes in order
206
+	 * to add functionality not present in PEAR_Exception and is a placeholder
207
+	 * to define API
208
+	 *
209
+	 * The returned array must be an associative array of parameter => value like so:
210
+	 * <pre>
211
+	 * array('name' => $name, 'context' => array(...))
212
+	 * </pre>
213
+	 * @return array
214
+	 */
215
+	public function getErrorData()
216
+	{
217
+		return array();
218
+	}
219 219
 
220
-    /**
221
-     * Returns the exception that caused this exception to be thrown
222
-     * @access public
223
-     * @return Exception|array The context of the exception
224
-     */
225
-    public function getCause()
226
-    {
227
-        return $this->cause;
228
-    }
220
+	/**
221
+	 * Returns the exception that caused this exception to be thrown
222
+	 * @access public
223
+	 * @return Exception|array The context of the exception
224
+	 */
225
+	public function getCause()
226
+	{
227
+		return $this->cause;
228
+	}
229 229
 
230
-    /**
231
-     * Function must be public to call on caused exceptions
232
-     * @param array
233
-     */
234
-    public function getCauseMessage(&$causes)
235
-    {
236
-        $trace = $this->getTraceSafe();
237
-        $cause = array('class'   => get_class($this),
238
-                       'message' => $this->message,
239
-                       'file' => 'unknown',
240
-                       'line' => 'unknown');
241
-        if (isset($trace[0])) {
242
-            if (isset($trace[0]['file'])) {
243
-                $cause['file'] = $trace[0]['file'];
244
-                $cause['line'] = $trace[0]['line'];
245
-            }
246
-        }
247
-        $causes[] = $cause;
248
-        if ($this->cause instanceof PEAR_Exception) {
249
-            $this->cause->getCauseMessage($causes);
250
-        } elseif ($this->cause instanceof Exception) {
251
-            $causes[] = array('class'   => get_class($this->cause),
252
-                              'message' => $this->cause->getMessage(),
253
-                              'file' => $this->cause->getFile(),
254
-                              'line' => $this->cause->getLine());
255
-        } elseif (class_exists('PEAR_Error') && $this->cause instanceof PEAR_Error) {
256
-            $causes[] = array('class' => get_class($this->cause),
257
-                              'message' => $this->cause->getMessage(),
258
-                              'file' => 'unknown',
259
-                              'line' => 'unknown');
260
-        } elseif (is_array($this->cause)) {
261
-            foreach ($this->cause as $cause) {
262
-                if ($cause instanceof PEAR_Exception) {
263
-                    $cause->getCauseMessage($causes);
264
-                } elseif ($cause instanceof Exception) {
265
-                    $causes[] = array('class'   => get_class($cause),
266
-                                   'message' => $cause->getMessage(),
267
-                                   'file' => $cause->getFile(),
268
-                                   'line' => $cause->getLine());
269
-                } elseif (class_exists('PEAR_Error') && $cause instanceof PEAR_Error) {
270
-                    $causes[] = array('class' => get_class($cause),
271
-                                      'message' => $cause->getMessage(),
272
-                                      'file' => 'unknown',
273
-                                      'line' => 'unknown');
274
-                } elseif (is_array($cause) && isset($cause['message'])) {
275
-                    // PEAR_ErrorStack warning
276
-                    $causes[] = array(
277
-                        'class' => $cause['package'],
278
-                        'message' => $cause['message'],
279
-                        'file' => isset($cause['context']['file']) ?
280
-                                            $cause['context']['file'] :
281
-                                            'unknown',
282
-                        'line' => isset($cause['context']['line']) ?
283
-                                            $cause['context']['line'] :
284
-                                            'unknown',
285
-                    );
286
-                }
287
-            }
288
-        }
289
-    }
230
+	/**
231
+	 * Function must be public to call on caused exceptions
232
+	 * @param array
233
+	 */
234
+	public function getCauseMessage(&$causes)
235
+	{
236
+		$trace = $this->getTraceSafe();
237
+		$cause = array('class'   => get_class($this),
238
+					   'message' => $this->message,
239
+					   'file' => 'unknown',
240
+					   'line' => 'unknown');
241
+		if (isset($trace[0])) {
242
+			if (isset($trace[0]['file'])) {
243
+				$cause['file'] = $trace[0]['file'];
244
+				$cause['line'] = $trace[0]['line'];
245
+			}
246
+		}
247
+		$causes[] = $cause;
248
+		if ($this->cause instanceof PEAR_Exception) {
249
+			$this->cause->getCauseMessage($causes);
250
+		} elseif ($this->cause instanceof Exception) {
251
+			$causes[] = array('class'   => get_class($this->cause),
252
+							  'message' => $this->cause->getMessage(),
253
+							  'file' => $this->cause->getFile(),
254
+							  'line' => $this->cause->getLine());
255
+		} elseif (class_exists('PEAR_Error') && $this->cause instanceof PEAR_Error) {
256
+			$causes[] = array('class' => get_class($this->cause),
257
+							  'message' => $this->cause->getMessage(),
258
+							  'file' => 'unknown',
259
+							  'line' => 'unknown');
260
+		} elseif (is_array($this->cause)) {
261
+			foreach ($this->cause as $cause) {
262
+				if ($cause instanceof PEAR_Exception) {
263
+					$cause->getCauseMessage($causes);
264
+				} elseif ($cause instanceof Exception) {
265
+					$causes[] = array('class'   => get_class($cause),
266
+								   'message' => $cause->getMessage(),
267
+								   'file' => $cause->getFile(),
268
+								   'line' => $cause->getLine());
269
+				} elseif (class_exists('PEAR_Error') && $cause instanceof PEAR_Error) {
270
+					$causes[] = array('class' => get_class($cause),
271
+									  'message' => $cause->getMessage(),
272
+									  'file' => 'unknown',
273
+									  'line' => 'unknown');
274
+				} elseif (is_array($cause) && isset($cause['message'])) {
275
+					// PEAR_ErrorStack warning
276
+					$causes[] = array(
277
+						'class' => $cause['package'],
278
+						'message' => $cause['message'],
279
+						'file' => isset($cause['context']['file']) ?
280
+											$cause['context']['file'] :
281
+											'unknown',
282
+						'line' => isset($cause['context']['line']) ?
283
+											$cause['context']['line'] :
284
+											'unknown',
285
+					);
286
+				}
287
+			}
288
+		}
289
+	}
290 290
 
291
-    public function getTraceSafe()
292
-    {
293
-        if (!isset($this->_trace)) {
294
-            $this->_trace = $this->getTrace();
295
-            if (empty($this->_trace)) {
296
-                $backtrace = debug_backtrace();
297
-                $this->_trace = array($backtrace[count($backtrace)-1]);
298
-            }
299
-        }
300
-        return $this->_trace;
301
-    }
291
+	public function getTraceSafe()
292
+	{
293
+		if (!isset($this->_trace)) {
294
+			$this->_trace = $this->getTrace();
295
+			if (empty($this->_trace)) {
296
+				$backtrace = debug_backtrace();
297
+				$this->_trace = array($backtrace[count($backtrace)-1]);
298
+			}
299
+		}
300
+		return $this->_trace;
301
+	}
302 302
 
303
-    public function getErrorClass()
304
-    {
305
-        $trace = $this->getTraceSafe();
306
-        return $trace[0]['class'];
307
-    }
303
+	public function getErrorClass()
304
+	{
305
+		$trace = $this->getTraceSafe();
306
+		return $trace[0]['class'];
307
+	}
308 308
 
309
-    public function getErrorMethod()
310
-    {
311
-        $trace = $this->getTraceSafe();
312
-        return $trace[0]['function'];
313
-    }
309
+	public function getErrorMethod()
310
+	{
311
+		$trace = $this->getTraceSafe();
312
+		return $trace[0]['function'];
313
+	}
314 314
 
315
-    public function __toString()
316
-    {
317
-        if (isset($_SERVER['REQUEST_URI'])) {
318
-            return $this->toHtml();
319
-        }
320
-        return $this->toText();
321
-    }
315
+	public function __toString()
316
+	{
317
+		if (isset($_SERVER['REQUEST_URI'])) {
318
+			return $this->toHtml();
319
+		}
320
+		return $this->toText();
321
+	}
322 322
 
323
-    public function toHtml()
324
-    {
325
-        $trace = $this->getTraceSafe();
326
-        $causes = array();
327
-        $this->getCauseMessage($causes);
328
-        $html =  '<table style="border: 1px" cellspacing="0">' . "\n";
329
-        foreach ($causes as $i => $cause) {
330
-            $html .= '<tr><td colspan="3" style="background: #ff9999">'
331
-               . str_repeat('-', $i) . ' <b>' . $cause['class'] . '</b>: '
332
-               . htmlspecialchars($cause['message']) . ' in <b>' . $cause['file'] . '</b> '
333
-               . 'on line <b>' . $cause['line'] . '</b>'
334
-               . "</td></tr>\n";
335
-        }
336
-        $html .= '<tr><td colspan="3" style="background-color: #aaaaaa; text-align: center; font-weight: bold;">Exception trace</td></tr>' . "\n"
337
-               . '<tr><td style="text-align: center; background: #cccccc; width:20px; font-weight: bold;">#</td>'
338
-               . '<td style="text-align: center; background: #cccccc; font-weight: bold;">Function</td>'
339
-               . '<td style="text-align: center; background: #cccccc; font-weight: bold;">Location</td></tr>' . "\n";
323
+	public function toHtml()
324
+	{
325
+		$trace = $this->getTraceSafe();
326
+		$causes = array();
327
+		$this->getCauseMessage($causes);
328
+		$html =  '<table style="border: 1px" cellspacing="0">' . "\n";
329
+		foreach ($causes as $i => $cause) {
330
+			$html .= '<tr><td colspan="3" style="background: #ff9999">'
331
+			   . str_repeat('-', $i) . ' <b>' . $cause['class'] . '</b>: '
332
+			   . htmlspecialchars($cause['message']) . ' in <b>' . $cause['file'] . '</b> '
333
+			   . 'on line <b>' . $cause['line'] . '</b>'
334
+			   . "</td></tr>\n";
335
+		}
336
+		$html .= '<tr><td colspan="3" style="background-color: #aaaaaa; text-align: center; font-weight: bold;">Exception trace</td></tr>' . "\n"
337
+			   . '<tr><td style="text-align: center; background: #cccccc; width:20px; font-weight: bold;">#</td>'
338
+			   . '<td style="text-align: center; background: #cccccc; font-weight: bold;">Function</td>'
339
+			   . '<td style="text-align: center; background: #cccccc; font-weight: bold;">Location</td></tr>' . "\n";
340 340
 
341
-        foreach ($trace as $k => $v) {
342
-            $html .= '<tr><td style="text-align: center;">' . $k . '</td>'
343
-                   . '<td>';
344
-            if (!empty($v['class'])) {
345
-                $html .= $v['class'] . $v['type'];
346
-            }
347
-            $html .= $v['function'];
348
-            $args = array();
349
-            if (!empty($v['args'])) {
350
-                foreach ($v['args'] as $arg) {
351
-                    if (is_null($arg)) $args[] = 'null';
352
-                    elseif (is_array($arg)) $args[] = 'Array';
353
-                    elseif (is_object($arg)) $args[] = 'Object('.get_class($arg).')';
354
-                    elseif (is_bool($arg)) $args[] = $arg ? 'true' : 'false';
355
-                    elseif (is_int($arg) || is_double($arg)) $args[] = $arg;
356
-                    else {
357
-                        $arg = (string)$arg;
358
-                        $str = htmlspecialchars(substr($arg, 0, 16));
359
-                        if (strlen($arg) > 16) $str .= '&hellip;';
360
-                        $args[] = "'" . $str . "'";
361
-                    }
362
-                }
363
-            }
364
-            $html .= '(' . implode(', ',$args) . ')'
365
-                   . '</td>'
366
-                   . '<td>' . (isset($v['file']) ? $v['file'] : 'unknown')
367
-                   . ':' . (isset($v['line']) ? $v['line'] : 'unknown')
368
-                   . '</td></tr>' . "\n";
369
-        }
370
-        $html .= '<tr><td style="text-align: center;">' . ($k+1) . '</td>'
371
-               . '<td>{main}</td>'
372
-               . '<td>&nbsp;</td></tr>' . "\n"
373
-               . '</table>';
374
-        return $html;
375
-    }
341
+		foreach ($trace as $k => $v) {
342
+			$html .= '<tr><td style="text-align: center;">' . $k . '</td>'
343
+				   . '<td>';
344
+			if (!empty($v['class'])) {
345
+				$html .= $v['class'] . $v['type'];
346
+			}
347
+			$html .= $v['function'];
348
+			$args = array();
349
+			if (!empty($v['args'])) {
350
+				foreach ($v['args'] as $arg) {
351
+					if (is_null($arg)) $args[] = 'null';
352
+					elseif (is_array($arg)) $args[] = 'Array';
353
+					elseif (is_object($arg)) $args[] = 'Object('.get_class($arg).')';
354
+					elseif (is_bool($arg)) $args[] = $arg ? 'true' : 'false';
355
+					elseif (is_int($arg) || is_double($arg)) $args[] = $arg;
356
+					else {
357
+						$arg = (string)$arg;
358
+						$str = htmlspecialchars(substr($arg, 0, 16));
359
+						if (strlen($arg) > 16) $str .= '&hellip;';
360
+						$args[] = "'" . $str . "'";
361
+					}
362
+				}
363
+			}
364
+			$html .= '(' . implode(', ',$args) . ')'
365
+				   . '</td>'
366
+				   . '<td>' . (isset($v['file']) ? $v['file'] : 'unknown')
367
+				   . ':' . (isset($v['line']) ? $v['line'] : 'unknown')
368
+				   . '</td></tr>' . "\n";
369
+		}
370
+		$html .= '<tr><td style="text-align: center;">' . ($k+1) . '</td>'
371
+			   . '<td>{main}</td>'
372
+			   . '<td>&nbsp;</td></tr>' . "\n"
373
+			   . '</table>';
374
+		return $html;
375
+	}
376 376
 
377
-    public function toText()
378
-    {
379
-        $causes = array();
380
-        $this->getCauseMessage($causes);
381
-        $causeMsg = '';
382
-        foreach ($causes as $i => $cause) {
383
-            $causeMsg .= str_repeat(' ', $i) . $cause['class'] . ': '
384
-                   . $cause['message'] . ' in ' . $cause['file']
385
-                   . ' on line ' . $cause['line'] . "\n";
386
-        }
387
-        return $causeMsg . $this->getTraceAsString();
388
-    }
377
+	public function toText()
378
+	{
379
+		$causes = array();
380
+		$this->getCauseMessage($causes);
381
+		$causeMsg = '';
382
+		foreach ($causes as $i => $cause) {
383
+			$causeMsg .= str_repeat(' ', $i) . $cause['class'] . ': '
384
+				   . $cause['message'] . ' in ' . $cause['file']
385
+				   . ' on line ' . $cause['line'] . "\n";
386
+		}
387
+		return $causeMsg . $this->getTraceAsString();
388
+	}
389 389
 }
390 390
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +8 added lines, -10 removed lines patch added patch discarded remove patch
@@ -277,11 +277,9 @@  discard block
 block discarded – undo
277 277
                         'class' => $cause['package'],
278 278
                         'message' => $cause['message'],
279 279
                         'file' => isset($cause['context']['file']) ?
280
-                                            $cause['context']['file'] :
281
-                                            'unknown',
280
+                                            $cause['context']['file'] : 'unknown',
282 281
                         'line' => isset($cause['context']['line']) ?
283
-                                            $cause['context']['line'] :
284
-                                            'unknown',
282
+                                            $cause['context']['line'] : 'unknown',
285 283
                     );
286 284
                 }
287 285
             }
@@ -294,7 +292,7 @@  discard block
 block discarded – undo
294 292
             $this->_trace = $this->getTrace();
295 293
             if (empty($this->_trace)) {
296 294
                 $backtrace = debug_backtrace();
297
-                $this->_trace = array($backtrace[count($backtrace)-1]);
295
+                $this->_trace = array($backtrace[count($backtrace) - 1]);
298 296
             }
299 297
         }
300 298
         return $this->_trace;
@@ -325,7 +323,7 @@  discard block
 block discarded – undo
325 323
         $trace = $this->getTraceSafe();
326 324
         $causes = array();
327 325
         $this->getCauseMessage($causes);
328
-        $html =  '<table style="border: 1px" cellspacing="0">' . "\n";
326
+        $html = '<table style="border: 1px" cellspacing="0">' . "\n";
329 327
         foreach ($causes as $i => $cause) {
330 328
             $html .= '<tr><td colspan="3" style="background: #ff9999">'
331 329
                . str_repeat('-', $i) . ' <b>' . $cause['class'] . '</b>: '
@@ -350,24 +348,24 @@  discard block
 block discarded – undo
350 348
                 foreach ($v['args'] as $arg) {
351 349
                     if (is_null($arg)) $args[] = 'null';
352 350
                     elseif (is_array($arg)) $args[] = 'Array';
353
-                    elseif (is_object($arg)) $args[] = 'Object('.get_class($arg).')';
351
+                    elseif (is_object($arg)) $args[] = 'Object(' . get_class($arg) . ')';
354 352
                     elseif (is_bool($arg)) $args[] = $arg ? 'true' : 'false';
355 353
                     elseif (is_int($arg) || is_double($arg)) $args[] = $arg;
356 354
                     else {
357
-                        $arg = (string)$arg;
355
+                        $arg = (string) $arg;
358 356
                         $str = htmlspecialchars(substr($arg, 0, 16));
359 357
                         if (strlen($arg) > 16) $str .= '&hellip;';
360 358
                         $args[] = "'" . $str . "'";
361 359
                     }
362 360
                 }
363 361
             }
364
-            $html .= '(' . implode(', ',$args) . ')'
362
+            $html .= '(' . implode(', ', $args) . ')'
365 363
                    . '</td>'
366 364
                    . '<td>' . (isset($v['file']) ? $v['file'] : 'unknown')
367 365
                    . ':' . (isset($v['line']) ? $v['line'] : 'unknown')
368 366
                    . '</td></tr>' . "\n";
369 367
         }
370
-        $html .= '<tr><td style="text-align: center;">' . ($k+1) . '</td>'
368
+        $html .= '<tr><td style="text-align: center;">' . ($k + 1) . '</td>'
371 369
                . '<td>{main}</td>'
372 370
                . '<td>&nbsp;</td></tr>' . "\n"
373 371
                . '</table>';
Please login to merge, or discard this patch.
Braces   +14 added lines, -7 removed lines patch added patch discarded remove patch
@@ -348,15 +348,22 @@
 block discarded – undo
348 348
             $args = array();
349 349
             if (!empty($v['args'])) {
350 350
                 foreach ($v['args'] as $arg) {
351
-                    if (is_null($arg)) $args[] = 'null';
352
-                    elseif (is_array($arg)) $args[] = 'Array';
353
-                    elseif (is_object($arg)) $args[] = 'Object('.get_class($arg).')';
354
-                    elseif (is_bool($arg)) $args[] = $arg ? 'true' : 'false';
355
-                    elseif (is_int($arg) || is_double($arg)) $args[] = $arg;
356
-                    else {
351
+                    if (is_null($arg)) {
352
+                    	$args[] = 'null';
353
+                    } elseif (is_array($arg)) {
354
+                    	$args[] = 'Array';
355
+                    } elseif (is_object($arg)) {
356
+                    	$args[] = 'Object('.get_class($arg).')';
357
+                    } elseif (is_bool($arg)) {
358
+                    	$args[] = $arg ? 'true' : 'false';
359
+                    } elseif (is_int($arg) || is_double($arg)) {
360
+                    	$args[] = $arg;
361
+                    } else {
357 362
                         $arg = (string)$arg;
358 363
                         $str = htmlspecialchars(substr($arg, 0, 16));
359
-                        if (strlen($arg) > 16) $str .= '&hellip;';
364
+                        if (strlen($arg) > 16) {
365
+                        	$str .= '&hellip;';
366
+                        }
360 367
                         $args[] = "'" . $str . "'";
361 368
                     }
362 369
                 }
Please login to merge, or discard this patch.
libs/PEAR.1.9/HTTP/Request2.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -269,7 +269,7 @@
 block discarded – undo
269 269
    /**
270 270
     * Returns the request URL
271 271
     *
272
-    * @return   Net_URL2
272
+    * @return   string
273 273
     */
274 274
     public function getUrl()
275 275
     {
Please login to merge, or discard this patch.
Indentation   +405 added lines, -405 removed lines patch added patch discarded remove patch
@@ -67,14 +67,14 @@  discard block
 block discarded – undo
67 67
     *
68 68
     * @link http://tools.ietf.org/html/rfc2616#section-5.1.1
69 69
     */
70
-    const METHOD_OPTIONS = 'OPTIONS';
71
-    const METHOD_GET     = 'GET';
72
-    const METHOD_HEAD    = 'HEAD';
73
-    const METHOD_POST    = 'POST';
74
-    const METHOD_PUT     = 'PUT';
75
-    const METHOD_DELETE  = 'DELETE';
76
-    const METHOD_TRACE   = 'TRACE';
77
-    const METHOD_CONNECT = 'CONNECT';
70
+	const METHOD_OPTIONS = 'OPTIONS';
71
+	const METHOD_GET     = 'GET';
72
+	const METHOD_HEAD    = 'HEAD';
73
+	const METHOD_POST    = 'POST';
74
+	const METHOD_PUT     = 'PUT';
75
+	const METHOD_DELETE  = 'DELETE';
76
+	const METHOD_TRACE   = 'TRACE';
77
+	const METHOD_CONNECT = 'CONNECT';
78 78
    /**#@-*/
79 79
 
80 80
    /**#@+
@@ -82,129 +82,129 @@  discard block
 block discarded – undo
82 82
     *
83 83
     * @link http://tools.ietf.org/html/rfc2617
84 84
     */
85
-    const AUTH_BASIC  = 'basic';
86
-    const AUTH_DIGEST = 'digest';
85
+	const AUTH_BASIC  = 'basic';
86
+	const AUTH_DIGEST = 'digest';
87 87
    /**#@-*/
88 88
 
89 89
    /**
90 90
     * Regular expression used to check for invalid symbols in RFC 2616 tokens
91 91
     * @link http://pear.php.net/bugs/bug.php?id=15630
92 92
     */
93
-    const REGEXP_INVALID_TOKEN = '![\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]!';
93
+	const REGEXP_INVALID_TOKEN = '![\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]!';
94 94
 
95 95
    /**
96 96
     * Regular expression used to check for invalid symbols in cookie strings
97 97
     * @link http://pear.php.net/bugs/bug.php?id=15630
98 98
     * @link http://web.archive.org/web/20080331104521/http://cgi.netscape.com/newsref/std/cookie_spec.html
99 99
     */
100
-    const REGEXP_INVALID_COOKIE = '/[\s,;]/';
100
+	const REGEXP_INVALID_COOKIE = '/[\s,;]/';
101 101
 
102 102
    /**
103 103
     * Fileinfo magic database resource
104 104
     * @var  resource
105 105
     * @see  detectMimeType()
106 106
     */
107
-    private static $_fileinfoDb;
107
+	private static $_fileinfoDb;
108 108
 
109 109
    /**
110 110
     * Observers attached to the request (instances of SplObserver)
111 111
     * @var  array
112 112
     */
113
-    protected $observers = array();
113
+	protected $observers = array();
114 114
 
115 115
    /**
116 116
     * Request URL
117 117
     * @var  Net_URL2
118 118
     */
119
-    protected $url;
119
+	protected $url;
120 120
 
121 121
    /**
122 122
     * Request method
123 123
     * @var  string
124 124
     */
125
-    protected $method = self::METHOD_GET;
125
+	protected $method = self::METHOD_GET;
126 126
 
127 127
    /**
128 128
     * Authentication data
129 129
     * @var  array
130 130
     * @see  getAuth()
131 131
     */
132
-    protected $auth;
132
+	protected $auth;
133 133
 
134 134
    /**
135 135
     * Request headers
136 136
     * @var  array
137 137
     */
138
-    protected $headers = array();
138
+	protected $headers = array();
139 139
 
140 140
    /**
141 141
     * Configuration parameters
142 142
     * @var  array
143 143
     * @see  setConfig()
144 144
     */
145
-    protected $config = array(
146
-        'adapter'           => 'HTTP_Request2_Adapter_Socket',
147
-        'connect_timeout'   => 10,
148
-        'timeout'           => 0,
149
-        'use_brackets'      => true,
150
-        'protocol_version'  => '1.1',
151
-        'buffer_size'       => 16384,
152
-        'store_body'        => true,
145
+	protected $config = array(
146
+		'adapter'           => 'HTTP_Request2_Adapter_Socket',
147
+		'connect_timeout'   => 10,
148
+		'timeout'           => 0,
149
+		'use_brackets'      => true,
150
+		'protocol_version'  => '1.1',
151
+		'buffer_size'       => 16384,
152
+		'store_body'        => true,
153 153
 
154
-        'proxy_host'        => '',
155
-        'proxy_port'        => '',
156
-        'proxy_user'        => '',
157
-        'proxy_password'    => '',
158
-        'proxy_auth_scheme' => self::AUTH_BASIC,
154
+		'proxy_host'        => '',
155
+		'proxy_port'        => '',
156
+		'proxy_user'        => '',
157
+		'proxy_password'    => '',
158
+		'proxy_auth_scheme' => self::AUTH_BASIC,
159 159
 
160
-        'ssl_verify_peer'   => true,
161
-        'ssl_verify_host'   => true,
162
-        'ssl_cafile'        => null,
163
-        'ssl_capath'        => null,
164
-        'ssl_local_cert'    => null,
165
-        'ssl_passphrase'    => null,
160
+		'ssl_verify_peer'   => true,
161
+		'ssl_verify_host'   => true,
162
+		'ssl_cafile'        => null,
163
+		'ssl_capath'        => null,
164
+		'ssl_local_cert'    => null,
165
+		'ssl_passphrase'    => null,
166 166
 
167
-        'digest_compat_ie'  => false,
167
+		'digest_compat_ie'  => false,
168 168
 
169
-        'follow_redirects'  => false,
170
-        'max_redirects'     => 5,
171
-        'strict_redirects'  => false
172
-    );
169
+		'follow_redirects'  => false,
170
+		'max_redirects'     => 5,
171
+		'strict_redirects'  => false
172
+	);
173 173
 
174 174
    /**
175 175
     * Last event in request / response handling, intended for observers
176 176
     * @var  array
177 177
     * @see  getLastEvent()
178 178
     */
179
-    protected $lastEvent = array(
180
-        'name' => 'start',
181
-        'data' => null
182
-    );
179
+	protected $lastEvent = array(
180
+		'name' => 'start',
181
+		'data' => null
182
+	);
183 183
 
184 184
    /**
185 185
     * Request body
186 186
     * @var  string|resource
187 187
     * @see  setBody()
188 188
     */
189
-    protected $body = '';
189
+	protected $body = '';
190 190
 
191 191
    /**
192 192
     * Array of POST parameters
193 193
     * @var  array
194 194
     */
195
-    protected $postParams = array();
195
+	protected $postParams = array();
196 196
 
197 197
    /**
198 198
     * Array of file uploads (for multipart/form-data POST requests)
199 199
     * @var  array
200 200
     */
201
-    protected $uploads = array();
201
+	protected $uploads = array();
202 202
 
203 203
    /**
204 204
     * Adapter used to perform actual HTTP request
205 205
     * @var  HTTP_Request2_Adapter
206 206
     */
207
-    protected $adapter;
207
+	protected $adapter;
208 208
 
209 209
 
210 210
    /**
@@ -216,19 +216,19 @@  discard block
 block discarded – undo
216 216
     * @param    string              Request method
217 217
     * @param    array               Configuration for this Request instance
218 218
     */
219
-    public function __construct($url = null, $method = self::METHOD_GET, array $config = array())
220
-    {
221
-        $this->setConfig($config);
222
-        if (!empty($url)) {
223
-            $this->setUrl($url);
224
-        }
225
-        if (!empty($method)) {
226
-            $this->setMethod($method);
227
-        }
228
-        $this->setHeader('user-agent', 'HTTP_Request2/0.5.2 ' .
229
-                         '(http://pear.php.net/package/http_request2) ' .
230
-                         'PHP/' . phpversion());
231
-    }
219
+	public function __construct($url = null, $method = self::METHOD_GET, array $config = array())
220
+	{
221
+		$this->setConfig($config);
222
+		if (!empty($url)) {
223
+			$this->setUrl($url);
224
+		}
225
+		if (!empty($method)) {
226
+			$this->setMethod($method);
227
+		}
228
+		$this->setHeader('user-agent', 'HTTP_Request2/0.5.2 ' .
229
+						 '(http://pear.php.net/package/http_request2) ' .
230
+						 'PHP/' . phpversion());
231
+	}
232 232
 
233 233
    /**
234 234
     * Sets the URL for this request
@@ -241,40 +241,40 @@  discard block
 block discarded – undo
241 241
     * @return   HTTP_Request2
242 242
     * @throws   HTTP_Request2_Exception
243 243
     */
244
-    public function setUrl($url)
245
-    {
246
-        if (is_string($url)) {
247
-            $url = new Net_URL2(
248
-                $url, array(Net_URL2::OPTION_USE_BRACKETS => $this->config['use_brackets'])
249
-            );
250
-        }
251
-        if (!$url instanceof Net_URL2) {
252
-            throw new HTTP_Request2_Exception('Parameter is not a valid HTTP URL');
253
-        }
254
-        // URL contains username / password?
255
-        if ($url->getUserinfo()) {
256
-            $username = $url->getUser();
257
-            $password = $url->getPassword();
258
-            $this->setAuth(rawurldecode($username), $password? rawurldecode($password): '');
259
-            $url->setUserinfo('');
260
-        }
261
-        if ('' == $url->getPath()) {
262
-            $url->setPath('/');
263
-        }
264
-        $this->url = $url;
265
-
266
-        return $this;
267
-    }
244
+	public function setUrl($url)
245
+	{
246
+		if (is_string($url)) {
247
+			$url = new Net_URL2(
248
+				$url, array(Net_URL2::OPTION_USE_BRACKETS => $this->config['use_brackets'])
249
+			);
250
+		}
251
+		if (!$url instanceof Net_URL2) {
252
+			throw new HTTP_Request2_Exception('Parameter is not a valid HTTP URL');
253
+		}
254
+		// URL contains username / password?
255
+		if ($url->getUserinfo()) {
256
+			$username = $url->getUser();
257
+			$password = $url->getPassword();
258
+			$this->setAuth(rawurldecode($username), $password? rawurldecode($password): '');
259
+			$url->setUserinfo('');
260
+		}
261
+		if ('' == $url->getPath()) {
262
+			$url->setPath('/');
263
+		}
264
+		$this->url = $url;
265
+
266
+		return $this;
267
+	}
268 268
 
269 269
    /**
270 270
     * Returns the request URL
271 271
     *
272 272
     * @return   Net_URL2
273 273
     */
274
-    public function getUrl()
275
-    {
276
-        return $this->url;
277
-    }
274
+	public function getUrl()
275
+	{
276
+		return $this->url;
277
+	}
278 278
 
279 279
    /**
280 280
     * Sets the request method
@@ -283,26 +283,26 @@  discard block
 block discarded – undo
283 283
     * @return   HTTP_Request2
284 284
     * @throws   HTTP_Request2_Exception if the method name is invalid
285 285
     */
286
-    public function setMethod($method)
287
-    {
288
-        // Method name should be a token: http://tools.ietf.org/html/rfc2616#section-5.1.1
289
-        if (preg_match(self::REGEXP_INVALID_TOKEN, $method)) {
290
-            throw new HTTP_Request2_Exception("Invalid request method '{$method}'");
291
-        }
292
-        $this->method = $method;
286
+	public function setMethod($method)
287
+	{
288
+		// Method name should be a token: http://tools.ietf.org/html/rfc2616#section-5.1.1
289
+		if (preg_match(self::REGEXP_INVALID_TOKEN, $method)) {
290
+			throw new HTTP_Request2_Exception("Invalid request method '{$method}'");
291
+		}
292
+		$this->method = $method;
293 293
 
294
-        return $this;
295
-    }
294
+		return $this;
295
+	}
296 296
 
297 297
    /**
298 298
     * Returns the request method
299 299
     *
300 300
     * @return   string
301 301
     */
302
-    public function getMethod()
303
-    {
304
-        return $this->method;
305
-    }
302
+	public function getMethod()
303
+	{
304
+		return $this->method;
305
+	}
306 306
 
307 307
    /**
308 308
     * Sets the configuration parameter(s)
@@ -352,24 +352,24 @@  discard block
 block discarded – undo
352 352
     * @return   HTTP_Request2
353 353
     * @throws   HTTP_Request2_Exception If the parameter is unknown
354 354
     */
355
-    public function setConfig($nameOrConfig, $value = null)
356
-    {
357
-        if (is_array($nameOrConfig)) {
358
-            foreach ($nameOrConfig as $name => $value) {
359
-                $this->setConfig($name, $value);
360
-            }
355
+	public function setConfig($nameOrConfig, $value = null)
356
+	{
357
+		if (is_array($nameOrConfig)) {
358
+			foreach ($nameOrConfig as $name => $value) {
359
+				$this->setConfig($name, $value);
360
+			}
361 361
 
362
-        } else {
363
-            if (!array_key_exists($nameOrConfig, $this->config)) {
364
-                throw new HTTP_Request2_Exception(
365
-                    "Unknown configuration parameter '{$nameOrConfig}'"
366
-                );
367
-            }
368
-            $this->config[$nameOrConfig] = $value;
369
-        }
362
+		} else {
363
+			if (!array_key_exists($nameOrConfig, $this->config)) {
364
+				throw new HTTP_Request2_Exception(
365
+					"Unknown configuration parameter '{$nameOrConfig}'"
366
+				);
367
+			}
368
+			$this->config[$nameOrConfig] = $value;
369
+		}
370 370
 
371
-        return $this;
372
-    }
371
+		return $this;
372
+	}
373 373
 
374 374
    /**
375 375
     * Returns the value(s) of the configuration parameter(s)
@@ -379,17 +379,17 @@  discard block
 block discarded – undo
379 379
     *                   parameters if $name is not given
380 380
     * @throws   HTTP_Request2_Exception If the parameter is unknown
381 381
     */
382
-    public function getConfig($name = null)
383
-    {
384
-        if (null === $name) {
385
-            return $this->config;
386
-        } elseif (!array_key_exists($name, $this->config)) {
387
-            throw new HTTP_Request2_Exception(
388
-                "Unknown configuration parameter '{$name}'"
389
-            );
390
-        }
391
-        return $this->config[$name];
392
-    }
382
+	public function getConfig($name = null)
383
+	{
384
+		if (null === $name) {
385
+			return $this->config;
386
+		} elseif (!array_key_exists($name, $this->config)) {
387
+			throw new HTTP_Request2_Exception(
388
+				"Unknown configuration parameter '{$name}'"
389
+			);
390
+		}
391
+		return $this->config[$name];
392
+	}
393 393
 
394 394
    /**
395 395
     * Sets the autentification data
@@ -399,20 +399,20 @@  discard block
 block discarded – undo
399 399
     * @param    string  authentication scheme
400 400
     * @return   HTTP_Request2
401 401
     */
402
-    public function setAuth($user, $password = '', $scheme = self::AUTH_BASIC)
403
-    {
404
-        if (empty($user)) {
405
-            $this->auth = null;
406
-        } else {
407
-            $this->auth = array(
408
-                'user'     => (string)$user,
409
-                'password' => (string)$password,
410
-                'scheme'   => $scheme
411
-            );
412
-        }
402
+	public function setAuth($user, $password = '', $scheme = self::AUTH_BASIC)
403
+	{
404
+		if (empty($user)) {
405
+			$this->auth = null;
406
+		} else {
407
+			$this->auth = array(
408
+				'user'     => (string)$user,
409
+				'password' => (string)$password,
410
+				'scheme'   => $scheme
411
+			);
412
+		}
413 413
 
414
-        return $this;
415
-    }
414
+		return $this;
415
+	}
416 416
 
417 417
    /**
418 418
     * Returns the authentication data
@@ -422,10 +422,10 @@  discard block
 block discarded – undo
422 422
     *
423 423
     * @return   array
424 424
     */
425
-    public function getAuth()
426
-    {
427
-        return $this->auth;
428
-    }
425
+	public function getAuth()
426
+	{
427
+		return $this->auth;
428
+	}
429 429
 
430 430
    /**
431 431
     * Sets request header(s)
@@ -451,35 +451,35 @@  discard block
 block discarded – undo
451 451
     * @return   HTTP_Request2
452 452
     * @throws   HTTP_Request2_Exception
453 453
     */
454
-    public function setHeader($name, $value = null)
455
-    {
456
-        if (is_array($name)) {
457
-            foreach ($name as $k => $v) {
458
-                if (is_string($k)) {
459
-                    $this->setHeader($k, $v);
460
-                } else {
461
-                    $this->setHeader($v);
462
-                }
463
-            }
464
-        } else {
465
-            if (null === $value && strpos($name, ':')) {
466
-                list($name, $value) = array_map('trim', explode(':', $name, 2));
467
-            }
468
-            // Header name should be a token: http://tools.ietf.org/html/rfc2616#section-4.2
469
-            if (preg_match(self::REGEXP_INVALID_TOKEN, $name)) {
470
-                throw new HTTP_Request2_Exception("Invalid header name '{$name}'");
471
-            }
472
-            // Header names are case insensitive anyway
473
-            $name = strtolower($name);
474
-            if (null === $value) {
475
-                unset($this->headers[$name]);
476
-            } else {
477
-                $this->headers[$name] = $value;
478
-            }
479
-        }
480
-
481
-        return $this;
482
-    }
454
+	public function setHeader($name, $value = null)
455
+	{
456
+		if (is_array($name)) {
457
+			foreach ($name as $k => $v) {
458
+				if (is_string($k)) {
459
+					$this->setHeader($k, $v);
460
+				} else {
461
+					$this->setHeader($v);
462
+				}
463
+			}
464
+		} else {
465
+			if (null === $value && strpos($name, ':')) {
466
+				list($name, $value) = array_map('trim', explode(':', $name, 2));
467
+			}
468
+			// Header name should be a token: http://tools.ietf.org/html/rfc2616#section-4.2
469
+			if (preg_match(self::REGEXP_INVALID_TOKEN, $name)) {
470
+				throw new HTTP_Request2_Exception("Invalid header name '{$name}'");
471
+			}
472
+			// Header names are case insensitive anyway
473
+			$name = strtolower($name);
474
+			if (null === $value) {
475
+				unset($this->headers[$name]);
476
+			} else {
477
+				$this->headers[$name] = $value;
478
+			}
479
+		}
480
+
481
+		return $this;
482
+	}
483 483
 
484 484
    /**
485 485
     * Returns the request headers
@@ -489,10 +489,10 @@  discard block
 block discarded – undo
489 489
     *
490 490
     * @return   array
491 491
     */
492
-    public function getHeaders()
493
-    {
494
-        return $this->headers;
495
-    }
492
+	public function getHeaders()
493
+	{
494
+		return $this->headers;
495
+	}
496 496
 
497 497
    /**
498 498
     * Appends a cookie to "Cookie:" header
@@ -502,17 +502,17 @@  discard block
 block discarded – undo
502 502
     * @return   HTTP_Request2
503 503
     * @throws   HTTP_Request2_Exception
504 504
     */
505
-    public function addCookie($name, $value)
506
-    {
507
-        $cookie = $name . '=' . $value;
508
-        if (preg_match(self::REGEXP_INVALID_COOKIE, $cookie)) {
509
-            throw new HTTP_Request2_Exception("Invalid cookie: '{$cookie}'");
510
-        }
511
-        $cookies = empty($this->headers['cookie'])? '': $this->headers['cookie'] . '; ';
512
-        $this->setHeader('cookie', $cookies . $cookie);
505
+	public function addCookie($name, $value)
506
+	{
507
+		$cookie = $name . '=' . $value;
508
+		if (preg_match(self::REGEXP_INVALID_COOKIE, $cookie)) {
509
+			throw new HTTP_Request2_Exception("Invalid cookie: '{$cookie}'");
510
+		}
511
+		$cookies = empty($this->headers['cookie'])? '': $this->headers['cookie'] . '; ';
512
+		$this->setHeader('cookie', $cookies . $cookie);
513 513
 
514
-        return $this;
515
-    }
514
+		return $this;
515
+	}
516 516
 
517 517
    /**
518 518
     * Sets the request body
@@ -522,55 +522,55 @@  discard block
 block discarded – undo
522 522
     * @return   HTTP_Request2
523 523
     * @throws   HTTP_Request2_Exception
524 524
     */
525
-    public function setBody($body, $isFilename = false)
526
-    {
527
-        if (!$isFilename) {
528
-            if (!$body instanceof HTTP_Request2_MultipartBody) {
529
-                $this->body = (string)$body;
530
-            } else {
531
-                $this->body = $body;
532
-            }
533
-        } else {
534
-            if (!($fp = @fopen($body, 'rb'))) {
535
-                throw new HTTP_Request2_Exception("Cannot open file {$body}");
536
-            }
537
-            $this->body = $fp;
538
-            if (empty($this->headers['content-type'])) {
539
-                $this->setHeader('content-type', self::detectMimeType($body));
540
-            }
541
-        }
542
-        $this->postParams = $this->uploads = array();
543
-
544
-        return $this;
545
-    }
525
+	public function setBody($body, $isFilename = false)
526
+	{
527
+		if (!$isFilename) {
528
+			if (!$body instanceof HTTP_Request2_MultipartBody) {
529
+				$this->body = (string)$body;
530
+			} else {
531
+				$this->body = $body;
532
+			}
533
+		} else {
534
+			if (!($fp = @fopen($body, 'rb'))) {
535
+				throw new HTTP_Request2_Exception("Cannot open file {$body}");
536
+			}
537
+			$this->body = $fp;
538
+			if (empty($this->headers['content-type'])) {
539
+				$this->setHeader('content-type', self::detectMimeType($body));
540
+			}
541
+		}
542
+		$this->postParams = $this->uploads = array();
543
+
544
+		return $this;
545
+	}
546 546
 
547 547
    /**
548 548
     * Returns the request body
549 549
     *
550 550
     * @return   string|resource|HTTP_Request2_MultipartBody
551 551
     */
552
-    public function getBody()
553
-    {
554
-        if (self::METHOD_POST == $this->method &&
555
-            (!empty($this->postParams) || !empty($this->uploads))
556
-        ) {
557
-            if ('application/x-www-form-urlencoded' == $this->headers['content-type']) {
558
-                $body = http_build_query($this->postParams, '', '&');
559
-                if (!$this->getConfig('use_brackets')) {
560
-                    $body = preg_replace('/%5B\d+%5D=/', '=', $body);
561
-                }
562
-                // support RFC 3986 by not encoding '~' symbol (request #15368)
563
-                return str_replace('%7E', '~', $body);
564
-
565
-            } elseif ('multipart/form-data' == $this->headers['content-type']) {
566
-                require_once 'HTTP/Request2/MultipartBody.php';
567
-                return new HTTP_Request2_MultipartBody(
568
-                    $this->postParams, $this->uploads, $this->getConfig('use_brackets')
569
-                );
570
-            }
571
-        }
572
-        return $this->body;
573
-    }
552
+	public function getBody()
553
+	{
554
+		if (self::METHOD_POST == $this->method &&
555
+			(!empty($this->postParams) || !empty($this->uploads))
556
+		) {
557
+			if ('application/x-www-form-urlencoded' == $this->headers['content-type']) {
558
+				$body = http_build_query($this->postParams, '', '&');
559
+				if (!$this->getConfig('use_brackets')) {
560
+					$body = preg_replace('/%5B\d+%5D=/', '=', $body);
561
+				}
562
+				// support RFC 3986 by not encoding '~' symbol (request #15368)
563
+				return str_replace('%7E', '~', $body);
564
+
565
+			} elseif ('multipart/form-data' == $this->headers['content-type']) {
566
+				require_once 'HTTP/Request2/MultipartBody.php';
567
+				return new HTTP_Request2_MultipartBody(
568
+					$this->postParams, $this->uploads, $this->getConfig('use_brackets')
569
+				);
570
+			}
571
+		}
572
+		return $this->body;
573
+	}
574 574
 
575 575
    /**
576 576
     * Adds a file to form-based file upload
@@ -588,45 +588,45 @@  discard block
 block discarded – undo
588 588
     * @return   HTTP_Request2
589 589
     * @throws   HTTP_Request2_Exception
590 590
     */
591
-    public function addUpload($fieldName, $filename, $sendFilename = null,
592
-                              $contentType = null)
593
-    {
594
-        if (!is_array($filename)) {
595
-            if (!($fp = @fopen($filename, 'rb'))) {
596
-                throw new HTTP_Request2_Exception("Cannot open file {$filename}");
597
-            }
598
-            $this->uploads[$fieldName] = array(
599
-                'fp'        => $fp,
600
-                'filename'  => empty($sendFilename)? basename($filename): $sendFilename,
601
-                'size'      => filesize($filename),
602
-                'type'      => empty($contentType)? self::detectMimeType($filename): $contentType
603
-            );
604
-        } else {
605
-            $fps = $names = $sizes = $types = array();
606
-            foreach ($filename as $f) {
607
-                if (!is_array($f)) {
608
-                    $f = array($f);
609
-                }
610
-                if (!($fp = @fopen($f[0], 'rb'))) {
611
-                    throw new HTTP_Request2_Exception("Cannot open file {$f[0]}");
612
-                }
613
-                $fps[]   = $fp;
614
-                $names[] = empty($f[1])? basename($f[0]): $f[1];
615
-                $sizes[] = filesize($f[0]);
616
-                $types[] = empty($f[2])? self::detectMimeType($f[0]): $f[2];
617
-            }
618
-            $this->uploads[$fieldName] = array(
619
-                'fp' => $fps, 'filename' => $names, 'size' => $sizes, 'type' => $types
620
-            );
621
-        }
622
-        if (empty($this->headers['content-type']) ||
623
-            'application/x-www-form-urlencoded' == $this->headers['content-type']
624
-        ) {
625
-            $this->setHeader('content-type', 'multipart/form-data');
626
-        }
627
-
628
-        return $this;
629
-    }
591
+	public function addUpload($fieldName, $filename, $sendFilename = null,
592
+							  $contentType = null)
593
+	{
594
+		if (!is_array($filename)) {
595
+			if (!($fp = @fopen($filename, 'rb'))) {
596
+				throw new HTTP_Request2_Exception("Cannot open file {$filename}");
597
+			}
598
+			$this->uploads[$fieldName] = array(
599
+				'fp'        => $fp,
600
+				'filename'  => empty($sendFilename)? basename($filename): $sendFilename,
601
+				'size'      => filesize($filename),
602
+				'type'      => empty($contentType)? self::detectMimeType($filename): $contentType
603
+			);
604
+		} else {
605
+			$fps = $names = $sizes = $types = array();
606
+			foreach ($filename as $f) {
607
+				if (!is_array($f)) {
608
+					$f = array($f);
609
+				}
610
+				if (!($fp = @fopen($f[0], 'rb'))) {
611
+					throw new HTTP_Request2_Exception("Cannot open file {$f[0]}");
612
+				}
613
+				$fps[]   = $fp;
614
+				$names[] = empty($f[1])? basename($f[0]): $f[1];
615
+				$sizes[] = filesize($f[0]);
616
+				$types[] = empty($f[2])? self::detectMimeType($f[0]): $f[2];
617
+			}
618
+			$this->uploads[$fieldName] = array(
619
+				'fp' => $fps, 'filename' => $names, 'size' => $sizes, 'type' => $types
620
+			);
621
+		}
622
+		if (empty($this->headers['content-type']) ||
623
+			'application/x-www-form-urlencoded' == $this->headers['content-type']
624
+		) {
625
+			$this->setHeader('content-type', 'multipart/form-data');
626
+		}
627
+
628
+		return $this;
629
+	}
630 630
 
631 631
    /**
632 632
     * Adds POST parameter(s) to the request.
@@ -635,61 +635,61 @@  discard block
 block discarded – undo
635 635
     * @param    mixed           parameter value (can be an array)
636 636
     * @return   HTTP_Request2
637 637
     */
638
-    public function addPostParameter($name, $value = null)
639
-    {
640
-        if (!is_array($name)) {
641
-            $this->postParams[$name] = $value;
642
-        } else {
643
-            foreach ($name as $k => $v) {
644
-                $this->addPostParameter($k, $v);
645
-            }
646
-        }
647
-        if (empty($this->headers['content-type'])) {
648
-            $this->setHeader('content-type', 'application/x-www-form-urlencoded');
649
-        }
638
+	public function addPostParameter($name, $value = null)
639
+	{
640
+		if (!is_array($name)) {
641
+			$this->postParams[$name] = $value;
642
+		} else {
643
+			foreach ($name as $k => $v) {
644
+				$this->addPostParameter($k, $v);
645
+			}
646
+		}
647
+		if (empty($this->headers['content-type'])) {
648
+			$this->setHeader('content-type', 'application/x-www-form-urlencoded');
649
+		}
650 650
 
651
-        return $this;
652
-    }
651
+		return $this;
652
+	}
653 653
 
654 654
    /**
655 655
     * Attaches a new observer
656 656
     *
657 657
     * @param    SplObserver
658 658
     */
659
-    public function attach(SplObserver $observer)
660
-    {
661
-        foreach ($this->observers as $attached) {
662
-            if ($attached === $observer) {
663
-                return;
664
-            }
665
-        }
666
-        $this->observers[] = $observer;
667
-    }
659
+	public function attach(SplObserver $observer)
660
+	{
661
+		foreach ($this->observers as $attached) {
662
+			if ($attached === $observer) {
663
+				return;
664
+			}
665
+		}
666
+		$this->observers[] = $observer;
667
+	}
668 668
 
669 669
    /**
670 670
     * Detaches an existing observer
671 671
     *
672 672
     * @param    SplObserver
673 673
     */
674
-    public function detach(SplObserver $observer)
675
-    {
676
-        foreach ($this->observers as $key => $attached) {
677
-            if ($attached === $observer) {
678
-                unset($this->observers[$key]);
679
-                return;
680
-            }
681
-        }
682
-    }
674
+	public function detach(SplObserver $observer)
675
+	{
676
+		foreach ($this->observers as $key => $attached) {
677
+			if ($attached === $observer) {
678
+				unset($this->observers[$key]);
679
+				return;
680
+			}
681
+		}
682
+	}
683 683
 
684 684
    /**
685 685
     * Notifies all observers
686 686
     */
687
-    public function notify()
688
-    {
689
-        foreach ($this->observers as $observer) {
690
-            $observer->update($this);
691
-        }
692
-    }
687
+	public function notify()
688
+	{
689
+		foreach ($this->observers as $observer) {
690
+			$observer->update($this);
691
+		}
692
+	}
693 693
 
694 694
    /**
695 695
     * Sets the last event
@@ -700,14 +700,14 @@  discard block
 block discarded – undo
700 700
     * @param    string  event name
701 701
     * @param    mixed   event data
702 702
     */
703
-    public function setLastEvent($name, $data = null)
704
-    {
705
-        $this->lastEvent = array(
706
-            'name' => $name,
707
-            'data' => $data
708
-        );
709
-        $this->notify();
710
-    }
703
+	public function setLastEvent($name, $data = null)
704
+	{
705
+		$this->lastEvent = array(
706
+			'name' => $name,
707
+			'data' => $data
708
+		);
709
+		$this->notify();
710
+	}
711 711
 
712 712
    /**
713 713
     * Returns the last event
@@ -736,10 +736,10 @@  discard block
 block discarded – undo
736 736
     *
737 737
     * @return   array   The array has two keys: 'name' and 'data'
738 738
     */
739
-    public function getLastEvent()
740
-    {
741
-        return $this->lastEvent;
742
-    }
739
+	public function getLastEvent()
740
+	{
741
+		return $this->lastEvent;
742
+	}
743 743
 
744 744
    /**
745 745
     * Sets the adapter used to actually perform the request
@@ -757,29 +757,29 @@  discard block
 block discarded – undo
757 757
     * @return   HTTP_Request2
758 758
     * @throws   HTTP_Request2_Exception
759 759
     */
760
-    public function setAdapter($adapter)
761
-    {
762
-        if (is_string($adapter)) {
763
-            if (!class_exists($adapter, false)) {
764
-                if (false === strpos($adapter, '_')) {
765
-                    $adapter = 'HTTP_Request2_Adapter_' . ucfirst($adapter);
766
-                }
767
-                if (preg_match('/^HTTP_Request2_Adapter_([a-zA-Z0-9]+)$/', $adapter)) {
768
-                    include_once str_replace('_', DIRECTORY_SEPARATOR, $adapter) . '.php';
769
-                }
770
-                if (!class_exists($adapter, false)) {
771
-                    throw new HTTP_Request2_Exception("Class {$adapter} not found");
772
-                }
773
-            }
774
-            $adapter = new $adapter;
775
-        }
776
-        if (!$adapter instanceof HTTP_Request2_Adapter) {
777
-            throw new HTTP_Request2_Exception('Parameter is not a HTTP request adapter');
778
-        }
779
-        $this->adapter = $adapter;
780
-
781
-        return $this;
782
-    }
760
+	public function setAdapter($adapter)
761
+	{
762
+		if (is_string($adapter)) {
763
+			if (!class_exists($adapter, false)) {
764
+				if (false === strpos($adapter, '_')) {
765
+					$adapter = 'HTTP_Request2_Adapter_' . ucfirst($adapter);
766
+				}
767
+				if (preg_match('/^HTTP_Request2_Adapter_([a-zA-Z0-9]+)$/', $adapter)) {
768
+					include_once str_replace('_', DIRECTORY_SEPARATOR, $adapter) . '.php';
769
+				}
770
+				if (!class_exists($adapter, false)) {
771
+					throw new HTTP_Request2_Exception("Class {$adapter} not found");
772
+				}
773
+			}
774
+			$adapter = new $adapter;
775
+		}
776
+		if (!$adapter instanceof HTTP_Request2_Adapter) {
777
+			throw new HTTP_Request2_Exception('Parameter is not a HTTP request adapter');
778
+		}
779
+		$this->adapter = $adapter;
780
+
781
+		return $this;
782
+	}
783 783
 
784 784
    /**
785 785
     * Sends the request and returns the response
@@ -787,48 +787,48 @@  discard block
 block discarded – undo
787 787
     * @throws   HTTP_Request2_Exception
788 788
     * @return   HTTP_Request2_Response
789 789
     */
790
-    public function send()
791
-    {
792
-        // Sanity check for URL
793
-        if (!$this->url instanceof Net_URL2) {
794
-            throw new HTTP_Request2_Exception('No URL given');
795
-        } elseif (!$this->url->isAbsolute()) {
796
-            throw new HTTP_Request2_Exception('Absolute URL required');
797
-        } elseif (!in_array(strtolower($this->url->getScheme()), array('https', 'http'))) {
798
-            throw new HTTP_Request2_Exception('Not a HTTP URL');
799
-        }
800
-        if (empty($this->adapter)) {
801
-            $this->setAdapter($this->getConfig('adapter'));
802
-        }
803
-        // magic_quotes_runtime may break file uploads and chunked response
804
-        // processing; see bug #4543. Don't use ini_get() here; see bug #16440.
805
-        if ($magicQuotes = get_magic_quotes_runtime()) {
806
-            set_magic_quotes_runtime(false);
807
-        }
808
-        // force using single byte encoding if mbstring extension overloads
809
-        // strlen() and substr(); see bug #1781, bug #10605
810
-        if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) {
811
-            $oldEncoding = mb_internal_encoding();
812
-            mb_internal_encoding('iso-8859-1');
813
-        }
814
-
815
-        try {
816
-            $response = $this->adapter->sendRequest($this);
817
-        } catch (Exception $e) {
818
-        }
819
-        // cleanup in either case (poor man's "finally" clause)
820
-        if ($magicQuotes) {
821
-            set_magic_quotes_runtime(true);
822
-        }
823
-        if (!empty($oldEncoding)) {
824
-            mb_internal_encoding($oldEncoding);
825
-        }
826
-        // rethrow the exception
827
-        if (!empty($e)) {
828
-            throw $e;
829
-        }
830
-        return $response;
831
-    }
790
+	public function send()
791
+	{
792
+		// Sanity check for URL
793
+		if (!$this->url instanceof Net_URL2) {
794
+			throw new HTTP_Request2_Exception('No URL given');
795
+		} elseif (!$this->url->isAbsolute()) {
796
+			throw new HTTP_Request2_Exception('Absolute URL required');
797
+		} elseif (!in_array(strtolower($this->url->getScheme()), array('https', 'http'))) {
798
+			throw new HTTP_Request2_Exception('Not a HTTP URL');
799
+		}
800
+		if (empty($this->adapter)) {
801
+			$this->setAdapter($this->getConfig('adapter'));
802
+		}
803
+		// magic_quotes_runtime may break file uploads and chunked response
804
+		// processing; see bug #4543. Don't use ini_get() here; see bug #16440.
805
+		if ($magicQuotes = get_magic_quotes_runtime()) {
806
+			set_magic_quotes_runtime(false);
807
+		}
808
+		// force using single byte encoding if mbstring extension overloads
809
+		// strlen() and substr(); see bug #1781, bug #10605
810
+		if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) {
811
+			$oldEncoding = mb_internal_encoding();
812
+			mb_internal_encoding('iso-8859-1');
813
+		}
814
+
815
+		try {
816
+			$response = $this->adapter->sendRequest($this);
817
+		} catch (Exception $e) {
818
+		}
819
+		// cleanup in either case (poor man's "finally" clause)
820
+		if ($magicQuotes) {
821
+			set_magic_quotes_runtime(true);
822
+		}
823
+		if (!empty($oldEncoding)) {
824
+			mb_internal_encoding($oldEncoding);
825
+		}
826
+		// rethrow the exception
827
+		if (!empty($e)) {
828
+			throw $e;
829
+		}
830
+		return $response;
831
+	}
832 832
 
833 833
    /**
834 834
     * Tries to detect MIME type of a file
@@ -840,22 +840,22 @@  discard block
 block discarded – undo
840 840
     * @param    string  filename
841 841
     * @return   string  file MIME type
842 842
     */
843
-    protected static function detectMimeType($filename)
844
-    {
845
-        // finfo extension from PECL available
846
-        if (function_exists('finfo_open')) {
847
-            if (!isset(self::$_fileinfoDb)) {
848
-                self::$_fileinfoDb = @finfo_open(FILEINFO_MIME);
849
-            }
850
-            if (self::$_fileinfoDb) {
851
-                $info = finfo_file(self::$_fileinfoDb, $filename);
852
-            }
853
-        }
854
-        // (deprecated) mime_content_type function available
855
-        if (empty($info) && function_exists('mime_content_type')) {
856
-            return mime_content_type($filename);
857
-        }
858
-        return empty($info)? 'application/octet-stream': $info;
859
-    }
843
+	protected static function detectMimeType($filename)
844
+	{
845
+		// finfo extension from PECL available
846
+		if (function_exists('finfo_open')) {
847
+			if (!isset(self::$_fileinfoDb)) {
848
+				self::$_fileinfoDb = @finfo_open(FILEINFO_MIME);
849
+			}
850
+			if (self::$_fileinfoDb) {
851
+				$info = finfo_file(self::$_fileinfoDb, $filename);
852
+			}
853
+		}
854
+		// (deprecated) mime_content_type function available
855
+		if (empty($info) && function_exists('mime_content_type')) {
856
+			return mime_content_type($filename);
857
+		}
858
+		return empty($info)? 'application/octet-stream': $info;
859
+	}
860 860
 }
861 861
 ?>
862 862
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -255,7 +255,7 @@  discard block
 block discarded – undo
255 255
         if ($url->getUserinfo()) {
256 256
             $username = $url->getUser();
257 257
             $password = $url->getPassword();
258
-            $this->setAuth(rawurldecode($username), $password? rawurldecode($password): '');
258
+            $this->setAuth(rawurldecode($username), $password ? rawurldecode($password) : '');
259 259
             $url->setUserinfo('');
260 260
         }
261 261
         if ('' == $url->getPath()) {
@@ -405,8 +405,8 @@  discard block
 block discarded – undo
405 405
             $this->auth = null;
406 406
         } else {
407 407
             $this->auth = array(
408
-                'user'     => (string)$user,
409
-                'password' => (string)$password,
408
+                'user'     => (string) $user,
409
+                'password' => (string) $password,
410 410
                 'scheme'   => $scheme
411 411
             );
412 412
         }
@@ -508,7 +508,7 @@  discard block
 block discarded – undo
508 508
         if (preg_match(self::REGEXP_INVALID_COOKIE, $cookie)) {
509 509
             throw new HTTP_Request2_Exception("Invalid cookie: '{$cookie}'");
510 510
         }
511
-        $cookies = empty($this->headers['cookie'])? '': $this->headers['cookie'] . '; ';
511
+        $cookies = empty($this->headers['cookie']) ? '' : $this->headers['cookie'] . '; ';
512 512
         $this->setHeader('cookie', $cookies . $cookie);
513 513
 
514 514
         return $this;
@@ -526,7 +526,7 @@  discard block
 block discarded – undo
526 526
     {
527 527
         if (!$isFilename) {
528 528
             if (!$body instanceof HTTP_Request2_MultipartBody) {
529
-                $this->body = (string)$body;
529
+                $this->body = (string) $body;
530 530
             } else {
531 531
                 $this->body = $body;
532 532
             }
@@ -597,9 +597,9 @@  discard block
 block discarded – undo
597 597
             }
598 598
             $this->uploads[$fieldName] = array(
599 599
                 'fp'        => $fp,
600
-                'filename'  => empty($sendFilename)? basename($filename): $sendFilename,
600
+                'filename'  => empty($sendFilename) ? basename($filename) : $sendFilename,
601 601
                 'size'      => filesize($filename),
602
-                'type'      => empty($contentType)? self::detectMimeType($filename): $contentType
602
+                'type'      => empty($contentType) ? self::detectMimeType($filename) : $contentType
603 603
             );
604 604
         } else {
605 605
             $fps = $names = $sizes = $types = array();
@@ -611,9 +611,9 @@  discard block
 block discarded – undo
611 611
                     throw new HTTP_Request2_Exception("Cannot open file {$f[0]}");
612 612
                 }
613 613
                 $fps[]   = $fp;
614
-                $names[] = empty($f[1])? basename($f[0]): $f[1];
614
+                $names[] = empty($f[1]) ? basename($f[0]) : $f[1];
615 615
                 $sizes[] = filesize($f[0]);
616
-                $types[] = empty($f[2])? self::detectMimeType($f[0]): $f[2];
616
+                $types[] = empty($f[2]) ? self::detectMimeType($f[0]) : $f[2];
617 617
             }
618 618
             $this->uploads[$fieldName] = array(
619 619
                 'fp' => $fps, 'filename' => $names, 'size' => $sizes, 'type' => $types
@@ -855,7 +855,7 @@  discard block
 block discarded – undo
855 855
         if (empty($info) && function_exists('mime_content_type')) {
856 856
             return mime_content_type($filename);
857 857
         }
858
-        return empty($info)? 'application/octet-stream': $info;
858
+        return empty($info) ? 'application/octet-stream' : $info;
859 859
     }
860 860
 }
861 861
 ?>
862 862
\ No newline at end of file
Please login to merge, or discard this patch.
libs/PEAR.1.9/HTTP/Request2/Adapter/Curl.php 3 patches
Doc Comments   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -379,7 +379,7 @@  discard block
 block discarded – undo
379 379
     * Callback function called by cURL for saving the response headers
380 380
     *
381 381
     * @param    resource    cURL handle
382
-    * @param    string      response header (with trailing CRLF)
382
+    * @param    string      string header (with trailing CRLF)
383 383
     * @return   integer     number of bytes saved
384 384
     * @see      HTTP_Request2_Response::parseHeaderLine()
385 385
     */
@@ -440,7 +440,7 @@  discard block
 block discarded – undo
440 440
     * Callback function called by cURL for saving the response body
441 441
     *
442 442
     * @param    resource    cURL handle (not used)
443
-    * @param    string      part of the response body
443
+    * @param    string      string of the response body
444 444
     * @return   integer     number of bytes saved
445 445
     * @see      HTTP_Request2_Response::appendBody()
446 446
     */
Please login to merge, or discard this patch.
Indentation   +346 added lines, -346 removed lines patch added patch discarded remove patch
@@ -1,45 +1,45 @@  discard block
 block discarded – undo
1 1
 <?php
2 2
 /**
3
- * Adapter for HTTP_Request2 wrapping around cURL extension
4
- *
5
- * PHP version 5
6
- *
7
- * LICENSE:
8
- *
9
- * Copyright (c) 2008, 2009, Alexey Borzov <[email protected]>
10
- * All rights reserved.
11
- *
12
- * Redistribution and use in source and binary forms, with or without
13
- * modification, are permitted provided that the following conditions
14
- * are met:
15
- *
16
- *    * Redistributions of source code must retain the above copyright
17
- *      notice, this list of conditions and the following disclaimer.
18
- *    * Redistributions in binary form must reproduce the above copyright
19
- *      notice, this list of conditions and the following disclaimer in the
20
- *      documentation and/or other materials provided with the distribution.
21
- *    * The names of the authors may not be used to endorse or promote products
22
- *      derived from this software without specific prior written permission.
23
- *
24
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
25
- * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
26
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
27
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
28
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
29
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
30
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
31
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
32
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
33
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
- *
36
- * @category   HTTP
37
- * @package    HTTP_Request2
38
- * @author     Alexey Borzov <[email protected]>
39
- * @license    http://opensource.org/licenses/bsd-license.php New BSD License
40
- * @version    SVN: $Id: Curl.php 291118 2009-11-21 17:58:23Z avb $
41
- * @link       http://pear.php.net/package/HTTP_Request2
42
- */
3
+	 * Adapter for HTTP_Request2 wrapping around cURL extension
4
+	 *
5
+	 * PHP version 5
6
+	 *
7
+	 * LICENSE:
8
+	 *
9
+	 * Copyright (c) 2008, 2009, Alexey Borzov <[email protected]>
10
+	 * All rights reserved.
11
+	 *
12
+	 * Redistribution and use in source and binary forms, with or without
13
+	 * modification, are permitted provided that the following conditions
14
+	 * are met:
15
+	 *
16
+	 *    * Redistributions of source code must retain the above copyright
17
+	 *      notice, this list of conditions and the following disclaimer.
18
+	 *    * Redistributions in binary form must reproduce the above copyright
19
+	 *      notice, this list of conditions and the following disclaimer in the
20
+	 *      documentation and/or other materials provided with the distribution.
21
+	 *    * The names of the authors may not be used to endorse or promote products
22
+	 *      derived from this software without specific prior written permission.
23
+	 *
24
+	 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
25
+	 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
26
+	 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
27
+	 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
28
+	 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
29
+	 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
30
+	 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
31
+	 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
32
+	 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
33
+	 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34
+	 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
+	 *
36
+	 * @category   HTTP
37
+	 * @package    HTTP_Request2
38
+	 * @author     Alexey Borzov <[email protected]>
39
+	 * @license    http://opensource.org/licenses/bsd-license.php New BSD License
40
+	 * @version    SVN: $Id: Curl.php 291118 2009-11-21 17:58:23Z avb $
41
+	 * @link       http://pear.php.net/package/HTTP_Request2
42
+	 */
43 43
 
44 44
 /**
45 45
  * Base class for HTTP_Request2 adapters
@@ -60,55 +60,55 @@  discard block
 block discarded – undo
60 60
     * Mapping of header names to cURL options
61 61
     * @var  array
62 62
     */
63
-    protected static $headerMap = array(
64
-        'accept-encoding' => CURLOPT_ENCODING,
65
-        'cookie'          => CURLOPT_COOKIE,
66
-        'referer'         => CURLOPT_REFERER,
67
-        'user-agent'      => CURLOPT_USERAGENT
68
-    );
63
+	protected static $headerMap = array(
64
+		'accept-encoding' => CURLOPT_ENCODING,
65
+		'cookie'          => CURLOPT_COOKIE,
66
+		'referer'         => CURLOPT_REFERER,
67
+		'user-agent'      => CURLOPT_USERAGENT
68
+	);
69 69
 
70 70
    /**
71 71
     * Mapping of SSL context options to cURL options
72 72
     * @var  array
73 73
     */
74
-    protected static $sslContextMap = array(
75
-        'ssl_verify_peer' => CURLOPT_SSL_VERIFYPEER,
76
-        'ssl_cafile'      => CURLOPT_CAINFO,
77
-        'ssl_capath'      => CURLOPT_CAPATH,
78
-        'ssl_local_cert'  => CURLOPT_SSLCERT,
79
-        'ssl_passphrase'  => CURLOPT_SSLCERTPASSWD
74
+	protected static $sslContextMap = array(
75
+		'ssl_verify_peer' => CURLOPT_SSL_VERIFYPEER,
76
+		'ssl_cafile'      => CURLOPT_CAINFO,
77
+		'ssl_capath'      => CURLOPT_CAPATH,
78
+		'ssl_local_cert'  => CURLOPT_SSLCERT,
79
+		'ssl_passphrase'  => CURLOPT_SSLCERTPASSWD
80 80
    );
81 81
 
82 82
    /**
83 83
     * Response being received
84 84
     * @var  HTTP_Request2_Response
85 85
     */
86
-    protected $response;
86
+	protected $response;
87 87
 
88 88
    /**
89 89
     * Whether 'sentHeaders' event was sent to observers
90 90
     * @var  boolean
91 91
     */
92
-    protected $eventSentHeaders = false;
92
+	protected $eventSentHeaders = false;
93 93
 
94 94
    /**
95 95
     * Whether 'receivedHeaders' event was sent to observers
96 96
     * @var boolean
97 97
     */
98
-    protected $eventReceivedHeaders = false;
98
+	protected $eventReceivedHeaders = false;
99 99
 
100 100
    /**
101 101
     * Position within request body
102 102
     * @var  integer
103 103
     * @see  callbackReadBody()
104 104
     */
105
-    protected $position = 0;
105
+	protected $position = 0;
106 106
 
107 107
    /**
108 108
     * Information about last transfer, as returned by curl_getinfo()
109 109
     * @var  array
110 110
     */
111
-    protected $lastInfo;
111
+	protected $lastInfo;
112 112
 
113 113
    /**
114 114
     * Sends request to the remote server and returns its response
@@ -117,52 +117,52 @@  discard block
 block discarded – undo
117 117
     * @return   HTTP_Request2_Response
118 118
     * @throws   HTTP_Request2_Exception
119 119
     */
120
-    public function sendRequest(HTTP_Request2 $request)
121
-    {
122
-        if (!extension_loaded('curl')) {
123
-            throw new HTTP_Request2_Exception('cURL extension not available');
124
-        }
125
-
126
-        $this->request              = $request;
127
-        $this->response             = null;
128
-        $this->position             = 0;
129
-        $this->eventSentHeaders     = false;
130
-        $this->eventReceivedHeaders = false;
131
-
132
-        try {
133
-            if (false === curl_exec($ch = $this->createCurlHandle())) {
134
-                $errorMessage = 'Error sending request: #' . curl_errno($ch) .
135
-                                                       ' ' . curl_error($ch);
136
-            }
137
-        } catch (Exception $e) {
138
-        }
139
-        $this->lastInfo = curl_getinfo($ch);
140
-        curl_close($ch);
141
-
142
-        $response = $this->response;
143
-        unset($this->request, $this->requestBody, $this->response);
144
-
145
-        if (!empty($e)) {
146
-            throw $e;
147
-        } elseif (!empty($errorMessage)) {
148
-            throw new HTTP_Request2_Exception($errorMessage);
149
-        }
150
-
151
-        if (0 < $this->lastInfo['size_download']) {
152
-            $request->setLastEvent('receivedBody', $response);
153
-        }
154
-        return $response;
155
-    }
120
+	public function sendRequest(HTTP_Request2 $request)
121
+	{
122
+		if (!extension_loaded('curl')) {
123
+			throw new HTTP_Request2_Exception('cURL extension not available');
124
+		}
125
+
126
+		$this->request              = $request;
127
+		$this->response             = null;
128
+		$this->position             = 0;
129
+		$this->eventSentHeaders     = false;
130
+		$this->eventReceivedHeaders = false;
131
+
132
+		try {
133
+			if (false === curl_exec($ch = $this->createCurlHandle())) {
134
+				$errorMessage = 'Error sending request: #' . curl_errno($ch) .
135
+													   ' ' . curl_error($ch);
136
+			}
137
+		} catch (Exception $e) {
138
+		}
139
+		$this->lastInfo = curl_getinfo($ch);
140
+		curl_close($ch);
141
+
142
+		$response = $this->response;
143
+		unset($this->request, $this->requestBody, $this->response);
144
+
145
+		if (!empty($e)) {
146
+			throw $e;
147
+		} elseif (!empty($errorMessage)) {
148
+			throw new HTTP_Request2_Exception($errorMessage);
149
+		}
150
+
151
+		if (0 < $this->lastInfo['size_download']) {
152
+			$request->setLastEvent('receivedBody', $response);
153
+		}
154
+		return $response;
155
+	}
156 156
 
157 157
    /**
158 158
     * Returns information about last transfer
159 159
     *
160 160
     * @return   array   associative array as returned by curl_getinfo()
161 161
     */
162
-    public function getInfo()
163
-    {
164
-        return $this->lastInfo;
165
-    }
162
+	public function getInfo()
163
+	{
164
+		return $this->lastInfo;
165
+	}
166 166
 
167 167
    /**
168 168
     * Creates a new cURL handle and populates it with data from the request
@@ -170,140 +170,140 @@  discard block
 block discarded – undo
170 170
     * @return   resource    a cURL handle, as created by curl_init()
171 171
     * @throws   HTTP_Request2_Exception
172 172
     */
173
-    protected function createCurlHandle()
174
-    {
175
-        $ch = curl_init();
176
-
177
-        curl_setopt_array($ch, array(
178
-            // setup write callbacks
179
-            CURLOPT_HEADERFUNCTION => array($this, 'callbackWriteHeader'),
180
-            CURLOPT_WRITEFUNCTION  => array($this, 'callbackWriteBody'),
181
-            // buffer size
182
-            CURLOPT_BUFFERSIZE     => $this->request->getConfig('buffer_size'),
183
-            // connection timeout
184
-            CURLOPT_CONNECTTIMEOUT => $this->request->getConfig('connect_timeout'),
185
-            // save full outgoing headers, in case someone is interested
186
-            CURLINFO_HEADER_OUT    => true,
187
-            // request url
188
-            CURLOPT_URL            => $this->request->getUrl()->getUrl()
189
-        ));
190
-
191
-        // set up redirects
192
-        if (!$this->request->getConfig('follow_redirects')) {
193
-            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
194
-        } else {
195
-            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
196
-            curl_setopt($ch, CURLOPT_MAXREDIRS, $this->request->getConfig('max_redirects'));
197
-            // limit redirects to http(s), works in 5.2.10+
198
-            if (defined('CURLOPT_REDIR_PROTOCOLS')) {
199
-                curl_setopt($ch, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
200
-            }
201
-            // works sometime after 5.3.0, http://bugs.php.net/bug.php?id=49571
202
-            if ($this->request->getConfig('strict_redirects') && defined('CURLOPT_POSTREDIR ')) {
203
-                curl_setopt($ch, CURLOPT_POSTREDIR, 3);
204
-            }
205
-        }
206
-
207
-        // request timeout
208
-        if ($timeout = $this->request->getConfig('timeout')) {
209
-            curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
210
-        }
211
-
212
-        // set HTTP version
213
-        switch ($this->request->getConfig('protocol_version')) {
214
-            case '1.0':
215
-                curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
216
-                break;
217
-            case '1.1':
218
-                curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
219
-        }
220
-
221
-        // set request method
222
-        switch ($this->request->getMethod()) {
223
-            case HTTP_Request2::METHOD_GET:
224
-                curl_setopt($ch, CURLOPT_HTTPGET, true);
225
-                break;
226
-            case HTTP_Request2::METHOD_POST:
227
-                curl_setopt($ch, CURLOPT_POST, true);
228
-                break;
229
-            case HTTP_Request2::METHOD_HEAD:
230
-                curl_setopt($ch, CURLOPT_NOBODY, true);
231
-                break;
232
-            default:
233
-                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $this->request->getMethod());
234
-        }
235
-
236
-        // set proxy, if needed
237
-        if ($host = $this->request->getConfig('proxy_host')) {
238
-            if (!($port = $this->request->getConfig('proxy_port'))) {
239
-                throw new HTTP_Request2_Exception('Proxy port not provided');
240
-            }
241
-            curl_setopt($ch, CURLOPT_PROXY, $host . ':' . $port);
242
-            if ($user = $this->request->getConfig('proxy_user')) {
243
-                curl_setopt($ch, CURLOPT_PROXYUSERPWD, $user . ':' .
244
-                            $this->request->getConfig('proxy_password'));
245
-                switch ($this->request->getConfig('proxy_auth_scheme')) {
246
-                    case HTTP_Request2::AUTH_BASIC:
247
-                        curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
248
-                        break;
249
-                    case HTTP_Request2::AUTH_DIGEST:
250
-                        curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_DIGEST);
251
-                }
252
-            }
253
-        }
254
-
255
-        // set authentication data
256
-        if ($auth = $this->request->getAuth()) {
257
-            curl_setopt($ch, CURLOPT_USERPWD, $auth['user'] . ':' . $auth['password']);
258
-            switch ($auth['scheme']) {
259
-                case HTTP_Request2::AUTH_BASIC:
260
-                    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
261
-                    break;
262
-                case HTTP_Request2::AUTH_DIGEST:
263
-                    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
264
-            }
265
-        }
266
-
267
-        // set SSL options
268
-        if (0 == strcasecmp($this->request->getUrl()->getScheme(), 'https')) {
269
-            foreach ($this->request->getConfig() as $name => $value) {
270
-                if ('ssl_verify_host' == $name && null !== $value) {
271
-                    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $value? 2: 0);
272
-                } elseif (isset(self::$sslContextMap[$name]) && null !== $value) {
273
-                    curl_setopt($ch, self::$sslContextMap[$name], $value);
274
-                }
275
-            }
276
-        }
277
-
278
-        $headers = $this->request->getHeaders();
279
-        // make cURL automagically send proper header
280
-        if (!isset($headers['accept-encoding'])) {
281
-            $headers['accept-encoding'] = '';
282
-        }
283
-
284
-        // set headers having special cURL keys
285
-        foreach (self::$headerMap as $name => $option) {
286
-            if (isset($headers[$name])) {
287
-                curl_setopt($ch, $option, $headers[$name]);
288
-                unset($headers[$name]);
289
-            }
290
-        }
291
-
292
-        $this->calculateRequestLength($headers);
293
-        if (isset($headers['content-length'])) {
294
-            $this->workaroundPhpBug47204($ch, $headers);
295
-        }
296
-
297
-        // set headers not having special keys
298
-        $headersFmt = array();
299
-        foreach ($headers as $name => $value) {
300
-            $canonicalName = implode('-', array_map('ucfirst', explode('-', $name)));
301
-            $headersFmt[]  = $canonicalName . ': ' . $value;
302
-        }
303
-        curl_setopt($ch, CURLOPT_HTTPHEADER, $headersFmt);
304
-
305
-        return $ch;
306
-    }
173
+	protected function createCurlHandle()
174
+	{
175
+		$ch = curl_init();
176
+
177
+		curl_setopt_array($ch, array(
178
+			// setup write callbacks
179
+			CURLOPT_HEADERFUNCTION => array($this, 'callbackWriteHeader'),
180
+			CURLOPT_WRITEFUNCTION  => array($this, 'callbackWriteBody'),
181
+			// buffer size
182
+			CURLOPT_BUFFERSIZE     => $this->request->getConfig('buffer_size'),
183
+			// connection timeout
184
+			CURLOPT_CONNECTTIMEOUT => $this->request->getConfig('connect_timeout'),
185
+			// save full outgoing headers, in case someone is interested
186
+			CURLINFO_HEADER_OUT    => true,
187
+			// request url
188
+			CURLOPT_URL            => $this->request->getUrl()->getUrl()
189
+		));
190
+
191
+		// set up redirects
192
+		if (!$this->request->getConfig('follow_redirects')) {
193
+			curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
194
+		} else {
195
+			curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
196
+			curl_setopt($ch, CURLOPT_MAXREDIRS, $this->request->getConfig('max_redirects'));
197
+			// limit redirects to http(s), works in 5.2.10+
198
+			if (defined('CURLOPT_REDIR_PROTOCOLS')) {
199
+				curl_setopt($ch, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
200
+			}
201
+			// works sometime after 5.3.0, http://bugs.php.net/bug.php?id=49571
202
+			if ($this->request->getConfig('strict_redirects') && defined('CURLOPT_POSTREDIR ')) {
203
+				curl_setopt($ch, CURLOPT_POSTREDIR, 3);
204
+			}
205
+		}
206
+
207
+		// request timeout
208
+		if ($timeout = $this->request->getConfig('timeout')) {
209
+			curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
210
+		}
211
+
212
+		// set HTTP version
213
+		switch ($this->request->getConfig('protocol_version')) {
214
+			case '1.0':
215
+				curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
216
+				break;
217
+			case '1.1':
218
+				curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
219
+		}
220
+
221
+		// set request method
222
+		switch ($this->request->getMethod()) {
223
+			case HTTP_Request2::METHOD_GET:
224
+				curl_setopt($ch, CURLOPT_HTTPGET, true);
225
+				break;
226
+			case HTTP_Request2::METHOD_POST:
227
+				curl_setopt($ch, CURLOPT_POST, true);
228
+				break;
229
+			case HTTP_Request2::METHOD_HEAD:
230
+				curl_setopt($ch, CURLOPT_NOBODY, true);
231
+				break;
232
+			default:
233
+				curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $this->request->getMethod());
234
+		}
235
+
236
+		// set proxy, if needed
237
+		if ($host = $this->request->getConfig('proxy_host')) {
238
+			if (!($port = $this->request->getConfig('proxy_port'))) {
239
+				throw new HTTP_Request2_Exception('Proxy port not provided');
240
+			}
241
+			curl_setopt($ch, CURLOPT_PROXY, $host . ':' . $port);
242
+			if ($user = $this->request->getConfig('proxy_user')) {
243
+				curl_setopt($ch, CURLOPT_PROXYUSERPWD, $user . ':' .
244
+							$this->request->getConfig('proxy_password'));
245
+				switch ($this->request->getConfig('proxy_auth_scheme')) {
246
+					case HTTP_Request2::AUTH_BASIC:
247
+						curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
248
+						break;
249
+					case HTTP_Request2::AUTH_DIGEST:
250
+						curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_DIGEST);
251
+				}
252
+			}
253
+		}
254
+
255
+		// set authentication data
256
+		if ($auth = $this->request->getAuth()) {
257
+			curl_setopt($ch, CURLOPT_USERPWD, $auth['user'] . ':' . $auth['password']);
258
+			switch ($auth['scheme']) {
259
+				case HTTP_Request2::AUTH_BASIC:
260
+					curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
261
+					break;
262
+				case HTTP_Request2::AUTH_DIGEST:
263
+					curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
264
+			}
265
+		}
266
+
267
+		// set SSL options
268
+		if (0 == strcasecmp($this->request->getUrl()->getScheme(), 'https')) {
269
+			foreach ($this->request->getConfig() as $name => $value) {
270
+				if ('ssl_verify_host' == $name && null !== $value) {
271
+					curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $value? 2: 0);
272
+				} elseif (isset(self::$sslContextMap[$name]) && null !== $value) {
273
+					curl_setopt($ch, self::$sslContextMap[$name], $value);
274
+				}
275
+			}
276
+		}
277
+
278
+		$headers = $this->request->getHeaders();
279
+		// make cURL automagically send proper header
280
+		if (!isset($headers['accept-encoding'])) {
281
+			$headers['accept-encoding'] = '';
282
+		}
283
+
284
+		// set headers having special cURL keys
285
+		foreach (self::$headerMap as $name => $option) {
286
+			if (isset($headers[$name])) {
287
+				curl_setopt($ch, $option, $headers[$name]);
288
+				unset($headers[$name]);
289
+			}
290
+		}
291
+
292
+		$this->calculateRequestLength($headers);
293
+		if (isset($headers['content-length'])) {
294
+			$this->workaroundPhpBug47204($ch, $headers);
295
+		}
296
+
297
+		// set headers not having special keys
298
+		$headersFmt = array();
299
+		foreach ($headers as $name => $value) {
300
+			$canonicalName = implode('-', array_map('ucfirst', explode('-', $name)));
301
+			$headersFmt[]  = $canonicalName . ': ' . $value;
302
+		}
303
+		curl_setopt($ch, CURLOPT_HTTPHEADER, $headersFmt);
304
+
305
+		return $ch;
306
+	}
307 307
 
308 308
    /**
309 309
     * Workaround for PHP bug #47204 that prevents rewinding request body
@@ -315,32 +315,32 @@  discard block
 block discarded – undo
315 315
     * @param    resource    cURL handle
316 316
     * @param    array       Request headers
317 317
     */
318
-    protected function workaroundPhpBug47204($ch, &$headers)
319
-    {
320
-        // no redirects, no digest auth -> probably no rewind needed
321
-        if (!$this->request->getConfig('follow_redirects')
322
-            && (!($auth = $this->request->getAuth())
323
-                || HTTP_Request2::AUTH_DIGEST != $auth['scheme'])
324
-        ) {
325
-            curl_setopt($ch, CURLOPT_READFUNCTION, array($this, 'callbackReadBody'));
326
-
327
-        // rewind may be needed, read the whole body into memory
328
-        } else {
329
-            if ($this->requestBody instanceof HTTP_Request2_MultipartBody) {
330
-                $this->requestBody = $this->requestBody->__toString();
331
-
332
-            } elseif (is_resource($this->requestBody)) {
333
-                $fp = $this->requestBody;
334
-                $this->requestBody = '';
335
-                while (!feof($fp)) {
336
-                    $this->requestBody .= fread($fp, 16384);
337
-                }
338
-            }
339
-            // curl hangs up if content-length is present
340
-            unset($headers['content-length']);
341
-            curl_setopt($ch, CURLOPT_POSTFIELDS, $this->requestBody);
342
-        }
343
-    }
318
+	protected function workaroundPhpBug47204($ch, &$headers)
319
+	{
320
+		// no redirects, no digest auth -> probably no rewind needed
321
+		if (!$this->request->getConfig('follow_redirects')
322
+			&& (!($auth = $this->request->getAuth())
323
+				|| HTTP_Request2::AUTH_DIGEST != $auth['scheme'])
324
+		) {
325
+			curl_setopt($ch, CURLOPT_READFUNCTION, array($this, 'callbackReadBody'));
326
+
327
+		// rewind may be needed, read the whole body into memory
328
+		} else {
329
+			if ($this->requestBody instanceof HTTP_Request2_MultipartBody) {
330
+				$this->requestBody = $this->requestBody->__toString();
331
+
332
+			} elseif (is_resource($this->requestBody)) {
333
+				$fp = $this->requestBody;
334
+				$this->requestBody = '';
335
+				while (!feof($fp)) {
336
+					$this->requestBody .= fread($fp, 16384);
337
+				}
338
+			}
339
+			// curl hangs up if content-length is present
340
+			unset($headers['content-length']);
341
+			curl_setopt($ch, CURLOPT_POSTFIELDS, $this->requestBody);
342
+		}
343
+	}
344 344
 
345 345
    /**
346 346
     * Callback function called by cURL for reading the request body
@@ -350,30 +350,30 @@  discard block
 block discarded – undo
350 350
     * @param    integer     maximum length of data to return
351 351
     * @return   string      part of the request body, up to $length bytes
352 352
     */
353
-    protected function callbackReadBody($ch, $fd, $length)
354
-    {
355
-        if (!$this->eventSentHeaders) {
356
-            $this->request->setLastEvent(
357
-                'sentHeaders', curl_getinfo($ch, CURLINFO_HEADER_OUT)
358
-            );
359
-            $this->eventSentHeaders = true;
360
-        }
361
-        if (in_array($this->request->getMethod(), self::$bodyDisallowed) ||
362
-            0 == $this->contentLength || $this->position >= $this->contentLength
363
-        ) {
364
-            return '';
365
-        }
366
-        if (is_string($this->requestBody)) {
367
-            $string = substr($this->requestBody, $this->position, $length);
368
-        } elseif (is_resource($this->requestBody)) {
369
-            $string = fread($this->requestBody, $length);
370
-        } else {
371
-            $string = $this->requestBody->read($length);
372
-        }
373
-        $this->request->setLastEvent('sentBodyPart', strlen($string));
374
-        $this->position += strlen($string);
375
-        return $string;
376
-    }
353
+	protected function callbackReadBody($ch, $fd, $length)
354
+	{
355
+		if (!$this->eventSentHeaders) {
356
+			$this->request->setLastEvent(
357
+				'sentHeaders', curl_getinfo($ch, CURLINFO_HEADER_OUT)
358
+			);
359
+			$this->eventSentHeaders = true;
360
+		}
361
+		if (in_array($this->request->getMethod(), self::$bodyDisallowed) ||
362
+			0 == $this->contentLength || $this->position >= $this->contentLength
363
+		) {
364
+			return '';
365
+		}
366
+		if (is_string($this->requestBody)) {
367
+			$string = substr($this->requestBody, $this->position, $length);
368
+		} elseif (is_resource($this->requestBody)) {
369
+			$string = fread($this->requestBody, $length);
370
+		} else {
371
+			$string = $this->requestBody->read($length);
372
+		}
373
+		$this->request->setLastEvent('sentBodyPart', strlen($string));
374
+		$this->position += strlen($string);
375
+		return $string;
376
+	}
377 377
 
378 378
    /**
379 379
     * Callback function called by cURL for saving the response headers
@@ -383,58 +383,58 @@  discard block
 block discarded – undo
383 383
     * @return   integer     number of bytes saved
384 384
     * @see      HTTP_Request2_Response::parseHeaderLine()
385 385
     */
386
-    protected function callbackWriteHeader($ch, $string)
387
-    {
388
-        // we may receive a second set of headers if doing e.g. digest auth
389
-        if ($this->eventReceivedHeaders || !$this->eventSentHeaders) {
390
-            // don't bother with 100-Continue responses (bug #15785)
391
-            if (!$this->eventSentHeaders ||
392
-                $this->response->getStatus() >= 200
393
-            ) {
394
-                $this->request->setLastEvent(
395
-                    'sentHeaders', curl_getinfo($ch, CURLINFO_HEADER_OUT)
396
-                );
397
-            }
398
-            $upload = curl_getinfo($ch, CURLINFO_SIZE_UPLOAD);
399
-            // if body wasn't read by a callback, send event with total body size
400
-            if ($upload > $this->position) {
401
-                $this->request->setLastEvent(
402
-                    'sentBodyPart', $upload - $this->position
403
-                );
404
-                $this->position = $upload;
405
-            }
406
-            $this->eventSentHeaders = true;
407
-            // we'll need a new response object
408
-            if ($this->eventReceivedHeaders) {
409
-                $this->eventReceivedHeaders = false;
410
-                $this->response             = null;
411
-            }
412
-        }
413
-        if (empty($this->response)) {
414
-            $this->response = new HTTP_Request2_Response($string, false);
415
-        } else {
416
-            $this->response->parseHeaderLine($string);
417
-            if ('' == trim($string)) {
418
-                // don't bother with 100-Continue responses (bug #15785)
419
-                if (200 <= $this->response->getStatus()) {
420
-                    $this->request->setLastEvent('receivedHeaders', $this->response);
421
-                }
422
-                // for versions lower than 5.2.10, check the redirection URL protocol
423
-                if ($this->request->getConfig('follow_redirects') && !defined('CURLOPT_REDIR_PROTOCOLS')
424
-                    && $this->response->isRedirect()
425
-                ) {
426
-                    $redirectUrl = new Net_URL2($this->response->getHeader('location'));
427
-                    if ($redirectUrl->isAbsolute()
428
-                        && !in_array($redirectUrl->getScheme(), array('http', 'https'))
429
-                    ) {
430
-                        return -1;
431
-                    }
432
-                }
433
-                $this->eventReceivedHeaders = true;
434
-            }
435
-        }
436
-        return strlen($string);
437
-    }
386
+	protected function callbackWriteHeader($ch, $string)
387
+	{
388
+		// we may receive a second set of headers if doing e.g. digest auth
389
+		if ($this->eventReceivedHeaders || !$this->eventSentHeaders) {
390
+			// don't bother with 100-Continue responses (bug #15785)
391
+			if (!$this->eventSentHeaders ||
392
+				$this->response->getStatus() >= 200
393
+			) {
394
+				$this->request->setLastEvent(
395
+					'sentHeaders', curl_getinfo($ch, CURLINFO_HEADER_OUT)
396
+				);
397
+			}
398
+			$upload = curl_getinfo($ch, CURLINFO_SIZE_UPLOAD);
399
+			// if body wasn't read by a callback, send event with total body size
400
+			if ($upload > $this->position) {
401
+				$this->request->setLastEvent(
402
+					'sentBodyPart', $upload - $this->position
403
+				);
404
+				$this->position = $upload;
405
+			}
406
+			$this->eventSentHeaders = true;
407
+			// we'll need a new response object
408
+			if ($this->eventReceivedHeaders) {
409
+				$this->eventReceivedHeaders = false;
410
+				$this->response             = null;
411
+			}
412
+		}
413
+		if (empty($this->response)) {
414
+			$this->response = new HTTP_Request2_Response($string, false);
415
+		} else {
416
+			$this->response->parseHeaderLine($string);
417
+			if ('' == trim($string)) {
418
+				// don't bother with 100-Continue responses (bug #15785)
419
+				if (200 <= $this->response->getStatus()) {
420
+					$this->request->setLastEvent('receivedHeaders', $this->response);
421
+				}
422
+				// for versions lower than 5.2.10, check the redirection URL protocol
423
+				if ($this->request->getConfig('follow_redirects') && !defined('CURLOPT_REDIR_PROTOCOLS')
424
+					&& $this->response->isRedirect()
425
+				) {
426
+					$redirectUrl = new Net_URL2($this->response->getHeader('location'));
427
+					if ($redirectUrl->isAbsolute()
428
+						&& !in_array($redirectUrl->getScheme(), array('http', 'https'))
429
+					) {
430
+						return -1;
431
+					}
432
+				}
433
+				$this->eventReceivedHeaders = true;
434
+			}
435
+		}
436
+		return strlen($string);
437
+	}
438 438
 
439 439
    /**
440 440
     * Callback function called by cURL for saving the response body
@@ -444,18 +444,18 @@  discard block
 block discarded – undo
444 444
     * @return   integer     number of bytes saved
445 445
     * @see      HTTP_Request2_Response::appendBody()
446 446
     */
447
-    protected function callbackWriteBody($ch, $string)
448
-    {
449
-        // cURL calls WRITEFUNCTION callback without calling HEADERFUNCTION if
450
-        // response doesn't start with proper HTTP status line (see bug #15716)
451
-        if (empty($this->response)) {
452
-            throw new HTTP_Request2_Exception("Malformed response: {$string}");
453
-        }
454
-        if ($this->request->getConfig('store_body')) {
455
-            $this->response->appendBody($string);
456
-        }
457
-        $this->request->setLastEvent('receivedBodyPart', $string);
458
-        return strlen($string);
459
-    }
447
+	protected function callbackWriteBody($ch, $string)
448
+	{
449
+		// cURL calls WRITEFUNCTION callback without calling HEADERFUNCTION if
450
+		// response doesn't start with proper HTTP status line (see bug #15716)
451
+		if (empty($this->response)) {
452
+			throw new HTTP_Request2_Exception("Malformed response: {$string}");
453
+		}
454
+		if ($this->request->getConfig('store_body')) {
455
+			$this->response->appendBody($string);
456
+		}
457
+		$this->request->setLastEvent('receivedBodyPart', $string);
458
+		return strlen($string);
459
+	}
460 460
 }
461 461
 ?>
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -268,7 +268,7 @@
 block discarded – undo
268 268
         if (0 == strcasecmp($this->request->getUrl()->getScheme(), 'https')) {
269 269
             foreach ($this->request->getConfig() as $name => $value) {
270 270
                 if ('ssl_verify_host' == $name && null !== $value) {
271
-                    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $value? 2: 0);
271
+                    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $value ? 2 : 0);
272 272
                 } elseif (isset(self::$sslContextMap[$name]) && null !== $value) {
273 273
                     curl_setopt($ch, self::$sslContextMap[$name], $value);
274 274
                 }
Please login to merge, or discard this patch.